From 9f585f28f88595652c9746d5ddd180ef0e048e67 Mon Sep 17 00:00:00 2001 From: Bhagat Singh Date: Sun, 22 Feb 2015 17:39:27 -0800 Subject: [PATCH 001/111] Initial commit --- .classpath | 27 +- .gitignore | 1 + .project | 6 + .settings/org.eclipse.jdt.core.prefs | 5 + .settings/org.eclipse.m2e.core.prefs | 4 + build/build.xml | 102 --- .../teaching_kids_programming.properties | 13 - build/properties/tkplauncher.properties | 9 - .../teaching_kids_programming/build.xml | 14 - pom.xml | 37 + .../teachingextensions/logo/ColorWheel.java | 0 .../org/teachingextensions/logo/Colors.java | 0 .../logo/CompositeStroke.java | 0 .../logo/ImageBackground.java | 0 .../teachingextensions/logo/LineSegment.java | 0 .../logo/MultiTurtlePanel.java | 4 +- .../teachingextensions/logo/Paintable.java | 0 .../teachingextensions/logo/PenColors.java | 0 .../org/teachingextensions/logo/Pizza.java | 0 .../logo/ScreenCapture.java | 0 .../org/teachingextensions/logo/Topping.java | 0 .../org/teachingextensions/logo/Tortoise.java | 0 .../org/teachingextensions/logo/Turtle.java | 0 .../teachingextensions/logo/TurtlePanel.java | 3 +- .../logo/VirtualProctorFileSystem.java | 0 .../logo/VirtualProctorWeb.java | 0 .../org/teachingextensions/logo/Wheel.java | 0 .../logo/shapes/Circle.java | 0 .../teachingextensions/logo/shapes/Text.java | 0 .../teachingextensions/logo/utils/Sounds.java | 0 .../logo/utils/TortoiseUtils.java | 0 .../setup/CommandLineUtils.java | 0 .../setup/MacThumbDriveInstaller.java | 0 .../teachingextensions/setup/SetupConfig.java | 0 .../setup/SetupValidator.java | 0 .../setup/ThumbDriveInstaller.java | 0 .../setup/WindowsThumbDriveInstaller.java | 0 .../simpleparser/Parser.java | 0 .../org/teachingextensions/utils/Viewer.java | 0 .../utils/VirtualProctor.java | 0 .../windows/GraphicsWindow.java | 0 .../windows/LeftClickMouseAdapter.java | 0 .../windows/MessageBox.java | 0 .../windows/MouseLeftClickListener.java | 0 .../windows/MouseRightClickListener.java | 0 .../windows/ProgramWindow.java | 0 .../windows/RightClickMouseAdapter.java | 0 .../recipes/completed/AdLibs.java | 0 .../recipes/completed/AdLibsQuiz.java | 0 .../recipes/completed/AdLibsRtf.java | 2 +- .../recipes/completed/BackgroundPhoto.java | 0 .../completed/ChooseYourOwnAdventure.java | 0 .../recipes/completed/ConnectTheDots.java | 0 .../recipes/completed/DigiFlower.java | 0 .../recipes/completed/FizzBuzz.java | 0 .../recipes/completed/FizzBuzzTDD.java | 0 .../recipes/completed/FourSquare.java | 0 .../recipes/completed/HiLow.java | 0 .../recipes/completed/Houses.java | 0 .../recipes/completed/KnottedRing.java | 0 .../recipes/completed/ManyAnimals.java | 0 .../recipes/completed/PentagonCrazy.java | 0 .../recipes/completed/SimpleBubble.java | 0 .../recipes/completed/SimpleBubbleQuiz.java | 0 .../recipes/completed/SimpleSquare.java | 0 .../completed/SmallBasicHolidayCard.java | 0 .../completed/SmallBasicTicTacToe.java | 0 .../recipes/completed/SpiderWeb.java | 0 .../recipes/completed/Spiral.java | 0 .../recipes/completed/TriangleShell.java | 0 .../recipes/completed/TurtleTree.java | 0 .../quizzes/graders/AdLibsQuizAdapter.java | 0 .../quizzes/graders/AdLibsQuizGrader.java | 0 .../recipes/quizzes/graders/HiLowQuiz.java | 0 .../quizzes/graders/HiLowQuizGrader.java | 0 .../quizzes/graders/HousesQuizAdapter.java | 0 .../quizzes/graders/HousesQuizGrader.java | 0 .../quizzes/graders/MessageBoxMock.java | 0 .../graders/PentagonCrazyQuizGrader.java | 0 .../quizzes/graders/PentagonQuizAdapter.java | 0 .../quizzes/graders/QuizBuzzAdapter.java | 0 .../quizzes/graders/QuizBuzzGrader.java | 0 .../recipes/quizzes/graders/QuizUtils.java | 0 .../graders/SimpleBubbleQuizAdapter.java | 0 .../graders/SimpleBubbleQuizGrader.java | 0 .../graders/SimpleSquareQuizGrader.java | 0 .../recipes/quizzes/graders/SpiderQuiz.java | 0 .../quizzes/graders/SpiderWebQuizGrader.java | 0 .../recipes/quizzes/graders/SquareQuiz.java | 0 .../quizzes/graders/TreeQuizAdapter.java | 0 .../quizzes/graders/TreeQuizGrader.java | 0 .../section01forloops/DeepDive01ForLoops.java | 0 .../section01forloops/SimpleSquare.java | 0 .../section01forloops/SimpleSquareQuiz.java | 0 .../section01forloops/Spiral.java | 0 .../section02methods/DeepDive02Variables.java | 0 .../section02methods/FourSquare.java | 0 .../section02methods/Houses.java | 0 .../section02methods/HousesQuiz.java | 0 .../section02methods/TriangleShell.java | 0 .../section03ifs/ChooseYourOwnAdventure.java | 0 .../section03ifs/DeepDive03Ifs.java | 0 .../section03ifs/HiLow.java | 0 .../section03ifs/HiLowQuiz.java | 0 .../section04mastery/BackgroundPhoto.java | 0 .../section04mastery/DeepDive04Mastery.java | 0 .../section04mastery/DigiFlower.java | 0 .../section04mastery/KnottedRing.java | 0 .../section04mastery/PentagonCrazy.java | 0 .../section04mastery/PentagonCrazyQuiz.java | 0 .../DeepDive05Recursion.java | 0 .../section05recursion/SpiderWeb.java | 0 .../section05recursion/SpiderWebQuiz.java | 0 .../section05recursion/TreeQuiz.java | 0 .../section05recursion/TurtleTree.java | 0 .../section06modelviewcontroller/AdLibs.java | 0 .../AdLibsQuiz.java | 0 .../DeepDive06ModelViewController.java | 0 .../section07events/ConnectTheDots.java | 0 .../section07events/DeepDive07Events.java | 0 .../section07events/ManyAnimals.java | 0 .../section07events/SimpleBubble.java | 0 .../section07events/SimpleBubbleQuiz.java | 0 .../section08tdd/DeepDive08TDD.java | 0 .../section08tdd/FizzBuzz.java | 0 .../section08tdd/FizzBuzzTDD.java | 0 .../section08tdd/QuizBuzz.java | 0 .../DeepDive09exceptions.java | 0 .../java}/you/need/to/fill/in/the/______.java | 0 .../documents}/0_Keyboard-Shortcuts.docx | Bin .../documents}/1_SimpleSquareWorksheet.docx | Bin .../documents}/2_HousesWorksheet.docx | Bin .../documents}/3_HiLowWorksheet.docx | Bin .../documents}/4_PentagonCrazyWorksheet.docx | Bin .../documents}/5_TurtleTreeWorksheet.docx | Bin .../documents}/6_AdLibsWorksheet.docx | Bin .../documents}/7_SimpleBubbleWorksheet.docx | Bin .../documents}/8_FizzBuzzWorksheet.docx | Bin .../resources/documents}/Tortoise.pdf | Bin .../resources/documents}/view.rtf | Bin .../resources/images}/ExplodedTurtle.png | Bin .../resources/images}/ExplodedTurtleOld.png | Bin .../logo => main/resources/images}/Spider.png | Bin src/main/resources/images/Thumbs.db | Bin 0 -> 6656 bytes .../logo => main/resources/images}/Turtle.png | Bin src/org/teachingextensions/logo/Turtle.zip | Bin 875 -> 0 bytes .../logo/Turtle/ExplodedTurtle.png | Bin 741 -> 0 bytes .../logo/tests/ColorGeneration.java | 0 ...olorGeneration.testGeneration.approved.txt | 0 ...orGeneration.testHtmlDisplay.approved.html | 0 .../logo/tests/ColorsTest.java | 0 .../logo/tests/RecipeTests.java | 0 .../tests/RecipeTests.testCircle.approved.png | Bin ...cipeTests.testDigiGirlzFlower.approved.png | Bin .../RecipeTests.testFourSquare.approved.png | Bin .../RecipeTests.testKnottedRing.approved.png | Bin .../RecipeTests.testSimpleSquare.approved.png | Bin .../tests/RecipeTests.testSpiral.approved.png | Bin ...RecipeTests.testTriangleShell.approved.png | Bin .../RecipeTests.testTurtleTree.approved.png | Bin .../logo/tests/TortoiseTest.java | 0 .../TortoiseTest.testBigWidth.approved.png | Bin ...TortoiseTest.testSimpleSquare.approved.png | Bin .../logo/tests/TurtlePanelTest.java | 0 ...elTest.testImageForBackground.approved.png | Bin .../logo/tests/TurtleTest.java | 0 .../tests/TurtleTest.testDelta.approved.txt | 0 .../tests/TurtleTest.testHide.approved.png | Bin .../tests/TurtleTest.testMove.approved.png | Bin ...tleTest.testMove45DegreesLeft.approved.png | Bin .../tests/TurtleTest.testPenDown.approved.png | Bin .../TurtleTest.testPentagonCrazy.approved.png | Bin .../tests/TurtleTest.testRotate.approved.png | Bin .../TurtleTest.testRotate45.approved.png | Bin ....testRotate45CounterClockwise.approved.png | Bin .../tests/TurtleTest.testShow.approved.png | Bin .../tests/TurtleTest.testSpeed.approved.txt | 0 .../logo/tests/TurtleUtils.java | 0 .../logo/tests/VirtualProctorTest.java | 0 .../logo/tests/WheelTest.java | 0 .../tests/WheelTest.testWheel.approved.txt | 0 .../teachingextensions/logo/tests/colors.cpp | 0 .../teachingextensions/logo/tests/colors.html | 0 .../logo/tests/colors.java.template | 0 .../logo/tests/colors.sorted.txt | 0 .../teachingextensions/logo/tests/colors.txt | 0 .../logo/utils/tests/SoundsDemo.java | 0 .../setup/tests/UnzipTest.java | 0 .../simpleparser/tests/ParserTest.java | 0 .../ParserTest.testSimpleParse.approved.txt | 0 .../windows/tests/GraphicsWindowTest.java | 0 .../recipes/completed/FizzBuzzTDDTest.java | 0 .../deepdives/tests/DeepDive01Test.java | 0 .../deepdives/tests/DeepDive02Test.java | 0 .../deepdives/tests/DeepDive03Test.java | 0 .../tests/DeepDive04MasteryTest.java | 0 .../tests/DeepDive05RecursionTest.java | 0 .../recipes/quizzes/tests/AdLibsQuizTest.java | 0 ...uizTest.testCorrect.Windows_7.approved.png | Bin ...zTest.testIncorrect.Windows_7.approved.png | Bin .../recipes/quizzes/tests/HiLowQuizTest.java | 0 ...uizTest.testCorrect.Windows_7.approved.png | Bin ...zTest.testIncorrect.Windows_7.approved.png | Bin .../recipes/quizzes/tests/HousesQuizTest.java | 0 ...QuizTest.testCorrect.Mac_OS_X.approved.png | Bin ...uizTest.testCorrect.Windows_7.approved.png | Bin ...izTest.testIncorrect.Mac_OS_X.approved.png | Bin ...zTest.testIncorrect.Windows_7.approved.png | Bin .../quizzes/tests/PentagonCrazyQuizTest.java | 0 ...QuizTest.testCorrect.Mac_OS_X.approved.png | Bin ...uizTest.testCorrect.Windows_7.approved.png | Bin ...izTest.testIncorrect.Mac_OS_X.approved.png | Bin ...zTest.testIncorrect.Windows_7.approved.png | Bin .../recipes/quizzes/tests/QuizBuzzTest.java | 0 .../quizzes/tests/SimpleBubbleQuizTest.java | 0 .../quizzes/tests/SimpleSquareQuizTest.java | 0 ...QuizTest.testCorrect.Mac_OS_X.approved.png | Bin ...uizTest.testCorrect.Windows_7.approved.png | Bin ...izTest.testIncorrect.Mac_OS_X.approved.png | Bin ...zTest.testIncorrect.Windows_7.approved.png | Bin .../quizzes/tests/SpiderWebQuizTest.java | 0 ...bQuizTest.testCircle.Mac_OS_X.approved.png | Bin ...QuizTest.testCircle.Windows_7.approved.png | Bin ...QuizTest.testCorrect.Mac_OS_X.approved.png | Bin ...QuizTest.testCorrect.Mac_OS_X.received.png | Bin ...uizTest.testCorrect.Windows_7.approved.png | Bin ...izTest.testIncorrect.Mac_OS_X.approved.png | Bin ...zTest.testIncorrect.Windows_7.approved.png | Bin .../recipes/quizzes/tests/TreeQuizTest.java | 0 ...uizTest.testCorrect.Windows_7.approved.png | Bin ...zTest.testIncorrect.Windows_7.approved.png | Bin ...olorGeneration.testGeneration.approved.txt | 859 ++++++++++++++++++ ...orGeneration.testHtmlDisplay.approved.html | 702 ++++++++++++++ .../ParserTest.testSimpleParse.approved.txt | 3 + .../TurtleTest.testDelta.approved.txt | 9 + .../TurtleTest.testSpeed.approved.txt | 11 + .../WheelTest.testWheel.approved.txt | 1 + src/test/resources/documents/colors.html | 13 + .../resources/documents/colors.java.template | 26 + .../resources/documents/colors.sorted.txt | 6 + src/test/resources/documents/colors.txt | 173 ++++ ...uizTest.testCorrect.Windows_7.approved.png | Bin 0 -> 12506 bytes ...zTest.testIncorrect.Windows_7.approved.png | Bin 0 -> 8830 bytes ...uizTest.testCorrect.Windows_7.approved.png | Bin 0 -> 9523 bytes ...zTest.testIncorrect.Windows_7.approved.png | Bin 0 -> 15282 bytes ...QuizTest.testCorrect.Mac_OS_X.approved.png | Bin 0 -> 25849 bytes ...uizTest.testCorrect.Windows_7.approved.png | Bin 0 -> 21910 bytes ...izTest.testIncorrect.Mac_OS_X.approved.png | Bin 0 -> 21633 bytes ...zTest.testIncorrect.Windows_7.approved.png | Bin 0 -> 17242 bytes ...QuizTest.testCorrect.Mac_OS_X.approved.png | Bin 0 -> 14937 bytes ...uizTest.testCorrect.Windows_7.approved.png | Bin 0 -> 11546 bytes ...izTest.testIncorrect.Mac_OS_X.approved.png | Bin 0 -> 11571 bytes ...zTest.testIncorrect.Windows_7.approved.png | Bin 0 -> 8157 bytes .../RecipeTests.testCircle.approved.png | Bin 0 -> 7287 bytes ...cipeTests.testDigiGirlzFlower.approved.png | Bin 0 -> 42626 bytes .../RecipeTests.testFourSquare.approved.png | Bin 0 -> 2927 bytes .../RecipeTests.testKnottedRing.approved.png | Bin 0 -> 126237 bytes .../RecipeTests.testSimpleSquare.approved.png | Bin 0 -> 2605 bytes .../RecipeTests.testSpiral.approved.png | Bin 0 -> 2903 bytes ...RecipeTests.testTriangleShell.approved.png | Bin 0 -> 119176 bytes .../RecipeTests.testTurtleTree.approved.png | Bin 0 -> 6530 bytes ...QuizTest.testCorrect.Mac_OS_X.approved.png | Bin 0 -> 15291 bytes ...uizTest.testCorrect.Windows_7.approved.png | Bin 0 -> 11944 bytes ...izTest.testIncorrect.Mac_OS_X.approved.png | Bin 0 -> 12318 bytes ...zTest.testIncorrect.Windows_7.approved.png | Bin 0 -> 8914 bytes ...bQuizTest.testCircle.Mac_OS_X.approved.png | Bin 0 -> 6661 bytes ...QuizTest.testCircle.Windows_7.approved.png | Bin 0 -> 6661 bytes ...QuizTest.testCorrect.Mac_OS_X.approved.png | Bin 0 -> 38423 bytes ...QuizTest.testCorrect.Mac_OS_X.received.png | Bin 0 -> 13255 bytes ...uizTest.testCorrect.Windows_7.approved.png | Bin 0 -> 35218 bytes ...izTest.testIncorrect.Mac_OS_X.approved.png | Bin 0 -> 13525 bytes ...zTest.testIncorrect.Windows_7.approved.png | Bin 0 -> 10052 bytes .../TortoiseTest.testBigWidth.approved.png | Bin 0 -> 2501 bytes ...TortoiseTest.testSimpleSquare.approved.png | Bin 0 -> 2599 bytes ...uizTest.testCorrect.Windows_7.approved.png | Bin 0 -> 9793 bytes ...zTest.testIncorrect.Windows_7.approved.png | Bin 0 -> 11273 bytes ...elTest.testImageForBackground.approved.png | Bin 0 -> 37023 bytes .../images/TurtleTest.testHide.approved.png | Bin 0 -> 1842 bytes .../images/TurtleTest.testMove.approved.png | Bin 0 -> 2526 bytes ...tleTest.testMove45DegreesLeft.approved.png | Bin 0 -> 2512 bytes .../TurtleTest.testPenDown.approved.png | Bin 0 -> 2516 bytes .../TurtleTest.testPentagonCrazy.approved.png | Bin 0 -> 93107 bytes .../images/TurtleTest.testRotate.approved.png | Bin 0 -> 2455 bytes .../TurtleTest.testRotate45.approved.png | Bin 0 -> 2434 bytes ....testRotate45CounterClockwise.approved.png | Bin 0 -> 2437 bytes .../images/TurtleTest.testShow.approved.png | Bin 0 -> 2460 bytes 286 files changed, 1881 insertions(+), 149 deletions(-) create mode 100644 .settings/org.eclipse.jdt.core.prefs create mode 100644 .settings/org.eclipse.m2e.core.prefs delete mode 100644 build/build.xml delete mode 100644 build/properties/teaching_kids_programming.properties delete mode 100644 build/properties/tkplauncher.properties delete mode 100644 build/resources/teaching_kids_programming/build.xml create mode 100644 pom.xml rename src/{ => main/java}/org/teachingextensions/logo/ColorWheel.java (100%) rename src/{ => main/java}/org/teachingextensions/logo/Colors.java (100%) rename src/{ => main/java}/org/teachingextensions/logo/CompositeStroke.java (100%) rename src/{ => main/java}/org/teachingextensions/logo/ImageBackground.java (100%) rename src/{ => main/java}/org/teachingextensions/logo/LineSegment.java (100%) rename src/{ => main/java}/org/teachingextensions/logo/MultiTurtlePanel.java (94%) rename src/{ => main/java}/org/teachingextensions/logo/Paintable.java (100%) rename src/{ => main/java}/org/teachingextensions/logo/PenColors.java (100%) rename src/{ => main/java}/org/teachingextensions/logo/Pizza.java (100%) rename src/{ => main/java}/org/teachingextensions/logo/ScreenCapture.java (100%) rename src/{ => main/java}/org/teachingextensions/logo/Topping.java (100%) rename src/{ => main/java}/org/teachingextensions/logo/Tortoise.java (100%) rename src/{ => main/java}/org/teachingextensions/logo/Turtle.java (100%) rename src/{ => main/java}/org/teachingextensions/logo/TurtlePanel.java (95%) rename src/{ => main/java}/org/teachingextensions/logo/VirtualProctorFileSystem.java (100%) rename src/{ => main/java}/org/teachingextensions/logo/VirtualProctorWeb.java (100%) rename src/{ => main/java}/org/teachingextensions/logo/Wheel.java (100%) rename src/{ => main/java}/org/teachingextensions/logo/shapes/Circle.java (100%) rename src/{ => main/java}/org/teachingextensions/logo/shapes/Text.java (100%) rename src/{ => main/java}/org/teachingextensions/logo/utils/Sounds.java (100%) rename src/{ => main/java}/org/teachingextensions/logo/utils/TortoiseUtils.java (100%) rename src/{ => main/java}/org/teachingextensions/setup/CommandLineUtils.java (100%) rename src/{ => main/java}/org/teachingextensions/setup/MacThumbDriveInstaller.java (100%) rename src/{ => main/java}/org/teachingextensions/setup/SetupConfig.java (100%) rename src/{ => main/java}/org/teachingextensions/setup/SetupValidator.java (100%) rename src/{ => main/java}/org/teachingextensions/setup/ThumbDriveInstaller.java (100%) rename src/{ => main/java}/org/teachingextensions/setup/WindowsThumbDriveInstaller.java (100%) rename src/{ => main/java}/org/teachingextensions/simpleparser/Parser.java (100%) rename src/{ => main/java}/org/teachingextensions/utils/Viewer.java (100%) rename src/{ => main/java}/org/teachingextensions/utils/VirtualProctor.java (100%) rename src/{ => main/java}/org/teachingextensions/windows/GraphicsWindow.java (100%) rename src/{ => main/java}/org/teachingextensions/windows/LeftClickMouseAdapter.java (100%) rename src/{ => main/java}/org/teachingextensions/windows/MessageBox.java (100%) rename src/{ => main/java}/org/teachingextensions/windows/MouseLeftClickListener.java (100%) rename src/{ => main/java}/org/teachingextensions/windows/MouseRightClickListener.java (100%) rename src/{ => main/java}/org/teachingextensions/windows/ProgramWindow.java (100%) rename src/{ => main/java}/org/teachingextensions/windows/RightClickMouseAdapter.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/recipes/completed/AdLibs.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/recipes/completed/AdLibsQuiz.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/recipes/completed/AdLibsRtf.java (90%) rename src/{ => main/java}/org/teachingkidsprogramming/recipes/completed/BackgroundPhoto.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/recipes/completed/ChooseYourOwnAdventure.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/recipes/completed/ConnectTheDots.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/recipes/completed/DigiFlower.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/recipes/completed/FizzBuzz.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/recipes/completed/FizzBuzzTDD.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/recipes/completed/FourSquare.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/recipes/completed/HiLow.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/recipes/completed/Houses.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/recipes/completed/KnottedRing.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/recipes/completed/ManyAnimals.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/recipes/completed/PentagonCrazy.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/recipes/completed/SimpleBubble.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/recipes/completed/SimpleBubbleQuiz.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/recipes/completed/SimpleSquare.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/recipes/completed/SmallBasicHolidayCard.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/recipes/completed/SmallBasicTicTacToe.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/recipes/completed/SpiderWeb.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/recipes/completed/Spiral.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/recipes/completed/TriangleShell.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/recipes/completed/TurtleTree.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/recipes/quizzes/graders/AdLibsQuizAdapter.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/recipes/quizzes/graders/AdLibsQuizGrader.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/recipes/quizzes/graders/HiLowQuiz.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/recipes/quizzes/graders/HiLowQuizGrader.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/recipes/quizzes/graders/HousesQuizAdapter.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/recipes/quizzes/graders/HousesQuizGrader.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/recipes/quizzes/graders/MessageBoxMock.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/recipes/quizzes/graders/PentagonCrazyQuizGrader.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/recipes/quizzes/graders/PentagonQuizAdapter.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/recipes/quizzes/graders/QuizBuzzAdapter.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/recipes/quizzes/graders/QuizBuzzGrader.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/recipes/quizzes/graders/QuizUtils.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/recipes/quizzes/graders/SimpleBubbleQuizAdapter.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/recipes/quizzes/graders/SimpleBubbleQuizGrader.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/recipes/quizzes/graders/SimpleSquareQuizGrader.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/recipes/quizzes/graders/SpiderQuiz.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/recipes/quizzes/graders/SpiderWebQuizGrader.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/recipes/quizzes/graders/SquareQuiz.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/recipes/quizzes/graders/TreeQuizAdapter.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/recipes/quizzes/graders/TreeQuizGrader.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/section01forloops/DeepDive01ForLoops.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/section01forloops/SimpleSquare.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/section01forloops/SimpleSquareQuiz.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/section01forloops/Spiral.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/section02methods/DeepDive02Variables.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/section02methods/FourSquare.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/section02methods/Houses.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/section02methods/HousesQuiz.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/section02methods/TriangleShell.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/section03ifs/ChooseYourOwnAdventure.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/section03ifs/DeepDive03Ifs.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/section03ifs/HiLow.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/section03ifs/HiLowQuiz.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/section04mastery/BackgroundPhoto.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/section04mastery/DeepDive04Mastery.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/section04mastery/DigiFlower.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/section04mastery/KnottedRing.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/section04mastery/PentagonCrazy.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/section04mastery/PentagonCrazyQuiz.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/section05recursion/DeepDive05Recursion.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/section05recursion/SpiderWeb.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/section05recursion/SpiderWebQuiz.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/section05recursion/TreeQuiz.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/section05recursion/TurtleTree.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/section06modelviewcontroller/AdLibs.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/section06modelviewcontroller/AdLibsQuiz.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/section06modelviewcontroller/DeepDive06ModelViewController.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/section07events/ConnectTheDots.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/section07events/DeepDive07Events.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/section07events/ManyAnimals.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/section07events/SimpleBubble.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/section07events/SimpleBubbleQuiz.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/section08tdd/DeepDive08TDD.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/section08tdd/FizzBuzz.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/section08tdd/FizzBuzzTDD.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/section08tdd/QuizBuzz.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/section09exceptions/DeepDive09exceptions.java (100%) rename src/{ => main/java}/you/need/to/fill/in/the/______.java (100%) rename src/{org/teachingkidsprogramming/section01forloops/PrintThis => main/resources/documents}/0_Keyboard-Shortcuts.docx (100%) rename src/{org/teachingkidsprogramming/section01forloops/PrintThis => main/resources/documents}/1_SimpleSquareWorksheet.docx (100%) rename src/{org/teachingkidsprogramming/section02methods/PrintThis => main/resources/documents}/2_HousesWorksheet.docx (100%) rename src/{org/teachingkidsprogramming/section03ifs/PrintThis => main/resources/documents}/3_HiLowWorksheet.docx (100%) rename src/{org/teachingkidsprogramming/section04mastery/PrintThis => main/resources/documents}/4_PentagonCrazyWorksheet.docx (100%) rename src/{org/teachingkidsprogramming/section05recursion/PrintThis => main/resources/documents}/5_TurtleTreeWorksheet.docx (100%) rename src/{org/teachingkidsprogramming/section06modelviewcontroller/PrintThis => main/resources/documents}/6_AdLibsWorksheet.docx (100%) rename src/{org/teachingkidsprogramming/section07events/PrintThis => main/resources/documents}/7_SimpleBubbleWorksheet.docx (100%) rename src/{org/teachingkidsprogramming/section08tdd/PrintThis => main/resources/documents}/8_FizzBuzzWorksheet.docx (100%) rename src/{org/teachingkidsprogramming/section02methods/PrintThis => main/resources/documents}/Tortoise.pdf (100%) rename src/{org/teachingkidsprogramming/recipes/completed => main/resources/documents}/view.rtf (100%) rename src/{org/teachingextensions/logo => main/resources/images}/ExplodedTurtle.png (100%) rename src/{org/teachingextensions/logo => main/resources/images}/ExplodedTurtleOld.png (100%) rename src/{org/teachingextensions/logo => main/resources/images}/Spider.png (100%) create mode 100644 src/main/resources/images/Thumbs.db rename src/{org/teachingextensions/logo => main/resources/images}/Turtle.png (100%) delete mode 100644 src/org/teachingextensions/logo/Turtle.zip delete mode 100644 src/org/teachingextensions/logo/Turtle/ExplodedTurtle.png rename src/{ => test/java}/org/teachingextensions/logo/tests/ColorGeneration.java (100%) rename src/{ => test/java}/org/teachingextensions/logo/tests/ColorGeneration.testGeneration.approved.txt (100%) rename src/{ => test/java}/org/teachingextensions/logo/tests/ColorGeneration.testHtmlDisplay.approved.html (100%) rename src/{ => test/java}/org/teachingextensions/logo/tests/ColorsTest.java (100%) rename src/{ => test/java}/org/teachingextensions/logo/tests/RecipeTests.java (100%) rename src/{ => test/java}/org/teachingextensions/logo/tests/RecipeTests.testCircle.approved.png (100%) rename src/{ => test/java}/org/teachingextensions/logo/tests/RecipeTests.testDigiGirlzFlower.approved.png (100%) rename src/{ => test/java}/org/teachingextensions/logo/tests/RecipeTests.testFourSquare.approved.png (100%) rename src/{ => test/java}/org/teachingextensions/logo/tests/RecipeTests.testKnottedRing.approved.png (100%) rename src/{ => test/java}/org/teachingextensions/logo/tests/RecipeTests.testSimpleSquare.approved.png (100%) rename src/{ => test/java}/org/teachingextensions/logo/tests/RecipeTests.testSpiral.approved.png (100%) rename src/{ => test/java}/org/teachingextensions/logo/tests/RecipeTests.testTriangleShell.approved.png (100%) rename src/{ => test/java}/org/teachingextensions/logo/tests/RecipeTests.testTurtleTree.approved.png (100%) rename src/{ => test/java}/org/teachingextensions/logo/tests/TortoiseTest.java (100%) rename src/{ => test/java}/org/teachingextensions/logo/tests/TortoiseTest.testBigWidth.approved.png (100%) rename src/{ => test/java}/org/teachingextensions/logo/tests/TortoiseTest.testSimpleSquare.approved.png (100%) rename src/{ => test/java}/org/teachingextensions/logo/tests/TurtlePanelTest.java (100%) rename src/{ => test/java}/org/teachingextensions/logo/tests/TurtlePanelTest.testImageForBackground.approved.png (100%) rename src/{ => test/java}/org/teachingextensions/logo/tests/TurtleTest.java (100%) rename src/{ => test/java}/org/teachingextensions/logo/tests/TurtleTest.testDelta.approved.txt (100%) rename src/{ => test/java}/org/teachingextensions/logo/tests/TurtleTest.testHide.approved.png (100%) rename src/{ => test/java}/org/teachingextensions/logo/tests/TurtleTest.testMove.approved.png (100%) rename src/{ => test/java}/org/teachingextensions/logo/tests/TurtleTest.testMove45DegreesLeft.approved.png (100%) rename src/{ => test/java}/org/teachingextensions/logo/tests/TurtleTest.testPenDown.approved.png (100%) rename src/{ => test/java}/org/teachingextensions/logo/tests/TurtleTest.testPentagonCrazy.approved.png (100%) rename src/{ => test/java}/org/teachingextensions/logo/tests/TurtleTest.testRotate.approved.png (100%) rename src/{ => test/java}/org/teachingextensions/logo/tests/TurtleTest.testRotate45.approved.png (100%) rename src/{ => test/java}/org/teachingextensions/logo/tests/TurtleTest.testRotate45CounterClockwise.approved.png (100%) rename src/{ => test/java}/org/teachingextensions/logo/tests/TurtleTest.testShow.approved.png (100%) rename src/{ => test/java}/org/teachingextensions/logo/tests/TurtleTest.testSpeed.approved.txt (100%) rename src/{ => test/java}/org/teachingextensions/logo/tests/TurtleUtils.java (100%) rename src/{ => test/java}/org/teachingextensions/logo/tests/VirtualProctorTest.java (100%) rename src/{ => test/java}/org/teachingextensions/logo/tests/WheelTest.java (100%) rename src/{ => test/java}/org/teachingextensions/logo/tests/WheelTest.testWheel.approved.txt (100%) rename src/{ => test/java}/org/teachingextensions/logo/tests/colors.cpp (100%) rename src/{ => test/java}/org/teachingextensions/logo/tests/colors.html (100%) rename src/{ => test/java}/org/teachingextensions/logo/tests/colors.java.template (100%) rename src/{ => test/java}/org/teachingextensions/logo/tests/colors.sorted.txt (100%) rename src/{ => test/java}/org/teachingextensions/logo/tests/colors.txt (100%) rename src/{ => test/java}/org/teachingextensions/logo/utils/tests/SoundsDemo.java (100%) rename src/{ => test/java}/org/teachingextensions/setup/tests/UnzipTest.java (100%) rename src/{ => test/java}/org/teachingextensions/simpleparser/tests/ParserTest.java (100%) rename src/{ => test/java}/org/teachingextensions/simpleparser/tests/ParserTest.testSimpleParse.approved.txt (100%) rename src/{ => test/java}/org/teachingextensions/windows/tests/GraphicsWindowTest.java (100%) rename src/{ => test/java}/org/teachingkidsprogramming/recipes/completed/FizzBuzzTDDTest.java (100%) rename src/{ => test/java}/org/teachingkidsprogramming/recipes/deepdives/tests/DeepDive01Test.java (100%) rename src/{ => test/java}/org/teachingkidsprogramming/recipes/deepdives/tests/DeepDive02Test.java (100%) rename src/{ => test/java}/org/teachingkidsprogramming/recipes/deepdives/tests/DeepDive03Test.java (100%) rename src/{ => test/java}/org/teachingkidsprogramming/recipes/deepdives/tests/DeepDive04MasteryTest.java (100%) rename src/{ => test/java}/org/teachingkidsprogramming/recipes/deepdives/tests/DeepDive05RecursionTest.java (100%) rename src/{ => test/java}/org/teachingkidsprogramming/recipes/quizzes/tests/AdLibsQuizTest.java (100%) rename src/{ => test/java}/org/teachingkidsprogramming/recipes/quizzes/tests/AdLibsQuizTest.testCorrect.Windows_7.approved.png (100%) rename src/{ => test/java}/org/teachingkidsprogramming/recipes/quizzes/tests/AdLibsQuizTest.testIncorrect.Windows_7.approved.png (100%) rename src/{ => test/java}/org/teachingkidsprogramming/recipes/quizzes/tests/HiLowQuizTest.java (100%) rename src/{ => test/java}/org/teachingkidsprogramming/recipes/quizzes/tests/HiLowQuizTest.testCorrect.Windows_7.approved.png (100%) rename src/{ => test/java}/org/teachingkidsprogramming/recipes/quizzes/tests/HiLowQuizTest.testIncorrect.Windows_7.approved.png (100%) rename src/{ => test/java}/org/teachingkidsprogramming/recipes/quizzes/tests/HousesQuizTest.java (100%) rename src/{ => test/java}/org/teachingkidsprogramming/recipes/quizzes/tests/HousesQuizTest.testCorrect.Mac_OS_X.approved.png (100%) rename src/{ => test/java}/org/teachingkidsprogramming/recipes/quizzes/tests/HousesQuizTest.testCorrect.Windows_7.approved.png (100%) rename src/{ => test/java}/org/teachingkidsprogramming/recipes/quizzes/tests/HousesQuizTest.testIncorrect.Mac_OS_X.approved.png (100%) rename src/{ => test/java}/org/teachingkidsprogramming/recipes/quizzes/tests/HousesQuizTest.testIncorrect.Windows_7.approved.png (100%) rename src/{ => test/java}/org/teachingkidsprogramming/recipes/quizzes/tests/PentagonCrazyQuizTest.java (100%) rename src/{ => test/java}/org/teachingkidsprogramming/recipes/quizzes/tests/PentagonCrazyQuizTest.testCorrect.Mac_OS_X.approved.png (100%) rename src/{ => test/java}/org/teachingkidsprogramming/recipes/quizzes/tests/PentagonCrazyQuizTest.testCorrect.Windows_7.approved.png (100%) rename src/{ => test/java}/org/teachingkidsprogramming/recipes/quizzes/tests/PentagonCrazyQuizTest.testIncorrect.Mac_OS_X.approved.png (100%) rename src/{ => test/java}/org/teachingkidsprogramming/recipes/quizzes/tests/PentagonCrazyQuizTest.testIncorrect.Windows_7.approved.png (100%) rename src/{ => test/java}/org/teachingkidsprogramming/recipes/quizzes/tests/QuizBuzzTest.java (100%) rename src/{ => test/java}/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleBubbleQuizTest.java (100%) rename src/{ => test/java}/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleSquareQuizTest.java (100%) rename src/{ => test/java}/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleSquareQuizTest.testCorrect.Mac_OS_X.approved.png (100%) rename src/{ => test/java}/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleSquareQuizTest.testCorrect.Windows_7.approved.png (100%) rename src/{ => test/java}/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleSquareQuizTest.testIncorrect.Mac_OS_X.approved.png (100%) rename src/{ => test/java}/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleSquareQuizTest.testIncorrect.Windows_7.approved.png (100%) rename src/{ => test/java}/org/teachingkidsprogramming/recipes/quizzes/tests/SpiderWebQuizTest.java (100%) rename src/{ => test/java}/org/teachingkidsprogramming/recipes/quizzes/tests/SpiderWebQuizTest.testCircle.Mac_OS_X.approved.png (100%) rename src/{ => test/java}/org/teachingkidsprogramming/recipes/quizzes/tests/SpiderWebQuizTest.testCircle.Windows_7.approved.png (100%) rename src/{ => test/java}/org/teachingkidsprogramming/recipes/quizzes/tests/SpiderWebQuizTest.testCorrect.Mac_OS_X.approved.png (100%) rename src/{ => test/java}/org/teachingkidsprogramming/recipes/quizzes/tests/SpiderWebQuizTest.testCorrect.Mac_OS_X.received.png (100%) rename src/{ => test/java}/org/teachingkidsprogramming/recipes/quizzes/tests/SpiderWebQuizTest.testCorrect.Windows_7.approved.png (100%) rename src/{ => test/java}/org/teachingkidsprogramming/recipes/quizzes/tests/SpiderWebQuizTest.testIncorrect.Mac_OS_X.approved.png (100%) rename src/{ => test/java}/org/teachingkidsprogramming/recipes/quizzes/tests/SpiderWebQuizTest.testIncorrect.Windows_7.approved.png (100%) rename src/{ => test/java}/org/teachingkidsprogramming/recipes/quizzes/tests/TreeQuizTest.java (100%) rename src/{ => test/java}/org/teachingkidsprogramming/recipes/quizzes/tests/TreeQuizTest.testCorrect.Windows_7.approved.png (100%) rename src/{ => test/java}/org/teachingkidsprogramming/recipes/quizzes/tests/TreeQuizTest.testIncorrect.Windows_7.approved.png (100%) create mode 100644 src/test/resources/documents/ColorGeneration.testGeneration.approved.txt create mode 100644 src/test/resources/documents/ColorGeneration.testHtmlDisplay.approved.html create mode 100644 src/test/resources/documents/ParserTest.testSimpleParse.approved.txt create mode 100644 src/test/resources/documents/TurtleTest.testDelta.approved.txt create mode 100644 src/test/resources/documents/TurtleTest.testSpeed.approved.txt create mode 100644 src/test/resources/documents/WheelTest.testWheel.approved.txt create mode 100644 src/test/resources/documents/colors.html create mode 100644 src/test/resources/documents/colors.java.template create mode 100644 src/test/resources/documents/colors.sorted.txt create mode 100644 src/test/resources/documents/colors.txt create mode 100644 src/test/resources/images/AdLibsQuizTest.testCorrect.Windows_7.approved.png create mode 100644 src/test/resources/images/AdLibsQuizTest.testIncorrect.Windows_7.approved.png create mode 100644 src/test/resources/images/HiLowQuizTest.testCorrect.Windows_7.approved.png create mode 100644 src/test/resources/images/HiLowQuizTest.testIncorrect.Windows_7.approved.png create mode 100644 src/test/resources/images/HousesQuizTest.testCorrect.Mac_OS_X.approved.png create mode 100644 src/test/resources/images/HousesQuizTest.testCorrect.Windows_7.approved.png create mode 100644 src/test/resources/images/HousesQuizTest.testIncorrect.Mac_OS_X.approved.png create mode 100644 src/test/resources/images/HousesQuizTest.testIncorrect.Windows_7.approved.png create mode 100644 src/test/resources/images/PentagonCrazyQuizTest.testCorrect.Mac_OS_X.approved.png create mode 100644 src/test/resources/images/PentagonCrazyQuizTest.testCorrect.Windows_7.approved.png create mode 100644 src/test/resources/images/PentagonCrazyQuizTest.testIncorrect.Mac_OS_X.approved.png create mode 100644 src/test/resources/images/PentagonCrazyQuizTest.testIncorrect.Windows_7.approved.png create mode 100644 src/test/resources/images/RecipeTests.testCircle.approved.png create mode 100644 src/test/resources/images/RecipeTests.testDigiGirlzFlower.approved.png create mode 100644 src/test/resources/images/RecipeTests.testFourSquare.approved.png create mode 100644 src/test/resources/images/RecipeTests.testKnottedRing.approved.png create mode 100644 src/test/resources/images/RecipeTests.testSimpleSquare.approved.png create mode 100644 src/test/resources/images/RecipeTests.testSpiral.approved.png create mode 100644 src/test/resources/images/RecipeTests.testTriangleShell.approved.png create mode 100644 src/test/resources/images/RecipeTests.testTurtleTree.approved.png create mode 100644 src/test/resources/images/SimpleSquareQuizTest.testCorrect.Mac_OS_X.approved.png create mode 100644 src/test/resources/images/SimpleSquareQuizTest.testCorrect.Windows_7.approved.png create mode 100644 src/test/resources/images/SimpleSquareQuizTest.testIncorrect.Mac_OS_X.approved.png create mode 100644 src/test/resources/images/SimpleSquareQuizTest.testIncorrect.Windows_7.approved.png create mode 100644 src/test/resources/images/SpiderWebQuizTest.testCircle.Mac_OS_X.approved.png create mode 100644 src/test/resources/images/SpiderWebQuizTest.testCircle.Windows_7.approved.png create mode 100644 src/test/resources/images/SpiderWebQuizTest.testCorrect.Mac_OS_X.approved.png create mode 100644 src/test/resources/images/SpiderWebQuizTest.testCorrect.Mac_OS_X.received.png create mode 100644 src/test/resources/images/SpiderWebQuizTest.testCorrect.Windows_7.approved.png create mode 100644 src/test/resources/images/SpiderWebQuizTest.testIncorrect.Mac_OS_X.approved.png create mode 100644 src/test/resources/images/SpiderWebQuizTest.testIncorrect.Windows_7.approved.png create mode 100644 src/test/resources/images/TortoiseTest.testBigWidth.approved.png create mode 100644 src/test/resources/images/TortoiseTest.testSimpleSquare.approved.png create mode 100644 src/test/resources/images/TreeQuizTest.testCorrect.Windows_7.approved.png create mode 100644 src/test/resources/images/TreeQuizTest.testIncorrect.Windows_7.approved.png create mode 100644 src/test/resources/images/TurtlePanelTest.testImageForBackground.approved.png create mode 100644 src/test/resources/images/TurtleTest.testHide.approved.png create mode 100644 src/test/resources/images/TurtleTest.testMove.approved.png create mode 100644 src/test/resources/images/TurtleTest.testMove45DegreesLeft.approved.png create mode 100644 src/test/resources/images/TurtleTest.testPenDown.approved.png create mode 100644 src/test/resources/images/TurtleTest.testPentagonCrazy.approved.png create mode 100644 src/test/resources/images/TurtleTest.testRotate.approved.png create mode 100644 src/test/resources/images/TurtleTest.testRotate45.approved.png create mode 100644 src/test/resources/images/TurtleTest.testRotate45CounterClockwise.approved.png create mode 100644 src/test/resources/images/TurtleTest.testShow.approved.png diff --git a/.classpath b/.classpath index d909a98..8883778 100644 --- a/.classpath +++ b/.classpath @@ -1,8 +1,19 @@ - - - - - - - - + + + + + + + + + + + + + + + + + + + diff --git a/.gitignore b/.gitignore index cde66fd..0b3e10e 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ *.war *.ear +/target/ diff --git a/.project b/.project index 4aba24c..9fd8bd9 100644 --- a/.project +++ b/.project @@ -10,8 +10,14 @@ + + org.eclipse.m2e.core.maven2Builder + + + + org.eclipse.m2e.core.maven2Nature org.eclipse.jdt.core.javanature diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..d59e09c --- /dev/null +++ b/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,5 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 0000000..14b697b --- /dev/null +++ b/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/build/build.xml b/build/build.xml deleted file mode 100644 index bc2288a..0000000 --- a/build/build.xml +++ /dev/null @@ -1,102 +0,0 @@ - - - - - ${targetJavaClass} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/build/properties/teaching_kids_programming.properties b/build/properties/teaching_kids_programming.properties deleted file mode 100644 index 216ebec..0000000 --- a/build/properties/teaching_kids_programming.properties +++ /dev/null @@ -1,13 +0,0 @@ -home=C:/Users/lynnlangit/Documents/GitHub/TKPSource/TeachingKidsProgramming.Source.Java -src=${home}/src -tkp_workspace=C:/Users/lynnlangit/Documents/GitHub/TeachingKidsProgramming.Java -tkp_project=${tkp_workspace}/TeachingKidsProgramming -build_home=/temp/builds -build=${build_home}/build -targetJavaClass=org/teachingextensions/**,you/** -additonal_java_sources=C:/Users/lynnlangit/Documents/GitHub/ApprovalTests.Java/java -jars=${src}/jars -jar=${build}/TeachingKidsProgramming.jar - -documentation=${home}/build/resources/teaching_kids_programming -excludeTests=true diff --git a/build/properties/tkplauncher.properties b/build/properties/tkplauncher.properties deleted file mode 100644 index 4b18e50..0000000 --- a/build/properties/tkplauncher.properties +++ /dev/null @@ -1,9 +0,0 @@ -home=C:/Users/Llewellyn/Documents/GitHub/ApprovalTests.Java -src=${home}/java -build_home=/temp/builds -tkp_workspace=/Users/Llewellyn/workspace/ApprovalTestsKoans/TeachingKidsProgramming.Java -build=${build_home}/build -targetJavaClass=org/teachingextensions/setup/** -jars=${src}/jars -jar=${tkp_workspace} -excludeTests=true diff --git a/build/resources/teaching_kids_programming/build.xml b/build/resources/teaching_kids_programming/build.xml deleted file mode 100644 index 1e6d749..0000000 --- a/build/resources/teaching_kids_programming/build.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..395304d --- /dev/null +++ b/pom.xml @@ -0,0 +1,37 @@ + + 4.0.0 + org.tkp + 0.0.1-SNAPSHOT + TeachingKidsProgramming.Source.Java + + This is the Source Code for Tortoise and many other utils that are used for the TKP Java Library. + TeachingKidsProgramming + + + + com.tkp + ApprovalTest + 0.0.1-SNAPSHOT + + + junit + junit + 4.12 + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + 1.8 + 1.8 + + + + + https://github.com/bhagatsingh/TeachingKidsProgramming.Source.Java + \ No newline at end of file diff --git a/src/org/teachingextensions/logo/ColorWheel.java b/src/main/java/org/teachingextensions/logo/ColorWheel.java similarity index 100% rename from src/org/teachingextensions/logo/ColorWheel.java rename to src/main/java/org/teachingextensions/logo/ColorWheel.java diff --git a/src/org/teachingextensions/logo/Colors.java b/src/main/java/org/teachingextensions/logo/Colors.java similarity index 100% rename from src/org/teachingextensions/logo/Colors.java rename to src/main/java/org/teachingextensions/logo/Colors.java diff --git a/src/org/teachingextensions/logo/CompositeStroke.java b/src/main/java/org/teachingextensions/logo/CompositeStroke.java similarity index 100% rename from src/org/teachingextensions/logo/CompositeStroke.java rename to src/main/java/org/teachingextensions/logo/CompositeStroke.java diff --git a/src/org/teachingextensions/logo/ImageBackground.java b/src/main/java/org/teachingextensions/logo/ImageBackground.java similarity index 100% rename from src/org/teachingextensions/logo/ImageBackground.java rename to src/main/java/org/teachingextensions/logo/ImageBackground.java diff --git a/src/org/teachingextensions/logo/LineSegment.java b/src/main/java/org/teachingextensions/logo/LineSegment.java similarity index 100% rename from src/org/teachingextensions/logo/LineSegment.java rename to src/main/java/org/teachingextensions/logo/LineSegment.java diff --git a/src/org/teachingextensions/logo/MultiTurtlePanel.java b/src/main/java/org/teachingextensions/logo/MultiTurtlePanel.java similarity index 94% rename from src/org/teachingextensions/logo/MultiTurtlePanel.java rename to src/main/java/org/teachingextensions/logo/MultiTurtlePanel.java index ef81600..87f47e9 100644 --- a/src/org/teachingextensions/logo/MultiTurtlePanel.java +++ b/src/main/java/org/teachingextensions/logo/MultiTurtlePanel.java @@ -123,7 +123,9 @@ public synchronized Animals getAnimal() public synchronized void setAnimal(Animals animal) { this.animal = animal; - image = new ImageIcon(this.getClass().getResource(animal + ".png")).getImage(); + //image = new ImageIcon(this.getClass().getResource(animal + ".png")).getImage(); + image = new ImageIcon(this.getClass().getClassLoader() + .getResource("images/" + animal + ".png")).getImage(); } public void setCursor(int cursor) { diff --git a/src/org/teachingextensions/logo/Paintable.java b/src/main/java/org/teachingextensions/logo/Paintable.java similarity index 100% rename from src/org/teachingextensions/logo/Paintable.java rename to src/main/java/org/teachingextensions/logo/Paintable.java diff --git a/src/org/teachingextensions/logo/PenColors.java b/src/main/java/org/teachingextensions/logo/PenColors.java similarity index 100% rename from src/org/teachingextensions/logo/PenColors.java rename to src/main/java/org/teachingextensions/logo/PenColors.java diff --git a/src/org/teachingextensions/logo/Pizza.java b/src/main/java/org/teachingextensions/logo/Pizza.java similarity index 100% rename from src/org/teachingextensions/logo/Pizza.java rename to src/main/java/org/teachingextensions/logo/Pizza.java diff --git a/src/org/teachingextensions/logo/ScreenCapture.java b/src/main/java/org/teachingextensions/logo/ScreenCapture.java similarity index 100% rename from src/org/teachingextensions/logo/ScreenCapture.java rename to src/main/java/org/teachingextensions/logo/ScreenCapture.java diff --git a/src/org/teachingextensions/logo/Topping.java b/src/main/java/org/teachingextensions/logo/Topping.java similarity index 100% rename from src/org/teachingextensions/logo/Topping.java rename to src/main/java/org/teachingextensions/logo/Topping.java diff --git a/src/org/teachingextensions/logo/Tortoise.java b/src/main/java/org/teachingextensions/logo/Tortoise.java similarity index 100% rename from src/org/teachingextensions/logo/Tortoise.java rename to src/main/java/org/teachingextensions/logo/Tortoise.java diff --git a/src/org/teachingextensions/logo/Turtle.java b/src/main/java/org/teachingextensions/logo/Turtle.java similarity index 100% rename from src/org/teachingextensions/logo/Turtle.java rename to src/main/java/org/teachingextensions/logo/Turtle.java diff --git a/src/org/teachingextensions/logo/TurtlePanel.java b/src/main/java/org/teachingextensions/logo/TurtlePanel.java similarity index 95% rename from src/org/teachingextensions/logo/TurtlePanel.java rename to src/main/java/org/teachingextensions/logo/TurtlePanel.java index c0b39ce..f689372 100644 --- a/src/org/teachingextensions/logo/TurtlePanel.java +++ b/src/main/java/org/teachingextensions/logo/TurtlePanel.java @@ -84,7 +84,8 @@ public synchronized Animals getAnimal() public synchronized void setAnimal(Animals animal) { this.animal = animal; - image = new ImageIcon(this.getClass().getResource(animal + ".png")).getImage(); + image = new ImageIcon(this.getClass().getClassLoader() + .getResource("images/" + animal + ".png")).getImage(); } public void setCursor(int cursor) { diff --git a/src/org/teachingextensions/logo/VirtualProctorFileSystem.java b/src/main/java/org/teachingextensions/logo/VirtualProctorFileSystem.java similarity index 100% rename from src/org/teachingextensions/logo/VirtualProctorFileSystem.java rename to src/main/java/org/teachingextensions/logo/VirtualProctorFileSystem.java diff --git a/src/org/teachingextensions/logo/VirtualProctorWeb.java b/src/main/java/org/teachingextensions/logo/VirtualProctorWeb.java similarity index 100% rename from src/org/teachingextensions/logo/VirtualProctorWeb.java rename to src/main/java/org/teachingextensions/logo/VirtualProctorWeb.java diff --git a/src/org/teachingextensions/logo/Wheel.java b/src/main/java/org/teachingextensions/logo/Wheel.java similarity index 100% rename from src/org/teachingextensions/logo/Wheel.java rename to src/main/java/org/teachingextensions/logo/Wheel.java diff --git a/src/org/teachingextensions/logo/shapes/Circle.java b/src/main/java/org/teachingextensions/logo/shapes/Circle.java similarity index 100% rename from src/org/teachingextensions/logo/shapes/Circle.java rename to src/main/java/org/teachingextensions/logo/shapes/Circle.java diff --git a/src/org/teachingextensions/logo/shapes/Text.java b/src/main/java/org/teachingextensions/logo/shapes/Text.java similarity index 100% rename from src/org/teachingextensions/logo/shapes/Text.java rename to src/main/java/org/teachingextensions/logo/shapes/Text.java diff --git a/src/org/teachingextensions/logo/utils/Sounds.java b/src/main/java/org/teachingextensions/logo/utils/Sounds.java similarity index 100% rename from src/org/teachingextensions/logo/utils/Sounds.java rename to src/main/java/org/teachingextensions/logo/utils/Sounds.java diff --git a/src/org/teachingextensions/logo/utils/TortoiseUtils.java b/src/main/java/org/teachingextensions/logo/utils/TortoiseUtils.java similarity index 100% rename from src/org/teachingextensions/logo/utils/TortoiseUtils.java rename to src/main/java/org/teachingextensions/logo/utils/TortoiseUtils.java diff --git a/src/org/teachingextensions/setup/CommandLineUtils.java b/src/main/java/org/teachingextensions/setup/CommandLineUtils.java similarity index 100% rename from src/org/teachingextensions/setup/CommandLineUtils.java rename to src/main/java/org/teachingextensions/setup/CommandLineUtils.java diff --git a/src/org/teachingextensions/setup/MacThumbDriveInstaller.java b/src/main/java/org/teachingextensions/setup/MacThumbDriveInstaller.java similarity index 100% rename from src/org/teachingextensions/setup/MacThumbDriveInstaller.java rename to src/main/java/org/teachingextensions/setup/MacThumbDriveInstaller.java diff --git a/src/org/teachingextensions/setup/SetupConfig.java b/src/main/java/org/teachingextensions/setup/SetupConfig.java similarity index 100% rename from src/org/teachingextensions/setup/SetupConfig.java rename to src/main/java/org/teachingextensions/setup/SetupConfig.java diff --git a/src/org/teachingextensions/setup/SetupValidator.java b/src/main/java/org/teachingextensions/setup/SetupValidator.java similarity index 100% rename from src/org/teachingextensions/setup/SetupValidator.java rename to src/main/java/org/teachingextensions/setup/SetupValidator.java diff --git a/src/org/teachingextensions/setup/ThumbDriveInstaller.java b/src/main/java/org/teachingextensions/setup/ThumbDriveInstaller.java similarity index 100% rename from src/org/teachingextensions/setup/ThumbDriveInstaller.java rename to src/main/java/org/teachingextensions/setup/ThumbDriveInstaller.java diff --git a/src/org/teachingextensions/setup/WindowsThumbDriveInstaller.java b/src/main/java/org/teachingextensions/setup/WindowsThumbDriveInstaller.java similarity index 100% rename from src/org/teachingextensions/setup/WindowsThumbDriveInstaller.java rename to src/main/java/org/teachingextensions/setup/WindowsThumbDriveInstaller.java diff --git a/src/org/teachingextensions/simpleparser/Parser.java b/src/main/java/org/teachingextensions/simpleparser/Parser.java similarity index 100% rename from src/org/teachingextensions/simpleparser/Parser.java rename to src/main/java/org/teachingextensions/simpleparser/Parser.java diff --git a/src/org/teachingextensions/utils/Viewer.java b/src/main/java/org/teachingextensions/utils/Viewer.java similarity index 100% rename from src/org/teachingextensions/utils/Viewer.java rename to src/main/java/org/teachingextensions/utils/Viewer.java diff --git a/src/org/teachingextensions/utils/VirtualProctor.java b/src/main/java/org/teachingextensions/utils/VirtualProctor.java similarity index 100% rename from src/org/teachingextensions/utils/VirtualProctor.java rename to src/main/java/org/teachingextensions/utils/VirtualProctor.java diff --git a/src/org/teachingextensions/windows/GraphicsWindow.java b/src/main/java/org/teachingextensions/windows/GraphicsWindow.java similarity index 100% rename from src/org/teachingextensions/windows/GraphicsWindow.java rename to src/main/java/org/teachingextensions/windows/GraphicsWindow.java diff --git a/src/org/teachingextensions/windows/LeftClickMouseAdapter.java b/src/main/java/org/teachingextensions/windows/LeftClickMouseAdapter.java similarity index 100% rename from src/org/teachingextensions/windows/LeftClickMouseAdapter.java rename to src/main/java/org/teachingextensions/windows/LeftClickMouseAdapter.java diff --git a/src/org/teachingextensions/windows/MessageBox.java b/src/main/java/org/teachingextensions/windows/MessageBox.java similarity index 100% rename from src/org/teachingextensions/windows/MessageBox.java rename to src/main/java/org/teachingextensions/windows/MessageBox.java diff --git a/src/org/teachingextensions/windows/MouseLeftClickListener.java b/src/main/java/org/teachingextensions/windows/MouseLeftClickListener.java similarity index 100% rename from src/org/teachingextensions/windows/MouseLeftClickListener.java rename to src/main/java/org/teachingextensions/windows/MouseLeftClickListener.java diff --git a/src/org/teachingextensions/windows/MouseRightClickListener.java b/src/main/java/org/teachingextensions/windows/MouseRightClickListener.java similarity index 100% rename from src/org/teachingextensions/windows/MouseRightClickListener.java rename to src/main/java/org/teachingextensions/windows/MouseRightClickListener.java diff --git a/src/org/teachingextensions/windows/ProgramWindow.java b/src/main/java/org/teachingextensions/windows/ProgramWindow.java similarity index 100% rename from src/org/teachingextensions/windows/ProgramWindow.java rename to src/main/java/org/teachingextensions/windows/ProgramWindow.java diff --git a/src/org/teachingextensions/windows/RightClickMouseAdapter.java b/src/main/java/org/teachingextensions/windows/RightClickMouseAdapter.java similarity index 100% rename from src/org/teachingextensions/windows/RightClickMouseAdapter.java rename to src/main/java/org/teachingextensions/windows/RightClickMouseAdapter.java diff --git a/src/org/teachingkidsprogramming/recipes/completed/AdLibs.java b/src/main/java/org/teachingkidsprogramming/recipes/completed/AdLibs.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/completed/AdLibs.java rename to src/main/java/org/teachingkidsprogramming/recipes/completed/AdLibs.java diff --git a/src/org/teachingkidsprogramming/recipes/completed/AdLibsQuiz.java b/src/main/java/org/teachingkidsprogramming/recipes/completed/AdLibsQuiz.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/completed/AdLibsQuiz.java rename to src/main/java/org/teachingkidsprogramming/recipes/completed/AdLibsQuiz.java diff --git a/src/org/teachingkidsprogramming/recipes/completed/AdLibsRtf.java b/src/main/java/org/teachingkidsprogramming/recipes/completed/AdLibsRtf.java similarity index 90% rename from src/org/teachingkidsprogramming/recipes/completed/AdLibsRtf.java rename to src/main/java/org/teachingkidsprogramming/recipes/completed/AdLibsRtf.java index 863d335..a9d8199 100644 --- a/src/org/teachingkidsprogramming/recipes/completed/AdLibsRtf.java +++ b/src/main/java/org/teachingkidsprogramming/recipes/completed/AdLibsRtf.java @@ -18,7 +18,7 @@ public static void main(String[] args) word.adverb = MessageBox.askForTextInput("What is the adverb?"); word.edVerb = MessageBox.askForTextInput("What is the -ed verb?"); word.bodyPart = MessageBox.askForTextInput("What is the body part?"); - String currentStory = Parser.parseRtfFile("view.rtf", word); + String currentStory = Parser.parseRtfFile("documents/view.rtf", word); Viewer.displayRtfFile(currentStory); } } \ No newline at end of file diff --git a/src/org/teachingkidsprogramming/recipes/completed/BackgroundPhoto.java b/src/main/java/org/teachingkidsprogramming/recipes/completed/BackgroundPhoto.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/completed/BackgroundPhoto.java rename to src/main/java/org/teachingkidsprogramming/recipes/completed/BackgroundPhoto.java diff --git a/src/org/teachingkidsprogramming/recipes/completed/ChooseYourOwnAdventure.java b/src/main/java/org/teachingkidsprogramming/recipes/completed/ChooseYourOwnAdventure.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/completed/ChooseYourOwnAdventure.java rename to src/main/java/org/teachingkidsprogramming/recipes/completed/ChooseYourOwnAdventure.java diff --git a/src/org/teachingkidsprogramming/recipes/completed/ConnectTheDots.java b/src/main/java/org/teachingkidsprogramming/recipes/completed/ConnectTheDots.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/completed/ConnectTheDots.java rename to src/main/java/org/teachingkidsprogramming/recipes/completed/ConnectTheDots.java diff --git a/src/org/teachingkidsprogramming/recipes/completed/DigiFlower.java b/src/main/java/org/teachingkidsprogramming/recipes/completed/DigiFlower.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/completed/DigiFlower.java rename to src/main/java/org/teachingkidsprogramming/recipes/completed/DigiFlower.java diff --git a/src/org/teachingkidsprogramming/recipes/completed/FizzBuzz.java b/src/main/java/org/teachingkidsprogramming/recipes/completed/FizzBuzz.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/completed/FizzBuzz.java rename to src/main/java/org/teachingkidsprogramming/recipes/completed/FizzBuzz.java diff --git a/src/org/teachingkidsprogramming/recipes/completed/FizzBuzzTDD.java b/src/main/java/org/teachingkidsprogramming/recipes/completed/FizzBuzzTDD.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/completed/FizzBuzzTDD.java rename to src/main/java/org/teachingkidsprogramming/recipes/completed/FizzBuzzTDD.java diff --git a/src/org/teachingkidsprogramming/recipes/completed/FourSquare.java b/src/main/java/org/teachingkidsprogramming/recipes/completed/FourSquare.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/completed/FourSquare.java rename to src/main/java/org/teachingkidsprogramming/recipes/completed/FourSquare.java diff --git a/src/org/teachingkidsprogramming/recipes/completed/HiLow.java b/src/main/java/org/teachingkidsprogramming/recipes/completed/HiLow.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/completed/HiLow.java rename to src/main/java/org/teachingkidsprogramming/recipes/completed/HiLow.java diff --git a/src/org/teachingkidsprogramming/recipes/completed/Houses.java b/src/main/java/org/teachingkidsprogramming/recipes/completed/Houses.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/completed/Houses.java rename to src/main/java/org/teachingkidsprogramming/recipes/completed/Houses.java diff --git a/src/org/teachingkidsprogramming/recipes/completed/KnottedRing.java b/src/main/java/org/teachingkidsprogramming/recipes/completed/KnottedRing.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/completed/KnottedRing.java rename to src/main/java/org/teachingkidsprogramming/recipes/completed/KnottedRing.java diff --git a/src/org/teachingkidsprogramming/recipes/completed/ManyAnimals.java b/src/main/java/org/teachingkidsprogramming/recipes/completed/ManyAnimals.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/completed/ManyAnimals.java rename to src/main/java/org/teachingkidsprogramming/recipes/completed/ManyAnimals.java diff --git a/src/org/teachingkidsprogramming/recipes/completed/PentagonCrazy.java b/src/main/java/org/teachingkidsprogramming/recipes/completed/PentagonCrazy.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/completed/PentagonCrazy.java rename to src/main/java/org/teachingkidsprogramming/recipes/completed/PentagonCrazy.java diff --git a/src/org/teachingkidsprogramming/recipes/completed/SimpleBubble.java b/src/main/java/org/teachingkidsprogramming/recipes/completed/SimpleBubble.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/completed/SimpleBubble.java rename to src/main/java/org/teachingkidsprogramming/recipes/completed/SimpleBubble.java diff --git a/src/org/teachingkidsprogramming/recipes/completed/SimpleBubbleQuiz.java b/src/main/java/org/teachingkidsprogramming/recipes/completed/SimpleBubbleQuiz.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/completed/SimpleBubbleQuiz.java rename to src/main/java/org/teachingkidsprogramming/recipes/completed/SimpleBubbleQuiz.java diff --git a/src/org/teachingkidsprogramming/recipes/completed/SimpleSquare.java b/src/main/java/org/teachingkidsprogramming/recipes/completed/SimpleSquare.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/completed/SimpleSquare.java rename to src/main/java/org/teachingkidsprogramming/recipes/completed/SimpleSquare.java diff --git a/src/org/teachingkidsprogramming/recipes/completed/SmallBasicHolidayCard.java b/src/main/java/org/teachingkidsprogramming/recipes/completed/SmallBasicHolidayCard.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/completed/SmallBasicHolidayCard.java rename to src/main/java/org/teachingkidsprogramming/recipes/completed/SmallBasicHolidayCard.java diff --git a/src/org/teachingkidsprogramming/recipes/completed/SmallBasicTicTacToe.java b/src/main/java/org/teachingkidsprogramming/recipes/completed/SmallBasicTicTacToe.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/completed/SmallBasicTicTacToe.java rename to src/main/java/org/teachingkidsprogramming/recipes/completed/SmallBasicTicTacToe.java diff --git a/src/org/teachingkidsprogramming/recipes/completed/SpiderWeb.java b/src/main/java/org/teachingkidsprogramming/recipes/completed/SpiderWeb.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/completed/SpiderWeb.java rename to src/main/java/org/teachingkidsprogramming/recipes/completed/SpiderWeb.java diff --git a/src/org/teachingkidsprogramming/recipes/completed/Spiral.java b/src/main/java/org/teachingkidsprogramming/recipes/completed/Spiral.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/completed/Spiral.java rename to src/main/java/org/teachingkidsprogramming/recipes/completed/Spiral.java diff --git a/src/org/teachingkidsprogramming/recipes/completed/TriangleShell.java b/src/main/java/org/teachingkidsprogramming/recipes/completed/TriangleShell.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/completed/TriangleShell.java rename to src/main/java/org/teachingkidsprogramming/recipes/completed/TriangleShell.java diff --git a/src/org/teachingkidsprogramming/recipes/completed/TurtleTree.java b/src/main/java/org/teachingkidsprogramming/recipes/completed/TurtleTree.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/completed/TurtleTree.java rename to src/main/java/org/teachingkidsprogramming/recipes/completed/TurtleTree.java diff --git a/src/org/teachingkidsprogramming/recipes/quizzes/graders/AdLibsQuizAdapter.java b/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/AdLibsQuizAdapter.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/quizzes/graders/AdLibsQuizAdapter.java rename to src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/AdLibsQuizAdapter.java diff --git a/src/org/teachingkidsprogramming/recipes/quizzes/graders/AdLibsQuizGrader.java b/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/AdLibsQuizGrader.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/quizzes/graders/AdLibsQuizGrader.java rename to src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/AdLibsQuizGrader.java diff --git a/src/org/teachingkidsprogramming/recipes/quizzes/graders/HiLowQuiz.java b/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/HiLowQuiz.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/quizzes/graders/HiLowQuiz.java rename to src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/HiLowQuiz.java diff --git a/src/org/teachingkidsprogramming/recipes/quizzes/graders/HiLowQuizGrader.java b/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/HiLowQuizGrader.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/quizzes/graders/HiLowQuizGrader.java rename to src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/HiLowQuizGrader.java diff --git a/src/org/teachingkidsprogramming/recipes/quizzes/graders/HousesQuizAdapter.java b/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/HousesQuizAdapter.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/quizzes/graders/HousesQuizAdapter.java rename to src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/HousesQuizAdapter.java diff --git a/src/org/teachingkidsprogramming/recipes/quizzes/graders/HousesQuizGrader.java b/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/HousesQuizGrader.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/quizzes/graders/HousesQuizGrader.java rename to src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/HousesQuizGrader.java diff --git a/src/org/teachingkidsprogramming/recipes/quizzes/graders/MessageBoxMock.java b/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/MessageBoxMock.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/quizzes/graders/MessageBoxMock.java rename to src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/MessageBoxMock.java diff --git a/src/org/teachingkidsprogramming/recipes/quizzes/graders/PentagonCrazyQuizGrader.java b/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/PentagonCrazyQuizGrader.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/quizzes/graders/PentagonCrazyQuizGrader.java rename to src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/PentagonCrazyQuizGrader.java diff --git a/src/org/teachingkidsprogramming/recipes/quizzes/graders/PentagonQuizAdapter.java b/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/PentagonQuizAdapter.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/quizzes/graders/PentagonQuizAdapter.java rename to src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/PentagonQuizAdapter.java diff --git a/src/org/teachingkidsprogramming/recipes/quizzes/graders/QuizBuzzAdapter.java b/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/QuizBuzzAdapter.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/quizzes/graders/QuizBuzzAdapter.java rename to src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/QuizBuzzAdapter.java diff --git a/src/org/teachingkidsprogramming/recipes/quizzes/graders/QuizBuzzGrader.java b/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/QuizBuzzGrader.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/quizzes/graders/QuizBuzzGrader.java rename to src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/QuizBuzzGrader.java diff --git a/src/org/teachingkidsprogramming/recipes/quizzes/graders/QuizUtils.java b/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/QuizUtils.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/quizzes/graders/QuizUtils.java rename to src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/QuizUtils.java diff --git a/src/org/teachingkidsprogramming/recipes/quizzes/graders/SimpleBubbleQuizAdapter.java b/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/SimpleBubbleQuizAdapter.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/quizzes/graders/SimpleBubbleQuizAdapter.java rename to src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/SimpleBubbleQuizAdapter.java diff --git a/src/org/teachingkidsprogramming/recipes/quizzes/graders/SimpleBubbleQuizGrader.java b/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/SimpleBubbleQuizGrader.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/quizzes/graders/SimpleBubbleQuizGrader.java rename to src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/SimpleBubbleQuizGrader.java diff --git a/src/org/teachingkidsprogramming/recipes/quizzes/graders/SimpleSquareQuizGrader.java b/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/SimpleSquareQuizGrader.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/quizzes/graders/SimpleSquareQuizGrader.java rename to src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/SimpleSquareQuizGrader.java diff --git a/src/org/teachingkidsprogramming/recipes/quizzes/graders/SpiderQuiz.java b/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/SpiderQuiz.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/quizzes/graders/SpiderQuiz.java rename to src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/SpiderQuiz.java diff --git a/src/org/teachingkidsprogramming/recipes/quizzes/graders/SpiderWebQuizGrader.java b/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/SpiderWebQuizGrader.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/quizzes/graders/SpiderWebQuizGrader.java rename to src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/SpiderWebQuizGrader.java diff --git a/src/org/teachingkidsprogramming/recipes/quizzes/graders/SquareQuiz.java b/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/SquareQuiz.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/quizzes/graders/SquareQuiz.java rename to src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/SquareQuiz.java diff --git a/src/org/teachingkidsprogramming/recipes/quizzes/graders/TreeQuizAdapter.java b/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/TreeQuizAdapter.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/quizzes/graders/TreeQuizAdapter.java rename to src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/TreeQuizAdapter.java diff --git a/src/org/teachingkidsprogramming/recipes/quizzes/graders/TreeQuizGrader.java b/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/TreeQuizGrader.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/quizzes/graders/TreeQuizGrader.java rename to src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/TreeQuizGrader.java diff --git a/src/org/teachingkidsprogramming/section01forloops/DeepDive01ForLoops.java b/src/main/java/org/teachingkidsprogramming/section01forloops/DeepDive01ForLoops.java similarity index 100% rename from src/org/teachingkidsprogramming/section01forloops/DeepDive01ForLoops.java rename to src/main/java/org/teachingkidsprogramming/section01forloops/DeepDive01ForLoops.java diff --git a/src/org/teachingkidsprogramming/section01forloops/SimpleSquare.java b/src/main/java/org/teachingkidsprogramming/section01forloops/SimpleSquare.java similarity index 100% rename from src/org/teachingkidsprogramming/section01forloops/SimpleSquare.java rename to src/main/java/org/teachingkidsprogramming/section01forloops/SimpleSquare.java diff --git a/src/org/teachingkidsprogramming/section01forloops/SimpleSquareQuiz.java b/src/main/java/org/teachingkidsprogramming/section01forloops/SimpleSquareQuiz.java similarity index 100% rename from src/org/teachingkidsprogramming/section01forloops/SimpleSquareQuiz.java rename to src/main/java/org/teachingkidsprogramming/section01forloops/SimpleSquareQuiz.java diff --git a/src/org/teachingkidsprogramming/section01forloops/Spiral.java b/src/main/java/org/teachingkidsprogramming/section01forloops/Spiral.java similarity index 100% rename from src/org/teachingkidsprogramming/section01forloops/Spiral.java rename to src/main/java/org/teachingkidsprogramming/section01forloops/Spiral.java diff --git a/src/org/teachingkidsprogramming/section02methods/DeepDive02Variables.java b/src/main/java/org/teachingkidsprogramming/section02methods/DeepDive02Variables.java similarity index 100% rename from src/org/teachingkidsprogramming/section02methods/DeepDive02Variables.java rename to src/main/java/org/teachingkidsprogramming/section02methods/DeepDive02Variables.java diff --git a/src/org/teachingkidsprogramming/section02methods/FourSquare.java b/src/main/java/org/teachingkidsprogramming/section02methods/FourSquare.java similarity index 100% rename from src/org/teachingkidsprogramming/section02methods/FourSquare.java rename to src/main/java/org/teachingkidsprogramming/section02methods/FourSquare.java diff --git a/src/org/teachingkidsprogramming/section02methods/Houses.java b/src/main/java/org/teachingkidsprogramming/section02methods/Houses.java similarity index 100% rename from src/org/teachingkidsprogramming/section02methods/Houses.java rename to src/main/java/org/teachingkidsprogramming/section02methods/Houses.java diff --git a/src/org/teachingkidsprogramming/section02methods/HousesQuiz.java b/src/main/java/org/teachingkidsprogramming/section02methods/HousesQuiz.java similarity index 100% rename from src/org/teachingkidsprogramming/section02methods/HousesQuiz.java rename to src/main/java/org/teachingkidsprogramming/section02methods/HousesQuiz.java diff --git a/src/org/teachingkidsprogramming/section02methods/TriangleShell.java b/src/main/java/org/teachingkidsprogramming/section02methods/TriangleShell.java similarity index 100% rename from src/org/teachingkidsprogramming/section02methods/TriangleShell.java rename to src/main/java/org/teachingkidsprogramming/section02methods/TriangleShell.java diff --git a/src/org/teachingkidsprogramming/section03ifs/ChooseYourOwnAdventure.java b/src/main/java/org/teachingkidsprogramming/section03ifs/ChooseYourOwnAdventure.java similarity index 100% rename from src/org/teachingkidsprogramming/section03ifs/ChooseYourOwnAdventure.java rename to src/main/java/org/teachingkidsprogramming/section03ifs/ChooseYourOwnAdventure.java diff --git a/src/org/teachingkidsprogramming/section03ifs/DeepDive03Ifs.java b/src/main/java/org/teachingkidsprogramming/section03ifs/DeepDive03Ifs.java similarity index 100% rename from src/org/teachingkidsprogramming/section03ifs/DeepDive03Ifs.java rename to src/main/java/org/teachingkidsprogramming/section03ifs/DeepDive03Ifs.java diff --git a/src/org/teachingkidsprogramming/section03ifs/HiLow.java b/src/main/java/org/teachingkidsprogramming/section03ifs/HiLow.java similarity index 100% rename from src/org/teachingkidsprogramming/section03ifs/HiLow.java rename to src/main/java/org/teachingkidsprogramming/section03ifs/HiLow.java diff --git a/src/org/teachingkidsprogramming/section03ifs/HiLowQuiz.java b/src/main/java/org/teachingkidsprogramming/section03ifs/HiLowQuiz.java similarity index 100% rename from src/org/teachingkidsprogramming/section03ifs/HiLowQuiz.java rename to src/main/java/org/teachingkidsprogramming/section03ifs/HiLowQuiz.java diff --git a/src/org/teachingkidsprogramming/section04mastery/BackgroundPhoto.java b/src/main/java/org/teachingkidsprogramming/section04mastery/BackgroundPhoto.java similarity index 100% rename from src/org/teachingkidsprogramming/section04mastery/BackgroundPhoto.java rename to src/main/java/org/teachingkidsprogramming/section04mastery/BackgroundPhoto.java diff --git a/src/org/teachingkidsprogramming/section04mastery/DeepDive04Mastery.java b/src/main/java/org/teachingkidsprogramming/section04mastery/DeepDive04Mastery.java similarity index 100% rename from src/org/teachingkidsprogramming/section04mastery/DeepDive04Mastery.java rename to src/main/java/org/teachingkidsprogramming/section04mastery/DeepDive04Mastery.java diff --git a/src/org/teachingkidsprogramming/section04mastery/DigiFlower.java b/src/main/java/org/teachingkidsprogramming/section04mastery/DigiFlower.java similarity index 100% rename from src/org/teachingkidsprogramming/section04mastery/DigiFlower.java rename to src/main/java/org/teachingkidsprogramming/section04mastery/DigiFlower.java diff --git a/src/org/teachingkidsprogramming/section04mastery/KnottedRing.java b/src/main/java/org/teachingkidsprogramming/section04mastery/KnottedRing.java similarity index 100% rename from src/org/teachingkidsprogramming/section04mastery/KnottedRing.java rename to src/main/java/org/teachingkidsprogramming/section04mastery/KnottedRing.java diff --git a/src/org/teachingkidsprogramming/section04mastery/PentagonCrazy.java b/src/main/java/org/teachingkidsprogramming/section04mastery/PentagonCrazy.java similarity index 100% rename from src/org/teachingkidsprogramming/section04mastery/PentagonCrazy.java rename to src/main/java/org/teachingkidsprogramming/section04mastery/PentagonCrazy.java diff --git a/src/org/teachingkidsprogramming/section04mastery/PentagonCrazyQuiz.java b/src/main/java/org/teachingkidsprogramming/section04mastery/PentagonCrazyQuiz.java similarity index 100% rename from src/org/teachingkidsprogramming/section04mastery/PentagonCrazyQuiz.java rename to src/main/java/org/teachingkidsprogramming/section04mastery/PentagonCrazyQuiz.java diff --git a/src/org/teachingkidsprogramming/section05recursion/DeepDive05Recursion.java b/src/main/java/org/teachingkidsprogramming/section05recursion/DeepDive05Recursion.java similarity index 100% rename from src/org/teachingkidsprogramming/section05recursion/DeepDive05Recursion.java rename to src/main/java/org/teachingkidsprogramming/section05recursion/DeepDive05Recursion.java diff --git a/src/org/teachingkidsprogramming/section05recursion/SpiderWeb.java b/src/main/java/org/teachingkidsprogramming/section05recursion/SpiderWeb.java similarity index 100% rename from src/org/teachingkidsprogramming/section05recursion/SpiderWeb.java rename to src/main/java/org/teachingkidsprogramming/section05recursion/SpiderWeb.java diff --git a/src/org/teachingkidsprogramming/section05recursion/SpiderWebQuiz.java b/src/main/java/org/teachingkidsprogramming/section05recursion/SpiderWebQuiz.java similarity index 100% rename from src/org/teachingkidsprogramming/section05recursion/SpiderWebQuiz.java rename to src/main/java/org/teachingkidsprogramming/section05recursion/SpiderWebQuiz.java diff --git a/src/org/teachingkidsprogramming/section05recursion/TreeQuiz.java b/src/main/java/org/teachingkidsprogramming/section05recursion/TreeQuiz.java similarity index 100% rename from src/org/teachingkidsprogramming/section05recursion/TreeQuiz.java rename to src/main/java/org/teachingkidsprogramming/section05recursion/TreeQuiz.java diff --git a/src/org/teachingkidsprogramming/section05recursion/TurtleTree.java b/src/main/java/org/teachingkidsprogramming/section05recursion/TurtleTree.java similarity index 100% rename from src/org/teachingkidsprogramming/section05recursion/TurtleTree.java rename to src/main/java/org/teachingkidsprogramming/section05recursion/TurtleTree.java diff --git a/src/org/teachingkidsprogramming/section06modelviewcontroller/AdLibs.java b/src/main/java/org/teachingkidsprogramming/section06modelviewcontroller/AdLibs.java similarity index 100% rename from src/org/teachingkidsprogramming/section06modelviewcontroller/AdLibs.java rename to src/main/java/org/teachingkidsprogramming/section06modelviewcontroller/AdLibs.java diff --git a/src/org/teachingkidsprogramming/section06modelviewcontroller/AdLibsQuiz.java b/src/main/java/org/teachingkidsprogramming/section06modelviewcontroller/AdLibsQuiz.java similarity index 100% rename from src/org/teachingkidsprogramming/section06modelviewcontroller/AdLibsQuiz.java rename to src/main/java/org/teachingkidsprogramming/section06modelviewcontroller/AdLibsQuiz.java diff --git a/src/org/teachingkidsprogramming/section06modelviewcontroller/DeepDive06ModelViewController.java b/src/main/java/org/teachingkidsprogramming/section06modelviewcontroller/DeepDive06ModelViewController.java similarity index 100% rename from src/org/teachingkidsprogramming/section06modelviewcontroller/DeepDive06ModelViewController.java rename to src/main/java/org/teachingkidsprogramming/section06modelviewcontroller/DeepDive06ModelViewController.java diff --git a/src/org/teachingkidsprogramming/section07events/ConnectTheDots.java b/src/main/java/org/teachingkidsprogramming/section07events/ConnectTheDots.java similarity index 100% rename from src/org/teachingkidsprogramming/section07events/ConnectTheDots.java rename to src/main/java/org/teachingkidsprogramming/section07events/ConnectTheDots.java diff --git a/src/org/teachingkidsprogramming/section07events/DeepDive07Events.java b/src/main/java/org/teachingkidsprogramming/section07events/DeepDive07Events.java similarity index 100% rename from src/org/teachingkidsprogramming/section07events/DeepDive07Events.java rename to src/main/java/org/teachingkidsprogramming/section07events/DeepDive07Events.java diff --git a/src/org/teachingkidsprogramming/section07events/ManyAnimals.java b/src/main/java/org/teachingkidsprogramming/section07events/ManyAnimals.java similarity index 100% rename from src/org/teachingkidsprogramming/section07events/ManyAnimals.java rename to src/main/java/org/teachingkidsprogramming/section07events/ManyAnimals.java diff --git a/src/org/teachingkidsprogramming/section07events/SimpleBubble.java b/src/main/java/org/teachingkidsprogramming/section07events/SimpleBubble.java similarity index 100% rename from src/org/teachingkidsprogramming/section07events/SimpleBubble.java rename to src/main/java/org/teachingkidsprogramming/section07events/SimpleBubble.java diff --git a/src/org/teachingkidsprogramming/section07events/SimpleBubbleQuiz.java b/src/main/java/org/teachingkidsprogramming/section07events/SimpleBubbleQuiz.java similarity index 100% rename from src/org/teachingkidsprogramming/section07events/SimpleBubbleQuiz.java rename to src/main/java/org/teachingkidsprogramming/section07events/SimpleBubbleQuiz.java diff --git a/src/org/teachingkidsprogramming/section08tdd/DeepDive08TDD.java b/src/main/java/org/teachingkidsprogramming/section08tdd/DeepDive08TDD.java similarity index 100% rename from src/org/teachingkidsprogramming/section08tdd/DeepDive08TDD.java rename to src/main/java/org/teachingkidsprogramming/section08tdd/DeepDive08TDD.java diff --git a/src/org/teachingkidsprogramming/section08tdd/FizzBuzz.java b/src/main/java/org/teachingkidsprogramming/section08tdd/FizzBuzz.java similarity index 100% rename from src/org/teachingkidsprogramming/section08tdd/FizzBuzz.java rename to src/main/java/org/teachingkidsprogramming/section08tdd/FizzBuzz.java diff --git a/src/org/teachingkidsprogramming/section08tdd/FizzBuzzTDD.java b/src/main/java/org/teachingkidsprogramming/section08tdd/FizzBuzzTDD.java similarity index 100% rename from src/org/teachingkidsprogramming/section08tdd/FizzBuzzTDD.java rename to src/main/java/org/teachingkidsprogramming/section08tdd/FizzBuzzTDD.java diff --git a/src/org/teachingkidsprogramming/section08tdd/QuizBuzz.java b/src/main/java/org/teachingkidsprogramming/section08tdd/QuizBuzz.java similarity index 100% rename from src/org/teachingkidsprogramming/section08tdd/QuizBuzz.java rename to src/main/java/org/teachingkidsprogramming/section08tdd/QuizBuzz.java diff --git a/src/org/teachingkidsprogramming/section09exceptions/DeepDive09exceptions.java b/src/main/java/org/teachingkidsprogramming/section09exceptions/DeepDive09exceptions.java similarity index 100% rename from src/org/teachingkidsprogramming/section09exceptions/DeepDive09exceptions.java rename to src/main/java/org/teachingkidsprogramming/section09exceptions/DeepDive09exceptions.java diff --git a/src/you/need/to/fill/in/the/______.java b/src/main/java/you/need/to/fill/in/the/______.java similarity index 100% rename from src/you/need/to/fill/in/the/______.java rename to src/main/java/you/need/to/fill/in/the/______.java diff --git a/src/org/teachingkidsprogramming/section01forloops/PrintThis/0_Keyboard-Shortcuts.docx b/src/main/resources/documents/0_Keyboard-Shortcuts.docx similarity index 100% rename from src/org/teachingkidsprogramming/section01forloops/PrintThis/0_Keyboard-Shortcuts.docx rename to src/main/resources/documents/0_Keyboard-Shortcuts.docx diff --git a/src/org/teachingkidsprogramming/section01forloops/PrintThis/1_SimpleSquareWorksheet.docx b/src/main/resources/documents/1_SimpleSquareWorksheet.docx similarity index 100% rename from src/org/teachingkidsprogramming/section01forloops/PrintThis/1_SimpleSquareWorksheet.docx rename to src/main/resources/documents/1_SimpleSquareWorksheet.docx diff --git a/src/org/teachingkidsprogramming/section02methods/PrintThis/2_HousesWorksheet.docx b/src/main/resources/documents/2_HousesWorksheet.docx similarity index 100% rename from src/org/teachingkidsprogramming/section02methods/PrintThis/2_HousesWorksheet.docx rename to src/main/resources/documents/2_HousesWorksheet.docx diff --git a/src/org/teachingkidsprogramming/section03ifs/PrintThis/3_HiLowWorksheet.docx b/src/main/resources/documents/3_HiLowWorksheet.docx similarity index 100% rename from src/org/teachingkidsprogramming/section03ifs/PrintThis/3_HiLowWorksheet.docx rename to src/main/resources/documents/3_HiLowWorksheet.docx diff --git a/src/org/teachingkidsprogramming/section04mastery/PrintThis/4_PentagonCrazyWorksheet.docx b/src/main/resources/documents/4_PentagonCrazyWorksheet.docx similarity index 100% rename from src/org/teachingkidsprogramming/section04mastery/PrintThis/4_PentagonCrazyWorksheet.docx rename to src/main/resources/documents/4_PentagonCrazyWorksheet.docx diff --git a/src/org/teachingkidsprogramming/section05recursion/PrintThis/5_TurtleTreeWorksheet.docx b/src/main/resources/documents/5_TurtleTreeWorksheet.docx similarity index 100% rename from src/org/teachingkidsprogramming/section05recursion/PrintThis/5_TurtleTreeWorksheet.docx rename to src/main/resources/documents/5_TurtleTreeWorksheet.docx diff --git a/src/org/teachingkidsprogramming/section06modelviewcontroller/PrintThis/6_AdLibsWorksheet.docx b/src/main/resources/documents/6_AdLibsWorksheet.docx similarity index 100% rename from src/org/teachingkidsprogramming/section06modelviewcontroller/PrintThis/6_AdLibsWorksheet.docx rename to src/main/resources/documents/6_AdLibsWorksheet.docx diff --git a/src/org/teachingkidsprogramming/section07events/PrintThis/7_SimpleBubbleWorksheet.docx b/src/main/resources/documents/7_SimpleBubbleWorksheet.docx similarity index 100% rename from src/org/teachingkidsprogramming/section07events/PrintThis/7_SimpleBubbleWorksheet.docx rename to src/main/resources/documents/7_SimpleBubbleWorksheet.docx diff --git a/src/org/teachingkidsprogramming/section08tdd/PrintThis/8_FizzBuzzWorksheet.docx b/src/main/resources/documents/8_FizzBuzzWorksheet.docx similarity index 100% rename from src/org/teachingkidsprogramming/section08tdd/PrintThis/8_FizzBuzzWorksheet.docx rename to src/main/resources/documents/8_FizzBuzzWorksheet.docx diff --git a/src/org/teachingkidsprogramming/section02methods/PrintThis/Tortoise.pdf b/src/main/resources/documents/Tortoise.pdf similarity index 100% rename from src/org/teachingkidsprogramming/section02methods/PrintThis/Tortoise.pdf rename to src/main/resources/documents/Tortoise.pdf diff --git a/src/org/teachingkidsprogramming/recipes/completed/view.rtf b/src/main/resources/documents/view.rtf similarity index 100% rename from src/org/teachingkidsprogramming/recipes/completed/view.rtf rename to src/main/resources/documents/view.rtf diff --git a/src/org/teachingextensions/logo/ExplodedTurtle.png b/src/main/resources/images/ExplodedTurtle.png similarity index 100% rename from src/org/teachingextensions/logo/ExplodedTurtle.png rename to src/main/resources/images/ExplodedTurtle.png diff --git a/src/org/teachingextensions/logo/ExplodedTurtleOld.png b/src/main/resources/images/ExplodedTurtleOld.png similarity index 100% rename from src/org/teachingextensions/logo/ExplodedTurtleOld.png rename to src/main/resources/images/ExplodedTurtleOld.png diff --git a/src/org/teachingextensions/logo/Spider.png b/src/main/resources/images/Spider.png similarity index 100% rename from src/org/teachingextensions/logo/Spider.png rename to src/main/resources/images/Spider.png diff --git a/src/main/resources/images/Thumbs.db b/src/main/resources/images/Thumbs.db new file mode 100644 index 0000000000000000000000000000000000000000..d87c6f803e57e77131a60616f977462bea30e94a GIT binary patch literal 6656 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 WGf99qD=0ev4Paz&0Meq&ARYkv>2w1C diff --git a/src/org/teachingextensions/logo/Turtle/ExplodedTurtle.png b/src/org/teachingextensions/logo/Turtle/ExplodedTurtle.png deleted file mode 100644 index 0850d196682df0cbcd7b697f196275dd25405001..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 741 zcmVXVl0S)5t`C7Ml$a$c8qp6Vr09zXR%q+0DG??sQ4iIFy+x%M zL1Q_6I?|^jh>>Z_!JI(4M|~*IliF!`!*|yXX7P`M$vta0UN8MGYwP;`nU2 z$XqwU7XX)ml||s|Yhdi3U^&RBfTzHr++IN$zI&D6wn1>#)tC8l9n`lZ{-J|&n?f?F zzTX0um$Cs|@PUaNVA3_%7Ys6K7?g4|D*lx~DmsegHP&CN72RK-amKQEs-S>L&tozi zX0KuVk^Pl7z{h+A>cV3mzAXTC3ej3jr-M2Jhb61J+!qSz_esn8-PnkJL7OI6G?2L_ zf!#Kkmf!)upTT0Vyc=xZQ_8N5E_)oCy^26&qyi2j5zy}ktE%t`h5=5rOS$q+xo$R- zprh21sw~d?OeO|noC(`G^EjC@IXVhj7KmUFnJ0Eu#$D57N@*2>(~hHqpGj4T1C^Zq z;^VTh){*oUP~AmC1CCu1rbn`QMhN=ED1||hG9)BZa+cU1XJR16_PvF9bLRw2O*n?t z)>Wu%Q<7~c5MXP31ACPmAxa5qh8?!l6m#E>?QGk%Sr3-rU4EE80QPO4k0WyVcr>C* zzNp+6DLGHZU5C#_!iBOhyZnxla#&wh?Wpx5({I~4P+@0lnD;_9MF#mSGX#k zxiaRumBXU(L^Ig0vZ-KIwin>TK-TpE%hUuZ!HBGL9^8s%Nie7!O@n7Q1vG)u+#}gK zTU?G+M6`jOg%&#d&W3yuSxSGvWA4$)iE3RWN7%IYH(dhH8= zUWvWpMUk0ZZRZ_-cKmfK>+6w{(S0BXyzxKJm X^*3JorhQ5a00000NkvXXu0mjf|5I6A diff --git a/src/org/teachingextensions/logo/tests/ColorGeneration.java b/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.java similarity index 100% rename from src/org/teachingextensions/logo/tests/ColorGeneration.java rename to src/test/java/org/teachingextensions/logo/tests/ColorGeneration.java diff --git a/src/org/teachingextensions/logo/tests/ColorGeneration.testGeneration.approved.txt b/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.testGeneration.approved.txt similarity index 100% rename from src/org/teachingextensions/logo/tests/ColorGeneration.testGeneration.approved.txt rename to src/test/java/org/teachingextensions/logo/tests/ColorGeneration.testGeneration.approved.txt diff --git a/src/org/teachingextensions/logo/tests/ColorGeneration.testHtmlDisplay.approved.html b/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.testHtmlDisplay.approved.html similarity index 100% rename from src/org/teachingextensions/logo/tests/ColorGeneration.testHtmlDisplay.approved.html rename to src/test/java/org/teachingextensions/logo/tests/ColorGeneration.testHtmlDisplay.approved.html diff --git a/src/org/teachingextensions/logo/tests/ColorsTest.java b/src/test/java/org/teachingextensions/logo/tests/ColorsTest.java similarity index 100% rename from src/org/teachingextensions/logo/tests/ColorsTest.java rename to src/test/java/org/teachingextensions/logo/tests/ColorsTest.java diff --git a/src/org/teachingextensions/logo/tests/RecipeTests.java b/src/test/java/org/teachingextensions/logo/tests/RecipeTests.java similarity index 100% rename from src/org/teachingextensions/logo/tests/RecipeTests.java rename to src/test/java/org/teachingextensions/logo/tests/RecipeTests.java diff --git a/src/org/teachingextensions/logo/tests/RecipeTests.testCircle.approved.png b/src/test/java/org/teachingextensions/logo/tests/RecipeTests.testCircle.approved.png similarity index 100% rename from src/org/teachingextensions/logo/tests/RecipeTests.testCircle.approved.png rename to src/test/java/org/teachingextensions/logo/tests/RecipeTests.testCircle.approved.png diff --git a/src/org/teachingextensions/logo/tests/RecipeTests.testDigiGirlzFlower.approved.png b/src/test/java/org/teachingextensions/logo/tests/RecipeTests.testDigiGirlzFlower.approved.png similarity index 100% rename from src/org/teachingextensions/logo/tests/RecipeTests.testDigiGirlzFlower.approved.png rename to src/test/java/org/teachingextensions/logo/tests/RecipeTests.testDigiGirlzFlower.approved.png diff --git a/src/org/teachingextensions/logo/tests/RecipeTests.testFourSquare.approved.png b/src/test/java/org/teachingextensions/logo/tests/RecipeTests.testFourSquare.approved.png similarity index 100% rename from src/org/teachingextensions/logo/tests/RecipeTests.testFourSquare.approved.png rename to src/test/java/org/teachingextensions/logo/tests/RecipeTests.testFourSquare.approved.png diff --git a/src/org/teachingextensions/logo/tests/RecipeTests.testKnottedRing.approved.png b/src/test/java/org/teachingextensions/logo/tests/RecipeTests.testKnottedRing.approved.png similarity index 100% rename from src/org/teachingextensions/logo/tests/RecipeTests.testKnottedRing.approved.png rename to src/test/java/org/teachingextensions/logo/tests/RecipeTests.testKnottedRing.approved.png diff --git a/src/org/teachingextensions/logo/tests/RecipeTests.testSimpleSquare.approved.png b/src/test/java/org/teachingextensions/logo/tests/RecipeTests.testSimpleSquare.approved.png similarity index 100% rename from src/org/teachingextensions/logo/tests/RecipeTests.testSimpleSquare.approved.png rename to src/test/java/org/teachingextensions/logo/tests/RecipeTests.testSimpleSquare.approved.png diff --git a/src/org/teachingextensions/logo/tests/RecipeTests.testSpiral.approved.png b/src/test/java/org/teachingextensions/logo/tests/RecipeTests.testSpiral.approved.png similarity index 100% rename from src/org/teachingextensions/logo/tests/RecipeTests.testSpiral.approved.png rename to src/test/java/org/teachingextensions/logo/tests/RecipeTests.testSpiral.approved.png diff --git a/src/org/teachingextensions/logo/tests/RecipeTests.testTriangleShell.approved.png b/src/test/java/org/teachingextensions/logo/tests/RecipeTests.testTriangleShell.approved.png similarity index 100% rename from src/org/teachingextensions/logo/tests/RecipeTests.testTriangleShell.approved.png rename to src/test/java/org/teachingextensions/logo/tests/RecipeTests.testTriangleShell.approved.png diff --git a/src/org/teachingextensions/logo/tests/RecipeTests.testTurtleTree.approved.png b/src/test/java/org/teachingextensions/logo/tests/RecipeTests.testTurtleTree.approved.png similarity index 100% rename from src/org/teachingextensions/logo/tests/RecipeTests.testTurtleTree.approved.png rename to src/test/java/org/teachingextensions/logo/tests/RecipeTests.testTurtleTree.approved.png diff --git a/src/org/teachingextensions/logo/tests/TortoiseTest.java b/src/test/java/org/teachingextensions/logo/tests/TortoiseTest.java similarity index 100% rename from src/org/teachingextensions/logo/tests/TortoiseTest.java rename to src/test/java/org/teachingextensions/logo/tests/TortoiseTest.java diff --git a/src/org/teachingextensions/logo/tests/TortoiseTest.testBigWidth.approved.png b/src/test/java/org/teachingextensions/logo/tests/TortoiseTest.testBigWidth.approved.png similarity index 100% rename from src/org/teachingextensions/logo/tests/TortoiseTest.testBigWidth.approved.png rename to src/test/java/org/teachingextensions/logo/tests/TortoiseTest.testBigWidth.approved.png diff --git a/src/org/teachingextensions/logo/tests/TortoiseTest.testSimpleSquare.approved.png b/src/test/java/org/teachingextensions/logo/tests/TortoiseTest.testSimpleSquare.approved.png similarity index 100% rename from src/org/teachingextensions/logo/tests/TortoiseTest.testSimpleSquare.approved.png rename to src/test/java/org/teachingextensions/logo/tests/TortoiseTest.testSimpleSquare.approved.png diff --git a/src/org/teachingextensions/logo/tests/TurtlePanelTest.java b/src/test/java/org/teachingextensions/logo/tests/TurtlePanelTest.java similarity index 100% rename from src/org/teachingextensions/logo/tests/TurtlePanelTest.java rename to src/test/java/org/teachingextensions/logo/tests/TurtlePanelTest.java diff --git a/src/org/teachingextensions/logo/tests/TurtlePanelTest.testImageForBackground.approved.png b/src/test/java/org/teachingextensions/logo/tests/TurtlePanelTest.testImageForBackground.approved.png similarity index 100% rename from src/org/teachingextensions/logo/tests/TurtlePanelTest.testImageForBackground.approved.png rename to src/test/java/org/teachingextensions/logo/tests/TurtlePanelTest.testImageForBackground.approved.png diff --git a/src/org/teachingextensions/logo/tests/TurtleTest.java b/src/test/java/org/teachingextensions/logo/tests/TurtleTest.java similarity index 100% rename from src/org/teachingextensions/logo/tests/TurtleTest.java rename to src/test/java/org/teachingextensions/logo/tests/TurtleTest.java diff --git a/src/org/teachingextensions/logo/tests/TurtleTest.testDelta.approved.txt b/src/test/java/org/teachingextensions/logo/tests/TurtleTest.testDelta.approved.txt similarity index 100% rename from src/org/teachingextensions/logo/tests/TurtleTest.testDelta.approved.txt rename to src/test/java/org/teachingextensions/logo/tests/TurtleTest.testDelta.approved.txt diff --git a/src/org/teachingextensions/logo/tests/TurtleTest.testHide.approved.png b/src/test/java/org/teachingextensions/logo/tests/TurtleTest.testHide.approved.png similarity index 100% rename from src/org/teachingextensions/logo/tests/TurtleTest.testHide.approved.png rename to src/test/java/org/teachingextensions/logo/tests/TurtleTest.testHide.approved.png diff --git a/src/org/teachingextensions/logo/tests/TurtleTest.testMove.approved.png b/src/test/java/org/teachingextensions/logo/tests/TurtleTest.testMove.approved.png similarity index 100% rename from src/org/teachingextensions/logo/tests/TurtleTest.testMove.approved.png rename to src/test/java/org/teachingextensions/logo/tests/TurtleTest.testMove.approved.png diff --git a/src/org/teachingextensions/logo/tests/TurtleTest.testMove45DegreesLeft.approved.png b/src/test/java/org/teachingextensions/logo/tests/TurtleTest.testMove45DegreesLeft.approved.png similarity index 100% rename from src/org/teachingextensions/logo/tests/TurtleTest.testMove45DegreesLeft.approved.png rename to src/test/java/org/teachingextensions/logo/tests/TurtleTest.testMove45DegreesLeft.approved.png diff --git a/src/org/teachingextensions/logo/tests/TurtleTest.testPenDown.approved.png b/src/test/java/org/teachingextensions/logo/tests/TurtleTest.testPenDown.approved.png similarity index 100% rename from src/org/teachingextensions/logo/tests/TurtleTest.testPenDown.approved.png rename to src/test/java/org/teachingextensions/logo/tests/TurtleTest.testPenDown.approved.png diff --git a/src/org/teachingextensions/logo/tests/TurtleTest.testPentagonCrazy.approved.png b/src/test/java/org/teachingextensions/logo/tests/TurtleTest.testPentagonCrazy.approved.png similarity index 100% rename from src/org/teachingextensions/logo/tests/TurtleTest.testPentagonCrazy.approved.png rename to src/test/java/org/teachingextensions/logo/tests/TurtleTest.testPentagonCrazy.approved.png diff --git a/src/org/teachingextensions/logo/tests/TurtleTest.testRotate.approved.png b/src/test/java/org/teachingextensions/logo/tests/TurtleTest.testRotate.approved.png similarity index 100% rename from src/org/teachingextensions/logo/tests/TurtleTest.testRotate.approved.png rename to src/test/java/org/teachingextensions/logo/tests/TurtleTest.testRotate.approved.png diff --git a/src/org/teachingextensions/logo/tests/TurtleTest.testRotate45.approved.png b/src/test/java/org/teachingextensions/logo/tests/TurtleTest.testRotate45.approved.png similarity index 100% rename from src/org/teachingextensions/logo/tests/TurtleTest.testRotate45.approved.png rename to src/test/java/org/teachingextensions/logo/tests/TurtleTest.testRotate45.approved.png diff --git a/src/org/teachingextensions/logo/tests/TurtleTest.testRotate45CounterClockwise.approved.png b/src/test/java/org/teachingextensions/logo/tests/TurtleTest.testRotate45CounterClockwise.approved.png similarity index 100% rename from src/org/teachingextensions/logo/tests/TurtleTest.testRotate45CounterClockwise.approved.png rename to src/test/java/org/teachingextensions/logo/tests/TurtleTest.testRotate45CounterClockwise.approved.png diff --git a/src/org/teachingextensions/logo/tests/TurtleTest.testShow.approved.png b/src/test/java/org/teachingextensions/logo/tests/TurtleTest.testShow.approved.png similarity index 100% rename from src/org/teachingextensions/logo/tests/TurtleTest.testShow.approved.png rename to src/test/java/org/teachingextensions/logo/tests/TurtleTest.testShow.approved.png diff --git a/src/org/teachingextensions/logo/tests/TurtleTest.testSpeed.approved.txt b/src/test/java/org/teachingextensions/logo/tests/TurtleTest.testSpeed.approved.txt similarity index 100% rename from src/org/teachingextensions/logo/tests/TurtleTest.testSpeed.approved.txt rename to src/test/java/org/teachingextensions/logo/tests/TurtleTest.testSpeed.approved.txt diff --git a/src/org/teachingextensions/logo/tests/TurtleUtils.java b/src/test/java/org/teachingextensions/logo/tests/TurtleUtils.java similarity index 100% rename from src/org/teachingextensions/logo/tests/TurtleUtils.java rename to src/test/java/org/teachingextensions/logo/tests/TurtleUtils.java diff --git a/src/org/teachingextensions/logo/tests/VirtualProctorTest.java b/src/test/java/org/teachingextensions/logo/tests/VirtualProctorTest.java similarity index 100% rename from src/org/teachingextensions/logo/tests/VirtualProctorTest.java rename to src/test/java/org/teachingextensions/logo/tests/VirtualProctorTest.java diff --git a/src/org/teachingextensions/logo/tests/WheelTest.java b/src/test/java/org/teachingextensions/logo/tests/WheelTest.java similarity index 100% rename from src/org/teachingextensions/logo/tests/WheelTest.java rename to src/test/java/org/teachingextensions/logo/tests/WheelTest.java diff --git a/src/org/teachingextensions/logo/tests/WheelTest.testWheel.approved.txt b/src/test/java/org/teachingextensions/logo/tests/WheelTest.testWheel.approved.txt similarity index 100% rename from src/org/teachingextensions/logo/tests/WheelTest.testWheel.approved.txt rename to src/test/java/org/teachingextensions/logo/tests/WheelTest.testWheel.approved.txt diff --git a/src/org/teachingextensions/logo/tests/colors.cpp b/src/test/java/org/teachingextensions/logo/tests/colors.cpp similarity index 100% rename from src/org/teachingextensions/logo/tests/colors.cpp rename to src/test/java/org/teachingextensions/logo/tests/colors.cpp diff --git a/src/org/teachingextensions/logo/tests/colors.html b/src/test/java/org/teachingextensions/logo/tests/colors.html similarity index 100% rename from src/org/teachingextensions/logo/tests/colors.html rename to src/test/java/org/teachingextensions/logo/tests/colors.html diff --git a/src/org/teachingextensions/logo/tests/colors.java.template b/src/test/java/org/teachingextensions/logo/tests/colors.java.template similarity index 100% rename from src/org/teachingextensions/logo/tests/colors.java.template rename to src/test/java/org/teachingextensions/logo/tests/colors.java.template diff --git a/src/org/teachingextensions/logo/tests/colors.sorted.txt b/src/test/java/org/teachingextensions/logo/tests/colors.sorted.txt similarity index 100% rename from src/org/teachingextensions/logo/tests/colors.sorted.txt rename to src/test/java/org/teachingextensions/logo/tests/colors.sorted.txt diff --git a/src/org/teachingextensions/logo/tests/colors.txt b/src/test/java/org/teachingextensions/logo/tests/colors.txt similarity index 100% rename from src/org/teachingextensions/logo/tests/colors.txt rename to src/test/java/org/teachingextensions/logo/tests/colors.txt diff --git a/src/org/teachingextensions/logo/utils/tests/SoundsDemo.java b/src/test/java/org/teachingextensions/logo/utils/tests/SoundsDemo.java similarity index 100% rename from src/org/teachingextensions/logo/utils/tests/SoundsDemo.java rename to src/test/java/org/teachingextensions/logo/utils/tests/SoundsDemo.java diff --git a/src/org/teachingextensions/setup/tests/UnzipTest.java b/src/test/java/org/teachingextensions/setup/tests/UnzipTest.java similarity index 100% rename from src/org/teachingextensions/setup/tests/UnzipTest.java rename to src/test/java/org/teachingextensions/setup/tests/UnzipTest.java diff --git a/src/org/teachingextensions/simpleparser/tests/ParserTest.java b/src/test/java/org/teachingextensions/simpleparser/tests/ParserTest.java similarity index 100% rename from src/org/teachingextensions/simpleparser/tests/ParserTest.java rename to src/test/java/org/teachingextensions/simpleparser/tests/ParserTest.java diff --git a/src/org/teachingextensions/simpleparser/tests/ParserTest.testSimpleParse.approved.txt b/src/test/java/org/teachingextensions/simpleparser/tests/ParserTest.testSimpleParse.approved.txt similarity index 100% rename from src/org/teachingextensions/simpleparser/tests/ParserTest.testSimpleParse.approved.txt rename to src/test/java/org/teachingextensions/simpleparser/tests/ParserTest.testSimpleParse.approved.txt diff --git a/src/org/teachingextensions/windows/tests/GraphicsWindowTest.java b/src/test/java/org/teachingextensions/windows/tests/GraphicsWindowTest.java similarity index 100% rename from src/org/teachingextensions/windows/tests/GraphicsWindowTest.java rename to src/test/java/org/teachingextensions/windows/tests/GraphicsWindowTest.java diff --git a/src/org/teachingkidsprogramming/recipes/completed/FizzBuzzTDDTest.java b/src/test/java/org/teachingkidsprogramming/recipes/completed/FizzBuzzTDDTest.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/completed/FizzBuzzTDDTest.java rename to src/test/java/org/teachingkidsprogramming/recipes/completed/FizzBuzzTDDTest.java diff --git a/src/org/teachingkidsprogramming/recipes/deepdives/tests/DeepDive01Test.java b/src/test/java/org/teachingkidsprogramming/recipes/deepdives/tests/DeepDive01Test.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/deepdives/tests/DeepDive01Test.java rename to src/test/java/org/teachingkidsprogramming/recipes/deepdives/tests/DeepDive01Test.java diff --git a/src/org/teachingkidsprogramming/recipes/deepdives/tests/DeepDive02Test.java b/src/test/java/org/teachingkidsprogramming/recipes/deepdives/tests/DeepDive02Test.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/deepdives/tests/DeepDive02Test.java rename to src/test/java/org/teachingkidsprogramming/recipes/deepdives/tests/DeepDive02Test.java diff --git a/src/org/teachingkidsprogramming/recipes/deepdives/tests/DeepDive03Test.java b/src/test/java/org/teachingkidsprogramming/recipes/deepdives/tests/DeepDive03Test.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/deepdives/tests/DeepDive03Test.java rename to src/test/java/org/teachingkidsprogramming/recipes/deepdives/tests/DeepDive03Test.java diff --git a/src/org/teachingkidsprogramming/recipes/deepdives/tests/DeepDive04MasteryTest.java b/src/test/java/org/teachingkidsprogramming/recipes/deepdives/tests/DeepDive04MasteryTest.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/deepdives/tests/DeepDive04MasteryTest.java rename to src/test/java/org/teachingkidsprogramming/recipes/deepdives/tests/DeepDive04MasteryTest.java diff --git a/src/org/teachingkidsprogramming/recipes/deepdives/tests/DeepDive05RecursionTest.java b/src/test/java/org/teachingkidsprogramming/recipes/deepdives/tests/DeepDive05RecursionTest.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/deepdives/tests/DeepDive05RecursionTest.java rename to src/test/java/org/teachingkidsprogramming/recipes/deepdives/tests/DeepDive05RecursionTest.java diff --git a/src/org/teachingkidsprogramming/recipes/quizzes/tests/AdLibsQuizTest.java b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/AdLibsQuizTest.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/quizzes/tests/AdLibsQuizTest.java rename to src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/AdLibsQuizTest.java diff --git a/src/org/teachingkidsprogramming/recipes/quizzes/tests/AdLibsQuizTest.testCorrect.Windows_7.approved.png b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/AdLibsQuizTest.testCorrect.Windows_7.approved.png similarity index 100% rename from src/org/teachingkidsprogramming/recipes/quizzes/tests/AdLibsQuizTest.testCorrect.Windows_7.approved.png rename to src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/AdLibsQuizTest.testCorrect.Windows_7.approved.png diff --git a/src/org/teachingkidsprogramming/recipes/quizzes/tests/AdLibsQuizTest.testIncorrect.Windows_7.approved.png b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/AdLibsQuizTest.testIncorrect.Windows_7.approved.png similarity index 100% rename from src/org/teachingkidsprogramming/recipes/quizzes/tests/AdLibsQuizTest.testIncorrect.Windows_7.approved.png rename to src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/AdLibsQuizTest.testIncorrect.Windows_7.approved.png diff --git a/src/org/teachingkidsprogramming/recipes/quizzes/tests/HiLowQuizTest.java b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/HiLowQuizTest.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/quizzes/tests/HiLowQuizTest.java rename to src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/HiLowQuizTest.java diff --git a/src/org/teachingkidsprogramming/recipes/quizzes/tests/HiLowQuizTest.testCorrect.Windows_7.approved.png b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/HiLowQuizTest.testCorrect.Windows_7.approved.png similarity index 100% rename from src/org/teachingkidsprogramming/recipes/quizzes/tests/HiLowQuizTest.testCorrect.Windows_7.approved.png rename to src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/HiLowQuizTest.testCorrect.Windows_7.approved.png diff --git a/src/org/teachingkidsprogramming/recipes/quizzes/tests/HiLowQuizTest.testIncorrect.Windows_7.approved.png b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/HiLowQuizTest.testIncorrect.Windows_7.approved.png similarity index 100% rename from src/org/teachingkidsprogramming/recipes/quizzes/tests/HiLowQuizTest.testIncorrect.Windows_7.approved.png rename to src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/HiLowQuizTest.testIncorrect.Windows_7.approved.png diff --git a/src/org/teachingkidsprogramming/recipes/quizzes/tests/HousesQuizTest.java b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/HousesQuizTest.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/quizzes/tests/HousesQuizTest.java rename to src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/HousesQuizTest.java diff --git a/src/org/teachingkidsprogramming/recipes/quizzes/tests/HousesQuizTest.testCorrect.Mac_OS_X.approved.png b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/HousesQuizTest.testCorrect.Mac_OS_X.approved.png similarity index 100% rename from src/org/teachingkidsprogramming/recipes/quizzes/tests/HousesQuizTest.testCorrect.Mac_OS_X.approved.png rename to src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/HousesQuizTest.testCorrect.Mac_OS_X.approved.png diff --git a/src/org/teachingkidsprogramming/recipes/quizzes/tests/HousesQuizTest.testCorrect.Windows_7.approved.png b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/HousesQuizTest.testCorrect.Windows_7.approved.png similarity index 100% rename from src/org/teachingkidsprogramming/recipes/quizzes/tests/HousesQuizTest.testCorrect.Windows_7.approved.png rename to src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/HousesQuizTest.testCorrect.Windows_7.approved.png diff --git a/src/org/teachingkidsprogramming/recipes/quizzes/tests/HousesQuizTest.testIncorrect.Mac_OS_X.approved.png b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/HousesQuizTest.testIncorrect.Mac_OS_X.approved.png similarity index 100% rename from src/org/teachingkidsprogramming/recipes/quizzes/tests/HousesQuizTest.testIncorrect.Mac_OS_X.approved.png rename to src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/HousesQuizTest.testIncorrect.Mac_OS_X.approved.png diff --git a/src/org/teachingkidsprogramming/recipes/quizzes/tests/HousesQuizTest.testIncorrect.Windows_7.approved.png b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/HousesQuizTest.testIncorrect.Windows_7.approved.png similarity index 100% rename from src/org/teachingkidsprogramming/recipes/quizzes/tests/HousesQuizTest.testIncorrect.Windows_7.approved.png rename to src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/HousesQuizTest.testIncorrect.Windows_7.approved.png diff --git a/src/org/teachingkidsprogramming/recipes/quizzes/tests/PentagonCrazyQuizTest.java b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/PentagonCrazyQuizTest.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/quizzes/tests/PentagonCrazyQuizTest.java rename to src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/PentagonCrazyQuizTest.java diff --git a/src/org/teachingkidsprogramming/recipes/quizzes/tests/PentagonCrazyQuizTest.testCorrect.Mac_OS_X.approved.png b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/PentagonCrazyQuizTest.testCorrect.Mac_OS_X.approved.png similarity index 100% rename from src/org/teachingkidsprogramming/recipes/quizzes/tests/PentagonCrazyQuizTest.testCorrect.Mac_OS_X.approved.png rename to src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/PentagonCrazyQuizTest.testCorrect.Mac_OS_X.approved.png diff --git a/src/org/teachingkidsprogramming/recipes/quizzes/tests/PentagonCrazyQuizTest.testCorrect.Windows_7.approved.png b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/PentagonCrazyQuizTest.testCorrect.Windows_7.approved.png similarity index 100% rename from src/org/teachingkidsprogramming/recipes/quizzes/tests/PentagonCrazyQuizTest.testCorrect.Windows_7.approved.png rename to src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/PentagonCrazyQuizTest.testCorrect.Windows_7.approved.png diff --git a/src/org/teachingkidsprogramming/recipes/quizzes/tests/PentagonCrazyQuizTest.testIncorrect.Mac_OS_X.approved.png b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/PentagonCrazyQuizTest.testIncorrect.Mac_OS_X.approved.png similarity index 100% rename from src/org/teachingkidsprogramming/recipes/quizzes/tests/PentagonCrazyQuizTest.testIncorrect.Mac_OS_X.approved.png rename to src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/PentagonCrazyQuizTest.testIncorrect.Mac_OS_X.approved.png diff --git a/src/org/teachingkidsprogramming/recipes/quizzes/tests/PentagonCrazyQuizTest.testIncorrect.Windows_7.approved.png b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/PentagonCrazyQuizTest.testIncorrect.Windows_7.approved.png similarity index 100% rename from src/org/teachingkidsprogramming/recipes/quizzes/tests/PentagonCrazyQuizTest.testIncorrect.Windows_7.approved.png rename to src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/PentagonCrazyQuizTest.testIncorrect.Windows_7.approved.png diff --git a/src/org/teachingkidsprogramming/recipes/quizzes/tests/QuizBuzzTest.java b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/QuizBuzzTest.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/quizzes/tests/QuizBuzzTest.java rename to src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/QuizBuzzTest.java diff --git a/src/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleBubbleQuizTest.java b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleBubbleQuizTest.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleBubbleQuizTest.java rename to src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleBubbleQuizTest.java diff --git a/src/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleSquareQuizTest.java b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleSquareQuizTest.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleSquareQuizTest.java rename to src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleSquareQuizTest.java diff --git a/src/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleSquareQuizTest.testCorrect.Mac_OS_X.approved.png b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleSquareQuizTest.testCorrect.Mac_OS_X.approved.png similarity index 100% rename from src/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleSquareQuizTest.testCorrect.Mac_OS_X.approved.png rename to src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleSquareQuizTest.testCorrect.Mac_OS_X.approved.png diff --git a/src/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleSquareQuizTest.testCorrect.Windows_7.approved.png b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleSquareQuizTest.testCorrect.Windows_7.approved.png similarity index 100% rename from src/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleSquareQuizTest.testCorrect.Windows_7.approved.png rename to src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleSquareQuizTest.testCorrect.Windows_7.approved.png diff --git a/src/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleSquareQuizTest.testIncorrect.Mac_OS_X.approved.png b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleSquareQuizTest.testIncorrect.Mac_OS_X.approved.png similarity index 100% rename from src/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleSquareQuizTest.testIncorrect.Mac_OS_X.approved.png rename to src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleSquareQuizTest.testIncorrect.Mac_OS_X.approved.png diff --git a/src/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleSquareQuizTest.testIncorrect.Windows_7.approved.png b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleSquareQuizTest.testIncorrect.Windows_7.approved.png similarity index 100% rename from src/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleSquareQuizTest.testIncorrect.Windows_7.approved.png rename to src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleSquareQuizTest.testIncorrect.Windows_7.approved.png diff --git a/src/org/teachingkidsprogramming/recipes/quizzes/tests/SpiderWebQuizTest.java b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SpiderWebQuizTest.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/quizzes/tests/SpiderWebQuizTest.java rename to src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SpiderWebQuizTest.java diff --git a/src/org/teachingkidsprogramming/recipes/quizzes/tests/SpiderWebQuizTest.testCircle.Mac_OS_X.approved.png b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SpiderWebQuizTest.testCircle.Mac_OS_X.approved.png similarity index 100% rename from src/org/teachingkidsprogramming/recipes/quizzes/tests/SpiderWebQuizTest.testCircle.Mac_OS_X.approved.png rename to src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SpiderWebQuizTest.testCircle.Mac_OS_X.approved.png diff --git a/src/org/teachingkidsprogramming/recipes/quizzes/tests/SpiderWebQuizTest.testCircle.Windows_7.approved.png b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SpiderWebQuizTest.testCircle.Windows_7.approved.png similarity index 100% rename from src/org/teachingkidsprogramming/recipes/quizzes/tests/SpiderWebQuizTest.testCircle.Windows_7.approved.png rename to src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SpiderWebQuizTest.testCircle.Windows_7.approved.png diff --git a/src/org/teachingkidsprogramming/recipes/quizzes/tests/SpiderWebQuizTest.testCorrect.Mac_OS_X.approved.png b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SpiderWebQuizTest.testCorrect.Mac_OS_X.approved.png similarity index 100% rename from src/org/teachingkidsprogramming/recipes/quizzes/tests/SpiderWebQuizTest.testCorrect.Mac_OS_X.approved.png rename to src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SpiderWebQuizTest.testCorrect.Mac_OS_X.approved.png diff --git a/src/org/teachingkidsprogramming/recipes/quizzes/tests/SpiderWebQuizTest.testCorrect.Mac_OS_X.received.png b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SpiderWebQuizTest.testCorrect.Mac_OS_X.received.png similarity index 100% rename from src/org/teachingkidsprogramming/recipes/quizzes/tests/SpiderWebQuizTest.testCorrect.Mac_OS_X.received.png rename to src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SpiderWebQuizTest.testCorrect.Mac_OS_X.received.png diff --git a/src/org/teachingkidsprogramming/recipes/quizzes/tests/SpiderWebQuizTest.testCorrect.Windows_7.approved.png b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SpiderWebQuizTest.testCorrect.Windows_7.approved.png similarity index 100% rename from src/org/teachingkidsprogramming/recipes/quizzes/tests/SpiderWebQuizTest.testCorrect.Windows_7.approved.png rename to src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SpiderWebQuizTest.testCorrect.Windows_7.approved.png diff --git a/src/org/teachingkidsprogramming/recipes/quizzes/tests/SpiderWebQuizTest.testIncorrect.Mac_OS_X.approved.png b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SpiderWebQuizTest.testIncorrect.Mac_OS_X.approved.png similarity index 100% rename from src/org/teachingkidsprogramming/recipes/quizzes/tests/SpiderWebQuizTest.testIncorrect.Mac_OS_X.approved.png rename to src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SpiderWebQuizTest.testIncorrect.Mac_OS_X.approved.png diff --git a/src/org/teachingkidsprogramming/recipes/quizzes/tests/SpiderWebQuizTest.testIncorrect.Windows_7.approved.png b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SpiderWebQuizTest.testIncorrect.Windows_7.approved.png similarity index 100% rename from src/org/teachingkidsprogramming/recipes/quizzes/tests/SpiderWebQuizTest.testIncorrect.Windows_7.approved.png rename to src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SpiderWebQuizTest.testIncorrect.Windows_7.approved.png diff --git a/src/org/teachingkidsprogramming/recipes/quizzes/tests/TreeQuizTest.java b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/TreeQuizTest.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/quizzes/tests/TreeQuizTest.java rename to src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/TreeQuizTest.java diff --git a/src/org/teachingkidsprogramming/recipes/quizzes/tests/TreeQuizTest.testCorrect.Windows_7.approved.png b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/TreeQuizTest.testCorrect.Windows_7.approved.png similarity index 100% rename from src/org/teachingkidsprogramming/recipes/quizzes/tests/TreeQuizTest.testCorrect.Windows_7.approved.png rename to src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/TreeQuizTest.testCorrect.Windows_7.approved.png diff --git a/src/org/teachingkidsprogramming/recipes/quizzes/tests/TreeQuizTest.testIncorrect.Windows_7.approved.png b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/TreeQuizTest.testIncorrect.Windows_7.approved.png similarity index 100% rename from src/org/teachingkidsprogramming/recipes/quizzes/tests/TreeQuizTest.testIncorrect.Windows_7.approved.png rename to src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/TreeQuizTest.testIncorrect.Windows_7.approved.png diff --git a/src/test/resources/documents/ColorGeneration.testGeneration.approved.txt b/src/test/resources/documents/ColorGeneration.testGeneration.approved.txt new file mode 100644 index 0000000..48019ff --- /dev/null +++ b/src/test/resources/documents/ColorGeneration.testGeneration.approved.txt @@ -0,0 +1,859 @@ +package org.teachingextensions.logo; + +import java.awt.Color; + +import com.spun.util.NumberUtils; + +/** + * Every color under the + * rainbow, + * and different ways to get them. + */ + public class Colors +{ +public static class Blues + { + /** + * The color Navy + *
 
+ **/ + public static final Color Navy = Color.decode("#000080"); + /** + * The color DarkBlue + *
 
+ **/ + public static final Color DarkBlue = Color.decode("#00008B"); + /** + * The color MidnightBlue + *
 
+ **/ + public static final Color MidnightBlue = Color.decode("#191970"); + /** + * The color MediumBlue + *
 
+ **/ + public static final Color MediumBlue = Color.decode("#0000CD"); + /** + * The color Blue + *
 
+ **/ + public static final Color Blue = Color.decode("#0000FF"); + /** + * The color Teal + *
 
+ **/ + public static final Color Teal = Color.decode("#008080"); + /** + * The color DarkSlateBlue + *
 
+ **/ + public static final Color DarkSlateBlue = Color.decode("#483D8B"); + /** + * The color DarkCyan + *
 
+ **/ + public static final Color DarkCyan = Color.decode("#008B8B"); + /** + * The color SteelBlue + *
 
+ **/ + public static final Color SteelBlue = Color.decode("#4682B4"); + /** + * The color RoyalBlue + *
 
+ **/ + public static final Color RoyalBlue = Color.decode("#4169E1"); + /** + * The color SlateBlue + *
 
+ **/ + public static final Color SlateBlue = Color.decode("#6A5ACD"); + /** + * The color CadetBlue + *
 
+ **/ + public static final Color CadetBlue = Color.decode("#5F9EA0"); + /** + * The color DarkTurquoise + *
 
+ **/ + public static final Color DarkTurquoise = Color.decode("#00CED1"); + /** + * The color DodgerBlue + *
 
+ **/ + public static final Color DodgerBlue = Color.decode("#1E90FF"); + /** + * The color DeepSkyBlue + *
 
+ **/ + public static final Color DeepSkyBlue = Color.decode("#00BFFF"); + /** + * The color MediumSlateBlue + *
 
+ **/ + public static final Color MediumSlateBlue = Color.decode("#7B68EE"); + /** + * The color MediumTurquoise + *
 
+ **/ + public static final Color MediumTurquoise = Color.decode("#48D1CC"); + /** + * The color CornflowerBlue + *
 
+ **/ + public static final Color CornflowerBlue = Color.decode("#6495ED"); + /** + * The color Turquoise + *
 
+ **/ + public static final Color Turquoise = Color.decode("#40E0D0"); + /** + * The color Aqua + *
 
+ **/ + public static final Color Aqua = Color.decode("#00FFFF"); + /** + * The color Cyan + *
 
+ **/ + public static final Color Cyan = Color.decode("#00FFFF"); + /** + * The color SkyBlue + *
 
+ **/ + public static final Color SkyBlue = Color.decode("#87CEEB"); + /** + * The color LightSkyBlue + *
 
+ **/ + public static final Color LightSkyBlue = Color.decode("#87CEFA"); + /** + * The color Aquamarine + *
 
+ **/ + public static final Color Aquamarine = Color.decode("#7FFFD4"); + /** + * The color LightSteelBlue + *
 
+ **/ + public static final Color LightSteelBlue = Color.decode("#B0C4DE"); + /** + * The color LightBlue + *
 
+ **/ + public static final Color LightBlue = Color.decode("#ADD8E6"); + /** + * The color PowderBlue + *
 
+ **/ + public static final Color PowderBlue = Color.decode("#B0E0E6"); + /** + * The color PaleTurquoise + *
 
+ **/ + public static final Color PaleTurquoise = Color.decode("#AFEEEE"); + /** + * The color LightCyan + *
 
+ **/ + public static final Color LightCyan = Color.decode("#E0FFFF"); + /** + * The color AliceBlue + *
 
+ **/ + public static final Color AliceBlue = Color.decode("#F0F8FF"); + /** + * The color Azure + *
 
+ **/ + public static final Color Azure = Color.decode("#F0FFFF"); + } + public static class Browns + { + /** + * The color Maroon + *
 
+ **/ + public static final Color Maroon = Color.decode("#800000"); + /** + * The color SaddleBrown + *
 
+ **/ + public static final Color SaddleBrown = Color.decode("#8B4513"); + /** + * The color Brown + *
 
+ **/ + public static final Color Brown = Color.decode("#A52A2A"); + /** + * The color Sienna + *
 
+ **/ + public static final Color Sienna = Color.decode("#A0522D"); + /** + * The color DarkGoldenrod + *
 
+ **/ + public static final Color DarkGoldenrod = Color.decode("#B8860B"); + /** + * The color Chocolate + *
 
+ **/ + public static final Color Chocolate = Color.decode("#D2691E"); + /** + * The color Peru + *
 
+ **/ + public static final Color Peru = Color.decode("#CD853F"); + /** + * The color Goldenrod + *
 
+ **/ + public static final Color Goldenrod = Color.decode("#DAA520"); + /** + * The color RosyBrown + *
 
+ **/ + public static final Color RosyBrown = Color.decode("#BC8F8F"); + /** + * The color SandyBrown + *
 
+ **/ + public static final Color SandyBrown = Color.decode("#F4A460"); + /** + * The color Tan + *
 
+ **/ + public static final Color Tan = Color.decode("#D2B48C"); + /** + * The color BurlyWood + *
 
+ **/ + public static final Color BurlyWood = Color.decode("#DEB887"); + /** + * The color Wheat + *
 
+ **/ + public static final Color Wheat = Color.decode("#F5DEB3"); + /** + * The color NavajoWhite + *
 
+ **/ + public static final Color NavajoWhite = Color.decode("#FFDEAD"); + /** + * The color Bisque + *
 
+ **/ + public static final Color Bisque = Color.decode("#FFE4C4"); + /** + * The color BlanchedAlmond + *
 
+ **/ + public static final Color BlanchedAlmond = Color.decode("#FFEBCD"); + /** + * The color Cornsilk + *
 
+ **/ + public static final Color Cornsilk = Color.decode("#FFF8DC"); + } + public static class Grays + { + /** + * The color Black + *
 
+ **/ + public static final Color Black = Color.decode("#000000"); + /** + * The color DarkSlateGray + *
 
+ **/ + public static final Color DarkSlateGray = Color.decode("#2F4F4F"); + /** + * The color DimGray + *
 
+ **/ + public static final Color DimGray = Color.decode("#696969"); + /** + * The color Gray + *
 
+ **/ + public static final Color Gray = Color.decode("#808080"); + /** + * The color SlateGray + *
 
+ **/ + public static final Color SlateGray = Color.decode("#708090"); + /** + * The color LightSlateGray + *
 
+ **/ + public static final Color LightSlateGray = Color.decode("#778899"); + /** + * The color DarkGray + *
 
+ **/ + public static final Color DarkGray = Color.decode("#A9A9A9"); + /** + * The color Silver + *
 
+ **/ + public static final Color Silver = Color.decode("#C0C0C0"); + /** + * The color LightGray + *
 
+ **/ + public static final Color LightGray = Color.decode("#D3D3D3"); + /** + * The color Gainsboro + *
 
+ **/ + public static final Color Gainsboro = Color.decode("#DCDCDC"); + } + public static class Greens + { + /** + * The color DarkGreen + *
 
+ **/ + public static final Color DarkGreen = Color.decode("#006400"); + /** + * The color Green + *
 
+ **/ + public static final Color Green = Color.decode("#008000"); + /** + * The color ForestGreen + *
 
+ **/ + public static final Color ForestGreen = Color.decode("#228B22"); + /** + * The color DarkOliveGreen + *
 
+ **/ + public static final Color DarkOliveGreen = Color.decode("#556B2F"); + /** + * The color Lime + *
 
+ **/ + public static final Color Lime = Color.decode("#00FF00"); + /** + * The color Olive + *
 
+ **/ + public static final Color Olive = Color.decode("#808000"); + /** + * The color Teal + *
 
+ **/ + public static final Color Teal = Color.decode("#008080"); + /** + * The color SeaGreen + *
 
+ **/ + public static final Color SeaGreen = Color.decode("#2E8B57"); + /** + * The color DarkCyan + *
 
+ **/ + public static final Color DarkCyan = Color.decode("#008B8B"); + /** + * The color OliveDrab + *
 
+ **/ + public static final Color OliveDrab = Color.decode("#6B8E23"); + /** + * The color LimeGreen + *
 
+ **/ + public static final Color LimeGreen = Color.decode("#32CD32"); + /** + * The color MediumSeaGreen + *
 
+ **/ + public static final Color MediumSeaGreen = Color.decode("#3CB371"); + /** + * The color LawnGreen + *
 
+ **/ + public static final Color LawnGreen = Color.decode("#7CFC00"); + /** + * The color LightSeaGreen + *
 
+ **/ + public static final Color LightSeaGreen = Color.decode("#20B2AA"); + /** + * The color Chartreuse + *
 
+ **/ + public static final Color Chartreuse = Color.decode("#7FFF00"); + /** + * The color SpringGreen + *
 
+ **/ + public static final Color SpringGreen = Color.decode("#00FF7F"); + /** + * The color MediumSpringGreen + *
 
+ **/ + public static final Color MediumSpringGreen = Color.decode("#00FA9A"); + /** + * The color YellowGreen + *
 
+ **/ + public static final Color YellowGreen = Color.decode("#9ACD32"); + /** + * The color DarkTurquoise + *
 
+ **/ + public static final Color DarkTurquoise = Color.decode("#00CED1"); + /** + * The color DarkSeaGreen + *
 
+ **/ + public static final Color DarkSeaGreen = Color.decode("#8FBC8F"); + /** + * The color GreenYellow + *
 
+ **/ + public static final Color GreenYellow = Color.decode("#ADFF2F"); + /** + * The color MediumAquamarine + *
 
+ **/ + public static final Color MediumAquamarine = Color.decode("#66CDAA"); + /** + * The color MediumTurquoise + *
 
+ **/ + public static final Color MediumTurquoise = Color.decode("#48D1CC"); + /** + * The color Turquoise + *
 
+ **/ + public static final Color Turquoise = Color.decode("#40E0D0"); + /** + * The color LightGreen + *
 
+ **/ + public static final Color LightGreen = Color.decode("#90EE90"); + /** + * The color PaleGreen + *
 
+ **/ + public static final Color PaleGreen = Color.decode("#98FB98"); + /** + * The color Aquamarine + *
 
+ **/ + public static final Color Aquamarine = Color.decode("#7FFFD4"); + /** + * The color PaleTurquoise + *
 
+ **/ + public static final Color PaleTurquoise = Color.decode("#AFEEEE"); + } + public static class Oranges + { + /** + * The color OrangeRed + *
 
+ **/ + public static final Color OrangeRed = Color.decode("#FF4500"); + /** + * The color DarkOrange + *
 
+ **/ + public static final Color DarkOrange = Color.decode("#FF8C00"); + /** + * The color Orange + *
 
+ **/ + public static final Color Orange = Color.decode("#FFA500"); + /** + * The color Tomato + *
 
+ **/ + public static final Color Tomato = Color.decode("#FF6347"); + /** + * The color Coral + *
 
+ **/ + public static final Color Coral = Color.decode("#FF7F50"); + /** + * The color LightSalmon + *
 
+ **/ + public static final Color LightSalmon = Color.decode("#FFA07A"); + } + public static class Pinks + { + /** + * The color MediumVioletRed + *
 
+ **/ + public static final Color MediumVioletRed = Color.decode("#C71585"); + /** + * The color DeepPink + *
 
+ **/ + public static final Color DeepPink = Color.decode("#FF1493"); + /** + * The color PaleVioletRed + *
 
+ **/ + public static final Color PaleVioletRed = Color.decode("#DB7093"); + /** + * The color Fuchsia + *
 
+ **/ + public static final Color Fuchsia = Color.decode("#FF00FF"); + /** + * The color HotPink + *
 
+ **/ + public static final Color HotPink = Color.decode("#FF69B4"); + /** + * The color LightPink + *
 
+ **/ + public static final Color LightPink = Color.decode("#FFB6C1"); + /** + * The color Pink + *
 
+ **/ + public static final Color Pink = Color.decode("#FFC0CB"); + } + public static class Purples + { + /** + * The color Indigo + *
 
+ **/ + public static final Color Indigo = Color.decode("#4B0082"); + /** + * The color Purple + *
 
+ **/ + public static final Color Purple = Color.decode("#800080"); + /** + * The color DarkSlateBlue + *
 
+ **/ + public static final Color DarkSlateBlue = Color.decode("#483D8B"); + /** + * The color DarkMagenta + *
 
+ **/ + public static final Color DarkMagenta = Color.decode("#8B008B"); + /** + * The color MediumVioletRed + *
 
+ **/ + public static final Color MediumVioletRed = Color.decode("#C71585"); + /** + * The color DarkViolet + *
 
+ **/ + public static final Color DarkViolet = Color.decode("#9400D3"); + /** + * The color SlateBlue + *
 
+ **/ + public static final Color SlateBlue = Color.decode("#6A5ACD"); + /** + * The color BlueViolet + *
 
+ **/ + public static final Color BlueViolet = Color.decode("#8A2BE2"); + /** + * The color DarkOrchid + *
 
+ **/ + public static final Color DarkOrchid = Color.decode("#9932CC"); + /** + * The color MediumSlateBlue + *
 
+ **/ + public static final Color MediumSlateBlue = Color.decode("#7B68EE"); + /** + * The color RosyBrown + *
 
+ **/ + public static final Color RosyBrown = Color.decode("#BC8F8F"); + /** + * The color MediumPurple + *
 
+ **/ + public static final Color MediumPurple = Color.decode("#9370DB"); + /** + * The color PaleVioletRed + *
 
+ **/ + public static final Color PaleVioletRed = Color.decode("#DB7093"); + /** + * The color MediumOrchid + *
 
+ **/ + public static final Color MediumOrchid = Color.decode("#BA55D3"); + /** + * The color Fuchsia + *
 
+ **/ + public static final Color Fuchsia = Color.decode("#FF00FF"); + /** + * The color Magenta + *
 
+ **/ + public static final Color Magenta = Color.decode("#FF00FF"); + /** + * The color Orchid + *
 
+ **/ + public static final Color Orchid = Color.decode("#DA70D6"); + /** + * The color Plum + *
 
+ **/ + public static final Color Plum = Color.decode("#DDA0DD"); + /** + * The color Violet + *
 
+ **/ + public static final Color Violet = Color.decode("#EE82EE"); + /** + * The color Thistle + *
 
+ **/ + public static final Color Thistle = Color.decode("#D8BFD8"); + /** + * The color Lavender + *
 
+ **/ + public static final Color Lavender = Color.decode("#E6E6FA"); + } + public static class Reds + { + /** + * The color DarkRed + *
 
+ **/ + public static final Color DarkRed = Color.decode("#8B0000"); + /** + * The color FireBrick + *
 
+ **/ + public static final Color FireBrick = Color.decode("#B22222"); + /** + * The color Red + *
 
+ **/ + public static final Color Red = Color.decode("#FF0000"); + /** + * The color Crimson + *
 
+ **/ + public static final Color Crimson = Color.decode("#DC143C"); + /** + * The color OrangeRed + *
 
+ **/ + public static final Color OrangeRed = Color.decode("#FF4500"); + /** + * The color MediumVioletRed + *
 
+ **/ + public static final Color MediumVioletRed = Color.decode("#C71585"); + /** + * The color IndianRed + *
 
+ **/ + public static final Color IndianRed = Color.decode("#CD5C5C"); + /** + * The color Tomato + *
 
+ **/ + public static final Color Tomato = Color.decode("#FF6347"); + /** + * The color PaleVioletRed + *
 
+ **/ + public static final Color PaleVioletRed = Color.decode("#DB7093"); + /** + * The color Salmon + *
 
+ **/ + public static final Color Salmon = Color.decode("#FA8072"); + /** + * The color LightCoral + *
 
+ **/ + public static final Color LightCoral = Color.decode("#F08080"); + /** + * The color DarkSalmon + *
 
+ **/ + public static final Color DarkSalmon = Color.decode("#E9967A"); + /** + * The color LightSalmon + *
 
+ **/ + public static final Color LightSalmon = Color.decode("#FFA07A"); + } + public static class Whites + { + /** + * The color AntiqueWhite + *
 
+ **/ + public static final Color AntiqueWhite = Color.decode("#FAEBD7"); + /** + * The color MistyRose + *
 
+ **/ + public static final Color MistyRose = Color.decode("#FFE4E1"); + /** + * The color Beige + *
 
+ **/ + public static final Color Beige = Color.decode("#F5F5DC"); + /** + * The color Linen + *
 
+ **/ + public static final Color Linen = Color.decode("#FAF0E6"); + /** + * The color OldLace + *
 
+ **/ + public static final Color OldLace = Color.decode("#FDF5E6"); + /** + * The color Honeydew + *
 
+ **/ + public static final Color Honeydew = Color.decode("#F0FFF0"); + /** + * The color WhiteSmoke + *
 
+ **/ + public static final Color WhiteSmoke = Color.decode("#F5F5F5"); + /** + * The color Seashell + *
 
+ **/ + public static final Color Seashell = Color.decode("#FFF5EE"); + /** + * The color LavenderBlush + *
 
+ **/ + public static final Color LavenderBlush = Color.decode("#FFF0F5"); + /** + * The color AliceBlue + *
 
+ **/ + public static final Color AliceBlue = Color.decode("#F0F8FF"); + /** + * The color FloralWhite + *
 
+ **/ + public static final Color FloralWhite = Color.decode("#FFFAF0"); + /** + * The color MintCream + *
 
+ **/ + public static final Color MintCream = Color.decode("#F5FFFA"); + /** + * The color Azure + *
 
+ **/ + public static final Color Azure = Color.decode("#F0FFFF"); + /** + * The color Ivory + *
 
+ **/ + public static final Color Ivory = Color.decode("#FFFFF0"); + /** + * The color GhostWhite + *
 
+ **/ + public static final Color GhostWhite = Color.decode("#F8F8FF"); + /** + * The color Snow + *
 
+ **/ + public static final Color Snow = Color.decode("#FFFAFA"); + /** + * The color White + *
 
+ **/ + public static final Color White = Color.decode("#FFFFFF"); + } + public static class Yellows + { + /** + * The color DarkGoldenrod + *
 
+ **/ + public static final Color DarkGoldenrod = Color.decode("#B8860B"); + /** + * The color Goldenrod + *
 
+ **/ + public static final Color Goldenrod = Color.decode("#DAA520"); + /** + * The color Gold + *
 
+ **/ + public static final Color Gold = Color.decode("#FFD700"); + /** + * The color DarkKhaki + *
 
+ **/ + public static final Color DarkKhaki = Color.decode("#BDB76B"); + /** + * The color Yellow + *
 
+ **/ + public static final Color Yellow = Color.decode("#FFFF00"); + /** + * The color Khaki + *
 
+ **/ + public static final Color Khaki = Color.decode("#F0E68C"); + /** + * The color PaleGoldenrod + *
 
+ **/ + public static final Color PaleGoldenrod = Color.decode("#EEE8AA"); + /** + * The color PeachPuff + *
 
+ **/ + public static final Color PeachPuff = Color.decode("#FFDAB9"); + /** + * The color Moccasin + *
 
+ **/ + public static final Color Moccasin = Color.decode("#FFE4B5"); + /** + * The color PapayaWhip + *
 
+ **/ + public static final Color PapayaWhip = Color.decode("#FFEFD5"); + /** + * The color LemonChiffon + *
 
+ **/ + public static final Color LemonChiffon = Color.decode("#FFFACD"); + /** + * The color LightGoldenrodYellow + *
 
+ **/ + public static final Color LightGoldenrodYellow = Color.decode("#FAFAD2"); + /** + * The color LightYellow + *
 
+ **/ + public static final Color LightYellow = Color.decode("#FFFFE0"); + } + } \ No newline at end of file diff --git a/src/test/resources/documents/ColorGeneration.testHtmlDisplay.approved.html b/src/test/resources/documents/ColorGeneration.testHtmlDisplay.approved.html new file mode 100644 index 0000000..e54090a --- /dev/null +++ b/src/test/resources/documents/ColorGeneration.testHtmlDisplay.approved.html @@ -0,0 +1,702 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Blues
Navy
DarkBlue
MidnightBlue
MediumBlue
Blue
TealGreens,
DarkSlateBluePurples,
DarkCyanGreens,
SteelBlue
RoyalBlue
SlateBluePurples,
CadetBlue
DarkTurquoiseGreens,
DodgerBlue
DeepSkyBlue
MediumSlateBluePurples,
MediumTurquoiseGreens,
CornflowerBlue
TurquoiseGreens,
Aqua
Cyan
SkyBlue
LightSkyBlue
AquamarineGreens,
LightSteelBlue
LightBlue
PowderBlue
PaleTurquoiseGreens,
LightCyan
AliceBlueWhites,
AzureWhites,
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Browns
Maroon
SaddleBrown
Brown
Sienna
DarkGoldenrodYellows,
Chocolate
Peru
GoldenrodYellows,
RosyBrownPurples,
SandyBrown
Tan
BurlyWood
Wheat
NavajoWhite
Bisque
BlanchedAlmond
Cornsilk
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Grays
Black
DarkSlateGray
DimGray
Gray
SlateGray
LightSlateGray
DarkGray
Silver
LightGray
Gainsboro
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Greens
DarkGreen
Green
ForestGreen
DarkOliveGreen
Lime
Olive
TealBlues,
SeaGreen
DarkCyanBlues,
OliveDrab
LimeGreen
MediumSeaGreen
LawnGreen
LightSeaGreen
Chartreuse
SpringGreen
MediumSpringGreen
YellowGreen
DarkTurquoiseBlues,
DarkSeaGreen
GreenYellow
MediumAquamarine
MediumTurquoiseBlues,
TurquoiseBlues,
LightGreen
PaleGreen
AquamarineBlues,
PaleTurquoiseBlues,
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Oranges
OrangeRedReds,
DarkOrange
Orange
TomatoReds,
Coral
LightSalmonReds,
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Pinks
MediumVioletRedReds, Purples,
DeepPink
PaleVioletRedReds, Purples,
FuchsiaPurples,
HotPink
LightPink
Pink
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Purples
Indigo
Purple
DarkSlateBlueBlues,
DarkMagenta
MediumVioletRedReds, Pinks,
DarkViolet
SlateBlueBlues,
BlueViolet
DarkOrchid
MediumSlateBlueBlues,
RosyBrownBrowns,
MediumPurple
PaleVioletRedReds, Pinks,
MediumOrchid
FuchsiaPinks,
Magenta
Orchid
Plum
Violet
Thistle
Lavender
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Reds
DarkRed
FireBrick
Red
Crimson
OrangeRedOranges,
MediumVioletRedPinks, Purples,
IndianRed
TomatoOranges,
PaleVioletRedPinks, Purples,
Salmon
LightCoral
DarkSalmon
LightSalmonOranges,
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Whites
AntiqueWhite
MistyRose
Beige
Linen
OldLace
Honeydew
WhiteSmoke
Seashell
LavenderBlush
AliceBlueBlues,
FloralWhite
MintCream
AzureBlues,
Ivory
GhostWhite
Snow
White
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Yellows
DarkGoldenrodBrowns,
GoldenrodBrowns,
Gold
DarkKhaki
Yellow
Khaki
PaleGoldenrod
PeachPuff
Moccasin
PapayaWhip
LemonChiffon
LightGoldenrodYellow
LightYellow
diff --git a/src/test/resources/documents/ParserTest.testSimpleParse.approved.txt b/src/test/resources/documents/ParserTest.testSimpleParse.approved.txt new file mode 100644 index 0000000..9815e21 --- /dev/null +++ b/src/test/resources/documents/ParserTest.testSimpleParse.approved.txt @@ -0,0 +1,3 @@ +This should show + a = 1 + b = howdy \ No newline at end of file diff --git a/src/test/resources/documents/TurtleTest.testDelta.approved.txt b/src/test/resources/documents/TurtleTest.testDelta.approved.txt new file mode 100644 index 0000000..fb6fc38 --- /dev/null +++ b/src/test/resources/documents/TurtleTest.testDelta.approved.txt @@ -0,0 +1,9 @@ +0=>[0.0, -5.0] +45=>[3.5355339059327373, -3.5355339059327378] +90=>[5.0, -3.061616997868383E-16] +135=>[3.5355339059327378, 3.5355339059327373] +180=>[6.123233995736766E-16, 5.0] +225=>[-3.5355339059327373, 3.5355339059327386] +270=>[-5.0, 9.184850993605148E-16] +315=>[-3.5355339059327386, -3.535533905932737] +360=>[-1.2246467991473533E-15, -5.0] diff --git a/src/test/resources/documents/TurtleTest.testSpeed.approved.txt b/src/test/resources/documents/TurtleTest.testSpeed.approved.txt new file mode 100644 index 0000000..28a7fc3 --- /dev/null +++ b/src/test/resources/documents/TurtleTest.testSpeed.approved.txt @@ -0,0 +1,11 @@ +Speeds + + +-5 => I call shenanigans!!! +The speed '-5' is not between the acceptable range of [1-10] +Perhaps you should read the documentation +5 => 5 +15 => I call shenanigans!!! +The speed '15' is not between the acceptable range of [1-10] +Perhaps you should read the documentation +-2147483648 => -2147483648 diff --git a/src/test/resources/documents/WheelTest.testWheel.approved.txt b/src/test/resources/documents/WheelTest.testWheel.approved.txt new file mode 100644 index 0000000..31828fc --- /dev/null +++ b/src/test/resources/documents/WheelTest.testWheel.approved.txt @@ -0,0 +1 @@ +4 - 6 - 8 - 4 - 6 - 8 - 4 - \ No newline at end of file diff --git a/src/test/resources/documents/colors.html b/src/test/resources/documents/colors.html new file mode 100644 index 0000000..773513e --- /dev/null +++ b/src/test/resources/documents/colors.html @@ -0,0 +1,13 @@ +#foreach($key in $keys) + + + + + #foreach($color in $colors.get($key)) + + + + + #end +
$key
$color.getFirst()$finder.getOtherColors($colors, $key, $color.getFirst())
+#end diff --git a/src/test/resources/documents/colors.java.template b/src/test/resources/documents/colors.java.template new file mode 100644 index 0000000..678cfcc --- /dev/null +++ b/src/test/resources/documents/colors.java.template @@ -0,0 +1,26 @@ +package org.teachingextensions.logo; + +import java.awt.Color; + +import com.spun.util.NumberUtils; + +/** + * Every color under the + * rainbow, + * and different ways to get them. + */ + public class Colors +{ +#foreach($key in $keys) +public static class $key + { + #foreach($color in $colors.get($key)) + /** + * The color $color.getFirst() + *
 
+ **/ + public static final Color $color.getFirst() = Color.decode("$color.getSecond()"); + #end + } + #end + } \ No newline at end of file diff --git a/src/test/resources/documents/colors.sorted.txt b/src/test/resources/documents/colors.sorted.txt new file mode 100644 index 0000000..0084f4a --- /dev/null +++ b/src/test/resources/documents/colors.sorted.txt @@ -0,0 +1,6 @@ +#foreach($key in $keys) +$key +#foreach($color in $colors.get($key)) + $color.getFirst() $color.getSecond() +#end +#end diff --git a/src/test/resources/documents/colors.txt b/src/test/resources/documents/colors.txt new file mode 100644 index 0000000..f62762b --- /dev/null +++ b/src/test/resources/documents/colors.txt @@ -0,0 +1,173 @@ +Blues + Navy #000080 + DarkBlue #00008B + MidnightBlue #191970 + MediumBlue #0000CD + Blue #0000FF + Teal #008080 + DarkSlateBlue #483D8B + DarkCyan #008B8B + SteelBlue #4682B4 + RoyalBlue #4169E1 + SlateBlue #6A5ACD + CadetBlue #5F9EA0 + DarkTurquoise #00CED1 + DodgerBlue #1E90FF + DeepSkyBlue #00BFFF + MediumSlateBlue #7B68EE + MediumTurquoise #48D1CC + CornflowerBlue #6495ED + Turquoise #40E0D0 + Aqua #00FFFF + Cyan #00FFFF + SkyBlue #87CEEB + LightSkyBlue #87CEFA + Aquamarine #7FFFD4 + LightSteelBlue #B0C4DE + LightBlue #ADD8E6 + PowderBlue #B0E0E6 + PaleTurquoise #AFEEEE + LightCyan #E0FFFF + AliceBlue #F0F8FF + Azure #F0FFFF +Browns + Maroon #800000 + SaddleBrown #8B4513 + Brown #A52A2A + Sienna #A0522D + DarkGoldenrod #B8860B + Chocolate #D2691E + Peru #CD853F + Goldenrod #DAA520 + RosyBrown #BC8F8F + SandyBrown #F4A460 + Tan #D2B48C + BurlyWood #DEB887 + Wheat #F5DEB3 + NavajoWhite #FFDEAD + Bisque #FFE4C4 + BlanchedAlmond #FFEBCD + Cornsilk #FFF8DC +Grays + Black #000000 + DarkSlateGray #2F4F4F + DimGray #696969 + Gray #808080 + SlateGray #708090 + LightSlateGray #778899 + DarkGray #A9A9A9 + Silver #C0C0C0 + LightGray #D3D3D3 + Gainsboro #DCDCDC +Greens + DarkGreen #006400 + Green #008000 + ForestGreen #228B22 + DarkOliveGreen #556B2F + Lime #00FF00 + Olive #808000 + Teal #008080 + SeaGreen #2E8B57 + DarkCyan #008B8B + OliveDrab #6B8E23 + LimeGreen #32CD32 + MediumSeaGreen #3CB371 + LawnGreen #7CFC00 + LightSeaGreen #20B2AA + Chartreuse #7FFF00 + SpringGreen #00FF7F + MediumSpringGreen #00FA9A + YellowGreen #9ACD32 + DarkTurquoise #00CED1 + DarkSeaGreen #8FBC8F + GreenYellow #ADFF2F + MediumAquamarine #66CDAA + MediumTurquoise #48D1CC + Turquoise #40E0D0 + LightGreen #90EE90 + PaleGreen #98FB98 + Aquamarine #7FFFD4 + PaleTurquoise #AFEEEE +Oranges + OrangeRed #FF4500 + DarkOrange #FF8C00 + Orange #FFA500 + Tomato #FF6347 + Coral #FF7F50 + LightSalmon #FFA07A +Pinks + MediumVioletRed #C71585 + DeepPink #FF1493 + PaleVioletRed #DB7093 + Fuchsia #FF00FF + HotPink #FF69B4 + LightPink #FFB6C1 + Pink #FFC0CB +Purples + Indigo #4B0082 + Purple #800080 + DarkSlateBlue #483D8B + DarkMagenta #8B008B + MediumVioletRed #C71585 + DarkViolet #9400D3 + SlateBlue #6A5ACD + BlueViolet #8A2BE2 + DarkOrchid #9932CC + MediumSlateBlue #7B68EE + RosyBrown #BC8F8F + MediumPurple #9370DB + PaleVioletRed #DB7093 + MediumOrchid #BA55D3 + Fuchsia #FF00FF + Magenta #FF00FF + Orchid #DA70D6 + Plum #DDA0DD + Violet #EE82EE + Thistle #D8BFD8 + Lavender #E6E6FA +Reds + DarkRed #8B0000 + FireBrick #B22222 + Red #FF0000 + Crimson #DC143C + OrangeRed #FF4500 + MediumVioletRed #C71585 + IndianRed #CD5C5C + Tomato #FF6347 + PaleVioletRed #DB7093 + Salmon #FA8072 + LightCoral #F08080 + DarkSalmon #E9967A + LightSalmon #FFA07A +Whites + AntiqueWhite #FAEBD7 + MistyRose #FFE4E1 + Beige #F5F5DC + Linen #FAF0E6 + OldLace #FDF5E6 + Honeydew #F0FFF0 + WhiteSmoke #F5F5F5 + Seashell #FFF5EE + LavenderBlush #FFF0F5 + AliceBlue #F0F8FF + FloralWhite #FFFAF0 + MintCream #F5FFFA + Azure #F0FFFF + Ivory #FFFFF0 + GhostWhite #F8F8FF + Snow #FFFAFA + White #FFFFFF +Yellows + DarkGoldenrod #B8860B + Goldenrod #DAA520 + Gold #FFD700 + DarkKhaki #BDB76B + Yellow #FFFF00 + Khaki #F0E68C + PaleGoldenrod #EEE8AA + PeachPuff #FFDAB9 + Moccasin #FFE4B5 + PapayaWhip #FFEFD5 + LemonChiffon #FFFACD + LightGoldenrodYellow #FAFAD2 + LightYellow #FFFFE0 \ No newline at end of file diff --git a/src/test/resources/images/AdLibsQuizTest.testCorrect.Windows_7.approved.png b/src/test/resources/images/AdLibsQuizTest.testCorrect.Windows_7.approved.png new file mode 100644 index 0000000000000000000000000000000000000000..95019d9b375e3b8aa685f5306581ba590f392c39 GIT binary patch literal 12506 zcmch8cUY6zwl^LfvC(X(l!&N|0>Oy%HV!H(BF-=nfdB$RL~0Bj5*!ujf;d0~0UMwq zAe~T0k`RGFlomn)83H7fPy>MwNbVavGsko9Irlry_k7RyPoDSPOGx|;DIu|`ZrfI%D8vUt*Z zrK}ilN#fKE{xJ!OSOW%B8h9bVcjLA!ZZYNpwM1L~`63NlH>S({aR(ghXfx!?n+3492_pyy><(azi zowI#Ddw)^5qI$ua)QKI7hzL4fq8HWIo4n3=x7-VI{|+KK7l+W4ERdP8tP&kpFnq6~ zU>JBkc)m(>rQOX*uxmg?tw4sOPv6f(Jb>ne)QjKdvVZq@Q2Y$wS z#bkdGmaFQH1UPT83t>P_yMJrS*p?X@IZ&yUk0HUg%R8;*RiL{TRc%I5!Q7JadEc0P zk5?_aw!6|}hixd0Da_JLYT3}*pxwSlwrlmbmwN}rGcm3zcL{Mz+q2CMJ>S$lQoA}l zJw?Xyrx#V6^lkKty{J^W*IvpLe_X=~f7qB+^yiVIflA#26B z-l}M`I-}Xb@?4O-IevjfC1#-f5iica2Wfk;lsimqQJ6}3bhT5oe+b&y8cuzn2qewTb%p6U0wOTBC_tKX0ct;lL_1J&#%4;T9%^L9(su?Sb z?@AWKNlUC*U762u-K^;^DANyWi`xA`aj+RzuhQ-4Qc(4rDS3HiW9I; zJx{Eyb*1v5MPy|(*MeFIS~G|vmim19{9;|%FG8D@-|;ldL{!LFS|w*K<=HEd)|e!p zwho)Jmgpp*wAh8Qv6Y&P{--EGbyP=ZePGazx`4hm_3pAFt@(%!jzLpMsp^48oLnJ?&vz^0ycVt-l(XW@yFsJ-2r`#SE7k)nJjHY|FcaerV zWkjhBYeS&2AV(1CLgIi~k%B=j#1X|#=TKcDQ~DU9Hpdf3+6lijl9}sd$BLtMvw3>u z&>@k{?&M@xc^*Ymjfa*Fq@+n;y} zWiGlre5n^oBO#~*s$0N*#d>s^9AmAJ^RlSR5Qtg#uah1H?E{yBJu3kN6dCVttF z!u3;r#>oe3n{)L%cxO!v;b2D8Fi-AfsfOpcAuF#A4e3)F$a|g>jzwHKgcAN?DYBcp6USN|O zxUN-bnmKhPpY_hYxO|y5IL=AJO!*}C;$h}U^S)pwM_u=+#6Teo{U&gst<|1u+fgTz zF=SSb3x;&3o8>logzHW;Uz)h)n+I6;)dlxX{c)+}`lXS*Do-2=etYkoqpMn!z-7Ek zdR=qth;m5q7kth3CuLGJP^)v~@(6Ew0avqGlNBDRGqpK)3nkv^qt49i$9*dDQ$$Ur z44n#H&Z?61ge)>BDab2JKLhMC6l~)to=Ed82Z@KPB0C=L1tUt$^L8Fyu&-ubQ%}rQ zVuTx+nBM$Yx-TkN@ua5dqCL2;P03T!n5ZQ^VP{BkP=`=@y%)^$dVS<$Y`QhC29r2_ zz)YyzOLUhV$~@|4wtIfJ{B}In12;KE(>f4KOCOz2cexeNxzD?+41=v>acM?)Ygm5@ zxys6iiu#-IBRBc#;|$_;W376O3ON1y#>1+`=QQP^h{xu}kJN2O+WNn^x8xJYz;_Sa zg6J*r-cIPKdOo^Hwje7E&YzlE?eoDe4o+R@Joq$SugLFRjkGK>_V7r*TyAW|Hhid+Vlaxuo-IHTYHh$Z-+$+%k(|Z7 zudO{On(@7>rB(Q>sr~o zQdNS&E{h7nsy@Y!xezyDTz7d&0ur#J*O7}PsWUNPV^ac* z)U5N!==a$zvdF{t@bn+{Fxq5e&W>F3LMQ8gZMf+$3vlv{>5>G{+PM@2fCHaXj*J(O z2b~wz3oI1R{!_CE^efEfA4q3IRL5V?OdWUI zsgsM>dM{hRG6#o+n$P$yX;;&8eD--3BfS%)*wydv38(n7J z=8QkiZfp!|#+0eZqeaQII(l%=r-!M&Xnxxu_%48R&swX#p}Ug1tyg|2C~3M$g(x`- zX0?W>!+ZnFN8^FCe*by$>VlJef&lF*D@(P`eCM?_5P}hXtW_CD0JF`tq5Hr z?5Zv@Z5V~0SB&3idFoz%_0{jUzxSW1spWXbNFVGPPCv?5>00q`A{%2KX zX6&Y+fq_>M-Er7~pP+ggMxu91RGh!?`-r9cW@_{L=~4#`D;PLme>@#hkn^;t5oyWm zUlwU5iPDxuzxnc8Iys*RYRhdxILgaTQoBiCJL?YjxAzFwS55a1vt*HDgfQ=3y79`4 zPJ3I9BQz3Buia;Pxhm;k4KsH>Edsm`x%ndA;aq!llz_q^Swagw?1UH9pVp+UHhV|t zjIVm{2cucy@SzkkP^mJ1XM^mwoD ze%6*v-I-(1HEp}xsCyWNA37Tr2KH)X(65IJ zG80OgG>Z}r))xO*7#gy!apxiK%wJu)IsZp&%)ZIWRoXJ2hCn^W>uP(y0T_9o|Y!A8_(lH!cADs zA4+juWqnIU)9r`k&vCY9T>&)^P_QXR-oj9{8-XCcIEn5Bq#b z+uctVZ^kQbKEslJX887Kg)+6~CC>YJvOnj8(AyC_`@u9ve(2>8rJ+0ZrY8QebY$a!N=tlPSiwP|h+sPg8- z40SNfBJX)2@6?o>n#R>+cQd(I6$aat2%elCmDpcMm1E5%q*ZO?A0DQdV`sY$>XiLIktF!Ze*w%Tmwk=Kh4V$YbLQq^!T#c_|%c z9e56rXEsMSe_n0Xt`0VcfEpvAYdTJF4Z{lD>Z}REJZ1?Ygt;W%Z`@Pv?xfVGk@)ns zn;%V&aWUBuPMVZG2Qi1PaPvu~Z!FlPF@YA{^hbaO>~ew&KEbKX$ePn@mgsCEW;?S(0pDv&Kix zMq-K>ylc9RZ?Th@Db9MZo}sz{J6>m^QmavbAk1kfyX!zGpXn);PL%YHenZu4vkcJ5 z?D{)*`XX()Gq}8EGUtO6sbY*=;Qutosy5(f!(SXXjP*MNYFxhms>w_W&oMP}g(W|b z(X_s@N@OC4Mm9mF^IS)i2OW?zqne4GN&;rgN79iu(7#Muf^RxjUt3dKbdp z+#6TS7*3IfKq=QVs^X9n3uC@|m9{VdS!@j;DV=%s_Gpc+bC9P)$XdOVnP|gYLZLURo0y@Y=~~n{Mw5B*juA zFgs}`6cdE<)^%H*2~uSzUTM#=)B9@7P|`jNDBZZG5LYm^w%QwUx$zRSfihDxsc;-m z|9x9+&G}2{x@6<Z!*2PLeHOWXO{D=3hB!EO#<`#I*S5ITANR!O@c9BSm(rQv zc7iXTm2X#lc4Vt++k&tA1uehtx_Vu^W2-_-APMqJgzMdeD@8hq zC2x}GqT7fIM%*8ct-20k4_LuWA=z-~h8O+;3E_tkGZdvwyoNt2<;>Ph+$;8XLD1kv zq~9y8l%Zv01ue&utgUfsQETmcPc7kM1So){tQxVH-Zk;KsWC~)Zw=qS)J9mQHdD;P ziRX_AV3CW85WS0vwR0zFZ8v)jK%RYwl>q0;PsUm$oduHS}clOuNYrBQ8&WI-?cQW`3 z?App)P~;LT6@};D!6`ia+Sg+X%C~*&m`d<^UO}KYD5S*Rt}MA)xz4ZT(Pkjb3vQAQ z{sZp(uw|o@Tclw!8($PC#OYk+@-xOTy5@B?S9un#WN#DB%< zl@UI}k6hQiIsO?fQ{5nk6t99RKGoktyrWccaZNW%>O}<{A#|wisw2X_gcH@5;Td#_ zo1k5OLeIMOki71y(Ka_}2wZUyh95}x=a3rLX-%GR=UT&PCw=d+G%sqOyfdxvEXAcf zfKN67P&4(@mn8f3xnXJxG3Qcyr*lwH2>~XoNB@lKE2}!D>1}-B^RF0lV0b2hGij9k z8`#m7q+?UyMqyP2*mJygM-g+3m|dmO!6EFTw9l@qI94xx^ufPb@2=gJ*Bj#3nzK%j z^g@x)=g;k*DY%CHi}-bO>|==*U{mbqy5c`#X>2)UL@n?T5<1vWi7T_tjX3Mj2=J8# zWu$9=zpIx$0G@dsNjndfrw3_zvHV(4+GY8+R`!FK+6uq%*ca3XNVS{Yde+ucj(QcI z?pF`kAb{W_d$t77Pn8!Vg02EhV`Z|PkSC5LE$+L8VNOptmV_b zopjDeis%Gk{5PuP(k0SZdx39epV0Wn;umjKX#Stj)c!rh{H0QjJ{=e8vz+8iqmw2e zQ{T||sy|WpSq)EOt>OEFQ*L&J0~i{wL$7P3?_l|W%t#A2_GNP}#s08uJT_7kO|yt? zDZ{*&@&U;Om1=ZKzGnq^3kM?mK4`fWqwk;`bor^RW7V{Mf#u5mD72GtvZ!UshO@7s zs&Ip`sowf9$F>(hG9<6*K;%m_Lu$^rfB4*?Jh&h1Ik3R) zuD(J(?xcT0>0MC;KyQ9O%=_eMc2(~5+n~#>wco_4l{jLy(;0|g^J^a*&!Wrr)z>%` zk8QRmL^d@9|9h6mH#fw?oZOuTj(6s@XH*aN*omk5?pYsk;JN-k1CPM=MH>2F6T}lN zH@-*pQ1|?)@ws6yJ~V38FE?8oI&;lShejCg2~2pRq+M4D3`6=--zSwz?svv(^!%-M zSA$ypKgzMwr3y>@n{FKTb4(>VqF;P8fWE)Os|T6K#5 z7+V%e!+eQg#>@tW^`CjEIpmFp#uDeX)z3RZA@b117JkIM^GE}M{0O3moP3H3-gK@t z(ZSN(@Jy!5;wdzBMVdyCdZ;?!hI;0$hv4G_bDYFk1Mcw2$V4xYK)@SKj(Yl1OOCZOaM{Gz04cJJ{=Cvq*X|4q9Gj;QO9w#UyxPI3EC6l2l{R3$jXS)I% z2H+LlIx%Y~fHTG!47&qE1~%EqnjIkb-AEu(fQsF&inm=^WXtHRf&}og{cFvmUss0> z;RBGTs6f}h-p8w&x2HsF$bzHCbFm!O_8I@o=~KVjj$T-DESF)>e_qI8M6C~T z1lEHXC)CH6nMqg^KDuW}=w}O&Jj{CY>(f-nV1m`W-`*C44n{RpR^9}O zd0xI}DFEY-2+W@bOp}O=2Ce8^%pO3;N12bX!&11iT+@(<)|j=7+1i?S)1Zctm#Mx{ zytS4JhC?iN-u;4yXntYP)&f=9wymeXbQu7W}DVj zdZww+8SEJ&SK+S{#k{i&1|-X56)PJ1BL%*5|JM#dP8Scrno%NOklN70K*j%|Jlg1yMiMy$!n zhaPN~O4Epy4v6f8BS2s%;k4L_yEI*Xo$O!IFo2+W6(9 z>VSO~MP9(rmtv-(3qVdh*^&M)sz&tyyk8hf%pQ`?l^N=XEeO%;lP0$QpfAunl~dKT z00Gr!9qFrzbcge%8A2T+ZddOKPP4sw$(8o1#<>A!sagk2v^d`=W_i5Hh*ni_l(X4e zQ*V1(YPycH>i7?&FKke;mRU{y=;o;IfpVkz<2mw8o@^YYkCc|Hre$2?Q-goeb9))_ zIWfOX5NlrU=69ooj)gjB-5X0)&`W<`x3Ws>ss;A#lNIq9ATiM`uNFsit)}G|pTR!K za=BML>!}Nm{77~T?6C-*Jm~e(a?^rc{HNyiy(g z$&ot2TloQ(>iJUm&u@a31hLCuWT*?t0pLvC7)$M;|LeTz9%S7W|Lhb$t1ha^NZVi* z*lz?;T(S&IE-!$d|m; zWgV$t&MPIGWq2;SJ=Dr68LSs9-=RDq7qBffsVGLv|H!k}|M;)-tWHXPkN!wl?xB@G z7;^)=nEG~C@YrJRDMdw_^V(Z-^mU7pJxYuDZLGz}9{NvpCAGP_#^)Wy+sz(iZjG?Z z=CbLcdkeU)VUgg?TRDzHDVfgJheBH;>O*6`rp&xgD8-_8| zHgOcjyii{Yv+)G=yh5@T*5&;`Du>#E6nHu6+#5ofKIlVv>CozU_lXMvW{N)+Q|huq8Q1j65fg3P^7vf|zQMtGXJz1FAD? z3JVvJfF1gZqcCzceS-RWr&^wQWm?}RV5RR9C);cX?-zA7jIXLj3a_(Jyirp`sntAM z*pFkBVy2?LCVdf0p7Y-Z^n~O8L_9f!5Hmjp*esEj3!&KG<@Ir3F@^S^m7_IwoE^o8 zD3RWQ|8weh5Au8!<3oLW3JuZy9m@1kPU2g=S9#UEW2{xif{wz^@9_lbH1OR|@WFWV zqEn&4kyF!)D=FU*?bfJ>Hx(p>z>Sy2Z*m4tL=K#%3PUT zfbax&xlKP@ofUouqvHpLc|)L)$L4eJFj#cG76GOlh)76X3kHSZ&wbw4*-Y>?VIKK) zt)*Emyj&*NWw(i(mt5?8ratG89wX@=iR36Dw8;{3;HPwd1?_O_wYhAtOxA@8LPU~% zy=?Lb+%EouL-K!+Lsnz)x)QIt#E^*$b*UU~hB9?}9TqV8(=h@6O|I76??Vt4)*{6S z!}MPjk%XMJc`X}!j|^x=qynUkNxch2m#UmY(ACRGhLq@9S*}ZcD7>kK9^;RGL2(1~ zDocp;7dw-!A@bz`Nh8v8A~}F#v2Lrd8XK1uQkMmV(3u$?S~xORXUW^6cXWn~5m32# zF50^F@#dd!?Xaf`jJ&!MA}rS5BNq1@@#ajEg`!yQk~;u;gPaGk6gq86YHlrSU%&F&^7tPf?#&fm_ z?cd5PB?}d8YX7!SMNY3TaV*v^Vg{>|O{;F!SrrdEFeSqBXxOwrqhbr zlix{B%G5^(8Xk4@quH{RDYF2?lFO(|5ob2C{j|{>A+@O~6y6#v7wQHeApWsfY-S=> z)h&WLRC@2kSk_Ig`!i^-1U*Xx%#T|J zavq&%F0m7d5f=U###_&GF_yzeuD{Wa+*mt1oA81Y$CXQ@=y_YEsLU2OYUa zT1pP@bwf>sGrS5b&15frmuffVovl%RO$q&><<(+-lRuDv2VC2*l2@MF*(mBsnrQ1W z+n>lz&V@~{-Y*$?=0r*O*iCVd7Z8hpyl?I4r3hOZTsh{_I{2}tXNdsPRbeIKR>Tj(xL*B4 zYtkk+>Dx27O8T;2<5GW+$&mBWMd8Zr={j42B5+31;ttlZ4@d!`px9|3*W8N-s0NRL zy9Ic~o*N`vBO|rlcwn~fA4G5ZWQxb0Adg1tL>Yws%D~fX9nXv`H2@Y~&&oTR=DnSbghlQg+4M4M4fIIv`&UT$$MEZ-#F8Y9MiCI9=td zC}0j*;u-t(;wjUS4foQK9^r~7es1`-;@@2(>T1hZuHqUgeh}BR0ON*8n!*Ur%+$o^ zYach}U1c}m02?k5S#v06qek2W0eBy838SE~X23`O?H^Z}{y3!$oP)#kZzuwk2*`y1 z-iSJ<jN9UV`ncE>k+Q(!S2}vGnTT0a0Hy}mIZhuJJ(K{(y=QyN%`4(TtsLIHz2&Ib z&rM^2?TD`jcnAL3#Z$*OI(JGw1|G%Vn>%}ScVcUkiUh>M3?*x2d?PTJYC!aGX`Etm zBwZQ|1alo)H^qmmoLAM=c|_6LqSXemtGmsA>EqD8vPo|H5^l2VKpRR8p7^%d@0Qg= zYbfKGVTdO(gNB~`J>8TK?iyM{zDt|6-3QE<`!zg_`v5}StQU1$ux{oz+b1~zEc7Au zpC}oS>d1-5PLEuvOq?W)gkn{^s-^Q%J&0dDftQ9cg15?1qZ%8rL{L7YE@*Xo?mH?b z!gFe$Q=>?2w!!Cj0$o)B8i<{K6#_fDvC3%jZhlLAwZ(y$Nr2i?U?inep1%;NE&5xG zZr{Y+jmLse>*?U?^$BEk!iK+XjUW+x9I!G(eKS8=5F4(hX{?{^zrRGu@aDz7(_TJR z3mo_EFyvU3U`#y(4#2yTx0r-wM?bs5P-?vP{#|b{JF~wV2S}tq0#XbM(0*j zpT3QKYS4W=#M^9sRli~tpP%M+VFpNR_w~5;1*xY8hL7Ez=h)V)-rM7C$YNfb6Xzq= z`Fd3@zz4j!l`kH?DflFzPv zjV$^TR$4tP-?jia6+It7%(X$h-{)r&c~QsN#qW6V2YTi?U=3qYr&-M7O$1OpBGm5` zflkh0T%UKoGuFsbpCQ{7Lgd+e!h*gv#AUypB$%E*=lOBI_WFMIcJZhWv$p<3N~??W z^GDC|LXIk;#urnU_d_|^QhoP>ObR^R zi&v`DL!6Oz4#CTr9@Fh^D51mOHAuj&4D~W)z7(cwO;Th=hvFYF{V$EbUFmz^kbniQ z5%{?*^MlwGT2cIu0K-|+bJ;(|rCh-L!)!(>!b*!isTE9u!X|mNd2>$eI$n5NhqVJv zW1d3HTcvQhQ$PBA1rQ47Ao8F!0z1tX`KGeZy_k*~;hhuqx&RlbcFJUZ876<2dpFw4 z&iy>B__0}5GbE_wFPDnV8rdI}(&DSR@Pt(enZNr*XCHE2N~Yl;GGcWfyg>=+`-B)2 zJ~QH&>;%2juLF%tE8OVIwLGu|q8HvX$Dx!A*(|so((6bnX?|C+F3uYT3xx651J?8F zTxQsVD>^iyRCGdhGA=#a={p(-;8NWqQW?)+yyYn1z~{F_tFNo>lUs3lp(1x%e8N#? z+vl}}iIH>=LVIvqY_2iVyThrY7D#y=n^pBJt}RclDGiu6WlojeKE`6|o{XMild~Oo z%b*xr!bYqU{6LCk&Mwexj6jW5E=OL>UGD5`tggtUwlGn9L1i2=rX6P}|EtqluMcAQ z!aTH`5PW|r|6_yPui{v-YaFw4UTV{9L-4FJ3e&=ax&*j2oogPQPx64vk34HMG5JM7 zoP&(RsD}hi@5!3y)S!ikMtT45BDk??)O>|*52k$BFM1*HHN zictB1be*75Ukz$9jaYn?@bejxPgcL$$oLHA$oC0mbS<;l6=x%kqI+>KCc*4}GeuE9 zDD|sGE|0Jd2mZgt&KQjLarXuPZ9kBv6@ajQ;0a`D83V-Le|H@mzzF|z_5GVm;{cBM z2KWC{EAe&pZ!X9KxaeCE;@5w`wEyQ9o4X1G5nlKf!cm11&X U=r!=41&K@NubwOZ@y5OX0#j}BiU0rr literal 0 HcmV?d00001 diff --git a/src/test/resources/images/AdLibsQuizTest.testIncorrect.Windows_7.approved.png b/src/test/resources/images/AdLibsQuizTest.testIncorrect.Windows_7.approved.png new file mode 100644 index 0000000000000000000000000000000000000000..e40bbf6b9e942da60405dc551d17e2250c108e71 GIT binary patch literal 8830 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 literal 0 HcmV?d00001 diff --git a/src/test/resources/images/HiLowQuizTest.testCorrect.Windows_7.approved.png b/src/test/resources/images/HiLowQuizTest.testCorrect.Windows_7.approved.png new file mode 100644 index 0000000000000000000000000000000000000000..df938a86eeb83e12e587f694215757ba70e15e68 GIT binary patch literal 9523 zcmcgycU)81wgzz&2SE@8m7;=*N}Gt301_2O6a?mi^yZMEH$&(l#6hJ+f=Y|hR0IY= z5UHWXLK1~YluiPPh9Pt?L`n!D??kV6yz}PHz4QCs_x{@F?6c2Wd+l@fx7PahO8LRs zT=LsJ--?KcNS-@uW-B7H0WKmU+9bXS=z-#&&Wnf~SUqQU>OwSib_8)Le=L8H4ee}N zQE^_mUmkp}?Q)7_+sjSQy>SLXPv1S>xMA1nY8=5MX}jEM@%`ulH?pRNrj_{Z?Hl&r zxN+6{WjO87kM$#mUK}twfB4!VtD4(C>3BEg&(54L?V0rUEtpzX^ne|(G$fsQa)8Gn z`Nnne@^U>uV1_Y;*LF0^qIjdo(^_ve5s_rDh)BDlh=`Yz$VsxO$Uc^ch%_*5VK->A z$Yre9r|z#t3A?`@1-$%al(75nvcA0hMb;mv05pCXCDi1r7MoCV36L;dH&BjRg`%+(LTL+ zm52kY$I?YyG2~ zhwE*yhh@%H*Y4Kwc0BQ+aACG-mH3P;5z6&gzg3x678vZA)j+7|xIWOdZ`g8c%*h;2VU5M!)ObuHjnA3y>nX?1dEY z>a(#A$M^xrM_2gHr^vA0Yr|@EjpF9@dm14UhKE+ot};6t7bFbZxAysg{+2fueHi4Z z5pm|?g|56YS?#VClXTMd@ejp=>=ie{G^YN60hNbY}6odnvyuhgUTB>GMDM4qa9BlG?9-rgn?r zAsrU8v3gK>bMt_{ZYdG`h#NTu@+O@67)YUK6{)IB^mZygRECSamGdnpKKuB-BCudr z7_xa6n&%p_;v&^L^cu|>%BYL4d`m}7-hp$LlIwA#@NEUHdv3}%IEJhbz6&Hx6UX%9 z=ciD5b0B?S^~K+O-`U?D2$+gTtB>!gYK2YD>Y^&E=@4Z{x7Y(7 zM$extJW+%3I(Q6aV~|Q0RdF7xKtU?hTqo$R5?9fZeRLc0&sgY&)7Ec9FJqy1lJf3~ ziGWDQw}DS>7V(-(c5us?<=^SpuQma|?-ty-txfFf-+g|B#+5A?CaJe=R01Fq6t&AM zM5V}5C`A@7y9=JATL1Zhz9=ZlK=tnrMt8w8WE>NuMB4MPyrfAb`_GrTEYLxrf)t#; z^54F6u@8LdvP!^A&NSnr)oQdwKx(W*GZ7`G8e0s{*g5K}yNA!teY}=~!nSc)p-&o> zXg=gT@Z|eQ18B(5!@kMeh3j#{j8N{2&ZG&%U2RRA_qhQ2@C^QxG#prItJ1UE!?(&; z*DnWZmxSW^&EfPcqp-nioGR+=hFQdtQIhV&A-G&+^nA+7*6-VQE>Fu3ly)f?aq3wa z8wR%XCW;$W(h|@jYINp)*kk>j0?Y2eQ$2CfP zR^%+=uHS7WQs0Vyyy2@yl96qn_VXfW5p4JEn zH5i={GohsFs+Abw*Jj?0hM?BUdY@c;|6t?T2dqR5i_$@Bij0yB38eSt8Ae60Za32r z2s>WiY*}ToR{HCpJGbRRT(PlpbFW6-5lyz8Wt#RR;WA>L9^M|lLpf%W2X<@9sWQG; zf%LagMw5E?z-3%uJRQ$CL&^kUtLHGDJ;#q(tFbZ8m=86ETejf?Mu>{xby_tA(Nnv* zkuBC6y$*Z8XJ3^{#>AOM4ov)Vkd-R(@F0s>t*V(LHwuz)97e6yHFVD*l+Q^} zjRG*Zwp>g-72RHfl2;r82MmVVbL);;b;fua`diD{kezEtOi_xBujLwNYb);QjZ zm6{`R-sz}P+eff%MOrP{CFZ)P#-xL*PySJmem@kj$fZEOvy8i4jmMJ;*eVS-4<;)~ zR;x~6=$0AnW9BLz%mY6g)CV~r`R}%f!G>-DO1fl=&%n> zE+Tu|Q%DFBg=tYCGULZyZG}B){~&vedA|21^Qd)LG7aVvkhj~Y$~(U8ME4fy9!*wu ze5`-`c{@+LHc045%e~Hu=4M+vo0y=bheI(49%ktwu%1R!&^fg-R=A7=j7ZLX1`E!|AbsHzt$u+YF-|r(ry@nRc_O{;iR3~iV#OKxDZ>4%(*@Tmj`vnUi(H^?ogW%Y2aZjjR0D z7!S9L2KP0IqfX7=%WHR#hU^u@+K2z91UH8ciyIb1FRFpPrW6!rx1A(|kiZ-gag1@5=`Dd0Yt*dp8#13^a+Slz@M=->8{vG@_yE*oAyu0t;UiL2clx& z25=?U=hvC}Zlx?z+WXSmT`z(EswYdPHpxQnrC1}i;P#<+_{t+3b{Cwnj6vy1)1tQ_(?L9Pwmh_ z$e2?EGmicPZArF0dAJx2l_Ne+zXH)G3lT@tKCVt%8|jSj(sDR6&dIba9Y4aTV+9yA z!X5M7yf=zBYEzv3jfDB|HknFCdKgJmC!1~Px%w<{R2lwb|C)1*>%d&)v*6dcckIS1 zyNuxjh|tggeA9`(y56zs+g3U~&x0lGC?h9gS^{kx1Hg5~Q@i%DO3aNlw!;%JrtFuN z49c_a*0?cI=&U7T!O6I!AB%pIN-N|tdtwsReO8$9 zxci)7_v$RnM(2yS|IossX4oh!tR#1cKUqa3@CVh? zPdtFKQU|Ky;;;Gzp?5dE^(ex6qetHdjOgcf8R|pEIf6CrmK5A-{c6jjUGVV0vD6z%|judDwn$z*v|yF79HLt%9`HgLl4>`38^ zbt^BH!-f-V{b}~WWusKgLf9l9X<8t!6HMS2w4U&17o$10!F8aMWGm-IxaH&>yoUMn z0?%w)cmq;p!oVrLZ6N@2gWzr{wQJg`KbOQ@X>d_Jf;oYv73Cj)+jI#=g)@r4w^GM< zb~f4pjsn}JqL=Q@mMX%GH>RG*^S9w z{lU?{*q`ZM4@GJ-OyYZ9*)xoMS`xL9m>q$tnl%o}qwEZ~Ig7+%va4kv%hGke31*RtB4vp3~sO2$U!;1lP? z#VcxC+r2GQqt&gCCm(z{D5n!OfLd?ce{+YL-j14Jv|;Dwccd8yGY=UkA;=MS%rs8} zw08Bnfo#MBadd_vGcxb?9$(^_%Y@mR)|U;iShOstU=5A8psaly=fcyL<0}vT2JB$1 zf!7L6aNt2*GcUf19p&DRlLLXe9qfW_#48K zcxm#pD4v>w)2h`0jaVD*HW;A*DjvRn2|k2GDG7#q&x3cUvP0#l{!g=`FS2q&%w_? zI1mf}p~)ox+eJY7!Fjw(T+4Ngz}W&h4(wSVavrXQEu9$CUZ$*9*}A|A_<(x=esKlg zVf%GkJO`E24U-@GGO**(m^O#PFSK2KN}Abr%C`{k4JB!>5p+qMz|}&{BN!!acxv-y zY_6W38|1?nU(ms<2mVgLp?HPdNp^0;rlGaxu=zDMfLBSz`Kw^i=+RN8gb^m^A6;D+ z(sUd~(S}_Y>%NStRFWUKf!3aAEXhMA2wjwwEPFtaS!LKR4`0jL%-eX1CpzsGX zr<4}l3?)sQ?Mr0p4iv;uZ;;F{5H+B27_2)wSSCtWN$N>JMC?Sf;3#S0Ru;+nEO{p_ zXQVFZL;O`YQ-rBU9Tv5^W~@wG5bUQ9-JGX5pHO3jy7gm=9#H}JOK-SVZaJA9)#2Hg z!ykGoxKhyo{Ec?slQC&^6}zFJa{EB?2xl>8VYZS!cBQis2D$&s0{@J}g8-0YOZ*r| z)eP!Nev`JeM<$|L6SKL(8&?+{1PU~e0XZ@p3LENzLlw9&Vy7C`o-ME=xb4+Hqej`_ zrNqJudPJf29H>KP_iL2h`u&mhaWTOas$b#0i4s@xPSFdNWCGOOMN5+im8)zNd<+a7 zJ4pU!R!NsM>{qyav8d)wj3$TkBv4Vmk(G*>=o5)f+vX#4n^D3*I zeOTWM3pS6zeFOlSg1%kPjHl2GYFD}mF=h3_1&|tAE3j>v92nCcOcy-P^m$z`wEy*Q zxkozO{U1(_sTPtR*=;ucoZwGErn73!pg%deBdnvoJJAD54K>bta-I-p1Go6~e5X+@a_ zA00ZFapjX{RIte`q2)4b<3FI?)R33ss!rU&WbG33gK2rop*l# zNS+3XpB_)tx}vAYn)T%BSJ@1L;HsKg{R=Hl)~|C6h8R&l0J%W2?(wXYE! zo)2VSqx^ap?^ou3>IvcDvhSiTGk4_h4&PTxs0@?S(wc@%Lv5ryoD5Efj%}IVmi!>O zR=hp>yhgLhVv+u)s=mlBb8X5gc_5UWq`}u~MZnYtF=7YgC$d z)}#_saRwY+3aNdicici38!Dp7lA#!?&53eu}9N7*6DG?vm4`tZxU6hUdEU@ z*KqdzxIFhy;nI+{|EY1jj3Dj&bu|zEIZT0*Pb~!SVpkI{Bi~28T={)&BQCloRhrw_ z=Av8qjMd4k*@`z_k#*jRaS8rHRI`(JD%&TM^5Y=@9aRGFg9`#4gKqwGMT&VP_R%{!8 zX}&wgaqi`h@?H1#QP|^{t4-$ z7yzA3U&$-vb->F2LgXsZ4XcZCp!e4`2VQdJl(2enqc(Hqf2)zt|HiCzxn{n+O5Y3(r@sK#Dnl*s>=$%*P|&3Xd+auL4*h!lUq zyiIXhP&&ezqD^t?>t};iA))&wvLQ|;ZCZ0AJbOhE@j}_C9{|p)BJoM)F@K2E#Usnc zx8!Q0dKKYCNcxquuJ>N74<9Ag-`&M96lQ%Z4zl(b?y+4~YqpzjqsOheRbQY++Ph9Q z))%$7#iAI%?mF)Z!~2HXxWr8|TQ0Z;1FQ=0>%CAN`~=Gfy6B1~{nZuv=>&FY-5J}w z<1!8AM*jCB-ZN{*+su35Rf4b&F@$4tKM{xhL=8P^;HF(Z$PXj$nu7KHYQnAjbi>oI+Vr_fA?fq|ZI#AKD1|Gq0+*s~KG|61|U&P*4uYdR8NF zWpp;AGs46Aeh(?0A<2`oBs4OC*<;P zIidUio)fzNnG?Ey`mb|BvKvNMVz%i6@F3aLXm$>UOIPtynKcIzbU$M@o` zS!xxKeX%OtD$=8%>X|+AjI@E&YPd;kj8xO$I@tzQ0R0n6=tsK~z(-bC==Otkzeso_ z0Wf`9-zmP88--Pj+(*lgjm~@`F2&FH+{m5coh4hj+qA4^D1sK#(v~*wV@YqwSac>R zCI!4^ZDV24&W)^o=!~q8vjI4n+>n2!f|9|208!v2xYs9wToxXm1jOrCg;XNI1OaaV z8G#xr&H*_1^s?Tk6amuTEq_!__zW~&gL%QT?)NMJju$`QLdjNrq)%)-z^e+|v%>b1 z^iM4y4iGD(ioR~YQqymWJ}NJ{NvKk&S~zKqnhnCq{IS5_ru}95KnqIxBAsGLIRGxYC|4ieWJHM8AVP3e+GWwEC37~;r?9{+@$=o?d^G#%_5PPr9bKV zO*Xd1Q+PZf3QYBrtiQC5Dd56wLQnOtWnxU!9kT`bI;EM0hIAU8?m^ds5)tWuy8@P) zv}5}-x#}en%FQCj!^HwV-li|t&=9O%ym_xi@ok-?L}j7HDd3XJ2Q4ki?%m5&MpR^W zF`O-Gnk~w3IB?*UMlmNcvs-N2@vT=!uGfZ_@xS@>6`&pd9^XkvlvBGGMstdH=5(D? z&~~}07ji;R3Gr&JHZH=(1Y zYfe?&R*;l#!!MP*N~5P@5slTxuFE&=#hx`BtJ`WEIc7D6b!8`cNdeo!&iD2roMR`b zhuR6gA!Vt~-75)uM_|JnG%PHu4r|vCtHY|vhNYxq>cC-sN&6P*8dg?!VrOhO2mjE9 zuOB&9y`(N$5Qm@dE`t&hdPjP0$7+>PNN)&R zww;jgvOYo5I;U3QnJX85oazV^HDCjnlo$fzB68uCt>N<20w^42YnDu_o@JA!Z36>e z6>>JTD?Yu@L-(*)Tr3VJDHVsWbH^U56PZiSzFFPwQCYT7=#hxfVxzZ&)b zQU4LS;XkYt`4i**FDga;8zn2huZsC^e8~Ur&m;1G_IV5x*C8Ce!d>}6)4PCTD3NpD LTbos$zL@Yobw^8b literal 0 HcmV?d00001 diff --git a/src/test/resources/images/HiLowQuizTest.testIncorrect.Windows_7.approved.png b/src/test/resources/images/HiLowQuizTest.testIncorrect.Windows_7.approved.png new file mode 100644 index 0000000000000000000000000000000000000000..f9c64e3561f92ef924d54da31fb90775ea45725f GIT binary patch literal 15282 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 literal 0 HcmV?d00001 diff --git a/src/test/resources/images/HousesQuizTest.testCorrect.Mac_OS_X.approved.png b/src/test/resources/images/HousesQuizTest.testCorrect.Mac_OS_X.approved.png new file mode 100644 index 0000000000000000000000000000000000000000..528e7bbfc8c3581685f68d6bd0c1390f4261189c GIT binary patch literal 25849 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 literal 0 HcmV?d00001 diff --git a/src/test/resources/images/HousesQuizTest.testCorrect.Windows_7.approved.png b/src/test/resources/images/HousesQuizTest.testCorrect.Windows_7.approved.png new file mode 100644 index 0000000000000000000000000000000000000000..747412655b404649b0881480fc988e906cc06ebd GIT binary patch literal 21910 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 USouCkE*|6xPgg&ebxsLQ0G_A9zW@LL literal 0 HcmV?d00001 diff --git a/src/test/resources/images/HousesQuizTest.testIncorrect.Windows_7.approved.png b/src/test/resources/images/HousesQuizTest.testIncorrect.Windows_7.approved.png new file mode 100644 index 0000000000000000000000000000000000000000..99a80bd13f5d20c37087335fa915ffe4f250a550 GIT binary patch literal 17242 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 literal 0 HcmV?d00001 diff --git a/src/test/resources/images/PentagonCrazyQuizTest.testCorrect.Mac_OS_X.approved.png b/src/test/resources/images/PentagonCrazyQuizTest.testCorrect.Mac_OS_X.approved.png new file mode 100644 index 0000000000000000000000000000000000000000..76e2d410f2585ced677f35c7e99591f419c6470e GIT binary patch literal 14937 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 ZWDB~_1zNqAdz5`@547)>+PiB5I^NYV?ZX&)_ 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 S131rO7tfoYt2lGx?*9VsTp*hO literal 0 HcmV?d00001 diff --git a/src/test/resources/images/PentagonCrazyQuizTest.testIncorrect.Mac_OS_X.approved.png b/src/test/resources/images/PentagonCrazyQuizTest.testIncorrect.Mac_OS_X.approved.png new file mode 100644 index 0000000000000000000000000000000000000000..54df2a0ab62308b8e84e7d2ab3ee7b11175ad530 GIT binary patch literal 11571 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 VCUrPhGQi4N? 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 Ag8%>k literal 0 HcmV?d00001 diff --git a/src/test/resources/images/RecipeTests.testCircle.approved.png b/src/test/resources/images/RecipeTests.testCircle.approved.png new file mode 100644 index 0000000000000000000000000000000000000000..9a31039c08f629a48c3e1b880bb97c520553f72b GIT binary patch literal 7287 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 z%0A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

Xf&PXzH)51Y|TTEB*U}$r3Y+G-SxV`zg{wizY>o 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 literal 0 HcmV?d00001 diff --git a/src/test/resources/images/RecipeTests.testFourSquare.approved.png b/src/test/resources/images/RecipeTests.testFourSquare.approved.png new file mode 100644 index 0000000000000000000000000000000000000000..a7e9361aec641e092b7f0d3a917e4c1c7bdadad0 GIT binary patch literal 2927 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 literal 0 HcmV?d00001 diff --git a/src/test/resources/images/RecipeTests.testSimpleSquare.approved.png b/src/test/resources/images/RecipeTests.testSimpleSquare.approved.png new file mode 100644 index 0000000000000000000000000000000000000000..5740cf9c9a314e09a3a8319768b8bbe09e0dab86 GIT binary patch literal 2605 zcmeAS@N?(olHy`uVBq!ia0y~yU@B%{VBE#Q1{6u&f8ad>1Lqe{7srr_TW|09X2*m| z9QbIQdv9{4)8*|)wj|%1Y?f^;pcU9s8AA zM6gNP-r=`ph(HWyUHkIlw2Zsm6MX*seQ@CHnL9@(AANd$uBACE14FL%PjLo@4oe1x zBQgvONqh_rXBZh2o-r^809^zUHe_dLn86GdMp6Y5MpgyX3{wRXhMEP_3^NOh6+jzd zsz5d)S%JqPXjb5H2*_q6EATjkc)ucr2%1AcL4afha)_Wggcg3KMxdj|D{jBiInaqs zUKYJZtc7*AOOv41>5?~Z$?4M!G4s@-{1WTar6q=66067q14n*V(BQWv>Ri1&Q zAp}Gug%21_9hQddNkGO-W?&R5osa>VDBzgH2joDAa}W`bkqsO|#UN=g;Rq2i0vSny zZ3>3$9hMGfI)Rw6Ljh!o0}F%$7O{kgKpf+7h7sg4FoEH`28ge39h+bOSFrnZ@I}Lb z%ymUEal#}ptKgGIuZ?a~Zy}#jC&#rySD}TPf=Tuf|mA&=4ct5^#Z~Ly~4cD&j(KfF$J$mU?$(8edM<1Tn zta1;2Gk?Xg4<7zJyh~ra^V@in6vE1=#X^($Aa*t>KM7Bz^HDJU43Vwb-mruPwkp& z&$2dFB-h*g+iLvj<>HC)wvs>3ww}-~{`lj2U&NmTl`P}r!e3rp!OMfbn4YVZ^Lo1h z==BYcZEAl7^YDZ$N>@30=2pU!ttU@}yDQJ1-TTKk{>l4Y%KJ^_e?HrH;(ed{+nD?> zW_GvlTRcCre0wV>oo#E*+A8I}+Ia2m!s}9o-)qzV{3*{`_b1n1`(0dQ&cD8OIX$2f zZsG-44GMXr2FNT?x?kPb#Fhd402^i zWkx~ewV3emF5AOXC8~C6SMe>gsL^!&`=;cxdC}7y$qGk5RMhjlyDj?nucnpt?dJ;* z0#o>ni>DrYnwi&EeEhz)H+y6GqU}2`E?iSo^ZDOZ@%PiuPb)^QPk`3oDr0dMfWW{& zso0RJgrQ#&gFFYSUZ8a+9={@~0@aEjuOkO1Qelr&4+E0~iYj7DVvN=VjRPIzIV3Ca t_%-R=eg+iJBWa^Wav;uSKlE*wx%;CgO<8vP1+W>&;OXk;vd$@?2>?@$DPI5p literal 0 HcmV?d00001 diff --git a/src/test/resources/images/RecipeTests.testSpiral.approved.png b/src/test/resources/images/RecipeTests.testSpiral.approved.png new file mode 100644 index 0000000000000000000000000000000000000000..213922253d0ab67d5debb2202e84cd2b49d1c4da GIT binary patch literal 2903 zcmcguc~Dbl5P#HBRGNr#cmRr03J8L6D2J(4 zqkyHA2o4ZLE}tOa7!EbaU^xUskShd25-XQhfqpL`&MPxGOsDpb%*$?e_xIc1w|V;| z>?OEhmabU}K@i4ux04qHeMW^Km3xa90S~#VS_VOCYh9fj_R%^don0qdB6REiY;10r zY{qTsymnp4Z}u&fL>cT4_>E1>&b+$B`Mj&s`JD_Vqw~j(U2y_hFPou%w#{FZ+~#-4 z;exfp^uzL)Dx~ zLI_d^j2L*io6cGQ+4EH7Zd4TFMnxgX$|%G=Q%jjVQ%mVaLjXi&6yiofpre2r9W@K$ zBSa8n6vRh}%z{7>nbqq@h#(T6Akd1;BJwGE{VznHf3N?q=<^@2xkVqT=J<&X*qSF# zVnStthDYKFS=UC6<<_hoOK@tLhhGOgAxrqMW;~XCG$e%e{=n2^WsHfr|DM95o~JjA zf_b-J!mph4+iJ;_kWnl$EpHL9O<) zXX{H-oJu9^dhB@JE0;#6F42&W|FN(e;NP*=D%Z& zB3gR{lS!K9472;}cYjA+_Ir%Apdbm45nQKA|Fk0Q? zld@Yr;}IvuLdCg>= zyXD5_>#Soft{f|*^puG0@@svk>quC@%+mTTYwSrsQ=*eZX^cD0^*hd4;?kQw6*gK0 zr_55}Xf-Bl0atf(?3wngeZvLZbi~pZA|FU$ROi+3Q;Kf{e<=i$WtPLz@#u}v2z&9Y zltjX+Q>)J%D)1I!TBl_o;mC(H=drW zi?Bt0^0(;+kEJC~te|dN2dGnk`aAAgA McM+U8I|I)B4W8@QfdBvi literal 0 HcmV?d00001 diff --git a/src/test/resources/images/RecipeTests.testTriangleShell.approved.png b/src/test/resources/images/RecipeTests.testTriangleShell.approved.png new file mode 100644 index 0000000000000000000000000000000000000000..c88a35e16e97ebef4724426db1012e009db28dcd GIT binary patch literal 119176 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

&W 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

}bBzt!!O_i4f!p|WUG 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 literal 0 HcmV?d00001 diff --git a/src/test/resources/images/RecipeTests.testTurtleTree.approved.png b/src/test/resources/images/RecipeTests.testTurtleTree.approved.png new file mode 100644 index 0000000000000000000000000000000000000000..4a93cf5f994840a33d8d775f5c3fd9f770b46d33 GIT binary patch literal 6530 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 literal 0 HcmV?d00001 diff --git a/src/test/resources/images/SimpleSquareQuizTest.testCorrect.Mac_OS_X.approved.png b/src/test/resources/images/SimpleSquareQuizTest.testCorrect.Mac_OS_X.approved.png new file mode 100644 index 0000000000000000000000000000000000000000..6e64ed8e853b3b7aa3689d31f00571f4c84039fd GIT binary patch literal 15291 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 F{{=uTaR>ka literal 0 HcmV?d00001 diff --git a/src/test/resources/images/SimpleSquareQuizTest.testCorrect.Windows_7.approved.png b/src/test/resources/images/SimpleSquareQuizTest.testCorrect.Windows_7.approved.png new file mode 100644 index 0000000000000000000000000000000000000000..ece11e91de4ada36aac8910401f35e04754c02f0 GIT binary patch literal 11944 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 literal 0 HcmV?d00001 diff --git a/src/test/resources/images/SimpleSquareQuizTest.testIncorrect.Windows_7.approved.png b/src/test/resources/images/SimpleSquareQuizTest.testIncorrect.Windows_7.approved.png new file mode 100644 index 0000000000000000000000000000000000000000..41821a2357ab04d8a1a64d24499477e03a3caef7 GIT binary patch literal 8914 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 l%@>P&B}zN%nBsLeJ)dl3Yr#@hnhc(6 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 G#r^~QTYR_x literal 0 HcmV?d00001 diff --git a/src/test/resources/images/SpiderWebQuizTest.testCorrect.Mac_OS_X.received.png b/src/test/resources/images/SpiderWebQuizTest.testCorrect.Mac_OS_X.received.png new file mode 100644 index 0000000000000000000000000000000000000000..30e8f40a1bced3f003805cdf91223eaa72d69341 GIT binary patch literal 13255 zcmeI3XIPV2xA#F51q4(?1Oy935rIe*5Ks|9M?rd%8jw1K4gsX9C`e5xAtFMg_YOfo zdLYs}NK5EZN+N{v27Jz$IdkTDW}b8AI-lMz;R4om@3q(7d;Qjb?K>|YX#nYI*=Q*! zDCm`y9%@lg90OBOP*$I!CjZ5<{u7>pLL^f8;r%CGqpK63xF*UmS5abd=a43 zvbAbrGsGQt&>x_OXv)%v`|{@06br%{UP7dCzXh!?JMcv?oH}*t40-(BXWtKhoFaQf zaRp6DK@kWzNkMTBMn(SJoPqoiB1!%@gC&3b4{RtJFa7Cr{?O*gfnWXkdu@&;^6R|* zaI8PFISR;8e17`#7j5!+@;_ZsM%!9`&baWSG*t2PsN-}`dzY_}Ae7rWUMYe>p1Z~| zK)LOPI4Qprmq8pN4RZ8au2d`5M@$Adk?w2hi|Y!%@=|b_%kv%fyyu)O3&=2&F8J?@P zsqr`T*JG_)F#!u8X>>r#$I)hnxQ2)oU;B?ygQd1&P3Hp347qX(h^9AJj4G5q07M~-5p+DtF4^=LwX!~qqj8_v8$6KIutzz1ch zsTj%UU`7bWUf$_82BFvGRFDmH8Kea<;T4Gj7{upteK|m4wkM$D%LySB;%)nkAps++ zB`gAc+fvW}%L)-B(;4Fr7Th+b!g~#-njFKu%@B=|sW%y&W*T2z~VgjM+$!2!vMRE5TckRBs27(`@_lU*@OY>X ztnNE^8EY(&x6_u=Y4WA60Wjp;61(epoP3~mV;(fVUs?Yuz`k#BGWP;UcoN~$r>CrC zD;y=7P5o~oCIMWJs`IAXUVqELj9<<5v7GeDB{gamwrd9;I z?SWm4e_xbM$g)Lair}YrxCGf>Pg(tJnwBpem9r-R9JQUq-j!kOq=# zm?XWRVaLE1@}X&2so9#YA5D*%P|Oo2iLTti*L7`)pxvbz4OaAEebGWVViv4W`B?CS zrPZ-G%pgKIM{a1Ndyh1}(uW)PQpJ`ef=q|+N}M>1`LVFcy_h{YE8Gkf|D5f}*6v3` ziJF4^hjlOjNb%L(t4Qs685=jG#|@<}evur$ytD7WzI8!Z?o|naV13M)WvZQ0Y{&@e zxJZ=2Q19ah{9lh#hwsRMy5mA+hz1_BDp?ondtN_Vye*Hde+qRDSo5^)0N^lNyY%2~ zI8aHW{R-Ic`SnZoiKCp`o5v0JlaG;;vtWr+I_F1EF^lcWC8^jSv0$lDNSX1{=}U$; zw>+)7aXKvR0_a9c+)TuJa`x)F^XfWWjyUiLRuVZt;W^R8IN0Mpw>Me5Hj42dJoaML z&`g57F(CyjwjH2lP1pv`XFsf}MbR^F;}8Os#~O{tCPnJf^^*gHBN*JwayXf~qZ%Lb zBn?Ck-sOjbZGzOA;}n}xBHQdLT_R@|YC3Z*M~R4KFarl=F$QksrmQsfEVTRzoEI#l60K?4-MpbkNKIV2Wp z@(smC3*M=wU#?{uf|#qkXRF=e2dh$C&eod6uj9A+)OM=)(Z z0VxvtW$`|)pkTjnXU-kf!vJ85OW_jR3YFxb>{H$xy!m)z-9l5T=MfY(GPs6h+RB5n z8@WX$qmXM44%bp7=V2dh9bP+!bxXLRmuWcnk#;YhL0WXt{w_6o-!a`>17Fom_f`fs z=%VerSstc$Mc=Sv-hu9}h>G6!tDt$X0=xM zUmEM^33vs3W$AmT-kdzMucPArlh>qgO%OldPjth$j_l6R_?qFCNhamK-aAcTY*G`l zyPUXq%G_KT$R&QY$e=(DvduPf@EuCsoJzPxxPAUwf>}l?XUVj?1T*lvF;9 z|BfD$@dd{TOFSbzBXl*u3$rp5P;D%z?27D6+QYExZWnz3hSp(jc7}xl+vXJbtvWlM zJD-b8wQ&j6@yPRH09>Y{lbN|SxxtcszVEKs&q&zV#+@@VGQb2FW=pz^iutcH>Pk-&&Jdsm4o(n<0Xl z!~T4>rGhh}ya>EjJ|?=Efy0iB@l5cmU51;1R_P*Mh^7@RC9_n(P$SPV^IyJ% z@Y!&VreSL5jXCye0`OOvTCj4Z>e&ciok+j$p1uzqrm}?QCgGaO4i+(xH^nF_?i)As z#ZfNf4sz~GDGqmbiy`9+2H-A;WK_}UE!A>--B)m8;Zx<3&?+WQZ4MQgpl72ff){31 z&c6I$DBVbA`pwTpxCkcsNzYY+4S$qwvB~cEc`ZMl)`Rh17Df9_9`u-@Pr(UQ?%!2P zG^t?BXT-kpeE2XDK`*tn()Tp6%mY@krYfH#)?pL>O3ZK39p0)|>znnNho^I8V8Dh{ z5wN2YB>y0Z8=YZgm585vLXtGK?KY0@?&~|N3Y@wXb&zFerUIiPSEFCf(5ve%vv9^x(D*01Kt6k>22b>bjSTLN&ZV~ej9NUz|I0) zMD0wudt{HS3^hX;ktee%nHyauuskiYgv@<9`UplsTP6oHx7?J8^w}**Ed(Bo_(+Ie zO7~RHQ>;U>2mV<}0GfX?kuyT>3xficfhFR&=Z+xz2Oeifhw=D*vUunZ*4JhecR5}&YvokWzF+lXP!tO z=gG|6HdbYkwOyd4Ww>1+-{U#5m?F7akDCz5#H7X|V2%QMm!!0SnNx_LFmEm?eXeWwMR${E$una}9;0)_q&Xe1WG1z{Fo%co| zocQ zs7y(NwtCKGMGh|Bt#0XNKF9Vf2%g{o4`5TnAU8T(4a>#3yy+)^u0COPfcFiO_E~l@ zLz!?s7BhN`oOTnSUjA^op)=Sjy49W=a0z5JfxWGSlAId?&8SS?0SJ*Nu-3IZJB$!H zU%B#A$R6p@Bi;62Yy$bUo;c*5hkC@nx+ToL`V@=4vjINtps1(TQEoIhw7tjT8ZnxNRzX$CMUT_dg6_o zXtkpg{Zv^4691uW{E>s&=&8)loBWH9&G982 z#pcszg}r-dN7mQJT)(0vcrVc>-jyfgFtbkGz>_KIPhgUQ@_WN~U^rwuQH4(7k`mXj z$s2vTw)$zYU_NcCPH?Z~HIa|is5MT{2ebEM3~9X`DoZWy+n^LXMDXVkC$%5tB zmV$!h$q8~b*V(O3FW*;Tfov)IGkp)b0i&*j3w??Wnm0|!@3 zWTpwpNMI%f7fsD~7HWm<&Ga9Bpn0H!seM|08M6A})_C<8LqssIT6B;H$J`gtq-%cU z{zN_TEsf>IPL;8FBV-P+Kep+I21?!J$P}>>Sg+r8~Bk@=qgWF zDX`_U3NjVKcB^EN0Xzt?Qz}s$$<-=~Jihb?i0LR$px?P$TEGeJbWRu;yUxSa>31DD ziuwKkjLp7lEM>8{kUalgPHa_`27K5DVSAs}PAfAKsvzrVSngK7&4hJB!I=l$t_JsN zWs8kwrgbd^EUZj@*lFX(a=MjvO#wim@+PpSTRrPJ1J?^G9pRRxno-Z?S0OL$))Wz{ z58Ynh-6ct=nQ`1cO+%j-5c*Uh0xIImEixn3xbQJ?0v!AF5sC zNw)9$JjcZbN}O(?9kcADal=F&a|UuI3zYMTx@aFR$`P95LxAzUOzJ7no7zgG%Cvr* z^Ex}{NuHjkzPUzcY>kGW?MYEMGP7WN*lk6<rYty16ckxxQjoZO%yJ z_>Jat;b3z?wK8=;luft^gE6K^`|Y* z-&5&G-W-mh@aol@_?g~(t=n^oe70kz4;mZuUyxpDYQ%dF7`>ShoJiU-6ojgh;h8`# zUOx;KKGy23d*7ZaZ)^B5Boo1sa^_b46_$FLBXsftZYU{s*J?BDZ~J<$jcb-)*YLkN zv7=`?=sV)IS-Em&|M@t;BdAU&T>%BrgeXSZ4=&5?6YLP6cLY>`?x=@A{T#SLzwg2N zWi&BbFaEl6Qw;Z~X8f7M$t$q^B@9{R{wIdy)|;oSyY_L`OT9Y6pjAb0LM$G==Kz_9 z^U{GORl(eju1Qux?d9?&je*DgBMy^{KWc7M&706ypY*BNb~$x}r{SB+$bL8x?Z1ai zxEwpa$h+`ySDYu)OgW0y7oih*nl9>XdxUOV0(2^Y3WSOVn);}Qsij`c|8%eKFN&Lg zgGYJkPGAX#=-ftK`jh#Cj(+8M!-E$R=(-)J*wCuD+kBHTPKBzj3G*;WB3PtrA;mXo zEJS8Cxkgw|*a`FYqsL={WaCB?4@9wgF25~)oCN0C=vI5Vb_UWQepsyN@zF~So-%HI zH7V<8i5qvUuv<{Ybd^-N3nmhJw%rF&g)fwtcCu5w8yw_zMwJaJ-77dQoK%NhJFzO& z_D33M;Pq>}F%b|d9)d)@_4SnHDSD|)5OWhWdi1E!!Ed^9#DA$@a>V6_HL0?v1e-*1 z<+Lm_NN|`MTM+5lfD%ymsUzzL;`Fy*X%&-$bLJY>0&VMIRoz!g?F>mBfx2rZe88wcYsQ?`bRIC&%sk)k3t+?h02pwa%WV`l*v#K0OaD~&UVk9;ZH&z*m!(C9Hb#~{!N5LT zav3H1!64m1H%lLQY^%E4l6SK1$xKX)HDT#l$=;Y8gs0)^ReD(_jxBIl{YcK`xOZQ7 zNXY*XP-Gyku{yoH6&d&W>PwGA9l7PU6v3Fnos+F6R41jJ??vF*g=qGeYByHyl7cLP zYd1KWsCbHR6#u9DYVxtnhQ)Ldexs!hiw@+j)S{m>f9~P~>Wqvh_ND6b$pZ&pM(UNf zqV>=+3%0O&^KRO3>8ZQc#6QAcm>!&5WC_$8*fb&{8J-;sXmS*Fe%5g8^yxPMn4i!N zxNr{^U3$WR*DLYqn3UGI_IOOq%^{?wh4p(H8$#ntdT$$1p|zbm7)TYHc zIx#>VRW;~E(iS)GTOD7jM8UT&mRUjAE(3E7;F_CR!~iM{FrOLMGWG*bb-1kyUVOCO zpgpHeE#osDcd^SjzfrgNU{;7Ka{pmv*OmBLYUfEW9}kzfW`fJ4;&5{D>Xuv*^T%o}9le?*KbgH;2vnxL-ezmT#@9+Ss&Ct=EZD%! zxYne4Aigk`MGy+P?B`VOUiJ(^`GqXnBRF&Mgm3t%Z+=lxEBiihtUkr`dF>09LS9O2 zsaA^k+-NC!aC>@em&(wGH02l<`JinF>{oS9iP0A4OXTcaNxh(=OK;pAk630z*#^a8 zmWJ*(t-MW7Q*TNX`PULKM&fI!!<6zM=bdNu@2v(oOc-*BFfl}Ij8JenZ{Q-w?sLr3rh@TEb2e{s1JK=Y_1#Q zp@g=$?qu!%4(knJQ^;O8>T>=^OFj(s(T(13t~igtOb*~bu0elF%HLgs{)f#cX1<%^ zy027gRGQziXS{RtrJJ#m4iJlz|asfgZIH{fRxm`2E=%Az1M~FR&6Uxyl_m;gyqmXD_ z+E#(j!nFMYotGs`9jm@Y(71CxhTF3`_fNFpdYh_q``dPr&&(HXN5|saq0BXm zZEK$7!W0kTU1s2nU8ZJ)o?vu_Hh}^FL*w6DNZ6D`4t&!M{TE`9pfLJ*Ft+VSKR;%R$%u(-uOJm)q zi~2odNXM0wnpJUn$YPZ@!9$ry+XuuA8Iase6T?v1AXC6t6v{*Eg42X!c=LUxOr`rZ z46X|z&XRh-gS9E&wveK2M#tDCoM}9l+3rNC3>a%P;<-du<%!cimkhHqlMmMYEsmM0 zb7vJXN%m`<-meF242mJn!5A*GHZ#`4t5X?+!zAO&u5_|vvEGfwhnb7ZgYC27-ACF9 zdEL;$6aY;pZEWq9w~g7Lj6sYnzsdR_R(UC;pL`;JrsAU86_^UD2x(-frcuFkIwrh= zli5GCYW;o_8n<_Oule;CJA@HSfhb8d(17wWmFWYOB)h2BFXJ_2NTT{Sc^ueWQtw-v zH^l}S792GF%TiH^UPP^zswxR1IXPVf=Y!4ox14@hJI6C$_t3Ea1d^U!a}C^>fw?-1@C|_s!*oZs(cJy;?tS&_ zs9KA)`@k{sMVjuN@og+$O;mzeo~(DX)R;5{d7%O#EZyilk2jjR7u_1 z$wd}<4pM|n2j9IYn-kgjPX-3^rOY(tk_$J<8rPp=uUPTVBrXlOY+D4B&(~zEX7IZ1 z>s33i7}mNH#U)WRPn3o@ze#KuuW}YC`q=J`1+y1l^kQ}mn^O4utuFxYsOCv_f>!`6Mx4I>q4xB|Cl$w=kBg1A z;MotsA7(qE1)R;*^IB*;o`Hv#?AX410$g_EG_l0d($I@FXsDKV%h6}z`n;_r1&orT zYs1#KBxRaRFZP@fn8%Xqq>g6wy<3~4#cVzIH2i4XPs(=7oTx@4DCyk8MEkNzdPciEC7sY|74%H~dPnQ1L zdOgy-M=U*p@ISNp`szG0JAZSANrpw+8?7(pbs-_4CTEGvh?JWf*%fTfCe>ogWm+Y! z+!Z>%)Cq2lr`e^QOY%2$c~DpxWV}l_9Mw4K)4MCIk{cS5KXCZ@DzMy0>YeQ@w`DVL z1HAQY&usDRkCU!V!!!ic>kHcinJreye1n33gGqT=%%?>y%!GwHU3&mv3TUd6%1y5t zL&5U1HO*qTTdUylvmYzIeNtiGb=JBGxz%*Ehp)Xt8ijxFf#rY-3|gq@u%v z8EYDFR6WFyd`UN(p4DjF-FrznIfZvbwRrUr6maGF)U`uuBZMSnv{Uys3wS@>p;EQ= zs&qJL^0leo@0)j3j*&JQTnU(LbJn)liQoKKNHnk>Dg1USvDP-!!F$_L(gn-zJ(p2o z)i%dELwj0u)v=?x^VP&jE21=VzMUu=>wYq--90$GGbp^GbGk$hX20e&3jud8b`HVT z3*6rf!aLED?=5Go2D9n0lME^QhMYSS%e~HMFGNg{yP9_fah&Z7)@k^fL1>=fMeLgQ zToG@;pe{_6HP)isq(QLVAiB}53lKj@bJW@!&vBiLs822@ z-^B8hG$2=rYkn#gOtCBWaa$Z$?%!`H{vJAOL(0;|Sv5^VSN|(s@h6(b$@ex%6n9o9 z2YRdY%r@$hq|jNpCk!S55*Q}zVQS(i>bo*H^E|28!5tMcAEK(ic+G92i z7Go;JHMOpP5GNnWqgwpcn<@y3!*yIzz;D!t{xU?icI)Feesnw|n~f~~U_r*m5tt72SI7d^SGL2ngyzITp>H$y1YqGZG=*W-+~l3X7Zz$^xozC zs=$LInIDM4B*#iWeG0s1aG7l-ksdH4gNE{)<1>i z9r0sq0gT=kf@P z($7*RuJg)Hzi%`q-=J;QFJ7Rb*-DTS^IEz_w|p_@)_C0C1XrFmF2unC6ZYDBOY{sS z|GUMzWvu*z9hsKS9pys@wvEwbv`X3@qSb!NI%-t{S8u=fmqe}*bvd?Q=10vCdPy(m zpiv-7qVw1(B&_(NZ-adAH*OIh(3^fcm?|gSLARQhUOgs+{Tv!3a?-iFhP(%651UA0 z_wH4gZuz?9;LjiYD7(%4@f;g^MT>9Ju;H5E;t-x}L0#r#2oxt-m`upG~A z&v>cK>~Zn4scE0!L;|=Qq`kv(Z8M&mg&n&&z`yf~2`A}pIlX&EUmtH&X+R&OsaQf;7^XVq_WM{Z+$`F8jXjxQOH>))1g#V!c!vF`s9; za}R${ugH*JYxy|p9&}seY1-N&-<}XT$HVt=^RG%^Ol+gn7HcI3%BJr9yae54Td?gP zmc9UkeqUOa+uU}nU(v|Fu`$kl_k!Z3;OVztZwT$> zlDv)_`o@1Ik?G3qJgN@^K@@zIO(k&lD`!XUvK&hC9|Jc`Ij>~Y)NXN~ouI1@lh6tX2Ze z^v%r!k5f}CJ&992*ZY9y+Jy8?s07zNDMlwgc-VOrLRTt;mGT^dL-6Gq;AIr!+rmN$ zyO9{&$)jO!K>6>9JDhsEwJe|ENU~^OUPN>Pu;8K*x0rdIPiqH`i8W5iVu6)$86R7w5|5$sTliU+CGpB8P5P_BM{cIg$Elusu#kRU!nz2$qsUa(UE^DI=#( zkpF*ZqP4)USZbA>qeIv7P-XE&f|ieFOx)yfZ_TM0|EQ}9T2dnND&Z9|<2_eB661$r zk1k4>3n?tnFp8`cwkzAslD*y@NuHD;f_@9LznGll;}}$7@Z-1!=e1I{ajG_;cxQ3m*_&(VqX|h{*OG9cRj(=6E?5yYg_ba2! zS5y;@E4ctL42Sik|KpwBr;s6ITid|T+|)`|ih&`>6G{Yi%3eDqRS}?u+)3a`B?sM) zpLwg$FN~E=3DHv@ZWI0>lm$2c@~%he^{-?pVzTgVvt+Ggv`nag=kU#g|8lYOPhKVX zw{5=t|M&07f&G2c?I;tGH{3tId+=-Uf0LO0vdz)M|Dxdd?Ux^ZKh_^T=WwI`nYj5w zo1=&SI-@3Z;upK~nE&8u(EkIxWRa=> literal 0 HcmV?d00001 diff --git a/src/test/resources/images/SpiderWebQuizTest.testCorrect.Windows_7.approved.png b/src/test/resources/images/SpiderWebQuizTest.testCorrect.Windows_7.approved.png new file mode 100644 index 0000000000000000000000000000000000000000..8988283fed9e4e61ad354f5d616ef12ba0a43798 GIT binary patch literal 35218 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 QAb|fAWL2S+(x!p`3!bnK#Q*>R literal 0 HcmV?d00001 diff --git a/src/test/resources/images/SpiderWebQuizTest.testIncorrect.Mac_OS_X.approved.png b/src/test/resources/images/SpiderWebQuizTest.testIncorrect.Mac_OS_X.approved.png new file mode 100644 index 0000000000000000000000000000000000000000..6799a25906b94f0b6a1cf4898056cd16ec805be1 GIT binary patch literal 13525 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 B=wJW< literal 0 HcmV?d00001 diff --git a/src/test/resources/images/TortoiseTest.testSimpleSquare.approved.png b/src/test/resources/images/TortoiseTest.testSimpleSquare.approved.png new file mode 100644 index 0000000000000000000000000000000000000000..b5647b3ab9bf32209b71d51455cef57480ab3396 GIT binary patch literal 2599 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 Zd|F?;Kwo?TJn;pcva&snKX&oP{{esDY{LKm literal 0 HcmV?d00001 diff --git a/src/test/resources/images/TurtlePanelTest.testImageForBackground.approved.png b/src/test/resources/images/TurtlePanelTest.testImageForBackground.approved.png new file mode 100644 index 0000000000000000000000000000000000000000..0285c523f8122e6c628776abb3f266231017c205 GIT binary patch literal 37023 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 + + http://teachingkidsprogramming.com/ + Teaching Kids Programming + \ No newline at end of file From 0a8fe134605709ceb6b99c25eb0c81af34df44aa Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Wed, 4 Mar 2015 10:53:47 -0800 Subject: [PATCH 005/111] Internalized required classes from ApprovalTests --- .classpath | 58 +- .settings/org.eclipse.core.resources.prefs | 12 +- .settings/org.eclipse.jdt.core.prefs | 10 +- .settings/org.eclipse.m2e.core.prefs | 8 +- pom.xml | 215 ++- src/main/java/com/spun/util/ArrayUtils.java | 296 ++++ src/main/java/com/spun/util/Asserts.java | 78 + .../com/spun/util/ByteArrayDataSource.java | 124 ++ src/main/java/com/spun/util/CallMethod.java | 30 + src/main/java/com/spun/util/ClassUtils.java | 136 ++ src/main/java/com/spun/util/Colors.java | 1551 +++++++++++++++++ src/main/java/com/spun/util/Comparator.java | 7 + .../java/com/spun/util/ConditionListener.java | 14 + .../com/spun/util/ConfigXMLFileReader.java | 56 + .../com/spun/util/ConfigXMLFileWriter.java | 102 ++ .../com/spun/util/ConfigXMLNodeExtractor.java | 36 + src/main/java/com/spun/util/Country.java | 48 + .../com/spun/util/DatabaseConfiguration.java | 186 ++ .../util/DatabaseConfigurationWrapper.java | 12 + .../java/com/spun/util/DatabaseUtils.java | 681 ++++++++ .../java/com/spun/util/DateDifference.java | 279 +++ src/main/java/com/spun/util/DateUtils.java | 297 ++++ .../java/com/spun/util/DualOutputStream.java | 98 ++ .../java/com/spun/util/EmbeddedSorter.java | 26 + .../java/com/spun/util/EnabledConditions.java | 34 + .../com/spun/util/FormattedException.java | 12 + src/main/java/com/spun/util/FrameCloser.java | 16 + .../com/spun/util/LambdaThreadLauncher.java | 27 + src/main/java/com/spun/util/Memory.java | 44 + .../com/spun/util/MethodExecutionPath.java | 199 +++ src/main/java/com/spun/util/MethodSorter.java | 203 +++ src/main/java/com/spun/util/MultiSorter.java | 25 + src/main/java/com/spun/util/MySystem.java | 521 ++++++ src/main/java/com/spun/util/NameUtils.java | 120 ++ .../spun/util/NotImplementedException.java | 10 + src/main/java/com/spun/util/NumberUtils.java | 284 +++ src/main/java/com/spun/util/ObjectUtils.java | 282 +++ src/main/java/com/spun/util/PhoneNumber.java | 259 +++ src/main/java/com/spun/util/PrintUtils.java | 92 + src/main/java/com/spun/util/ProgessFrame.java | 111 ++ .../com/spun/util/SearchingFileFilter.java | 48 + .../spun/util/SearchingFileFilterTest.java | 21 + .../spun/util/StackTraceReflectionResult.java | 34 + src/main/java/com/spun/util/State.java | 81 + .../java/com/spun/util/StateToPostalCode.java | 176 ++ .../spun/util/StringIdentifierGenerator.java | 41 + src/main/java/com/spun/util/StringUtils.java | 586 +++++++ src/main/java/com/spun/util/SystemUtils.java | 30 + src/main/java/com/spun/util/TestUtils.java | 275 +++ .../java/com/spun/util/ThreadLauncher.java | 86 + src/main/java/com/spun/util/ThreadUtils.java | 16 + src/main/java/com/spun/util/Threads.java | 23 + src/main/java/com/spun/util/TimedObject.java | 71 + src/main/java/com/spun/util/Tuple.java | 25 + .../com/spun/util/WhiteSpaceStripper.java | 201 +++ src/main/java/com/spun/util/WindowUtils.java | 75 + .../database/AutomaticVariableSetter.java | 18 + .../database/CircularRedundancyError.java | 36 + .../spun/util/database/ColumnMetadata.java | 146 ++ .../com/spun/util/database/DatabaseCache.java | 40 + .../util/database/DatabaseLifeCycleUtils.java | 298 ++++ .../spun/util/database/DatabaseLoader.java | 38 + .../util/database/DatabaseLoadingTracker.java | 40 + .../spun/util/database/DatabaseObject.java | 104 ++ .../DatabaseRelationshipPersistent.java | 9 + .../database/DatabaseTransactionInfo.java | 57 + .../java/com/spun/util/database/Metadata.java | 18 + .../util/database/NullDatabaseObject.java | 42 + .../spun/util/database/ResultSetWriter.java | 51 + .../ReverseOrderLimitQueryWriter.java | 135 ++ .../database/SQLInformationException.java | 41 + .../java/com/spun/util/database/SQLQuery.java | 338 ++++ .../com/spun/util/database/SQLQueryUtils.java | 99 ++ .../spun/util/database/SQLQueryWriter.java | 11 + .../spun/util/database/SQLStatementUtils.java | 55 + .../java/com/spun/util/database/SQLUtils.java | 145 ++ .../java/com/spun/util/database/SQLWhere.java | 159 ++ .../spun/util/database/SimpleQueryWriter.java | 132 ++ .../util/database/SqlConnectionException.java | 41 + .../com/spun/util/database/SshConnection.java | 319 ++++ .../util/database/SshDatabaseWrapper.java | 53 + .../java/com/spun/util/database/Syncable.java | 6 + .../spun/util/database/TemporaryCache.java | 97 ++ .../database/XmlDatabaseMapExtractor.java | 60 + .../java/com/spun/util/date/DateRange.java | 182 ++ .../com/spun/util/date/DateRangeUtils.java | 17 + .../java/com/spun/util/filters/AndFilter.java | 33 + .../com/spun/util/filters/ClassFilter.java | 18 + .../java/com/spun/util/filters/Filter.java | 19 + .../java/com/spun/util/filters/FilterIn.java | 33 + .../com/spun/util/filters/FilterUtils.java | 78 + .../com/spun/util/filters/MethodFilter.java | 79 + .../util/filters/MethodFilterBuilder.java | 42 + .../java/com/spun/util/filters/OrFilter.java | 33 + .../spun/util/introspection/ClassGetter.java | 31 + .../spun/util/io/CharSequenceInputStream.java | 12 + .../util/io/CommaDelimitedFileParser.java | 151 ++ src/main/java/com/spun/util/io/FTPConfig.java | 22 + .../java/com/spun/util/io/FileMonitor.java | 69 + .../com/spun/util/io/FileMonitorTest.java | 52 + src/main/java/com/spun/util/io/FileUtils.java | 345 ++++ .../io/InternetConnectivityException.java | 77 + src/main/java/com/spun/util/io/NetUtils.java | 116 ++ .../spun/util/io/SimpleDirectoryFilter.java | 35 + .../com/spun/util/io/SimpleFileFilter.java | 32 + .../spun/util/io/SpaceDelimitedReader.java | 89 + .../util/io/StackElementLevelSelector.java | 17 + .../spun/util/io/StackElementSelector.java | 6 + .../spun/util/io/TabDelimitedFileReader.java | 77 + .../com/spun/util/io/XMLNodeExtractor.java | 35 + src/main/java/com/spun/util/io/XMLUtils.java | 107 ++ src/main/java/com/spun/util/io/ZipUtils.java | 98 ++ .../io/filefilters/ExtenstionFileFilter.java | 22 + .../io/filefilters/JavaClassFileFilter.java | 23 + .../com/spun/util/io/xml/BasicExtractor.java | 106 ++ .../util/io/xml/DatabaseObjectXMLUtils.java | 75 + .../com/spun/util/io/xml/XMLSerializable.java | 24 + .../com/spun/util/io/xml/XmlExtractable.java | 12 + .../com/spun/util/io/xml/XmlExtractor.java | 18 + .../spun/util/io/xml/XmlExtractorUtil.java | 74 + .../java/com/spun/util/io/xml/XmlMap.java | 132 ++ .../com/spun/util/io/xml/XmlMapExtractor.java | 44 + .../spun/util/io/xml/XmlMapTranslator.java | 21 + .../com/spun/util/io/xml/XmlTranslator.java | 75 + .../com/spun/util/parser/CurrencyAmount.java | 27 + .../com/spun/util/parser/FileLocator.java | 63 + .../com/spun/util/parser/JarFileLocator.java | 33 + .../com/spun/util/parser/ListSection.java | 174 ++ .../com/spun/util/parser/ListSectionInfo.java | 85 + .../java/com/spun/util/parser/MassAmount.java | 65 + .../com/spun/util/parser/ParserCommons.java | 277 +++ .../spun/util/parser/PercentageAmount.java | 61 + .../com/spun/util/parser/ResourceLocator.java | 7 + .../spun/util/parser/SteppingIterator.java | 108 ++ .../com/spun/util/parser/TemplateArray.java | 67 + .../com/spun/util/parser/TemplateDate.java | 193 ++ .../com/spun/util/parser/TemplateDouble.java | 136 ++ .../com/spun/util/parser/TemplateError.java | 84 + .../spun/util/parser/TemplateNumberUtils.java | 105 ++ .../spun/util/parser/TemplateStringUtils.java | 177 ++ .../com/spun/util/parser/Templateparsing.jj | 438 +++++ .../com/spun/util/parser/VelocityList.java | 156 ++ .../persistence/DatabaseObjectDeletor.java | 26 + .../util/persistence/DatabaseObjectSaver.java | 26 + .../com/spun/util/persistence/Deletor.java | 6 + .../util/persistence/ExecutableQuery.java | 7 + .../com/spun/util/persistence/Loader.java | 7 + .../java/com/spun/util/persistence/Saver.java | 7 + .../util/persistence/SavingException.java | 7 + .../com/spun/util/persistence/SqlLoader.java | 33 + .../com/spun/util/servlets/BasicServlet.java | 328 ++++ .../spun/util/servlets/EasyEmailLoader.java | 26 + .../com/spun/util/servlets/EmailServer.java | 330 ++++ .../com/spun/util/servlets/ErrorToString.java | 17 + .../util/servlets/ExpiredSessionError.java | 27 + .../spun/util/servlets/InvokerServlet.java | 113 ++ .../com/spun/util/servlets/PassThrough.java | 101 ++ .../com/spun/util/servlets/ProgressBar.java | 12 + .../servlets/SecondaryErrorProcessor.java | 8 + .../servlets/ServletLogWriterFactory.java | 54 + .../servlets/ServletParameterException.java | 21 + .../util/servlets/ServletSynchronizer.java | 57 + .../com/spun/util/servlets/StageServlet.java | 14 + .../spun/util/servlets/StageServletUtils.java | 69 + .../util/servlets/SynchronizedServlet.java | 16 + .../spun/util/servlets/ValidationError.java | 182 ++ .../spun/util/servlets/ValidationTracker.java | 67 + src/main/java/com/spun/util/timers/Clock.java | 9 + .../java/com/spun/util/timers/Counter.java | 105 ++ .../java/com/spun/util/timers/EventTime.java | 222 +++ .../java/com/spun/util/timers/EventTimer.java | 42 + .../java/com/spun/util/timers/LapTime.java | 81 + .../spun/util/timers/LapTimeStatistics.java | 78 + .../java/com/spun/util/timers/LapTimer.java | 171 ++ .../spun/util/timers/MetricsDisplayer.java | 36 + .../com/spun/util/velocity/ContextAware.java | 41 + .../com/spun/util/velocity/ParseCall.java | 6 + .../spun/util/velocity/ParserDateUtils.java | 113 ++ .../util/velocity/ServletContextLoader.java | 95 + .../util/velocity/StringResourceLoader.java | 55 + .../spun/util/velocity/TestableUberspect.java | 275 +++ .../spun/util/velocity/VelocityParser.java | 188 ++ .../util/velocity/VelocityParsingError.java | 32 + .../java/org/approvaltests/Approvals.java | 240 +++ .../org/approvaltests/ReporterFactory.java | 107 ++ .../approvers/ApprovalApprover.java | 11 + .../approvaltests/approvers/FileApprover.java | 63 + .../core/ApprovalFailureOverrider.java | 7 + .../core/ApprovalFailureReporter.java | 6 + .../core/ApprovalReporterWithCleanUp.java | 6 + .../approvaltests/core/ApprovalWriter.java | 9 + .../approvaltests/namer/ApprovalNamer.java | 7 + .../approvaltests/namer/ApprovalResults.java | 15 + .../org/approvaltests/namer/IdeLabeller.java | 24 + .../namer/JUnitStackTraceNamer.java | 77 + .../namer/MultipleFilesLabeller.java | 17 + .../org/approvaltests/namer/NamerFactory.java | 20 + .../namer/OsEnvironmentLabeller.java | 12 + .../reporters/ClipboardReporter.java | 47 + .../reporters/DelayedClipboardReporter.java | 31 + .../approvaltests/reporters/DiffReporter.java | 13 + .../reporters/EnvironmentAwareReporter.java | 8 + .../reporters/ExecutableQueryFailure.java | 43 + .../reporters/FileLauncherReporter.java | 20 + .../reporters/FirstWorkingReporter.java | 31 + .../reporters/GenericDiffReporter.java | 84 + .../reporters/ImageReporter.java | 14 + .../reporters/ImageWebReporter.java | 27 + .../reporters/JunitReporter.java | 34 + .../reporters/MultiReporter.java | 41 + .../reporters/MultipleExceptions.java | 43 + .../reporters/NotePadLancher.java | 16 + .../reporters/QuietReporter.java | 16 + .../reporters/TextWebReporter.java | 21 + .../approvaltests/reporters/UseReporter.java | 11 + .../reporters/macosx/DiffMergeReporter.java | 17 + .../macosx/KaleidoscopeDiffReporter.java | 24 + .../reporters/macosx/MacDiffReporter.java | 12 + .../reporters/macosx/P4MergeReporter.java | 26 + .../reporters/macosx/TkDiffReporter.java | 17 + .../windows/BeyondCompareReporter.java | 17 + .../windows/TortoiseDiffReporter.java | 12 + .../windows/TortoiseImageDiffReporter.java | 13 + .../windows/TortoiseTextDiffReporter.java | 21 + .../reporters/windows/WinMergeReporter.java | 18 + .../windows/WindowsDiffReporter.java | 12 + .../writers/ApprovalBinaryFileWriter.java | 50 + .../writers/ApprovalTextWriter.java | 34 + .../writers/ApprovalXmlWriter.java | 30 + .../writers/ComponentApprovalWriter.java | 52 + .../writers/DirectoryToDirectoryWriter.java | 31 + .../writers/FileApprovalWriter.java | 33 + .../writers/FlyingSaucerHtmlToPdfWriter.java | 42 + .../writers/ImageApprovalWriter.java | 33 + .../writers/ResultSetApprovalWriter.java | 45 + .../org/approvaltests/writers/Writer.java | 7 + src/main/java/org/lambda/actions/Action0.java | 6 + src/main/java/org/lambda/actions/Action1.java | 6 + src/main/java/org/lambda/actions/Action2.java | 6 + src/main/java/org/lambda/actions/Action3.java | 6 + src/main/java/org/lambda/actions/Action4.java | 6 + src/main/java/org/lambda/actions/Action5.java | 6 + src/main/java/org/lambda/actions/Action6.java | 6 + src/main/java/org/lambda/actions/Action7.java | 6 + src/main/java/org/lambda/actions/Action8.java | 6 + src/main/java/org/lambda/actions/Action9.java | 6 + .../lambda/actions/implementations/A0.java | 23 + .../lambda/actions/implementations/A1.java | 23 + .../java/org/lambda/functions/Function0.java | 6 + .../java/org/lambda/functions/Function1.java | 6 + .../java/org/lambda/functions/Function2.java | 6 + .../java/org/lambda/functions/Function3.java | 6 + .../java/org/lambda/functions/Function4.java | 6 + .../java/org/lambda/functions/Function5.java | 6 + .../java/org/lambda/functions/Function6.java | 6 + .../java/org/lambda/functions/Function7.java | 6 + .../java/org/lambda/functions/Function8.java | 6 + .../java/org/lambda/functions/Function9.java | 6 + .../lambda/functions/implementations/B1.java | 9 + .../lambda/functions/implementations/F0.java | 15 + .../lambda/functions/implementations/F1.java | 16 + .../lambda/functions/implementations/F2.java | 19 + .../lambda/functions/implementations/F3.java | 20 + .../lambda/functions/implementations/F4.java | 21 + .../lambda/functions/implementations/F5.java | 22 + .../lambda/functions/implementations/F6.java | 23 + .../lambda/functions/implementations/F7.java | 24 + .../lambda/functions/implementations/F8.java | 25 + .../lambda/functions/implementations/F9.java | 26 + .../functions/implementations/Function.java | 147 ++ .../lambda/functions/implementations/S1.java | 9 + src/main/java/org/lambda/query/Echo1.java | 14 + src/main/java/org/lambda/query/Loops.java | 14 + src/main/java/org/lambda/query/OrderBy.java | 29 + .../java/org/lambda/query/ParallelLoops.java | 43 + .../java/org/lambda/query/ParallelQuery.java | 50 + src/main/java/org/lambda/query/Query.java | 137 ++ .../org/teachingextensions/utils/Viewer.java | 2 +- .../logo/tests/ColorGeneration.java | 2 +- 279 files changed, 21242 insertions(+), 131 deletions(-) create mode 100644 src/main/java/com/spun/util/ArrayUtils.java create mode 100644 src/main/java/com/spun/util/Asserts.java create mode 100644 src/main/java/com/spun/util/ByteArrayDataSource.java create mode 100644 src/main/java/com/spun/util/CallMethod.java create mode 100644 src/main/java/com/spun/util/ClassUtils.java create mode 100644 src/main/java/com/spun/util/Colors.java create mode 100644 src/main/java/com/spun/util/Comparator.java create mode 100644 src/main/java/com/spun/util/ConditionListener.java create mode 100644 src/main/java/com/spun/util/ConfigXMLFileReader.java create mode 100644 src/main/java/com/spun/util/ConfigXMLFileWriter.java create mode 100644 src/main/java/com/spun/util/ConfigXMLNodeExtractor.java create mode 100644 src/main/java/com/spun/util/Country.java create mode 100644 src/main/java/com/spun/util/DatabaseConfiguration.java create mode 100644 src/main/java/com/spun/util/DatabaseConfigurationWrapper.java create mode 100644 src/main/java/com/spun/util/DatabaseUtils.java create mode 100644 src/main/java/com/spun/util/DateDifference.java create mode 100644 src/main/java/com/spun/util/DateUtils.java create mode 100644 src/main/java/com/spun/util/DualOutputStream.java create mode 100644 src/main/java/com/spun/util/EmbeddedSorter.java create mode 100644 src/main/java/com/spun/util/EnabledConditions.java create mode 100644 src/main/java/com/spun/util/FormattedException.java create mode 100644 src/main/java/com/spun/util/FrameCloser.java create mode 100644 src/main/java/com/spun/util/LambdaThreadLauncher.java create mode 100644 src/main/java/com/spun/util/Memory.java create mode 100644 src/main/java/com/spun/util/MethodExecutionPath.java create mode 100644 src/main/java/com/spun/util/MethodSorter.java create mode 100644 src/main/java/com/spun/util/MultiSorter.java create mode 100644 src/main/java/com/spun/util/MySystem.java create mode 100644 src/main/java/com/spun/util/NameUtils.java create mode 100644 src/main/java/com/spun/util/NotImplementedException.java create mode 100644 src/main/java/com/spun/util/NumberUtils.java create mode 100644 src/main/java/com/spun/util/ObjectUtils.java create mode 100644 src/main/java/com/spun/util/PhoneNumber.java create mode 100644 src/main/java/com/spun/util/PrintUtils.java create mode 100644 src/main/java/com/spun/util/ProgessFrame.java create mode 100644 src/main/java/com/spun/util/SearchingFileFilter.java create mode 100644 src/main/java/com/spun/util/SearchingFileFilterTest.java create mode 100644 src/main/java/com/spun/util/StackTraceReflectionResult.java create mode 100644 src/main/java/com/spun/util/State.java create mode 100644 src/main/java/com/spun/util/StateToPostalCode.java create mode 100644 src/main/java/com/spun/util/StringIdentifierGenerator.java create mode 100644 src/main/java/com/spun/util/StringUtils.java create mode 100644 src/main/java/com/spun/util/SystemUtils.java create mode 100644 src/main/java/com/spun/util/TestUtils.java create mode 100644 src/main/java/com/spun/util/ThreadLauncher.java create mode 100644 src/main/java/com/spun/util/ThreadUtils.java create mode 100644 src/main/java/com/spun/util/Threads.java create mode 100644 src/main/java/com/spun/util/TimedObject.java create mode 100644 src/main/java/com/spun/util/Tuple.java create mode 100644 src/main/java/com/spun/util/WhiteSpaceStripper.java create mode 100644 src/main/java/com/spun/util/WindowUtils.java create mode 100644 src/main/java/com/spun/util/database/AutomaticVariableSetter.java create mode 100644 src/main/java/com/spun/util/database/CircularRedundancyError.java create mode 100644 src/main/java/com/spun/util/database/ColumnMetadata.java create mode 100644 src/main/java/com/spun/util/database/DatabaseCache.java create mode 100644 src/main/java/com/spun/util/database/DatabaseLifeCycleUtils.java create mode 100644 src/main/java/com/spun/util/database/DatabaseLoader.java create mode 100644 src/main/java/com/spun/util/database/DatabaseLoadingTracker.java create mode 100644 src/main/java/com/spun/util/database/DatabaseObject.java create mode 100644 src/main/java/com/spun/util/database/DatabaseRelationshipPersistent.java create mode 100644 src/main/java/com/spun/util/database/DatabaseTransactionInfo.java create mode 100644 src/main/java/com/spun/util/database/Metadata.java create mode 100644 src/main/java/com/spun/util/database/NullDatabaseObject.java create mode 100644 src/main/java/com/spun/util/database/ResultSetWriter.java create mode 100644 src/main/java/com/spun/util/database/ReverseOrderLimitQueryWriter.java create mode 100644 src/main/java/com/spun/util/database/SQLInformationException.java create mode 100644 src/main/java/com/spun/util/database/SQLQuery.java create mode 100644 src/main/java/com/spun/util/database/SQLQueryUtils.java create mode 100644 src/main/java/com/spun/util/database/SQLQueryWriter.java create mode 100644 src/main/java/com/spun/util/database/SQLStatementUtils.java create mode 100644 src/main/java/com/spun/util/database/SQLUtils.java create mode 100644 src/main/java/com/spun/util/database/SQLWhere.java create mode 100644 src/main/java/com/spun/util/database/SimpleQueryWriter.java create mode 100644 src/main/java/com/spun/util/database/SqlConnectionException.java create mode 100644 src/main/java/com/spun/util/database/SshConnection.java create mode 100644 src/main/java/com/spun/util/database/SshDatabaseWrapper.java create mode 100644 src/main/java/com/spun/util/database/Syncable.java create mode 100644 src/main/java/com/spun/util/database/TemporaryCache.java create mode 100644 src/main/java/com/spun/util/database/XmlDatabaseMapExtractor.java create mode 100644 src/main/java/com/spun/util/date/DateRange.java create mode 100644 src/main/java/com/spun/util/date/DateRangeUtils.java create mode 100644 src/main/java/com/spun/util/filters/AndFilter.java create mode 100644 src/main/java/com/spun/util/filters/ClassFilter.java create mode 100644 src/main/java/com/spun/util/filters/Filter.java create mode 100644 src/main/java/com/spun/util/filters/FilterIn.java create mode 100644 src/main/java/com/spun/util/filters/FilterUtils.java create mode 100644 src/main/java/com/spun/util/filters/MethodFilter.java create mode 100644 src/main/java/com/spun/util/filters/MethodFilterBuilder.java create mode 100644 src/main/java/com/spun/util/filters/OrFilter.java create mode 100644 src/main/java/com/spun/util/introspection/ClassGetter.java create mode 100644 src/main/java/com/spun/util/io/CharSequenceInputStream.java create mode 100644 src/main/java/com/spun/util/io/CommaDelimitedFileParser.java create mode 100644 src/main/java/com/spun/util/io/FTPConfig.java create mode 100644 src/main/java/com/spun/util/io/FileMonitor.java create mode 100644 src/main/java/com/spun/util/io/FileMonitorTest.java create mode 100644 src/main/java/com/spun/util/io/FileUtils.java create mode 100644 src/main/java/com/spun/util/io/InternetConnectivityException.java create mode 100644 src/main/java/com/spun/util/io/NetUtils.java create mode 100644 src/main/java/com/spun/util/io/SimpleDirectoryFilter.java create mode 100644 src/main/java/com/spun/util/io/SimpleFileFilter.java create mode 100644 src/main/java/com/spun/util/io/SpaceDelimitedReader.java create mode 100644 src/main/java/com/spun/util/io/StackElementLevelSelector.java create mode 100644 src/main/java/com/spun/util/io/StackElementSelector.java create mode 100644 src/main/java/com/spun/util/io/TabDelimitedFileReader.java create mode 100644 src/main/java/com/spun/util/io/XMLNodeExtractor.java create mode 100644 src/main/java/com/spun/util/io/XMLUtils.java create mode 100644 src/main/java/com/spun/util/io/ZipUtils.java create mode 100644 src/main/java/com/spun/util/io/filefilters/ExtenstionFileFilter.java create mode 100644 src/main/java/com/spun/util/io/filefilters/JavaClassFileFilter.java create mode 100644 src/main/java/com/spun/util/io/xml/BasicExtractor.java create mode 100644 src/main/java/com/spun/util/io/xml/DatabaseObjectXMLUtils.java create mode 100644 src/main/java/com/spun/util/io/xml/XMLSerializable.java create mode 100644 src/main/java/com/spun/util/io/xml/XmlExtractable.java create mode 100644 src/main/java/com/spun/util/io/xml/XmlExtractor.java create mode 100644 src/main/java/com/spun/util/io/xml/XmlExtractorUtil.java create mode 100644 src/main/java/com/spun/util/io/xml/XmlMap.java create mode 100644 src/main/java/com/spun/util/io/xml/XmlMapExtractor.java create mode 100644 src/main/java/com/spun/util/io/xml/XmlMapTranslator.java create mode 100644 src/main/java/com/spun/util/io/xml/XmlTranslator.java create mode 100644 src/main/java/com/spun/util/parser/CurrencyAmount.java create mode 100644 src/main/java/com/spun/util/parser/FileLocator.java create mode 100644 src/main/java/com/spun/util/parser/JarFileLocator.java create mode 100644 src/main/java/com/spun/util/parser/ListSection.java create mode 100644 src/main/java/com/spun/util/parser/ListSectionInfo.java create mode 100644 src/main/java/com/spun/util/parser/MassAmount.java create mode 100644 src/main/java/com/spun/util/parser/ParserCommons.java create mode 100644 src/main/java/com/spun/util/parser/PercentageAmount.java create mode 100644 src/main/java/com/spun/util/parser/ResourceLocator.java create mode 100644 src/main/java/com/spun/util/parser/SteppingIterator.java create mode 100644 src/main/java/com/spun/util/parser/TemplateArray.java create mode 100644 src/main/java/com/spun/util/parser/TemplateDate.java create mode 100644 src/main/java/com/spun/util/parser/TemplateDouble.java create mode 100644 src/main/java/com/spun/util/parser/TemplateError.java create mode 100644 src/main/java/com/spun/util/parser/TemplateNumberUtils.java create mode 100644 src/main/java/com/spun/util/parser/TemplateStringUtils.java create mode 100644 src/main/java/com/spun/util/parser/Templateparsing.jj create mode 100644 src/main/java/com/spun/util/parser/VelocityList.java create mode 100644 src/main/java/com/spun/util/persistence/DatabaseObjectDeletor.java create mode 100644 src/main/java/com/spun/util/persistence/DatabaseObjectSaver.java create mode 100644 src/main/java/com/spun/util/persistence/Deletor.java create mode 100644 src/main/java/com/spun/util/persistence/ExecutableQuery.java create mode 100644 src/main/java/com/spun/util/persistence/Loader.java create mode 100644 src/main/java/com/spun/util/persistence/Saver.java create mode 100644 src/main/java/com/spun/util/persistence/SavingException.java create mode 100644 src/main/java/com/spun/util/persistence/SqlLoader.java create mode 100644 src/main/java/com/spun/util/servlets/BasicServlet.java create mode 100644 src/main/java/com/spun/util/servlets/EasyEmailLoader.java create mode 100644 src/main/java/com/spun/util/servlets/EmailServer.java create mode 100644 src/main/java/com/spun/util/servlets/ErrorToString.java create mode 100644 src/main/java/com/spun/util/servlets/ExpiredSessionError.java create mode 100644 src/main/java/com/spun/util/servlets/InvokerServlet.java create mode 100644 src/main/java/com/spun/util/servlets/PassThrough.java create mode 100644 src/main/java/com/spun/util/servlets/ProgressBar.java create mode 100644 src/main/java/com/spun/util/servlets/SecondaryErrorProcessor.java create mode 100644 src/main/java/com/spun/util/servlets/ServletLogWriterFactory.java create mode 100644 src/main/java/com/spun/util/servlets/ServletParameterException.java create mode 100644 src/main/java/com/spun/util/servlets/ServletSynchronizer.java create mode 100644 src/main/java/com/spun/util/servlets/StageServlet.java create mode 100644 src/main/java/com/spun/util/servlets/StageServletUtils.java create mode 100644 src/main/java/com/spun/util/servlets/SynchronizedServlet.java create mode 100644 src/main/java/com/spun/util/servlets/ValidationError.java create mode 100644 src/main/java/com/spun/util/servlets/ValidationTracker.java create mode 100644 src/main/java/com/spun/util/timers/Clock.java create mode 100644 src/main/java/com/spun/util/timers/Counter.java create mode 100644 src/main/java/com/spun/util/timers/EventTime.java create mode 100644 src/main/java/com/spun/util/timers/EventTimer.java create mode 100644 src/main/java/com/spun/util/timers/LapTime.java create mode 100644 src/main/java/com/spun/util/timers/LapTimeStatistics.java create mode 100644 src/main/java/com/spun/util/timers/LapTimer.java create mode 100644 src/main/java/com/spun/util/timers/MetricsDisplayer.java create mode 100644 src/main/java/com/spun/util/velocity/ContextAware.java create mode 100644 src/main/java/com/spun/util/velocity/ParseCall.java create mode 100644 src/main/java/com/spun/util/velocity/ParserDateUtils.java create mode 100644 src/main/java/com/spun/util/velocity/ServletContextLoader.java create mode 100644 src/main/java/com/spun/util/velocity/StringResourceLoader.java create mode 100644 src/main/java/com/spun/util/velocity/TestableUberspect.java create mode 100644 src/main/java/com/spun/util/velocity/VelocityParser.java create mode 100644 src/main/java/com/spun/util/velocity/VelocityParsingError.java create mode 100644 src/main/java/org/approvaltests/Approvals.java create mode 100644 src/main/java/org/approvaltests/ReporterFactory.java create mode 100644 src/main/java/org/approvaltests/approvers/ApprovalApprover.java create mode 100644 src/main/java/org/approvaltests/approvers/FileApprover.java create mode 100644 src/main/java/org/approvaltests/core/ApprovalFailureOverrider.java create mode 100644 src/main/java/org/approvaltests/core/ApprovalFailureReporter.java create mode 100644 src/main/java/org/approvaltests/core/ApprovalReporterWithCleanUp.java create mode 100644 src/main/java/org/approvaltests/core/ApprovalWriter.java create mode 100644 src/main/java/org/approvaltests/namer/ApprovalNamer.java create mode 100644 src/main/java/org/approvaltests/namer/ApprovalResults.java create mode 100644 src/main/java/org/approvaltests/namer/IdeLabeller.java create mode 100644 src/main/java/org/approvaltests/namer/JUnitStackTraceNamer.java create mode 100644 src/main/java/org/approvaltests/namer/MultipleFilesLabeller.java create mode 100644 src/main/java/org/approvaltests/namer/NamerFactory.java create mode 100644 src/main/java/org/approvaltests/namer/OsEnvironmentLabeller.java create mode 100644 src/main/java/org/approvaltests/reporters/ClipboardReporter.java create mode 100644 src/main/java/org/approvaltests/reporters/DelayedClipboardReporter.java create mode 100644 src/main/java/org/approvaltests/reporters/DiffReporter.java create mode 100644 src/main/java/org/approvaltests/reporters/EnvironmentAwareReporter.java create mode 100644 src/main/java/org/approvaltests/reporters/ExecutableQueryFailure.java create mode 100644 src/main/java/org/approvaltests/reporters/FileLauncherReporter.java create mode 100644 src/main/java/org/approvaltests/reporters/FirstWorkingReporter.java create mode 100644 src/main/java/org/approvaltests/reporters/GenericDiffReporter.java create mode 100644 src/main/java/org/approvaltests/reporters/ImageReporter.java create mode 100644 src/main/java/org/approvaltests/reporters/ImageWebReporter.java create mode 100644 src/main/java/org/approvaltests/reporters/JunitReporter.java create mode 100644 src/main/java/org/approvaltests/reporters/MultiReporter.java create mode 100644 src/main/java/org/approvaltests/reporters/MultipleExceptions.java create mode 100644 src/main/java/org/approvaltests/reporters/NotePadLancher.java create mode 100644 src/main/java/org/approvaltests/reporters/QuietReporter.java create mode 100644 src/main/java/org/approvaltests/reporters/TextWebReporter.java create mode 100644 src/main/java/org/approvaltests/reporters/UseReporter.java create mode 100644 src/main/java/org/approvaltests/reporters/macosx/DiffMergeReporter.java create mode 100644 src/main/java/org/approvaltests/reporters/macosx/KaleidoscopeDiffReporter.java create mode 100644 src/main/java/org/approvaltests/reporters/macosx/MacDiffReporter.java create mode 100644 src/main/java/org/approvaltests/reporters/macosx/P4MergeReporter.java create mode 100644 src/main/java/org/approvaltests/reporters/macosx/TkDiffReporter.java create mode 100644 src/main/java/org/approvaltests/reporters/windows/BeyondCompareReporter.java create mode 100644 src/main/java/org/approvaltests/reporters/windows/TortoiseDiffReporter.java create mode 100644 src/main/java/org/approvaltests/reporters/windows/TortoiseImageDiffReporter.java create mode 100644 src/main/java/org/approvaltests/reporters/windows/TortoiseTextDiffReporter.java create mode 100644 src/main/java/org/approvaltests/reporters/windows/WinMergeReporter.java create mode 100644 src/main/java/org/approvaltests/reporters/windows/WindowsDiffReporter.java create mode 100644 src/main/java/org/approvaltests/writers/ApprovalBinaryFileWriter.java create mode 100644 src/main/java/org/approvaltests/writers/ApprovalTextWriter.java create mode 100644 src/main/java/org/approvaltests/writers/ApprovalXmlWriter.java create mode 100644 src/main/java/org/approvaltests/writers/ComponentApprovalWriter.java create mode 100644 src/main/java/org/approvaltests/writers/DirectoryToDirectoryWriter.java create mode 100644 src/main/java/org/approvaltests/writers/FileApprovalWriter.java create mode 100644 src/main/java/org/approvaltests/writers/FlyingSaucerHtmlToPdfWriter.java create mode 100644 src/main/java/org/approvaltests/writers/ImageApprovalWriter.java create mode 100644 src/main/java/org/approvaltests/writers/ResultSetApprovalWriter.java create mode 100644 src/main/java/org/approvaltests/writers/Writer.java create mode 100644 src/main/java/org/lambda/actions/Action0.java create mode 100644 src/main/java/org/lambda/actions/Action1.java create mode 100644 src/main/java/org/lambda/actions/Action2.java create mode 100644 src/main/java/org/lambda/actions/Action3.java create mode 100644 src/main/java/org/lambda/actions/Action4.java create mode 100644 src/main/java/org/lambda/actions/Action5.java create mode 100644 src/main/java/org/lambda/actions/Action6.java create mode 100644 src/main/java/org/lambda/actions/Action7.java create mode 100644 src/main/java/org/lambda/actions/Action8.java create mode 100644 src/main/java/org/lambda/actions/Action9.java create mode 100644 src/main/java/org/lambda/actions/implementations/A0.java create mode 100644 src/main/java/org/lambda/actions/implementations/A1.java create mode 100644 src/main/java/org/lambda/functions/Function0.java create mode 100644 src/main/java/org/lambda/functions/Function1.java create mode 100644 src/main/java/org/lambda/functions/Function2.java create mode 100644 src/main/java/org/lambda/functions/Function3.java create mode 100644 src/main/java/org/lambda/functions/Function4.java create mode 100644 src/main/java/org/lambda/functions/Function5.java create mode 100644 src/main/java/org/lambda/functions/Function6.java create mode 100644 src/main/java/org/lambda/functions/Function7.java create mode 100644 src/main/java/org/lambda/functions/Function8.java create mode 100644 src/main/java/org/lambda/functions/Function9.java create mode 100644 src/main/java/org/lambda/functions/implementations/B1.java create mode 100644 src/main/java/org/lambda/functions/implementations/F0.java create mode 100644 src/main/java/org/lambda/functions/implementations/F1.java create mode 100644 src/main/java/org/lambda/functions/implementations/F2.java create mode 100644 src/main/java/org/lambda/functions/implementations/F3.java create mode 100644 src/main/java/org/lambda/functions/implementations/F4.java create mode 100644 src/main/java/org/lambda/functions/implementations/F5.java create mode 100644 src/main/java/org/lambda/functions/implementations/F6.java create mode 100644 src/main/java/org/lambda/functions/implementations/F7.java create mode 100644 src/main/java/org/lambda/functions/implementations/F8.java create mode 100644 src/main/java/org/lambda/functions/implementations/F9.java create mode 100644 src/main/java/org/lambda/functions/implementations/Function.java create mode 100644 src/main/java/org/lambda/functions/implementations/S1.java create mode 100644 src/main/java/org/lambda/query/Echo1.java create mode 100644 src/main/java/org/lambda/query/Loops.java create mode 100644 src/main/java/org/lambda/query/OrderBy.java create mode 100644 src/main/java/org/lambda/query/ParallelLoops.java create mode 100644 src/main/java/org/lambda/query/ParallelQuery.java create mode 100644 src/main/java/org/lambda/query/Query.java diff --git a/.classpath b/.classpath index 392cb6f..cdf5b63 100644 --- a/.classpath +++ b/.classpath @@ -1,29 +1,29 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs index 04cfa2c..29abf99 100644 --- a/.settings/org.eclipse.core.resources.prefs +++ b/.settings/org.eclipse.core.resources.prefs @@ -1,6 +1,6 @@ -eclipse.preferences.version=1 -encoding//src/main/java=UTF-8 -encoding//src/main/resources=UTF-8 -encoding//src/test/java=UTF-8 -encoding//src/test/resources=UTF-8 -encoding/=UTF-8 +eclipse.preferences.version=1 +encoding//src/main/java=UTF-8 +encoding//src/main/resources=UTF-8 +encoding//src/test/java=UTF-8 +encoding//src/test/resources=UTF-8 +encoding/=UTF-8 diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs index d59e09c..714351a 100644 --- a/.settings/org.eclipse.jdt.core.prefs +++ b/.settings/org.eclipse.jdt.core.prefs @@ -1,5 +1,5 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 -org.eclipse.jdt.core.compiler.compliance=1.8 -org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning -org.eclipse.jdt.core.compiler.source=1.8 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs index 14b697b..f897a7f 100644 --- a/.settings/org.eclipse.m2e.core.prefs +++ b/.settings/org.eclipse.m2e.core.prefs @@ -1,4 +1,4 @@ -activeProfiles= -eclipse.preferences.version=1 -resolveWorkspaceProjects=true -version=1 +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/pom.xml b/pom.xml index 90d447e..affe9c6 100644 --- a/pom.xml +++ b/pom.xml @@ -1,86 +1,131 @@ - - 4.0.0 - - org.teachingkidsprogramming - 0.0.1-SNAPSHOT - TeachingKidsProgramming.Source.Java - This is the Source Code for Tortoise and many other utils that are used for the TKP Java Library. - TeachingKidsProgramming - http://teachingkidsprogramming.com/ - - - UTF-8 - - - - scm:git:git@github.com:TeachingKidsProgramming/TeachingKidsProgramming.Source.Java.git - scm:git:git@github.com:TeachingKidsProgramming/TeachingKidsProgramming.Source.Java.git - https://github.com/TeachingKidsProgramming/TeachingKidsProgramming.Source.Java.git - - - - - Bhagat Singh - bhagat.rawat@gmail.com - - - Jim Counts - jcounts18@gmail.com - Teaching Kids Programming - http://teachingkidsprogramming.com/ - - - Lynn Langit - lynn@teachingkidsprogramming.org - Teaching Kids Programming - http://teachingkidsprogramming.com/ - - - - - - org.teachingkidsprogramming - ApprovalTest - 0.0.1-SNAPSHOT - - - junit - junit - 4.12 - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - - 1.8 - 1.8 - - - - org.apache.maven.plugins - maven-javadoc-plugin - - private - true - - - - org.apache.maven.plugins - maven-compiler-plugin - - - org/teachingkidsprogramming/recipes/completed/*.* - org/teachingkidsprogramming/section*/*.* - - - - - - + + 4.0.0 + + org.teachingkidsprogramming + 0.0.1-SNAPSHOT + TeachingKidsProgramming.Source.Java + This is the Source Code for Tortoise and many other utils that are used for the TKP Java Library. + TeachingKidsProgramming + http://teachingkidsprogramming.com/ + + + UTF-8 + + + + scm:git:git@github.com:TeachingKidsProgramming/TeachingKidsProgramming.Source.Java.git + scm:git:git@github.com:TeachingKidsProgramming/TeachingKidsProgramming.Source.Java.git + https://github.com/TeachingKidsProgramming/TeachingKidsProgramming.Source.Java.git + + + + + Bhagat Singh + bhagat.rawat@gmail.com + + + Jim Counts + jcounts18@gmail.com + Teaching Kids Programming + http://teachingkidsprogramming.com/ + + + Lynn Langit + lynn@teachingkidsprogramming.org + Teaching Kids Programming + http://teachingkidsprogramming.com/ + + + + + + junit + junit + 4.12 + + + javax.servlet + javax.servlet-api + 3.1.0 + + + velocity + velocity + 1.4 + + + commons-collections + commons-collections + 3.2.1 + + + commons-logging + commons-logging + 1.0.3 + + + sshtools + j2ssh-core + 0.2.9 + + + commons-httpclient + commons-httpclient + 2.0-rc3 + + + commons-net + commons-net + 1.1.0 + + + org.mockito + mockito-all + 1.8.5 + + + com.sun.mail + javax.mail + 1.4.4 + + + log4j + log4j + 1.2.9 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + 1.8 + 1.8 + + + + org.apache.maven.plugins + maven-javadoc-plugin + + private + true + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org/teachingkidsprogramming/recipes/completed/*.* + org/teachingkidsprogramming/section*/*.* + + + + + + \ No newline at end of file diff --git a/src/main/java/com/spun/util/ArrayUtils.java b/src/main/java/com/spun/util/ArrayUtils.java new file mode 100644 index 0000000..ee1019c --- /dev/null +++ b/src/main/java/com/spun/util/ArrayUtils.java @@ -0,0 +1,296 @@ +package com.spun.util; + +import java.lang.reflect.Array; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Vector; + +import org.lambda.functions.Function1; + +/** + * A static class of convenience methods for arrays and collections. + **/ +public class ArrayUtils +{ + /************************************************************************/ + public static java.util.Collection addArray(java.util.Collection v, T array[]) + { + if ((array == null) || (v == null)) { return v; } + for (int i = 0; i < array.length; i++) + { + v.add(array[i]); + } + return v; + } + public static String toString(T[] values, Function1 formatter) + { + return toString(Arrays.asList(values), formatter); + } + public static String toString(Iterable values, Function1 formatter) + { + StringBuffer b = new StringBuffer(); + for (T t : values) + { + b.append(formatter.call(t) + "\r\n"); + } + return b.toString(); + } + /***********************************************************************/ + public static Vector toReverseVector(Vector vector) + { + Vector reverse = new Vector(vector.size()); + for (int i = vector.size() - 1; i >= 0; i--) + { + reverse.add(vector.elementAt(i)); + } + return reverse; + } + /***********************************************************************/ + public static T[] toReverseArray(T[] array) + { + for (int i = 0; i < array.length / 2; i++) + { + T o1 = array[i]; + int end = array.length - i - 1; + T o2 = array[end]; + array[i] = o2; + array[end] = o1; + } + return array; + } + /***********************************************************************/ + public static T[] addToArray(T[] array, T object) + { + Object[] newArray = null; + if (array == null) + { + newArray = (Object[]) Array.newInstance(object.getClass(), 1); + newArray[0] = object; + } + else + { + newArray = (Object[]) Array.newInstance(array.getClass().getComponentType(), array.length + 1); + System.arraycopy(array, 0, newArray, 0, array.length); + newArray[array.length] = object; + } + return (T[]) newArray; + } + /***********************************************************************/ + public static T[] getSubsection(T[] array, int startInclusive, int endExclusive) + { + int length = endExclusive - startInclusive; + length = length > array.length ? array.length : length; + T[] newArray = (T[]) Array.newInstance(array.getClass().getComponentType(), length); + System.arraycopy(array, startInclusive, newArray, 0, length); + return newArray; + } + /***********************************************************************/ + public static boolean isEmpty(Object[] array) + { + return ((array == null) || (array.length == 0)); + } + /************************************************************************/ + public static boolean isEmpty(Collection collection) + { + return ((collection == null) || (collection.size() == 0)); + } + /***********************************************************************/ + public static T getSingleton(T[] parts) + { + if (parts == null) { return null; } + switch (parts.length) + { + case 0 : + return null; + case 1 : + return parts[0]; + default : + throw new Error("Called with more than one object in the array " + Arrays.asList(parts)); + } + } + /***********************************************************************/ + public static T getFirst(T[] array, Comparator compartor) + { + return get(array, compartor, true); + } + /***********************************************************************/ + public static T getFirst(Collection array, Comparator sorter) + { + return get((T[]) array.toArray(), sorter, true); + } + /***********************************************************************/ + public static T getLast(T[] array, Comparator sorter) + { + return get(array, sorter, false); + } + /***********************************************************************/ + public static T getLast(Collection array, Comparator sorter) + { + return get((T[]) array.toArray(), sorter, false); + } + /***********************************************************************/ + private static T get(T[] array, Comparator sorter, boolean wantFirst) + { + if (isEmpty(array)) { return null; } + T last = array[0]; + for (int i = 1; i < array.length; i++) + { + int compare = sorter.compare(last, array[i]); + if ((wantFirst && compare > 0) || (!wantFirst && compare < 0)) + { + last = array[i]; + } + } + return last; + } + /***********************************************************************/ + public static List combineResults(Object[] array, String invokeMethod) + { + if (ArrayUtils.isEmpty(array)) { return Collections.EMPTY_LIST; } + try + { + return combineResults(array, ObjectUtils.getGreatestCommonDenominator(array, invokeMethod)); + } + catch (Exception e) + { + throw ObjectUtils.throwAsError(e); + } + } + /***********************************************************************/ + @SuppressWarnings("rawtypes") + public static List combineResults(Object[] array, Method method) + { + if (isEmpty(array)) { return new ArrayList(0); } + try + { + ArrayList list = new ArrayList(); + for (int i = 0; i < array.length; i++) + { + addArray(list, (Object[]) method.invoke(array[i], (Object[]) null)); + } + return list; + } + catch (Throwable e) + { + throw ObjectUtils.throwAsError(e); + } + } + /***********************************************************************/ + public static Object[] combine(Object[] a, Object[] b) + { + if (isEmpty(a) && isEmpty(b)) + { + if (a != null) + { + return (Object[]) Array.newInstance(a.getClass().getComponentType(), 0); + } + else if (b != null) + { + return (Object[]) Array.newInstance(b.getClass().getComponentType(), 0); + } + else + { + return new Object[0]; + } + } + else if (isEmpty(a)) + { + return b; + } + else if (isEmpty(b)) + { + return a; + } + else + { + Object[] newArray = null; + newArray = (Object[]) Array.newInstance(a.getClass().getComponentType(), a.length + b.length); + System.arraycopy(a, 0, newArray, 0, a.length); + System.arraycopy(b, 0, newArray, a.length, b.length); + return newArray; + } + } + /***********************************************************************/ + public static boolean contains(T[] values, T value) + { + for (int i = 0; i < values.length; i++) + { + if (value.equals(values[i])) { return true; } + } + return false; + } + /***********************************************************************/ + public static boolean contains(int[] values, int value) + { + for (int i = 0; i < values.length; i++) + { + if (value == values[i]) { return true; } + } + return false; + } + /************************************************************************/ + public static T getLast(List list) + { + return list.get(list.size() - 1); + } + /************************************************************************/ + public static T getDefault(HashMap map, K key, T defaultValue) + { + T value = map.get(key); + if (value == null) + { + map.put(key, defaultValue); + value = defaultValue; + } + return value; + } + /************************************************************************/ + public static int countValues(HashMap out, V matching) + { + return count(matching, out.values()); + } + /************************************************************************/ + public static int count(V matching, Collection values) + { + int count = 0; + for (V value : values) + { + if (matching.equals(value)) + { + count++; + } + } + return count; + } + public static List combine(List list1, List list2) + { + List all = new ArrayList(); + all.addAll(list1); + all.addAll(list2); + return all; + } + public static Iterable asIterable(Iterator iterator) + { + return new IterableWrapper(iterator); + } + public static class IterableWrapper implements Iterable + { + private final Iterator iterator; + public IterableWrapper(Iterator iterator) + { + this.iterator = iterator; + } + @Override + public Iterator iterator() + { + return iterator; + } + } +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/Asserts.java b/src/main/java/com/spun/util/Asserts.java new file mode 100644 index 0000000..354cb97 --- /dev/null +++ b/src/main/java/com/spun/util/Asserts.java @@ -0,0 +1,78 @@ +package com.spun.util; + +import java.io.File; + +public class Asserts +{ + public static void t() + { + // can you see it now? good. + // how about this? + // kind of slow... + } + /***********************************************************************/ + public static T assertNotNull(String label, T o) + { + if (o == null) { throw new NullPointerException(label + " was null"); } + return o; + } + /***********************************************************************/ + public static void assertEqual(String label, int expected, int actual) + { + if (expected != actual) { throw new IllegalStateException(label + " " + expected + "!=" + actual); } + } + /***********************************************************************/ + public static void assertFileDoesNotExist(String label, String fileName) + { + File file = new File(fileName); + if (file.exists()) { throw new IllegalStateException(label + " file " + file.getAbsolutePath() + + " already exists"); } + } + /***********************************************************************/ + public static void assertFileExists(String label, String fileName) + { + File file = new File(fileName); + if (!file.exists()) { throw new IllegalStateException(label + " file " + file.getAbsolutePath() + + " does not exist"); } + } + /***********************************************************************/ + public static void equals(String label, double expected, double actual, double percission) + { + if (!NumberUtils.equals(expected, actual, percission)) { throw new IllegalStateException(label + " " + + expected + "!=" + actual); } + } + /***********************************************************************/ + public static void notEquals(String label, double expected, double actual) + { + if (actual == expected) { throw new IllegalStateException(label + " " + expected + "!=" + actual); } + } + /***********************************************************************/ + public static void assertEqual(String label, Object expected, Object actual) + { + if (!ObjectUtils.isEqual(expected, actual)) { throw new IllegalStateException(label + " " + expected + "!=" + + actual); } + } + /***********************************************************************/ + public static void assertNotEqual(String label, Object expected, Object actual) + { + if (ObjectUtils.isEqual(expected, actual)) { throw new IllegalStateException(label + " can't = " + expected); } + } + /***********************************************************************/ + public static void assertEqual(String label, double expected, double actual, double precision) + { + if (!NumberUtils.equals(expected, actual, precision)) { throw new IllegalStateException(label + " " + expected + + "!=" + actual + "within delta of" + precision); } + } + /***********************************************************************/ + public static void assertStartsWith(String label, String haystack, String needle) + { + if (haystack == null || !haystack.startsWith(needle)) { throw new IllegalStateException(label + " " + haystack + + " does not start with " + needle); } + } + /***********************************************************************/ + /***********************************************************************/ + public static void assertTrue(String label, boolean b) + { + if (!b) { throw new IllegalStateException(label + " was false"); } + } +} diff --git a/src/main/java/com/spun/util/ByteArrayDataSource.java b/src/main/java/com/spun/util/ByteArrayDataSource.java new file mode 100644 index 0000000..f2a058d --- /dev/null +++ b/src/main/java/com/spun/util/ByteArrayDataSource.java @@ -0,0 +1,124 @@ +package com.spun.util; + +/* + * @(#)ByteArrayDataSource.java 1.1 00/01/30 + * + * Copyright 1998-2000 Sun Microsystems, Inc. All Rights Reserved. + * + * This software is the proprietary information of Sun Microsystems, Inc. + * Use is subject to license terms. + * + */ +import java.io.*; +import javax.activation.*; + +/** + * Comment By LLewellyn: This is a needed class for using mail. For some reason wasn't + * made as part of the standard mail package.

+ * + * A simple DataSource for demonstration purposes. + * This class implements a DataSource from: + * an InputStream + * a byte array + * a String + * + * @author John Mani + * @author Bill Shannon + * @author Max Spivak + **/ +public class ByteArrayDataSource implements DataSource +{ + private byte[] data; // data + private String type; // content-type + private String name = "dummy"; + /***********************************************************************/ + /* Create a DataSource from an input stream */ + public ByteArrayDataSource(InputStream is, String type) + { + this(is, type, null); + } + /***********************************************************************/ + /* Create a DataSource from an input stream */ + public ByteArrayDataSource(InputStream is, String type, String name) + { + this.type = type; + setName(name); + try + { + ByteArrayOutputStream os = new ByteArrayOutputStream(); + int ch; + while ((ch = is.read()) != -1) + { + // XXX - must be made more efficient by + // doing buffered reads, rather than one byte reads + os.write(ch); + } + data = os.toByteArray(); + } + catch (IOException ioex) + { + } + } + /***********************************************************************/ + /* Create a DataSource from a byte array */ + public ByteArrayDataSource(byte[] data, String type) + { + this.data = data; + this.type = type; + } + /***********************************************************************/ + public void setName(String name) + { + this.name = (name == null) ? "dummy" : name; + } + /***********************************************************************/ + /* Create a DataSource from a String */ + public ByteArrayDataSource(String data, String type) + { + this(data, type, null); + } + /***********************************************************************/ + /* Create a DataSource from a String */ + public ByteArrayDataSource(String data, String type, String name) + { + setName(name); + try + { + // Assumption that the string contains only ASCII + // characters! Otherwise just pass a charset into this + // constructor and use it in getBytes() + this.data = data.getBytes("iso-8859-1"); + } + catch (UnsupportedEncodingException uex) + { + } + this.type = type; + } + /***********************************************************************/ + /** + * Return an InputStream for the data. + * Note - a new stream must be returned each time. + */ + public InputStream getInputStream() throws IOException + { + if (data == null) { throw new IOException("no data"); } + return new ByteArrayInputStream(data); + } + /***********************************************************************/ + public OutputStream getOutputStream() throws IOException + { + throw new IOException("cannot do this"); + } + /***********************************************************************/ + public String getContentType() + { + return type; + } + /***********************************************************************/ + public String getName() + { + return name; + } + /***********************************************************************/ + /***********************************************************************/ +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/CallMethod.java b/src/main/java/com/spun/util/CallMethod.java new file mode 100644 index 0000000..0ae0891 --- /dev/null +++ b/src/main/java/com/spun/util/CallMethod.java @@ -0,0 +1,30 @@ +package com.spun.util; + +import java.util.ArrayList; + +public class CallMethod +{ + private final Class clazz; + private ArrayList methodNames = new ArrayList(); + private ArrayList params = new ArrayList(); + public CallMethod(Class clazz) + { + this.clazz = clazz; + } + public CallMethod method(String methodName, Object... parameters) + { + methodNames.add(methodName); + if (!ArrayUtils.isEmpty(parameters)) + { + params.add(new MethodExecutionPath.Parameters(parameters)); + } + else { + params.add(new MethodExecutionPath.Parameters((Object[])null)); + } + return this; + } + public MethodExecutionPath go() + { + return new MethodExecutionPath(clazz, methodNames.toArray(new String[0]), params.toArray(new MethodExecutionPath.Parameters[0])); + } +} diff --git a/src/main/java/com/spun/util/ClassUtils.java b/src/main/java/com/spun/util/ClassUtils.java new file mode 100644 index 0000000..b6550da --- /dev/null +++ b/src/main/java/com/spun/util/ClassUtils.java @@ -0,0 +1,136 @@ +package com.spun.util; + +import java.io.File; +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class ClassUtils +{ + /************************************************************************/ + public static String getClassName(Class clazz) + { + String name = clazz.getName(); + int divider = name.lastIndexOf("."); + return name.substring(divider + 1); + } + /************************************************************************/ + public static String getClassPath(Class clazz) + { + String name = clazz.getName(); + int divider = name.lastIndexOf("."); + return name.substring(0, divider); + } + /************************************************************************/ + public static Class getWrapperClass(Class primativeType) + { + if (boolean.class.equals(primativeType)) + { + return Boolean.class; + } + else if (float.class.equals(primativeType)) + { + return Float.class; + } + else if (long.class.equals(primativeType)) + { + return Long.class; + } + else if (int.class.equals(primativeType)) + { + return Integer.class; + } + else if (short.class.equals(primativeType)) + { + return Short.class; + } + else if (byte.class.equals(primativeType)) + { + return Byte.class; + } + else if (double.class.equals(primativeType)) + { + return Double.class; + } + else if (char.class.equals(primativeType)) + { + return Character.class; + } + else + { + return primativeType; + } + } + /************************************************************************/ + /************************************************************************/ + public static boolean hasMethod(Class clazz, String methodName, Class... parameterTypes) + { + try + { + return clazz.getMethod(methodName, parameterTypes) != null; + } + catch (SecurityException e) + { + throw ObjectUtils.throwAsError(e); + } + catch (NoSuchMethodException e) + { + return false; + } + } + public static File getSourceDirectory(Class clazz) + { + final String name = clazz.getName(); + String[] split = name.split("\\."); + split[split.length - 1] = split[split.length - 1] + ".java"; + File found = find(new File("."), Arrays.asList(split)); + if (found == null) { throw new FormattedException("Didn't find %s under %s", name, new File(".")); } + return found.getParentFile(); + } + public static File find(File file, List matches) + { + ArrayList copy = new ArrayList(); + copy.addAll(matches); + copy.add(0, "*"); + return find2(file, copy); + } + public static File find2(File file, List matches) + { + SearchingFileFilter searchingFileFilter = new SearchingFileFilter(matches); + File[] listFiles = file.listFiles(searchingFileFilter); + for (File file2 : listFiles) + { + if (file2.isDirectory()) + { + File found = find2(file2, searchingFileFilter.getSubset(file2.getName())); + if (found != null) { return found; } + } + else + { + return file2; + } + } + return null; + } + public static T create(Class clazz) + { + try + { + return clazz.newInstance(); + } + catch (Exception e) + { + throw ObjectUtils.throwAsError(e); + } + } + public static boolean IsPublicStatic(Field field) + { + return field != null && Modifier.isPublic(field.getModifiers()) && Modifier.isStatic(field.getModifiers()); + } + public static boolean isPrimitiveField(Field field) + { + return field != null && (field.getType().isArray() || field.getType().isPrimitive() || field.getType().isAssignableFrom(String.class)); + } +} diff --git a/src/main/java/com/spun/util/Colors.java b/src/main/java/com/spun/util/Colors.java new file mode 100644 index 0000000..5e86e65 --- /dev/null +++ b/src/main/java/com/spun/util/Colors.java @@ -0,0 +1,1551 @@ +package com.spun.util; + +import java.awt.Color; +import java.util.Random; + +/** + * Every color under the + * rainbow, + * and different ways to get them. + */ +public class Colors +{ + public static class Blues + { + /** + * The color Navy + * + * + * + * + *
 
+ **/ + public static final Color Navy = Color.decode("#000080"); + /** + * The color DarkBlue + * + * + * + * + *
 
+ **/ + public static final Color DarkBlue = Color.decode("#00008B"); + /** + * The color MidnightBlue + * + * + * + * + *
 
+ **/ + public static final Color MidnightBlue = Color.decode("#191970"); + /** + * The color MediumBlue + * + * + * + * + *
 
+ **/ + public static final Color MediumBlue = Color.decode("#0000CD"); + /** + * The color Blue + * + * + * + * + *
 
+ **/ + public static final Color Blue = Color.decode("#0000FF"); + /** + * The color Teal + * + * + * + * + *
 
+ **/ + public static final Color Teal = Color.decode("#008080"); + /** + * The color DarkSlateBlue + * + * + * + * + *
 
+ **/ + public static final Color DarkSlateBlue = Color.decode("#483D8B"); + /** + * The color DarkCyan + * + * + * + * + *
 
+ **/ + public static final Color DarkCyan = Color.decode("#008B8B"); + /** + * The color SteelBlue + * + * + * + * + *
 
+ **/ + public static final Color SteelBlue = Color.decode("#4682B4"); + /** + * The color RoyalBlue + * + * + * + * + *
 
+ **/ + public static final Color RoyalBlue = Color.decode("#4169E1"); + /** + * The color SlateBlue + * + * + * + * + *
 
+ **/ + public static final Color SlateBlue = Color.decode("#6A5ACD"); + /** + * The color CadetBlue + * + * + * + * + *
 
+ **/ + public static final Color CadetBlue = Color.decode("#5F9EA0"); + /** + * The color DarkTurquoise + * + * + * + * + *
 
+ **/ + public static final Color DarkTurquoise = Color.decode("#00CED1"); + /** + * The color DodgerBlue + * + * + * + * + *
 
+ **/ + public static final Color DodgerBlue = Color.decode("#1E90FF"); + /** + * The color DeepSkyBlue + * + * + * + * + *
 
+ **/ + public static final Color DeepSkyBlue = Color.decode("#00BFFF"); + /** + * The color MediumSlateBlue + * + * + * + * + *
 
+ **/ + public static final Color MediumSlateBlue = Color.decode("#7B68EE"); + /** + * The color MediumTurquoise + * + * + * + * + *
 
+ **/ + public static final Color MediumTurquoise = Color.decode("#48D1CC"); + /** + * The color CornflowerBlue + * + * + * + * + *
 
+ **/ + public static final Color CornflowerBlue = Color.decode("#6495ED"); + /** + * The color Turquoise + * + * + * + * + *
 
+ **/ + public static final Color Turquoise = Color.decode("#40E0D0"); + /** + * The color Aqua + * + * + * + * + *
 
+ **/ + public static final Color Aqua = Color.decode("#00FFFF"); + /** + * The color Cyan + * + * + * + * + *
 
+ **/ + public static final Color Cyan = Color.decode("#00FFFF"); + /** + * The color SkyBlue + * + * + * + * + *
 
+ **/ + public static final Color SkyBlue = Color.decode("#87CEEB"); + /** + * The color LightSkyBlue + * + * + * + * + *
 
+ **/ + public static final Color LightSkyBlue = Color.decode("#87CEFA"); + /** + * The color Aquamarine + * + * + * + * + *
 
+ **/ + public static final Color Aquamarine = Color.decode("#7FFFD4"); + /** + * The color LightSteelBlue + * + * + * + * + *
 
+ **/ + public static final Color LightSteelBlue = Color.decode("#B0C4DE"); + /** + * The color LightBlue + * + * + * + * + *
 
+ **/ + public static final Color LightBlue = Color.decode("#ADD8E6"); + /** + * The color PowderBlue + * + * + * + * + *
 
+ **/ + public static final Color PowderBlue = Color.decode("#B0E0E6"); + /** + * The color PaleTurquoise + * + * + * + * + *
 
+ **/ + public static final Color PaleTurquoise = Color.decode("#AFEEEE"); + /** + * The color LightCyan + * + * + * + * + *
 
+ **/ + public static final Color LightCyan = Color.decode("#E0FFFF"); + /** + * The color AliceBlue + * + * + * + * + *
 
+ **/ + public static final Color AliceBlue = Color.decode("#F0F8FF"); + /** + * The color Azure + * + * + * + * + *
 
+ **/ + public static final Color Azure = Color.decode("#F0FFFF"); + } + public static class Browns + { + /** + * The color Maroon + * + * + * + * + *
 
+ **/ + public static final Color Maroon = Color.decode("#800000"); + /** + * The color SaddleBrown + * + * + * + * + *
 
+ **/ + public static final Color SaddleBrown = Color.decode("#8B4513"); + /** + * The color Brown + * + * + * + * + *
 
+ **/ + public static final Color Brown = Color.decode("#A52A2A"); + /** + * The color Sienna + * + * + * + * + *
 
+ **/ + public static final Color Sienna = Color.decode("#A0522D"); + /** + * The color DarkGoldenrod + * + * + * + * + *
 
+ **/ + public static final Color DarkGoldenrod = Color.decode("#B8860B"); + /** + * The color Chocolate + * + * + * + * + *
 
+ **/ + public static final Color Chocolate = Color.decode("#D2691E"); + /** + * The color Peru + * + * + * + * + *
 
+ **/ + public static final Color Peru = Color.decode("#CD853F"); + /** + * The color Goldenrod + * + * + * + * + *
 
+ **/ + public static final Color Goldenrod = Color.decode("#DAA520"); + /** + * The color RosyBrown + * + * + * + * + *
 
+ **/ + public static final Color RosyBrown = Color.decode("#BC8F8F"); + /** + * The color SandyBrown + * + * + * + * + *
 
+ **/ + public static final Color SandyBrown = Color.decode("#F4A460"); + /** + * The color Tan + * + * + * + * + *
 
+ **/ + public static final Color Tan = Color.decode("#D2B48C"); + /** + * The color BurlyWood + * + * + * + * + *
 
+ **/ + public static final Color BurlyWood = Color.decode("#DEB887"); + /** + * The color Wheat + * + * + * + * + *
 
+ **/ + public static final Color Wheat = Color.decode("#F5DEB3"); + /** + * The color NavajoWhite + * + * + * + * + *
 
+ **/ + public static final Color NavajoWhite = Color.decode("#FFDEAD"); + /** + * The color Bisque + * + * + * + * + *
 
+ **/ + public static final Color Bisque = Color.decode("#FFE4C4"); + /** + * The color BlanchedAlmond + * + * + * + * + *
 
+ **/ + public static final Color BlanchedAlmond = Color.decode("#FFEBCD"); + /** + * The color Cornsilk + * + * + * + * + *
 
+ **/ + public static final Color Cornsilk = Color.decode("#FFF8DC"); + } + public static class Grays + { + /** + * The color Black + * + * + * + * + *
 
+ **/ + public static final Color Black = Color.decode("#000000"); + /** + * The color DarkSlateGray + * + * + * + * + *
 
+ **/ + public static final Color DarkSlateGray = Color.decode("#2F4F4F"); + /** + * The color DimGray + * + * + * + * + *
 
+ **/ + public static final Color DimGray = Color.decode("#696969"); + /** + * The color Gray + * + * + * + * + *
 
+ **/ + public static final Color Gray = Color.decode("#808080"); + /** + * The color SlateGray + * + * + * + * + *
 
+ **/ + public static final Color SlateGray = Color.decode("#708090"); + /** + * The color LightSlateGray + * + * + * + * + *
 
+ **/ + public static final Color LightSlateGray = Color.decode("#778899"); + /** + * The color DarkGray + * + * + * + * + *
 
+ **/ + public static final Color DarkGray = Color.decode("#A9A9A9"); + /** + * The color Silver + * + * + * + * + *
 
+ **/ + public static final Color Silver = Color.decode("#C0C0C0"); + /** + * The color LightGray + * + * + * + * + *
 
+ **/ + public static final Color LightGray = Color.decode("#D3D3D3"); + /** + * The color Gainsboro + * + * + * + * + *
 
+ **/ + public static final Color Gainsboro = Color.decode("#DCDCDC"); + } + public static class Greens + { + /** + * The color DarkGreen + * + * + * + * + *
 
+ **/ + public static final Color DarkGreen = Color.decode("#006400"); + /** + * The color Green + * + * + * + * + *
 
+ **/ + public static final Color Green = Color.decode("#008000"); + /** + * The color ForestGreen + * + * + * + * + *
 
+ **/ + public static final Color ForestGreen = Color.decode("#228B22"); + /** + * The color DarkOliveGreen + * + * + * + * + *
 
+ **/ + public static final Color DarkOliveGreen = Color.decode("#556B2F"); + /** + * The color Lime + * + * + * + * + *
 
+ **/ + public static final Color Lime = Color.decode("#00FF00"); + /** + * The color Olive + * + * + * + * + *
 
+ **/ + public static final Color Olive = Color.decode("#808000"); + /** + * The color Teal + * + * + * + * + *
 
+ **/ + public static final Color Teal = Color.decode("#008080"); + /** + * The color SeaGreen + * + * + * + * + *
 
+ **/ + public static final Color SeaGreen = Color.decode("#2E8B57"); + /** + * The color DarkCyan + * + * + * + * + *
 
+ **/ + public static final Color DarkCyan = Color.decode("#008B8B"); + /** + * The color OliveDrab + * + * + * + * + *
 
+ **/ + public static final Color OliveDrab = Color.decode("#6B8E23"); + /** + * The color LimeGreen + * + * + * + * + *
 
+ **/ + public static final Color LimeGreen = Color.decode("#32CD32"); + /** + * The color MediumSeaGreen + * + * + * + * + *
 
+ **/ + public static final Color MediumSeaGreen = Color.decode("#3CB371"); + /** + * The color LawnGreen + * + * + * + * + *
 
+ **/ + public static final Color LawnGreen = Color.decode("#7CFC00"); + /** + * The color LightSeaGreen + * + * + * + * + *
 
+ **/ + public static final Color LightSeaGreen = Color.decode("#20B2AA"); + /** + * The color Chartreuse + * + * + * + * + *
 
+ **/ + public static final Color Chartreuse = Color.decode("#7FFF00"); + /** + * The color SpringGreen + * + * + * + * + *
 
+ **/ + public static final Color SpringGreen = Color.decode("#00FF7F"); + /** + * The color MediumSpringGreen + * + * + * + * + *
 
+ **/ + public static final Color MediumSpringGreen = Color.decode("#00FA9A"); + /** + * The color YellowGreen + * + * + * + * + *
 
+ **/ + public static final Color YellowGreen = Color.decode("#9ACD32"); + /** + * The color DarkTurquoise + * + * + * + * + *
 
+ **/ + public static final Color DarkTurquoise = Color.decode("#00CED1"); + /** + * The color DarkSeaGreen + * + * + * + * + *
 
+ **/ + public static final Color DarkSeaGreen = Color.decode("#8FBC8F"); + /** + * The color GreenYellow + * + * + * + * + *
 
+ **/ + public static final Color GreenYellow = Color.decode("#ADFF2F"); + /** + * The color MediumAquamarine + * + * + * + * + *
 
+ **/ + public static final Color MediumAquamarine = Color.decode("#66CDAA"); + /** + * The color MediumTurquoise + * + * + * + * + *
 
+ **/ + public static final Color MediumTurquoise = Color.decode("#48D1CC"); + /** + * The color Turquoise + * + * + * + * + *
 
+ **/ + public static final Color Turquoise = Color.decode("#40E0D0"); + /** + * The color LightGreen + * + * + * + * + *
 
+ **/ + public static final Color LightGreen = Color.decode("#90EE90"); + /** + * The color PaleGreen + * + * + * + * + *
 
+ **/ + public static final Color PaleGreen = Color.decode("#98FB98"); + /** + * The color Aquamarine + * + * + * + * + *
 
+ **/ + public static final Color Aquamarine = Color.decode("#7FFFD4"); + /** + * The color PaleTurquoise + * + * + * + * + *
 
+ **/ + public static final Color PaleTurquoise = Color.decode("#AFEEEE"); + } + public static class Oranges + { + /** + * The color OrangeRed + * + * + * + * + *
 
+ **/ + public static final Color OrangeRed = Color.decode("#FF4500"); + /** + * The color DarkOrange + * + * + * + * + *
 
+ **/ + public static final Color DarkOrange = Color.decode("#FF8C00"); + /** + * The color Orange + * + * + * + * + *
 
+ **/ + public static final Color Orange = Color.decode("#FFA500"); + /** + * The color Tomato + * + * + * + * + *
 
+ **/ + public static final Color Tomato = Color.decode("#FF6347"); + /** + * The color Coral + * + * + * + * + *
 
+ **/ + public static final Color Coral = Color.decode("#FF7F50"); + /** + * The color LightSalmon + * + * + * + * + *
 
+ **/ + public static final Color LightSalmon = Color.decode("#FFA07A"); + } + public static class Pinks + { + /** + * The color MediumVioletRed + * + * + * + * + *
 
+ **/ + public static final Color MediumVioletRed = Color.decode("#C71585"); + /** + * The color DeepPink + * + * + * + * + *
 
+ **/ + public static final Color DeepPink = Color.decode("#FF1493"); + /** + * The color PaleVioletRed + * + * + * + * + *
 
+ **/ + public static final Color PaleVioletRed = Color.decode("#DB7093"); + /** + * The color Fuchsia + * + * + * + * + *
 
+ **/ + public static final Color Fuchsia = Color.decode("#FF00FF"); + /** + * The color HotPink + * + * + * + * + *
 
+ **/ + public static final Color HotPink = Color.decode("#FF69B4"); + /** + * The color LightPink + * + * + * + * + *
 
+ **/ + public static final Color LightPink = Color.decode("#FFB6C1"); + /** + * The color Pink + * + * + * + * + *
 
+ **/ + public static final Color Pink = Color.decode("#FFC0CB"); + } + public static class Purples + { + /** + * The color Indigo + * + * + * + * + *
 
+ **/ + public static final Color Indigo = Color.decode("#4B0082"); + /** + * The color Purple + * + * + * + * + *
 
+ **/ + public static final Color Purple = Color.decode("#800080"); + /** + * The color DarkSlateBlue + * + * + * + * + *
 
+ **/ + public static final Color DarkSlateBlue = Color.decode("#483D8B"); + /** + * The color DarkMagenta + * + * + * + * + *
 
+ **/ + public static final Color DarkMagenta = Color.decode("#8B008B"); + /** + * The color MediumVioletRed + * + * + * + * + *
 
+ **/ + public static final Color MediumVioletRed = Color.decode("#C71585"); + /** + * The color DarkViolet + * + * + * + * + *
 
+ **/ + public static final Color DarkViolet = Color.decode("#9400D3"); + /** + * The color SlateBlue + * + * + * + * + *
 
+ **/ + public static final Color SlateBlue = Color.decode("#6A5ACD"); + /** + * The color BlueViolet + * + * + * + * + *
 
+ **/ + public static final Color BlueViolet = Color.decode("#8A2BE2"); + /** + * The color DarkOrchid + * + * + * + * + *
 
+ **/ + public static final Color DarkOrchid = Color.decode("#9932CC"); + /** + * The color MediumSlateBlue + * + * + * + * + *
 
+ **/ + public static final Color MediumSlateBlue = Color.decode("#7B68EE"); + /** + * The color RosyBrown + * + * + * + * + *
 
+ **/ + public static final Color RosyBrown = Color.decode("#BC8F8F"); + /** + * The color MediumPurple + * + * + * + * + *
 
+ **/ + public static final Color MediumPurple = Color.decode("#9370DB"); + /** + * The color PaleVioletRed + * + * + * + * + *
 
+ **/ + public static final Color PaleVioletRed = Color.decode("#DB7093"); + /** + * The color MediumOrchid + * + * + * + * + *
 
+ **/ + public static final Color MediumOrchid = Color.decode("#BA55D3"); + /** + * The color Fuchsia + * + * + * + * + *
 
+ **/ + public static final Color Fuchsia = Color.decode("#FF00FF"); + /** + * The color Magenta + * + * + * + * + *
 
+ **/ + public static final Color Magenta = Color.decode("#FF00FF"); + /** + * The color Orchid + * + * + * + * + *
 
+ **/ + public static final Color Orchid = Color.decode("#DA70D6"); + /** + * The color Plum + * + * + * + * + *
 
+ **/ + public static final Color Plum = Color.decode("#DDA0DD"); + /** + * The color Violet + * + * + * + * + *
 
+ **/ + public static final Color Violet = Color.decode("#EE82EE"); + /** + * The color Thistle + * + * + * + * + *
 
+ **/ + public static final Color Thistle = Color.decode("#D8BFD8"); + /** + * The color Lavender + * + * + * + * + *
 
+ **/ + public static final Color Lavender = Color.decode("#E6E6FA"); + } + public static class Reds + { + /** + * The color DarkRed + * + * + * + * + *
 
+ **/ + public static final Color DarkRed = Color.decode("#8B0000"); + /** + * The color FireBrick + * + * + * + * + *
 
+ **/ + public static final Color FireBrick = Color.decode("#B22222"); + /** + * The color Red + * + * + * + * + *
 
+ **/ + public static final Color Red = Color.decode("#FF0000"); + /** + * The color Crimson + * + * + * + * + *
 
+ **/ + public static final Color Crimson = Color.decode("#DC143C"); + /** + * The color OrangeRed + * + * + * + * + *
 
+ **/ + public static final Color OrangeRed = Color.decode("#FF4500"); + /** + * The color MediumVioletRed + * + * + * + * + *
 
+ **/ + public static final Color MediumVioletRed = Color.decode("#C71585"); + /** + * The color IndianRed + * + * + * + * + *
 
+ **/ + public static final Color IndianRed = Color.decode("#CD5C5C"); + /** + * The color Tomato + * + * + * + * + *
 
+ **/ + public static final Color Tomato = Color.decode("#FF6347"); + /** + * The color PaleVioletRed + * + * + * + * + *
 
+ **/ + public static final Color PaleVioletRed = Color.decode("#DB7093"); + /** + * The color Salmon + * + * + * + * + *
 
+ **/ + public static final Color Salmon = Color.decode("#FA8072"); + /** + * The color LightCoral + * + * + * + * + *
 
+ **/ + public static final Color LightCoral = Color.decode("#F08080"); + /** + * The color DarkSalmon + * + * + * + * + *
 
+ **/ + public static final Color DarkSalmon = Color.decode("#E9967A"); + /** + * The color LightSalmon + * + * + * + * + *
 
+ **/ + public static final Color LightSalmon = Color.decode("#FFA07A"); + } + public static class Whites + { + /** + * The color AntiqueWhite + * + * + * + * + *
 
+ **/ + public static final Color AntiqueWhite = Color.decode("#FAEBD7"); + /** + * The color MistyRose + * + * + * + * + *
 
+ **/ + public static final Color MistyRose = Color.decode("#FFE4E1"); + /** + * The color Beige + * + * + * + * + *
 
+ **/ + public static final Color Beige = Color.decode("#F5F5DC"); + /** + * The color Linen + * + * + * + * + *
 
+ **/ + public static final Color Linen = Color.decode("#FAF0E6"); + /** + * The color OldLace + * + * + * + * + *
 
+ **/ + public static final Color OldLace = Color.decode("#FDF5E6"); + /** + * The color Honeydew + * + * + * + * + *
 
+ **/ + public static final Color Honeydew = Color.decode("#F0FFF0"); + /** + * The color WhiteSmoke + * + * + * + * + *
 
+ **/ + public static final Color WhiteSmoke = Color.decode("#F5F5F5"); + /** + * The color Seashell + * + * + * + * + *
 
+ **/ + public static final Color Seashell = Color.decode("#FFF5EE"); + /** + * The color LavenderBlush + * + * + * + * + *
 
+ **/ + public static final Color LavenderBlush = Color.decode("#FFF0F5"); + /** + * The color AliceBlue + * + * + * + * + *
 
+ **/ + public static final Color AliceBlue = Color.decode("#F0F8FF"); + /** + * The color FloralWhite + * + * + * + * + *
 
+ **/ + public static final Color FloralWhite = Color.decode("#FFFAF0"); + /** + * The color MintCream + * + * + * + * + *
 
+ **/ + public static final Color MintCream = Color.decode("#F5FFFA"); + /** + * The color Azure + * + * + * + * + *
 
+ **/ + public static final Color Azure = Color.decode("#F0FFFF"); + /** + * The color Ivory + * + * + * + * + *
 
+ **/ + public static final Color Ivory = Color.decode("#FFFFF0"); + /** + * The color GhostWhite + * + * + * + * + *
 
+ **/ + public static final Color GhostWhite = Color.decode("#F8F8FF"); + /** + * The color Snow + * + * + * + * + *
 
+ **/ + public static final Color Snow = Color.decode("#FFFAFA"); + /** + * The color White + * + * + * + * + *
 
+ **/ + public static final Color White = Color.decode("#FFFFFF"); + } + public static class Yellows + { + /** + * The color DarkGoldenrod + * + * + * + * + *
 
+ **/ + public static final Color DarkGoldenrod = Color.decode("#B8860B"); + /** + * The color Goldenrod + * + * + * + * + *
 
+ **/ + public static final Color Goldenrod = Color.decode("#DAA520"); + /** + * The color Gold + * + * + * + * + *
 
+ **/ + public static final Color Gold = Color.decode("#FFD700"); + /** + * The color DarkKhaki + * + * + * + * + *
 
+ **/ + public static final Color DarkKhaki = Color.decode("#BDB76B"); + /** + * The color Yellow + * + * + * + * + *
 
+ **/ + public static final Color Yellow = Color.decode("#FFFF00"); + /** + * The color Khaki + * + * + * + * + *
 
+ **/ + public static final Color Khaki = Color.decode("#F0E68C"); + /** + * The color PaleGoldenrod + * + * + * + * + *
 
+ **/ + public static final Color PaleGoldenrod = Color.decode("#EEE8AA"); + /** + * The color PeachPuff + * + * + * + * + *
 
+ **/ + public static final Color PeachPuff = Color.decode("#FFDAB9"); + /** + * The color Moccasin + * + * + * + * + *
 
+ **/ + public static final Color Moccasin = Color.decode("#FFE4B5"); + /** + * The color PapayaWhip + * + * + * + * + *
 
+ **/ + public static final Color PapayaWhip = Color.decode("#FFEFD5"); + /** + * The color LemonChiffon + * + * + * + * + *
 
+ **/ + public static final Color LemonChiffon = Color.decode("#FFFACD"); + /** + * The color LightGoldenrodYellow + * + * + * + * + *
 
+ **/ + public static final Color LightGoldenrodYellow = Color.decode("#FAFAD2"); + /** + * The color LightYellow + * + * + * + * + *
 
+ **/ + public static final Color LightYellow = Color.decode("#FFFFE0"); + } + private static Random RANDOM = new Random(); + public static Color darken(Color color) + { + int red = decrease(color.getRed(), 10); + int green = decrease(color.getGreen(), 10); + int blue = decrease(color.getBlue(), 10); + return new Color(red, green, blue); + } + private static int decrease(int amount, int decreaseBy) + { + return Math.max(0, amount - decreaseBy); + } + public static Color lighten(Color color) + { + int red = increase(color.getRed(), 10); + int green = increase(color.getGreen(), 10); + int blue = increase(color.getBlue(), 10); + return new Color(red, green, blue); + } + private static int increase(int amount, int increaseBy) + { + return Math.min(255, amount + increaseBy); + } + public static Color getRandomColor() + { + return new Color(RANDOM.nextInt(255), RANDOM.nextInt(255), RANDOM.nextInt(255)); + } + public static void mockRandom() + { + RANDOM.setSeed(5); + } + public static int calculateTransparency(int percentTransparent) + { + int opacity = (percentTransparent * 255) / 100; + return (255 - opacity); + } + public static Color getTransparentVersion(Color color, int percentTransparency) + { + return new Color(color.getRed(), color.getGreen(), color.getBlue(), calculateTransparency(percentTransparency)); + } +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/Comparator.java b/src/main/java/com/spun/util/Comparator.java new file mode 100644 index 0000000..4630fc4 --- /dev/null +++ b/src/main/java/com/spun/util/Comparator.java @@ -0,0 +1,7 @@ +package com.spun.util; + +/***********************************************************************/ +public interface Comparator +{ + public boolean isEqual(Object one, Object other); +} diff --git a/src/main/java/com/spun/util/ConditionListener.java b/src/main/java/com/spun/util/ConditionListener.java new file mode 100644 index 0000000..b26255e --- /dev/null +++ b/src/main/java/com/spun/util/ConditionListener.java @@ -0,0 +1,14 @@ +package com.spun.util; + +/** + * Listens to the state of a EnabledConditions object + **/ + + +public interface ConditionListener +{ + /**************************************************************************/ + public void conditionsChanged(EnabledConditions caller); + /**************************************************************************/ + /**************************************************************************/ +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/ConfigXMLFileReader.java b/src/main/java/com/spun/util/ConfigXMLFileReader.java new file mode 100644 index 0000000..60878e7 --- /dev/null +++ b/src/main/java/com/spun/util/ConfigXMLFileReader.java @@ -0,0 +1,56 @@ +package com.spun.util; + +import java.lang.reflect.Field; +import java.util.HashMap; + +import com.spun.util.io.XMLUtils; + +/** + * @author Llewellyn Falco + * + * To change the template for this generated type comment go to + * Window - Preferences - Java - Code Generation - Code and Comments + */ +public class ConfigXMLFileReader +{ + /***********************************************************************/ + public static String loadXML(Class clazz, String exclude[], String fileLocation, String[] backupPaths) throws Exception + { + String fileNameUsed = XMLUtils.locateFile(fileLocation, backupPaths); + loadXML(clazz, exclude,fileNameUsed); + return fileNameUsed; + } + /***********************************************************************/ + public static void loadXML(Class clazz, String exclude[], String knownFileLocation) throws Exception + { + HashMap properties = XMLUtils.parseProperties(knownFileLocation, new ConfigXMLNodeExtractor()); + loadClass(clazz, exclude, properties); + } + /***********************************************************************/ + private static void loadClass(Class clazz, String exclude[], HashMap properties) throws IllegalArgumentException, IllegalAccessException + { + Field[] fields = ConfigXMLFileWriter.getFields(clazz, exclude); + for (int i = 0; i < fields.length; i++) + { + assignField(fields[i], properties); + } + //My_System.variable("fields " ,ObjectUtils.extractArray(fields, "getName")); + } + /***********************************************************************/ + private static void assignField(Field field, HashMap properties) throws IllegalArgumentException, IllegalAccessException + { + String name = field.getName(); + Object value = properties.get(name); + if (value == null) {} // do nothing, leave default + else if (field.getType().isAssignableFrom(String.class)) { field.set(null, value); } + else if (field.getType().isAssignableFrom(String[].class)) { field.set(null, value); } + else if (field.getType().isAssignableFrom(int.class)) { field.setInt(null, NumberUtils.load((String) value, field.getInt(null))); } + else if (field.getType().isAssignableFrom(double.class)) { field.setDouble(null, NumberUtils.load((String) value, field.getDouble(null))); } + else if (field.getType().isAssignableFrom(boolean.class)) { field.setBoolean(null, NumberUtils.load((String) value, field.getBoolean(null))); } + else { throw new Error("don't know how to handle field of type " + field.getType().getName());} + + } + + /***********************************************************************/ + /***********************************************************************/ +} diff --git a/src/main/java/com/spun/util/ConfigXMLFileWriter.java b/src/main/java/com/spun/util/ConfigXMLFileWriter.java new file mode 100644 index 0000000..334ec16 --- /dev/null +++ b/src/main/java/com/spun/util/ConfigXMLFileWriter.java @@ -0,0 +1,102 @@ +package com.spun.util; + +import java.io.DataOutputStream; +import java.io.FileOutputStream; +import java.lang.reflect.Field; +import java.util.Arrays; +import java.util.List; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.transform.OutputKeys; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; + +import org.lambda.functions.implementations.F1; +import org.lambda.functions.implementations.S1; +import org.lambda.query.Query; +import org.w3c.dom.Document; +import org.w3c.dom.Element; + +/** + * A static class of convenience functions for database access + **/ +public class ConfigXMLFileWriter +{ + /************************************************************************/ + public static void writeToFile(Class clazz, String fileName, String exclude[]) throws Exception + { + Document domDocument = createDocument(); + Field fields[] = getFields(clazz, exclude); + for (int i = 0; i < fields.length; i++) + { + addLine(fields[i], domDocument); + } + writeToIndentedXMLFile(fileName, domDocument); + } + /***********************************************************************/ + private static void addLine(Field field, Document domDocument) + { + Element elem = domDocument.createElement(field.getName()); + if (field.getType().isArray()) + { + Element inner = domDocument.createElement("VALUE"); + inner.appendChild(domDocument.createTextNode(" ")); + elem.appendChild(inner); + inner = domDocument.createElement("VALUE"); + inner.appendChild(domDocument.createTextNode(" ")); + elem.appendChild(inner); + } + else + { + elem.appendChild(domDocument.createTextNode(" ")); + } + domDocument.getDocumentElement().appendChild(elem); + } + /***********************************************************************/ + public static Field[] getFields(Class clazz, String... exclude) + { + Field fields[] = clazz.getFields(); + Field a = fields[0]; + final List excludeNames = Arrays.asList(exclude); + F1 selector = new F1(a, excludeNames) + { + { + ret(ClassUtils.IsPublicStatic(a) && ClassUtils.isPrimitiveField(a) && !excludeNames.contains(a.getName())); + } + }; + fields = Query.where(fields, selector).toArray(new Field[0]); + return Query.orderBy(fields, new S1(a) + { + { + ret(a.getName()); + } + }); + } + /***********************************************************************/ + private static Document createDocument() throws Exception + { + DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); + documentBuilderFactory.setNamespaceAware(false); + documentBuilderFactory.setIgnoringElementContentWhitespace(true); + DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); + return documentBuilder.getDOMImplementation().createDocument("", "XML", null); + } + /***********************************************************************/ + public static void writeToIndentedXMLFile(String configFile, Document domDocument) throws Exception + { + DataOutputStream out = new DataOutputStream(new FileOutputStream(configFile)); + TransformerFactory tFactory = TransformerFactory.newInstance(); + Transformer transformer = tFactory.newTransformer(); + DOMSource source = new DOMSource(domDocument); + StreamResult result = new StreamResult(out); + transformer.setOutputProperty(OutputKeys.INDENT, "yes"); + transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); + transformer.transform(source, result); + out.close(); + } + /************************************************************************/ + /************************************************************************/ +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/ConfigXMLNodeExtractor.java b/src/main/java/com/spun/util/ConfigXMLNodeExtractor.java new file mode 100644 index 0000000..06c71af --- /dev/null +++ b/src/main/java/com/spun/util/ConfigXMLNodeExtractor.java @@ -0,0 +1,36 @@ +package com.spun.util; + +import java.util.ArrayList; +import java.util.HashMap; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import com.spun.util.io.XMLNodeExtractor; + +public class ConfigXMLNodeExtractor implements XMLNodeExtractor +{ + /***********************************************************************/ + public void extractProperty(Node node, HashMap properties) + { + //String name = node.getNodeName(); + if (XMLNodeExtractor.Utils.extractSingleton(node, properties)) + { + // do nothing + } + else if (node.getChildNodes().getLength() > 0) + { + NodeList childNodes = node.getChildNodes(); + ArrayList v = new ArrayList(); + for (int i = 0; i < childNodes.getLength(); i++) + { + if (childNodes.item(i).getNodeName().equals("VALUE")) + { + v.add(StringUtils.loadNullableString(childNodes.item(i).getChildNodes().item(0).getNodeValue())); + } + } + properties.put(node.getNodeName(), StringUtils.toArray(v)); + } + } + /***********************************************************************/ + /***********************************************************************/ +} diff --git a/src/main/java/com/spun/util/Country.java b/src/main/java/com/spun/util/Country.java new file mode 100644 index 0000000..12145e2 --- /dev/null +++ b/src/main/java/com/spun/util/Country.java @@ -0,0 +1,48 @@ +package com.spun.util; + + +public enum Country { + Albania, Algeria, AmericanSamoa("American Samoa"), Andorra, Angola, Anguilla, AntiguaAndBarbuda("Antigua & Barbuda"), Argentina, Armenia, Aruba, Australia, Austria, Azerbaijan, Azores, Bahamas, Bahrain, Bangladesh, Barbados, Belarus, Belgium, Belize, Benin, Bermuda, Bolivia, Bonaire, Bosnia, Botswana, Brazil, BritishVirginIsles( + "British Virgin Isles"), Brunei, Bulgaria, BurkinaFaso("Burkina Faso"), Burundi, Cambodia, Cameroon, Canada, CanaryIslands("Canary Islands"), CapeVerde( + "Cape Verde"), CaymanIslands("Cayman Islands"), CentralAfricanRepublic("Central African Republic"), Chad, ChannelIslands("Channel Islands"), Chile, Colombia, CookIslands( + "Cook Islands"), CostaRica("Costa Rica"), CotedIvoire("Cote d' Ivoire"), Croatia, Cuba, Curacao, Cyprus, CzechRepublic("Czech Republic"), DemRepublicofCongo( + "Dem. Republic of Congo"), Denmark, Djibouti, Dominica, DominicanRepublic("Dominican Republic"), Ecuador, Egypt, ElSalvador("El Salvador"), England, EquatorialGuinea( + "Equatorial Guinea"), Eritrea, Estonia, Ethiopia, FaeroeIslands("Faeroe Islands"), Fiji, Finland, France, FrenchGuiana("French Guiana"), FrenchPolynesia( + "French Polynesia"), Gabon, Gambia, Georgia, Germany, Ghana, Gibraltar, Greece, Greenland, Grenada, Guadeloupe, Guam, Guatemala, Guinea, GuineaBissau( + "Guinea-Bissau"), Guyana, Haiti, Holland, Honduras, HongKong("Hong Kong"), Hungary, Iceland, India, Indonesia, Iran, Iraq, Israel, Italy, Jamaica, Japan, Jordan, Kazakhstan, Kenya, Kiribati, Kosrae, Kuwait, Kyrgyzstan, Laos, Latvia, Lebanon, Lesotho, Liberia, Libya, Liechtenstein, Lithuania, Luxembourg, Macau, Macedonia, Madagascar, Madeira, Malawi, Malaysia, Maldives, Mali, Malta, MarshallIslands( + "Marshall Islands"), Martinique, Mauritania, Mauritius, Mexico, Micronesia, Moldova, Monaco, Mongolia, Montserrat, Morocco, Mozambique, Myanmar, NMarianaIslands( + "N. Mariana Islands"), Namibia, Nepal, Netherlands, NetherlandsAntilles("Netherlands Antilles"), NewCaledonia("New Caledonia"), NewZealand( + "New Zealand"), Nicaragua, Niger, Nigeria, NorfolkIsland("Norfolk Island"), NorthKorea("North Korea"), NorthernIreland("Northern Ireland"), Norway, Oman, Pakistan, Palau, Panama, PapuaNewGuinea( + "Papua New Guinea"), Paraguay, PeoplesRepublicofChina("Peoples Republic of China"), Peru, Philippines, Poland, Ponape, Portugal, PuertoRico( + "Puerto Rico"), Qatar, RepublicofCongo("Republic of Congo"), RepublicofIreland("Republic of Ireland"), RepublicofYemen("Republic of Yemen"), Reunion, Romania, Rota, Russia, Rwanda, Saba, Saipan, SanMarino( + "San Marino"), SaudiArabia("Saudi Arabia"), Scotland, Senegal, Seychelles, SierraLeone("Sierra Leone"), Singapore, Slovakia, Slovenia, SolomonIslands( + "Solomon Islands"), SouthAfrica("South Africa"), SouthKorea("South Korea"), Spain, SriLanka("Sri Lanka"), StVincentGrenadine( + "St Vincent/Grenadine"), StBarthelemy("St. Barthelemy"), StChristopher("St. Christopher"), StCroix("St. Croix"), StEustatius("St. Eustatius"), StJohn( + "St. John"), StKittsAndNevis("St. Kitts & Nevis"), StLucia("St. Lucia"), StMaarten("St. Maarten"), StMartin("St. Martin"), StThomas( + "St. Thomas"), Sudan, Suriname, Swaziland, Sweden, Switzerland, Syria, Tahiti, Taiwan, Tajikistan, Tanzania, Thailand, Tinian, Togo, Tonga, Tortola, TrinidadAndTobago( + "Trinidad & Tobago"), Truk, Tunisia, Turkey, Turkmenistan, TurksAndCaicosIsles("Turks & Caicos Isles"), Tuvalu, Uganda, Ukraine, UnionIsland( + "Union Island"), UnitedArabEmirates("United Arab Emirates"), UnitedKingdom("United Kingdom"), UnitedStates("United States"), Uruguay, USVirginIslands( + "US Virgin Islands"), Uzbekistan, Vanuatu, VaticanCityState("Vatican City State"), Venezuela, Vietnam, VirginGorda("Virgin Gorda"), WakeIsland( + "Wake Island"), Wales, WallisAndFutunaIsle("Wallis & Futuna Isle"), WesternSamoa("Western Samoa"), Yap, Yugoslavia, Zambia, Zimbabwe; + String altText = null; + private Country() + { + } + private Country(String altText) + { + this.altText = altText; + } + public String toString() + { + return altText == null ? super.toString() : altText; + } + private static String[] names = null; + public synchronized static String[] getStringValues() + { + if (names == null) + { + names = (String[]) ObjectUtils.extractArray(Country.values(),"toString"); + } + return names; + } +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/DatabaseConfiguration.java b/src/main/java/com/spun/util/DatabaseConfiguration.java new file mode 100644 index 0000000..ea24820 --- /dev/null +++ b/src/main/java/com/spun/util/DatabaseConfiguration.java @@ -0,0 +1,186 @@ +package com.spun.util; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.HashMap; +import java.util.Properties; +import com.spun.util.timers.Counter; + +/** + * A static class of convence functions for database access + **/ +public class DatabaseConfiguration +{ + private boolean inRollbackOnlyMode = false; + public String dataSourceName = null; + public String driver = null; + public String protocol = null; + public String server = null; + public String port = null; + public String database = null; + public String userName = null; + public String password = null; + public int type = 0; + public String wrapper = null; + private Counter connectionCounter = new Counter(); + private static HashMap wrappers = new HashMap(); + public static void registerWrapper(String name, DatabaseConfigurationWrapper wrapper) + { + wrappers.put(name, wrapper); + } + /************************************************************************/ + public DatabaseConfiguration(DatabaseConfiguration config) + { + this.dataSourceName = config.dataSourceName; + this.driver = config.driver; + this.protocol = config.protocol; + this.server = config.server; + this.port = config.port; + this.database = config.database; + this.userName = config.userName; + this.password = config.password; + this.type = config.type; + this.wrapper = config.wrapper; + } + /************************************************************************/ + public DatabaseConfiguration(String dataSourceName, String driver, String protocol, String server, String port, + String database, String userName, String password, int type) + { + this.dataSourceName = dataSourceName; + this.driver = driver; + this.protocol = protocol; + if (protocol != null && protocol.endsWith("://")) { throw new Error("protocol's shouldn't end with '://'"); } + this.server = server; + if (server != null && server.endsWith("/")) { throw new Error("server's shouldn't end with '/'"); } + this.port = port; + this.database = database; + this.userName = userName; + this.password = password; + this.type = type; + } + /************************************************************************/ + public boolean isDataSource() + { + return StringUtils.isNonZero(dataSourceName); + } + /************************************************************************/ + /** + * Convenience function. + **/ + public Properties getProperties() + { + Properties props = new Properties(); + props.setProperty("connection", "direct"); + props.setProperty("jdbcDriver", this.driver); + props.setProperty("jdbcURL", DatabaseUtils.makeURL(protocol, server, port, database, type)); + props.setProperty("user", this.userName); + props.setProperty("password", this.password); + return props; + } + /************************************************************************/ + public Connection makeConnection() + { + return makeConnection(database); + } + /************************************************************************/ + public Connection makeConnection(String databaseName) + { + connectionCounter.inc(); + Connection con = null; + if (wrapper == null) + { + con = DatabaseUtils.makeConnection(driver, protocol, server, port, databaseName, userName, password, type); + } + else + { + DatabaseConfigurationWrapper w = (DatabaseConfigurationWrapper) wrappers.get(wrapper); + if (w == null) { throw new Error("No wrapper found for '" + wrapper + "' in " + wrappers.keySet()); } + con = w.makeConnection(databaseName, this); + + } + if(this.inRollbackOnlyMode) + { + try + { + DatabaseUtils.beginTransaction(con); + } + catch (SQLException e) + { + throw ObjectUtils.throwAsError(e); + } + } + return con; + } + /************************************************************************/ + public Counter getConnectionCounter() + { + return connectionCounter; + } + /************************************************************************/ + public String toString() + { + String value = "com.spun.util.DatabaseConfiguration["; + value += " dataSourceName = '" + dataSourceName + "'" + ",\n" + " database = '" + database + "'" + ",\n" + + " driver = '" + driver + "'" + ",\n" + " password = '" + password + "'" + ",\n" + " port = '" + port + + "'" + ",\n" + " protocol = '" + protocol + "'" + ",\n" + " server = '" + server + "'" + ",\n" + + " type = " + type + ",\n" + " userName = '" + userName + "'" + "]"; + return value; + } + /************************************************************************/ + public String getDataSourceName() + { + return dataSourceName; + } + /************************************************************************/ + public String getDatabase() + { + return database; + } + /************************************************************************/ + public String getDriver() + { + return driver; + } + /************************************************************************/ + public String getPassword() + { + return password; + } + /************************************************************************/ + public String getProtocol() + { + return protocol; + } + /************************************************************************/ + public String getServer() + { + return server; + } + /************************************************************************/ + public int getType() + { + return type; + } + /************************************************************************/ + public String getUserName() + { + return userName; + } + /***********************************************************************/ + public int getPort() + { + return NumberUtils.load(port, 0); + } + /************************************************************************/ + public void setWrapper(String wrapper) + { + this.wrapper = wrapper; + } + /************************************************************************/ + public void setRollbackOnlyMode() + { + this.inRollbackOnlyMode = true; + } + /************************************************************************/ + /************************************************************************/ +} diff --git a/src/main/java/com/spun/util/DatabaseConfigurationWrapper.java b/src/main/java/com/spun/util/DatabaseConfigurationWrapper.java new file mode 100644 index 0000000..46f8aa1 --- /dev/null +++ b/src/main/java/com/spun/util/DatabaseConfigurationWrapper.java @@ -0,0 +1,12 @@ +package com.spun.util; + +import java.sql.Connection; + +/***********************************************************************/ +public interface DatabaseConfigurationWrapper +{ + /***********************************************************************/ + public Connection makeConnection(String databaseName, DatabaseConfiguration configuration); + /***********************************************************************/ + /***********************************************************************/ +} diff --git a/src/main/java/com/spun/util/DatabaseUtils.java b/src/main/java/com/spun/util/DatabaseUtils.java new file mode 100644 index 0000000..51f828b --- /dev/null +++ b/src/main/java/com/spun/util/DatabaseUtils.java @@ -0,0 +1,681 @@ +package com.spun.util; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.ArrayList; +import java.util.Iterator; +import com.spun.util.database.DatabaseObject; +import com.spun.util.database.DatabaseTransactionInfo; +import com.spun.util.database.SqlConnectionException; + +/** + * A static class of convenience functions for database access + */ +public class DatabaseUtils +{ + private static ArrayList connections = new ArrayList(); + public static final int NEW = 1; + public static final int NEW_MODIFIED = 2; + public static final int OLD = 3; + public static final int OLD_MODIFIED = 4; + public static final int ACCESS = 0; + public static final int POSTGRESQL = 1; + public static final int SYBASE = 2; + public static final int ORACLE = 3; + public static final int SQLSERVER = 4; + public static final int SQLSERVER2000 = 5; + public static final int MY_SQL = 6; + public static final int SQLSERVER2005 = 7; + public static final String DATABASE_TYPES[] = {"Access", + "PostgreSQL", + "Sybase", + "Oracle", + "Microsoft SQL Server 7.00", + "Microsoft SQL Server 2000", + "MySQL", + "Microsoft SQL Server" }; + /***********************************************************************/ + public static String getDatabaseType(int type) + { + return DATABASE_TYPES[type]; + } + /***********************************************************************/ + public static int getDatabaseType(Statement stmt) throws SQLException + { + return getDatabaseType(stmt.getConnection()); + } + /***********************************************************************/ + public static int getDatabaseType(Connection con) throws SQLException + { + String dbName = con.getMetaData().getDatabaseProductName(); + for (int i = 0; i < DATABASE_TYPES.length; i++) + { + if (DATABASE_TYPES[i].equalsIgnoreCase(dbName.trim())) { return i; } + } + throw new Error("Unrecognized database product name: " + dbName); + } + /***********************************************************************/ + /** + * Finds the database type name for a jdbc sql type + */ + public static String findDatabaseName(int i) + { + String name = null; + switch (i) + { + case java.sql.Types.BIT : + name = "boolean"; + break; + case java.sql.Types.CHAR : + name = "char"; + break; + case java.sql.Types.DECIMAL : + name = "decimal"; + break; + case java.sql.Types.DOUBLE : + name = "numeric"; + break; + case java.sql.Types.FLOAT : + name = "numeric"; + break; + case java.sql.Types.INTEGER : + name = "integer"; + break; + case java.sql.Types.NUMERIC : + name = "numeric"; + break; + case java.sql.Types.TIMESTAMP : + name = "timestamp"; + break; + case java.sql.Types.VARCHAR : + name = "varchar"; + break; + default : + MySystem.warning("The Type not found(" + i + ")"); + break; + } + return name; + } + /***********************************************************************/ + /** + * Finds the java object or primative for a sql type + */ + public static String findSQLName(int i) + { + String name = null; + switch (i) + { + case java.sql.Types.ARRAY : + name = "unknown"; + break; + case java.sql.Types.BIGINT : + name = "long"; + break; + case java.sql.Types.BINARY : + name = "byte[]"; + break; + case java.sql.Types.BIT : + name = "boolean"; + break; + case java.sql.Types.BLOB : + name = "BLOB"; + break; + case java.sql.Types.CHAR : + name = "java.lang.String"; + break; + case java.sql.Types.CLOB : + name = "CLOB"; + break; + case java.sql.Types.DATE : + name = "java.sql.Date"; + break; + case java.sql.Types.DECIMAL : + name = "java.math.BigDecimal"; + break; + case java.sql.Types.DISTINCT : + name = "DISTINCT"; + break; + case java.sql.Types.DOUBLE : + name = "double"; + break; + case java.sql.Types.FLOAT : + name = "double"; + break; + case java.sql.Types.INTEGER : + name = "int"; + break; + case java.sql.Types.JAVA_OBJECT : + name = "unknown"; + break; + case java.sql.Types.LONGVARBINARY : + name = "byte[]"; + break; + case java.sql.Types.LONGVARCHAR : + name = "String"; + break; + case java.sql.Types.NULL : + name = "NULL"; + break; + case java.sql.Types.NUMERIC : + name = "java.math.BigDecimal"; + break; + case java.sql.Types.OTHER : + name = "OTHER"; + break; + case java.sql.Types.REAL : + name = "float"; + break; + case java.sql.Types.REF : + name = "REF"; + break; + case java.sql.Types.SMALLINT : + name = "short"; + break; + case java.sql.Types.STRUCT : + name = "STRUCT"; + break; + case java.sql.Types.TIME : + name = "java.sql.Time"; + break; + case java.sql.Types.TIMESTAMP : + name = "java.sql.Timestamp"; + break; + case java.sql.Types.TINYINT : + name = "byte"; + break; + case java.sql.Types.VARBINARY : + name = "byte[]"; + break; + case java.sql.Types.VARCHAR : + name = "java.lang.String"; + break; + case 11 : + name = "java.sql.Date"; + break; + case -9 : + name = "java.lang.String"; + break; + default : + MySystem.warning("The Type not found(" + i + ")"); + printSQLValues(); + break; + } + return name; + } + public static boolean isSqlServer(int databaseType) + { + switch (databaseType) + { + case SQLSERVER2000 : + case DatabaseUtils.SQLSERVER2005 : + case DatabaseUtils.SQLSERVER : + return true; + default : + return false; + } + } + /***********************************************************************/ + public static String makeSQL2000URL(String protocol, String server, String port, String database) + { + String theURL = ""; + protocol = (StringUtils.isNonZero(protocol)) ? (protocol) + "://" : ""; + server = (StringUtils.isNonZero(server)) ? (server) : ""; + port = (StringUtils.isNonZero(port)) ? (":" + port) : ""; + database = (StringUtils.isNonZero(database)) ? (";DatabaseName=" + database) : ""; + theURL = protocol + server + port + database + ";SelectMethod=cursor"; + return theURL; + } + /***********************************************************************/ + /** + * Creates a connection to the Database. + */ + public static String makeMySqlURL(String protocol, String server, String port, String database) + { + String theURL = ""; + protocol = (StringUtils.isNonZero(protocol)) ? (protocol) + "://" : ""; + server = (StringUtils.isNonZero(server)) ? (server) : ""; + port = (StringUtils.isNonZero(port)) ? (":" + port) : ""; + database = (StringUtils.isNonZero(database)) ? ("/" + database) : ""; + theURL = protocol + server + port + database; + return theURL; + } + /***********************************************************************/ + /** + * Creates a connection to the Database, and stores it in the cookies table. + */ + public static String makeURL(String protocol, String server, String port, String database, int type) + { + switch (type) + { + case ACCESS : + return makeJDBCAccessURL(protocol, server, port, database); + case SQLSERVER2000 : + case DatabaseUtils.SQLSERVER2005 : + return makeSQL2000URL(protocol, server, port, database); + case ORACLE : + case SQLSERVER : + case POSTGRESQL : + case SYBASE : + return makeMySqlURL(protocol, server, port, database); + case MY_SQL : + return makeMySqlURL(protocol, server, port, database) + "?useUnicode=true&characterEncoding=UTF-8"; + } + throw new Error("Database Type '" + type + "' not supported"); + } + /***********************************************************************/ + /** + * Creates a connection to the Database. This is for Access, which is crap! + */ + public static String makeJDBCAccessURL(String protocol, String server, String port, String database) + { + String theURL = ""; + // port = (StringUtils.isNonZero(port)) ? (":" + port) : ""; + // server = (StringUtils.isNonZero(server)) ? (server) : ""; + database = (StringUtils.isNonZero(database)) ? ("" + database) : ""; + theURL = protocol + database; + return theURL; + } + /***********************************************************************/ + /** + * Creates a connection to the Database. + */ + public static Connection makeConnection(String driver, String protocol, String server, String port, + String database, String userName, String password, int type) + { + Connection con = null; + String theURL = null; + try + { + driver = (StringUtils.isNonZero(driver)) ? (driver) : "sun.jdbc.odbc.JdbcOdbcDriver"; + theURL = makeURL(protocol, server, port, database, type); + MySystem.variable("URL = " + theURL); + // My_System.variable(driver); + Class.forName(driver).newInstance(); + con = DriverManager.getConnection(theURL, userName, password); + } + catch (SQLException e) + { + throw new SqlConnectionException(driver, theURL, protocol, server, port, database, userName, password, type, + e); + } + catch (Exception e) + { + MySystem.warning("URL : " + theURL); + ObjectUtils.throwAsError(e); + } + return con; + } + /***********************************************************************/ + public static void printSQLValues() + { + MySystem.variable("java.sql.Types.BIT = " + java.sql.Types.BIT); + MySystem.variable("java.sql.Types.TINYINT = " + java.sql.Types.TINYINT); + MySystem.variable("java.sql.Types.BIGINT = " + java.sql.Types.BIGINT); + MySystem.variable("java.sql.Types.LONGVARBINARY = " + java.sql.Types.LONGVARBINARY); + MySystem.variable("java.sql.Types.VARBINARY = " + java.sql.Types.VARBINARY); + MySystem.variable("java.sql.Types.BINARY = " + java.sql.Types.BINARY); + MySystem.variable("java.sql.Types.LONGVARCHAR = " + java.sql.Types.LONGVARCHAR); + MySystem.variable("java.sql.Types.NULL = " + java.sql.Types.NULL); + MySystem.variable("java.sql.Types.CHAR = " + java.sql.Types.CHAR); + MySystem.variable("java.sql.Types.NUMERIC = " + java.sql.Types.NUMERIC); + MySystem.variable("java.sql.Types.DECIMAL = " + java.sql.Types.DECIMAL); + MySystem.variable("java.sql.Types.INTEGER = " + java.sql.Types.INTEGER); + MySystem.variable("java.sql.Types.SMALLINT = " + java.sql.Types.SMALLINT); + MySystem.variable("java.sql.Types.FLOAT = " + java.sql.Types.FLOAT); + MySystem.variable("java.sql.Types.REAL = " + java.sql.Types.REAL); + MySystem.variable("java.sql.Types.DOUBLE = " + java.sql.Types.DOUBLE); + MySystem.variable("java.sql.Types.VARCHAR = " + java.sql.Types.VARCHAR); + MySystem.variable("java.sql.Types.DATE = " + java.sql.Types.DATE); + MySystem.variable("java.sql.Types.TIME = " + java.sql.Types.TIME); + MySystem.variable("java.sql.Types.TIMESTAMP = " + java.sql.Types.TIMESTAMP); + MySystem.variable("java.sql.Types.OTHER = " + java.sql.Types.OTHER); + MySystem.variable("java.sql.Types.JAVA_OBJECT = " + java.sql.Types.JAVA_OBJECT); + MySystem.variable("java.sql.Types.DISTINCT = " + java.sql.Types.DISTINCT); + MySystem.variable("java.sql.Types.STRUCT = " + java.sql.Types.STRUCT); + MySystem.variable("java.sql.Types.ARRAY = " + java.sql.Types.ARRAY); + MySystem.variable("java.sql.Types.BLOB = " + java.sql.Types.BLOB); + MySystem.variable("java.sql.Types.CLOB = " + java.sql.Types.CLOB); + MySystem.variable("java.sql.Types.REF = " + java.sql.Types.REF); + } + /***********************************************************************/ + public static String getMethodName(String databaseName) + { + return getVariableName(databaseName, true); + } + /***********************************************************************/ + public static String getVariableName(String databaseName) + { + return getVariableName(databaseName, false); + } + /***********************************************************************/ + public static String getVariableName(String databaseName, boolean capFirstLetter) + { + StringBuffer returning = new StringBuffer(databaseName.length()); + String upper = databaseName.toUpperCase(); + int place = 0; + while (place < databaseName.length()) + { + char letter = databaseName.charAt(place); + if (letter == '_') + { + returning.append(upper.charAt(++place)); + } + else if ((place == 0) && (capFirstLetter)) + { + returning.append(upper.charAt(0)); + } + else + { + returning.append(letter); + } + place++; + } + return returning.toString(); + } + /***********************************************************************/ + public static String formatNullableObject(Object o) + { + return formatNullableObject(o, POSTGRESQL); + } + /***********************************************************************/ + public static String formatNullableObject(Object o, int type) + { + if (o == null) + { + return "null"; + } + else + { + if (o instanceof Integer) + { + return o.toString(); + } + else + { + String text = null; + switch (type) + { + case DatabaseUtils.SQLSERVER2005 : + case SQLSERVER2000 : + case SQLSERVER : + text = "'" + toEscapeMSSQL(o.toString()) + "'"; + break; + case ACCESS : + text = "'" + toEscapeACCESS_SQL(o.toString()) + "'"; + break; + case ORACLE : + case POSTGRESQL : + case SYBASE : + text = "'" + toEscapeSQL(o.toString()) + "'"; + break; + } + return text; + } + } + } + /***********************************************************************/ + public static String toEscapeMSSQL(String unformattedString) + { + if (unformattedString.indexOf('\'') == -1) { return unformattedString; } + StringBuffer b = new StringBuffer(unformattedString); + for (int i = 0; i < b.length(); i++) + { + char c = b.charAt(i); + switch (c) + { + case '\'' : + b.insert(i, '\''); + i++; + break; + } + } + return b.toString(); + } + /***********************************************************************/ + public static String toEscapeACCESS_SQL(String unformattedString) + { + if ((unformattedString.indexOf('\'') == -1) && (unformattedString.indexOf('\"') == -1) + && (unformattedString.indexOf('\\') == -1)) { return unformattedString; } + StringBuffer b = new StringBuffer(unformattedString); + for (int i = 0; i < b.length(); i++) + { + char c = b.charAt(i); + switch (c) + { + case '\"' : + case '\\' : + b.insert(i, '\\'); + i++; + break; + case '\'' : + b.insert(i, '\''); + i++; + break; + } + } + return b.toString(); + } + /***********************************************************************/ + public static String toEscapeSQL(String unformattedString) + { + if ((unformattedString == null) + || ((unformattedString.indexOf('\'') == -1) && (unformattedString.indexOf('\"') == -1) && (unformattedString + .indexOf('\\') == -1))) { return unformattedString; } + StringBuffer b = new StringBuffer(unformattedString); + for (int i = 0; i < b.length(); i++) + { + char c = b.charAt(i); + switch (c) + { + case '\"' : + case '\\' : + case '\'' : + b.insert(i, '\\'); + i++; + break; + } + } + return b.toString(); + } + /***********************************************************************/ + public static void beginTransaction(Statement stmt) throws SQLException + { + beginTransaction(stmt.getConnection(), 1); + } + /***********************************************************************/ + public static void beginTransaction(Connection con) throws SQLException + { + beginTransaction(con, 1); + } + /***********************************************************************/ + private static void beginTransaction(Connection con, int offset) throws SQLException + { + if (getConnection(connections, con) == null) + { + synchronized (connections) + { + //My_System.event("Starting transaction " + DatabaseTransactionInfo.getOriginatorText(offset + 1)); + connections.add(new DatabaseTransactionInfo(con, 1 + offset)); + } + con.setAutoCommit(false); + } + else + { + //My_System.event("already exist"); + } + } + /***********************************************************************/ + private static DatabaseTransactionInfo getConnection(ArrayList connections2, + Connection con) + { + for (DatabaseTransactionInfo info : connections2) + { + if (con.equals(info.getConnection())) { return info; } + } + return null; + } + /***********************************************************************/ + public static void commit(Statement stmt) throws SQLException + { + commit(stmt.getConnection(), 1); + } + /***********************************************************************/ + public static void commit(Connection con) throws SQLException + { + commit(con, 1); + } + /***********************************************************************/ + private static void commit(Connection con, int offset) throws SQLException + { + DatabaseTransactionInfo commit = null; + synchronized (connections) + { + Iterator i = connections.iterator(); + while (i.hasNext()) + { + DatabaseTransactionInfo held = (DatabaseTransactionInfo) i.next(); + if (held.isFinalizeable()) + { + i.remove(); + } + else if (held.isOriginator(con, 1 + offset)) + { + commit = held; + i.remove(); + } + } + } + if (commit != null) + { + con.commit(); + commit.cleanConnection(); + } + } + /***********************************************************************/ + public static void rollback(Statement stmt) throws SQLException + { + rollback(stmt.getConnection()); + } + /***********************************************************************/ + public static void rollback(Connection con) throws SQLException + { + if (con != null) + { + con.rollback(); + } + } + /***********************************************************************/ + public static String formatBoolean(boolean b) + { + return (b) ? "'1'" : "'0'"; // added quotes for postgres + } + /***********************************************************************/ + /** + * This is for none space single words, such as email, name, handle + */ + public static boolean isAcceptableDatabaseString(String string) + { + if (string == null) { return true; } + for (int i = 0; i < string.length(); i++) + { + char c = string.charAt(i); + boolean bad = false; + bad = (c == ' ') || (c == '\n') || (c == '\t') || (c == '\'') || (c == '"'); + if (bad) { return false; } + } + return true; + } + /***********************************************************************/ + public static String getLike(int databaseType) + { + return databaseType == POSTGRESQL ? "ILIKE" : "LIKE"; + } + /***********************************************************************/ + /** + * A convenience function to turn the int's into readable text for debuging. + * + * @param status + * The status to be translated + * @return The Text representation of static variable. + * @see com.spun.utilDatabaseUtils#NEW + * @see com.spun.utilDatabaseUtils#NEW_MODIFIED + * @see com.spun.utilDatabaseUtils#OLD + * @see com.spun.utilDatabaseUtils#OLD_MODIFIED + */ + public static final String getDatabaseStatusString(int status) + { + String value = "UNKNOWN DATABASE STATUS"; + switch (status) + { + case DatabaseUtils.NEW : + value = "DatabaseUtils.NEW"; + break; + case DatabaseUtils.OLD : + value = "DatabaseUtils.OLD"; + break; + case DatabaseUtils.NEW_MODIFIED : + value = "DatabaseUtils.NEWMODIFIED"; + break; + case DatabaseUtils.OLD_MODIFIED : + value = "DatabaseUtils.OLDMODIFIED"; + break; + } + return value; + } + /***********************************************************************/ + public static void saveAll(DatabaseObject[] databaseObjects, Statement stmt) throws SQLException + { + for (int i = 0; i < databaseObjects.length; i++) + { + databaseObjects[i].save(stmt); + } + } + /***********************************************************************/ + public static void close(ResultSet rs) + { + if (rs != null) + { + try + { + rs.close(); + } + catch (SQLException e) + { + throw ObjectUtils.throwAsError(e); + } + } + } + /***********************************************************************/ + public static void close(Statement stmt) + { + if (stmt != null) + { + try + { + stmt.close(); + } + catch (SQLException e) + { + throw ObjectUtils.throwAsError(e); + } + } + } + /***********************************************************************/ + public static void close(Connection con) + { + if (con != null) + { + try + { + con.close(); + } + catch (SQLException e) + { + throw ObjectUtils.throwAsError(e); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/DateDifference.java b/src/main/java/com/spun/util/DateDifference.java new file mode 100644 index 0000000..ccfee2b --- /dev/null +++ b/src/main/java/com/spun/util/DateDifference.java @@ -0,0 +1,279 @@ +package com.spun.util; + +import java.util.Calendar; +import java.util.Date; + +public class DateDifference +{ + public static final String STANDARD_TIME_TEXT[] = {"Year", "Years", "Month", "Months", "Week", "Weeks", "Day", "Days", "Hour", "Hours", "Min", "Mins", "Sec", "Secs", "Milli", "Millis"}; + public static final String MILLISECONDS = "milliseconds"; + public static final String SECONDS = "seconds"; + public static final String MINUTES = "minutes"; + public static final String HOURS = "hours"; + public static final String DAYS = "days"; + public static final String WEEKS = "weeks"; + public static final String MONTHS = "months"; + public static final String YEARS = "years"; + public static String TIME_UNITS[] = {YEARS, MONTHS, WEEKS, DAYS, HOURS, MINUTES, SECONDS, MILLISECONDS}; + // assumes a 30 day month + private static int TIME_SCALE[] = {Calendar.YEAR, Calendar.MONTH, Calendar.WEEK_OF_YEAR, Calendar.DATE, Calendar.HOUR, Calendar.MINUTE, Calendar.SECOND, Calendar.MILLISECOND}; + private static long DIVIDERS[] = {1000 * 60 * 60 * 24 * 365L, 1000 * 60 * 60 * 24 * 30L, 1000 * 60 * 60 * 24 * 7L, 1000 * 60 * 60 * 24L, 1000 * 60 * 60L, 1000 * 60L, 1000L, 1L}; + /************************************************************************/ + private long milli; + /************************************************************************/ + public DateDifference(long timeDifference) + { + this.milli = timeDifference; + } + /************************************************************************/ + public DateDifference(Date date1, Date date2) + { + milli = date1.getTime() - date2.getTime(); + if (milli < 0) + { + milli = milli * -1; + } + // My_System.variable("dateDifference = " + milli); + } + /************************************************************************/ + /** + * Debugging tool. + **/ + public static void printDividers() + { + MySystem.variable("max long = " + Long.MAX_VALUE); + for (int i = 0; i < DIVIDERS.length; i++) + { + MySystem.variable("" + DIVIDERS[i]); + } + } + /************************************************************************/ + /** + * Gets the amount of [Units].
+ * i.e.
+ * Given a DateDifference of 2 Days 3 Hours 4 Minutes
+ * getAbsoluteDifference(Calendar.DATE) = 2 + * getAbsoluteDifference(Calendar.HOUR) = 51 + **/ + public long getAbsoluteDifference(int unit) + { + return getAbsoluteDifference(unit, this.milli); + } + /************************************************************************/ + public long getAbsoluteDifference(String unit) + { + return getAbsoluteDifference(convertUnitString(unit)); + } + /************************************************************************/ + public long getRoundedDifference(String unit) + { + return getRoundedDifference(convertUnitString(unit),this.milli); + } + /************************************************************************/ + public long getRoundedDifference(int unit) + { + return getRoundedDifference(unit,this.milli); + } + /************************************************************************/ + public static long getAbsoluteDifference(int unit, long time) + { + // My_System.variable("divider = " + DIVIDERS[getIndex(unit)]); + return time / DIVIDERS[getTimeScaleIndex(unit)]; + } + /************************************************************************/ + public static long getRoundedDifference(int unit, long time) + { + return Math.round(((double)time) / DIVIDERS[getTimeScaleIndex(unit)]); + } + /************************************************************************/ + /** + * Gets the remaining amount of [Units].
+ * i.e.
+ * Given a DateDifference of 1 Month 2 Weeks 3 Days, + * getRemainingDifference(days, months) = 17 days
+ * getRemainingDifference(days, weeks) = 3 days
+ **/ + public long getRemainingDifference(int wantedUnit, int roundTo) + { + return getRemainingDifference(wantedUnit, roundTo, this.milli); + } + /************************************************************************/ + /************************************************************************/ + public static long getRemainingDifference(int wantedUnit, int roundTo, long time) + { + int wantedIndex = getTimeScaleIndex(wantedUnit); + int roundToIndex = getTimeScaleIndex(roundTo); + if (wantedIndex < roundToIndex) { throw new Error("Can't round with a smaller Unit.[" + TIME_UNITS[wantedIndex] + ", " + TIME_UNITS[roundToIndex] + "]"); } + //roundedDifference = (millis % (roundTo in millis)) / (unit in millis) + return (time % DIVIDERS[roundToIndex]) / DIVIDERS[wantedIndex]; + } + /***********************************************************************/ + /** + * @return the index in TIME_SCALE[] of the largest Unit to be > 0 + **/ + private int getMaximumTimeUnit() + { + int i = 0; + while ((i < DIVIDERS.length) && (milli < DIVIDERS[i])) + { + i++; + } + return i; + } + /***********************************************************************/ + /** + * Finds the index for a Calendar.DATE ect. + * @return the index in TIME_SCALE[] + **/ + public static int getTimeScaleIndex(int calendarTime) + { + int i = 0; + while (calendarTime != TIME_SCALE[i]) + { + i++; + } + return i; + } + /***********************************************************************/ + public static int convertUnitString(String unit) + { + int result = 0; + if (MILLISECONDS.equalsIgnoreCase(unit)) + { + result = Calendar.MILLISECOND; + } + else if (SECONDS.equalsIgnoreCase(unit)) + { + result = Calendar.SECOND; + } + else if (MINUTES.equalsIgnoreCase(unit)) + { + result = Calendar.MINUTE; + } + else if (HOURS.equalsIgnoreCase(unit)) + { + result = Calendar.HOUR; + } + else if (DAYS.equalsIgnoreCase(unit)) + { + result = Calendar.DATE; + } + else if (WEEKS.equalsIgnoreCase(unit)) + { + result = Calendar.WEEK_OF_YEAR; + } + else if (MONTHS.equalsIgnoreCase(unit)) + { + result = Calendar.MONTH; + } + else if (YEARS.equalsIgnoreCase(unit)) + { + result = Calendar.YEAR; + } + return result; + } + /***********************************************************************/ + public static long convertUnitStringToMilli(String unit) + { + int cal = convertUnitString(unit); + return DIVIDERS[getTimeScaleIndex(cal)]; + } + /***********************************************************************/ + public boolean isMoreThan(int amount, int unit) + { + return (getAbsoluteDifference(unit) >= amount); + } + /***********************************************************************/ + public boolean isMoreThan(int amount, String unitString) + { + return (getAbsoluteDifference(convertUnitString(unitString)) >= amount); + } + /***********************************************************************/ + public long getStandardRoundedTime(int unitIndex, boolean forceAbsolute) + { + return getStandardRoundedTime(unitIndex, forceAbsolute, this.milli); + } + /***********************************************************************/ + private static long getStandardRoundedTime(int unitIndex, boolean forceAbsolute, long time) + { + if (unitIndex == 0 || forceAbsolute) + { + return getAbsoluteDifference(TIME_SCALE[unitIndex], time); + } + else + { + return getRemainingDifference(TIME_SCALE[unitIndex], TIME_SCALE[unitIndex - 1], time); + } + } + /***********************************************************************/ + public String getStandardTimeText(int amount, String maxUnit, String minUnit, String nowText, String agoText) + { + return getTimeText(amount, convertUnitString(maxUnit), convertUnitString(minUnit), nowText, agoText, STANDARD_TIME_TEXT); + } + /***********************************************************************/ + public String getTimeText(int amount, int maxUnit, int minUnit, String nowText, String agoText, String units[]) + { + // My_System.variable("amount = " + amount + ", maxUnit = " + maxUnit + ", minUnit = " + minUnit + ", nowText = " + nowText); + if (amount == 0) { throw new Error("getTimeText() requires amount > 0"); } + maxUnit = getTimeScaleIndex(maxUnit); + minUnit = getTimeScaleIndex(minUnit); + int realMax = getMaximumTimeUnit(); + String timeText = nowText; + if (realMax < maxUnit) + { + realMax = maxUnit; + } + if (realMax <= minUnit) + { + timeText = ""; + long remainingTime = this.milli; + for (int i = realMax; i < (realMax + amount) && (i <= minUnit); i++) + { + long time = getStandardRoundedTime(i, i == realMax, remainingTime); + remainingTime -= time * DIVIDERS[i]; + timeText += time + " " + units[(time == 1) ? i * 2 : i * 2 + 1] + ", "; + //My_System.variable("timeText = " + timeText); + } + timeText = timeText.substring(0, timeText.length() - 2); + if ((agoText != null) && (agoText.length() > 0)) + { + timeText += " " + agoText; + } + } + return timeText; + } + /***********************************************************************/ + public String getClockTimeText() + { + int maxUnit = getTimeScaleIndex(Calendar.HOUR); + int minUnit = getTimeScaleIndex(Calendar.MILLISECOND); + int realMax = getMaximumTimeUnit(); + realMax = (realMax < maxUnit) ? maxUnit : realMax; + String timeText = ""; + if (realMax <= minUnit) + { + for (int i = realMax; i <= minUnit; i++) + { + int padding = (i == getTimeScaleIndex(Calendar.MILLISECOND)) ? 3 : 2; + long time = getStandardRoundedTime(i, i == realMax); + if (i == realMax) + { + timeText += time + ":"; + } + else + { + timeText += StringUtils.padNumber(time, padding) + ":"; + } + } + timeText = timeText.substring(0, timeText.length() - 1); + } + return timeText; + } + /***********************************************************************/ + public String getStandardTimeText(int amountShown) + { + return getTimeText(amountShown, Calendar.YEAR, Calendar.MILLISECOND, "now", "", STANDARD_TIME_TEXT); + } + /************************************************************************/ + /************************************************************************/ +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/DateUtils.java b/src/main/java/com/spun/util/DateUtils.java new file mode 100644 index 0000000..b66e36c --- /dev/null +++ b/src/main/java/com/spun/util/DateUtils.java @@ -0,0 +1,297 @@ +package com.spun.util; + +import static org.mockito.Mockito.times; + +import java.sql.Timestamp; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Calendar; +import java.util.GregorianCalendar; +import java.util.TimeZone; + +/** + * A static class of convence functions for database access + **/ +public class DateUtils +{ + private static int TIME_SCALE[] = {Calendar.YEAR, + Calendar.MONTH, + Calendar.DATE, + Calendar.HOUR_OF_DAY, + Calendar.HOUR, + Calendar.MINUTE, + Calendar.SECOND, + Calendar.MILLISECOND }; + /************************************************************************/ + /** + * + **/ + public static boolean isSame(Date firstDate, Date secondDate, int smallestUnits) + { + if ((firstDate == null) || (secondDate == null)) { return (firstDate == secondDate); } + return isSame(firstDate.getTime(), secondDate.getTime(), smallestUnits); + } + /************************************************************************/ + /** + * + **/ + public static boolean isSame(Calendar firstDate, Calendar secondDate, int smallestUnits) + { + if ((firstDate == null) || (secondDate == null)) { return (firstDate == secondDate); } + return isSame(firstDate.getTime().getTime(), secondDate.getTime().getTime(), smallestUnits); + } + /************************************************************************/ + /** + * + **/ + public static boolean isSame(Date firstDate, Calendar secondDate, int smallestUnits) + { + if ((firstDate == null) || (secondDate == null)) { return ((Object) firstDate == (Object) secondDate); } + return isSame(firstDate.getTime(), secondDate.getTime().getTime(), smallestUnits); + } + /************************************************************************/ + /** + * + **/ + public static boolean isSame(Calendar firstDate, Date secondDate, int smallestUnits) + { + if ((firstDate == null) || (secondDate == null)) { return ((Object) firstDate == (Object) secondDate); } + return isSame(firstDate.getTime().getTime(), secondDate.getTime(), smallestUnits); + } + /************************************************************************/ + /** + * + **/ + public static boolean isSame(long firstDate, long secondDate, int smallestUnits) + { + if (!ArrayUtils.contains(TIME_SCALE, smallestUnits)) { throw new Error("Invalid Timescale " + smallestUnits); } + GregorianCalendar first = new GregorianCalendar(); + first.setTime(new Date(firstDate)); + setSignificantDigit(first, smallestUnits); + GregorianCalendar second = new GregorianCalendar(); + second.setTime(new Date(secondDate)); + setSignificantDigit(second, smallestUnits); + // My_System.variable("Testing if " + first.getTime().getTime() + "==" + second.getTime().getTime()); + return (first.getTime().getTime() == second.getTime().getTime()); + } + /************************************************************************/ + public static Timestamp getStartOfYear() + { + GregorianCalendar gregorianCalendar = new GregorianCalendar(); + DateUtils.setSignificantDigit(gregorianCalendar, Calendar.YEAR); + return new Timestamp(gregorianCalendar.getTime().getTime()); + } + /************************************************************************/ + public static Timestamp getStartOfToday() + { + return getStartOfXDaysAgo(0); + } + /************************************************************************/ + public static Timestamp getStartOfXDaysAgo(int numberOfDays) + { + return getStartOfXDaysAgo(numberOfDays, new Date()); + } + /************************************************************************/ + public static Timestamp getStartOfXDaysAgo(int numberOfDays, Date startingFrom) + { + GregorianCalendar gregorianCalendar = new GregorianCalendar(); + gregorianCalendar.setTime(startingFrom); + DateUtils.setSignificantDigit(gregorianCalendar, Calendar.DATE); + gregorianCalendar.add(Calendar.DATE, -numberOfDays); + return new Timestamp(gregorianCalendar.getTime().getTime()); + } + /************************************************************************/ + public static Calendar getEndOfTodayAsCalendar() + { + return rollToEndOfDay(new Date()); + } + /************************************************************************/ + public static Timestamp getEndOfToday() + { + return new Timestamp(getEndOfTodayAsCalendar().getTime().getTime()); + } + /************************************************************************/ + public static Calendar setSignificantDigit(Date date, int smallestUnits) + { + GregorianCalendar calendar = new GregorianCalendar(); + calendar.setTimeInMillis(date.getTime()); + return setSignificantDigit(calendar, smallestUnits); + } + /************************************************************************/ + public static Calendar setSignificantDigit(Calendar calendar, int smallestUnits) + { + boolean removeOn = false; + for (int i = 0; i < TIME_SCALE.length; i++) + { + if (removeOn) + { + if (TIME_SCALE[i] == Calendar.DATE) + { + // Work arround since this is broke + calendar.set(TIME_SCALE[i], 1); + } + else if (TIME_SCALE[i] == Calendar.HOUR_OF_DAY) + { + // Work arround since this is broke + calendar.set(TIME_SCALE[i], 0); + } + else + { + calendar.clear(TIME_SCALE[i]); + } + } + if (TIME_SCALE[i] == smallestUnits) + { + removeOn = true; + } + } + return calendar; + } + /************************************************************************/ + public static Timestamp getStartOf(int unit, Date forDate) + { + GregorianCalendar calendar = new GregorianCalendar(); + calendar.setTime(forDate); + setSignificantDigit(calendar, unit); + return new Timestamp(calendar.getTimeInMillis()); + } + /************************************************************************/ + public static Timestamp getEndOf(int unit, Date forDate) + { + GregorianCalendar calendar = new GregorianCalendar(); + calendar.setTime(forDate); + setSignificantDigit(calendar, unit); + calendar.add(unit, 1); + calendar.add(Calendar.MILLISECOND, -1); + return new Timestamp(calendar.getTimeInMillis()); + } + /************************************************************************/ + public static boolean areSame(Date date1, Date date2, long accuracy) + { + return (compareDates(date1, date2) < accuracy); + } + /************************************************************************/ + /** + * + * @return 1 if date1 > date2, 0 if date1 = date2, -1 if date1 < date2 + **/ + public static int compareDates(Date date1, Date date2) + { + long l1 = ((date1 == null) ? 0 : date1.getTime()); + long l2 = ((date2 == null) ? 0 : date2.getTime()); + long diff = l1 - l2; + return (diff == 0) ? 0 : (int) (diff / Math.abs(diff)); + } + /************************************************************************/ + public static Date createTime(Date date) + { + Calendar time = new GregorianCalendar(); + time.setTime(date); + time.set(1970, 0, 1); + return time.getTime(); + } + /************************************************************************/ + /** + * Rolls back till that time on a 24 hour clock + **/ + public static Date rollTillHour(int hour, Date date) + { + Calendar rolled = new GregorianCalendar(); + rolled.setTime(date); + setSignificantDigit(rolled, Calendar.HOUR_OF_DAY); + while (rolled.get(Calendar.HOUR_OF_DAY) != hour) + { + rolled.add(Calendar.HOUR_OF_DAY, -1); + } + return rolled.getTime(); + } + /************************************************************************/ + public static void main(String args[]) + { + MySystem.variable("Calendar.DATE = " + Calendar.DATE); + MySystem.variable("Year", setSignificantDigit(new GregorianCalendar(), Calendar.YEAR).getTime()); + MySystem.variable("Month", setSignificantDigit(new GregorianCalendar(), Calendar.MONTH).getTime()); + MySystem.variable("Day", setSignificantDigit(new GregorianCalendar(), Calendar.DAY_OF_MONTH).getTime()); + MySystem.variable("Hour", setSignificantDigit(new GregorianCalendar(), Calendar.HOUR).getTime()); + MySystem.variable("Minute", setSignificantDigit(new GregorianCalendar(), Calendar.MINUTE).getTime()); + MySystem.variable("End Of Day", rollToEndOfDay(new Date()).getTime()); + } + /************************************************************************/ + public static GregorianCalendar rollToEndOfDay(Date date) + { + GregorianCalendar gregorianCalendar = new GregorianCalendar(); + gregorianCalendar.setTime(date); + gregorianCalendar.set(Calendar.HOUR_OF_DAY, 23); + gregorianCalendar.set(Calendar.MINUTE, 59); + gregorianCalendar.set(Calendar.SECOND, 59); + gregorianCalendar.set(Calendar.MILLISECOND, 999); + return gregorianCalendar; + } + /***********************************************************************/ + public static Timestamp asTimestamp(Date date) + { + return new Timestamp(date.getTime()); + } + /************************************************************************/ + public static boolean isToday(Date date) + { + return DateUtils.isSame(date, new Date(), Calendar.DATE); + } + /************************************************************************/ + public static Calendar asCalendar(Date date) + { + GregorianCalendar gregorianCalendar = new GregorianCalendar(); + gregorianCalendar.setTime(date); + return gregorianCalendar; + } + /************************************************************************/ + public static Timestamp getLastOrCurrent(int dayOfWeek) + { + return getDayOfWeek(dayOfWeek, false); + } + /************************************************************************/ + public static Timestamp getNextOrCurrent(int dayOfWeek) + { + return getDayOfWeek(dayOfWeek, true); + } + /************************************************************************/ + private static Timestamp getDayOfWeek(int dayOfWeek, boolean foward) throws Error + { + int multiplier = foward ? -1 : 1 ; + for (int i = 0; i < 7; i++) + { + Timestamp day = getStartOfXDaysAgo(i * multiplier); + if (asCalendar(day).get(Calendar.DAY_OF_WEEK) == dayOfWeek) { return day; } + } + throw new Error(String.format("didn't find a %s in the %s 7 days", dayOfWeek, foward ? "next":"last")); + } + /************************************************************************/ + /** + * @param date "yyyy/MM/dd" + */ + public static Timestamp parse(String date) + { + SimpleDateFormat format = new java.text.SimpleDateFormat("yyyy/MM/dd"); + try + { + return asTimestamp(format.parse(date)); + } + catch (ParseException e) + { + throw ObjectUtils.throwAsError(e); + } + } + /************************************************************************/ + /************************************************************************/ + + public static boolean doesDaylightSavingsTimeStartOn(String date) { + Timestamp day = parse(date); + TimeZone timeZone = GregorianCalendar.getInstance().getTimeZone(); + boolean inDaylightTime = timeZone.inDaylightTime(day); + Calendar tomorrow = asCalendar(day); + tomorrow.add(Calendar.DATE, 1); + Date time = tomorrow.getTime(); + return !inDaylightTime && timeZone.inDaylightTime(time); + } +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/DualOutputStream.java b/src/main/java/com/spun/util/DualOutputStream.java new file mode 100644 index 0000000..f254e91 --- /dev/null +++ b/src/main/java/com/spun/util/DualOutputStream.java @@ -0,0 +1,98 @@ +package com.spun.util; + +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.io.PrintStream; + +public class DualOutputStream extends OutputStream +{ + private FileOutputStream o; + private PrintStream display = System.out; + /************************************************************************/ + public DualOutputStream() + { + super(); + } + /************************************************************************/ + public void setOutputStream(String outfile) throws SecurityException, Exception + { + try + { + o = new FileOutputStream(outfile); + display.println("output being redirected to: " + outfile); + } + catch (Exception e) + { + throw ObjectUtils.throwAsError(e); + } + } + /************************************************************************/ + public void write(int b) throws IOException + { + try + { + o.write(b); + } + catch (Exception e) + { + throw ObjectUtils.throwAsError(e); + } + display.write(b); + } + /************************************************************************/ + public void write(byte b[]) throws IOException + { + try + { + o.write(b); + } + catch (Exception e) + { + throw ObjectUtils.throwAsError(e); + } + display.println(b); + flush(); + } + /************************************************************************/ + public void write(byte b[], int off, int len) throws IOException + { + try + { + o.write(b, off, len); + } + catch (Exception e) + { + throw ObjectUtils.throwAsError(e); + } + display.write(b, off, len); + } + /************************************************************************/ + public void flush() throws IOException + { + try + { + o.flush(); + } + catch (Exception e) + { + throw ObjectUtils.throwAsError(e); + } + display.flush(); + } + /************************************************************************/ + public void close() throws IOException + { + try + { + o.close(); + } + catch (Exception e) + { + throw ObjectUtils.throwAsError(e); + } + display.close(); + } + /************************************************************************/ + /************************************************************************/ +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/EmbeddedSorter.java b/src/main/java/com/spun/util/EmbeddedSorter.java new file mode 100644 index 0000000..977a273 --- /dev/null +++ b/src/main/java/com/spun/util/EmbeddedSorter.java @@ -0,0 +1,26 @@ +package com.spun.util; + +import java.util.Comparator; + +public class EmbeddedSorter + implements java.util.Comparator +{ + private MethodExecutionPath executionPath; + private Comparator comparator; + + /************************************************************************/ + public EmbeddedSorter(Comparator comparator, MethodExecutionPath executionPath) + { + this.comparator = comparator; + this.executionPath = executionPath; + } + /************************************************************************/ + public int compare(T o1, T o2) + { + Object e1 = executionPath.extractValue(o1); + Object e2 = executionPath.extractValue(o2); + return comparator.compare(e1, e2); + } + /************************************************************************/ + /************************************************************************/ +} diff --git a/src/main/java/com/spun/util/EnabledConditions.java b/src/main/java/com/spun/util/EnabledConditions.java new file mode 100644 index 0000000..b42b426 --- /dev/null +++ b/src/main/java/com/spun/util/EnabledConditions.java @@ -0,0 +1,34 @@ +package com.spun.util; + +/** + * This is a Top Level of the configuration classes. It is a container for + * other classes. + **/ + + +public interface EnabledConditions +{ + + /**************************************************************************/ + /** + * Returns the conditions that are allowed at the current time. + **/ + public boolean isEnabled(int state); + /**************************************************************************/ + /** + * Returns ToolTipText for the item dependant on the state. + **/ + public String getToolTipText(int state); + /**************************************************************************/ + /** + * Adds the conditionListener, calls conditions changed on the current listener. + **/ + public void addConditionListener(ConditionListener listener); + /**************************************************************************/ + /** + * removes the conditionListener + **/ + public void removeConditionListener(ConditionListener listener); + /**************************************************************************/ + /**************************************************************************/ +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/FormattedException.java b/src/main/java/com/spun/util/FormattedException.java new file mode 100644 index 0000000..1404b56 --- /dev/null +++ b/src/main/java/com/spun/util/FormattedException.java @@ -0,0 +1,12 @@ +package com.spun.util; + + +public class FormattedException extends RuntimeException +{ + + public FormattedException(String string, Object... params) + { + super(String.format(string, params)); + MySystem.variable(this.getMessage()); + } +} diff --git a/src/main/java/com/spun/util/FrameCloser.java b/src/main/java/com/spun/util/FrameCloser.java new file mode 100644 index 0000000..83caed7 --- /dev/null +++ b/src/main/java/com/spun/util/FrameCloser.java @@ -0,0 +1,16 @@ +package com.spun.util; + +public class FrameCloser extends java.awt.event.WindowAdapter +{ + /***********************************************************************/ + public void windowClosing(java.awt.event.WindowEvent e) + { + e.getWindow().dispose(); + } + /***********************************************************************/ + public void windowClosed(java.awt.event.WindowEvent e) + { + System.exit(0); + } + /***********************************************************************/ +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/LambdaThreadLauncher.java b/src/main/java/com/spun/util/LambdaThreadLauncher.java new file mode 100644 index 0000000..420eff0 --- /dev/null +++ b/src/main/java/com/spun/util/LambdaThreadLauncher.java @@ -0,0 +1,27 @@ +package com.spun.util; + +import org.lambda.actions.Action0; + +public class LambdaThreadLauncher implements Runnable +{ + private final Action0 function; + private long delay = 0; + public LambdaThreadLauncher(Action0 function) + { + this.function = function; + new Thread(this).start(); + } + @Override + public void run() + { + try + { + Thread.sleep(delay); + function.call(); + } + catch (Throwable t) + { + MySystem.warning("Caught throwable exception ", t); + } + } +} diff --git a/src/main/java/com/spun/util/Memory.java b/src/main/java/com/spun/util/Memory.java new file mode 100644 index 0000000..863ff7a --- /dev/null +++ b/src/main/java/com/spun/util/Memory.java @@ -0,0 +1,44 @@ +package com.spun.util; + + +/** + * A Simple class looking at memory. + * @author Llewellyn + * @version 1.0 + **/ +public class Memory +{ + private long freeMemory = 0; + private long totalMemory = 0; + private long usedMemory = 0; + private java.text.NumberFormat format = java.text.NumberFormat.getNumberInstance(); + /************************************************************************/ + /** + * Dumps the current memory status [total, used, free]. + * This forces garbage collection to run first. + **/ + public Memory() + { + System.gc(); + freeMemory = Runtime.getRuntime().freeMemory(); + totalMemory = Runtime.getRuntime().totalMemory(); + usedMemory = totalMemory - freeMemory; + } + /************************************************************************/ + public String getUsedMemory() + { + return format.format(((double) usedMemory) / 1000000); + } + /************************************************************************/ + public String getFreeMemory() + { + return format.format(((double) freeMemory) / 1000000); + } + /************************************************************************/ + public String getTotalMemory() + { + return format.format(((double) totalMemory) / 1000000); + } + /***********************************************************************/ + /***********************************************************************/ +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/MethodExecutionPath.java b/src/main/java/com/spun/util/MethodExecutionPath.java new file mode 100644 index 0000000..e979ab4 --- /dev/null +++ b/src/main/java/com/spun/util/MethodExecutionPath.java @@ -0,0 +1,199 @@ +package com.spun.util; + +import java.io.Serializable; +import java.lang.reflect.Method; +import java.util.Arrays; + +import com.spun.util.filters.Filter; +import com.spun.util.filters.FilterUtils; + +public class MethodExecutionPath implements Serializable +{ + public static final Object NULL_ENCOUNTERED_ON_PATH = new Object(); + private Class classType, returnType; + private String methodNames[]; + private Parameters[] parameters; + private Method methods[]; + /***********************************************************************/ + public MethodExecutionPath(Class clazz, String methodName) + { + this(clazz, new String[]{methodName}, null); + } + /***********************************************************************/ + public MethodExecutionPath(Class clazz, String... methodNames) + { + this(clazz, methodNames, null); + } + /***********************************************************************/ + public MethodExecutionPath(Class clazz, String methodName, Parameters parameters) + { + this(clazz, new String[]{methodName}, new Parameters[]{parameters}); + } + /***********************************************************************/ + public MethodExecutionPath(Class clazz, String[] methodNames, Parameters[] parameters) + { + this.classType = clazz; + this.methodNames = methodNames; + this.parameters = parameters; + this.methods = getRecursiveMethods(clazz, methodNames, parameters); + this.returnType = (this.methods != null) ? methods[methods.length - 1].getReturnType() : null; + } + /************************************************************************/ + public static MethodExecutionPath method(Class class1, String method, Object... paramaters) + { + return new MethodExecutionPath(class1, new String[]{method}, new Parameters[]{new Parameters(paramaters)}); + } + public static Method[] getRecursiveMethods(Class clazz, String[] methodNames, Parameters[] parameters) + { + if (clazz == null) { return null; } + Method methods[] = new Method[methodNames.length]; + String currentMethodName = null; + Parameters parameter = null; + try + { + for (int i = 0; i < methods.length; i++) + { + currentMethodName = methodNames[i]; + parameter = Parameters.getParametersFor(parameters, i); + methods[i] = parameter.getBestFitMethod(clazz, currentMethodName); + clazz = methods[i].getReturnType(); + } + return methods; + } + catch (Exception e) + { + throw new Error("Unable to get method for " + clazz.getName() + "." + currentMethodName + "(" + parameter + + ")", e); + } + } + /***********************************************************************/ + public Object extractValue(Object object) + { + if (object == null) { return NULL_ENCOUNTERED_ON_PATH; } + Method[] methods = this.methods == null ? getRecursiveMethods(object.getClass(), this.methodNames, + this.parameters) : this.methods; + for (int i = 0; i < methods.length; i++) + { + if (object == null) { return NULL_ENCOUNTERED_ON_PATH; } + object = extractValue(object, methods[i], Parameters.getParametersFor(parameters, i).values); + } + return object; + } + /************************************************************************/ + private static Object extractValue(Object object, Method method, Object values[]) + { + try + { + return method.invoke(object, values); + } + catch (Exception e) + { + throw new Error("Problems extracting values from " + object.getClass().getName() + "." + method.getName(), e); + } + } + /************************************************************************/ + public Class getClassType() + { + return classType; + } + /***********************************************************************/ + public Class getReturnType() + { + return returnType; + } + /***********************************************************************/ + /***********************************************************************/ + public static class Parameters + { + public static final Parameters EMPTY = new Parameters(null, null); + public Class[] definitions; + public Object[] values; + /***********************************************************************/ + public Parameters(Object... values) + { + if (!ArrayUtils.isEmpty(values)) + { + this.values = values; + this.definitions = (Class[]) ObjectUtils.extractArray(values, "getClass"); + } + } + /***********************************************************************/ + public Parameters(Class[] definitions, Object[] values) + { + this.definitions = definitions; + this.values = values; + } + /***********************************************************************/ + public Method getBestFitMethod(Class clazz, String currentMethodName) throws NoSuchMethodException + { + return getBestFitMethod(clazz, currentMethodName, definitions); + } + /***********************************************************************/ + public static Method getBestFitMethod(Class clazz, String currentMethodName, Class[] definitions) + throws NoSuchMethodException + { + try + { + return clazz.getMethod(currentMethodName, definitions); + } + catch (NoSuchMethodException e) + { + Method[] methods = (Method[]) FilterUtils.retainExtracted(clazz.getMethods(), + new MethodParameterFilter(currentMethodName, definitions)).toArray(new Method[0]); + if (methods.length == 0) { throw e; } + if (methods.length == 1) + { + return methods[0]; + } + else + { + throw new Error("Don't know how to handle multiple available methods yet."); + } + } + } + /***********************************************************************/ + public static Parameters getParametersFor(Parameters[] parameters, int i) + { + if (parameters == null || (i >= parameters.length) || parameters[i] == null) { return EMPTY; } + return parameters[i]; + } + /***********************************************************************/ + public String toString() + { + return definitions == null ? "" : Arrays.asList(definitions).toString(); + } + } + public static class MethodParameterFilter implements Filter + { + private String methodName; + private Class[] classParameters; + /***********************************************************************/ + public MethodParameterFilter(String methodName, Class[] classParameters) + { + super(); + this.methodName = methodName; + this.classParameters = classParameters; + } + /***********************************************************************/ + public boolean isExtracted(Object object) throws IllegalArgumentException + { + ObjectUtils.assertInstance(Method.class, object); + Method m = (Method) object; + if (m.getName().equals(methodName) && m.getParameterTypes().length == classParameters.length) + { + Class[] params = m.getParameterTypes(); + for (int i = 0; i < params.length; i++) + { + if (!ObjectUtils.isThisInstanceOfThat(classParameters[i], params[i])) { return false; } + } + return true; + } + else + { + return false; + } + } + } + /***********************************************************************/ + /***********************************************************************/ +} diff --git a/src/main/java/com/spun/util/MethodSorter.java b/src/main/java/com/spun/util/MethodSorter.java new file mode 100644 index 0000000..e3e73fe --- /dev/null +++ b/src/main/java/com/spun/util/MethodSorter.java @@ -0,0 +1,203 @@ +package com.spun.util; + +import java.io.Serializable; +import java.util.Comparator; +import java.util.Date; + +public class MethodSorter implements java.util.Comparator, Serializable +{ + public static enum SortOrder { + Ascending, Decending; + public boolean toBoolean() + { + return this == Ascending; + } + public static SortOrder isAscending(boolean ascending) + { + return ascending ? Ascending : Decending; + } + } + private Comparator comparator; + private MethodExecutionPath path; + /************************************************************************/ + public MethodSorter(MethodExecutionPath path, SortOrder sortOrder) + { + SortOrder s = sortOrder; + this.path = path; + this.comparator = getComparatorForType(path.getReturnType(), s.toBoolean()); + } + /************************************************************************/ + public MethodSorter(Class classType, String methodName, boolean ascending) + { + this(new MethodExecutionPath(classType, methodName), SortOrder.isAscending(ascending)); + } + /************************************************************************/ + public MethodSorter(Class classType, String[] methodNames, boolean ascending) + { + + this(new MethodExecutionPath(classType, methodNames), SortOrder.isAscending(ascending)); + } + /************************************************************************/ + public Class getClassType() + { + return path.getClassType(); + } + /************************************************************************/ + private static Comparator getComparatorForType(Class type, boolean ascending) + { + if (String.class.isAssignableFrom(type)) + { + return new StringComparator(ascending); + } + else if (Double.TYPE.isAssignableFrom(type)) + { + return new NumberComparator(ascending); + } + else if (Integer.TYPE.isAssignableFrom(type) || Integer.class.isAssignableFrom(type)) + { + return new NumberComparator(ascending); + } + else if (Date.class.isAssignableFrom(type)) + { + return new DateComparator(ascending); + } + else if (Character.TYPE.isAssignableFrom(type)) + { + return new CharacterComparator(ascending); + } + else if (type.isArray()) + { + return new ArraySizeComparator(ascending); + } + else + { + throw new Error("Cannot handle class of type " + type.getName()); + } + } + /************************************************************************/ + private Object extractValue(T object) + { + Object o = path.extractValue(object); + return (MethodExecutionPath.NULL_ENCOUNTERED_ON_PATH == o) ? null : o; + } + /************************************************************************/ + public int compare(T o1, T o2) + { + return comparator.compare(extractValue(o1), extractValue(o2)); + } + private static int compareNull(Object o1, Object o2) + { + if (o1 == o2) { return 0; } + return (o1 == null) ? -1 : 1; + } + /************************************************************************/ + /************************************************************************/ + /* INNNER CLASSES */ + /************************************************************************/ + public static class NumberComparator implements Comparator, Serializable + { + private boolean ascending; + /************************************************************************/ + public NumberComparator(boolean ascending) + { + this.ascending = ascending; + } + /************************************************************************/ + public int compare(Object o1, Object o2) throws java.lang.ClassCastException + { + int value = 0; + if (o1 == null || o2 == null) + { + value = compareNull(o1, o2); + } + else + { + value = Double.compare(((Number) o1).doubleValue(), ((Number) o2).doubleValue()); + } + return ascending ? value : -value; + } + } + /***********************************************************************/ + public static class DateComparator implements Comparator, Serializable + { + private boolean ascending; + /************************************************************************/ + public DateComparator(boolean ascending) + { + this.ascending = ascending; + } + /************************************************************************/ + public int compare(Object o1, Object o2) + { + if (o1 == null || o2 == null) { return compareNull(o1, o2); } + Date date1 = (Date) o1; + Date date2 = (Date) o2; + return date1.compareTo(date2) * (ascending ? 1 : -1); + } + } + /***********************************************************************/ + public static class ArraySizeComparator implements Comparator + { + private boolean ascending; + /************************************************************************/ + public ArraySizeComparator(boolean ascending) + { + this.ascending = ascending; + } + /************************************************************************/ + public int compare(Object o1, Object o2) + { + Object[] array1 = (Object[]) o1; + Object[] array2 = (Object[]) o2; + return Double.compare(array1.length, array2.length) * (ascending ? 1 : -1); + } + } + /***********************************************************************/ + public static class CharacterComparator implements Comparator, Serializable + { + private boolean ascending; + /************************************************************************/ + public CharacterComparator(boolean ascending) + { + this.ascending = ascending; + } + /************************************************************************/ + public int compare(Object o1, Object o2) + { + Character c1 = (Character) o1; + Character c2 = (Character) o2; + return c1.compareTo(c2) * (ascending ? 1 : -1); + } + } + /***********************************************************************/ + public static class StringComparator implements Comparator, Serializable + { + private boolean ascending; + /************************************************************************/ + public StringComparator(boolean ascending) + { + this.ascending = ascending; + } + /************************************************************************/ + public int compare(Object o1, Object o2) + { + return StringComparator.compare((String) o1, (String) o2, ascending); + } + /************************************************************************/ + public static int compare(String o1, String o2, boolean ascending) + { + int value = 0; + if (o1 == null || o2 == null) + { + value = compareNull(o1, o2); + } + else + { + value = o1.compareTo(o2); + } + return ascending ? value : -value; + } + } + /************************************************************************/ + /************************************************************************/ +} diff --git a/src/main/java/com/spun/util/MultiSorter.java b/src/main/java/com/spun/util/MultiSorter.java new file mode 100644 index 0000000..7e6deaf --- /dev/null +++ b/src/main/java/com/spun/util/MultiSorter.java @@ -0,0 +1,25 @@ +package com.spun.util; + +import java.util.Comparator; + +public class MultiSorter implements java.util.Comparator +{ + private Comparator[] comparators = null; + /************************************************************************/ + public MultiSorter(Comparator... comparators) + { + this.comparators = comparators; + } + /************************************************************************/ + public int compare(T o1, T o2) throws java.lang.ClassCastException + { + for (Comparator comp : comparators) + { + int value = comp.compare(o1, o2); + if (value != 0) { return value; } + } + return 0; + } + /************************************************************************/ + /************************************************************************/ +} diff --git a/src/main/java/com/spun/util/MySystem.java b/src/main/java/com/spun/util/MySystem.java new file mode 100644 index 0000000..6b6b723 --- /dev/null +++ b/src/main/java/com/spun/util/MySystem.java @@ -0,0 +1,521 @@ +package com.spun.util; + +import java.io.PrintWriter; +import java.util.Vector; + +/** + * A class for printing comments in a standardized format. + * @author Llewellyn + * @version 2.0 + **/ +public class MySystem +{ + public static boolean USE_LOG_FILE = false; + public static final String CLIENT_OUTPUT_FILE = "logs\\CCS_ClientLog.txt"; + public static final String SERVER_OUTPUT_FILE = "logs\\ServerLog.txt"; + public static final String LOGGER_OUTPUT_FILE = "logs\\Logger.txt"; + public static final String SERVLET_OUTPUT_FILE = "logs\\ServletLog.txt"; + public static String ROOT_DIR = "C:\\temp\\"; + public static final int IN = 1; + public static final int OUT = -1; + private static boolean useStackTraceInspection = true; + public static boolean marker = true; + public static boolean event = true; + public static boolean variable = true; + public static boolean query = true; + public static int hourGlass = 0; + public static int hourGlassWrap = 100; + private static int m_indent = 0; + private static long lastTime = System.currentTimeMillis(); + private static DualOutputStream cos; + private static String logFileUsed = null; + private static PrintWriter SYSTEM_OUT_WRITER = new PrintWriter(System.out, true); + /***********************************************************************/ + public static void toggleAll(boolean t) + { + marker = t; + event = t; + variable = t; + query = t; + } + /***********************************************************************/ + private static void clearHourGlass() + { + if (hourGlass > 0) + { + System.out.println(""); + hourGlass = 0; + } + } + /***********************************************************************/ + public static void setHourGlassWrap(int numberOfDots) + { + hourGlassWrap = numberOfDots; + } + /***********************************************************************/ + public static void hourGlass() + { + if (hourGlass >= hourGlassWrap) + { + clearHourGlass(); + } + hourGlass++; + if ((hourGlass % 10) == 0) + { + System.out.print(hourGlass / 10); + } + else + { + System.out.print("."); + } + } + /***********************************************************************/ + public static long startTimer() + { + return System.currentTimeMillis(); + } + /***********************************************************************/ + public static void stopTimer(long startTime, long maxTime, String function) + { + long diff = (System.currentTimeMillis() - startTime); + if (diff > maxTime) + { + MySystem.warning("Time Limit Exceeded - " + function + " [" + + new DateDifference(diff).getStandardTimeText(2) + " > " + maxTime + "]"); + } + } + /***********************************************************************/ + /** + * Sets output to a file. + * @param file The name of the file. + **/ + public synchronized static void useOutputFile(String file, boolean addDateStamp) + { + if (!USE_LOG_FILE || (logFileUsed != null) || (file == null)) { return; } + try + { + if (addDateStamp) + { + int seperator = file.lastIndexOf('.'); + if (seperator != 0) + { + file = file.substring(0, seperator) + "[" + System.currentTimeMillis() + "]" + file.substring(seperator); + } + else + { + file += System.currentTimeMillis(); + } + } + cos = new DualOutputStream(); + cos.setOutputStream(file); + java.io.PrintStream p = new java.io.PrintStream(cos); + logFileUsed = file; + System.setErr(p); + System.setOut(p); + } + catch (SecurityException e) + {} + catch (Exception e) + {} + } + /***********************************************************************/ + /** + * Sets output to a file. + * @param file The name of the file. + **/ + public synchronized static void useOutputFile(String file) + { + useOutputFile(file, false); + } + /***********************************************************************/ + /** + * Closes the Output File. + **/ + public synchronized static void closeOutputFile() + { + if (logFileUsed == null) { return; } + try + { + cos.close(); + } + catch (Exception e) + {} + } + /***********************************************************************/ + /** + * Prints to screen the marker specifying function entered. + **/ + public synchronized static void markerOut() + { + markerOut(null); + } + /***********************************************************************/ + /** + * Prints to screen the marker specifying function entered. + **/ + public synchronized static void markerIn() + { + markerIn(null); + } + /***********************************************************************/ + /** + * Prints to screen the marker specifying function entered. + * @param Statement The statement to print + * @param int IN/OUT + **/ + public synchronized static void markerIn(String statement) + { + if (!marker) { return; } + if (useStackTraceInspection) + { + System.out.println(timeStamp() + "**** " + extractMarkerText() + " - IN"); + } + else + { + System.out.println(timeStamp() + "**** " + statement + " - IN"); + } + m_indent++; + } + /***********************************************************************/ + private static String extractMarkerText() + { + try + { + StackTraceElement trace[] = new Error().getStackTrace(); + StackTraceElement element = trace[3]; + String text = element.getMethodName(); + String className = element.getClassName(); + className = className.substring(className.lastIndexOf(".") + 1); + text += "(" + className + ":" + element.getLineNumber() + ")"; + return text; + } + catch (Throwable t) + { + useStackTraceInspection = false; + return "Can't Inspect Stack Trace"; + } + } + /***********************************************************************/ + private static String getIndent() + { + String theIndention = ""; + for (int i = 0; i < m_indent; i++) + { + theIndention += " "; + } + return theIndention; + } + /***********************************************************************/ + private static String timeStamp() + { + clearHourGlass(); + String text = ""; + long current = System.currentTimeMillis(); + java.text.DateFormat df = java.text.DateFormat.getDateTimeInstance(); + text = "[" + df.format(new java.util.Date(current)) + " ~" + padNumber(current - lastTime) + "ms]" + + getIndent(); + lastTime = current; + return text; + } + /***********************************************************************/ + private static String padNumber(long number) + { + String text = "" + number; + while (text.length() < 6) + { + text = "0" + text; + } + return text; + } + /***********************************************************************/ + private static String indentMessage(String message) + { + Vector v = new Vector(); + int place = 0; + while ((place = message.indexOf('\n', place + 1)) != -1) + { + v.addElement(place); + } + if (v.size() == 0) + { + // no '\n' + return message; + } + String theIndention = getIndent(); + StringBuffer buffer = new StringBuffer(message); + for (int i = (v.size() - 1); i >= 0; i--) + { + int tempplace = ((Integer) v.elementAt(i)).intValue(); + buffer.insert(tempplace + 1, theIndention); + } + return buffer.toString(); + } + /***********************************************************************/ + /** + * Prints to screen the marker specifying function exited. + * @param Statement The statement to print + **/ + public synchronized static void markerOut(String Statement) + { + if (!marker) { return; } + m_indent--; + System.out.println(timeStamp() + "**** " + extractMarkerText() + " - OUT"); + } + /***********************************************************************/ + /** + * Prints to screen any variable information to be viewed. + * @param Statement The statement to print + **/ + public synchronized static void query(String sqlQuery) + { + if (!query) { return; } + System.out.println(timeStamp() + "~~> SQL - " + sqlQuery); + } + /***********************************************************************/ + /** + * Prints to screen any variable information to be viewed. + * @param Statement The statement to print + **/ + public synchronized static void query(String queryName, Object sqlQuery) + { + if (!query) { return; } + System.out.println(timeStamp() + "~~> SQL [" + queryName + "] - " + sqlQuery); + } + /***********************************************************************/ + /** + * Prints to screen any variable information to be viewed. + * @param Statement The statement to print + **/ + public synchronized static void variable(String statement) + { + variable(statement, SYSTEM_OUT_WRITER); + } + /***********************************************************************/ + public static void variableFormated(String string, Object... parameters) + { + variable(String.format(string, parameters)); + } + /***********************************************************************/ + public synchronized static void variable(String statement, PrintWriter out) + { + if (!variable) { return; } + out.println(timeStamp() + "*=>" + statement); + } + /***********************************************************************/ + /** + * Prints to screen any variable information to be viewed. + * @param Statement The statement to print + **/ + public synchronized static void variable(String name, Object value) + { + if (!variable) { return; } + System.out.println(timeStamp() + "*=> " + name + " = '" + (value == null ? null : value.toString()) + "'"); + } + /***********************************************************************/ + /** + * Prints to screen any variable information to be viewed. + * @param Statement The statement to print + **/ + public synchronized static void variable(String name, Object array[]) + { + if (!variable) { return; } + name = (name == null ? "array" : name); + if (array == null || array.length == 0) + { + System.out.println(timeStamp() + "*=> " + name + ".length = 0"); + } + else + { + for (int i = 0; i < array.length; i++) + { + System.out.println(timeStamp() + "*=> " + name + "[" + i + "] = " + + ((array[i] == null) ? "null" : array[i].toString())); + } + } + } + /***********************************************************************/ + /** + * Prints to screen any variable information to be viewed. + * @param Statement The statement to print + **/ + public synchronized static void variable(Object array[]) + { + variable(null, array); + } + /***********************************************************************/ + /** + * Prints to screen any messages to be viewed. + * @param Statement The statement to print + **/ + public synchronized static void message(String Statement) + { + System.out.println(timeStamp() + indentMessage(Statement)); + } + /***********************************************************************/ + /** + * Prints to screen any events to be viewed. + * @param Statement The statement to print + **/ + public static void event(String Statement) + { + if (!event) { return; } + System.out.println(timeStamp() + "*--" + Statement); + } + /***********************************************************************/ + /** + * Prints to screen any warnings to be viewed. + * @param Statement The statement to print + **/ + public synchronized static void warning(String statement) + { + warning(statement, null); + } + /***********************************************************************/ + /** + * Prints to screen any warnings to be viewed. + * @param Statement The statement to print + **/ + public synchronized static void warning(Throwable throwable) + { + warning(null, throwable); + } + /***********************************************************************/ + /** + * Prints to screen any warnings to be viewed. + * @param Statement The statement to print + **/ + public synchronized static void warning(String statement, Throwable throwable) + { + warning(statement, throwable, null); + } + public synchronized static void warning(String statement, Throwable throwable, PrintWriter out) + { + clearHourGlass(); + dualPrintln("******************************************************************************************", out); + dualPrintln(timeStamp(), out); + if (statement != null) + { + dualPrintln(statement, out); + } + printFullTrace(throwable, false, out); + if (throwable instanceof OutOfMemoryError) + { + dumpMemory(out); + } + dualPrintln("******************************************************************************************", out); + if ((throwable instanceof Error) || (throwable instanceof RuntimeException)) + { + //mailLog("pschaefer@atsgroup.com;lfalco@atsgroup.com","TESTING ERROR","TESTING ERROR","TESTING ERROR","csem03"); + } + } + /***********************************************************************/ + private static void dualPrintln(String string, PrintWriter out) + { + System.out.println(string); + if (out != null) + { + out.println(string); + } + } + /***********************************************************************/ + private static void printFullTrace(Throwable throwable, boolean causedBy) + { + printFullTrace(throwable, causedBy, SYSTEM_OUT_WRITER); + } + /***********************************************************************/ + private static void printFullTrace(Throwable throwable, boolean causedBy, PrintWriter out) + { + if (throwable != null) + { + dualPrintln((causedBy ? "Caused by : " : "") + throwable.getMessage(), out); + throwable.printStackTrace(); + if (out != null) + { + throwable.printStackTrace(out); + } + if (throwable.getCause() != null) + { + printFullTrace(throwable.getCause(), true, out); + } + } + } + /***********************************************************************/ + /** + * The log file being used, null if not being used. + * @return log file being used. + **/ + public static String getLogFileUsed() + { + return logFileUsed; + } + /************************************************************************/ + /** + * Returns all the Thread output of a group as a string. + * @return A List of The thread, and if it is alive and/or interrupted. + **/ + public static String dumpAllThreadsInGroup(ThreadGroup tg) + { + Thread[] threads = new Thread[tg.activeCount()]; + tg.enumerate(threads); + StringBuffer s = new StringBuffer("Active Thread Dump\n"); + for (int x = 0; x < threads.length; x++) + { + if (threads[x] != null) + { + s.append("thread=" + threads[x] + ", isAlive=" + threads[x].isAlive() + ", isInterrupted=" + + threads[x].isInterrupted() + "\n"); + } + } + return s.toString(); + } + /************************************************************************/ + /** + * Dumps the current memory status [total, used, free]. + * This forces garbage collection to run first. + **/ + public static void dumpMemory() + { + dumpMemory(SYSTEM_OUT_WRITER); + } + /************************************************************************/ + public static void dumpMemory(PrintWriter out) + { + System.gc(); + java.text.NumberFormat format = java.text.NumberFormat.getNumberInstance(); + long freeMemory = Runtime.getRuntime().freeMemory(); + long totalMemory = Runtime.getRuntime().totalMemory(); + long usedMemory = totalMemory - freeMemory; + String statement = "Memory [total, used, free] = [" + format.format(totalMemory) + " , " + + format.format(usedMemory) + " , " + format.format(freeMemory) + "]"; + variable(statement, out); + } + /************************************************************************/ + /** + * Dumps the current thread status for ALL groups. + * @see My_System.dumpAllThreadsInGroup(ThreadGroup) + **/ + public static String dumpAllThreads() + { + ThreadGroup place = Thread.currentThread().getThreadGroup(); + while (place.getParent() != null) + { + place = place.getParent(); + } + //place.list(); + return dumpAllThreadsInGroup(place); + } + /***********************************************************************/ + public static String getStringArrayToString(String array[]) + { + StringBuffer buffer = new StringBuffer("["); + for (int i = 0; i < array.length; i++) + { + buffer.append("\"" + array[i] + "\"\n"); + } + buffer.delete(buffer.length() - 3, buffer.length()); + buffer.append("]"); + return buffer.toString(); + } + /***********************************************************************/ + /***********************************************************************/ +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/NameUtils.java b/src/main/java/com/spun/util/NameUtils.java new file mode 100644 index 0000000..7c0ac4c --- /dev/null +++ b/src/main/java/com/spun/util/NameUtils.java @@ -0,0 +1,120 @@ +package com.spun.util; + +public class NameUtils +{ + /***********************************************************************/ + public static String getRandomFirstName() + { + String[] names = new String[]{"James", + "John", + "Robert", + "Michael", + "William", + "David", + "Richard", + "Charles", + "Joseph", + "Thomas", + "Christopher", + "Daniel", + "Paul", + "Mark", + "Donald", + "George", + "Kenneth", + "Steven", + "Edward", + "Brian", + "Ronald", + "Anthony", + "Kevin", + "Jason", + "Matthew", + "Gary", + "Timothy", + "Jose", + "Larry", + "Jeffrey", + "Frank", + "Scott", + "Eric", + "Stephen", + "Andrew", + "Raymond", + "Gregory", + "Joshua", + "Jerry", + "Dennis", + "Walter", + "Patrick", + "Peter", + "Harold", + "Douglas", + "Henry", + "Carl", + "Arthur", + "Ryan", + "Roger" }; + return names[NumberUtils.RANDOM.nextInt(names.length)]; + } + + /***********************************************************************/ + public static String getRandomLastName() + { + String[] names = new String[]{"Smith", + "Johnson", + "Williams", + "Jones", + "Brown", + "Davis", + "Miller", + "Wilson", + "Moore", + "Taylor", + "Anderson", + "Thomas", + "Jackson", + "White", + "Harris", + "Martin", + "Thompson", + "Garcia", + "Martinez", + "Robinson", + "Clark", + "Rodriguez", + "Lewis", + "Lee", + "Walker", + "Hall", + "Allen", + "Young", + "Hernandez", + "King", + "Wright", + "Lopez", + "Hill", + "Scott", + "Green", + "Adams", + "Baker", + "Gonzalez", + "Nelson", + "Carter", + "Mitchell", + "Perez", + "Roberts", + "Turner", + "Phillips", + "Campbell", + "Parker", + "Evans", + "Edwards", + "Collins" }; + return names[NumberUtils.RANDOM.nextInt(names.length)]; + } + + + /************************************************************************/ + /************************************************************************/ +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/NotImplementedException.java b/src/main/java/com/spun/util/NotImplementedException.java new file mode 100644 index 0000000..633c54d --- /dev/null +++ b/src/main/java/com/spun/util/NotImplementedException.java @@ -0,0 +1,10 @@ +package com.spun.util; + +public class NotImplementedException extends Exception { + + /** + * + */ + private static final long serialVersionUID = 5269165537235260411L; + +} diff --git a/src/main/java/com/spun/util/NumberUtils.java b/src/main/java/com/spun/util/NumberUtils.java new file mode 100644 index 0000000..a305a7d --- /dev/null +++ b/src/main/java/com/spun/util/NumberUtils.java @@ -0,0 +1,284 @@ +package com.spun.util; + +import java.io.Serializable; +import java.lang.reflect.Array; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Random; + +/** + * A static class of convenience functions for Manipulating numbers + **/ +public class NumberUtils +{ + public static Random RANDOM = new Random(); + /***********************************************************************/ + public static int getMax(int value1, int value2) + { + return value1 > value2 ? value1 : value2; + } + /***********************************************************************/ + /** + * Loads an int from a String. + **/ + public static int load(String i, int defaultValue) + { + return load(i, defaultValue, true); + } + /***********************************************************************/ + /** + * Loads an int from a String. + **/ + public static int load(String i, int defaultValue, boolean stripNonNumeric) + { + try + { + i = stripNonNumeric ? StringUtils.stripNonNumeric(i, true, true) : i; + defaultValue = Integer.parseInt(i); + } + catch (Exception e) + {} + return defaultValue; + } + /***********************************************************************/ + /** + * Loads an int from a String. + **/ + public static long load(String i, long defaultValue) + { + try + { + defaultValue = Long.parseLong(i); + } + catch (Exception e) + {} + return defaultValue; + } + /***********************************************************************/ + /** + * + **/ + public static double load(String i, double defaultValue) + { + try + { + i = StringUtils.stripNonNumeric(i, true, true); + defaultValue = Double.parseDouble(i); + } + catch (Exception e) + {} + return defaultValue; + } + /***********************************************************************/ + public static boolean load(String i, boolean d) + { + return (i == null) ? d : "true".equalsIgnoreCase(i); + } + /***********************************************************************/ + public static int[] loadArray(String summaryString, String seperator, int defaultWhenLoading) + { + String parts[] = StringUtils.split(summaryString, seperator); + int integers[] = new int[parts.length]; + for (int i = 0; i < parts.length; i++) + { + integers[i] = load(parts[i], defaultWhenLoading); + } + return integers; + } + /************************************************************************/ + public static double setSignificantDigit(double onNumber, int digit) + { + double power = Math.pow(10, digit); + onNumber = onNumber * power; + onNumber = Math.round(onNumber); + onNumber = onNumber / power; + return onNumber; + } + /************************************************************************/ + /** + * a unit test of sorts :-) + **/ + public static void main(String args[]) + { + Random r = new Random(); + for (int i = 0; i < 20; i++) + { + double d = r.nextDouble(); + int s = r.nextInt(5); + MySystem.event(d + " , " + s + " -> " + setSignificantDigit(d, s)); + } + } + /***********************************************************************/ + public static boolean doRandomPercentage(int i) + { + return RANDOM.nextInt(100) < i; + } + /***********************************************************************/ + public static boolean equals(double one, double two, double delta) + { + double actualDelta = one - two; + return (-delta < actualDelta) && (actualDelta < delta); + } + /***********************************************************************/ + public static Integer[] wrapIntegers(int[] ints) + { + Integer[] integers = new Integer[ints.length]; + for (int i = 0; i < ints.length; i++) + { + integers[i] = ints[i]; + } + return integers; + } + /***********************************************************************/ + public static String createRandomStringOfNumbers(int digits) + { + StringBuffer buffer = new StringBuffer(digits); + for (int i = 0; i < digits; i++) + { + buffer.append(RANDOM.nextInt(10)); + } + return buffer.toString(); + } + /***********************************************************************/ + public static boolean isIn(int check, int[] available) + { + for (int i = 0; i < available.length; i++) + { + if (check == available[i]) { return true; } + } + return false; + } + /***********************************************************************/ + /** + * @deprecated use Query.sum() + */ + public static double sum(Object[] attribs, String methodName, Object[] params) + { + try + { + if (attribs == null || attribs.length == 0) { return 0.00; } + Method method = MethodExecutionPath.Parameters.getBestFitMethod(attribs[0].getClass(), methodName, + params == null ? null : (Class[]) ObjectUtils.extractArray(params, "getClass")); + double sum = 0; + for (int i = 0; i < attribs.length; i++) + { + sum += ((Number) method.invoke(attribs[i], params)).doubleValue(); + } + return sum; + } + catch (Throwable t) + { + throw ObjectUtils.throwAsError(t); + } + } + /***********************************************************************/ + public static boolean isEven(int number) + { + return ((number % 2) == 0); + } + /***********************************************************************/ + /** + * @deprecated use Query.sum() + */ + public static double sum(Object[] onArray, String forMethodName) + { + return sum(onArray, forMethodName, null); + } + /***********************************************************************/ + /** + * @deprecated use Query.sum() + */ + public static double sum(Collection onCollection, String forMethodName) + { + return sum(onCollection.toArray(), forMethodName, null); + } + /***********************************************************************/ + public static T[] getShuffled(T[] objects, int numberToReturn) + { + Shuffler[] shuffles = new Shuffler[objects.length]; + for (int i = 0; i < objects.length; i++) + { + shuffles[i] = new Shuffler(i); + } + Arrays.sort(shuffles, new Shuffler(0)); + ArrayList list = new ArrayList(numberToReturn); + for (int i = 0; i < numberToReturn; i++) + { + list.add(objects[shuffles[i].oldPosition]); + } + Object[] objects2 = null; + try + { + objects2 = (Object[]) Array.newInstance(objects.getClass().getComponentType(), numberToReturn); + } + catch (Exception e) + { + MySystem.warning(e); + objects2 = new Object[numberToReturn]; + } + return (T[]) list.toArray(objects2); + } + /***********************************************************************/ + /** + * randomly chooses a number between the minimum and maximum + *
Example: {@code int grade = NumberUtils.getRandomInt(1,100);}
+ * + * @param minimum + * The lowest possible value (inclusive) + * @param maximum + * The highest possible value (inclusive) + * @return the random number + */ + public static int getRandomInt(int minimum, int maximum) + { + int diff = maximum - minimum; + if (diff == 0) + { + return maximum; + } + else + { + return RANDOM.nextInt(diff) + minimum; + } + } + /***********************************************************************/ + public static int floor(double i) + { + return (int) Math.floor(i); + } + /***********************************************************************/ + public static int getNumberOfDigits(int number) + { + return ("" + number).length(); + } + /***********************************************************************/ + public static double convertDoubleToPercentage(double doub) + { + return doub * 100; + } + /***********************************************************************/ + public static double convertPercentageToDouble(double percent) + { + return percent / 100; + } + /***********************************************************************/ + /* INNER CLASS */ + /***********************************************************************/ + public static class Shuffler implements java.util.Comparator, Serializable + { + public int oldPosition = 0; + public int newPosition = 0; + public Shuffler(int oldPosition) + { + this.oldPosition = oldPosition; + this.newPosition = RANDOM.nextInt(); + } + public int compare(Shuffler s1, Shuffler s2) + { + return Double.compare(s1.newPosition, (s2).newPosition); + } + } + /***********************************************************************/ +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/ObjectUtils.java b/src/main/java/com/spun/util/ObjectUtils.java new file mode 100644 index 0000000..f6126d1 --- /dev/null +++ b/src/main/java/com/spun/util/ObjectUtils.java @@ -0,0 +1,282 @@ +package com.spun.util; + +import java.lang.reflect.Array; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * A static class of convenience functions for Manipulating objects + **/ +public class ObjectUtils +{ + public static int generateHashCode(Object... relevantMembers) + { + final int PRIME = 31; + int result = 1; + for (Object member : relevantMembers) + { + result = PRIME * result + ((member == null) ? 0 : member.hashCode()); + } + return result; + } + /***********************************************************************/ + /** + * tests if two objects are equal for all functions passed. + **/ + public static boolean isEqualForMethods(Object o1, Object o2, String[] methods) + { + try + { + Method[] m1 = getMethodsForObject(o1, methods); + Method[] m2 = getMethodsForObject(o2, methods); + for (int i = 0; i < m1.length; i++) + { + Object v1 = m1[i].invoke(o1, (Object[]) null); + Object v2 = m2[i].invoke(o2, (Object[]) null); + if (!isEqual(v1, v2)) { return false; } + } + return true; + } + catch (Throwable t) + { + throw new Error(t); + } + } + /***********************************************************************/ + public static Method[] getMethodsForObject(Object o2, String[] passedMethods) throws SecurityException, + NoSuchMethodException + { + Method methods[] = new Method[passedMethods.length]; + Class clazz = o2.getClass(); + for (int i = 0; i < passedMethods.length; i++) + { + methods[i] = clazz.getMethod(passedMethods[i], (Class[]) null); + } + return methods; + } + /***********************************************************************/ + /** + * A convenience function to check if 2 strings are equal. + * @param string The string in question + * @return true if Equal. + **/ + public static boolean isEqual(Object s1, Object s2) + { + if (s1 == s2) + { + return true; + } + else if ((s1 != null) && s1.equals(s2)) + { + return true; + } + else + { + return false; + } + } + /***********************************************************************/ + public static boolean isIn(Object target, Object[] objects) + { + for (int i = 0; i < objects.length; i++) + { + if (ObjectUtils.isEqual(objects[i], target)) { return true; } + } + return false; + } + /***********************************************************************/ + public static T getForMethod(T[] onArray, Object forValue, String... onMethods) + { + return getForMethod(onArray, forValue, new MethodExecutionPath(null, onMethods)); + } + /***********************************************************************/ + public static T getForMethod(T[] onArray, Object forValue, String onMethod) + { + return getForMethod(onArray, forValue, new MethodExecutionPath(null, onMethod, null)); + } + /***********************************************************************/ + public static T getForMethod(T[] onArray, Object forValue, String onMethod, Object[] params) + { + return getForMethod(onArray, forValue, new MethodExecutionPath(null, onMethod, + new MethodExecutionPath.Parameters(params))); + } + /***********************************************************************/ + public static T getForMethod(T[] onArray, Object forValue, MethodExecutionPath path) + { + if (onArray == null || (onArray.length == 0)) { return null; } + try + { + for (int i = 0; i < onArray.length; i++) + { + if (isEqual(forValue, path.extractValue(onArray[i]))) { return onArray[i]; } + } + return null; + } + catch (Throwable t) + { + throw throwAsError(t); + } + } + /***********************************************************************/ + public static boolean isThisInstanceOfThat(Class thiz, Class that) + { + return that.isAssignableFrom(thiz); + } + /***********************************************************************/ + public static Error throwAsError(Throwable t) throws Error + { + if (t instanceof RuntimeException) + { + throw (RuntimeException) t; + } + else if (t instanceof Error) + { + throw (Error) t; + } + else + { + throw new Error(t); + } + } + /***********************************************************************/ + public static T getRandomIndex(T[] array) + { + if ((array == null) || (array.length == 0)) { return null; } + return array[NumberUtils.RANDOM.nextInt(array.length)]; + } + /***********************************************************************/ + /** + * @deprecated use Query.select() + */ + public static Object[] extractArray(Object[] from, String methodName) + { + try + { + if (from == null || from.length == 0) { return new Object[0]; } + Method method = getGreatestCommonDenominator(from, methodName); + Object[] array = null; + if (Object.class.isAssignableFrom(method.getReturnType())) + { + array = (Object[]) Array.newInstance(method.getReturnType(), from.length); + } + else + { + array = (Object[]) Array.newInstance(ClassUtils.getWrapperClass(method.getReturnType()), from.length); + } + for (int i = 0; i < from.length; i++) + { + array[i] = method.invoke(from[i], (Object[]) null); + } + return array; + } + catch (Exception e) + { + MySystem.warning(e); + throw ObjectUtils.throwAsError(e); + } + } + /***********************************************************************/ + public static Method getGreatestCommonDenominator(Object[] from, String methodName) throws SecurityException, + NoSuchMethodException + { + List classes = new ArrayList(); + ArrayUtils.addArray(classes, getAllCastableClasses(from[0])); + for (Object o : from) + { + for (int i = classes.size() - 1; i >= 0; i--) + { + Class clazz = classes.get(i); + if (!isThisInstanceOfThat(o.getClass(), clazz) || !ClassUtils.hasMethod(clazz, methodName)) + { + classes.remove(i); + } + } + } + return classes.size() == 0 ? null : ArrayUtils.getLast(classes).getMethod(methodName, (Class[]) null); + } + /***********************************************************************/ + private static Class[] getAllCastableClasses(Object object) + { + Class clazz = object.getClass(); + ArrayList list = new ArrayList(); + while (clazz != null) + { + list.add(clazz); + ArrayUtils.addArray(list, clazz.getInterfaces()); + clazz = clazz.getSuperclass(); + } + Class[] found = (Class[]) list.toArray(new Class[list.size()]); + ArrayUtils.toReverseArray(found); + return found; + } + /***********************************************************************/ + public static Object executeMethod(Object object, String method, Class[] methodSignature, Object[] parameters) + { + try + { + return object.getClass().getMethod(method, methodSignature).invoke(object, parameters); + } + catch (Throwable t) + { + throw throwAsError(t); + } + } + /***********************************************************************/ + public static void assertInstance(Class clazz, Object object) + { + assertInstance(new Class[]{clazz}, object); + } + /***********************************************************************/ + public static void assertInstance(Class classes[], Object object) + { + if (object == null) { throw new NullPointerException("Expected Object of Type " + + Arrays.asList(extractArray(classes, "getName")) + " but was null"); } + for (int i = 0; i < classes.length; i++) + { + if (ClassUtils.getWrapperClass(classes[i]).isInstance(object)) { return; } + } + throw new IllegalArgumentException("Expected Object of Type " + + Arrays.asList(extractArray(classes, "getName")) + " but got " + object.getClass().getName()); + } + /***********************************************************************/ + public static String getClassName(Object o) + { + return o == null ? "null" : o.getClass().getName(); + } + /***********************************************************************/ + public static void assertInstanceOrNull(Class type, Object value) + { + if (value != null) + { + assertInstance(type, value); + } + } + /************************************************************************/ + public static void move(Object from, Object to, String[] getters) + { + try + { + for (String method : getters) + { + Method getMethod = from.getClass().getMethod("get" + method, (Class[]) null); + Object value = getMethod.invoke(from, (Object[]) null); + Method m = MethodExecutionPath.Parameters.getBestFitMethod(to.getClass(), "set" + method, + new Class[]{getBestClass(value, getMethod)}); + m.invoke(to, value); + } + } + catch (Exception e) + { + throw throwAsError(e); + } + } + /************************************************************************/ + private static Class getBestClass(Object value, Method method) + { + return value == null ? method.getReturnType() : value.getClass(); + } + /************************************************************************/ + /************************************************************************/ +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/PhoneNumber.java b/src/main/java/com/spun/util/PhoneNumber.java new file mode 100644 index 0000000..49841f9 --- /dev/null +++ b/src/main/java/com/spun/util/PhoneNumber.java @@ -0,0 +1,259 @@ +package com.spun.util; + + +/** + * Phone number validation, and formatter. + * this class is immutable. + **/ +public class PhoneNumber +{ + public static final int USA = 0; + public static final String[] COUNTRY_CODES = { + "1", "20", "212", "213", "216", "218", "220", "221", "222", "223", + "224", "225", "226", "227", "228", "229", "230", "231", "232", "233", + "234", "235", "236", "237", "238", "239", "240", "241", "242", "243", + "244", "245", "246", "247", "248", "249", "250", "251", "252", "253", + "254", "255", "256", "257", "258", "260", "261", "262", "263", "264", + "265", "266", "267", "268", "269", "27", "290", "291", "297", "298", + "299", "30", "31", "32", "33", "34", "350", "351", "352", "353", + "354", "355", "356", "357", "358", "359", "36", "370", "371", "372", + "373", "374", "375", "376", "377", "378", "380", "381", "385", "386", + "387", "389", "39", "40", "41", "420", "421", "423", "43", "44", + "45", "46", "47", "48", "49", "500", "501", "502", "503", "504", + "505", "506", "507", "508", "509", "51", "52", "53", "5399", "54", + "55", "56", "57", "58", "590", "591", "592", "593", "594", "595", + "596", "597", "598", "599", "60", "61", "618", "62", "63", "64", + "65", "66", "670", "672", "673", "674", "675", "676", "677", "678", + "679", "680", "681", "682", "683", "684", "685", "686", "687", "688", + "689", "690", "691", "692", "7", "808", "81", "82", "84", "850", + "852", "853", "855", "856", "86", "870", "871", "872", "873", "874", + "878", "880", "881", "8816", "8817", "88213", "88216", "886", "90", "91", + "92", "93", "94", "95", "960", "961", "962", "963", "964", "965", + "966", "967", "968", "970", "971", "972", "973", "974", "975", "976", + "977", "98", "992", "993", "994", "995", "996", "998"}; + + private static final String REASONS[] = {"Phone Number Too Long or Too Short", "US Number must be length 10", "Unknown Country Code"}; + + /** The original value. */ + private String originalValue = null; + private int countryCode = USA; + private String strippedValue = null; + private String invalidReason = null; + private int nonValidCountryCode = 0; + public PhoneNumber(String originalValue) + { + originalValue = StringUtils.loadNullableString(originalValue); + this.originalValue = originalValue; + if (this.originalValue == null) { return; } + this.strippedValue = stripPhoneNumber(this.originalValue); + this.countryCode = getCountryCode(strippedValue); + this.invalidReason = validate(countryCode, strippedValue); + if (invalidReason != null) + { + nonValidCountryCode = countryCode; + countryCode = -1; + } + } + /**************************************************************************/ + private static String stripPhoneNumber(String number) + { + if (number == null) {return null;} + boolean xAppended = false; + StringBuffer result = new StringBuffer(); + for(int i = 0; i< number.length(); i++) + { + char c = number.charAt(i); + switch (c) + { + case '0' : + case '1' : + case '2' : + case '3' : + case '4' : + case '5' : + case '6' : + case '7' : + case '8' : + case '9' : result.append(c); break; + case '+' : if (result.length() == 0){result.append(c);} break; + case 'X': + case 'x': { + if (! xAppended) + { + result.append('x'); + xAppended = true; + } + break; + } + default : break; + } + } + + char c = result.length() == 0 ? ' ' : result.charAt(0); + switch (c) + { + case '+': break; // do nothing + case '1': result.insert(0, "+"); break; // insert a 1 + default: result.insert(0, "+1"); // if neither insert a +1 + } + + return result.toString(); + } + /**************************************************************************/ + private static int getCountryCode(String strippedNumber) + { + String alt = strippedNumber.substring(1); + for (int i = 0; i < COUNTRY_CODES.length; i++) + { + String code = COUNTRY_CODES[i]; + if (alt.startsWith(code)) { return i; } + } + return -1; + } + /**************************************************************************/ + private static String validate(int countryCode, String stripedNumber) + { + return (countryCode == USA) ? validateNorthAmerican(countryCode, stripedNumber) : validateInternational(countryCode, stripedNumber); + } + /**************************************************************************/ + private static String validateInternational(int countryCode, String strippedNumber) + { + if (countryCode == -1) + return "Invalid country code"; + String body = extractPhoneBody(countryCode, strippedNumber); + String prefix = COUNTRY_CODES[countryCode]; + int nl = prefix.length() + body.length(); + return (nl > 15) || (nl < 9) ? REASONS[0] : null; + } + /**************************************************************************/ + private static String validateNorthAmerican(int countryCode, String strippedNumber) + { + if (countryCode != USA) + return "Invalid country code"; + String body = extractPhoneBody(countryCode, strippedNumber); + return (body.length() != 10) ? REASONS[0] : null; + } + /**************************************************************************/ + private static String extractPhoneBody(int countryCode, String strippedNumber) + { + if (countryCode == -1) + throw new IllegalArgumentException("Invalid country code"); + String prefix = "+" + COUNTRY_CODES[countryCode]; + String body = strippedNumber.substring(prefix.length()); + int indexOfExt = body.indexOf('x'); + if (indexOfExt > -1) + { + body = body.substring(0, indexOfExt); + } + return body; + } + /**************************************************************************/ + public String getValue() + { + if (isValid() && strippedValue != null) + { + return (isNorthAmericanNumber()) ? getValueAsNorthAmerican() : getValueAsInternational(); + } + else + { + return originalValue; + } + } + /**************************************************************************/ + public String getValueAsUps() + { + return getValueAsUps(countryCode, this.strippedValue); + } + /**************************************************************************/ + private static String getValueAsUps(int countryCode, String strippedNumber) + { + if (strippedNumber == null) { return null; } + if (countryCode < 0) { throw new IllegalArgumentException("# '" + strippedNumber + "' is not an international number"); } + String body = extractPhoneBody(countryCode, strippedNumber); + String prefix = COUNTRY_CODES[countryCode]; + if (countryCode == USA) + { + return body; + } + else + { + return prefix + body; + } + } + /**************************************************************************/ + private static String getValueAsNorthAmerican(int countryCode, String stripped) + { + if (countryCode != USA) + throw new IllegalArgumentException("# '" + stripped + "' is not a NorthAmerican number"); + StringBuffer number = new StringBuffer(stripped.substring(2)); + number.insert(6, "-"); + number.insert(3, ")"); + number.insert(0, "("); + return number.toString(); + } + /**************************************************************************/ + private static String getValueAsInternational(int countryCode, String stripped) + { + if (stripped == null) { return null; } + if (countryCode < USA) { throw new IllegalArgumentException("# '" + stripped + "' is not an international number"); } + StringBuffer number = new StringBuffer(stripped); + int intlLength = COUNTRY_CODES[countryCode].length() + 1; + int bodyLength = extractPhoneBody(countryCode, stripped).length(); + if (bodyLength > 6) + { + number.insert(intlLength + 6, "."); + } + if (bodyLength > 3) + { + number.insert(intlLength + 3, "."); + } + number.insert(intlLength, "."); + return number.toString(); + } + /**************************************************************************/ + public String getValueAsNorthAmerican() + { + return getValueAsNorthAmerican(this.countryCode, this.strippedValue); + } + /**************************************************************************/ + public String getValueAsInternational() + { + return getValueAsInternational(this.countryCode, this.strippedValue); + } + /**************************************************************************/ + public String getPartiallyFormattedAsInternational() + { + return getValueAsInternational(this.nonValidCountryCode, this.strippedValue); + } + /**************************************************************************/ + public boolean isValid() + { + return (this.invalidReason == null); + } + /**************************************************************************/ + public String getInvalidReason() + { + return this.invalidReason; + } + /**************************************************************************/ + public boolean isNorthAmericanNumber() + { + return this.countryCode == USA; + } + /**************************************************************************/ + public String getOriginalText() + { + return originalValue; + } + /**************************************************************************/ + public String toString() + { + return getValue(); + } + /**************************************************************************/ + /**************************************************************************/ + public Country getCountry() + { + return Country.UnitedStates; + } +} diff --git a/src/main/java/com/spun/util/PrintUtils.java b/src/main/java/com/spun/util/PrintUtils.java new file mode 100644 index 0000000..7f4f803 --- /dev/null +++ b/src/main/java/com/spun/util/PrintUtils.java @@ -0,0 +1,92 @@ +package com.spun.util; + +import java.awt.*; +import javax.swing.*; +import java.awt.print.*; + +public class PrintUtils + implements Printable +{ + private Component componentToBePrinted; + /***********************************************************************/ + + public static void printComponent(Component c) + { + printComponent(c, true); + } + /***********************************************************************/ + + public static void printComponent(Component c, boolean prompt) + { + new PrintUtils(c).print(prompt); + } + /***********************************************************************/ + + public PrintUtils(Component componentToBePrinted) + { + this.componentToBePrinted = componentToBePrinted; + } + /***********************************************************************/ + + public void print(boolean prompt) + { + PrinterJob printJob = PrinterJob.getPrinterJob(); + PageFormat format = printJob.defaultPage(); + Paper paper = format.getPaper(); + paper.setImageableArea(18,0,180,840);// Paper format for receipt printer + format.setPaper(paper); + + + printJob.setPrintable(this,format); + + if (!prompt || printJob.printDialog()) + { + try + { + printJob.print(); + } + catch(PrinterException pe) + { + MySystem.variable("Error printing: " + pe); + } + } + } + /***********************************************************************/ + + public int print(Graphics g, PageFormat pageFormat, int pageIndex) + { + if (pageIndex > 0) + { + return(NO_SUCH_PAGE); + } + else + { + Graphics2D g2d = (Graphics2D)g; + MySystem.variable("width = " + pageFormat.getWidth()); + MySystem.variable("image width = " + pageFormat.getImageableWidth()); + MySystem.variable("getHeight() = " + pageFormat.getHeight()); + + g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY()); + disableDoubleBuffering(componentToBePrinted); + componentToBePrinted.paint(g2d); + enableDoubleBuffering(componentToBePrinted); + return(PAGE_EXISTS); + } + } + /***********************************************************************/ + + public static void disableDoubleBuffering(Component c) + { + RepaintManager currentManager = RepaintManager.currentManager(c); + currentManager.setDoubleBufferingEnabled(false); + } + + /***********************************************************************/ + public static void enableDoubleBuffering(Component c) + { + RepaintManager currentManager = RepaintManager.currentManager(c); + currentManager.setDoubleBufferingEnabled(true); + } + /***********************************************************************/ + /***********************************************************************/ +} diff --git a/src/main/java/com/spun/util/ProgessFrame.java b/src/main/java/com/spun/util/ProgessFrame.java new file mode 100644 index 0000000..0c2a70e --- /dev/null +++ b/src/main/java/com/spun/util/ProgessFrame.java @@ -0,0 +1,111 @@ +package com.spun.util; + +import com.spun.util.WindowUtils; +import javax.swing.*; +import java.awt.*; + +/** + * Copyright 1998 American Teleconferencing Services + *
Class Description + *
The is the main Res Frame object + *
+ *
API History + *
+ *
Revision Information + *
+ * $Author:: Lfalco                                           $
+ * $Archive:: /Code/com/ats/client/res/ProgessFrame.java      $
+ * $Date:: 8/24/99 3:49a                                      $
+ * $Revision:: 7                                              $
+ * 
+ * + */ +public class ProgessFrame extends JDialog +{ + private JLabel progressLabel = null; + private JProgressBar progressBar = null; + private int maxSteps = 0; + private JPanel panel = null; + private boolean forcePainting = true; + private long startTime; + /**************************************************************************/ + public ProgessFrame(Frame frame, String title, String initLabel, int maxSteps) + { + this(frame, title, initLabel, maxSteps, true); + } + /**************************************************************************/ + public ProgessFrame(Frame frame, String title, String initLabel, int maxSteps, boolean forcePainting) + { + super(frame, title, false); + this.maxSteps = maxSteps; + this.forcePainting = forcePainting; + init(initLabel); + } + /**************************************************************************/ + private void init(String initLabel) + { + panel = new JPanel(); + panel.setLayout(null); + panel.setPreferredSize(new Dimension(400, 100)); + progressLabel = new JLabel(initLabel); + progressLabel.setFont(new java.awt.Font("dialog", java.awt.Font.BOLD, 12)); + progressLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); + progressLabel.setForeground(new java.awt.Color(0, 0, 156)); + progressLabel.setBounds(30, 20, 340, 20); + panel.add(progressLabel); + progressBar = new JProgressBar(0, maxSteps); + progressBar.setStringPainted(true); + progressLabel.setLabelFor(progressBar); + progressBar.setAlignmentX(CENTER_ALIGNMENT); + progressBar.getAccessibleContext().setAccessibleName("SwingSet loading progress"); + progressBar.setBounds(30, 40, 340, 20); + panel.add(progressBar); + // show the frame + this.setContentPane(panel); + this.pack(); + this.setVisible(true); + WindowUtils.centerWindow(this); + setState(initLabel, 0); + } + /**************************************************************************/ + public void setState(String label, int progress) + { + progressLabel.setText(label); + progressBar.setValue(progress); + if (forcePainting) + { + panel.paintImmediately(panel.getVisibleRect()); + } + else + { + repaint(); + } + if (progress == maxSteps) + { + this.dispose(); + } + } + /**************************************************************************/ + public void start() + { + this.startTime = System.currentTimeMillis(); + } + /**************************************************************************/ + public void setStateWithTime(int progress) + { + long time = (System.currentTimeMillis() - startTime); + double speed = (progress + 1) / (double) time; + long totalTime = (long) (this.maxSteps / speed); + long remainingTime = totalTime - time; + String label = String.format("%s / %s - %s remaining", progress, maxSteps, new DateDifference(remainingTime) + .getStandardTimeText(2)); + setState(label, progress); + } + /**************************************************************************/ + public void setFinished() + { + setState("done", maxSteps); + } + /**************************************************************************/ + /**************************************************************************/ +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/SearchingFileFilter.java b/src/main/java/com/spun/util/SearchingFileFilter.java new file mode 100644 index 0000000..bef5d4c --- /dev/null +++ b/src/main/java/com/spun/util/SearchingFileFilter.java @@ -0,0 +1,48 @@ +package com.spun.util; + +import java.io.File; +import java.io.FilenameFilter; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class SearchingFileFilter implements FilenameFilter +{ + private final List matches; + public SearchingFileFilter(List matches) + { + this.matches = matches; + } + public SearchingFileFilter(String... matches) + { + ArrayList m = new ArrayList(); + m.addAll(Arrays.asList(matches)); + this.matches = m; + } + public boolean accept(File dir, String name) + { + boolean directory = new File(dir, name).isDirectory(); + return accept(name, directory); + } + public boolean accept(String name, boolean directory) + { + if (name.startsWith(".")) { return false; } + if (matches.get(0).equals("*")) { return directory || name.equals(matches.get(1)); } + return name.equals(matches.get(0)); + } + public List getSubset(String file2) + { + if (matches.get(0).equals("*")) + { + if (matches.get(1).equals(file2)) + { + return matches.subList(2, matches.size()); + } + else + { + return matches; + } + } + return matches.subList(1, matches.size()); + } +} diff --git a/src/main/java/com/spun/util/SearchingFileFilterTest.java b/src/main/java/com/spun/util/SearchingFileFilterTest.java new file mode 100644 index 0000000..f13be82 --- /dev/null +++ b/src/main/java/com/spun/util/SearchingFileFilterTest.java @@ -0,0 +1,21 @@ +package com.spun.util; + +import junit.framework.TestCase; + +public class SearchingFileFilterTest extends TestCase +{ + public void testStar() throws Exception + { + assertFalse(new SearchingFileFilter("*","something").accept(".anything", true)); + assertFalse(new SearchingFileFilter("*","something").accept("anythingFile", false)); + assertTrue(new SearchingFileFilter("*","something").accept("anythingDirectory", true)); + assertFalse(new SearchingFileFilter("something").accept("anything", true)); + assertTrue(new SearchingFileFilter("*","temp.htm").accept("temp.htm", false)); + } + public void testFinding() throws Exception + { + assertEquals("[*, temp.htm]", new SearchingFileFilter("*","temp.htm").getSubset("a").toString()); + assertEquals("[b]", new SearchingFileFilter("*","a","b").getSubset("a").toString()); + + } +} diff --git a/src/main/java/com/spun/util/StackTraceReflectionResult.java b/src/main/java/com/spun/util/StackTraceReflectionResult.java new file mode 100644 index 0000000..d4cfd63 --- /dev/null +++ b/src/main/java/com/spun/util/StackTraceReflectionResult.java @@ -0,0 +1,34 @@ +package com.spun.util; + +import java.io.File; + +public class StackTraceReflectionResult +{ + + private final File sourceFile; + private final String className; + private final String methodName; + + public StackTraceReflectionResult(File sourceFile, String className, String methodName) + { + this.sourceFile = sourceFile; + this.className = className; + this.methodName = methodName; + } + + public File getSourceFile() + { + return sourceFile; + } + + public String getClassName() + { + return className; + } + + public String getMethodName() + { + return methodName; + } + +} diff --git a/src/main/java/com/spun/util/State.java b/src/main/java/com/spun/util/State.java new file mode 100644 index 0000000..37e64d7 --- /dev/null +++ b/src/main/java/com/spun/util/State.java @@ -0,0 +1,81 @@ +package com.spun.util; + +public enum State { + Alabama("AL"), Alaska("AK"), Arizona("AZ"), Arkansas("AR"), California("CA"), Colorado("CO"), Connecticut("CT"), + Delaware("DE"), DistrictOfColumbia("Washington D.C.", "DC"), Florida("FL"), Georgia("GA"), Hawaii("HI"), + Idaho("ID"), Illinois("IL"), Indiana("IN"), Iowa("IA"), Kansas("KS"), Kentucky("KY"), Louisiana("LA"), + Maine("ME"), Maryland("MD"), Massachusetts("MA"), Michigan("MI"), Minnesota("MN"), Mississippi("MS"), + Missouri("MO"), Montana("MT"), Nebraska("NE"), Nevada("NV"), NewHampshire("New Hampshire", "NH"), + NewJersey("New Jersey", "NJ"), NewMexico("New Mexico", "NM"), NewYork("New York", "NY"), + NorthCarolina("North Carolina", "NC"), NorthDakota("North Dakota", "ND"), Ohio("OH"), Oklahoma("OK"), + Oregon("OR"), Pennsylvania("PA"), RhodeIsland("Rhode Island", "RI"), SouthCarolina("South Carolina", "SC"), + SouthDakota("South Dakota", "SD"), Tennessee("TN"), Texas("TX"), Utah("UT"), Vermont("VT"), Virginia("VA"), + Washington("WA"), WestVirginia("West Virginia", "WV"), Wisconsin("WI"), Wyoming("WY"); + String altText = null; + public String abbreviation = null; + /************************************************************************/ + private State(String abbreviation) + { + this.abbreviation = abbreviation; + } + /************************************************************************/ + private State(String altText, String abbreviation) + { + this.altText = altText; + this.abbreviation = abbreviation; + } + /************************************************************************/ + @Override + public String toString() + { + return altText == null ? super.toString() : altText; + } + /************************************************************************/ + public static String toStandardText(String state) + { + // needs to return the corresponding abbreviation or, if not found, return what was passed in + for (State s : State.values()) + { + if (s.toString().equalsIgnoreCase(state) || s.abbreviation.equalsIgnoreCase(state)) { return s.abbreviation; } + } + return state; + } + /************************************************************************/ + public static String[] getStateAbbreviations() + { + State[] allStates = State.values(); + String[] abbreviations = new String[allStates.length]; + for (int i = 0; i < allStates.length; i++) + { + abbreviations[i] = allStates[i].abbreviation; + } + return abbreviations; + } + /************************************************************************/ + public static boolean isStateAbbreviation(String text) + { + for (State s : values()) + { + if (s.getAbbreviation().equalsIgnoreCase(text)) { return true; } + } + return false; + } + /************************************************************************/ + private static String[] names = null; + /************************************************************************/ + public static synchronized String[] getStringValues() + { + if (names == null) + { + names = (String[]) ObjectUtils.extractArray(State.values(), "toString"); + } + return names; + } + /************************************************************************/ + public String getAbbreviation() + { + return abbreviation; + } + /************************************************************************/ + /************************************************************************/ +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/StateToPostalCode.java b/src/main/java/com/spun/util/StateToPostalCode.java new file mode 100644 index 0000000..57d9738 --- /dev/null +++ b/src/main/java/com/spun/util/StateToPostalCode.java @@ -0,0 +1,176 @@ +package com.spun.util; + +import java.util.HashMap; + +public class StateToPostalCode +{ + /* + * Utility that maps postal code to full state names. + */ + public static final String ALABAMA = "Alabama"; + public static final String ALASKA = "Alaska"; + public static final String ARIZONA = "Arizona"; + public static final String ARKANSAS = "Arkansas"; + public static final String CALIFORNIA = "California"; + public static final String COLORADO = "Colorado"; + public static final String CONNECTICUT = "Connecticut"; + public static final String DELAWARE = "Delaware"; + public static final String DISTRICT_OF_COLUMBIA = "District Of Columbia"; + public static final String FLORIDA = "Florida"; + public static final String GEORGIA = "Georgia"; + public static final String HAWAII = "Hawaii"; + public static final String IDAHO = "Idaho"; + public static final String ILLINOIS = "Illinois"; + public static final String INDIANA = "Indiana"; + public static final String IOWA = "Iowa"; + public static final String KANSAS = "Kansas"; + public static final String KENTUCKY = "Kentucky"; + public static final String LOUISIANA = "Louisiana"; + public static final String MAINE = "Maine"; + public static final String MARYLAND = "Maryland"; + public static final String MASSACHUSETTS = "Massachusetts"; + public static final String MICHIGAN = "Michigan"; + public static final String MINNESOTA = "Minnesota"; + public static final String MISSISSIPPI = "Mississippi"; + public static final String MISSOURI = "Missouri"; + public static final String MONTANA = "Montana"; + public static final String NEBRASKA = "Nebraska"; + public static final String NEVADA = "Nevada"; + public static final String NEW_HAMPSHIRE = "New Hampshire"; + public static final String NEW_JERSEY = "New Jersey"; + public static final String NEW_MEXICO = "New Mexico"; + public static final String NEW_YORK = "New York"; + public static final String NORTH_CAROLINA = "North Carolina"; + public static final String NORTH_DAKOTA = "North Dakota"; + public static final String OHIO = "Ohio"; + public static final String OKLAHOMA = "Oklahoma"; + public static final String OREGON = "Oregon"; + public static final String PENNSYLVANIA = "Pennsylvania"; + public static final String RHODE_ISLAND = "Rhode Island"; + public static final String SOUTH_CAROLINA = "South Carolina"; + public static final String SOUTH_DAKOTA = "South Dakota"; + public static final String TENNESSEE = "Tennessee"; + public static final String TEXAS = "Texas"; + public static final String UTAH = "Utah"; + public static final String VERMONT = "Vermont"; + public static final String VIRGINIA = "Virginia"; + public static final String WASHINGTON = "Washington"; + public static final String WEST_VIRGINIA = "West Virginia"; + public static final String WISCONSIN = "Wisconsin"; + public static final String WYOMING = "Wyoming"; + private static HashMap map = new HashMap(); + private static HashMap map2 = new HashMap(); + static + { + map.put(ALABAMA, "AL"); + map.put(ALASKA, "AK"); + map.put(ARIZONA, "AZ"); + map.put(ARKANSAS, "AR"); + map.put(CALIFORNIA, "CA"); + map.put(COLORADO, "CO"); + map.put(CONNECTICUT, "CT"); + map.put(DELAWARE, "DE"); + map.put(DISTRICT_OF_COLUMBIA, "DC"); + map.put(FLORIDA, "FL"); + map.put(GEORGIA, "GA"); + map.put(HAWAII, "HI"); + map.put(IDAHO, "ID"); + map.put(ILLINOIS, "IL"); + map.put(INDIANA, "IN"); + map.put(IOWA, "IA"); + map.put(KANSAS, "KS"); + map.put(KENTUCKY, "KT"); + map.put(LOUISIANA, "LA"); + map.put(MAINE, "ME"); + map.put(MARYLAND, "MD"); + map.put(MASSACHUSETTS, "MA"); + map.put(MICHIGAN, "MI"); + map.put(MINNESOTA, "MN"); + map.put(MISSISSIPPI, "MS"); + map.put(MISSOURI, "MO"); + map.put(MONTANA, "MT"); + map.put(NEBRASKA, "NE"); + map.put(NEVADA, "NV"); + map.put(NEW_HAMPSHIRE, "NH"); + map.put(NEW_JERSEY, "NJ"); + map.put(NEW_MEXICO, "NM"); + map.put(NEW_YORK, "NY"); + map.put(NORTH_CAROLINA, "NC"); + map.put(NORTH_DAKOTA, "ND"); + map.put(OHIO, "OH"); + map.put(OKLAHOMA, "OK"); + map.put(OREGON, "OR"); + map.put(PENNSYLVANIA, "PA"); + map.put(RHODE_ISLAND, "RI"); + map.put(SOUTH_CAROLINA, "SC"); + map.put(SOUTH_DAKOTA, "SD"); + map.put(TENNESSEE, "TN"); + map.put(TEXAS, "TX"); + map.put(UTAH, "UT"); + map.put(VERMONT, "VT"); + map.put(VIRGINIA, "VA"); + map.put(WASHINGTON, "WA"); + map.put(WEST_VIRGINIA, "WV"); + map.put(WISCONSIN, "WI"); + map.put(WYOMING, "WY"); + map2.put("AL", ALABAMA); + map2.put("AK", ALASKA); + map2.put("AZ", ARIZONA); + map2.put("AR", ARKANSAS); + map2.put("CA", CALIFORNIA); + map2.put("CO", COLORADO); + map2.put("CT", CONNECTICUT); + map2.put("DE", DELAWARE); + map2.put("DC", DISTRICT_OF_COLUMBIA); + map2.put("FL", FLORIDA); + map2.put("GA", GEORGIA); + map2.put("HI", HAWAII); + map2.put("ID", IDAHO); + map2.put("IL", ILLINOIS); + map2.put("IN", INDIANA); + map2.put("IA", IOWA); + map2.put("KS", KANSAS); + map2.put("KT", KENTUCKY); + map2.put("LA", LOUISIANA); + map2.put("ME", MAINE); + map2.put("MD", MARYLAND); + map2.put("MA", MASSACHUSETTS); + map2.put("MI", MICHIGAN); + map2.put("MN", MINNESOTA); + map2.put("MS", MISSISSIPPI); + map2.put("MO", MISSOURI); + map2.put("MT", MONTANA); + map2.put("NE", NEBRASKA); + map2.put("NV", NEVADA); + map2.put("NH", NEW_HAMPSHIRE); + map2.put("NJ", NEW_JERSEY); + map2.put("NM", NEW_MEXICO); + map2.put("NY", NEW_YORK); + map2.put("NC", NORTH_CAROLINA); + map2.put("ND", NORTH_DAKOTA); + map2.put("OH", OHIO); + map2.put("OK", OKLAHOMA); + map2.put("OR", OREGON); + map2.put("PA", PENNSYLVANIA); + map2.put("RI", RHODE_ISLAND); + map2.put("SC", SOUTH_CAROLINA); + map2.put("SD", SOUTH_DAKOTA); + map2.put("TN", TENNESSEE); + map2.put("TX", TEXAS); + map2.put("UT", UTAH); + map2.put("VT", VERMONT); + map2.put("VA", VIRGINIA); + map2.put("WA", WASHINGTON); + map2.put("WV", WEST_VIRGINIA); + map2.put("WI", WISCONSIN); + map2.put("WY", WYOMING); + } + public static String getPostalCodeByStateName(String state) + { + return (String) map.get(state); + } + public static String getStateNameByPostalCode(String code) + { + return (String) map2.get(code); + } +} diff --git a/src/main/java/com/spun/util/StringIdentifierGenerator.java b/src/main/java/com/spun/util/StringIdentifierGenerator.java new file mode 100644 index 0000000..72ff239 --- /dev/null +++ b/src/main/java/com/spun/util/StringIdentifierGenerator.java @@ -0,0 +1,41 @@ +package com.spun.util; + +import java.util.Random; + +public class StringIdentifierGenerator +{ + private static final long MAX_RANDOM_LEN = 2176782336L; // 36 ** 6 + private static final long MAX_TIME_SECTION_LEN = 46656L; // 36 ** 3 + private static final long TIC_DIFFERENCE = 2000; + private static final int RANDOM_LENGTH = 6; + private static final int TIME_LENGTH = 3; + private static int counter = 0; + private static long lastTimeValue = 0; + private static Random randomizer = new Random(); + public static synchronized String nextIdentifier() + { + long currentRandom = randomizer.nextLong(); + if (currentRandom < 0) + { + currentRandom = -currentRandom; + } + currentRandom %= MAX_RANDOM_LEN; + currentRandom += MAX_RANDOM_LEN; + long currentTimeValue = 0; + int currentCount = 0; + currentTimeValue = (System.currentTimeMillis() / TIC_DIFFERENCE); + currentTimeValue %= MAX_TIME_SECTION_LEN; + currentTimeValue += MAX_TIME_SECTION_LEN; + if (lastTimeValue != currentTimeValue) + { + lastTimeValue = currentTimeValue; + counter = 0; + } + currentCount = counter++; + StringBuffer id = new StringBuffer(15); + id.append(Long.toString(currentRandom, 36).substring(1)); + id.append(Long.toString(currentTimeValue, 36).substring(1)); + id.append(Long.toString(currentCount, 36)); + return id.toString(); + } +} diff --git a/src/main/java/com/spun/util/StringUtils.java b/src/main/java/com/spun/util/StringUtils.java new file mode 100644 index 0000000..36b609b --- /dev/null +++ b/src/main/java/com/spun/util/StringUtils.java @@ -0,0 +1,586 @@ +package com.spun.util; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.lang.reflect.Field; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.Vector; + +import org.lambda.functions.implementations.F1; +import org.lambda.query.Query; + +/** + * A static class of convenience functions for database access + **/ +public class StringUtils +{ + public static final String NEW_LINE = System.getProperty("line.separator"); + /***********************************************************************/ + public static String toURLEncode(String input) + { + try + { + return input == null ? null : java.net.URLEncoder.encode(input, "UTF-8"); + } + catch (UnsupportedEncodingException e) + { + throw ObjectUtils.throwAsError(e); + } + } + /***********************************************************************/ + public static String loadNullableString(String i) + { + return StringUtils.isNonZero(i) ? i.trim() : null; + } + /***********************************************************************/ + /** + * Decode a URLEncoded input String. + *

+ * + * If input is null, URLEncode() will + * return null. + * + * @see java.net.URLDecoder + */ + public static String URLDecode(String input) + { + try + { + return input == null ? null : java.net.URLDecoder.decode(input, "UTF-8"); + } + catch (Exception e) + { + return null; + } + } + /************************************************************************/ + public static String[] split(String string, String splitOn) + { + return split(string, splitOn, true); + } + /************************************************************************/ + public static String[] split(String string, String splitOn, boolean trim) + { + if ((string == null) || (splitOn == null) || (splitOn.length() < 1)) { return null; } + Vector temp = new Vector(); + int length = splitOn.length(); + int start = 0; + int next = 0; + while (next != -1) + { + String word = null; + next = string.indexOf(splitOn, start); + if (next == -1) + { + word = string.substring(start); + } + else + { + word = string.substring(start, next); + start = next + length; + } + temp.add(trim ? word.trim() : word); + } + return toArray(temp); + } + /************************************************************************/ + public static String replace(String string, String find, String replace) + { + if ((string == null) || (find == null) || (replace == null)) { throw new NullPointerException(String.format( + "[string,find,replace] = [%s,%s,%s]", string, find, replace)); } + String parts[] = split(string, find, false); + if (parts.length == 1) { return string; } + String result = ""; + for (int i = 0; i < parts.length; i++) + { + result += parts[i] + replace; + } + return result.substring(0, result.length() - replace.length()); + } + /***********************************************************************/ + public static String stripWhiteSpace(String text) + { + return stripWhiteSpace(text, false); + } + /***********************************************************************/ + public static String padNumber(long number, int digits) + { + String text = "" + number; + while (text.length() < digits) + { + text = "0" + text; + } + return text; + } + /***********************************************************************/ + public static String padNumber(int number, int digits) + { + return padNumber((long) number, digits); + } + /***********************************************************************/ + public static String stripWhiteSpace(String text, boolean all) + { + StringBuffer newText = new StringBuffer(); + boolean whitespace = false; + int num = text.length(); + char whiteSpaceChar = ' '; + boolean atStart = true; + for (int i = 0; i < num; i++) + { + char c = text.charAt(i); + switch (c) + { + case '\r' : + case '\n' : + whiteSpaceChar = '\n'; + whitespace = true; + break; + case '\t' : + case ' ' : + whitespace = true; + break; + default : + if (whitespace && atStart) + { + whitespace = false; + } + if (whitespace) + { + whitespace = false; + newText.append(all ? '_' : whiteSpaceChar); + whiteSpaceChar = ' '; + } + atStart = false; + newText.append(c); + break; + } + } + return newText.toString(); + } + /************************************************************************/ + /** + * Turns "mr. frank m Peter" into "Mr. Frank M Peter" + **/ + public static String toNameUpperCase(String name) + { + if (name == null) { return null; } + StringBuffer returning = new StringBuffer(name.length()); + String upper = name.toUpperCase(); + int place = 0; + while (place < name.length()) + { + char letter = name.charAt(place); + if (letter == ' ') + { + returning.append(' '); + if ((place + 1) < name.length()) + { + returning.append(upper.charAt(++place)); + } + } + else if ((place == 0)) + { + returning.append(upper.charAt(0)); + } + else + { + returning.append(letter); + } + place++; + } + return returning.toString(); + } + /************************************************************************/ + public static String toConvertCamelCaseString(String varName, String insertBeforeCaps) + { + StringBuffer staticVarName = new StringBuffer(); + for (int i = 0; i < varName.length(); i++) + { + char letter = varName.charAt(i); + if ((i > 0) && (letter == Character.toUpperCase(letter)) && Character.isLetter(letter)) + { + staticVarName.append(insertBeforeCaps); + } + staticVarName.append(letter); + } + return staticVarName.toString(); + } + /************************************************************************/ + /** + * Turns "ATTRIUBE_NAME" into "AttributeName" + **/ + public static String toMethodNameCase(String name) + { + StringBuffer returning = new StringBuffer(name.length()); + String upper = name.toUpperCase(); + String lower = name.toLowerCase(); + int place = 0; + while (place < name.length()) + { + char letter = lower.charAt(place); + if (letter == ' ' || letter == '_') + { + if ((place + 1) < name.length()) + { + returning.append(upper.charAt(++place)); + } + } + else if ((place == 0)) + { + returning.append(upper.charAt(0)); + } + else + { + returning.append(letter); + } + place++; + } + return returning.toString(); + } + /************************************************************************/ + public static String stripNonNumeric(String number) + { + return stripNonNumeric(number, false, false); + } + /************************************************************************/ + public static String stripCharacters(String dirtyString, String toStrip) + { + StringBuffer cleanStringBuffer = new StringBuffer(); + for (int i = 0; i < dirtyString.length(); i++) + { + char currentChar = dirtyString.charAt(i); + if (toStrip.indexOf(currentChar) == -1) + { + cleanStringBuffer.append(currentChar); + } + } + return cleanStringBuffer.toString(); + } + public static String escapeForXml(String string) + { + return string.replaceAll("&", "&"); + } + /************************************************************************/ + public static String stripNonNumeric(String number, boolean allowDecimal, boolean allowNegative) + { + boolean allowExponential = allowDecimal; + boolean afterE = false; + if (number == null) { return ""; } + StringBuffer result = new StringBuffer(); + for (int i = 0; i < number.length(); i++) + { + char c = number.charAt(i); + switch (c) + { + case '0' : + case '1' : + case '2' : + case '3' : + case '4' : + case '5' : + case '6' : + case '7' : + case '8' : + case '9' : + result.append(c); + afterE = false; + break; + case '-' : + if (allowNegative || afterE) + { + result.append(c); + allowNegative = false; + } + break; + case '.' : + if (allowDecimal) + { + result.append(c); + allowDecimal = false; + } + afterE = false; + break; + case 'e' : + case 'E' : + if (allowExponential) + { + result.append(c); + allowExponential = false; + } + afterE = true; + break; + default : + break; + } + } + return result.toString(); + } + /***********************************************************************/ + /** + * A convenience function to check that a String has at least 1 character. + * + * @param string + * The string in question + * @return true if Non Zero. + **/ + public static boolean isNonZero(String string) + { + return ((string != null) && string.trim().length() > 0); + } + /***********************************************************************/ + public static boolean isEmpty(String string) + { + return !isNonZero(string); + } + /************************************************************************/ + /** + * A convenience function to turn a vector of String objects into an Array + * of the String objects. + * + * @param vectorOf + * a Vector of String objects + * @return the array of String. + * @throws Error + * if an element of vectorOf is not a String object. + **/ + public static String[] toArray(java.util.Collection vectorOf) + { + if (vectorOf == null) { return new String[0]; } + String array[] = new String[vectorOf.size()]; + java.util.Iterator iterator = vectorOf.iterator(); + int i = 0; + while (iterator.hasNext()) + { + java.lang.Object rowObject = iterator.next(); + if (rowObject instanceof String) + { + array[i++] = (String) rowObject; + } + else + { + throw new Error("toArray[" + i + "] is not an instance of String but a " + + ObjectUtils.getClassName(rowObject)); + } + } + return array; + } + /***********************************************************************/ + public static int resolveEnumeration(String value, String[] enumeration) + { + return resolveEnumeration(value, enumeration, false); + } + /***********************************************************************/ + public static int resolveEnumeration(String value, String[] enumeration, boolean force) + { + for (int i = 0; i < enumeration.length; i++) + { + if (enumeration[i].equals(value)) { return i; } + } + if (force) { throw new Error("Enumeration '" + value + "' not in " + Arrays.asList(enumeration).toString()); } + return -1; + } + /***********************************************************************/ + public static String truncate(String string, int maxLength) + { + if (string == null) { return null; } + return (string.length() <= maxLength) ? string : string.substring(0, maxLength); + } + /***********************************************************************/ + public static boolean hasNumeric(String teamId) + { + return isNonZero(stripNonNumeric(teamId, false, false)); + } + /***********************************************************************/ + public static String toHTMLEncode(String string) + { + if (string == null) { return null; } + string = string.replaceAll("<", "<"); + string = string.replaceAll("\n", "
"); + return string; + } + /***********************************************************************/ + public static String toJavaScriptEncode(String string) + { + if (string == null) { return "null"; } + string = string.replaceAll("\"", "\\\\\""); + string = string.replaceAll("\r", "\\\\r"); + string = string.replaceAll("\n", "\\\\n"); + return "\"" + string + "\""; + } + /***********************************************************************/ + public static boolean isIn(String target, String... fromList) + { + return Arrays.asList(fromList).contains(target); + } + /***********************************************************************/ + public static boolean isIn(String target, String[] fromList, boolean allowNulls) + { + return (target == null && allowNulls) ? true : isIn(target, fromList); + } + /************************************************************************/ + public static void assertIn(String target, String[] fromList, boolean allowNulls) + { + boolean valid = isIn(target, fromList, allowNulls); + if (!valid) { throw new IllegalArgumentException("The value '" + target + "' not in " + + Arrays.asList(fromList)); } + } + public static void assertIn(String target, boolean allowNulls, String... options) + { + assertIn(target, options, allowNulls); + } + /***********************************************************************/ + public static String convertEnumeration(final Object forValue, Class clazz) throws Exception + { + F1 f1 = new F1(null, forValue) + { + { + ret(ClassUtils.IsPublicStatic(a) && a.get(null).equals(forValue)); + } + }; + List fields = Query.where(clazz.getFields(), f1); + if (fields.isEmpty()) + { + return "unknown Type " + forValue; + } + else + { + return fields.get(0).getName(); + } + } + /************************************************************************/ + /** + * 'Tom S Hardy' -> 'Tom S' - 'Hardy' + **/ + public static String[] splitName(String fullName) + { + String names[] = {null, null}; + int split = fullName.lastIndexOf(' '); + if (split != -1) + { + names[0] = fullName.substring(0, split); + names[1] = fullName.substring(split); + } + else + { + names[1] = fullName; + } + return names; + } + /***********************************************************************/ + public static Properties createProperties(String[] properties) + { + Properties props = new Properties(); + if (properties == null) { return props; } + if (properties.length % 2 != 0) { throw new Error("number of strings must be even. found [" + + properties.length + "] = " + Arrays.asList(properties)); } + for (int i = 0; i < properties.length; i += 2) + { + if (properties[i + 1] != null) + { + props.setProperty(properties[i], properties[i + 1]); + } + else + { + props.setProperty(properties[i], ""); + } + } + return props; + } + /***********************************************************************/ + public static String toString(String name, T[] array) + { + StringBuffer buffer = new StringBuffer(); + name = (name == null ? "array" : name); + if (array == null || array.length == 0) + { + buffer.append(name + ".length = 0"); + } + else + { + int maxPadding = ("" + array.length).length(); + for (int i = 0; i < array.length; i++) + { + buffer.append(name + "[" + padNumber(i, maxPadding) + "] = " + array[i] + "\r\n"); + } + } + return buffer.toString(); + } + /***********************************************************************/ + public static String toString(String name, Iterable array) + { + StringBuffer buffer = new StringBuffer(); + name = (name == null ? "array" : name); + if (array != null) + { + int count = 0; + for (T t : array) + { + buffer.append(name + "[" + count + "] = " + arrayStringHelper(t) + "\r\n"); + count++; + } + } + if (buffer.length() == 0) + { + buffer.append(name + ".length = 0"); + } + return buffer.toString(); + } + public static String arrayStringHelper(Object o) + { + if (o == null) { return "null"; } + return o.getClass().isArray() ? Arrays.toString((Object[]) o) : o.toString(); + } + /***********************************************************************/ + public static String getFirstName(String fullName) + { + return splitName(fullName)[0]; + } + /***********************************************************************/ + public static String getLastName(String fullName) + { + return splitName(fullName)[1]; + } + /************************************************************************/ + public static boolean isLengthWithin(String string, int length) + { + return string == null || string.length() <= length; + } + /************************************************************************/ + public static boolean equalsIgnoreCase(String one, String two) + { + return (one == two || (one != null && one.equalsIgnoreCase(two))); + } + /***********************************************************************/ + public static StringBuffer trim(StringBuffer buffer, int i) + { + if (buffer == null || buffer.length() < i) { return buffer; } + buffer.setLength(buffer.length() - i); + return buffer; + } + /***********************************************************************/ + public static String join(String first, String joinBy, String second) + { + return isEmpty(second) ? first : first + joinBy + second; + } + /***********************************************************************/ + /***********************************************************************/ + public static InputStream convertToInputStream(String string) + { + return new ByteArrayInputStream(string.getBytes()); + } + public static String toString(Map map) + { + StringBuffer b = new StringBuffer(); + Object keySet[] = map.keySet().toArray(); + Arrays.sort(keySet); + for (Object key : keySet) + { + b.append(String.format("%s : %s \r\n", key, map.get(key))); + } + return b.toString(); + } +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/SystemUtils.java b/src/main/java/com/spun/util/SystemUtils.java new file mode 100644 index 0000000..400e39f --- /dev/null +++ b/src/main/java/com/spun/util/SystemUtils.java @@ -0,0 +1,30 @@ +package com.spun.util; + +import java.io.File; + +public class SystemUtils +{ + public static boolean isWindowsEnviroment() + { + return "\\".equals(File.separator); + } + public static String convertFileForCommandLine(String fileName) + { + return convertFileForCommandLine(fileName, SystemUtils.isWindowsEnviroment()); + } + public static String convertFileForCommandLine(String fileName, boolean windowsOs) + { + if (!fileName.contains(" ")) + { + return fileName; + } + else if (windowsOs) + { + return String.format("\"%s\"", fileName); + } + else + { + return fileName.replace(" ", "\\ "); + } + } +} diff --git a/src/main/java/com/spun/util/TestUtils.java b/src/main/java/com/spun/util/TestUtils.java new file mode 100644 index 0000000..bbe7ee3 --- /dev/null +++ b/src/main/java/com/spun/util/TestUtils.java @@ -0,0 +1,275 @@ +package com.spun.util; + +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.lang.reflect.Method; +import java.util.Arrays; +import java.util.List; +import java.util.Random; + +import javax.mail.Message; +import javax.swing.JFileChooser; +import javax.swing.JFrame; + +import junit.framework.TestCase; + +import com.spun.util.ClassUtils; +import com.spun.util.ObjectUtils; +import com.spun.util.ArrayUtils; +import com.spun.util.WindowUtils; +//import com.spun.util.images.ImageWriter; +import com.spun.util.io.FileUtils; +import com.spun.util.io.StackElementLevelSelector; +import com.spun.util.io.StackElementSelector; + +public class TestUtils +{ + private static Random random; + public static final String INTERNET_EXPLORER = "\"C:\\Program Files\\Internet Explorer\\iexplore.exe\" "; + /***********************************************************************/ + public static File getFile(String startingDir) + { + JFrame frame = new JFrame(); + WindowUtils.testFrame(frame, false); + JFileChooser chooser = new JFileChooser(); + chooser.setCurrentDirectory(new File(startingDir)); + int returnVal = chooser.showOpenDialog(frame); + File returning = null; + if (returnVal == JFileChooser.APPROVE_OPTION) + { + returning = chooser.getSelectedFile(); + } + frame.dispose(); + return returning; + } + /***********************************************************************/ + public static void displayXml(String htmlOutput) + { + try + { + displayHtml(null, ".xml", htmlOutput, 3); + } + catch (Exception e) + { + throw ObjectUtils.throwAsError(e); + } + } + /***********************************************************************/ + public static String getRandomString() + { + if (random == null) + { + random = new Random(); + } + return Long.toString(Math.abs(random.nextLong()), 36); + } + /***********************************************************************/ + public static void displayHtml(String htmlOutput) throws FileNotFoundException, IOException, + InterruptedException + { + displayHtml(null, ".html", htmlOutput, 3); + } + /***********************************************************************/ + public static void displayHtmlFile(String fileName) throws IOException + { + displayFile(fileName); + } + public static void displayHtmlFile(File file) throws IOException + { + if (!file.exists()) { return; } + displayHtmlFile(file.getAbsolutePath()); + } + /***********************************************************************/ + public static void displayHtml(String outputFile, String htmlOutput) throws FileNotFoundException, IOException, + InterruptedException + { + displayHtml(outputFile, ".html", htmlOutput, 15); + } + /***********************************************************************/ + public static void displayHtml(String outputFile, String fileExtention, String htmlOutput, int secondsTimeout) + throws FileNotFoundException, IOException, InterruptedException + { + File file = (outputFile == null) ? File.createTempFile("temp", fileExtention) : new File(outputFile); + FileUtils.writeFile(file, htmlOutput); + displayHtmlFile(file); + Thread.sleep(secondsTimeout * 1000); + if (outputFile == null) + { + file.deleteOnExit(); + } + } + /***********************************************************************/ + public static void displayText(String output) throws IOException, InterruptedException + { + displayHtml(null, ".txt", output, 3); + } + /***********************************************************************/ + public static void displayExcel(String output) throws IOException, InterruptedException + { + displayHtml(null, ".csv", output, 3); + // Runtime.getRuntime().exec("notepad.exe " + outputFile); + } + /***********************************************************************/ + public static void assertForEach(String comment, Object[] objects, String method, Object expectedResult) + { + if (objects == null || objects.length == 0) { return; } + try + { + Method m = objects[0].getClass().getMethod(method, (Class[]) null); + for (int i = 0; i < objects.length; i++) + { + Object v = m.invoke(objects[i], (Object[]) null); + TestCase.assertEquals(comment + " - FOR - [" + i + "]", expectedResult, v); + } + } + catch (Throwable t) + { + throw ObjectUtils.throwAsError(t); + } + } + /***********************************************************************/ + public static void assertEqualForMethods(String title, Object expectedResult, Object testResult, + String[] matchingMethods) + { + try + { + Method[] m1 = ObjectUtils.getMethodsForObject(expectedResult, matchingMethods); + Method[] m2 = ObjectUtils.getMethodsForObject(testResult, matchingMethods); + for (int i = 0; i < m1.length; i++) + { + Object v1 = m1[i].invoke(expectedResult, (Object[]) null); + Object v2 = m2[i].invoke(testResult, (Object[]) null); + TestCase.assertEquals(title + " - FOR - " + matchingMethods[i], v1, v2); + } + } + catch (Throwable t) + { + throw ObjectUtils.throwAsError(t); + } + } + /***********************************************************************/ + public static void displayEmail(Message email) + { + if (email == null) { return; } + try + { + File f = File.createTempFile("email", ".eml"); + f.deleteOnExit(); + FileOutputStream out = new FileOutputStream(f); + email.writeTo(out); + out.close(); + displayFile(f.getAbsolutePath()); + } + catch (Exception e) + { + throw ObjectUtils.throwAsError(e); + } + } + /***********************************************************************/ + public static void displayFile(String fileName) + { + String cmd = ""; + if (File.separatorChar == '\\') + { + cmd = "cmd /C start \"Needed Title\" \"%s\" /B"; + } + else + { + cmd = "open %s"; + } + try + { + cmd = String.format(cmd, fileName); + Runtime.getRuntime().exec(cmd); + Thread.sleep(2000); + } + catch (Exception e) + { + throw ObjectUtils.throwAsError(e); + } + } + /***********************************************************************/ + public static double getTimerMultiplier() throws InterruptedException + { + long start = System.currentTimeMillis(); + Thread.sleep(500); + long end = System.currentTimeMillis(); + return (end - start) / 500.00; + } + /***********************************************************************/ + public static void assertLength(int length, Object[] array) + { + if (length != array.length) + { + TestCase.fail(String.format("Array.length %s != %s \n %s", length, array.length, Arrays.asList(array))); + } + } + /***********************************************************************/ + public static void assertLength(int length, List list) + { + if (length != list.size()) + { + TestCase.fail(String.format("Array.length %s != %s \n %s", length, list.size(), list)); + } + } + /***********************************************************************/ + public static void displayImage(BufferedImage image) throws Exception + { + File f = File.createTempFile("temp", ".gif"); + //ImageWriter.writeImage(image, new FileOutputStream(f), ImageWriter.Encoding.GIF); + Runtime.getRuntime().exec("C:\\PROGRA~1\\MOZILL~1\\FIREFOX.EXE " + f.getAbsolutePath()); + } + /***********************************************************************/ + /***********************************************************************/ + public static void assertContains(String expecting, String[] in) + { + if (!ArrayUtils.contains(in, expecting)) + { + TestCase.fail(String.format("Didn't find '%s' in %s", expecting, Arrays.asList(in))); + } + } + public static void assertEqualArray(Object[] expected, Object[] actual) + { + boolean passed = (expected.length == actual.length); + if (passed) + { + for (int i = 0; i < actual.length; i++) + { + passed &= expected[i].equals(actual[i]); + } + } + if (!passed) + { + TestCase.fail(String.format("Arrays didn't Match \n[expected] = %s\n[actual]=%s", Arrays.asList(expected), + Arrays.asList(actual))); + } + } + public static StackTraceReflectionResult getCurrentFileForMethod(int ignoreLevels) + { + return getCurrentFileForMethod(new StackElementLevelSelector(ignoreLevels + 1)); + } + public static StackTraceReflectionResult getCurrentFileForMethod(StackElementSelector stackElementSelector) + throws Error + { + try + { + StackTraceElement trace[] = new Error().getStackTrace(); + StackTraceElement element = stackElementSelector.selectElement(trace); + return getInfo(element); + } + catch (Throwable t) + { + throw ObjectUtils.throwAsError(t); + } + } + private static StackTraceReflectionResult getInfo(StackTraceElement element) throws ClassNotFoundException + { + String fullClassName = element.getClassName(); + String className = fullClassName.substring(fullClassName.lastIndexOf(".") + 1); + File dir = ClassUtils.getSourceDirectory(Class.forName(fullClassName)); + return new StackTraceReflectionResult(dir, className, element.getMethodName()); + } +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/ThreadLauncher.java b/src/main/java/com/spun/util/ThreadLauncher.java new file mode 100644 index 0000000..50f13e3 --- /dev/null +++ b/src/main/java/com/spun/util/ThreadLauncher.java @@ -0,0 +1,86 @@ +package com.spun.util; + +import java.lang.reflect.Method; + +import org.lambda.actions.Action0; + +public class ThreadLauncher implements Runnable +{ + private Object object = null; + private Object[] objectParams = null; + private Method method = null; + private long delay; + /***********************************************************************/ + public ThreadLauncher(Object object, Method method, Object[] objectParams, long delay) + { + this.delay = delay; + this.object = object; + this.method = method; + this.objectParams = objectParams; + new Thread(this).start(); + } + /***********************************************************************/ + public ThreadLauncher(Object object, Method method, Object[] objectParams) + { + this(object, method, objectParams, 0); + } + /***********************************************************************/ + public ThreadLauncher(Class clazz, String methodName, long delay) throws SecurityException, + NoSuchMethodException + { + this(null, clazz.getMethod(methodName, (Class[]) null), null, delay); + } + /***********************************************************************/ + public ThreadLauncher(Class clazz, String methodName) throws SecurityException, NoSuchMethodException + { + this(null, clazz.getMethod(methodName, (Class[]) null), null, 0); + } + /***********************************************************************/ + public ThreadLauncher(Object object, String methodName, long delay) throws SecurityException, + NoSuchMethodException + { + this(object, object.getClass().getMethod(methodName, (Class[]) null), null, delay); + } + /***********************************************************************/ + public ThreadLauncher(Object object, String methodName) throws SecurityException, NoSuchMethodException + { + this(object, object.getClass().getMethod(methodName, (Class[]) null), null, 0); + } + /***********************************************************************/ + public ThreadLauncher(Object object, String methodName, Object[] objectParams, long delay) + throws SecurityException, NoSuchMethodException + { + this(object, MethodExecutionPath.Parameters.getBestFitMethod(object.getClass(), methodName, + getClassArray(objectParams)), objectParams, delay); + } + /***********************************************************************/ + private static Class[] getClassArray(Object[] objectParams) + { + Class[] classes = new Class[objectParams.length]; + for (int i = 0; i < objectParams.length; i++) + { + classes[i] = objectParams[i].getClass(); + } + return classes; + } + /***********************************************************************/ + public void run() + { + try + { + Thread.sleep(delay); + //My_System.event("Running " + method.getName()); + method.invoke(object, objectParams); + } + catch (Throwable t) + { + MySystem.warning("Caught throwable exception ", t); + } + } + /***********************************************************************/ + /***********************************************************************/ + public static void launch(Action0 action) + { + new LambdaThreadLauncher(action); + } +} diff --git a/src/main/java/com/spun/util/ThreadUtils.java b/src/main/java/com/spun/util/ThreadUtils.java new file mode 100644 index 0000000..1792bdb --- /dev/null +++ b/src/main/java/com/spun/util/ThreadUtils.java @@ -0,0 +1,16 @@ +package com.spun.util; + +public class ThreadUtils +{ + public static void sleep(long millis) + { + try + { + Thread.sleep(millis); + } + catch (Exception e) + { + // ignore + } + } +} diff --git a/src/main/java/com/spun/util/Threads.java b/src/main/java/com/spun/util/Threads.java new file mode 100644 index 0000000..89b795c --- /dev/null +++ b/src/main/java/com/spun/util/Threads.java @@ -0,0 +1,23 @@ +package com.spun.util; + +public class Threads +{ + private int threadCount = 0; + /************************************************************************/ + public Threads() + { + ThreadGroup place = Thread.currentThread().getThreadGroup(); + while (place.getParent() != null) + { + place = place.getParent(); + } + threadCount = place.activeCount(); + } + /************************************************************************/ + public int getThreadCount() + { + return threadCount; + } + /***********************************************************************/ + /***********************************************************************/ +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/TimedObject.java b/src/main/java/com/spun/util/TimedObject.java new file mode 100644 index 0000000..896bef4 --- /dev/null +++ b/src/main/java/com/spun/util/TimedObject.java @@ -0,0 +1,71 @@ +package com.spun.util; + + +public class TimedObject +{ + private Object object = null; + private long timeOutInMillis = 1000; + private long lastTimeAccessed = 0; + /***********************************************************************/ + + public TimedObject(long timeOutInMillis) + { + this.timeOutInMillis = timeOutInMillis; + } + /***********************************************************************/ + + public Object get() + { + touched(); + return object; + } + /***********************************************************************/ + + private synchronized void touched() + { + try + { + boolean launch = (lastTimeAccessed == 0); + this.lastTimeAccessed = System.currentTimeMillis(); + if (launch) + { + new ThreadLauncher(this, "clean"); + } + } + catch (Throwable t) + { + MySystem.warning(t); + } + } + /***********************************************************************/ + public void clean() + { + try + { + while (System.currentTimeMillis() < (lastTimeAccessed + timeOutInMillis)) + { + long diff = (lastTimeAccessed + timeOutInMillis) - System.currentTimeMillis(); + Thread.sleep(diff); + } + } + catch (Throwable t) + { + MySystem.warning(t); + } + synchronized (this) + { + this.object = null; + this.lastTimeAccessed = 0; + } + } + /***********************************************************************/ + + public void set(Object object) + { + touched(); + this.object = object; + } + /***********************************************************************/ + /***********************************************************************/ + +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/Tuple.java b/src/main/java/com/spun/util/Tuple.java new file mode 100644 index 0000000..43aeef1 --- /dev/null +++ b/src/main/java/com/spun/util/Tuple.java @@ -0,0 +1,25 @@ +package com.spun.util; + +public class Tuple +{ + private final H first; + private final K second; + public Tuple(H first, K second) + { + this.first = first; + this.second = second; + } + public H getFirst() + { + return first; + } + public K getSecond() + { + return second; + } + @Override + public String toString() + { + return String.format("<%s,%s>", first, second); + } +} diff --git a/src/main/java/com/spun/util/WhiteSpaceStripper.java b/src/main/java/com/spun/util/WhiteSpaceStripper.java new file mode 100644 index 0000000..b3a8853 --- /dev/null +++ b/src/main/java/com/spun/util/WhiteSpaceStripper.java @@ -0,0 +1,201 @@ +package com.spun.util; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; + +public class WhiteSpaceStripper +{ + /***********************************************************************/ + public static void stripFolder(File dir) + { + stripFolder(dir, true); + } + /***********************************************************************/ + public static void stripFolder(File dir, boolean recursive) + { + if (!dir.isDirectory()) + { + MySystem.warning("File is not a Directory - " + dir.toString()); + return; + } + + File[] files = dir.listFiles(new WhiteSpaceFileFilter()); + for (int i = 0; i < files.length; i++) + { + if (files[i].isDirectory()) + { + MySystem.event("Scaning Directory -" + files[i].getName()); + if (recursive) stripFolder(files[i], recursive); + } + else + { + stripFile(files[i]); + } + } +// My_System.markerOut("WhiteSpaceStripper:stripFolder"); + } + /***********************************************************************/ + public static void stripFile(String file) + { + stripFile(new File(file)); + } + /***********************************************************************/ + public static void stripFile(File file) + { + + if (!file.isFile()) + { + MySystem.warning("File is not a File - " + file.toString()); + return; + } + if(!file.canWrite()) + { + MySystem.event("File '" + file.toString() + "' is readonly"); + return; + } + else + { + try + { + String contents = readFile(file); + String stripped = stripWhiteSpace(contents); + writeFile(file, stripped); + } + catch (IOException e) + { + MySystem.warning(e); + } + } + } + /***********************************************************************/ + public static String stripWhiteSpace(String text) + { + StringBuffer newText = new StringBuffer(); + boolean whitespace = false; + int num = text.length(); + char whiteSpaceChar = ' '; + for (int i = 0; i < num; i++) + { + char c = text.charAt(i); + switch (c) + { + case '\n' : whiteSpaceChar = '\n';whitespace = true;break; + case '\t' : + case ' ' : whitespace = true;break; + default : + if (whitespace) + { + whitespace = false; + newText.append(whiteSpaceChar); + whiteSpaceChar = ' '; + } + newText.append(c);break; + } + } + return newText.toString(); + } + /***********************************************************************/ + public static String stripBlankLines(String text) + { + StringBuffer newText = new StringBuffer(); + boolean inWhiteSpace = true; + int num = text.length(); + String saving = ""; + for (int i = 0; i < num; i++) + { + char c = text.charAt(i); + switch (c) + { + case '\r' : + case '\n' : if(!inWhiteSpace) + { + newText.append(saving); + } + inWhiteSpace = true; + if (!"\r".equals(saving)) + { + saving = ""; + } + break; + case '\t' : + case ' ' : break; // donothing; + default : inWhiteSpace = false;break; + } + saving += c; + } + if (!inWhiteSpace) + { + newText.append(saving); + } + return newText.toString(); + } + + /***********************************************************************/ + private static String readFile(File file) + throws IOException + { + BufferedReader reader = new BufferedReader(new FileReader(file)); + StringBuffer output = new StringBuffer(); + + while (reader.ready()) + { + output.append(reader.readLine()); + output.append("\n"); + } + + reader.close(); + return output.toString(); + } + /***********************************************************************/ + private static void writeFile(File file, String text) + throws IOException + { + FileWriter writer = new FileWriter(file); + + writer.write(text); + + writer.close(); + } + /***********************************************************************/ + public static void main (String [] args) + { +// stripFolder(new File("C:\\temp\\stockgazing")); + } + /***********************************************************************/ + /***********************************************************************/ +} + + +class WhiteSpaceFileFilter + implements java.io.FileFilter +{ + + /***********************************************************************/ + + public boolean accept(File pathname) + { + + if (pathname.getName().equals(".") || pathname.getName().equals(".")) + { + return false; + } + else if (pathname.getName().equalsIgnoreCase("email")) + { + return false; + } + else if(pathname.isDirectory() || (pathname.getName().indexOf(".htm") != -1) || (pathname.getName().indexOf(".txt") != -1)) + { + return true; + } + else + { + return false; + } + } + + /***********************************************************************/ + /***********************************************************************/ +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/WindowUtils.java b/src/main/java/com/spun/util/WindowUtils.java new file mode 100644 index 0000000..499e84e --- /dev/null +++ b/src/main/java/com/spun/util/WindowUtils.java @@ -0,0 +1,75 @@ +package com.spun.util; + +import java.awt.Dimension; +import java.awt.event.WindowAdapter; + +import javax.swing.JFrame; +import javax.swing.JOptionPane; +import javax.swing.JPanel; + +public class WindowUtils +{ + /***********************************************************************/ + public static void centerWindow(java.awt.Window window) + { + Dimension d = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); + Dimension w = window.getSize(); + int dx = (int) w.getWidth(); + int dy = (int) w.getHeight(); + int x = (int) ((d.getWidth() - dx) / 2); + int y = (int) ((d.getHeight() - dy) / 2); + MySystem.variable(" size (" + x + "," + y + "," + dx + "," + dy + ")"); + window.setBounds(x, y, dx, dy + 1); + } + /***********************************************************************/ + public static void testPanel(JPanel panel) + { + JFrame test = new JFrame("Testing Frame"); + test.getContentPane().add(panel); + testFrame(test, true); + } + /***********************************************************************/ + public static void testFrame(JFrame frame) + { + testFrame(frame, true); + } + /***********************************************************************/ + public static void copyToClipBoard(String code) + { + copyToClipBoard(code, true); + } + public static void copyToClipBoard(String code, boolean displayMessage) + { + java.awt.datatransfer.StringSelection selection = new java.awt.datatransfer.StringSelection(code); + java.awt.Frame frame = new java.awt.Frame(); + frame.getToolkit().getSystemClipboard().setContents(selection, selection); + if (displayMessage) + { + JOptionPane.showMessageDialog(null, "Code copied to Clipboard", "Finished", JOptionPane.INFORMATION_MESSAGE); + } + frame.dispose(); + } + /***********************************************************************/ + public static void testFrame(JFrame frame, boolean closeOnExit) + { + if (closeOnExit) + { + testFrame(frame, new FrameCloser()); + } + else + { + testFrame(frame); + } + } + /***********************************************************************/ + public static void testFrame(JFrame frame, WindowAdapter... array) + { + frame.pack(); + for (WindowAdapter closer : array) + { + frame.addWindowListener(closer); + } + WindowUtils.centerWindow(frame); + frame.setVisible(true); + } +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/database/AutomaticVariableSetter.java b/src/main/java/com/spun/util/database/AutomaticVariableSetter.java new file mode 100644 index 0000000..b4810e6 --- /dev/null +++ b/src/main/java/com/spun/util/database/AutomaticVariableSetter.java @@ -0,0 +1,18 @@ +package com.spun.util.database; + +import java.sql.SQLException; +import java.sql.Statement; + +public interface AutomaticVariableSetter +{ + public static final int INSERT = 0; + public static final int INSERT_COMPLETED = 1; + public static final int UPDATE = 2; + public static final int UPDATE_COMPLETED = 3; + public static final int LOAD = 4; + public static final String STAGES[] = {"insert", "insertCompleted", "update", "updateCompleted", "load"}; + /***********************************************************************/ + public void setFor(DatabaseObject forObject, int atStage, Statement stmt) throws SQLException; + /***********************************************************************/ + /***********************************************************************/ +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/database/CircularRedundancyError.java b/src/main/java/com/spun/util/database/CircularRedundancyError.java new file mode 100644 index 0000000..46b1d72 --- /dev/null +++ b/src/main/java/com/spun/util/database/CircularRedundancyError.java @@ -0,0 +1,36 @@ +package com.spun.util.database; + +import com.spun.util.ObjectUtils; + +public class CircularRedundancyError extends Error +{ + private DatabaseObject source; + private String causedBy; + private String xmlState; + public CircularRedundancyError(DatabaseObject source, String causedBy, String xmlState) + { + this.source = source; + this.causedBy = causedBy; + this.xmlState = xmlState; + } + public String getMessage() + { + return "Circular Redundancy occurred while saving :" + ObjectUtils.getClassName(source) + "\n" + + "cause by :" + causedBy + "\n" + + "state : " + xmlState; + } + public String getCausedBy() + { + return causedBy; + } + public DatabaseObject getSource() + { + return source; + } + public String getXmlState() + { + return xmlState; + } + + +} diff --git a/src/main/java/com/spun/util/database/ColumnMetadata.java b/src/main/java/com/spun/util/database/ColumnMetadata.java new file mode 100644 index 0000000..3dcd391 --- /dev/null +++ b/src/main/java/com/spun/util/database/ColumnMetadata.java @@ -0,0 +1,146 @@ +package com.spun.util.database; + +import com.spun.util.DatabaseUtils; + +public class ColumnMetadata +{ + private Metadata tableMetadata; + private String name; + private Class type; + private int length; + private boolean nullable; + private int sqlType; + private int decimalDigits; + private String comments; + private int columnPosition; + private String foreignTable; + private ColumnMetadata foreignColumn; + /**************************************************************************/ + public ColumnMetadata(Metadata tableMetadata, String name, Class type, int length, int columnPosition, boolean nullable, int sqlType, + int decimalDigits, String comments) + { + this(tableMetadata, name, type, length, columnPosition, nullable, sqlType, decimalDigits, comments, null, null); + } + /**************************************************************************/ + public ColumnMetadata(Metadata tableMetadata, String name, Class type, int length, int columnPosition, boolean nullable, int sqlType, + int decimalDigits, String comments, String foreignTable, ColumnMetadata foreignColumn) + { + this.columnPosition = columnPosition; + this.tableMetadata = tableMetadata; + this.name = name; + this.type = type; + this.length = length; + this.nullable = nullable; + this.sqlType = sqlType; + this.decimalDigits = decimalDigits; + this.comments = comments; + this.foreignTable = foreignTable; + this.foreignColumn = foreignColumn; + } + /***********************************************************************/ + public int getLength() + { + return length; + } + /***********************************************************************/ + public int getSqlType() + { + return sqlType; + } + /***********************************************************************/ + public String getSqlTypeName() + { + String name = DatabaseUtils.findDatabaseName(sqlType); + if (name == null) + name = "unknown: " + getType(); + else if (name == "decimal" || name.startsWith("numeric")) + { + name += "(" + length + ", " + decimalDigits + ")"; + } + else if (name == "varchar" || name == "char") + { + name += "(" + length + ")"; + } + return name; + } + /***********************************************************************/ + public int getColumnPosition() + { + return columnPosition; + } + /***********************************************************************/ + public String getName() + { + return name; + } + /***********************************************************************/ + public boolean isNullable() + { + return nullable; + } + /***********************************************************************/ + public Class getType() + { + return type; + } + /***********************************************************************/ + public int getDecimalDigits() + { + return decimalDigits; + } + /***********************************************************************/ + public String getComments() + { + return comments; + } + /***********************************************************************/ + public String getForeignTable() + { + return foreignTable; + } + /***********************************************************************/ + public ColumnMetadata getForeignColumn() + { + return foreignColumn; + } + /***********************************************************************/ + public String getNameWithPrefix(String alias) + { + return alias + "." + getName(); + } + /***********************************************************************/ + public String getSequenceName(int databaseType) + { + if (databaseType == DatabaseUtils.POSTGRESQL) { return String.format("%s_%s_seq", tableMetadata.getTableName(), this.getName()); } + return null; + } + /************************************************************************/ + /** + * A convenience function to turn a vector of com.spun.util.database.ColumnMetadata objects + * into an Array of the com.spun.util.database.ColumnMetadata objects. + * @param vectorOf a Vector of com.spun.util.database.ColumnMetadata objects + * @return the array of com.spun.util.database.ColumnMetadata. + * @throws Error if an element of vectorOf is not a com.spun.util.database.ColumnMetadata object. + **/ + public static com.spun.util.database.ColumnMetadata[] toArray(java.util.Collection vectorOf) + { + if (vectorOf == null) { return new com.spun.util.database.ColumnMetadata[0]; } + com.spun.util.database.ColumnMetadata array[] = new com.spun.util.database.ColumnMetadata[vectorOf.size()]; + java.util.Iterator iterator = vectorOf.iterator(); + int i = 0; + while (iterator.hasNext()) + { + java.lang.Object rowObject = iterator.next(); + if (rowObject instanceof com.spun.util.database.ColumnMetadata) + { + array[i++] = (com.spun.util.database.ColumnMetadata) rowObject; + } + else + { + throw new Error("toArray[" + i + "] is not an instance of com.spun.util.database.ColumnMetadata but a " + rowObject.getClass().getName()); + } + } + return array; + } + /***********************************************************************/ +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/database/DatabaseCache.java b/src/main/java/com/spun/util/database/DatabaseCache.java new file mode 100644 index 0000000..47cf7fd --- /dev/null +++ b/src/main/java/com/spun/util/database/DatabaseCache.java @@ -0,0 +1,40 @@ +package com.spun.util.database; + +import java.sql.SQLException; +import java.sql.Statement; + +public interface DatabaseCache +{ + /**************************************************************************/ + /** + * The type of object this cache holds. Caches should only hold 1 type of + * DatabaseObject + **/ + public Class getObjectType(); + + /**************************************************************************/ + /** + * The default LinkBack setting + **/ + public boolean isLinkBackOn(); + + /**************************************************************************/ + /** + * loads the cache from the database + **/ + public void load(Statement stmt) throws SQLException; + + /**************************************************************************/ + /** + * clears the cache and reloads it from the database + **/ + public void reset(Statement stmt) throws SQLException; + + /**************************************************************************/ + /** + * @return the object from the cache with the corresponding pkey + **/ + public T get(int pkey); + /**************************************************************************/ + /**************************************************************************/ +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/database/DatabaseLifeCycleUtils.java b/src/main/java/com/spun/util/database/DatabaseLifeCycleUtils.java new file mode 100644 index 0000000..899efa6 --- /dev/null +++ b/src/main/java/com/spun/util/database/DatabaseLifeCycleUtils.java @@ -0,0 +1,298 @@ +package com.spun.util.database; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.sql.SQLException; +import java.sql.Statement; + +import com.spun.util.DatabaseConfiguration; +import com.spun.util.DatabaseUtils; +import com.spun.util.MySystem; + +public class DatabaseLifeCycleUtils +{ + /***********************************************************************/ + public static void backupDatabase(Statement stmt, String databaseName, DatabaseConfiguration config, + String fileName) throws Exception + { + switch (config.type) + { + case DatabaseUtils.SQLSERVER2005 : + case DatabaseUtils.SQLSERVER2000 : + case DatabaseUtils.SQLSERVER : + backupSQLServer(stmt, databaseName, fileName); + break; + case DatabaseUtils.POSTGRESQL : + backupPostgreSQL(databaseName, config, fileName); + break; + case DatabaseUtils.MY_SQL : + backupMySQL(databaseName, fileName); + break; + default : + throw new Error("Unhandled database type: " + DatabaseUtils.getDatabaseType(config.type)); + } + } + /***********************************************************************/ + private static void backupMySQL(String databaseName, String fileName) throws Exception + { + File file = new File(fileName); + if (!file.getParentFile().exists()) + { + file.getParentFile().createNewFile(); + } + String commandLine = "mysqldump -r " + fileName + " " + databaseName; + Process process = Runtime.getRuntime().exec(commandLine); + process.waitFor(); + if (process.exitValue() != 0) { throw new Error(extractError(commandLine, process.getErrorStream())); } + } + /***********************************************************************/ + private static void backupPostgreSQL(String databaseName, DatabaseConfiguration config, String fileName) + throws Exception + { + String commandLine = null; + try + { + File file = new File(fileName); + if (!file.getParentFile().exists()) + { + file.getParentFile().createNewFile(); + } + if (System.getProperty("os.name").indexOf("Windows") >= 0) + { + commandLine = "pg_dump --clean --username=" + config.getUserName() + " --file=\"" + + file.getCanonicalPath() + "\" " + databaseName; + } + else + { + commandLine = "pg_dump --clean --file=" + file.getCanonicalPath() + " " + databaseName; + } + Process process = Runtime.getRuntime().exec(commandLine); + // check for a password prompt + if (getPasswordPrompt(process)) + { + // send the password + sendPassword(process, config.getPassword()); + } + process.waitFor(); + if (process.exitValue() != 0) { throw new Error(extractError(commandLine, process.getErrorStream())); } + } + catch (IOException e) + { + MySystem.variable("CommandLine", commandLine); + throw e; + } + } + private static boolean getPasswordPrompt(Process process) throws Exception + { + InputStream error = process.getErrorStream(); + InputStream in = process.getInputStream(); + int TIMEOUT = 3; + long timeOut = System.currentTimeMillis() + (TIMEOUT * 1000); + StringBuffer prompt = new StringBuffer(); + while (System.currentTimeMillis() < timeOut) + { + if (in.available() == 0 && error.available() == 0) + { + Thread.sleep(500); + } + else + { + if (in.available() != 0) + { + prompt.append((char) in.read()); + } + if (error.available() != 0) + { + prompt.append((char) error.read()); + } + timeOut = System.currentTimeMillis() + (TIMEOUT * 1000); + } + } + MySystem.variable("prompt", prompt.toString()); + return prompt.toString().startsWith("Password"); + } + private static void sendPassword(Process process, String password) throws Exception + { + BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(process.getOutputStream())); + writer.write(password); + writer.newLine(); + writer.flush(); + writer.close(); + } + /***********************************************************************/ + private static void backupSQLServer(Statement stmt, String databaseName, String fileName) throws SQLException + { + String sql = "BACKUP DATABASE " + databaseName + " TO DISK = '" + fileName + "'"; + MySystem.query("BACKUP", sql); + stmt.execute(sql); + } + /***********************************************************************/ + public static void restoreDatabase(Statement stmt, String databaseName, DatabaseConfiguration config, + String fileName) throws Exception + { + switch (config.type) + { + case DatabaseUtils.SQLSERVER2005 : + case DatabaseUtils.SQLSERVER2000 : + case DatabaseUtils.SQLSERVER : + restoreSQLServer(stmt, databaseName, fileName); + break; + case DatabaseUtils.POSTGRESQL : + restorePostgreSQL(databaseName, config, fileName); + break; + case DatabaseUtils.MY_SQL : + restoreMySQL(stmt, databaseName, fileName); + break; + default : + throw new Error("Unhandled database type: " + DatabaseUtils.getDatabaseType(config.type)); + } + } + /***********************************************************************/ + private static void restoreMySQL(Statement stmt, String databaseName, String fileName) throws SQLException + { + String restoreCommand = "LOAD DATA INFILE '" + fileName + "' REPLACE ..."; + MySystem.query(restoreCommand); + stmt.execute(restoreCommand); + } + /***********************************************************************/ + private static void restorePostgreSQL(String databaseName, DatabaseConfiguration config, String fileName) + throws Error, Exception + { + String commandLine; + if (System.getProperty("os.name").indexOf("Windows") >= 0) + { + commandLine = "psql -f " + fileName + " -U " + config.userName + " " + databaseName; + } + else + { + commandLine = "psql -f " + fileName + " " + databaseName; + } + MySystem.event("RUNNING : " + commandLine); + Process process = Runtime.getRuntime().exec(commandLine); + if (getPasswordPrompt(process)) + { + sendPassword(process, config.getPassword()); + } + Thread.sleep(2000); + String string = null; + BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); + if (reader.ready()) + { + while ((string = reader.readLine()) != null) + { + MySystem.variable(string); + } + } + reader.close(); + reader = new BufferedReader(new InputStreamReader(process.getErrorStream())); + if (reader.ready()) + { + while ((string = reader.readLine()) != null) + { + MySystem.variable(string); + } + } + process.waitFor(); + reader.close(); + if (process.exitValue() != 0) { throw new Error(extractError(commandLine, process.getErrorStream())); } + } + /***********************************************************************/ + private static void restoreSQLServer(Statement stmt, String databaseName, String fileName) throws SQLException + { + stmt.execute("USE master"); + String restoreCommand = "RESTORE DATABASE " + databaseName + " FROM DISK = '" + fileName + "'"; + MySystem.query(restoreCommand); + stmt.execute(restoreCommand); + stmt.execute("USE " + databaseName); + } + /***********************************************************************/ + private static String extractError(String commandLine, InputStream error) throws Exception + { + /* + Process whoami = Runtime.getRuntime().exec("whoami"); + whoami.waitFor(); + String userName = extractText(whoami.getInputStream());*/ + String errorText = extractText(error); + return "Error Executing '" + commandLine + /*"' AS USER '" + userName + */"'- " + errorText; + } + /***********************************************************************/ + public static String extractText(InputStream inStream) throws IOException + { + StringBuffer errorBuffer = new StringBuffer(); + BufferedReader in = new BufferedReader(new InputStreamReader(inStream)); + while (in.ready()) + { + errorBuffer.append(in.readLine()); + } + return errorBuffer.toString(); + } + /***********************************************************************/ + public static void deleteTable(String tableName, int databaseType, Statement stmt) throws SQLException + { + switch (databaseType) + { + case DatabaseUtils.SQLSERVER2005 : + case DatabaseUtils.SQLSERVER2000 : + case DatabaseUtils.SQLSERVER : + deleteSQLServerTable(tableName, stmt); + break; + case DatabaseUtils.POSTGRESQL : + deletePostgreSQLTable(tableName, stmt); + break; + case DatabaseUtils.MY_SQL : + deleteMySqlTable(tableName, stmt); + break; + default : + throw new Error("Unhandled database type: " + DatabaseUtils.getDatabaseType(databaseType)); + } + } + /***********************************************************************/ + private static void deleteMySqlTable(String tableName, Statement stmt) throws SQLException + { + stmt.executeUpdate("TRUNCATE " + tableName); + } + /***********************************************************************/ + private static void deletePostgreSQLTable(String tableName, Statement stmt) throws SQLException + { + stmt.executeUpdate("DELETE FROM " + tableName); + stmt.executeQuery("select setval('" + tableName + "_pkey_seq',1)"); + } + /***********************************************************************/ + public static void resetTableIndex(String tableName, int databaseType, Statement stmt) throws SQLException + { + switch (databaseType) + { + case DatabaseUtils.SQLSERVER2005 : + case DatabaseUtils.SQLSERVER2000 : + case DatabaseUtils.SQLSERVER : + break; + case DatabaseUtils.POSTGRESQL : + resetPostgreIndex(tableName, stmt); + break; + case DatabaseUtils.MY_SQL : + break; + default : + throw new Error("Unhandled database type: " + DatabaseUtils.getDatabaseType(databaseType)); + } + } + /***********************************************************************/ + private static void resetPostgreIndex(String tableName, Statement stmt) throws SQLException + { + String sql = "select setval('" + tableName + "_pkey_seq',(select max(pkey) + 1 from " + tableName + "))"; + MySystem.query("reset index", sql); + stmt.executeQuery(sql); + } + /***********************************************************************/ + private static void deleteSQLServerTable(String tableName, Statement stmt) throws SQLException + { + stmt.executeUpdate("DELETE FROM " + tableName); + stmt.executeUpdate("DBCC CHECKIDENT('" + tableName + "', RESEED, 1)"); + } + /***********************************************************************/ + /***********************************************************************/ +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/database/DatabaseLoader.java b/src/main/java/com/spun/util/database/DatabaseLoader.java new file mode 100644 index 0000000..8a5c42a --- /dev/null +++ b/src/main/java/com/spun/util/database/DatabaseLoader.java @@ -0,0 +1,38 @@ +package com.spun.util.database; + +import java.sql.Statement; +import java.sql.SQLException; + +public final class DatabaseLoader + implements DatabaseCache +{ + private static final String ERROR_TEXT = "DatabaseLoad is a Marker to Load from the Database"; + public static DatabaseCache INSTANCE = new DatabaseLoader(); + + /**************************************************************************/ + private DatabaseLoader() {} + /**************************************************************************/ + public static boolean isDatabaseLoader(DatabaseCache cache) + { + return (cache instanceof DatabaseLoader); + } + /**************************************************************************/ + public static boolean isNormalCache(DatabaseCache cache) + { + return !((cache == null) || (cache instanceof DatabaseLoader)); + } + /**************************************************************************/ + public boolean equals(Object object) + { + return (object instanceof DatabaseLoader); + } + /**************************************************************************/ + /* UNSUPPORTED METHODS */ + /**************************************************************************/ + public Class getObjectType() {throw new UnsupportedOperationException(ERROR_TEXT);} + public boolean isLinkBackOn() {throw new UnsupportedOperationException(ERROR_TEXT);} + public void load(Statement stmt) throws SQLException {throw new UnsupportedOperationException(ERROR_TEXT);} + public void reset(Statement stmt) throws SQLException {throw new UnsupportedOperationException(ERROR_TEXT);} + public DatabaseObject get(int pkey) {throw new UnsupportedOperationException(ERROR_TEXT);} + /**************************************************************************/ +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/database/DatabaseLoadingTracker.java b/src/main/java/com/spun/util/database/DatabaseLoadingTracker.java new file mode 100644 index 0000000..d73396a --- /dev/null +++ b/src/main/java/com/spun/util/database/DatabaseLoadingTracker.java @@ -0,0 +1,40 @@ +package com.spun.util.database; + +import java.util.HashMap; + +public class DatabaseLoadingTracker +{ + private HashMap loaded = null; + /**************************************************************************/ + public DatabaseLoadingTracker() + { + loaded = new HashMap(); + } + /**************************************************************************/ + private String getHashKey(DatabaseObject object) + { + return object.getClass().getName() + object.getPkey(); + } + /**************************************************************************/ + /** + * loads the chache from the database + **/ + public DatabaseObject load(DatabaseObject newObject) + { + if (newObject == null) {return null;} + String hashKey = getHashKey(newObject); + DatabaseObject oldObject = (DatabaseObject)loaded.get(hashKey); + if (oldObject == null) + { + oldObject = newObject; + loaded.put(hashKey, newObject); + } + else + { + //My_System.event("found duplicate of " + hashKey); + } + return oldObject; + } + /**************************************************************************/ + /**************************************************************************/ +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/database/DatabaseObject.java b/src/main/java/com/spun/util/database/DatabaseObject.java new file mode 100644 index 0000000..aec7753 --- /dev/null +++ b/src/main/java/com/spun/util/database/DatabaseObject.java @@ -0,0 +1,104 @@ +package com.spun.util.database; + +import java.sql.SQLException; +import java.sql.Statement; +import java.util.Collection; + +import com.spun.util.filters.Filter; + +public interface DatabaseObject +{ + public static DatabaseObject Null = new NullDatabaseObject(); + /***********************************************************************/ + public boolean isNew(); + public void setNew(boolean b); + /***********************************************************************/ + public int getPkey(); + /***********************************************************************/ + public boolean setPkey(int i); + /***********************************************************************/ + public Metadata getMetadata(); + /***********************************************************************/ + public boolean save(Statement stmt) throws java.sql.SQLException; + /***********************************************************************/ + public boolean deleteFromDatabase(java.sql.Statement stmt) throws java.sql.SQLException; + /***********************************************************************/ + /** Inner Classes **/ + /***********************************************************************/ + public static class FilterNew implements com.spun.util.filters.Filter + { + public static Filter INSTANCE = new FilterNew(); + public boolean isExtracted(Object object) throws IllegalArgumentException + { + if (!(object instanceof DatabaseObject)) { throw new IllegalArgumentException( + "Expected Object of Type DatabaseObject but got " + object.getClass().getName()); } + DatabaseObject o = (DatabaseObject) object; + return o.isNew(); + } + } + /**************************************************************************/ + public static class Utils + { + public static void saveAll(DatabaseObject[] objects, Statement stmt) throws SQLException + { + java.util.HashSet set = new java.util.HashSet(); + for (int i = 0; i < objects.length; i++) + { + DatabaseRelationshipPersistent object = (DatabaseRelationshipPersistent) objects[i]; + object.save(stmt, set, false); + } + } + /***********************************************************************/ + public static T get(int pkey, T[] from) + { + if (from == null) { return null; } + for (int i = 0; i < from.length; i++) + { + if (pkey == from[i].getPkey()) { return from[i]; } + } + return null; + } + /**************************************************************************/ + public static T get(int pkey, Collection from) + { + for (T object : from) + { + if (pkey == object.getPkey()) { return object; } + } + return null; + } + /**************************************************************************/ + /** + * A convenience function to turn a vector of com.spun.util.database.DatabaseObject objects + * into an Array of the com.spun.util.database.DatabaseObject objects. + * @param vectorOf a Vector of com.spun.util.database.DatabaseObject objects + * @return the array of com.spun.util.database.DatabaseObject. + * @throws Error if an element of vectorOf is not a com.spun.util.database.DatabaseObject object. + **/ + public static com.spun.util.database.DatabaseObject[] toArray(java.util.Collection vectorOf) + { + if (vectorOf == null) { return new com.spun.util.database.DatabaseObject[0]; } + com.spun.util.database.DatabaseObject array[] = new com.spun.util.database.DatabaseObject[vectorOf.size()]; + java.util.Iterator iterator = vectorOf.iterator(); + int i = 0; + while (iterator.hasNext()) + { + java.lang.Object rowObject = iterator.next(); + if (rowObject instanceof com.spun.util.database.DatabaseObject) + { + array[i++] = (com.spun.util.database.DatabaseObject) rowObject; + } + else + { + throw new Error("toArray[" + i + "] is not an instance of com.spun.util.database.DatabaseObject but a " + + rowObject.getClass().getName()); + } + } + return array; + } + /************************************************************************/ + /************************************************************************/ + } + /***********************************************************************/ + /***********************************************************************/ +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/database/DatabaseRelationshipPersistent.java b/src/main/java/com/spun/util/database/DatabaseRelationshipPersistent.java new file mode 100644 index 0000000..99a77c4 --- /dev/null +++ b/src/main/java/com/spun/util/database/DatabaseRelationshipPersistent.java @@ -0,0 +1,9 @@ +package com.spun.util.database; + +import java.sql.Statement; + +public interface DatabaseRelationshipPersistent +{ + public boolean save(Statement stmt, java.util.HashSet set, boolean shallowOnly) + throws java.sql.SQLException; +} diff --git a/src/main/java/com/spun/util/database/DatabaseTransactionInfo.java b/src/main/java/com/spun/util/database/DatabaseTransactionInfo.java new file mode 100644 index 0000000..01e9e28 --- /dev/null +++ b/src/main/java/com/spun/util/database/DatabaseTransactionInfo.java @@ -0,0 +1,57 @@ +package com.spun.util.database; + +import java.lang.ref.WeakReference; +import java.sql.Connection; +import java.sql.SQLException; + +public class DatabaseTransactionInfo +{ + private WeakReference connectionReference; + private String originator; + private boolean automaticCommit; + /**************************************************************************/ + /** + * @return the object from the cache with the corosponding pkey + **/ + public DatabaseTransactionInfo(Connection con, int levelsOfRemoval) throws SQLException + { + this.automaticCommit = con.getAutoCommit(); + this.connectionReference = new WeakReference(con); + this.originator = getOriginatorText(levelsOfRemoval + 1); + //My_System.variable("getOriginatorText for creation", originator + con.toString()); + } + /***********************************************************************/ + public static String getOriginatorText(int offset) + { + StackTraceElement trace[] = new Error().getStackTrace(); + offset = offset + 1; + StackTraceElement element = trace[offset]; + int size = trace.length - offset; + String text = "[" + size + "]" + element.getClassName() + "." + element.getMethodName(); + return text; + } + /**************************************************************************/ + public boolean isFinalizeable() + { + return getConnection() == null; + } + /**************************************************************************/ + public boolean isOriginator(Connection con, int levelsOfRemoval) + { + String originatorText = getOriginatorText(levelsOfRemoval + 1); + return con.equals(getConnection()) && this.originator.equals(originatorText); + } + /***********************************************************************/ + public Connection getConnection() + { + return this.connectionReference.get(); + } + /***********************************************************************/ + public void cleanConnection() throws SQLException + { + Connection con = getConnection(); + con.setAutoCommit(automaticCommit); + } + /**************************************************************************/ + /**************************************************************************/ +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/database/Metadata.java b/src/main/java/com/spun/util/database/Metadata.java new file mode 100644 index 0000000..4dd76fd --- /dev/null +++ b/src/main/java/com/spun/util/database/Metadata.java @@ -0,0 +1,18 @@ +package com.spun.util.database; + + +public interface Metadata +{ + + /************************************************************************/ + public ColumnMetadata getColumnByName(String columnName); + /************************************************************************/ + public String getTableName(); + /************************************************************************/ + public ColumnMetadata[] getColumns(); + /************************************************************************/ + public String[] getColumnNames(); + /************************************************************************/ + /***********************************************************************/ + +} diff --git a/src/main/java/com/spun/util/database/NullDatabaseObject.java b/src/main/java/com/spun/util/database/NullDatabaseObject.java new file mode 100644 index 0000000..c16a834 --- /dev/null +++ b/src/main/java/com/spun/util/database/NullDatabaseObject.java @@ -0,0 +1,42 @@ +package com.spun.util.database; + +import java.sql.SQLException; +import java.sql.Statement; + +public class NullDatabaseObject implements DatabaseObject +{ + @Override + public boolean isNew() + { + return false; + } + @Override + public void setNew(boolean b) + { + } + @Override + public int getPkey() + { + return 0; + } + @Override + public boolean setPkey(int i) + { + return false; + } + @Override + public Metadata getMetadata() + { + return null; + } + @Override + public boolean save(Statement stmt) throws SQLException + { + return false; + } + @Override + public boolean deleteFromDatabase(Statement stmt) throws SQLException + { + return false; + } +} diff --git a/src/main/java/com/spun/util/database/ResultSetWriter.java b/src/main/java/com/spun/util/database/ResultSetWriter.java new file mode 100644 index 0000000..a3eca14 --- /dev/null +++ b/src/main/java/com/spun/util/database/ResultSetWriter.java @@ -0,0 +1,51 @@ +package com.spun.util.database; + +import java.sql.ResultSet; +import java.sql.ResultSetMetaData; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class ResultSetWriter +{ + public static String toString(ResultSet rs) throws SQLException + { + List results = extractResults(rs); + List metaData = extractMetaData(rs); + StringBuffer sb = new StringBuffer(); + sb.append(metaData.toString() + "\r\n"); + for (String[] strings : results) + { + sb.append(Arrays.toString(strings) + "\r\n"); + } + return sb.toString(); + } + /***********************************************************************/ + public static List extractResults(ResultSet rs) throws SQLException + { + int columns = rs.getMetaData().getColumnCount(); + ArrayList found = new ArrayList(); + while (rs.next()) + { + String rowData[] = new String[columns]; + for (int i = 1; i <= columns; i++) + { + rowData[i - 1] = rs.getString(i); + } + found.add(rowData); + } + return found; + } + /***********************************************************************/ + public static List extractMetaData(ResultSet rs) throws SQLException + { + ResultSetMetaData meta = rs.getMetaData(); + ArrayList titles = new ArrayList(meta.getColumnCount()); + for (int i = 1; i <= meta.getColumnCount(); i++) + { + titles.add(meta.getColumnName(i)); + } + return titles; + } +} diff --git a/src/main/java/com/spun/util/database/ReverseOrderLimitQueryWriter.java b/src/main/java/com/spun/util/database/ReverseOrderLimitQueryWriter.java new file mode 100644 index 0000000..44d98f8 --- /dev/null +++ b/src/main/java/com/spun/util/database/ReverseOrderLimitQueryWriter.java @@ -0,0 +1,135 @@ +/* + * Created on Mar 25, 2004 + * + * To change the template for this generated file go to + * Window - Preferences - Java - Code Generation - Code and Comments + */ +package com.spun.util.database; + + +import com.spun.util.database.SQLQuery.FromPart; +import com.spun.util.database.SQLQuery.LimitPart; +import com.spun.util.database.SQLQuery.OrderByPart; +import com.spun.util.servlets.ValidationError; + +/** + * @author Llewellyn Falco + * + * To change the template for this generated type comment go to + * Window - Preferences - Java - Code Generation - Code and Comments + */ +public class ReverseOrderLimitQueryWriter implements SQLQueryWriter +{ + private int databaseType; + + /**************************************************************************/ + public ReverseOrderLimitQueryWriter(int databaseType) + { + this.databaseType = databaseType; + } + /**************************************************************************/ + public String toString(SQLQuery query) + { + assertQueryValid(query); + query.setOrderReversed(true); + String innerQuery = constructInnerQuery(query).toString(databaseType); + String outerQuery = constructOuterQuery(innerQuery, query).toString(databaseType); + + return outerQuery; + } + + /***********************************************************************/ + private SQLQuery constructOuterQuery(String innerQuery, SQLQuery query) + { + SQLQuery outer = new SQLQuery(query.getAliasCount()); + // add the from parts + Replacer replacer = new Replacer(query.getFromParts().length); + + FromPart[] fromParts = query.getFromParts(); + for (int i = 0; i < fromParts.length; i++) + { + outer.addFromPart(new FromPart(replacer.replace(fromParts[i].part), fromParts[i].isJoin)); + } + String alias = outer.addFrom("(" + innerQuery + ")"); + String pkeyColumn = "." + query.getLimitPart().mainTablePkeyColumn; + outer.addWhere(alias + pkeyColumn + " = " + replacer.replace(query.getLimitPart().mainTableAlias) + pkeyColumn, true); + + OrderByPart[] orderByParts = query.getOrderByParts(); + for (int i = 0; i < orderByParts.length; i++) + { + outer.addOrderBy(replacer.replace(orderByParts[i].part), !orderByParts[i].ascending); + } + String[] selects = query.getSelectParts(); + for (int i = 0; i < selects.length; i++) + { + outer.addSelect(replacer.replace(selects[i])); + } + + outer.setLimitPart(new LimitPart(0, query.getLimitPart().numberOfRowsDesired, query.getLimitPart().mainTableAlias, query.getLimitPart().mainTablePkeyColumn)); + return outer; + } + + /***********************************************************************/ + private SQLQuery constructInnerQuery(SQLQuery query) + { + SQLQuery inner = new SQLQuery(); + // add the from parts + + FromPart[] fromParts = query.getFromParts(); + for (int i = 0; i < fromParts.length; i++) + { + inner.addFromPart(fromParts[i]); + } + SQLWhere wherePart = query.getWherePart(); + inner.addWhere(wherePart); + + OrderByPart[] orderByParts = query.getOrderByParts(); + for (int i = 0; i < orderByParts.length; i++) + { + inner.addOrderByPart(orderByParts[i]); + } + inner.addSelect(query.getLimitPart().mainTableAlias + "." + query.getLimitPart().mainTablePkeyColumn + " AS " + query.getLimitPart().mainTablePkeyColumn); + inner.setLimitPart(new LimitPart(0, query.getLimitPart().numberOfRowsDesired + query.getLimitPart().getStartingZeroBasedIndex(), query.getLimitPart().mainTableAlias, query.getLimitPart().mainTablePkeyColumn)); + + return inner; + } + + /***********************************************************************/ + private void assertQueryValid(SQLQuery query) + { + String[] assertions = new String[]{"groupByNull", "limitExists", "mainTableValid", "mainTablePkeyValid"}; + ValidationError error = new ValidationError(assertions); + error.setError("groupByNull", query.getGroupByParts().length > 0, "Cannot have group by in limit query."); + error.setError("limitExists", query.getLimitPart() == null || query.getLimitPart().getStartingZeroBasedIndex() == 0, "Must have a lower limit."); + error.setError("mainTableValid",query.getLimitPart() == null || query.getLimitPart().mainTableAlias == null, "Must define main table."); + error.setError("mainTablePkeyValid", query.getLimitPart() == null || query.getLimitPart().mainTablePkeyColumn == null, "Must define main table pkey column name."); + + if (!error.isOk()) + { + throw error; + } + } + /**************************************************************************/ + public static class Replacer + { + int index; + + /**************************************************************************/ + public Replacer(int index) + { + this.index = index; + } + /**************************************************************************/ + public String replace(String string) + { + for (int i = 0; i < index; i++) + { + char letter = (char)('a' + i); + string = string.replaceAll("\\b" + letter + "\\b", letter + "1"); + } + return string; + } + /**************************************************************************/ + } + +} diff --git a/src/main/java/com/spun/util/database/SQLInformationException.java b/src/main/java/com/spun/util/database/SQLInformationException.java new file mode 100644 index 0000000..b11e543 --- /dev/null +++ b/src/main/java/com/spun/util/database/SQLInformationException.java @@ -0,0 +1,41 @@ +package com.spun.util.database; + +import java.sql.SQLException; + +public class SQLInformationException extends SQLException +{ + private static class SQL_SERVER_CODES + { + //1205 - deadlock + //170 - incorrect syntax + } + private String query; + private SQLException exception; + /***********************************************************************/ + public SQLInformationException(String query, SQLException e) + { + this.exception = e; + this.query = query; + } + /***********************************************************************/ + public SQLException getException() + { + return exception; + } + /***********************************************************************/ + public String getQuery() + { + return query; + } + /***********************************************************************/ + public String getMessage() + { + return "The SQL :'" + query + "'\n" + + "caused the exception :'" + exception.getMessage() + "'\n" + + "Vendor code :'" + exception.getErrorCode() + "'\n" + + "SQL state :'" + exception.getSQLState() + "'\n" ; + } + + /***********************************************************************/ + /***********************************************************************/ +} diff --git a/src/main/java/com/spun/util/database/SQLQuery.java b/src/main/java/com/spun/util/database/SQLQuery.java new file mode 100644 index 0000000..908076c --- /dev/null +++ b/src/main/java/com/spun/util/database/SQLQuery.java @@ -0,0 +1,338 @@ +package com.spun.util.database; + +import java.sql.SQLException; +import java.sql.Statement; +import java.util.ArrayList; +import com.spun.util.DatabaseUtils; +import com.spun.util.ObjectUtils; +import com.spun.util.StringUtils; + +public class SQLQuery +{ + public static final class JOINS + { + public static final String INNER_JOIN = "INNER JOIN"; + public static final String LEFT_OUTER_JOIN = "LEFT OUTER JOIN"; + public static final String RIGHT_OUTER_JOIN = "RIGHT OUTER JOIN"; + } + public static final String BREAK = "\n"; + private ArrayList select = null; + private ArrayList from = null; + private SQLWhere where = null; + private ArrayList orderBy = null; + private ArrayList groupBy = null; + private ArrayList having = null; + private boolean reversed = false; + private LimitPart limitPart; + private int tableAliasOffset; + private boolean distinct; + /**************************************************************************/ + public SQLQuery() + { + this(0); + } + /**************************************************************************/ + public SQLQuery(int tableAliasOffset) + { + this.tableAliasOffset = tableAliasOffset; + select = new ArrayList(); + from = new ArrayList(); + where = null; + orderBy = new ArrayList(); + groupBy = new ArrayList(); + having = new ArrayList(); + } + /**************************************************************************/ + public void addSelect(String part) + { + select.add(part); + } + /**************************************************************************/ + public void addSelect(String part, String alias) + { + select.add(part + " AS " + alias); + } + /**************************************************************************/ + public void addDistinct() + { + distinct = true; + } + /***********************************************************************/ + public boolean isDistinct() + { + return distinct; + } + /**************************************************************************/ + public String getFirstAliasForTableName(String tableName) + { + for (int i = 0; i < from.size(); i++) + { + FromPart part = (FromPart) from.get(i); + if (part.part.indexOf(tableName + " AS") != -1) { return "" + ((char) ('a' + i)); } + } + return null; + } + /**************************************************************************/ + public void addFromPart(FromPart from) + { + this.from.add(from); + } + /**************************************************************************/ + public void addOrderByPart(OrderByPart orderBy) + { + this.orderBy.add(orderBy); + } + /**************************************************************************/ + public void setLimitPart(LimitPart limit) + { + this.limitPart = limit; + } + /***********************************************************************/ + public int getAliasCount() + { + return getFromParts().length; + } + /**************************************************************************/ + public String addFrom(String table) + { + String alias = "" + (char) ('a' + tableAliasOffset + from.size()); + from.add(new FromPart(table + " AS " + alias, false)); + return alias; + } + /**************************************************************************/ + public String addFromWithInnerJoin(String table, String joinWith, String joinOn) + { + return addFromWithJoin(table, joinWith, joinOn, JOINS.INNER_JOIN); + } + /**************************************************************************/ + public String addFromWithLeftOuterJoin(String table, String joinWith, String joinOn) + { + return addFromWithJoin(table, joinWith, joinOn, JOINS.LEFT_OUTER_JOIN); + } + /***********************************************************************/ + public String addFromWithRightOuterJoin(String table, String joinWith, String joinOn) + { + return addFromWithJoin(table, joinWith, joinOn, JOINS.RIGHT_OUTER_JOIN); + } + /**************************************************************************/ + public String addFromWithJoin(String table, String joinWith, String joinOn, String joinType) + { + String alias = "" + (char) ('a' + tableAliasOffset + from.size()); + String sql = (joinType + " " + table + " AS " + alias + " ON " + joinWith + " = " + alias + "." + joinOn); + from.add(new FromPart(sql, true)); + return alias; + } + /**************************************************************************/ + public void addWhere(String part) + { + addWhere(new SQLWhere(part), true); + } + /**************************************************************************/ + public void addWhere(SQLWhere part) + { + addWhere(part, true); + } + /**************************************************************************/ + public void addWhere(String part, boolean joinWithAnd) + { + addWhere(new SQLWhere(part), joinWithAnd); + } + /**************************************************************************/ + public void addWhere(SQLWhere part, boolean joinWithAnd) + { + where = joinWithAnd ? SQLWhere.joinByAnd(where, part) : SQLWhere.joinByOr(where, part); + } + /**************************************************************************/ + public String toString() + { + return toString(DatabaseUtils.SQLSERVER); + } + /**************************************************************************/ + public String toString(Statement stmt) + { + try + { + return toString(DatabaseUtils.getDatabaseType(stmt)); + } + catch (SQLException e) + { + throw ObjectUtils.throwAsError(e); + } + } + /**************************************************************************/ + public String toString(int databaseType) + { + SQLQueryWriter writer = getSQLQueryWriter(databaseType); + return writer.toString(this); + } + /***********************************************************************/ + private SQLQueryWriter getSQLQueryWriter(int databaseType) + { + if (limitPart == null || DatabaseUtils.MY_SQL == databaseType) + { + return new SimpleQueryWriter(databaseType); + } + else if (limitPart.startingZeroBasedIndex == 0) + { + return new SimpleQueryWriter(databaseType); + } + else + { + return new ReverseOrderLimitQueryWriter(databaseType); + } + } + /***********************************************************************/ + public void addOrderBy(String orderByClause, boolean ascending) + { + orderBy.add(new OrderByPart(orderByClause, ascending)); + } + /***********************************************************************/ + public void addOrderBy(ColumnMetadata submitted, String alias, boolean ascending) + { + addOrderBy(submitted.getNameWithPrefix(alias),ascending); + + } + /***********************************************************************/ + public void addGroupBy(String groupByClause) + { + groupBy.add(groupByClause); + } + /***********************************************************************/ + public void addHaving(String havingClause) + { + having.add(havingClause); + } + /***********************************************************************/ + public void setOrderReversed(boolean reversed) + { + this.reversed = reversed; + } + /***********************************************************************/ + public boolean isOrderReversed() + { + return reversed; + } + /***********************************************************************/ + public void addLimit(int startingZeroBasedIndex, int numberOfRowsDesired, String mainTableAlias, String mainTablePkeyColumn) + { + this.limitPart = new LimitPart(startingZeroBasedIndex, numberOfRowsDesired, mainTableAlias, mainTablePkeyColumn); + } + /***********************************************************************/ + public void addLimit(int startingZeroBasedIndex, int numberOfRowsDesired, String mainTableAlias, ColumnMetadata mainTablePkeyColumn) + { + addLimit(startingZeroBasedIndex, numberOfRowsDesired, mainTableAlias, mainTablePkeyColumn.getName()); + } + /***********************************************************************/ + public LimitPart getLimitPart() + { + return limitPart; + } + /***********************************************************************/ + public String[] getSelectParts() + { + return StringUtils.toArray(select); + } + /***********************************************************************/ + public String[] getGroupByParts() + { + return StringUtils.toArray(groupBy); + } + /***********************************************************************/ + public String[] getHavingParts() + { + return StringUtils.toArray(having); + } + /***********************************************************************/ + public FromPart[] getFromParts() + { + return (FromPart[]) from.toArray(new FromPart[from.size()]); + } + /***********************************************************************/ + public SQLWhere getWherePart() + { + return where; + } + /***********************************************************************/ + public OrderByPart[] getOrderByParts() + { + return (OrderByPart[]) orderBy.toArray(new OrderByPart[orderBy.size()]); + } + /**************************************************************************/ + /** INNER CLASSES **/ + /**************************************************************************/ + public static class LimitPart implements Cloneable + { + private int startingZeroBasedIndex; + public int numberOfRowsDesired; + public String mainTableAlias; + public String mainTablePkeyColumn; + /**************************************************************************/ + public LimitPart(int startingZeroBasedIndex, int numberOfRowsDesired, String mainTableAlias, String mainTablePkeyColumn) + { + this.setStartingZeroBasedIndex(startingZeroBasedIndex); + this.numberOfRowsDesired = numberOfRowsDesired; + this.mainTableAlias = mainTableAlias; + this.mainTablePkeyColumn = mainTablePkeyColumn; + } + /***********************************************************************/ + public int getStartingZeroBasedIndex() + { + return startingZeroBasedIndex; + } + /***********************************************************************/ + public void setStartingZeroBasedIndex(int startingZeroBasedIndex) + { + if (startingZeroBasedIndex < 0) { throw new Error("startingZeroBasedIndex: " + startingZeroBasedIndex + " must be greater than 0."); } + this.startingZeroBasedIndex = startingZeroBasedIndex; + } + /**************************************************************************/ + /**************************************************************************/ + } + public static class OrderByPart implements Cloneable + { + public String part = null; + public boolean ascending = false; + /**************************************************************************/ + public OrderByPart(String part, boolean ascending) + { + this.part = part; + this.ascending = ascending; + } + /**************************************************************************/ + public String toString(boolean isFirst) + { + String sql = part + (ascending ? " ASC " : " DESC "); + if (!isFirst) + { + sql = (isFirst ? " " : ", ") + sql; + } + return sql; + } + /**************************************************************************/ + /**************************************************************************/ + } + public static class FromPart implements Cloneable + { + public String part = null; + public boolean isJoin = false; + /**************************************************************************/ + public FromPart(String part, boolean isJoin) + { + this.part = part; + this.isJoin = isJoin; + } + /**************************************************************************/ + public String toString(boolean isFirst) + { + String sql = part; + if (!isFirst) + { + sql = (isJoin ? " " : ", ") + sql; + } + return sql; + } + /**************************************************************************/ + /**************************************************************************/ + } + +} diff --git a/src/main/java/com/spun/util/database/SQLQueryUtils.java b/src/main/java/com/spun/util/database/SQLQueryUtils.java new file mode 100644 index 0000000..4a5e7b9 --- /dev/null +++ b/src/main/java/com/spun/util/database/SQLQueryUtils.java @@ -0,0 +1,99 @@ +/* + * Created on Mar 25, 2004 + * + * To change the template for this generated file go to + * Window - Preferences - Java - Code Generation - Code and Comments + */ +package com.spun.util.database; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.sql.Timestamp; + +import com.spun.util.database.SQLQuery.FromPart; +import com.spun.util.database.SQLQuery.LimitPart; + +public class SQLQueryUtils +{ + public static class IntegerExtractor implements ResultSetExtractor + { + @Override + public Integer extract(ResultSet rs) throws SQLException + { + return rs.getInt(1); + } + } + public static class TimestampExtractor implements ResultSetExtractor + { + @Override + public Timestamp extract(ResultSet rs) throws SQLException + { + return rs.getTimestamp(1); + } + } + public static interface ResultSetExtractor + { + public T extract(ResultSet rs) throws SQLException; + } + /**************************************************************************/ + public static SQLQuery extractCountingQuery(SQLQuery query) + { + SQLQuery counter = new SQLQuery(); + // add the from parts + FromPart[] fromParts = query.getFromParts(); + for (int i = 0; i < fromParts.length; i++) + { + counter.addFromPart(fromParts[i]); + } + SQLWhere where = query.getWherePart(); + counter.addWhere(where); + counter.addSelect("count(*) AS thecount "); + return counter; + } + /**************************************************************************/ + public static SQLQuery refineLimitQuery(int maximum, SQLQuery query) + { + LimitPart limitPart = query.getLimitPart(); + if (limitPart.getStartingZeroBasedIndex() >= maximum) + { + limitPart.setStartingZeroBasedIndex(maximum - 1); + } + if (limitPart.numberOfRowsDesired + limitPart.getStartingZeroBasedIndex() > maximum) + { + limitPart.numberOfRowsDesired = maximum - limitPart.getStartingZeroBasedIndex(); + } + return query; + } + /***********************************************************************/ + public static int executeCountOnQuery(SQLQuery query, Statement stmt) throws SQLException + { + return executeSingleIntQuery(extractCountingQuery(query).toString(), stmt); + } + /***********************************************************************/ + public static int executeSingleIntQuery(String sql, Statement stmt) throws SQLException + { + ResultSet rs = SQLStatementUtils.executeQuery(sql, stmt); + return extractSingleRow(sql, rs, new IntegerExtractor()); + } + public static Timestamp executeSingleDateQuery(String sql, Statement stmt) throws SQLException + { + ResultSet rs = SQLStatementUtils.executeQuery(sql, stmt); + return extractSingleRow(sql, rs, new TimestampExtractor()); + } + /***********************************************************************/ + private static T extractSingleRow(String sql, ResultSet rs, ResultSetExtractor extractor) + throws SQLException + { + if (rs.next()) + { + T out = extractor.extract(rs); + rs.close(); + return out; + } + else + { + throw new SQLException("No results returned from query - " + sql); + } + } +} diff --git a/src/main/java/com/spun/util/database/SQLQueryWriter.java b/src/main/java/com/spun/util/database/SQLQueryWriter.java new file mode 100644 index 0000000..837c82c --- /dev/null +++ b/src/main/java/com/spun/util/database/SQLQueryWriter.java @@ -0,0 +1,11 @@ +package com.spun.util.database; + + +public interface SQLQueryWriter +{ + /**************************************************************************/ + public String toString(SQLQuery query); + /**************************************************************************/ + /**************************************************************************/ + +} diff --git a/src/main/java/com/spun/util/database/SQLStatementUtils.java b/src/main/java/com/spun/util/database/SQLStatementUtils.java new file mode 100644 index 0000000..508430f --- /dev/null +++ b/src/main/java/com/spun/util/database/SQLStatementUtils.java @@ -0,0 +1,55 @@ +package com.spun.util.database; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; + +import com.spun.util.DatabaseUtils; + +public class SQLStatementUtils +{ + /***********************************************************************/ + public static ResultSet executeQuery(SQLQuery query, Statement stmt) throws SQLException + { + return executeQuery(query.toString(DatabaseUtils.getDatabaseType(stmt)), stmt); + } + /***********************************************************************/ + public static ResultSet executeQuery(String query, Statement stmt) throws SQLInformationException + { + try + { + //My_System.query(query); + return stmt.executeQuery(query); + } + catch (SQLException e) + { + throw new SQLInformationException(query, e); + } + } + /***********************************************************************/ + public static int executeUpdate(String query, Statement stmt) throws SQLInformationException + { + try + { + return stmt.executeUpdate(query); + } + catch (SQLException e) + { + throw new SQLInformationException(query, e); + } + } + /***********************************************************************/ + public static boolean execute(String query, Statement stmt) throws SQLInformationException + { + try + { + return stmt.execute(query); + } + catch (SQLException e) + { + throw new SQLInformationException(query, e); + } + } + /***********************************************************************/ + /***********************************************************************/ +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/database/SQLUtils.java b/src/main/java/com/spun/util/database/SQLUtils.java new file mode 100644 index 0000000..e8364c0 --- /dev/null +++ b/src/main/java/com/spun/util/database/SQLUtils.java @@ -0,0 +1,145 @@ +package com.spun.util.database; + +import java.sql.ResultSet; +import java.sql.SQLException; +import com.spun.util.DatabaseUtils; +import com.spun.util.ObjectUtils; + +public class SQLUtils +{ + /***********************************************************************/ + public static String createInSQLStatement(DatabaseObject from[]) + { + from = (from == null) ? new DatabaseObject[0] : from; + Integer[] array = new Integer[from.length]; + for (int i = 0; i < from.length; i++) + { + array[i] = from[i].getPkey(); + } + return createInSQLStatement((Object[]) array); + } + /***********************************************************************/ + public static String createInSQLStatement(String values[]) + { + return createInSQLStatement((Object[]) values); + } + /***********************************************************************/ + public static String createInSQLStatement(Object values[]) + { + if (values == null || values.length == 0) { return "(null)"; } + StringBuffer sql = new StringBuffer("("); + for (int i = 0; i < values.length; i++) + { + sql.append(DatabaseUtils.formatNullableObject(values[i])); + sql.append(", "); + } + sql.setLength(sql.length() - 2); + sql.append(") "); + return sql.toString(); + } + /***********************************************************************/ + /** + * Done via Reflection. + * They should all be the same Type of object! + * And the method signature should have empty arguments! + **/ + public static String createInSQLStatement(Object from[], String methodName) + { + Object[] array = ObjectUtils.extractArray(from, methodName); + return createInSQLStatement(array); + } + /***********************************************************************/ + public static String loadInSQLStatement(ResultSet rs) throws SQLException + { + StringBuffer sql = new StringBuffer("("); + while (rs.next()) + { + sql.append(DatabaseUtils.formatNullableObject(rs.getObject(1))); + sql.append(", "); + } + if (sql.length() == 1) { return null; } + sql.setLength(sql.length() - 2); + sql.append(") "); + return sql.toString(); + } + /***********************************************************************/ + public static String createSQLBetween(String lowerValue, String betweenVariable, String upperValue) + { + return "(" + DatabaseUtils.formatNullableObject(lowerValue) + " <= " + betweenVariable + " AND " + betweenVariable + " < " + DatabaseUtils.formatNullableObject(upperValue) + ")"; + } + /***********************************************************************/ + public static String compareBy(ColumnMetadata metadata, String alias, String compareBy, Object value) + { + String sql = null; + if (value == null && "=".equals(compareBy)) + { + sql = metadata.getNameWithPrefix(alias) + " IS NULL"; + } + else if (value == null && "!=".equals(compareBy)) + { + sql = metadata.getNameWithPrefix(alias) + " IS NOT NULL"; + } + else + { + sql = metadata.getNameWithPrefix(alias) + " " + compareBy + " " + DatabaseUtils.formatNullableObject(value); + } + return sql; + } + /***********************************************************************/ + public static String compareBy(ColumnMetadata metadata, String alias, String compareBy, boolean value) + { + return metadata.getNameWithPrefix(alias) + " " + compareBy + " " + DatabaseUtils.formatBoolean(value); + } + /***********************************************************************/ + public static String compareByEquals(ColumnMetadata metadata, String alias, Object value) + { + return compareBy(metadata, alias, "=", value); + } + /***********************************************************************/ + public static String createInSQLStatement(ColumnMetadata metadata, String alias, Object[] values) + { + return createInSQLStatement(metadata, alias, false, values); + } + /***********************************************************************/ + public static String createInSQLStatement(ColumnMetadata metadata, String alias, boolean not, Object[] values) + { + String sql = null; + String in = not ? " NOT IN " : " IN "; + if (values == null) + { + sql = compareBy(metadata, alias,not ? "!=" : "=", null); + } + else if (values.length == 1) + { + sql = compareBy(metadata, alias,not ? "!=" : "=", values[0]); + } + else if (values instanceof DatabaseObject[]) + { + sql = metadata.getNameWithPrefix(alias) + in + createInSQLStatement((DatabaseObject[]) values); + } +// else if (values.length < 5) +// { +// return createOrOptimizedInSqlStatement(metadata, alias, not, values); +// } + else + { + sql = metadata.getNameWithPrefix(alias) + in + createInSQLStatement(values); + } + return sql; + } + /***********************************************************************/ + private static String createOrOptimizedInSqlStatement(ColumnMetadata metadata, String alias, boolean not, Object[] values) + { + StringBuffer buffer = new StringBuffer("("); + String compare = not ? "!=" : "="; + for (int i = 0; i < values.length; i++) + { + buffer.append(compareBy(metadata, alias,compare, values[i])).append(" OR "); + } + buffer.setLength(buffer.length() - 4); + buffer.append(")"); + return buffer.toString(); + } + /***********************************************************************/ + /***********************************************************************/ +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/database/SQLWhere.java b/src/main/java/com/spun/util/database/SQLWhere.java new file mode 100644 index 0000000..d7aa19d --- /dev/null +++ b/src/main/java/com/spun/util/database/SQLWhere.java @@ -0,0 +1,159 @@ +package com.spun.util.database; + +import java.sql.Timestamp; +import java.util.Date; + +import com.spun.util.DatabaseUtils; +import com.spun.util.date.DateRange; + +/* + * This class is immutable + */ +public class SQLWhere +{ + private String part; + /**************************************************************************/ + public SQLWhere(String part) + { + this.part = part.trim(); + } + /**************************************************************************/ + public SQLWhere(ColumnMetadata metadata, String alias, String comparator, Object part2) + { + this(SQLUtils.compareBy(metadata, alias, comparator, part2)); + } + /**************************************************************************/ + public SQLWhere(ColumnMetadata metadata, String alias, Object value) + { + this(SQLUtils.compareByEquals(metadata, alias, value)); + } + /**************************************************************************/ + public SQLWhere(String part1, String comparator, ColumnMetadata metadata, String alias) + { + this(part1 + " " + comparator + " " + metadata.getNameWithPrefix(alias)); + } + /**************************************************************************/ + public SQLWhere(ColumnMetadata metadata1, String alias1, String comparator, ColumnMetadata metadata2, + String alias2) + { + this(metadata1.getNameWithPrefix(alias1) + " " + comparator + " " + metadata2.getNameWithPrefix(alias2)); + } + /**************************************************************************/ + public SQLWhere(String part1, String comparator, String part2) + { + this(part1 + " " + comparator + " " + part2); + } + /***********************************************************************/ + public SQLWhere(ColumnMetadata metadata, String alias, boolean value) + { + this(SQLUtils.compareBy(metadata, alias, "=", value)); + } + public SQLWhere(SQLQuery query, String comparator, String value) + { + this("(" + query.toString() + ")", comparator, value); + } + /**************************************************************************/ + public static SQLWhere joinByOr(SQLWhere a, SQLWhere b) + { + if (a == null) + { + return b; + } + else if (b == null) { return a; } + return new SQLWhere(join(a, "OR", b)); + } + /**************************************************************************/ + public static SQLWhere joinByOr(SQLWhere a, SQLWhere b, SQLWhere c) + { + return new SQLWhere(a.toString() + " OR " + b.toString() + " OR " + c.toString()); + } + /**************************************************************************/ + private static String join(SQLWhere a, String join, SQLWhere b) + { + return a.toString() + " " + join + " " + b.toString(); + } + /**************************************************************************/ + public SQLWhere joinByAnd(SQLWhere a) + { + return joinByAnd(this, a); + } + /**************************************************************************/ + public static SQLWhere joinByAnd(SQLWhere a, SQLWhere b) + { + if (a == null) + { + return b; + } + else if (b == null) { return a; } + return new SQLWhere(join(a, "AND", b)); + } + /**************************************************************************/ + @Override + public String toString() + { + return isPartWrapped(part) ? part : "(" + part + ")"; + } + /**************************************************************************/ + public static boolean isPartWrapped(String part) + { + if (part.charAt(0) != '(' || part.charAt(part.length() - 1) != ')') { return false; } + int count = 1; + for (int i = 1; i < part.length() - 1; i++) + { + switch (part.charAt(i)) + { + case '(' : + count++; + break; + case ')' : + count--; + if (count == 0) { return false; } + break; + } + } + return true; + } + /***********************************************************************/ + public static SQLWhere createBetween(ColumnMetadata column, String prefix, DateRange range) + { + return createBetween(range.getStart(), column, prefix, range.getEnd()); + } + public static SQLWhere createBetween(Date startTime, ColumnMetadata column, String prefix, Date endTime) + { + return new SQLWhere(SQLUtils.createSQLBetween(new Timestamp(startTime.getTime()).toString(), column + .getNameWithPrefix(prefix), new Timestamp(endTime.getTime()).toString())); + } + /***********************************************************************/ + public static SQLWhere createInSQLStatement(ColumnMetadata metadata, String alias, Object... values) + { + return new SQLWhere(SQLUtils.createInSQLStatement(metadata, alias, false, values)); + } + /***********************************************************************/ + public static SQLWhere createNotInSQLStatement(ColumnMetadata metadata, String alias, Object[] values) + { + return new SQLWhere(SQLUtils.createInSQLStatement(metadata, alias, true, values)); + } + /***********************************************************************/ + public static SQLWhere createInSQLStatement(ColumnMetadata metadata, String alias, boolean not, Object[] values) + { + return new SQLWhere(SQLUtils.createInSQLStatement(metadata, alias, not, values)); + } + /**************************************************************************/ + public static SQLWhere createLike(ColumnMetadata metaData, String alias, String search, int databaseType) + { + SQLWhere sql = new SQLWhere(metaData, alias, DatabaseUtils.getLike(databaseType), search); + return sql; + } + /**************************************************************************/ + public static SQLWhere createNotNull(ColumnMetadata metadata, String alias) + { + return new SQLWhere(SQLUtils.compareBy(metadata, alias, "!=", null)); + } + /**************************************************************************/ + /**************************************************************************/ + public static SQLWhere createNotLike(ColumnMetadata metaData, String alias, String search, int databaseType) + { + SQLWhere sql = new SQLWhere(metaData, alias, "NOT " + DatabaseUtils.getLike(databaseType), search); + return sql; + } +} diff --git a/src/main/java/com/spun/util/database/SimpleQueryWriter.java b/src/main/java/com/spun/util/database/SimpleQueryWriter.java new file mode 100644 index 0000000..02f9aae --- /dev/null +++ b/src/main/java/com/spun/util/database/SimpleQueryWriter.java @@ -0,0 +1,132 @@ +package com.spun.util.database; + +import com.spun.util.DatabaseUtils; +import com.spun.util.database.SQLQuery.FromPart; +import com.spun.util.database.SQLQuery.OrderByPart; + +class SimpleQueryWriter implements SQLQueryWriter +{ + private int databaseType; + + /**************************************************************************/ + public SimpleQueryWriter(int databaseType) + { + this.databaseType = databaseType; + } + /**************************************************************************/ + public String toString(SQLQuery query) + { + StringBuffer sql = new StringBuffer("SELECT "); + if (query.isDistinct()) + { + sql.append("DISTINCT "); + } + // limit + if (DatabaseUtils.isSqlServer(databaseType) && query.getLimitPart() != null) + { + if (query.getLimitPart().getStartingZeroBasedIndex() != 0) + { + throw new Error("Wrong Sql writer for lower bound of " + query.getLimitPart().getStartingZeroBasedIndex()); + } + sql.append("TOP " + query.getLimitPart().numberOfRowsDesired + " "); + } + addSelectPart(sql, query.getSelectParts()); + addFromPart(sql, query.getFromParts()); + addWherePart(sql, query.getWherePart()); + addGroupBy(sql, query.getGroupByParts()); + addHaving(sql, query.getHavingParts()); + addOrderByPart(sql, query.getOrderByParts()); + //limit + if ((databaseType == DatabaseUtils.POSTGRESQL || databaseType == DatabaseUtils.MY_SQL) && query.getLimitPart() != null) + { + sql.append(" LIMIT "); + if (databaseType == DatabaseUtils.MY_SQL && query.getLimitPart().getStartingZeroBasedIndex() != 0) + { + sql.append(query.getLimitPart().getStartingZeroBasedIndex() + ", "); + } + sql.append(query.getLimitPart().numberOfRowsDesired); + } + return sql.toString(); + } + /***********************************************************************/ + private void addOrderByPart(StringBuffer sql, OrderByPart[] orderBys) + { + //order by + if (orderBys.length > 0) + { + sql.append(SQLQuery.BREAK + "ORDER BY "); + for (int i = 0; i < orderBys.length; i++) + { + sql.append(orderBys[i].toString(i == 0)); + } + sql.append(" "); + } + } + /***********************************************************************/ + private void addWherePart(StringBuffer sql, SQLWhere wherePart) + { + if (wherePart != null ) + { + sql.append(SQLQuery.BREAK + "WHERE "); + sql.append(wherePart.toString()); + } + } + /***********************************************************************/ + private void addFromPart(StringBuffer sql, FromPart[] froms) + { + if (froms.length > 0) + { + sql.append(SQLQuery.BREAK + "FROM "); + for (int i = 0; i < froms.length; i++) + { + sql.append(froms[i].toString(i == 0)); + } + sql.append(" "); + } + } + /***********************************************************************/ + private void addGroupBy(StringBuffer sql, String[] groupBys) + { + if (groupBys.length > 0) + { + sql.append(SQLQuery.BREAK + "GROUP BY "); + for (int i = 0; i < groupBys.length; i++) + { + sql.append(groupBys[i]); + sql.append(", "); + } + sql.setLength(sql.length() - 2); + sql.append(" "); + } + } + /***********************************************************************/ + private void addHaving(StringBuffer sql, String[] havings) + { + if (havings.length > 0) + { + sql.append(SQLQuery.BREAK + "HAVING "); + for (int i = 0; i < havings.length; i++) + { + sql.append(havings[i]); + sql.append(", "); + } + sql.setLength(sql.length() - 2); + sql.append(" "); + } + } + /***********************************************************************/ + private void addSelectPart(StringBuffer sql, String[] selectParts) + { + for (int i = 0; i < selectParts.length; i++) + { + sql.append(selectParts[i]); + sql.append(", "); + } + sql.setLength(sql.length() - 2); + sql.append(" "); + + } + /**************************************************************************/ + /**************************************************************************/ + +} diff --git a/src/main/java/com/spun/util/database/SqlConnectionException.java b/src/main/java/com/spun/util/database/SqlConnectionException.java new file mode 100644 index 0000000..93b9ab9 --- /dev/null +++ b/src/main/java/com/spun/util/database/SqlConnectionException.java @@ -0,0 +1,41 @@ +package com.spun.util.database; + +import java.sql.SQLException; + +public class SqlConnectionException extends RuntimeException +{ + + private String driver; + private String protocol; + private String server; + private String port; + private String database; + private String userName; + private String url; + + public SqlConnectionException(String driver, String url, String protocol, String server, String port, String database, String userName, String password, int type, SQLException e) + { + super(e); + this.driver = driver; + this.url = url; + this.protocol = protocol; + this. server = server; + this.port = port; + this.database = database; + this.userName = userName; + } + + public String getMessage() + { + return "Problems Connecting to " + url + "\n" + + "Message : " + getCause().getMessage() + "\n" + + "Driver : " + driver + "\n" + + "Server : " + server + "\n" + + "Port : " + port + "\n" + + "Database : " + database + "\n" + + "UserName : " + userName + "\n" + ; + } + + +} diff --git a/src/main/java/com/spun/util/database/SshConnection.java b/src/main/java/com/spun/util/database/SshConnection.java new file mode 100644 index 0000000..43aaa06 --- /dev/null +++ b/src/main/java/com/spun/util/database/SshConnection.java @@ -0,0 +1,319 @@ +package com.spun.util.database; + +import java.sql.Array; +import java.sql.Blob; +import java.sql.CallableStatement; +import java.sql.Clob; +import java.sql.Connection; +import java.sql.DatabaseMetaData; +import java.sql.NClob; +import java.sql.PreparedStatement; +import java.sql.SQLClientInfoException; +import java.sql.SQLException; +import java.sql.SQLWarning; +import java.sql.SQLXML; +import java.sql.Savepoint; +import java.sql.Statement; +import java.sql.Struct; +import java.util.Map; +import java.util.Properties; +import java.util.concurrent.Executor; + +import com.sshtools.j2ssh.SshClient; + +/***********************************************************************/ +public class SshConnection implements Connection { + private Connection con; + private SshClient ssh; + + /***********************************************************************/ + private void closeSsh() { + ssh.disconnect(); + ssh = null; + } + + /***********************************************************************/ + public SshConnection(SshClient ssh, Connection connection) { + this.ssh = ssh; + this.con = connection; + } + + /***********************************************************************/ + public int getHoldability() throws SQLException { + return con.getHoldability(); + } + + /***********************************************************************/ + public int getTransactionIsolation() throws SQLException { + return con.getTransactionIsolation(); + } + + /***********************************************************************/ + public void clearWarnings() throws SQLException { + con.clearWarnings(); + } + + /***********************************************************************/ + public void close() throws SQLException { + if (con != null) { + con.close(); + closeSsh(); + con = null; + } + } + + /***********************************************************************/ + public void commit() throws SQLException { + con.commit(); + } + + /***********************************************************************/ + public void rollback() throws SQLException { + con.rollback(); + } + + /***********************************************************************/ + public boolean getAutoCommit() throws SQLException { + return con.getAutoCommit(); + } + + /***********************************************************************/ + public boolean isClosed() throws SQLException { + return con.isClosed(); + } + + /***********************************************************************/ + public boolean isReadOnly() throws SQLException { + return con.isReadOnly(); + } + + /***********************************************************************/ + public void setHoldability(int holdability) throws SQLException { + con.setHoldability(holdability); + } + + /***********************************************************************/ + public void setTransactionIsolation(int level) throws SQLException { + con.setTransactionIsolation(level); + } + + /***********************************************************************/ + public void setAutoCommit(boolean autoCommit) throws SQLException { + con.setAutoCommit(autoCommit); + } + + /***********************************************************************/ + public void setReadOnly(boolean readOnly) throws SQLException { + con.setReadOnly(readOnly); + } + + /***********************************************************************/ + public String getCatalog() throws SQLException { + return con.getCatalog(); + } + + /***********************************************************************/ + public void setCatalog(String catalog) throws SQLException { + con.setCatalog(catalog); + } + + /***********************************************************************/ + public DatabaseMetaData getMetaData() throws SQLException { + return con.getMetaData(); + } + + /***********************************************************************/ + public SQLWarning getWarnings() throws SQLException { + return con.getWarnings(); + } + + /***********************************************************************/ + public Savepoint setSavepoint() throws SQLException { + return con.setSavepoint(); + } + + /***********************************************************************/ + public void releaseSavepoint(Savepoint savepoint) throws SQLException { + con.releaseSavepoint(savepoint); + } + + /***********************************************************************/ + public void rollback(Savepoint savepoint) throws SQLException { + con.rollback(savepoint); + } + + /***********************************************************************/ + public Statement createStatement() throws SQLException { + return con.createStatement(); + } + + /***********************************************************************/ + public Statement createStatement(int resultSetType, int resultSetConcurrency) throws SQLException { + return con.createStatement(resultSetType, resultSetConcurrency); + } + + /***********************************************************************/ + public Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { + return con.createStatement(resultSetType, resultSetConcurrency, resultSetHoldability); + } + + /***********************************************************************/ + public Map getTypeMap() throws SQLException { + return con.getTypeMap(); + } + + /***********************************************************************/ + public void setTypeMap(Map> arg0) throws SQLException { + con.setTypeMap(arg0); + } + + /***********************************************************************/ + public String nativeSQL(String sql) throws SQLException { + return con.nativeSQL(sql); + } + + /***********************************************************************/ + public CallableStatement prepareCall(String sql) throws SQLException { + return con.prepareCall(sql); + } + + /***********************************************************************/ + public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency) throws SQLException { + return con.prepareCall(sql, resultSetType, resultSetConcurrency); + } + + /***********************************************************************/ + public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { + return con.prepareCall(sql, resultSetType, resultSetConcurrency, resultSetHoldability); + } + + /***********************************************************************/ + public PreparedStatement prepareStatement(String sql) throws SQLException { + return con.prepareStatement(sql); + } + + /***********************************************************************/ + public PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) throws SQLException { + return con.prepareStatement(sql, autoGeneratedKeys); + } + + /***********************************************************************/ + public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency) throws SQLException { + return con.prepareStatement(sql, resultSetType, resultSetConcurrency); + } + + /***********************************************************************/ + public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { + return con.prepareStatement(sql, resultSetType, resultSetConcurrency, resultSetHoldability); + } + + /***********************************************************************/ + public PreparedStatement prepareStatement(String sql, int[] columnIndexes) throws SQLException { + return con.prepareStatement(sql, columnIndexes); + } + + /***********************************************************************/ + public Savepoint setSavepoint(String name) throws SQLException { + return con.setSavepoint(name); + } + + /***********************************************************************/ + public PreparedStatement prepareStatement(String sql, String[] columnNames) throws SQLException { + return con.prepareStatement(sql, columnNames); + } + + /***********************************************************************/ + protected void finalize() throws Throwable { + super.finalize(); + close(); + } + + /***********************************************************************/ + public Array createArrayOf(String arg0, Object[] arg1) throws SQLException { + return con.createArrayOf(arg0, arg1); + } + + /***********************************************************************/ + public Blob createBlob() throws SQLException { + return con.createBlob(); + } + + /***********************************************************************/ + public Clob createClob() throws SQLException { + return con.createClob(); + } + + /***********************************************************************/ + public NClob createNClob() throws SQLException { + return con.createNClob(); + } + + /***********************************************************************/ + public SQLXML createSQLXML() throws SQLException { + return con.createSQLXML(); + } + + /***********************************************************************/ + public Struct createStruct(String arg0, Object[] arg1) throws SQLException { + return con.createStruct(arg0, arg1); + } + + /***********************************************************************/ + public Properties getClientInfo() throws SQLException { + return con.getClientInfo(); + } + + /***********************************************************************/ + public String getClientInfo(String arg0) throws SQLException { + return con.getClientInfo(arg0); + } + + /***********************************************************************/ + public boolean isValid(int arg0) throws SQLException { + return con.isValid(arg0); + } + + /***********************************************************************/ + public void setClientInfo(Properties arg0) throws SQLClientInfoException { + con.setClientInfo(arg0); + } + + /***********************************************************************/ + public void setClientInfo(String arg0, String arg1) throws SQLClientInfoException { + con.setClientInfo(arg0, arg1); + } + + /***********************************************************************/ + public boolean isWrapperFor(Class arg0) throws SQLException { + return con.isWrapperFor(arg0); + } + + /***********************************************************************/ + public T unwrap(Class arg0) throws SQLException { + return con.unwrap(arg0); + } + + /***********************************************************************/ + /***********************************************************************/ + public void abort(Executor executor) throws SQLException { + // TODO Auto-generated method stub + } + + public int getNetworkTimeout() throws SQLException { + // TODO Auto-generated method stub + return 0; + } + + public String getSchema() throws SQLException { + // TODO Auto-generated method stub + return null; + } + + public void setNetworkTimeout(Executor executor, int milliseconds) throws SQLException { + // TODO Auto-generated method stub + } + + public void setSchema(String schema) throws SQLException { + // TODO Auto-generated method stub + } +} diff --git a/src/main/java/com/spun/util/database/SshDatabaseWrapper.java b/src/main/java/com/spun/util/database/SshDatabaseWrapper.java new file mode 100644 index 0000000..04b8a4a --- /dev/null +++ b/src/main/java/com/spun/util/database/SshDatabaseWrapper.java @@ -0,0 +1,53 @@ +package com.spun.util.database; + +import java.io.IOException; +import java.sql.Connection; +import org.apache.commons.logging.LogFactory; +import com.spun.util.DatabaseConfiguration; +import com.spun.util.DatabaseConfigurationWrapper; +import com.spun.util.ObjectUtils; +import com.sshtools.j2ssh.SshClient; +import com.sshtools.j2ssh.authentication.PasswordAuthenticationClient; +import com.sshtools.j2ssh.forwarding.ForwardingClient; +import com.sshtools.j2ssh.transport.IgnoreHostKeyVerification; + +/***********************************************************************/ +public class SshDatabaseWrapper implements DatabaseConfigurationWrapper +{ + + public static String SSH = "Ssh"; + private static int counter = 32001; + /***********************************************************************/ + static + { + DatabaseConfiguration.registerWrapper(SSH, new SshDatabaseWrapper()); + } + /***********************************************************************/ + public synchronized Connection makeConnection(String database, DatabaseConfiguration originalConfiguration) + { + int port = counter++; + DatabaseConfiguration config = new DatabaseConfiguration(originalConfiguration.getDataSourceName(), originalConfiguration.getDriver(), originalConfiguration.getProtocol(), "localhost", "" + port, database, originalConfiguration.getUserName(), originalConfiguration.getPassword(), originalConfiguration.getType()); + try + { + LogFactory.getFactory().setAttribute("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.NoOpLog"); + SshClient ssh = new SshClient(); + ssh.setSocketTimeout(60000); + ssh.connect(originalConfiguration.getServer(), new IgnoreHostKeyVerification()); + PasswordAuthenticationClient pwd = new PasswordAuthenticationClient(); + pwd.setUsername(originalConfiguration.getUserName()); + pwd.setPassword(originalConfiguration.getPassword()); + ssh.authenticate(pwd); + ForwardingClient client = ssh.getForwardingClient(); + client.addLocalForwarding(config.getProtocol(), "0.0.0.0", config.getPort(), "localhost", originalConfiguration.getPort()); + client.startLocalForwarding(config.getProtocol()); + return new SshConnection(ssh, config.makeConnection()); + } + catch (IOException ie) + { + throw ObjectUtils.throwAsError(ie); + } + } + /***********************************************************************/ + /***********************************************************************/ + +} diff --git a/src/main/java/com/spun/util/database/Syncable.java b/src/main/java/com/spun/util/database/Syncable.java new file mode 100644 index 0000000..01a1264 --- /dev/null +++ b/src/main/java/com/spun/util/database/Syncable.java @@ -0,0 +1,6 @@ +package com.spun.util.database; + +public interface Syncable +{ + public void sync(DatabaseCache cache); +} diff --git a/src/main/java/com/spun/util/database/TemporaryCache.java b/src/main/java/com/spun/util/database/TemporaryCache.java new file mode 100644 index 0000000..1a200e6 --- /dev/null +++ b/src/main/java/com/spun/util/database/TemporaryCache.java @@ -0,0 +1,97 @@ +package com.spun.util.database; + +import java.sql.SQLException; +import java.sql.Statement; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +public class TemporaryCache implements DatabaseCache +{ + private Map cache = null; + private Class defaultClass = null; + private boolean linkBack = true; + /**************************************************************************/ + public TemporaryCache(T object) + { + this(object, true); + } + /**************************************************************************/ + public TemporaryCache(T object, boolean linkBack) + { + this.linkBack = linkBack; + if (object != null) + { + defaultClass = object.getClass(); + cache = Collections.singletonMap(object.getPkey(), object); + } + else + { + cache = Collections.EMPTY_MAP; + } + } + /**************************************************************************/ + public TemporaryCache(T objects[]) + { + this(objects, true); + } + /**************************************************************************/ + public TemporaryCache(T objects[], boolean linkBack) + { + this.linkBack = linkBack; + cache = new HashMap(objects.length); + for (int i = 0; i < objects.length; i++) + { + cache.put(objects[i].getPkey(), objects[i]); + if (i == 0) + { + defaultClass = objects[i].getClass(); + } + else if (defaultClass != objects[i].getClass()) + { + defaultClass = null; + } + } + } + /**************************************************************************/ + public void forceGenericObjectType() + { + defaultClass = null; + } + /**************************************************************************/ + public Class getObjectType() + { + return defaultClass; + } + /**************************************************************************/ + public boolean isLinkBackOn() + { + return linkBack; + } + /**************************************************************************/ + /** + * loads the chache from the database + **/ + public synchronized void load(Statement stmt) throws SQLException + { + throw new UnsupportedOperationException("This only supports loaded objects"); + } + /**************************************************************************/ + /** + * clears the cache and reloads it from the database + **/ + public void reset(Statement stmt) throws SQLException + { + throw new UnsupportedOperationException("This only supports loaded objects"); + } + /**************************************************************************/ + /** + * @return the object from the cache with the corosponding pkey + **/ + public T get(int pkey) + { + return cache.get(pkey); + } + /**************************************************************************/ + /**************************************************************************/ +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/database/XmlDatabaseMapExtractor.java b/src/main/java/com/spun/util/database/XmlDatabaseMapExtractor.java new file mode 100644 index 0000000..1a60d40 --- /dev/null +++ b/src/main/java/com/spun/util/database/XmlDatabaseMapExtractor.java @@ -0,0 +1,60 @@ +package com.spun.util.database; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import org.w3c.dom.Node; +import com.spun.util.ObjectUtils; +import com.spun.util.io.xml.XmlExtractable; +import com.spun.util.io.xml.XmlExtractor; +import com.spun.util.io.xml.XmlExtractorUtil; +import com.spun.util.io.xml.XmlMap; +import com.spun.util.io.xml.XmlMapTranslator; +import com.spun.util.io.xml.XmlTranslator; + +/***********************************************************************/ +public class XmlDatabaseMapExtractor implements XmlExtractor +{ + private Class clazz; + private XmlTranslator translator; + private Method creator = null; + /***********************************************************************/ + public XmlDatabaseMapExtractor(Class clazz) + { + this.clazz = clazz; + } + /***********************************************************************/ + public Object extractObjectForNode(Node node) + { + try + { + Object object = getCreator().invoke(null,(Object[])null); + XmlExtractorUtil.extractAndTranslateForNode(node, object, getTranslator()); + return object; + } + catch (Throwable t) + { + throw ObjectUtils.throwAsError(t); + } + } + /***********************************************************************/ + private XmlTranslator getTranslator() throws IllegalArgumentException, SecurityException, IllegalAccessException, InvocationTargetException, NoSuchMethodException, InstantiationException + { + if (translator == null) + { + XmlMap[] xmlMaps = ((XmlExtractable) getCreator().invoke(null,(Object[])null)).getXmlMap(); + this.translator = XmlMapTranslator.get(clazz, xmlMaps); + } + return translator; + } + /***********************************************************************/ + private Method getCreator() throws SecurityException, NoSuchMethodException + { + if (creator == null) + { + this.creator = clazz.getMethod("create", (Class[])null); + } + return creator; + } + /***********************************************************************/ + /***********************************************************************/ +} diff --git a/src/main/java/com/spun/util/date/DateRange.java b/src/main/java/com/spun/util/date/DateRange.java new file mode 100644 index 0000000..c4ef149 --- /dev/null +++ b/src/main/java/com/spun/util/date/DateRange.java @@ -0,0 +1,182 @@ +package com.spun.util.date; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; + +import com.spun.util.DateUtils; +import com.spun.util.MethodExecutionPath; +import com.spun.util.ObjectUtils; +import com.spun.util.filters.Filter; +import com.spun.util.parser.TemplateDate; + +public class DateRange +{ + public static final DateRange ALL = new DateRange(new Date(0), new Date(Long.MAX_VALUE)); + private final Date end; + private final Date start; + /************************************************************************/ + public DateRange(Date start, Date end) + { + this.start = start; + this.end = end; + } + /************************************************************************/ + public Filter getFilter(Class clazz, String... methodCalls) + { + return getFilter(new MethodExecutionPath(clazz, methodCalls)); + } + /************************************************************************/ + public Filter getFilter(MethodExecutionPath path) + { + return new DateRangeFilter(this, path); + } + /************************************************************************/ + public boolean contains(Date time) + { + time = (time == null) ? new Date() : time; + return (start.getTime() <= time.getTime()) && (time.getTime() < end.getTime()); + } + public static DateRange getRangeContaining(DateRange[] ranges, DateRange target) + { + for (DateRange dateRange : ranges) + { + if (dateRange.contains(target)) { return dateRange; } + } + return null; + } + private boolean contains(DateRange range) + { + return contains(range.end) || contains(range.start); + } + /************************************************************************/ + public Date getEnd() + { + return end; + } + /************************************************************************/ + public Date getStart() + { + return start; + } + /************************************************************************/ + @Override + public int hashCode() + { + return ObjectUtils.generateHashCode(start.getTime(), end.getTime()); + } + /************************************************************************/ + @Override + public boolean equals(Object object) + { + if (this == object) + { + return true; + } + else if (object instanceof DateRange) + { + DateRange that = (DateRange) object; + return this.start.getTime() == that.start.getTime() && this.end.getTime() == that.end.getTime(); + } + else + { + return false; + } + } + /************************************************************************/ + @Override + public String toString() + { + return String.format("[%s - %s]", new TemplateDate(start).getDateAndTime(), new TemplateDate(end) + .getDateAndTime()); + } + /***********************************************************************/ + public DateRange[] getWeeks() + { + return getUnits(new WeekAware()); + } + private DateRange[] getUnits(UnitAware unit) + { + ArrayList ranges = new ArrayList(); + Calendar start = DateUtils.asCalendar(getStart()); + Calendar end = (Calendar) start.clone(); + while (!(getEnd().getTime() <= end.getTime().getTime())) + { + end.add(Calendar.DAY_OF_YEAR, 1); + if (unit.isStart(end) || getEnd().getTime() <= end.getTime().getTime()) + { + ranges.add(new DateRange(start.getTime(), end.getTime())); + start = (Calendar) end.clone(); + } + } + return ranges.toArray(new DateRange[ranges.size()]); + } + /***********************************************************************/ + public DateRange[] getMonths() + { + return getUnits(new MonthAware()); + } + public DateRange[] getQuarters() + { + return getUnits(new QuarterAware()); + } + /************************************************************************/ + public boolean containsDayOfWeek(int day) + { + return getFirst(day) != null; + } + public Date getFirst(int day) + { + Calendar start = DateUtils.asCalendar(getStart()); + while (start.getTime().getTime() <= getEnd().getTime()) + { + start.add(Calendar.DAY_OF_YEAR, 1); + if (start.get(Calendar.DAY_OF_WEEK) == day) { return start.getTime(); } + } + return null; + } + /************************************************************************/ + /* INNER CLASSES */ + /************************************************************************/ + public static class DateRangeFilter implements Filter + { + private final MethodExecutionPath path; + private final DateRange range; + public DateRangeFilter(DateRange range, MethodExecutionPath path) + { + this.range = range; + this.path = path; + } + public boolean isExtracted(Object object) throws IllegalArgumentException + { + return range.contains((Date) path.extractValue(object)); + } + } + public static interface UnitAware + { + public boolean isStart(Calendar end); + } + public static class WeekAware implements UnitAware + { + public boolean isStart(Calendar end) + { + return end.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY; + } + } + public static class MonthAware implements UnitAware + { + public boolean isStart(Calendar end) + { + return end.get(Calendar.DAY_OF_MONTH) == 1; + } + } + public static class QuarterAware implements UnitAware + { + public boolean isStart(Calendar end) + { + return end.get(Calendar.DAY_OF_MONTH) == 1 && end.get(Calendar.MONTH) % 3 == 0; + } + } + /************************************************************************/ + /************************************************************************/ +} diff --git a/src/main/java/com/spun/util/date/DateRangeUtils.java b/src/main/java/com/spun/util/date/DateRangeUtils.java new file mode 100644 index 0000000..c0e573b --- /dev/null +++ b/src/main/java/com/spun/util/date/DateRangeUtils.java @@ -0,0 +1,17 @@ +package com.spun.util.date; + +import java.sql.Timestamp; +import java.util.Date; + +import com.spun.util.DateUtils; + +public class DateRangeUtils +{ + public static DateRange getDay(Timestamp date) + { + Date start = DateUtils.getStartOfXDaysAgo(0, date); + Date end = DateUtils.getStartOfXDaysAgo(-1, date); + DateRange range = new DateRange(start, end); + return range; + } +} diff --git a/src/main/java/com/spun/util/filters/AndFilter.java b/src/main/java/com/spun/util/filters/AndFilter.java new file mode 100644 index 0000000..5240636 --- /dev/null +++ b/src/main/java/com/spun/util/filters/AndFilter.java @@ -0,0 +1,33 @@ +package com.spun.util.filters; + +/** + * Listens to the state of a EnabledConditions object + **/ + + +public class AndFilter + implements Filter +{ + private Filter filter1 = null; + private Filter filter2 = null; + + + /***********************************************************************/ + public AndFilter(Filter filter1,Filter filter2) + { + this.filter1 = filter1; + this.filter2 = filter2; + } + /***********************************************************************/ + /** + * @return true if the object would be extracted by the filter + * @throws IllegalArgumentException if the object is not supported by the filter + **/ + public boolean isExtracted(Object object) + throws IllegalArgumentException + { + return filter1.isExtracted(object) && filter2.isExtracted(object); + } + /**************************************************************************/ + /**************************************************************************/ +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/filters/ClassFilter.java b/src/main/java/com/spun/util/filters/ClassFilter.java new file mode 100644 index 0000000..68016a2 --- /dev/null +++ b/src/main/java/com/spun/util/filters/ClassFilter.java @@ -0,0 +1,18 @@ +package com.spun.util.filters; + +public class ClassFilter implements Filter +{ + private Class clazz; + /***********************************************************************/ + public ClassFilter(Class clazz) + { + this.clazz = clazz; + } + /***********************************************************************/ + public boolean isExtracted(Object object) throws IllegalArgumentException + { + return clazz.isInstance(object); + } + /***********************************************************************/ + /***********************************************************************/ +} diff --git a/src/main/java/com/spun/util/filters/Filter.java b/src/main/java/com/spun/util/filters/Filter.java new file mode 100644 index 0000000..cc1430a --- /dev/null +++ b/src/main/java/com/spun/util/filters/Filter.java @@ -0,0 +1,19 @@ +package com.spun.util.filters; + +/** + * Listens to the state of a EnabledConditions object + **/ + + +public interface Filter +{ + /***********************************************************************/ + /** + * @return true if the object would be extracted by the filter + * @throws IllegalArgumentException if the object is not supported by the filter + **/ + public boolean isExtracted(T object) + throws IllegalArgumentException; + /**************************************************************************/ + /**************************************************************************/ +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/filters/FilterIn.java b/src/main/java/com/spun/util/filters/FilterIn.java new file mode 100644 index 0000000..ed52c8b --- /dev/null +++ b/src/main/java/com/spun/util/filters/FilterIn.java @@ -0,0 +1,33 @@ +package com.spun.util.filters; + +import com.spun.util.ObjectUtils; + +/** + * Listens to the state of a EnabledConditions object + **/ + + +public class FilterIn + implements Filter +{ + private Object[] objects; + + + /***********************************************************************/ + public FilterIn(Object[] objects) + { + this.objects = objects; + } + /***********************************************************************/ + /** + * @return true if the object would be extracted by the filter + * @throws IllegalArgumentException if the object is not supported by the filter + **/ + public boolean isExtracted(Object object) + throws IllegalArgumentException + { + return ObjectUtils.isIn(object, objects); + } + /**************************************************************************/ + /**************************************************************************/ +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/filters/FilterUtils.java b/src/main/java/com/spun/util/filters/FilterUtils.java new file mode 100644 index 0000000..b1d7909 --- /dev/null +++ b/src/main/java/com/spun/util/filters/FilterUtils.java @@ -0,0 +1,78 @@ +package com.spun.util.filters; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; + +/** + * Listens to the state of a EnabledConditions object + **/ +public class FilterUtils +{ + /***********************************************************************/ + /** + * @return a new List containing all elements of the list for which isExtracted() would return true + **/ + public static ArrayList retainExtracted(Collection fromList, Filter filter) throws IllegalArgumentException + { + return filter(fromList, filter, true); + } + /***********************************************************************/ + /** + * @return a new List containing all elements of the list for which isExtracted() would return false + **/ + public static ArrayList retainPurified(List fromList, Filter filter) throws IllegalArgumentException + { + return filter(fromList, filter, false); + } + /***********************************************************************/ + /** + * @return a new List containing all elements of the list for which isExtracted() would return true + **/ + public static ArrayList retainExtracted(T fromObjects[], Filter filter) throws IllegalArgumentException + { + return fromObjects == null ? new ArrayList() : filter(Arrays.asList(fromObjects), filter, true); + } + /***********************************************************************/ + /** + * @return a new List containing all elements of the list for which isExtracted() would return true + **/ + private static ArrayList filter(Iterable collection, Filter filter, boolean retainExtracted) throws IllegalArgumentException + { + ArrayList extracted = new ArrayList(); + if (collection != null) + { + for (T t : collection) + { + boolean ex = (filter == null || filter.isExtracted(t)); + if (ex == retainExtracted) + { + extracted.add(t); + } + } + } + return extracted; + } + /***********************************************************************/ + /** + * @return a new List containing all elements of the list for which isExtracted() would return false + **/ + public static ArrayList retainPurified(T fromObjects[], Filter filter) throws IllegalArgumentException + { + return filter(Arrays.asList(fromObjects), filter, false); + } + /***********************************************************************/ + /* INNER CLASSES */ + /***********************************************************************/ + public static class FilterNotNull implements Filter + { + /***********************************************************************/ + public boolean isExtracted(Object object) throws IllegalArgumentException + { + return object != null; + } + } + /***********************************************************************/ + /***********************************************************************/ +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/filters/MethodFilter.java b/src/main/java/com/spun/util/filters/MethodFilter.java new file mode 100644 index 0000000..5703752 --- /dev/null +++ b/src/main/java/com/spun/util/filters/MethodFilter.java @@ -0,0 +1,79 @@ +package com.spun.util.filters; + +import java.util.Date; + +import com.spun.util.MethodExecutionPath; +import com.spun.util.ObjectUtils; + +/************************************************************************/ +/** + * @deprecated use Query.where() + */ +public class MethodFilter implements com.spun.util.filters.Filter +{ + private MethodExecutionPath path = null; + private Object value = null; + private CompareBy operation; + public enum CompareBy{GREATER_THAN_OR_EQUAL,LESS_THAN_OR_EQUAL,EQUAL} + + + /************************************************************************/ + public MethodFilter(Class clazz, Object value, String... methodNames) + { + this(new MethodExecutionPath(clazz, methodNames), CompareBy.EQUAL, value); + } + /************************************************************************/ + public MethodFilter(Class clazz, Object value, CompareBy operation, String... methodNames) + { + this(new MethodExecutionPath(clazz, methodNames), operation, value); + } + /************************************************************************/ + public MethodFilter(Class clazz, Object value, MethodExecutionPath path) + { + this(path, CompareBy.EQUAL, value); + } + /************************************************************************/ + public MethodFilter(MethodExecutionPath path, CompareBy operation, Object value) + { + this.value = value; + this.path = path; + this.operation = operation; + ObjectUtils.assertInstanceOrNull(path.getReturnType(), value); + } + public MethodFilter(Class clazz, Object value, String method, Object parameter) + { + this(MethodExecutionPath.method(clazz, method, parameter), CompareBy.EQUAL, value); + } + /************************************************************************/ + + public boolean isExtracted(Object object) throws IllegalArgumentException + { + ObjectUtils.assertInstance(path.getClassType(), object); + Object extracted = path.extractValue(object); + switch (operation) + { + case EQUAL: + return ObjectUtils.isEqual(extracted, value); + case GREATER_THAN_OR_EQUAL: + if (value instanceof Date) + { + ObjectUtils.assertInstance(Date.class, extracted); + return ((Date)value).getTime() >= ((Date)extracted).getTime() ; + } + ObjectUtils.assertInstance(Number.class, value); + ObjectUtils.assertInstance(Number.class, extracted); + return ((Number)value).doubleValue() >= ((Number)extracted).doubleValue() ; + default: + return false; + } + + } + public static MethodFilterBuilder on(Class clazz) + { + return new MethodFilterBuilder(clazz); + } + + + /************************************************************************/ + /************************************************************************/ +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/filters/MethodFilterBuilder.java b/src/main/java/com/spun/util/filters/MethodFilterBuilder.java new file mode 100644 index 0000000..2c14ccb --- /dev/null +++ b/src/main/java/com/spun/util/filters/MethodFilterBuilder.java @@ -0,0 +1,42 @@ +package com.spun.util.filters; + +import java.util.ArrayList; + +import com.spun.util.CallMethod; +import com.spun.util.filters.MethodFilter.CompareBy; + +public class MethodFilterBuilder +{ + + private CompareBy compareBy; + private Object value; + private CallMethod path; + + public MethodFilterBuilder(Class clazz) + { + this.path = new CallMethod(clazz); + } + + public MethodFilterBuilder isEqual(Object o) + { + compareBy = CompareBy.EQUAL; + value = o; + return this; + } + + public MethodFilterBuilder method(String methodName, Object... parameters) + { + path.method(methodName, parameters); + return this; + } + + public ArrayList filterExtracted(T[] all) + { + return FilterUtils.retainExtracted(all, getFilter()); + } + + public Filter getFilter() + { + return new MethodFilter(path.go(),compareBy,value); + } +} diff --git a/src/main/java/com/spun/util/filters/OrFilter.java b/src/main/java/com/spun/util/filters/OrFilter.java new file mode 100644 index 0000000..c643275 --- /dev/null +++ b/src/main/java/com/spun/util/filters/OrFilter.java @@ -0,0 +1,33 @@ +package com.spun.util.filters; + +/** + * Listens to the state of a EnabledConditions object + **/ + + +public class OrFilter + implements Filter +{ + private Filter filter1 = null; + private Filter filter2 = null; + + + /***********************************************************************/ + public OrFilter(Filter filter1,Filter filter2) + { + this.filter1 = filter1; + this.filter2 = filter2; + } + /***********************************************************************/ + /** + * @return true if the object would be extracted by the filter + * @throws IllegalArgumentException if the object is not supported by the filter + **/ + public boolean isExtracted(Object object) + throws IllegalArgumentException + { + return filter1.isExtracted(object) || filter2.isExtracted(object); + } + /**************************************************************************/ + /**************************************************************************/ +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/introspection/ClassGetter.java b/src/main/java/com/spun/util/introspection/ClassGetter.java new file mode 100644 index 0000000..4eb2dd4 --- /dev/null +++ b/src/main/java/com/spun/util/introspection/ClassGetter.java @@ -0,0 +1,31 @@ +package com.spun.util.introspection; + +import java.io.File; +import java.util.ArrayList; + +import com.spun.util.io.FileUtils; +import com.spun.util.io.filefilters.JavaClassFileFilter; + +public class ClassGetter +{ + public static ArrayList getClasses(String packageName, String classSuffix) throws ClassNotFoundException + { + ArrayList classes = new ArrayList(); + File[] testFiles = FileUtils.getRecursiveFileList(new File("."), new JavaClassFileFilter(packageName, classSuffix)); + String pathHead = packageName.substring(0, packageName.indexOf('.')); + for (int i = 0; i < testFiles.length; i++) + { + Class clazz = Class.forName(getJavaName(testFiles[i], pathHead)); + classes.add(clazz); + } + return classes; + } + private static String getJavaName(File file, String pathHead) + { + String path = file.getAbsolutePath(); + String extension = ".class"; + String fullName = path.substring(path.indexOf(File.separator + pathHead + File.separator) + 1, path.length() + - extension.length()); + return fullName.replace(File.separatorChar, '.'); + } +} diff --git a/src/main/java/com/spun/util/io/CharSequenceInputStream.java b/src/main/java/com/spun/util/io/CharSequenceInputStream.java new file mode 100644 index 0000000..37d9338 --- /dev/null +++ b/src/main/java/com/spun/util/io/CharSequenceInputStream.java @@ -0,0 +1,12 @@ +package com.spun.util.io; + +import java.io.IOException; +import java.io.InputStream; + +public class CharSequenceInputStream extends InputStream { + @Override + public int read() throws IOException { + // TODO Auto-generated method stub + return 0; + } +} diff --git a/src/main/java/com/spun/util/io/CommaDelimitedFileParser.java b/src/main/java/com/spun/util/io/CommaDelimitedFileParser.java new file mode 100644 index 0000000..d0d7473 --- /dev/null +++ b/src/main/java/com/spun/util/io/CommaDelimitedFileParser.java @@ -0,0 +1,151 @@ +package com.spun.util.io; + +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.io.Reader; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import com.spun.util.StringUtils; + +public class CommaDelimitedFileParser +{ + /***********************************************************************/ + public static String[][] parse(File databaseFile) + { + return parse(FileUtils.readFileWithSuppressedExceptions(databaseFile)); + } + /***********************************************************************/ + public static String[][] parse(String data) + { + return parse(new StringReader(data)); + } + /***********************************************************************/ + public static String[][] parse(Reader data) + { + try + { + List records = new ArrayList(); + BufferedReader reader = new BufferedReader(data); + boolean done = false; + StringBuffer pastLines = null; + while (!done) + { + String line = reader.readLine(); + if (line == null) + { + done = true; + } + else + { + if (pastLines != null) + { + pastLines.append("\r\n"); + pastLines.append(line); + line = pastLines.toString(); + } + String[] parseLine = parseLine(line); + if (parseLine == null) + { + if (pastLines == null) + { + pastLines = new StringBuffer(line); + } + } + else + { + records.add(parseLine); + pastLines = null; + } + } + } + return records.toArray(new String[records.size()][]); + } + catch (IOException e) + { + throw new RuntimeException(e); + } + } + /***********************************************************************/ + private static String[] parseLine(String line) throws IOException + { + String[] rawtokens = StringUtils.split(line, ",", false); + boolean in = false; + List tokens = new ArrayList(); + String fullToken = null; + for (int i = 0; i < rawtokens.length; i++) + { + String string = rawtokens[i]; + if (in) + { + fullToken += ","; + fullToken += string; + if (fullToken.endsWith("\"")) + { + tokens.add(clearQuotes(fullToken)); + in = false; + } + } + else + { + if (string.startsWith("\"") && !string.endsWith("\"")) + { + fullToken = string; + in = true; + } + else + { + tokens.add(clearQuotes(string)); + } + } + } + return in ? null : StringUtils.toArray(tokens); + } + /***********************************************************************/ + private static String clearQuotes(String string) + { + String s = (string.startsWith("\"") && string.endsWith("\"")) + ? string.substring(1, string.length() - 1) + : string; + return s.trim(); + } + /***********************************************************************/ + public static Map[] parseToMap(File file) + { + try + { + return parseToMap(FileUtils.readFileWithSuppressedExceptions(file)); + } + catch (RuntimeException e) + { + System.out.println("Filename : " + file.toString()); + throw e; + } + } + /***********************************************************************/ + public static Map[] parseToMap(String data) + { + return parseToMap(new StringReader(data)); + } + public static Map[] parseToMap(Reader data) + { + String[][] out = parse(data); + Map[] maps = new HashMap[out.length - 1]; + String[] labels = out[0]; + for (int i = 1; i < out.length; i++) + { + Map map = new HashMap(labels.length); + for (int j = 0; j < labels.length; j++) + { + map.put(labels[j], out[i][j]); + } + maps[i - 1] = map; + } + return maps; + } + /***********************************************************************/ + /***********************************************************************/ +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/io/FTPConfig.java b/src/main/java/com/spun/util/io/FTPConfig.java new file mode 100644 index 0000000..de0be9d --- /dev/null +++ b/src/main/java/com/spun/util/io/FTPConfig.java @@ -0,0 +1,22 @@ +package com.spun.util.io; + + +/** + * A static class of convence functions for Files + **/ +public class FTPConfig +{ + public static final int DEFUALT_FTP_PORT = 21; + public String host, userName, password; + public int port = 0; + /***********************************************************************/ + public FTPConfig(String host,int port, String userName,String password) + { + this.host = host; + this.port = port; + this.userName = userName; + this.password = password; + } + /************************************************************************/ + /************************************************************************/ +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/io/FileMonitor.java b/src/main/java/com/spun/util/io/FileMonitor.java new file mode 100644 index 0000000..fdbca9d --- /dev/null +++ b/src/main/java/com/spun/util/io/FileMonitor.java @@ -0,0 +1,69 @@ +package com.spun.util.io; + +import java.io.File; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.Timer; +import java.util.TimerTask; + +public class FileMonitor +{ + private Timer timer; + private Map files; + private Set listeners; + public FileMonitor(long pollingInterval) + { + files = new HashMap(); + listeners = new HashSet(); + timer = new Timer(true); + timer.schedule(new FileMonitorNotifier(), 0, pollingInterval); + } + public void stop() + { + timer.cancel(); + } + public void addFile(File file) + { + if (!files.containsKey(file)) + { + files.put(file, (file.exists() ? file.lastModified() : -1L)); + } + } + public void removeFile(File file) + { + files.remove(file); + } + public void addListener(FileListener fileListener) + { + listeners.add(fileListener); + } + public void removeListener(FileListener fileListener) + { + listeners.remove(fileListener); + } + private class FileMonitorNotifier extends TimerTask + { + public void run() + { + for (File file : files.keySet()) + { + long lastModifiedTime = ((Long) files.get(file)).longValue(); + long newModifiedTime = file.exists() ? file.lastModified() : -1; + if (newModifiedTime != lastModifiedTime) + { + files.put(file, newModifiedTime); + for (FileListener listener : listeners) + { + listener.fileChanged(file); + } + } + } + } + } + public interface FileListener + { + void fileChanged(File file); + } +} diff --git a/src/main/java/com/spun/util/io/FileMonitorTest.java b/src/main/java/com/spun/util/io/FileMonitorTest.java new file mode 100644 index 0000000..e8f121b --- /dev/null +++ b/src/main/java/com/spun/util/io/FileMonitorTest.java @@ -0,0 +1,52 @@ +package com.spun.util.io; + +import java.io.File; +import junit.framework.TestCase; +import com.spun.util.io.FileMonitor.FileListener; + +public class FileMonitorTest extends TestCase +{ + FileMonitor monitor; + File root; + boolean done; + protected void setUp() throws Exception + { + File filea = File.createTempFile("tmp", "tmp"); + root = new File(filea.getParent() + File.separator + "fileMonitorRoot"); + root.mkdir(); + filea.delete(); + monitor = new FileMonitor(100); + monitor.addFile(root); + monitor.addListener(this.new TestListener()); + Thread.sleep(1000); + } + protected void tearDown() throws Exception + { + monitor.stop(); + root.delete(); + } + public void testNewFileDetected() throws Exception + { + done = false; + File targetFile = File.createTempFile("tmp", ".dbf", root); + for (int i = 0; i < 100 && !done; i++) + { + Thread.sleep(1000); + } + try + { + assertEquals("File processed", true, done); + } + finally + { + targetFile.delete(); + } + } + private class TestListener implements FileListener + { + public void fileChanged(File file) + { + done = true; + } + } +} diff --git a/src/main/java/com/spun/util/io/FileUtils.java b/src/main/java/com/spun/util/io/FileUtils.java new file mode 100644 index 0000000..f29fa29 --- /dev/null +++ b/src/main/java/com/spun/util/io/FileUtils.java @@ -0,0 +1,345 @@ +package com.spun.util.io; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.DataOutputStream; +import java.io.File; +import java.io.FileFilter; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.Reader; +import java.nio.channels.FileChannel; +import java.util.ArrayList; +import java.util.List; + +import com.spun.util.ArrayUtils; +import com.spun.util.Asserts; +import com.spun.util.ObjectUtils; + +/** + * A static class of convenience functions for Files + **/ +public class FileUtils +{ + /***********************************************************************/ + /** + * @see java.io.File.createTempFile(String,String) + **/ + public static File createTempDirectory() throws IOException + { + File tempFile = File.createTempFile("TEMP", null); + tempFile.delete(); + tempFile.mkdirs(); + return tempFile; + } + /***********************************************************************/ + public static void deleteDirectory(File directory) throws IOException + { + // delete all directory + File directories[] = directory.listFiles(new SimpleDirectoryFilter()); + for (int i = 0; i < directories.length; i++) + { + deleteDirectory(directories[i]); + } + // Delete all Files. + File files[] = directory.listFiles(new SimpleFileFilter()); + for (int i = 0; i < files.length; i++) + { + files[i].delete(); + } + // delete self. + directory.delete(); + } + public static String readFromClassPath(Class clazz, String string) + { + final InputStream resourceAsStream = clazz.getClassLoader().getResourceAsStream(string); + if (resourceAsStream == null) + { + String message = String.format("Could not find %s from %s", string, clazz.getName()); + throw new RuntimeException(message); + } + String resource = FileUtils.readStream(resourceAsStream); + return resource; + } + /***********************************************************************/ + public static File[] getRecursiveFileList(File directory) + { + return getRecursiveFileList(directory, new SimpleFileFilter()); + } + /***********************************************************************/ + public static File[] getRecursiveFileList(File directory, FileFilter filter) + { + ArrayList list = new ArrayList(); + if (!directory.isDirectory()) { throw new Error("File is not a directory: " + directory.getName()); } + File directories[] = directory.listFiles(new SimpleDirectoryFilter()); + for (int i = 0; i < directories.length; i++) + { + ArrayUtils.addArray(list, getRecursiveFileList(directories[i], filter)); + } + File files[] = directory.listFiles(filter); + ArrayUtils.addArray(list, files); + return list.toArray(new File[list.size()]); + } + /***********************************************************************/ + public static void copyFile(File in, File out) + { + try + { + FileChannel inChannel = null, outChannel = null; + try + { + out.getParentFile().mkdirs(); + inChannel = new FileInputStream(in).getChannel(); + outChannel = new FileOutputStream(out).getChannel(); + outChannel.transferFrom(inChannel, 0, inChannel.size()); + } + finally + { + if (inChannel != null) + { + inChannel.close(); + } + if (outChannel != null) + { + outChannel.close(); + } + } + } + catch (Exception e) + { + ObjectUtils.throwAsError(e); + } + } + public static void copyStream(InputStream in, OutputStream out) throws IOException + { + byte[] buf = new byte[1024]; + int i = 0; + while ((i = in.read(buf)) != -1) + { + out.write(buf, 0, i); + } + in.close(); + out.close(); + } + /***********************************************************************/ + public static void redirectInputToFile(String fileName, InputStream in) throws Exception + { + FileOutputStream fos = new FileOutputStream(new File(fileName), false); + copyStream(in, fos); + } + /***********************************************************************/ + public static void copyFileToDirectory(String file, File tempDir) throws Exception + { + File in = new File(file); + File out = new File(tempDir, in.getName()); + copyFile(in, out); + } + /***********************************************************************/ + public static void writeFile(File file, String text) throws IOException + { + Asserts.assertNotNull("Writing to file: " + file, text); + file.getCanonicalFile().getParentFile().mkdirs(); + BufferedWriter out = new BufferedWriter(new FileWriter(file)); + out.write(text); + out.close(); + } + /***********************************************************************/ + public static void writeFileQuietly(File file, String text) + { + try + { + writeFile(file, text); + } + catch (IOException e) + { + ObjectUtils.throwAsError(e); + } + } + public static void writeFile(File file, CharSequence data) throws IOException + { + Asserts.assertNotNull("Writing to file: " + file, data); + file.getCanonicalFile().getParentFile().mkdirs(); + DataOutputStream writer = new DataOutputStream(new FileOutputStream(file)); + for (int i = 0; i < data.length(); i++) + { + writer.write(data.charAt(i)); + } + writer.close(); + } + public static void writeFile(File file, InputStream data) throws IOException + { + Asserts.assertNotNull("Writing to file: " + file, data); + file.getCanonicalFile().getParentFile().mkdirs(); + copyStream(data, new FileOutputStream(file)); + } + /***********************************************************************/ + public static String readFile(String absolutePath) throws IOException + { + return readFile(new File(absolutePath)); + } + /***********************************************************************/ + public static String readFile(File file) throws IOException + { + BufferedReader in = new BufferedReader(new FileReader(file)); + return readBuffer(in); + } + public static String readBuffer(BufferedReader in) throws IOException + { + StringBuffer string = new StringBuffer(); + while (in.ready()) + { + string.append(in.readLine()); + string.append("\n"); + } + in.close(); + return string.toString(); + } + /************************************************************************/ + public static String readFileWithSuppressedExceptions(File databaseFile) + { + try + { + return FileUtils.readFile(databaseFile); + } + catch (FileNotFoundException e) + { + throw new RuntimeException("Invalid file '" + databaseFile.getAbsolutePath() + "'", e); + } + catch (IOException e) + { + throw new RuntimeException(e); + } + } + /************************************************************************/ + public static File saveToFile(String prefix, Reader input) + { + File file; + BufferedWriter bw = null; + try + { + file = File.createTempFile(prefix, null); + bw = new BufferedWriter(new FileWriter(file)); + BufferedReader inputReader = new BufferedReader(input); + String thisLine; + while ((thisLine = inputReader.readLine()) != null) + { + bw.write(thisLine); + bw.newLine(); + } + inputReader.close(); + } + catch (IOException e) + { + throw new RuntimeException("Unable to store order: " + e.getMessage(), e); + } + finally + { + try + { + if (bw != null) + { + bw.close(); + } + } + catch (IOException e) + {} + } + return file; + } + /************************************************************************/ + public static String getDirectoryFriendlyName(String name) + { + if (name == null) { return ""; } + StringBuffer result = new StringBuffer(); + for (int i = 0; i < name.length(); i++) + { + char c = name.charAt(i); + switch (c) + { + case '.' : + break; + default : + result.append(c); + break; + } + } + return result.toString(); + } + /************************************************************************/ + /************************************************************************/ + public static String getExtensionWithDot(String filename) + { + int p = filename.lastIndexOf('.'); + return filename.substring(p); + } + public static String getExtensionWithoutDot(String filename) + { + return getExtensionWithDot(filename).substring(1); + } + public static void createIfNeeded(String file) throws IOException + { + File f = new File(file); + if (!f.exists()) + { + writeFile(f, ""); + } + } + public static String readStream(InputStream resourceAsStream) + { + BufferedReader reader = new BufferedReader(new InputStreamReader(resourceAsStream)); + String resource = null; + try + { + resource = FileUtils.readBuffer(reader); + } + catch (IOException e) + { + ObjectUtils.throwAsError(e); + } + return resource; + } + public static char[] loadResourceFromClasspathAsBytes(Class clazz, String name) throws IOException + { + return extractBytes(clazz.getResourceAsStream(name)); + } + public static char[] extractBytes(final InputStream resourceAsStream) throws IOException + { + ArrayList data = new ArrayList(); + int b = resourceAsStream.read(); + while (b != -1) + { + data.add(new Character((char) b)); + b = resourceAsStream.read(); + } + return FileUtils.toChars(data); + } + public static char[] toChars(List data) + { + char[] out = new char[data.size()]; + for (int i = 0; i < out.length; i++) + { + out[i] = data.get(i); + } + return out; + } + public static boolean isNonEmptyFile(String approved) + { + File file = new File(approved); + return file.exists() && file.length() > 0; + } + public static void ensureParentDirectoriesExist(File file) + { + File dir = file.getParentFile(); + if (!dir.exists()) + { + dir.mkdirs(); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/io/InternetConnectivityException.java b/src/main/java/com/spun/util/io/InternetConnectivityException.java new file mode 100644 index 0000000..0b7266b --- /dev/null +++ b/src/main/java/com/spun/util/io/InternetConnectivityException.java @@ -0,0 +1,77 @@ +package com.spun.util.io; + +import java.net.InetAddress; + +import org.apache.commons.net.EchoTCPClient; + +import com.spun.util.MySystem; + +/** + * A static class of convenience functions for Files + **/ +public class InternetConnectivityException extends Error +{ + private String htmlText; + private Throwable cause; + + /***********************************************************************/ + public void setCause(Throwable t) + { + this.cause = t; + } + /***********************************************************************/ + + public InternetConnectivityException(String string) + { + super(string); + } + /***********************************************************************/ + public void setHTMLText(String htmlText) + { + this.htmlText = htmlText; + } + /***********************************************************************/ + public String getHTMLText() + { + return htmlText; + } + /***********************************************************************/ + public static InternetConnectivityException testInternetConnectivity() + { + String[] sites = {"www.google.com", "www.yahoo.com", "www.msn.com"}; + + for (int i = 0; i < sites.length; i++) + { + if (pingSite(sites[i])) { return null; } + } + return new InternetConnectivityException("There is no internet connection."); + } + + /***********************************************************************/ + public String toString() + { + return super.toString() + "\n" + (cause == null ? "" : "Causation: " + cause.toString()); + } + /***********************************************************************/ + + private static boolean pingSite(String site) + { + try + { + EchoTCPClient client = new EchoTCPClient(); + client.setDefaultTimeout(1000); + client.connect(InetAddress.getByName(site), 80); + client.disconnect(); + return true; + } + catch (Exception e) + { + MySystem.warning(site, e); + return false; + } + + } + /***********************************************************************/ + /************************************************************************/ + +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/io/NetUtils.java b/src/main/java/com/spun/util/io/NetUtils.java new file mode 100644 index 0000000..ac8ffcc --- /dev/null +++ b/src/main/java/com/spun/util/io/NetUtils.java @@ -0,0 +1,116 @@ +package com.spun.util.io; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; + +import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.httpclient.HttpException; +import org.apache.commons.httpclient.methods.GetMethod; +import org.apache.commons.net.ftp.FTP; +import org.apache.commons.net.ftp.FTPClient; +import org.apache.commons.net.ftp.FTPReply; + +import com.spun.util.MySystem; +import com.sshtools.j2ssh.SftpClient; +import com.sshtools.j2ssh.SshClient; +import com.sshtools.j2ssh.authentication.PasswordAuthenticationClient; +import com.sshtools.j2ssh.transport.IgnoreHostKeyVerification; + +/** + * A static class of convenience functions for Files + **/ +public class NetUtils +{ + /***********************************************************************/ + public static void ftpUpload(FTPConfig config, String directory, File file, String remoteFileName) + throws IOException + { + FTPClient server = new FTPClient(); + server.connect(config.host, config.port); + assertValidReplyCode(server.getReplyCode(), server); + server.login(config.userName, config.password); + assertValidReplyCode(server.getReplyCode(), server); + assertValidReplyCode(server.cwd(directory), server); + server.setFileTransferMode(FTP.IMAGE_FILE_TYPE); + server.setFileType(FTP.IMAGE_FILE_TYPE); + server.storeFile(remoteFileName, new FileInputStream(file)); + assertValidReplyCode(server.getReplyCode(), server); + server.sendNoOp(); + server.disconnect(); + } + /***********************************************************************/ + public static void ftpUpload(FTPConfig config, String directory, File file) throws IOException + { + ftpUpload(config, directory, file, file.getName()); + } + /***********************************************************************/ + public static void sftpUpload(FTPConfig config, File file, String remoteFileName) throws IOException + { + SshClient ssh = new SshClient(); + SftpClient sftp = sshLogin(config, ssh); + sftp.mkdirs(remoteFileName.substring(0, remoteFileName.lastIndexOf("/"))); + sftp.put(new FileInputStream(file), remoteFileName); + sftp.quit(); + ssh.disconnect(); + } + /************************************************************************/ + private static SftpClient sshLogin(FTPConfig config, SshClient ssh) throws IOException + { + ssh.setSocketTimeout(60000); + ssh.connect(config.host, new IgnoreHostKeyVerification()); + PasswordAuthenticationClient pwd = new PasswordAuthenticationClient(); + pwd.setUsername(config.userName); + pwd.setPassword(config.password); + ssh.authenticate(pwd); + SftpClient sftp = ssh.openSftpClient(); + return sftp; + } + /************************************************************************/ + public static File sftpDownload(FTPConfig config, File file, String remoteFileName) throws IOException + { + SshClient ssh = new SshClient(); + SftpClient sftp = sshLogin(config, ssh); + sftp.get(remoteFileName, new FileOutputStream(file)); + sftp.quit(); + ssh.disconnect(); + return file; + } + /***********************************************************************/ + private static void assertValidReplyCode(int code, FTPClient ftp) + { + if (FTPReply.isPositiveCompletion(code)) + { + //good + MySystem.variable("Good Completion code " + code); + } + else if (FTPReply.isPositiveIntermediate(code)) + { + // do nothing + MySystem.variable("Good Intermediate code " + code); + } + else if (FTPReply.isPositivePreliminary(code)) + { + // do nothing + MySystem.variable("Good Preliminary code " + code); + } + else + { + // bad + throw new Error("Problem encountered with FTP Server, returned Code " + code + ", replied '" + + ftp.getReplyString() + "'"); + } + } + /***********************************************************************/ + /************************************************************************/ + public static String loadWebPage(String url, String parameters) throws IOException, HttpException + { + HttpClient client = new HttpClient(); + GetMethod method = new GetMethod(url); + method.setQueryString(parameters); + client.executeMethod(method); + String html = method.getResponseBodyAsString(); + return html; + } +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/io/SimpleDirectoryFilter.java b/src/main/java/com/spun/util/io/SimpleDirectoryFilter.java new file mode 100644 index 0000000..3559a2e --- /dev/null +++ b/src/main/java/com/spun/util/io/SimpleDirectoryFilter.java @@ -0,0 +1,35 @@ +package com.spun.util.io; + +import java.io.File; + +public class SimpleDirectoryFilter + implements java.io.FileFilter +{ + /************************************************************************/ + public SimpleDirectoryFilter() + { + } + + /***********************************************************************/ + + public boolean accept(File pathname) + { + String name = pathname.getName().toLowerCase(); + boolean accept = false; + if (name.equals(".") || name .equals("..")) + { + accept = false; + } + else if (pathname.isDirectory()) + { + accept = true; + } + else + { + accept = false; + } + return accept; + } + /************************************************************************/ + /************************************************************************/ +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/io/SimpleFileFilter.java b/src/main/java/com/spun/util/io/SimpleFileFilter.java new file mode 100644 index 0000000..fdd3ac4 --- /dev/null +++ b/src/main/java/com/spun/util/io/SimpleFileFilter.java @@ -0,0 +1,32 @@ +package com.spun.util.io; + +import java.io.File; + +public class SimpleFileFilter implements java.io.FileFilter +{ + /************************************************************************/ + public SimpleFileFilter() + { + } + /***********************************************************************/ + public boolean accept(File pathname) + { + String name = pathname.getName().toLowerCase(); + boolean accept = false; + if (name.equals(".") || name.equals("..")) + { + accept = false; + } + else if (pathname.isDirectory()) + { + accept = false; + } + else + { + accept = true; + } + return accept; + } + /************************************************************************/ + /************************************************************************/ +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/io/SpaceDelimitedReader.java b/src/main/java/com/spun/util/io/SpaceDelimitedReader.java new file mode 100644 index 0000000..4103d2e --- /dev/null +++ b/src/main/java/com/spun/util/io/SpaceDelimitedReader.java @@ -0,0 +1,89 @@ +package com.spun.util.io; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.StringReader; + +import com.spun.util.MySystem; + +/** + * A static class of convence functions for Files + **/ +public class SpaceDelimitedReader +{ + private BufferedReader reader = null; + private String lastRead = null; + public boolean trim = false; + /************************************************************************/ + public SpaceDelimitedReader(String input, boolean trim) + { + this.reader = new BufferedReader(new StringReader(input)); + this.trim = trim; + } + /***********************************************************************/ + public boolean next() throws IOException + { + return prepNext() != null; + } + /***********************************************************************/ + public String prepNext() throws IOException + { + if (reader == null) { return null; } + lastRead = reader.readLine(); + if (lastRead == null) + { + reader.close(); + reader = null; + } + MySystem.variable(lastRead); + return lastRead; + } + /***********************************************************************/ + public String[] readLine(int i) throws IOException + { + return readLine(new int[] {i}); + } + /***********************************************************************/ + public String[] readLine(int[] breakPoints) throws IOException + { + if (lastRead == null) + { + if (prepNext() == null) + { + return null; + } + } + String[] found = splitStringAtPoints(breakPoints, lastRead, trim); + + lastRead = null; + return found; + } + /***********************************************************************/ + public static String[] splitStringAtPoints(int[] breakPoints, String line, boolean trim) + { + if (line == null) { return null; } + if (breakPoints == null) + { + breakPoints = new int[0]; + } + String[] found = new String[breakPoints.length + 1]; + int last = 0; + for (int i = 0; i < breakPoints.length; i++) + { + found[i] = readStringPart(line, last, breakPoints[i], trim); + last = breakPoints[i]; + } + found[breakPoints.length] = readStringPart(line, last, line.length(), trim); + return found; + } + /***********************************************************************/ + public static String readStringPart(String string, int start, int end, boolean trim) + { + if (start >= string.length()) { return null; } + String found = string.substring(start, end); + return trim ? found.trim() : found; + } + /***********************************************************************/ + /***********************************************************************/ + +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/io/StackElementLevelSelector.java b/src/main/java/com/spun/util/io/StackElementLevelSelector.java new file mode 100644 index 0000000..04ba64e --- /dev/null +++ b/src/main/java/com/spun/util/io/StackElementLevelSelector.java @@ -0,0 +1,17 @@ +/** + * + */ +package com.spun.util.io; + +public class StackElementLevelSelector implements StackElementSelector +{ + private final int ignoreLevels; + public StackElementLevelSelector(int ignoreLevels) + { + this.ignoreLevels = ignoreLevels; + } + public StackTraceElement selectElement(StackTraceElement[] trace) + { + return trace[ignoreLevels + 1]; + } +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/io/StackElementSelector.java b/src/main/java/com/spun/util/io/StackElementSelector.java new file mode 100644 index 0000000..560160a --- /dev/null +++ b/src/main/java/com/spun/util/io/StackElementSelector.java @@ -0,0 +1,6 @@ +package com.spun.util.io; + +public interface StackElementSelector +{ + public abstract StackTraceElement selectElement(StackTraceElement[] trace) throws Exception; +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/io/TabDelimitedFileReader.java b/src/main/java/com/spun/util/io/TabDelimitedFileReader.java new file mode 100644 index 0000000..8ea4b81 --- /dev/null +++ b/src/main/java/com/spun/util/io/TabDelimitedFileReader.java @@ -0,0 +1,77 @@ +package com.spun.util.io; + +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; + +import com.spun.util.StringUtils; + +/** + * A static class of convence functions for Files + **/ +public class TabDelimitedFileReader +{ + private BufferedReader reader = null; + private String lastRead = null; + private boolean trim = false; + /************************************************************************/ + public TabDelimitedFileReader(String absoluteFileName, boolean trim) throws FileNotFoundException + { + this.reader = new BufferedReader(new FileReader(absoluteFileName)); + this.trim = trim; + } + /***********************************************************************/ + public boolean next() throws IOException + { + return prepNext() != null; + } + /***********************************************************************/ + public String prepNext() throws IOException + { + if (reader == null) { return null; } + lastRead = reader.readLine(); + if (lastRead == null) + { + reader.close(); + reader = null; + } + return lastRead; + } + /***********************************************************************/ + public String[] readLine(int minimumIndexReturned) throws IOException + { + if (lastRead == null) + { + if (prepNext() == null) + { + return null; + } + } + String[] found = StringUtils.split(lastRead, "\t", trim); + clean(found); + if (found.length < minimumIndexReturned) + { + String[] temp = new String[minimumIndexReturned]; + System.arraycopy(found, 0, temp, 0, found.length); + found = temp; + } + lastRead = null; + return found; + } + /***********************************************************************/ + private void clean(String[] found) + { + for (int i = 0; i < found.length; i++) + { + if (found[i] != null && found[i].startsWith("\"") && found[i].endsWith("\"")) + { + found[i] = found[i].substring(1, found[i].length()-1); + found[i] = found[i].replaceAll("\"\"", "\""); + } + } + } + /***********************************************************************/ + /************************************************************************/ + +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/io/XMLNodeExtractor.java b/src/main/java/com/spun/util/io/XMLNodeExtractor.java new file mode 100644 index 0000000..fd9e484 --- /dev/null +++ b/src/main/java/com/spun/util/io/XMLNodeExtractor.java @@ -0,0 +1,35 @@ +package com.spun.util.io; + +import java.util.HashMap; + +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import com.spun.util.StringUtils; + + +public interface XMLNodeExtractor +{ + /***********************************************************************/ + public void extractProperty(Node node, HashMap properties); + /************************************************************************/ + /* INNER CLASS */ + /************************************************************************/ + public static class Utils + { + public static boolean extractSingleton(Node node, HashMap properties) + { + String name = node.getNodeName(); + + NodeList childNodes = node.getChildNodes(); + if ((childNodes.getLength() == 1) && (childNodes.item(0).getChildNodes().getLength() == 0)) + { + properties.put(name, StringUtils.loadNullableString(childNodes.item(0).getNodeValue())); + return true; + } + return false; + } + } + /************************************************************************/ + /************************************************************************/ +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/io/XMLUtils.java b/src/main/java/com/spun/util/io/XMLUtils.java new file mode 100644 index 0000000..a9ddd1a --- /dev/null +++ b/src/main/java/com/spun/util/io/XMLUtils.java @@ -0,0 +1,107 @@ +package com.spun.util.io; + +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStream; +import java.io.StringReader; +import java.util.Arrays; +import java.util.HashMap; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; + +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.InputSource; + +import com.spun.util.MySystem; +import com.spun.util.StringUtils; + + +public class XMLUtils +{ + /***********************************************************************/ + public static String locateFile(String fileLocation, String backupPaths[]) throws Exception + { + String[] newArray = new String[backupPaths.length+1]; + System.arraycopy(backupPaths, 0, newArray, 1, backupPaths.length); + newArray[0] = "."; + backupPaths = newArray; + for (int i = 0; i < backupPaths.length; i++) + { + String tfileLocation = backupPaths[i] + File.separator + fileLocation; + File file = new File(tfileLocation); + if (file.exists()) + { + return file.getAbsolutePath(); + } + } + throw new Error(String.format("Couldn't find '%s' from locations %s with current directory '%s'" ,fileLocation ,Arrays.asList(backupPaths),new File(".").getAbsolutePath())); + } + /***********************************************************************/ + public static HashMap parseProperties(String absoluteFileLocation, XMLNodeExtractor extractor) throws Exception + { + try + { + FileInputStream stream = new FileInputStream(absoluteFileLocation); + Document document = parseXML(stream); + return extractProperties(document, extractor); + } + catch (Exception e) + { + MySystem.variable("Property File ", absoluteFileLocation); + throw e; + } + } + /***********************************************************************/ + + private static HashMap extractProperties(Document document, XMLNodeExtractor extractor) + { + HashMap properties = new HashMap(); + NodeList list = document.getDocumentElement().getChildNodes(); + for (int i = 0; i < list.getLength(); i++) + { + extractor.extractProperty(list.item(i), properties); + } + return properties; + } + /***********************************************************************/ + + public static Document parseXML(String xml) throws Exception + { + DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); + return builder.parse(new InputSource(new StringReader(xml))); + } + + /***********************************************************************/ + public static Document parseXML(File xml) throws Exception + { + return DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new FileInputStream(xml)); + } + /***********************************************************************/ + + public static Document parseXML(InputStream stream) throws Exception + { + return DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(stream); + } + /***********************************************************************/ + + public static String extractStringValue(Node node) + { + NodeList childNodes = node.getChildNodes(); + if ((childNodes.getLength() == 1) && (childNodes.item(0).getChildNodes().getLength() == 0)) + { + return StringUtils.loadNullableString(childNodes.item(0).getNodeValue()); + } + else if (childNodes.getLength() > 1) + { + throw new Error("Should not be multiple children for node '" + node.getNodeName()+ "'"); + } + return null; + } + /**********************************************************************/ + /************************************************************************/ + + +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/io/ZipUtils.java b/src/main/java/com/spun/util/io/ZipUtils.java new file mode 100644 index 0000000..163784f --- /dev/null +++ b/src/main/java/com/spun/util/io/ZipUtils.java @@ -0,0 +1,98 @@ +package com.spun.util.io; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; +import java.util.zip.ZipOutputStream; + +/** + * A static class of convence functions for Files + **/ +public class ZipUtils +{ + /***********************************************************************/ + public static File zipDirectory(String directory, String zipFileName) throws IOException + { + return zipDirectory(new File(directory), new File(zipFileName)); + } + /***********************************************************************/ + public static File zipDirectory(File directory, File zipFileName) throws IOException + { + return doCreateZipFile(FileUtils.getRecursiveFileList(directory), zipFileName); + } + /***********************************************************************/ + public static File doCreateZipFile(File[] files, File zipFile) throws IOException + { + byte[] buf = new byte[1024]; + zipFile.getParentFile().mkdirs(); + FileOutputStream fileOut = new FileOutputStream(zipFile); + ZipOutputStream out = new ZipOutputStream(fileOut); + // Compress the files + for (int i = 0; i < files.length; i++) + { + FileInputStream in = new FileInputStream(files[i]); + out.putNextEntry(new ZipEntry(files[i].getName())); + // Transfer bytes from the file to the ZIP file + int len; + while ((len = in.read(buf)) > 0) + { + out.write(buf, 0, len); + } + // Complete the entry + out.closeEntry(); + in.close(); + } + // Complete the ZIP file + out.close(); + fileOut.close(); + return zipFile; + } + /***********************************************************************/ + public static File[] doUnzip(File destination, File zipFile) throws IOException + { + ArrayList list = new ArrayList(); + byte[] buf = new byte[1024]; + FileInputStream fileIn = new FileInputStream(zipFile); + ZipInputStream in = new ZipInputStream(fileIn); + // DeCompress the files + ZipEntry entry = in.getNextEntry(); + while (entry != null) + { + File file = new File(destination, entry.getName()); + if (entry.isDirectory()) + { + file.mkdirs(); + } + else + { + list.add(file); + FileOutputStream out = new FileOutputStream(file); + // Transfer bytes from the file to the ZIP file + int len; + while ((len = in.read(buf)) > 0) + { + out.write(buf, 0, len); + } + // Complete the entry + in.closeEntry(); + out.close(); + } + entry = in.getNextEntry(); + } + // Complete the ZIP file + in.close(); + fileIn.close(); + return list.toArray(new File[0]); + } + /***********************************************************************/ + public static void main(String args[]) throws IOException + { + zipDirectory("c:\\t", "c:\\t\\t.zip"); + } + /************************************************************************/ + /************************************************************************/ +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/io/filefilters/ExtenstionFileFilter.java b/src/main/java/com/spun/util/io/filefilters/ExtenstionFileFilter.java new file mode 100644 index 0000000..f844ee8 --- /dev/null +++ b/src/main/java/com/spun/util/io/filefilters/ExtenstionFileFilter.java @@ -0,0 +1,22 @@ +package com.spun.util.io.filefilters; + +import java.io.File; +import java.io.FilenameFilter; + +public class ExtenstionFileFilter implements FilenameFilter +{ + private final String[] extenstions; + public ExtenstionFileFilter(String... extenstions) + { + this.extenstions = extenstions; + } + @Override + public boolean accept(File dir, String name) + { + for (String end : extenstions) + { + if (name.endsWith(end)) { return true; } + } + return false; + } +} diff --git a/src/main/java/com/spun/util/io/filefilters/JavaClassFileFilter.java b/src/main/java/com/spun/util/io/filefilters/JavaClassFileFilter.java new file mode 100644 index 0000000..6efa0e3 --- /dev/null +++ b/src/main/java/com/spun/util/io/filefilters/JavaClassFileFilter.java @@ -0,0 +1,23 @@ + +package com.spun.util.io.filefilters; + +import java.io.File; +import java.io.FileFilter; + +public class JavaClassFileFilter implements FileFilter +{ + private final String classSuffix; + private String startsWith; + private String pathHead; + public JavaClassFileFilter(String startsWith, String classSuffix) + { + this.classSuffix = classSuffix; + this.startsWith = startsWith.replace('.', File.separatorChar); + } + public boolean accept(File pathname) + { + String name = pathname.getName(); + boolean fileIsTest = name.endsWith(classSuffix + ".class") && pathname.toString().contains(startsWith); + return fileIsTest; + } +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/io/xml/BasicExtractor.java b/src/main/java/com/spun/util/io/xml/BasicExtractor.java new file mode 100644 index 0000000..5b34f80 --- /dev/null +++ b/src/main/java/com/spun/util/io/xml/BasicExtractor.java @@ -0,0 +1,106 @@ +package com.spun.util.io.xml; + +import java.sql.Timestamp; +import org.w3c.dom.Node; +import com.spun.util.io.XMLUtils; + +public class BasicExtractor +{ + /***********************************************************************/ + public static XmlExtractor get(Class clazz) + { + XmlExtractor extractor = null; + if (String.class.isAssignableFrom(clazz)) + { + extractor = StringExtractor.INSTANCE; + } + else if (double.class.isAssignableFrom(clazz) || Double.class.isAssignableFrom(clazz)) + { + extractor = DoubleExtractor.INSTANCE; + } + else if (Integer.class.isAssignableFrom(clazz) || int.class.isAssignableFrom(clazz)) + { + extractor = IntegerExtractor.INSTANCE; + } + else if (boolean.class.isAssignableFrom(clazz) || Boolean.class.isAssignableFrom(clazz)) + { + extractor = BooleanExtractor.INSTANCE; + } + else if (Timestamp.class.isAssignableFrom(clazz) || Timestamp.class.isAssignableFrom(clazz)) + { + extractor = TimestampExtractor.INSTANCE; + } + return extractor; + } + private static abstract class ExtractorBase implements XmlExtractor + { + public String toString() + { + String name = this.getClass().getName(); + int divider = name.lastIndexOf("$"); + return name.substring(divider + 1); + } + } + /***********************************************************************/ + public static class StringExtractor extends ExtractorBase + { + public static StringExtractor INSTANCE = new StringExtractor(); + private StringExtractor() + { + } + public Object extractObjectForNode(Node node) + { + return XMLUtils.extractStringValue(node); + } + } + /***********************************************************************/ + public static class DoubleExtractor extends ExtractorBase + { + public static DoubleExtractor INSTANCE = new DoubleExtractor(); + private DoubleExtractor() + { + } + public Object extractObjectForNode(Node node) + { + return Double.valueOf(XMLUtils.extractStringValue(node)); + } + } + /***********************************************************************/ + public static class IntegerExtractor extends ExtractorBase + { + public static IntegerExtractor INSTANCE = new IntegerExtractor(); + private IntegerExtractor() + { + } + public Object extractObjectForNode(Node node) + { + return Integer.valueOf(XMLUtils.extractStringValue(node)); + } + } + /***********************************************************************/ + public static class BooleanExtractor extends ExtractorBase + { + public static BooleanExtractor INSTANCE = new BooleanExtractor(); + private BooleanExtractor() + { + } + public Object extractObjectForNode(Node node) + { + return Boolean.valueOf(XMLUtils.extractStringValue(node)); + } + } + /***********************************************************************/ + public static class TimestampExtractor extends ExtractorBase + { + public static TimestampExtractor INSTANCE = new TimestampExtractor(); + private TimestampExtractor() + { + } + public Object extractObjectForNode(Node node) + { + return Timestamp.valueOf(XMLUtils.extractStringValue(node)); + } + } + /***********************************************************************/ + /***********************************************************************/ +} diff --git a/src/main/java/com/spun/util/io/xml/DatabaseObjectXMLUtils.java b/src/main/java/com/spun/util/io/xml/DatabaseObjectXMLUtils.java new file mode 100644 index 0000000..2bfcd47 --- /dev/null +++ b/src/main/java/com/spun/util/io/xml/DatabaseObjectXMLUtils.java @@ -0,0 +1,75 @@ +package com.spun.util.io.xml; + +import java.lang.reflect.Array; +import java.util.ArrayList; +import java.util.List; + +import org.lambda.functions.implementations.S1; +import org.lambda.query.Query; +import org.w3c.dom.Node; + +import com.spun.util.ClassUtils; +import com.spun.util.ObjectUtils; +import com.spun.util.database.DatabaseObject; +import com.spun.util.database.Syncable; +import com.spun.util.database.TemporaryCache; +import com.spun.util.database.XmlDatabaseMapExtractor; +import com.spun.util.filters.ClassFilter; +import com.spun.util.filters.FilterUtils; +import com.spun.util.io.XMLUtils; + +/***********************************************************************/ +public class DatabaseObjectXMLUtils +{ + /***********************************************************************/ + public static DatabaseObject[] extract(String xml, XmlMap[] xmlMaps) + { + try + { + DatabaseObject objects[] = extract(XMLUtils.parseXML(xml), xmlMaps); + TemporaryCache cache = new TemporaryCache(objects); + cache.forceGenericObjectType(); + for (int i = 0; i < objects.length; i++) + { + ((Syncable) objects[i]).sync(cache); + } + return Query.orderBy(objects, new S1(DatabaseObject.Null) + { + { + ret(a.getPkey()); + } + }); + } + catch (Throwable t) + { + throw ObjectUtils.throwAsError(t); + } + } + /***********************************************************************/ + private static DatabaseObject[] extract(Node node, XmlMap[] xmlMaps) throws Exception + { + ArrayList list = new ArrayList(); + XmlExtractorUtil.extractAndTranslateForNode(XmlExtractorUtil.traverseToTag("data", node), list, + XmlMapTranslator.get(ArrayList.class, xmlMaps)); + return list.toArray(new DatabaseObject[list.size()]); + } + /***********************************************************************/ + public static XmlMap map(Class clazz) + { + return new XmlMap(ClassUtils.getClassName(clazz), "add", new XmlDatabaseMapExtractor(clazz)); + } + /***********************************************************************/ + /***********************************************************************/ + public static T[] extractClass(Class clazz, DatabaseObject[] databaseObjects) + { + List list = FilterUtils.retainExtracted(databaseObjects, new ClassFilter(clazz)); + return list.toArray((T[]) Array.newInstance(clazz, list.size())); + } + public static void mockOld(DatabaseObject[] objects) + { + for (DatabaseObject object : objects) + { + object.setNew(false); + } + } +} diff --git a/src/main/java/com/spun/util/io/xml/XMLSerializable.java b/src/main/java/com/spun/util/io/xml/XMLSerializable.java new file mode 100644 index 0000000..aa7dd51 --- /dev/null +++ b/src/main/java/com/spun/util/io/xml/XMLSerializable.java @@ -0,0 +1,24 @@ +package com.spun.util.io.xml; + +import com.spun.util.database.DatabaseObject; + +public interface XMLSerializable +{ + /************************************************************************/ + /** + * Serializes this object , plus dependencies to xml. + * @return the xml + **/ + public String serializeXML(); + /************************************************************************/ + /** + * Serializes this object , plus dependencies to xml via the writer. + * @return writer that was used + **/ + public java.io.Writer serializeXML(java.io.Writer writer); + /************************************************************************/ + /** + * Serializes this object , plus dependencies to xml via the writer. + **/ + public void serializeXML(java.util.HashMap saved, java.io.Writer writer) throws java.io.IOException; +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/io/xml/XmlExtractable.java b/src/main/java/com/spun/util/io/xml/XmlExtractable.java new file mode 100644 index 0000000..81e509f --- /dev/null +++ b/src/main/java/com/spun/util/io/xml/XmlExtractable.java @@ -0,0 +1,12 @@ +package com.spun.util.io.xml; + +/***********************************************************************/ + +public interface XmlExtractable +{ + /***********************************************************************/ + public XmlMap[] getXmlMap(); + + /***********************************************************************/ + /***********************************************************************/ +} diff --git a/src/main/java/com/spun/util/io/xml/XmlExtractor.java b/src/main/java/com/spun/util/io/xml/XmlExtractor.java new file mode 100644 index 0000000..457b0ac --- /dev/null +++ b/src/main/java/com/spun/util/io/xml/XmlExtractor.java @@ -0,0 +1,18 @@ +package com.spun.util.io.xml; + +import java.lang.reflect.InvocationTargetException; + +import org.w3c.dom.Node; + +/***********************************************************************/ + +public interface XmlExtractor +{ + + /***********************************************************************/ + + public Object extractObjectForNode(Node node) + throws IllegalArgumentException, IllegalAccessException, InvocationTargetException, InstantiationException; + /***********************************************************************/ + /***********************************************************************/ +} diff --git a/src/main/java/com/spun/util/io/xml/XmlExtractorUtil.java b/src/main/java/com/spun/util/io/xml/XmlExtractorUtil.java new file mode 100644 index 0000000..5d8b244 --- /dev/null +++ b/src/main/java/com/spun/util/io/xml/XmlExtractorUtil.java @@ -0,0 +1,74 @@ +package com.spun.util.io.xml; + +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +public class XmlExtractorUtil +{ + /***********************************************************************/ + @SuppressWarnings("unchecked") + public static Object[] extract(Node node, String xmlName, Class clazz) + throws Exception + { + ArrayList list = new ArrayList(); + extractAndTranslateForNode(traverseToTag("XML", node), list, + XmlMapTranslator.get(ArrayList.class, new XmlMap[] { new XmlMap( + xmlName, "add", new XmlMapExtractor(clazz)) })); + return list.toArray(); + } + + /***********************************************************************/ + public static Node traverseToTag(String tag, Node node) + { + Node n = traverseToInnerTag(tag, node); + if (n == null) + { + throw new NullPointerException(String.format( + "The Tag '%s' could not be found from '%s'", tag, node)); + } + return n; + } + + /***********************************************************************/ + private static Node traverseToInnerTag(String tag, Node node) + { + String name = node.getNodeName(); + if (name.equals(tag)) + { + return node; + } else + { + NodeList childNodes = node.getChildNodes(); + for (int i = 0; i < childNodes.getLength(); i++) + { + Node child = traverseToInnerTag(tag, childNodes.item(i)); + if (child != null) + { + return child; + } + } + } + return null; + } + + /***********************************************************************/ + public static Object extractAndTranslateForNode(Node node, + Object addToObject, XmlTranslator translator) + throws IllegalArgumentException, IllegalAccessException, + InvocationTargetException, InstantiationException + { + NodeList childNodes = node.getChildNodes(); + for (int i = 0; i < childNodes.getLength(); i++) + { + if (childNodes.item(i).getNodeType() == Node.ELEMENT_NODE) + { + translator.extractAndTranslateForNode(childNodes.item(i), addToObject); + } + } + return addToObject; + } + /***********************************************************************/ + /***********************************************************************/ +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/io/xml/XmlMap.java b/src/main/java/com/spun/util/io/xml/XmlMap.java new file mode 100644 index 0000000..2dbf7b9 --- /dev/null +++ b/src/main/java/com/spun/util/io/xml/XmlMap.java @@ -0,0 +1,132 @@ +package com.spun.util.io.xml; + +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.util.List; + +import com.spun.util.ObjectUtils; +import com.spun.util.filters.Filter; +import com.spun.util.filters.FilterUtils; + +/***********************************************************************/ + +public class XmlMap +{ + + + private String settingFunction; + private String xmlName; + private XmlExtractor extractor; + private Method settingMethod; + private Class type; + /***********************************************************************/ + + public XmlMap(String xmlName, String settingFunction, Class type) + { + this.xmlName = xmlName; + this.settingFunction = settingFunction; + this.type = type; + } + public XmlMap(String xmlName, String settingFunction) + { + this.xmlName = xmlName; + this.settingFunction = settingFunction; + } + /***********************************************************************/ + + public Method getSettingMethod() + { + return settingMethod; + } + /***********************************************************************/ + + public String getNodeName() + { + return xmlName; + }/***********************************************************************/ + + public XmlMap(String xmlName, String settingFunction, XmlExtractor extractor) + { + + this.xmlName = xmlName; + this.settingFunction = settingFunction; + this.extractor = extractor; + } + /***********************************************************************/ + public void initialize(Class clazz) throws InstantiationException, IllegalAccessException + { + + List methods = FilterUtils.retainExtracted(clazz.getMethods(), new SingleSetterMethodFilter(settingFunction, type)); + settingMethod = getBestMethodFit(methods); + if (extractor == null) + { + Class takes = settingMethod.getParameterTypes()[0]; + extractor = getExtractorFor(takes); + } + } + /***********************************************************************/ + + private XmlExtractor getExtractorFor(Class takes) throws InstantiationException, IllegalAccessException + { + XmlExtractor extractor = BasicExtractor.get(takes); + // basic type get basic type extractor + if(extractor != null) + {} + else if (XmlExtractable.class.isAssignableFrom(takes)) + { + extractor = new XmlMapExtractor(takes); + } + else + { + throw new Error("Unable to extract for class '" + takes.getName() + "'"); + } + return extractor; + } + /***********************************************************************/ + + private Method getBestMethodFit(List methods) + { + if (methods.size() == 0) + { + throw new Error("no method found for '" + settingFunction + "'"); + } + else if (methods.size() == 1) + { + return (Method)methods.get(0); + } + else + { + throw new Error("Need to Find best method for '" + settingFunction + "' from " + methods); + } + } + /***********************************************************************/ + public XmlExtractor getExtractor() + { + return extractor; + } + /***********************************************************************/ + + public class SingleSetterMethodFilter implements Filter + { + + private String methodName = null; + private Class argument = null; + public SingleSetterMethodFilter(String methodName, Class argument) + { + this.methodName = methodName; + this.argument = argument; + } + /***********************************************************************/ + + public boolean isExtracted(Object object) throws IllegalArgumentException + { + ObjectUtils.assertInstance(Method.class, object); + Method method = (Method)object; + return method.getParameterTypes().length == 1 && (argument == null || method.getParameterTypes()[0] == argument) && Modifier.isPublic(method.getModifiers()) && method.getName().equals(methodName); + } + + } + /***********************************************************************/ + /***********************************************************************/ + +} diff --git a/src/main/java/com/spun/util/io/xml/XmlMapExtractor.java b/src/main/java/com/spun/util/io/xml/XmlMapExtractor.java new file mode 100644 index 0000000..b724dd4 --- /dev/null +++ b/src/main/java/com/spun/util/io/xml/XmlMapExtractor.java @@ -0,0 +1,44 @@ +package com.spun.util.io.xml; + +import java.lang.reflect.InvocationTargetException; + +import org.w3c.dom.Node; +import com.spun.util.ClassUtils; + +/***********************************************************************/ + +public class XmlMapExtractor implements XmlExtractor +{ + private Class clazz; + private XmlTranslator translator; + /***********************************************************************/ + public XmlMapExtractor(XmlMap[] xmlMaps, Class clazz) throws InstantiationException, IllegalAccessException + { + this.clazz = clazz; + this.translator = XmlMapTranslator.get(clazz, xmlMaps); + + + } + /***********************************************************************/ + public XmlMapExtractor(Class clazz) throws InstantiationException, IllegalAccessException + { + + this(((XmlExtractable)clazz.newInstance()).getXmlMap(), clazz); + } + /***********************************************************************/ + + public Object extractObjectForNode(Node node) + throws IllegalArgumentException, InvocationTargetException, InstantiationException, IllegalAccessException + { + Object object = clazz.newInstance(); + XmlExtractorUtil.extractAndTranslateForNode(node, object, translator); + return object; + + } + public String toString() + { + return ClassUtils.getClassName(clazz) + ".extractor"; + } + /***********************************************************************/ + /***********************************************************************/ +} diff --git a/src/main/java/com/spun/util/io/xml/XmlMapTranslator.java b/src/main/java/com/spun/util/io/xml/XmlMapTranslator.java new file mode 100644 index 0000000..ad786e4 --- /dev/null +++ b/src/main/java/com/spun/util/io/xml/XmlMapTranslator.java @@ -0,0 +1,21 @@ +package com.spun.util.io.xml; + +/***********************************************************************/ + +public class XmlMapTranslator +{ + /***********************************************************************/ + + public static XmlTranslator get(Class clazz, XmlMap[] maps) throws InstantiationException, IllegalAccessException + { + for (int i = 0; i < maps.length; i++) + { + maps[i].initialize(clazz); + } + return new XmlTranslator(maps); + + } + /***********************************************************************/ + /***********************************************************************/ + +} diff --git a/src/main/java/com/spun/util/io/xml/XmlTranslator.java b/src/main/java/com/spun/util/io/xml/XmlTranslator.java new file mode 100644 index 0000000..936b0f7 --- /dev/null +++ b/src/main/java/com/spun/util/io/xml/XmlTranslator.java @@ -0,0 +1,75 @@ +package com.spun.util.io.xml; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map.Entry; +import org.w3c.dom.Node; + +/***********************************************************************/ +public class XmlTranslator +{ + private HashMap extractors = new HashMap(); + private HashMap setters = new HashMap(); + /***********************************************************************/ + public XmlTranslator(XmlMap[] maps) + { + for (int i = 0; i < maps.length; i++) + { + String nodeName = maps[i].getNodeName(); + extractors.put(nodeName, maps[i].getExtractor()); + setters.put(nodeName, maps[i].getSettingMethod()); + } + } + /***********************************************************************/ + public Object extractAndTranslateForNode(Node node, Object addToObject) throws IllegalArgumentException, + IllegalAccessException, InvocationTargetException, InstantiationException + { + String name = node.getNodeName(); + Method method = (Method) setters.get(name); + XmlExtractor extractor = (XmlExtractor) extractors.get(name); + if (extractor == null) { + throw new Error("No Extractor Found for Node '" + getNamePath(node) + "'"); + } + Object o = extractor.extractObjectForNode(node); + this.setObject(o, addToObject, method); + return o; + } + /***********************************************************************/ + private static String getNamePath(Node node) + { + StringBuffer buffer = new StringBuffer(node.getNodeName()); + while (node.getParentNode() != null) + { + node = node.getParentNode(); + buffer.insert(0, node.getNodeName() + "."); + } + return buffer.toString(); + } + /***********************************************************************/ + private void setObject(Object o, Object addToObject, Method settingMethod) throws IllegalArgumentException, + IllegalAccessException, InvocationTargetException + { + try + { + settingMethod.invoke(addToObject, new Object[]{o}); + } + catch (IllegalArgumentException e) + { + throw e; + } + } + public String toString() + { + StringBuffer out = new StringBuffer(); + for (Entry entry : extractors.entrySet() ) + { + String key = entry.getKey(); + XmlExtractor value = entry.getValue(); + out.append(String.format("%s => %s\n",key, value)); + } + return out.toString(); + } + /***********************************************************************/ + /***********************************************************************/ +} diff --git a/src/main/java/com/spun/util/parser/CurrencyAmount.java b/src/main/java/com/spun/util/parser/CurrencyAmount.java new file mode 100644 index 0000000..fad0da8 --- /dev/null +++ b/src/main/java/com/spun/util/parser/CurrencyAmount.java @@ -0,0 +1,27 @@ +package com.spun.util.parser; + +public class CurrencyAmount extends TemplateDouble +{ + /************************************************************************/ + public CurrencyAmount(double amount) + { + super(amount, "$", "", 2, 2); + } + /************************************************************************/ + public String toString() + { + return inFormat("$", 2, 2, null, true); + } + /************************************************************************/ + public static String inDefaultFormat(double d) + { + return inFormat(d, "$", 2, 2, null, true); + } + /************************************************************************/ + public String withoutCents() + { + return inFormat("$", 0, 0, null, true); + } + /************************************************************************/ + /************************************************************************/ +} diff --git a/src/main/java/com/spun/util/parser/FileLocator.java b/src/main/java/com/spun/util/parser/FileLocator.java new file mode 100644 index 0000000..e3821bc --- /dev/null +++ b/src/main/java/com/spun/util/parser/FileLocator.java @@ -0,0 +1,63 @@ +package com.spun.util.parser; + +import java.io.File; +import java.util.Arrays; +import java.util.HashMap; + +public class FileLocator implements ResourceLocator +{ + private HashMap paths = new HashMap(); + private boolean failOnNotFound = true; + private String[] basePaths; + /***********************************************************************/ + public FileLocator(String[] basePaths) + { + this(basePaths, true); + } + /***********************************************************************/ + public FileLocator(String[] basePaths, boolean failOnNotFound) + { + this.basePaths = basePaths; + this.failOnNotFound = failOnNotFound; + } + /***********************************************************************/ + public String getLocation(String fileName) + { + String absolutePath = (String) paths.get(fileName); + if (absolutePath == null) + { + for (int i = 0; i < basePaths.length; i++) + { + File file = new File(basePaths[i] + File.separator + fileName); + if (file.exists()) + { + absolutePath = registerFile(fileName, file); + break; + } + } + } + if (absolutePath == null) + { + if (failOnNotFound) + { + throw new NullPointerException(" The file '" + fileName + "' could not be found in " + Arrays.asList(basePaths).toString() + " with base dir = " + new File(".").getAbsolutePath()); + } + else + { + File file = new File(basePaths[0] + File.separator + fileName); + absolutePath = registerFile(fileName, file); + } + } + return absolutePath; + } + /***********************************************************************/ + + private String registerFile(String fileName, File file) + { + String absolutePath = file.getAbsolutePath(); + paths.put(fileName, absolutePath); + return absolutePath; + } + /***********************************************************************/ + /***********************************************************************/ +} diff --git a/src/main/java/com/spun/util/parser/JarFileLocator.java b/src/main/java/com/spun/util/parser/JarFileLocator.java new file mode 100644 index 0000000..29a3843 --- /dev/null +++ b/src/main/java/com/spun/util/parser/JarFileLocator.java @@ -0,0 +1,33 @@ +package com.spun.util.parser; + +import java.util.HashMap; + +public class JarFileLocator implements ResourceLocator +{ + private HashMap paths = new HashMap(); + private String basePath; + /***********************************************************************/ + public JarFileLocator(String basePath) + { + this.basePath = basePath; + } + /***********************************************************************/ + public String getLocation(String fileName) + { + String absolutePath = (String) paths.get(fileName); + String temp = basePath + '/' + fileName; + if (absolutePath == null) + { + ClassLoader cl = JarFileLocator.class.getClassLoader(); + if (cl.getResource(temp) != null) + { + absolutePath = temp; + paths.put(fileName, absolutePath); + } + } + if (absolutePath == null) { throw new NullPointerException(" The resource '" + fileName + "' could not be found at " + temp); } + return absolutePath; + } + /***********************************************************************/ + /***********************************************************************/ +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/parser/ListSection.java b/src/main/java/com/spun/util/parser/ListSection.java new file mode 100644 index 0000000..13a69a3 --- /dev/null +++ b/src/main/java/com/spun/util/parser/ListSection.java @@ -0,0 +1,174 @@ +package com.spun.util.parser; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import com.spun.util.MySystem; + +public class ListSection +{ + private List section = null; + private int startingPoint = 0; + private int overAllSize = 0; + + /************************************************************************/ + public ListSection(List section, int startingPoint, int overAllSize) + { + this.startingPoint = startingPoint; + this.overAllSize = overAllSize; + this.section = section; + } + /************************************************************************/ + public ListSection(Object[] objects, int startingPoint, int overAllSize) + { + this(Arrays.asList(objects), startingPoint, overAllSize); + } + /************************************************************************/ + public ListSection(Object[] objects, ListSectionInfo listSection) + { + this(objects,listSection.getStart()-1, listSection.getTotalSize()); + } + /************************************************************************/ + public ListSection(List section, ListSectionInfo listSection) + { + this(section,listSection.getStart()-1, listSection.getTotalSize()); + } + /************************************************************************/ + public void setSection(List section) + { + this.section = section; + } + /************************************************************************/ + public void setSection(Object[] objects) + { + this.section = Arrays.asList(objects); + } + /************************************************************************/ + public List getSection() + { + return this.section; + } + /************************************************************************/ + public boolean isListPoint() + { + return (section.size() == 1); + } + /************************************************************************/ + public int getSectionStartingPoint(int offset) + { + return (getSize() == 0) ? 0 : startingPoint + offset; + } + /************************************************************************/ + public int getSectionEndPoint(int offset) + { + // 1-2 of 3 = (0,1,2) + // size = 2, starting point = 0, + return startingPoint + section.size() - 1 + offset; + } + /************************************************************************/ + public boolean isBeforeSection() + { + return startingPoint > 0; + } + /************************************************************************/ + public boolean isAfterSection() + { + return getSectionEndPoint(1) != getSize(); + } + /************************************************************************/ + public boolean isEmpty() + { + return section.size() == 0; + } + /************************************************************************/ + public int getSize() + { + return overAllSize; + } + /************************************************************************/ + public int getBeforeSectionSize(int max) + { + return (startingPoint > max || max == -1) ? max : startingPoint; + } + /************************************************************************/ + public int getBeforeSectionStartIndex(int max, int offset) + { + return startingPoint - getBeforeSectionSize(max) + offset; + } + /************************************************************************/ + public int getBeforeSectionEndIndex(int offset) + { + return startingPoint - 1 + offset; + } + /************************************************************************/ + public int getAfterSectionSize(int max) + { + int afterSize = getSize() - getSectionEndPoint(1); + return (afterSize > max || max == -1) ? max : afterSize; + } + /************************************************************************/ + public int getAfterSectionStartIndex(int offset) + { + return getSectionEndPoint(1) + offset; + } + /************************************************************************/ + public int getAfterSectionEndIndex(int max, int offset) + { + return getSectionEndPoint(0) + getAfterSectionSize(max) + offset; + } + /************************************************************************/ + public static void main(String args[]) + { + ArrayList v = new ArrayList(); + v.add(null);v.add(null);v.add(null);v.add(null);v.add(null); + v.add(null);v.add(null);v.add(null);v.add(null);v.add(null); + v.add(null);v.add(null);v.add(null);v.add(null);v.add(null); + v.add(null);v.add(null);v.add(null);v.add(null);v.add(null); + ListSection l = new ListSection(v,40,63); + int offset = 1; + int max = 20; + MySystem.variable("isListPoint() = " + l.isListPoint()); + MySystem.variable("getSectionStartingPoint() = " + l.getSectionStartingPoint(offset)); + MySystem.variable("getSectionEndPoint() = " + l.getSectionEndPoint(offset)); + MySystem.variable("isBeforeSection() = " + l.isBeforeSection()); + MySystem.variable("isAfterSection() = " + l.isAfterSection()); + MySystem.variable("getSize() = " + l.getSize()); + MySystem.variable("getBeforeSectionSize() = " + l.getBeforeSectionSize(max)); + MySystem.variable("getBeforeSectionStartIndex() = " + l.getBeforeSectionStartIndex(max,offset)); + MySystem.variable("getBeforeSectionEndIndex() = " + l.getBeforeSectionEndIndex(offset)); + MySystem.variable("getAfterSectionSize() = " + l.getAfterSectionSize(max)); + MySystem.variable("getAfterSectionStartIndex() = " + l.getAfterSectionStartIndex(offset)); + MySystem.variable("getAfterSectionEndIndex() = " + l.getAfterSectionEndIndex(max,offset)); + } + /** + * @return Returns the overAllSize. + */ + public int getOverAllSize() + { + return overAllSize; + } + /** + * @param overAllSize The overAllSize to set. + */ + public void setOverAllSize(int overAllSize) + { + this.overAllSize = overAllSize; + } + /** + * @return Returns the startingPoint. + */ + public int getStartingPoint() + { + return startingPoint; + } + /** + * @param startingPoint The startingPoint to set. + */ + public void setStartingPoint(int startingPoint) + { + this.startingPoint = startingPoint; + } + + /************************************************************************/ + /************************************************************************/ +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/parser/ListSectionInfo.java b/src/main/java/com/spun/util/parser/ListSectionInfo.java new file mode 100644 index 0000000..038b289 --- /dev/null +++ b/src/main/java/com/spun/util/parser/ListSectionInfo.java @@ -0,0 +1,85 @@ +package com.spun.util.parser; + +/** + * Import Note : Unlike much of java, + * this is not Zero indexed and is inclusive on both ends
+ * i.e.
+ * [1,2,3,4,5,6,7,8] with a section + * Start = 1 & SectionSize = 4] + * Has the following properties + * Start = 1 + * Section Size = 4 + * End = 4 + * Total size = 8 + **/ +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; + +public class ListSectionInfo +{ + public int start = 0; + public int sectionSize = 0; + public int totalSize = 0; + /************************************************************************/ + public ListSectionInfo(int start, int sectionSize, int totalSize) + { + this.totalSize = totalSize; + this.start = start; + if (start > totalSize) + { + this.sectionSize = 0; + } + else + { + this.sectionSize = ((start + sectionSize) > this.totalSize) ? this.totalSize - this.start + 1 : sectionSize; + } + } + /************************************************************************/ + /** + * [Start,End] => [3,5] => 3,4,5 + * @return start point (inclusive) + **/ + public int getStart() + { + return start; + } + /************************************************************************/ + /** + * [Start,End] => [3,5] => 3,4,5 + * @return end point (inclusive) + **/ + public int getEnd() + { + return start + sectionSize - 1; + } + /************************************************************************/ + public int getTotalSize() + { + return totalSize; + } + /************************************************************************/ + public int getSectionSize() + { + return sectionSize; + } + /************************************************************************/ + public static ListSectionInfo getListSectionBySQL(int start, int sectionSize, String sql, Statement stmt) + throws SQLException + { + ResultSet rsCount = stmt.executeQuery(sql); + rsCount.next(); + // This is done without an if to throw an error if the expected result is not given + return new ListSectionInfo(start, sectionSize, rsCount.getInt(1)); + } + /************************************************************************/ + public String toString() + { + String value = "com.spun.util.parser.ListSection["; + value += " start = " + start + ",\n" + " sectionSize = " + sectionSize + ",\n" + " getEnd = " + getEnd() + + ",\n" + " totalSize = " + totalSize + "]"; + return value; + } + /************************************************************************/ + /************************************************************************/ +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/parser/MassAmount.java b/src/main/java/com/spun/util/parser/MassAmount.java new file mode 100644 index 0000000..0a58932 --- /dev/null +++ b/src/main/java/com/spun/util/parser/MassAmount.java @@ -0,0 +1,65 @@ +package com.spun.util.parser; + +import com.spun.util.StringUtils; + +public class MassAmount extends TemplateDouble +{ + public static final int GRAMS = 0; + public static final int KILOGRAMS = 1; + public static final int POUNDS = 2; + public static final String UNITS[] = {"Grams", "Kilograms", "Pounds"}; + private static final double UNIT_CONVERSIONS[] = {1, .001, 0.00220467}; + /************************************************************************/ + public MassAmount(double amount) + { + super(amount, "", "", 0, 2); + } + /************************************************************************/ + public MassAmount(double amount, int units) + { + super(convertUnits(amount, units, GRAMS), "", "", 0, 2); + } + /************************************************************************/ + public static int getUnits(String value) + { + return StringUtils.resolveEnumeration(value, UNITS); + } + /************************************************************************/ + public static double convertUnits(double amount, int fromUnits, int toUnits) + { + return (amount / UNIT_CONVERSIONS[fromUnits]) * UNIT_CONVERSIONS[toUnits]; + } + /************************************************************************/ + public double convertUnits(int toUnits) + { + return this.amount * UNIT_CONVERSIONS[toUnits]; + } + /************************************************************************/ + public double getAmountInUnits(int desiredUnits) + { + return convertUnits(desiredUnits); + } + /************************************************************************/ + public String inUnits(String desiredUnits) + { + return inFormat(getAmountInUnits(getUnits(desiredUnits)), defaultPrefix, defaultMaximumPrecision, defaultMinimumPrecision, defaultPostfix, true); + } + /************************************************************************/ + public String inUnits(String desiredUnits, int maximumPrecision, int minimumPrecision) + { + return inFormat(getAmountInUnits(getUnits(desiredUnits)), defaultPrefix, maximumPrecision, getDefaultMinimumPrecision(maximumPrecision), + defaultPostfix, true); + } + /************************************************************************/ + public int getPoundsRoundedUp() + { + return getRoundedUp(MassAmount.POUNDS); + } + /************************************************************************/ + public int getRoundedUp(int inUnits) + { + return (int) Math.ceil(convertUnits(inUnits) - 0.001); + } + /************************************************************************/ + /************************************************************************/ +} diff --git a/src/main/java/com/spun/util/parser/ParserCommons.java b/src/main/java/com/spun/util/parser/ParserCommons.java new file mode 100644 index 0000000..a56b683 --- /dev/null +++ b/src/main/java/com/spun/util/parser/ParserCommons.java @@ -0,0 +1,277 @@ +package com.spun.util.parser; + +import java.util.Collection; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import com.spun.util.NumberUtils; +import com.spun.util.ObjectUtils; +import com.spun.util.PhoneNumber; +import com.spun.util.velocity.ParserDateUtils; + +public class ParserCommons +{ + public static TemplateStringUtils stringUtils = TemplateStringUtils.INSTANCE; + public static TemplateNumberUtils numberUtils = TemplateNumberUtils.INSTANCE; + public static TemplateDate today = TemplateDate.INSTANCE; + public static ParserCommons INSTANCE = new ParserCommons(); + + /***********************************************************************/ + public static TemplateNumberUtils getNumberUtils() + { + return numberUtils; + } + + /***********************************************************************/ + public static Class getClass(String clazz) throws ClassNotFoundException + { + return Class.forName(clazz); + } + + public static Object createNew(String clazz) throws InstantiationException, + IllegalAccessException, ClassNotFoundException + { + return getClass(clazz).newInstance(); + } + + /***********************************************************************/ + public static Object getNull() + { + return null; + } + + /***********************************************************************/ + public static ParserDateUtils getDateUtils() + { + return ParserDateUtils.INSTANCE; + } + + /***********************************************************************/ + public static TemplateStringUtils getStringUtils() + { + return stringUtils; + } + + /***********************************************************************/ + public static String asJavascript(Object obj) + { + return TemplateStringUtils.toJavaScriptEncode(obj); + } + + /***********************************************************************/ + public static TemplateDate getToday() + { + return today; + } + + /***********************************************************************/ + public static TemplateDate asDate(Date date) + { + return new TemplateDate(date); + } + + /***********************************************************************/ + public static TemplateDouble asDouble(double number) + { + return new TemplateDouble(number); + } + + /***********************************************************************/ + public static PhoneNumber asPhoneNumber(String number) + { + return new PhoneNumber(number); + } + + /***********************************************************************/ + public static String asExcel(String text) + { + return TemplateStringUtils.formatExcelString(text); + } + + /***********************************************************************/ + public static boolean isNull(Object object) + { + return object == null; + } + + /***********************************************************************/ + public static PercentageAmount asPercentage(double d) + { + return new PercentageAmount(d); + } + + /***********************************************************************/ + public static TemplateDouble asDouble(Number number) + { + return new TemplateDouble(number.doubleValue()); + } + + /***********************************************************************/ + public static List asArray(Object[] array, int offset, int stepping) + { + return new VelocityList(array, offset, stepping).getAll(); + } + + /***********************************************************************/ + public static List asArray(Object[] array, int offset, int stepping1, + int stepping2) + { + return new VelocityList(array, offset, new int[] { stepping1, stepping2 }) + .getAll(); + } + + /***********************************************************************/ + public static List asArray(Object[] array) + { + return new VelocityList(array).getAll(); + } + + /***********************************************************************/ + public static List asArray(Object nullObject) + { + if (nullObject != null) + { + throw new Error("Improper usage"); + } + return new VelocityList(Collections.EMPTY_LIST).getAll(); + } + + /***********************************************************************/ + public static List asArray(List list) + { + return new VelocityList(list).getAll(); + } + + /***********************************************************************/ + public static TemplateDouble asDouble(int number) + { + return new TemplateDouble(number); + } + + /***********************************************************************/ + public static CurrencyAmount asCurrency(double number) + { + return new CurrencyAmount(number); + } + + /***********************************************************************/ + public static CurrencyAmount asCurrency(Number number) + { + return number == null ? new CurrencyAmount(0.00) : new CurrencyAmount( + number.doubleValue()); + } + + /***********************************************************************/ + public static CurrencyAmount asCurrency(int number) + { + return new CurrencyAmount(number); + } + + /***********************************************************************/ + public static CurrencyAmount asCurrencyAmount(double number) + { + return new CurrencyAmount(number); + } + + /***********************************************************************/ + public static CurrencyAmount asCurrencyAmount(Number number) + { + return new CurrencyAmount(number.doubleValue()); + } + + /***********************************************************************/ + public static CurrencyAmount asCurrencyAmount(int number) + { + return new CurrencyAmount(number); + } + + /***********************************************************************/ + public static TemplateDouble sum(Object[] array, String methodName) + { + return new TemplateDouble(NumberUtils.sum(array, methodName, null)); + } + + /***********************************************************************/ + public static TemplateDouble sum(Object[] array, String methodName, + Object param1) + { + return new TemplateDouble(NumberUtils.sum(array, methodName, + new Object[] { param1 })); + } + + /***********************************************************************/ + public static TemplateDouble sum(Object[] array, String methodName, + Object param1, Object param2) + { + return new TemplateDouble(NumberUtils.sum(array, methodName, new Object[] { + param1, param2 })); + } + + /***********************************************************************/ + public static int getArrayLength(Object[] array) + { + return array == null ? 0 : array.length; + } + + /***********************************************************************/ + public static int getLength(Object[] array) + { + return array == null ? 0 : array.length; + } + + /***********************************************************************/ + public static int getLength(Collection collection) + { + return collection == null ? 0 : collection.size(); + } + + /***********************************************************************/ + public static boolean isEmpty(Object[] array) + { + return getArrayLength(array) == 0; + } + + /***********************************************************************/ + public static boolean isNotEmpty(Object[] array) + { + return !isEmpty(array); + } + + /***********************************************************************/ + public static boolean isEmpty(List list) + { + return (list == null || list.size() == 0); + } + + /***********************************************************************/ + public static Object ternary(boolean test, Object ifTrue, Object ifFalse) + { + return test ? ifTrue : ifFalse; + } + + /***********************************************************************/ + public static Object get(Object[] array, int index) + { + return getArrayLength(array) > index ? array[index] : null; + } + + /***********************************************************************/ + public static Object get(List list, int index) + { + return list == null ? null : list.get(index); + } + + /***********************************************************************/ + public static void throwError(String errorString) + { + throw new Error(errorString); + } + + /***********************************************************************/ + public static void throwError(Throwable t) + { + throw ObjectUtils.throwAsError(t); + } + /***********************************************************************/ + /***********************************************************************/ +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/parser/PercentageAmount.java b/src/main/java/com/spun/util/parser/PercentageAmount.java new file mode 100644 index 0000000..9c4c89c --- /dev/null +++ b/src/main/java/com/spun/util/parser/PercentageAmount.java @@ -0,0 +1,61 @@ +package com.spun.util.parser; + +import com.spun.util.NumberUtils; + +public class PercentageAmount extends TemplateDouble +{ + /************************************************************************/ + public PercentageAmount(double amount) + { + super(amount, "", "%", 0, 2); + } + /************************************************************************/ + public static PercentageAmount createFromRatio(double a, double b) + { + return new PercentageAmount(getAmount(a, a + b)); + } + /************************************************************************/ + public static PercentageAmount createFromFraction(double a, double b) + { + return new PercentageAmount(getAmount(a, b)); + } + /************************************************************************/ + private static double getAmount(double a, double b) + { + double amount = NumberUtils.equals(b, 0, 0.00001) ? 1 : (a / b); + return amount; + } + /************************************************************************/ + public PercentageAmount getInverse() + { + return new PercentageAmount(1 - amount); + } + /***********************************************************************/ + public String inDefaultFormat() + { + return inFormat(amount * 100, "", 2, 0, "%", true); + } + /***********************************************************************/ + public String inIntegerFormat() + { + return inFormat(amount * 100, "", 0, 0, "%", true); + } + /***********************************************************************/ + public String inDefaultFormat(String prefix, int precision, int minimumPrecision, String postfix, + boolean useGrouping) + { + return inFormat(amount * 100, prefix, precision, minimumPrecision, postfix, useGrouping); + } + /************************************************************************/ + public String toString() + { + return inDefaultFormat(); + } + /************************************************************************/ + public String withoutPostfix() + { + return inFormat(amount * 100, null, 6, 0, null, false); + } + /************************************************************************/ + /************************************************************************/ +} diff --git a/src/main/java/com/spun/util/parser/ResourceLocator.java b/src/main/java/com/spun/util/parser/ResourceLocator.java new file mode 100644 index 0000000..21ca538 --- /dev/null +++ b/src/main/java/com/spun/util/parser/ResourceLocator.java @@ -0,0 +1,7 @@ +package com.spun.util.parser; + +public interface ResourceLocator +{ + /***********************************************************************/ + public abstract String getLocation(String fileName); +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/parser/SteppingIterator.java b/src/main/java/com/spun/util/parser/SteppingIterator.java new file mode 100644 index 0000000..89580ba --- /dev/null +++ b/src/main/java/com/spun/util/parser/SteppingIterator.java @@ -0,0 +1,108 @@ +package com.spun.util.parser; + +import java.util.Arrays; + +/***********************************************************************/ +public class SteppingIterator +{ + public static final int[] DEFAULT_STEPPING = {1}; + private int offset = 0; + private int[] stepping = DEFAULT_STEPPING; + private int actualSize = 0; + /***********************************************************************/ + public SteppingIterator(int offset, int[] stepping, int actualSize) + { + this.offset = offset; + this.stepping = stepping; + this.actualSize = actualSize; + assertSteppingValid(stepping); + } + /***********************************************************************/ + private void assertSteppingValid(int[] stepping) + { + if (stepping == null || stepping.length == 0 || stepping[0] == 0) { throw new NullPointerException( + "Stepping cannot be null or zero in " + Arrays.toString(stepping)); } + for (int i = stepping.length - 1; i > 0; i--) + { + if (stepping[i - 1] % stepping[i] != 0) + { + String string = String.format("Invalid stepping parameters - %s is not divisible by %s in parameters %s", + stepping[i - 1], stepping[i], Arrays.toString(stepping)); + throw new Error(string); + } + } + } + /***********************************************************************/ + public boolean isLast(int currentPlace, int forSteppingLevel) + { + if (forSteppingLevel == -1 || stepping[forSteppingLevel] == 1) + { + return (currentPlace + 1) == getSize(true, true); + } + else + { + return (((currentPlace + 1) % stepping[forSteppingLevel]) == 0); + } + } + /************************************************************************/ + public boolean isFirst(int index, int forSteppingLevel) + { + return (getStepPositionForRound(forSteppingLevel, 0, index) == 0); + } + /************************************************************************/ + public int getSize(boolean includeOffset, boolean includeStepping) + { + int size = actualSize; + size += includeOffset ? offset : 0; + if (includeStepping && (size % stepping[0]) != 0) + { + size += (stepping[0] - (size % stepping[0])); + } + return size; + } + /***********************************************************************/ + /** + * @return the index of the current Step. + **/ + public static int getStepCountForRound(int forSteppingLevel, int onIndex, int stepping[], int indexBase) + { + if (forSteppingLevel == -1 || stepping[forSteppingLevel] == 1) + { + return indexBase; + } + else + { + return ((onIndex / stepping[forSteppingLevel]) + indexBase); + } + } + /***********************************************************************/ + public int getStepCountForRound(int forSteppingLevel, int currentPlace, int indexBase) + { + return getStepCountForRound(forSteppingLevel, currentPlace, this.stepping, indexBase); + } + /***********************************************************************/ + public int getTotalStepCountForRound(int forSteppingLevel, int indexBase) + { + return getStepCountForRound(forSteppingLevel, getSize(true, true) - 1, stepping, indexBase); + } + /***********************************************************************/ + public int getStepPositionForRound(int forSteppingLevel, int indexBase, int currentIndex) + { + if (forSteppingLevel == -1 || stepping[forSteppingLevel] == 1) + { + return currentIndex + indexBase; + } + else + { + return ((currentIndex % stepping[forSteppingLevel]) + indexBase); + } + } + /***********************************************************************/ + public int getActualPosition(int position) + { + position = position - this.offset; + return (position < 0 || this.actualSize <= position) ? -1 : position; + } + /************************************************************************/ + /************************************************************************/ +} diff --git a/src/main/java/com/spun/util/parser/TemplateArray.java b/src/main/java/com/spun/util/parser/TemplateArray.java new file mode 100644 index 0000000..c2ceb32 --- /dev/null +++ b/src/main/java/com/spun/util/parser/TemplateArray.java @@ -0,0 +1,67 @@ +package com.spun.util.parser; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import com.spun.util.ArrayUtils; + +public class TemplateArray +{ + private static String FILLER = "filler"; + /************************************************************************/ + public static Object[] join(Object part1[], Object part2[], String subsectionLabel, boolean forceIfEmpty) + { + if (part2 != null && part2.length == 0 && !forceIfEmpty) { return part1; } + ArrayList total = new ArrayList(); + ArrayUtils.addArray(total, part1); + total.add(new Subsection(subsectionLabel)); + ArrayUtils.addArray(total, part2); + return total.toArray(); + } + /***********************************************************************/ + public static List getFillers(List list, int total) + { + ArrayList newList = new ArrayList(list); + int needed = total - list.size(); + for (int i = 0; i < needed; i++) + { + newList.add(FILLER); + } + return newList; + } + /***********************************************************************/ + public static String addWhiteSpace(String text, int tabSize) + { + String whiteSpace = " "; + tabSize = tabSize - text.length(); + tabSize = (tabSize < 0) ? 0 : tabSize; + while (whiteSpace.length() < tabSize) + { + whiteSpace = whiteSpace + whiteSpace; + } + return whiteSpace.substring(0, tabSize); + } + /************************************************************************/ + public boolean isInitCall(String object, String params[]) + { + String initOn[] = {"init", "size", "isEmpty"}; + return (object.equals("") && (params.length > 0) && Arrays.asList(initOn).contains(params[0])); + } + /************************************************************************/ + /* INNER CLASSES */ + /************************************************************************/ + public static class Subsection + { + public String sectionName = null; + /************************************************************************/ + public Subsection(String sectionName) + { + super(); + this.sectionName = sectionName; + } + /************************************************************************/ + /************************************************************************/ + } + /************************************************************************/ + /************************************************************************/ +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/parser/TemplateDate.java b/src/main/java/com/spun/util/parser/TemplateDate.java new file mode 100644 index 0000000..ffe7078 --- /dev/null +++ b/src/main/java/com/spun/util/parser/TemplateDate.java @@ -0,0 +1,193 @@ +package com.spun.util.parser; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; +import java.util.TimeZone; +import com.spun.util.DateDifference; +import com.spun.util.DateUtils; +import com.spun.util.StringUtils; + +public class TemplateDate +{ + public static final TemplateDate INSTANCE = new TemplateDate(); + public static final class FORMATS + { + public static final DateFormat DATE_SHORT_DAY = new SimpleDateFormat("EEE MM/dd/yyyy"); + public static final DateFormat DATE_MONTH_YEAR = new SimpleDateFormat("MM/yy"); + public static final DateFormat DATE_MONTH_DAY = new SimpleDateFormat("MM/dd"); + public static final DateFormat DATE_SHORT = new SimpleDateFormat("MM/dd/yyyy"); + public static final DateFormat DATE_MEDIUM = DateFormat.getDateInstance(DateFormat.MEDIUM); + public static final DateFormat DATE_LONG = DateFormat.getDateInstance(DateFormat.LONG); + public static final DateFormat DATE_FULL = DateFormat.getDateInstance(DateFormat.FULL); + public static final DateFormat TIME_SHORT = DateFormat.getTimeInstance(DateFormat.SHORT); + public static final DateFormat TIME_FULL = new SimpleDateFormat("H:mm"); + public static final DateFormat TIME_ZONE = new SimpleDateFormat("H:mm z"); + public static final DateFormat TIME_MILLI = new SimpleDateFormat("H:mm:ss:SSS"); + } + //private static DateFormat dateTimeFormat = DateFormat.getDateTimeInstance(DateFormat.FULL ,DateFormat.SHORT); + private Date frozen = null; + private DateDifference difference = null; + /************************************************************************/ + public TemplateDate() + { + } + /************************************************************************/ + public TemplateDate(Date freezeTime) + { + this.frozen = freezeTime; + } + /************************************************************************/ + public void freezeTime() + { + frozen = new Date(); + } + /***********************************************************************/ + public String getDate(String style) + { + return getDate(style, ""); + } + /***********************************************************************/ + public String getDate(String style, String zone) + { + String value = null; + DateFormat formatter = null; + if (style.equalsIgnoreCase("FULL")) + { + formatter = FORMATS.DATE_FULL; + } + else if (style.equalsIgnoreCase("LONG")) + { + formatter = FORMATS.DATE_LONG; + } + else if (style.equalsIgnoreCase("MEDIUM")) + { + formatter = FORMATS.DATE_MEDIUM; + } + else if (style.equalsIgnoreCase("SHORTDAY")) + { + formatter = FORMATS.DATE_SHORT_DAY; + } + else if (style.equalsIgnoreCase("MonthYear")) + { + formatter = FORMATS.DATE_MONTH_YEAR; + } + else if (style.equalsIgnoreCase("MonthDay")) + { + formatter = FORMATS.DATE_MONTH_DAY; + } + else + { + formatter = FORMATS.DATE_SHORT; + } + formatter.setTimeZone((StringUtils.isNonZero(zone)) ? TimeZone.getTimeZone(zone) : TimeZone.getDefault()); + value = formatter.format(getDate(false)); + return value; + } + /***********************************************************************/ + public String getTime(String format) + { + return getTime(format, ""); + } + /***********************************************************************/ + public String getTime(String format, String zone) + { + String value = null; + DateFormat formatter = null; + if (format.equalsIgnoreCase("AM/PM")) + { + formatter = FORMATS.TIME_SHORT; + } + else if (format.equalsIgnoreCase("Milli")) + { + formatter = FORMATS.TIME_MILLI; + } + else if (format.equalsIgnoreCase("Zone")) + { + formatter = FORMATS.TIME_ZONE; + } + else + { + formatter = FORMATS.TIME_FULL; + } + formatter.setTimeZone((StringUtils.isNonZero(zone)) ? TimeZone.getTimeZone(zone) : TimeZone.getDefault()); + value = formatter.format(getDate(false)); + return value; + } + /************************************************************************/ + public Date getDate(boolean forceCurrent) + { + if ((frozen != null) && (!forceCurrent)) + { + return frozen; + } + else + { + return new Date(); + } + } + /************************************************************************/ + public Date getDate() + { + return getDate(false); + } + /***********************************************************************/ + public DateDifference getDifferenceFromToday() + { + if (difference == null) + { + difference = new DateDifference(getDate(false), new Date()); + } + return difference; + } + /***********************************************************************/ + public String getDay() + { + GregorianCalendar cal = new GregorianCalendar(); + cal.setTime(getDate(false)); + return StringUtils.padNumber(cal.get(Calendar.DAY_OF_MONTH), 2); + } + /***********************************************************************/ + public String getMonth(int offset) + { + GregorianCalendar cal = new GregorianCalendar(); + cal.setTime(getDate(false)); + return StringUtils.padNumber(cal.get(Calendar.MONTH) + offset, 2); + } + /***********************************************************************/ + public String getMonthName() + { + return new SimpleDateFormat("MMMM").format(getDate(false)); + } + /***********************************************************************/ + public String getYear() + { + GregorianCalendar cal = new GregorianCalendar(); + cal.setTime(getDate(false)); + return StringUtils.padNumber(cal.get(Calendar.YEAR), 4); + } + /***********************************************************************/ + public boolean isToday() + { + return DateUtils.isToday(getDate(false)); + } + /***********************************************************************/ + public String toString() + { + return this.getDate("", ""); + } + /***********************************************************************/ + public String getDateAndTime(String dateFormat, String timeFormat) + { + return getDate(dateFormat) + " " + getTime(timeFormat); + } + /***********************************************************************/ + public String getDateAndTime() + { + return getDateAndTime("default", "default"); + } + /************************************************************************/ + /************************************************************************/ +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/parser/TemplateDouble.java b/src/main/java/com/spun/util/parser/TemplateDouble.java new file mode 100644 index 0000000..de55b4c --- /dev/null +++ b/src/main/java/com/spun/util/parser/TemplateDouble.java @@ -0,0 +1,136 @@ +package com.spun.util.parser; + +/** + * + **/ +import java.text.NumberFormat; +import com.spun.util.NumberUtils; + +public class TemplateDouble +{ + protected double amount = 0; + private static NumberFormat decimalFormat = null; + protected String defaultPrefix = null; + protected String defaultPostfix = null; + protected int defaultMinimumPrecision = 2; + protected int defaultMaximumPrecision = 2; + /************************************************************************/ + static + { + decimalFormat = NumberFormat.getNumberInstance(); + decimalFormat.setMaximumFractionDigits(2); + decimalFormat.setMinimumFractionDigits(2); + } + /************************************************************************/ + public TemplateDouble(double amount) + { + this.amount = amount; + } + /************************************************************************/ + public TemplateDouble(double amount, String defaultPrefix, String defaultPostfix, int defaultMinimumPrecision, int defaultMaximumPrecision) + { + this.amount = amount; + this.defaultPostfix = defaultPostfix; + this.defaultPrefix = defaultPrefix; + this.defaultMinimumPrecision = defaultMinimumPrecision; + this.defaultMaximumPrecision = defaultMaximumPrecision; + } + /***********************************************************************/ + public TemplateDouble(Number amount) + { + this(amount.doubleValue()); + } + /***********************************************************************/ + public String inDollarFormat() + { + return inFormat(amount, "$", 2, 2, "", true); + } + /***********************************************************************/ + public CurrencyAmount asCurrency() + { + return new CurrencyAmount(amount); + } + /***********************************************************************/ + public String asInteger() + { + return inFormat(amount, null, 0, 0, null, true); + } + /***********************************************************************/ + public String inFormat(String prefix, int precision, int minimumPrecision, String postfix, boolean useGrouping) + { + return inFormat(amount, prefix, precision, minimumPrecision, postfix, useGrouping); + } + /***********************************************************************/ + public static String inFormat(double amount, String prefix, int maximumPrecision, int minimumPrecision, String postfix, boolean useGrouping) + { + String value = ""; + NumberFormat dFormat = decimalFormat; + if ((maximumPrecision != 2) || (minimumPrecision != 2) || !useGrouping) + { + dFormat = NumberFormat.getNumberInstance(); + dFormat.setMaximumFractionDigits(maximumPrecision); + dFormat.setMinimumFractionDigits(minimumPrecision); + dFormat.setGroupingUsed(useGrouping); + } + value += dFormat.format(amount); + if (prefix != null) + { + if (value.charAt(0) != '-') + { + value = prefix + value; + } + else + { + value = '-' + prefix + value.substring(1); + } + } + value += (postfix != null) ? postfix : ""; + return value; + } + /***********************************************************************/ + protected int getDefaultMinimumPrecision(int maximumPrecision) + { + return maximumPrecision < defaultMinimumPrecision ? maximumPrecision : defaultMinimumPrecision; + } + /***********************************************************************/ + public String asInt() + { + return inFormat(null, 0, 0, null, false); + } + + /************************************************************************/ + public String asDouble() + { + return inFormat(null, 2, 2, null, false); + } + /************************************************************************/ + public String asNegative() + { + return inFormat(-amount, defaultPrefix, 2, 2, defaultPostfix, false); + } + /************************************************************************/ + public TemplateDouble getAbsoluteValue() + { + return new TemplateDouble(-amount, defaultPrefix, defaultPostfix, defaultMinimumPrecision, defaultMaximumPrecision); + } + /************************************************************************/ + public boolean isZero() + { + return NumberUtils.equals(0, this.amount, 0.0005); + } + public TemplateDouble divide(int by) + { + return new TemplateDouble(amount / by); + } + /************************************************************************/ + public String toString() + { + return inFormat(defaultPrefix, defaultMaximumPrecision, getDefaultMinimumPrecision(defaultMaximumPrecision), defaultPostfix, true); + } + /************************************************************************/ + /************************************************************************/ + public double getAmount() + { + return amount; + } +} diff --git a/src/main/java/com/spun/util/parser/TemplateError.java b/src/main/java/com/spun/util/parser/TemplateError.java new file mode 100644 index 0000000..79bc78b --- /dev/null +++ b/src/main/java/com/spun/util/parser/TemplateError.java @@ -0,0 +1,84 @@ +package com.spun.util.parser; + +import java.io.ByteArrayOutputStream; +import java.io.PrintWriter; +import org.apache.velocity.context.Context; +import com.spun.util.velocity.ContextAware; + +public class TemplateError implements ContextAware +{ + private String stackTrace = null; + private String className = null; + private String message = null; + private String cause; + /***********************************************************************/ + public TemplateError(Throwable t) + { + this(t, null); + } + /***********************************************************************/ + public TemplateError(Throwable t, java.lang.Object o) + { + if (o != null) + { + className = o.getClass().getName(); + } + cause = getCause(t); + message = t.getMessage(); + if (message != null && message.startsWith(cause)) + { + message = message.substring(cause.length() + 1); + } + ByteArrayOutputStream output = new ByteArrayOutputStream(); + PrintWriter pw = new PrintWriter(output); + t.printStackTrace(pw); + pw.flush(); + + stackTrace = output.toString(); + } + /***********************************************************************/ + private String getCause(Throwable t) + { + if (t.getCause() == null) + { + return t.getClass().getName(); + } + else + { + return getCause(t.getCause()); + } + } + /***********************************************************************/ + public String getMessage() + { + return message; + } + /***********************************************************************/ + public String getClassName() + { + return className; + } + /***********************************************************************/ + public String getStackTrace() + { + return stackTrace; + } + /***********************************************************************/ + public String getErrorInfo() + { + return message + "\n" + stackTrace; + } + /***********************************************************************/ + public String getCause() + { + return cause; + } + /***********************************************************************/ + public void setupContext(Context context) + { + context.put("error", this); + } + /***********************************************************************/ + /***********************************************************************/ + +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/parser/TemplateNumberUtils.java b/src/main/java/com/spun/util/parser/TemplateNumberUtils.java new file mode 100644 index 0000000..7f346d0 --- /dev/null +++ b/src/main/java/com/spun/util/parser/TemplateNumberUtils.java @@ -0,0 +1,105 @@ +package com.spun.util.parser; + +import org.lambda.query.Query; + +import com.spun.util.NumberUtils; + +public class TemplateNumberUtils +{ + public static TemplateNumberUtils INSTANCE = new TemplateNumberUtils(); + /************************************************************************/ + private TemplateNumberUtils() + { + } + public static boolean isZero(double d) + { + return isZero(d, 0.005); + } + /***********************************************************************/ + public static boolean isZero(Number d) + { + return d == null || isZero(d.doubleValue(), 0.005); + } + /***********************************************************************/ + public static int asInt(Number d) + { + return d == null ? 0 : d.intValue(); + } + /***********************************************************************/ + public static boolean isZero(double d, double delta) + { + return NumberUtils.equals(0, d, delta); + } + /***********************************************************************/ + private int getScaling(double have, double max, double scale) + { + if (max == 0) + { + throw new Error("Maximum cannot be zero"); + } + else + { + return (int)((have * scale) / max); + } + } + /***********************************************************************/ + public int getScaling(Integer have, Integer max, Integer scale) + { + return getScaling(have.doubleValue(), max.doubleValue(), scale.doubleValue()); + } + /***********************************************************************/ + public static double doArithmetic(int arg1, String operation, int arg2) + { + return doArithmetic(new String[]{"" + arg1, operation, "" + arg2}); + } + /***********************************************************************/ + public static double doArithmetic(String[] params) + { + if (params == null || params.length == 0) { return 0.00; } + double totalNumber = 0; + double currentNumber = 0; + char operator = '+'; + for (int i = 0; i < params.length; i++) + { + if (i % 2 == 0) + { + currentNumber = NumberUtils.load(params[i], 0.00); + switch (operator) + { + case '+' : + totalNumber = totalNumber + currentNumber; + break; + case '-' : + totalNumber = totalNumber - currentNumber; + break; + case '*' : + totalNumber = totalNumber * currentNumber; + break; + case '/' : + totalNumber = totalNumber / currentNumber; + break; + case '%' : + totalNumber = totalNumber % currentNumber; + break; + default : + throw new Error("Unknown arithmetic operator " + operator); + } + } + else + { + operator = params[i].charAt(0); + } + } + return totalNumber; + } + /************************************************************************/ + /************************************************************************/ + public static TemplateDouble max(Number... numbers) + { + return new TemplateDouble(Query.max(numbers)); + } + public static TemplateDouble max(Number n1, Number n2, Number n3) + { + return max(new Number[]{n1,n2,n3}); + } +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/parser/TemplateStringUtils.java b/src/main/java/com/spun/util/parser/TemplateStringUtils.java new file mode 100644 index 0000000..d031884 --- /dev/null +++ b/src/main/java/com/spun/util/parser/TemplateStringUtils.java @@ -0,0 +1,177 @@ +package com.spun.util.parser; + +import java.io.File; + +import com.spun.util.StringUtils; + +public class TemplateStringUtils +{ + public static TemplateStringUtils INSTANCE = new TemplateStringUtils(); + /************************************************************************/ + private TemplateStringUtils() + { + } + /***********************************************************************/ + public String truncate(String onString, int maxLength) + { + return truncate(onString, maxLength, new String[]{}); + } + /***********************************************************************/ + public String plural(int number, String singular, String plural) + { + return String.format("%s %s", number, (number == 1 ? singular:plural)); + } + /***********************************************************************/ + public String truncate(String onString, int maxLength, String minus1, String minus2) + { + return truncate(onString, maxLength, new String[]{"", "", minus1, minus2}); + } + /***********************************************************************/ + public String truncate(String onString, int maxLength, String minus1) + { + return truncate(onString, maxLength, new String[]{"", "", minus1}); + } + /***********************************************************************/ + private String truncate(String onString, int maxLength, String minus[]) + { + if (onString == null || onString.equals("null")) { return ""; } + for (int i = 2; i < minus.length; i++) + { + maxLength -= minus[i] != null ? minus[i].length() : 0; + } + maxLength = (maxLength < 0) ? 0 : maxLength; + return StringUtils.truncate(onString, maxLength); + } + /************************************************************************/ + public static String clearNull(String value) + { + return clearNull(value, ""); + } + /************************************************************************/ + public static String clearNull(Object value, String replacingValue) + { + return (("null".equals(value) || value == null) ? replacingValue : value.toString()); + } + /************************************************************************/ + /** + * Compare if arg [0] equals any other argument starting at [1]. + * @param params + * @return + **/ + private boolean isIn(String[] params) + { + for (int i = 1; i < params.length; i++) + { + if (params[0].equals(params[i])) { return true; } + } + return false; + } + /************************************************************************/ + /** + * Compare if arg [0] equals any other argument starting at [1]. + * @param params + * @return + **/ + public static boolean isIn(String compare, String inParameter1, String inParameter2) + { + return StringUtils.isIn(compare, new String[]{inParameter1, inParameter2}); + } + /***********************************************************************/ + public static boolean isIn(String compare, String inParameter1) + { + return StringUtils.isIn(compare, new String[]{inParameter1}); + } + /***********************************************************************/ + public static String pad(String original, int length, String paddingCharacter) + { + original = original == null ? "" : original; + int paddingNeeded = length - original.length(); + StringBuffer buffer = new StringBuffer(original); + for (int i = 0; i < paddingNeeded; i++) + { + buffer.append(paddingCharacter); + } + return buffer.toString(); + } + /***********************************************************************/ + private boolean isNull(String main) + { + return !StringUtils.isNonZero(clearNull(main)); + } + /***********************************************************************/ + public String getFileName(String fileName) + { + return fileName.substring(fileName.lastIndexOf(File.separatorChar) + 1); + } + /***********************************************************************/ + public static String formatExcelString(String in) + { + if ("0".equals(in) || "null".equals(in) || in == null) // So that null's & int(0) show up empty + { + return "\"\""; + } + else if (in.indexOf('\"') == -1) + { + return '\"' + in + '\"'; + } + else + { + StringBuffer buffer = new StringBuffer(); + buffer.append('\"'); + for (int i = 0; i < in.length(); i++) + { + char c = in.charAt(i); + buffer.append((c == '\"') ? "\"\"" : "" + c); + } + buffer.append('\"'); + return buffer.toString(); + } + } + /************************************************************************/ + public static int getLength(String s) + { + return s == null ? 0 : s.length(); + } + /************************************************************************/ + public String toHTMLEncode(String string) + { + return StringUtils.toHTMLEncode(clearNull(string)); + } + /************************************************************************/ + public String toURLEncode(String string) + { + return StringUtils.toURLEncode(clearNull(string)); + } + /************************************************************************/ + public static String toJavaScriptEncode(String string) + { + return StringUtils.toJavaScriptEncode(clearNull(string, null)); + } + /************************************************************************/ + public static String toJavaScriptEncode(Number n) + { + return n == null ? "null" : n.toString(); + } + /************************************************************************/ + public static String toJavaScriptEncode(Object n) + { + if (n == null) + { + return "null"; + } + else if (n instanceof Number) + { + return toJavaScriptEncode((Number) n); + } + else + { + return toJavaScriptEncode(n.toString()); + } + } + public static String asXml(String s) + { + return StringUtils.escapeForXml(s); + } + /************************************************************************/ + /************************************************************************/ +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/parser/Templateparsing.jj b/src/main/java/com/spun/util/parser/Templateparsing.jj new file mode 100644 index 0000000..a2eb2a9 --- /dev/null +++ b/src/main/java/com/spun/util/parser/Templateparsing.jj @@ -0,0 +1,438 @@ +options +{ + LOOKAHEAD=3; + STATIC = false; + CHOICE_AMBIGUITY_CHECK = 4; +} +PARSER_BEGIN(TemplateParsing) +package com.spun.util.parser; + +import java.util.Vector; +import com.spun.util.My_System; + +public class TemplateParsing +{ + public static final String TEST_FILE ="";//com.spun.set.website.WWWConfig.TEMPLATE_DIRECTORY + "\\quiddlerscores.htm"; + /************************************************************************/ + public static void main(String args[]) + { + try + { + String file = TEST_FILE; + if (args.length == 1) + { + System.out.println("Java Parser Version 1.1: Reading from file " + args[0] + " . . ."); + file = args[0]; + } + try + { + TemplateParsing parser = new TemplateParsing(new java.io.FileInputStream(file)); + Vector v = parser.input(); + My_System.variable(v.toString()); + } + catch (java.io.FileNotFoundException e) + { + System.out.println("Java Parser Version 1.1: File " + args[0] + " not found."); + return; + } + } + catch (Exception e) + { + My_System.warning(e); + } + } + /************************************************************************/ +} +PARSER_END(TemplateParsing) + +/************************************************************************/ +TOKEN [IGNORE_CASE] : +{ + : DEFAULT | + : TEMPLATE_PARSER | + : DEFAULT +} + + + SKIP : +{ + <( " " | "\t" | "\n" | "\r" )+ > +} + TOKEN : +{ + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + " > : DEFAULT +} + + /************************************************************************/ + + Method method() : + { + Token t; + Vector v =null; + } + { + t = [v = params()] + { + Method m = new Method(t.image, v); + //My_System.variable("Method = " + m.toString()); + return m; + } + } + + /************************************************************************/ + Object param() : + { + Token t; + Object s; + } + { + (t = + { + s = t.image.substring(1,t.image.length()-1); + } + + | t = + { + s = t.image; + } + + | s = method() + ) + { + return s; + } + } + /************************************************************************/ + Vector params() : + { + Vector v = new Vector(); + Object t; + } + { + [t = param() + { + v.addElement(t); + } + ( t = param() + { + v.addElement(t); + } + )*] + { + return v; + } + } + + /************************************************************************/ + String plainText() : + { + Token t; + boolean isNull = false; + } + { + (t = |t = ) + { + return t.image; + } + } + + /************************************************************************/ + Vector text() : + { + Vector v = new Vector(); + Object o = null; + } + { + + [(o = plainText() + { + v.addElement(o); + } + | o = templateParser() + { + v.addElement(o); + } + )+] + { + return v; + } + } + /************************************************************************/ + + Object templateParser() : + { + Object o = null; + } + { + ( + o = variable() | o = ifStatement() | o = forStatement() | + o = setStatement() | o = letStatement() | o = letVarStatement() + ) + { + return o; + } + } + /************************************************************************/ + VariableStatement variable() : + { + Method m; + //My_System.markerIn("variableStatement"); + } + { + m = method() + { + //My_System.markerOut("variableStatement"); + return new VariableStatement(m); + } + } + /************************************************************************/ + IfStatement ifConditional() : + { + Method m; + Object compare = null; + } + { + m = method() [ compare = param()] + { + return new IfStatement(false, m, compare, null, null); + } + } + /************************************************************************/ + IfStatement elseIfStatement() : + { + IfStatement holder = null; + Vector thenV; + boolean ifn = false; + } + { + (|{ifn = true;}) holder = ifConditional() + thenV = text() + { + holder.setThenStatement(thenV); + holder.setIfNot(ifn); + return holder; + } + } + /************************************************************************/ + IfStatement ifStatement() : + { + Vector ifStatements = new Vector(); + Vector thenStatements = new Vector(); + IfStatement holder = null; + Vector thenV; + Vector elseV = null; + Object thenO = null; + Object elseO = null; + boolean ifn = false; +// My_System.markerIn("ifStatement"); + } + { + (|{ifn = true;}) holder = ifConditional() + ( + ( + + thenV = text() + { + holder.setThenStatement(thenV); + holder.setIfNot(ifn); + ifStatements.addElement(holder); + } + + [(holder = elseIfStatement() + { + ifStatements.addElement(holder); + } + )+] + + [elseV = elseStatement()] + + { + while (ifStatements.size() !=0 ) + { + holder = (IfStatement)ifStatements.remove(ifStatements.size() - 1); + holder.setElseStatement(elseV); + if (ifStatements.size() != 0) + { + elseV = new Vector(); + elseV.add(holder); + } + } + return holder; + } + ) + | + ( + thenO = param() + elseO = param() + + { + holder.setIfNot(ifn); + //Add Then + Vector temp = new Vector(); + if (thenO instanceof Method) + { + thenO = new VariableStatement((Method)thenO); + } + temp.add(thenO); + holder.setThenStatement(temp); + //Add Else + temp = new Vector(); + if (elseO instanceof Method) + { + elseO = new VariableStatement((Method)elseO); + } + temp.add(elseO); + holder.setElseStatement(temp); + return holder; + } + )) + } + /************************************************************************/ + Vector elseStatement() : + { + Vector v; + } + { + v = text() + { + return v; + } + } + /************************************************************************/ + ForStatement forStatement() : + { + Method init; + Method check; + Method inc; + Vector v; + //My_System.markerIn("forStatement"); + } + { + init = method() check = method() inc = method() v = text() + { + //My_System.markerOut("forStatement"); + return new ForStatement(init,check,inc, v); + } + } + /************************************************************************/ + SetStatement setStatement() : + { + Method var; + Object val; + Vector vVal; + //My_System.markerIn("setStatement"); + } + { + var = method() + ( + ( + val = param() + { + vVal = new Vector(); + vVal.add(val); + } + ) + | + ( + vVal = text() + ) + ) + { + //My_System.markerOut("setStatement"); + return new SetStatement(var, vVal); + } + } + + /************************************************************************/ + LetStatement letVarStatement() : + { + Method var; + Object val; + Vector vVal; + //My_System.markerIn("setStatement"); + } + { + var = method() + ( + ( + val = param() + { + vVal = new Vector(); + vVal.add(val); + } + ) + | + ( + vVal = text() + ) + ) + { + //My_System.markerOut("setStatement"); + return new LetStatement(var, vVal, true); + } + } + + /************************************************************************/ + LetStatement letStatement() : + { + Method var; + Object val; + Vector vVal; + } + { + var = method() val = param() + { + vVal = new Vector(); + vVal.add(val); + return new LetStatement(var, vVal, false); + } + } + + /************************************************************************/ + Vector input() : + { + Vector v; + } + { + v = text() + { + //My_System.variable(v.toString()); + return v; + } + } + /************************************************************************/ + /************************************************************************/ \ No newline at end of file diff --git a/src/main/java/com/spun/util/parser/VelocityList.java b/src/main/java/com/spun/util/parser/VelocityList.java new file mode 100644 index 0000000..9f82c2f --- /dev/null +++ b/src/main/java/com/spun/util/parser/VelocityList.java @@ -0,0 +1,156 @@ +package com.spun.util.parser; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +/***********************************************************************/ +public class VelocityList +{ + private SteppingIterator iterator = null; + @SuppressWarnings("unchecked") + private List list = null; + + public VelocityList(Object[] array) + { + this(array, 0, SteppingIterator.DEFAULT_STEPPING); + } + + /***********************************************************************/ + public VelocityList(Object[] array, int offset, int stepping) + { + this(array, offset, new int[] { stepping }); + } + + /***********************************************************************/ + public VelocityList(Object[] array, int offset, int[] stepping) + { + this.list = array == null ? Collections.EMPTY_LIST : Arrays.asList(array); + this.iterator = new SteppingIterator(offset, stepping, this.list.size()); + } + + /***********************************************************************/ + @SuppressWarnings("unchecked") + public VelocityList(List list2) + { + this(list2 == null ? null : list2.toArray()); + } + + /***********************************************************************/ + public SteppingIterator getSteppingIterator() + { + return this.iterator; + } + + /***********************************************************************/ + private Object get(int index) + { + int actualPosition = iterator.getActualPosition(index); + return (actualPosition == -1) ? null : list.get(actualPosition); + } + + /***********************************************************************/ + public List getAll() + { + int size = this.iterator.getSize(true, true); + ArrayList returning = new ArrayList(size); + for (int i = 0; i < size; i++) + { + returning.add(new Item(this, i)); + } + return returning; + } + + /***********************************************************************/ + public static class Item + { + VelocityList list; + int index; + + public Item(VelocityList list, int index) + { + this.list = list; + this.index = index; + } + + public Object get() + { + return list.get(index); + } + + public int getSize() + { + return list.getSteppingIterator().getSize(true, true); + } + + public int getIndex() + { + return index; + } + + public int getIndexModulous(int m) + { + return index % m; + } + + public int getIndex(int offset) + { + return index + offset; + } + + public boolean isCurrentIndexValid() + { + return list.getSteppingIterator().getActualPosition(index) != -1; + } + + public boolean isCurrentIndexSubsection() + { + return list.get(index) instanceof TemplateArray.Subsection; + } + + public boolean isEven() + { + return ((index % 2) == 0); + } + + public boolean isLast() + { + return list.getSteppingIterator().isLast(index, -1); + } + + public boolean isFirst() + { + return list.getSteppingIterator().isFirst(index, -1); + } + + public boolean isLast(int i) + { + return list.getSteppingIterator().isLast(index, i); + } + + public boolean isFirst(int stepping) + { + return list.getSteppingIterator().isFirst(index, stepping); + } + + public int getTotalStepCountForRound(int forSteppingLevel, int indexBase) + { + return list.getSteppingIterator().getTotalStepCountForRound( + forSteppingLevel, indexBase); + } + + public int getStepCountForRound(int forSteppingLevel, int indexBase) + { + return list.getSteppingIterator().getStepCountForRound(forSteppingLevel, + index, indexBase); + } + /* + * public boolean isStep(int i, int j) { return list.isStep(index, i, j); } + * public boolean getStepPosition(int i, int j) { return + * list.getStepPosition(index, i, j); } public boolean isGreaterThan(int + * value) { return list.isGreaterThan(index, value); } public boolean + * isLessThan(int value) { return list.isLessThan(index, value); } + */ + } +} diff --git a/src/main/java/com/spun/util/persistence/DatabaseObjectDeletor.java b/src/main/java/com/spun/util/persistence/DatabaseObjectDeletor.java new file mode 100644 index 0000000..b7201ac --- /dev/null +++ b/src/main/java/com/spun/util/persistence/DatabaseObjectDeletor.java @@ -0,0 +1,26 @@ +package com.spun.util.persistence; + +import java.sql.SQLException; +import java.sql.Statement; + +import com.spun.util.database.DatabaseObject; + +public class DatabaseObjectDeletor implements Deletor +{ + private Statement stmt; + public DatabaseObjectDeletor(Statement stmt) + { + this.stmt = stmt; + } + public void delete(T delete) throws SavingException + { + try + { + delete.deleteFromDatabase(stmt); + } + catch (SQLException e) + { + throw new SavingException(e); + } + } +} diff --git a/src/main/java/com/spun/util/persistence/DatabaseObjectSaver.java b/src/main/java/com/spun/util/persistence/DatabaseObjectSaver.java new file mode 100644 index 0000000..1dda4d2 --- /dev/null +++ b/src/main/java/com/spun/util/persistence/DatabaseObjectSaver.java @@ -0,0 +1,26 @@ +package com.spun.util.persistence; + +import java.sql.SQLException; +import java.sql.Statement; +import com.spun.util.database.DatabaseObject; + +public class DatabaseObjectSaver implements Saver +{ + private Statement stmt; + public DatabaseObjectSaver(Statement stmt) + { + this.stmt = stmt; + } + public DatabaseObject save(DatabaseObject save) throws SavingException + { + try + { + save.save(stmt); + return save; + } + catch (SQLException e) + { + throw new SavingException(e); + } + } +} diff --git a/src/main/java/com/spun/util/persistence/Deletor.java b/src/main/java/com/spun/util/persistence/Deletor.java new file mode 100644 index 0000000..0a2d5bf --- /dev/null +++ b/src/main/java/com/spun/util/persistence/Deletor.java @@ -0,0 +1,6 @@ +package com.spun.util.persistence; + +public interface Deletor +{ + public void delete(T delete) throws SavingException; +} diff --git a/src/main/java/com/spun/util/persistence/ExecutableQuery.java b/src/main/java/com/spun/util/persistence/ExecutableQuery.java new file mode 100644 index 0000000..ab6b64d --- /dev/null +++ b/src/main/java/com/spun/util/persistence/ExecutableQuery.java @@ -0,0 +1,7 @@ +package com.spun.util.persistence; + +public interface ExecutableQuery +{ + public abstract String getQuery() throws Exception; + public abstract String executeQuery(String query) throws Exception; +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/persistence/Loader.java b/src/main/java/com/spun/util/persistence/Loader.java new file mode 100644 index 0000000..83e2e5c --- /dev/null +++ b/src/main/java/com/spun/util/persistence/Loader.java @@ -0,0 +1,7 @@ +package com.spun.util.persistence; + + +public interface Loader +{ + public T load() throws Exception; +} diff --git a/src/main/java/com/spun/util/persistence/Saver.java b/src/main/java/com/spun/util/persistence/Saver.java new file mode 100644 index 0000000..ca2fbc6 --- /dev/null +++ b/src/main/java/com/spun/util/persistence/Saver.java @@ -0,0 +1,7 @@ +package com.spun.util.persistence; + + +public interface Saver +{ + public T save(T save) throws SavingException; +} diff --git a/src/main/java/com/spun/util/persistence/SavingException.java b/src/main/java/com/spun/util/persistence/SavingException.java new file mode 100644 index 0000000..62693fe --- /dev/null +++ b/src/main/java/com/spun/util/persistence/SavingException.java @@ -0,0 +1,7 @@ +package com.spun.util.persistence; + +public class SavingException extends RuntimeException +{ + public SavingException(){} + public SavingException(Throwable cause){super(cause);} +} diff --git a/src/main/java/com/spun/util/persistence/SqlLoader.java b/src/main/java/com/spun/util/persistence/SqlLoader.java new file mode 100644 index 0000000..2cbcd29 --- /dev/null +++ b/src/main/java/com/spun/util/persistence/SqlLoader.java @@ -0,0 +1,33 @@ +package com.spun.util.persistence; + +import java.sql.ResultSet; +import java.sql.Statement; + +import com.spun.util.database.ResultSetWriter; +import com.spun.util.database.SQLQuery; +import com.spun.util.database.SQLStatementUtils; + +public interface SqlLoader extends Loader +{ + public static class ExecutableWrapper implements ExecutableQuery + { + private SqlLoader loader; + public ExecutableWrapper(SqlLoader loader) + { + this.loader = loader; + } + @Override + public String executeQuery(String query) throws Exception + { + ResultSet sql = SQLStatementUtils.executeQuery(query, loader.getStatement()); + return ResultSetWriter.toString(sql); + } + @Override + public String getQuery() throws Exception + { + return loader.getQuery().toString(); + } + } + public SQLQuery getQuery() throws Exception; + public Statement getStatement() throws Exception; +} diff --git a/src/main/java/com/spun/util/servlets/BasicServlet.java b/src/main/java/com/spun/util/servlets/BasicServlet.java new file mode 100644 index 0000000..c591c34 --- /dev/null +++ b/src/main/java/com/spun/util/servlets/BasicServlet.java @@ -0,0 +1,328 @@ +package com.spun.util.servlets; + +import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.GregorianCalendar; +import java.util.Locale; + +import javax.servlet.ServletConfig; +import javax.servlet.ServletContext; +import javax.servlet.ServletException; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.httpclient.HttpException; +import org.apache.commons.httpclient.NameValuePair; +import org.apache.commons.httpclient.methods.PostMethod; + +import com.spun.util.DateUtils; +import com.spun.util.MySystem; +import com.spun.util.NumberUtils; +import com.spun.util.ObjectUtils; +import com.spun.util.StringUtils; +import com.spun.util.parser.TemplateError; +import com.spun.util.velocity.ParseCall; +import com.spun.util.velocity.VelocityParser; + +/** + * This is the top level servlet which all others extend. + **/ +public class BasicServlet extends HttpServlet +{ + private TemplateError error = null; + private static ServletContext servletContext; + protected Throwable connectionError = null; + /***********************************************************************/ + @Override + public void init(ServletConfig config) throws ServletException + { + super.init(config); + try + { + MySystem.useOutputFile(getLogFile(), true); + servletContext = getServletContext(); + } + catch (Exception e) + { + // just in case + } + } + public static ServletContext getContext() + { + return servletContext; + } + /***********************************************************************/ + @Override + public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException + { + doGet(req, res); + } + /***********************************************************************/ + public static int load(HttpServletRequest req, String key, int defaultValue) + { + return NumberUtils.load(req.getParameter(key), defaultValue); + } + /***********************************************************************/ + public static int load(String i, int defaultValue) + { + return NumberUtils.load(i, defaultValue); + } + /***********************************************************************/ + public static double load(HttpServletRequest req, String key, double defaultValue) + { + return NumberUtils.load(req.getParameter(key), defaultValue); + } + /***********************************************************************/ + public static double load(String i, double defaultValue) + { + return NumberUtils.load(i, defaultValue); + } + /***********************************************************************/ + public static boolean loadCheckBox(String i, boolean d) + { + return (i == null) ? d : "on".equalsIgnoreCase(i); + } + /***********************************************************************/ + public static boolean loadCheckBox(HttpServletRequest req, String key, boolean d) + { + return loadCheckBox(req.getParameter(key), d); + } + /***********************************************************************/ + public static Cookie loadCookie(HttpServletRequest req, String cookieName) + { + return ObjectUtils.getForMethod(req.getCookies(), cookieName, "getName"); + } + /***********************************************************************/ + public static String loadCookieValue(HttpServletRequest req, String cookieName) + { + Cookie cookie = ObjectUtils.getForMethod(req.getCookies(), cookieName, "getName"); + return cookie == null ? null : cookie.getValue(); + } + /***********************************************************************/ + public static void setCookie(HttpServletResponse response, String name, String value, int maxAge) + { + Cookie cookie = new Cookie(name, value); + cookie.setMaxAge(maxAge); + response.addCookie(cookie); + } + /***********************************************************************/ + public static java.util.Calendar loadDate(HttpServletRequest req, String month, String day, String year) + { + int m = load(req.getParameter(month), 0); + int d = load(req.getParameter(day), 0); + int y = load(req.getParameter(year), 0); + java.util.Calendar date = (y * d * m == 0) ? null : new GregorianCalendar(y, m - 1, d, 0, 1); + return date; + } + /***********************************************************************/ + public static Timestamp loadDate(HttpServletRequest req, String key, java.util.Date defaultValue) + { + try + { + String text = loadNullableString(req, key); + defaultValue = new java.text.SimpleDateFormat("MM/dd/yyyy").parse(text); + } + catch (Exception e) + { + } + return DateUtils.asTimestamp(defaultValue); + } + /***********************************************************************/ + public static boolean load(HttpServletRequest req, String key, boolean d) + { + return load(req.getParameter(key), d); + } + /***********************************************************************/ + public static boolean load(String i, boolean d) + { + return NumberUtils.load(i, d); + } + /***********************************************************************/ + public static String load(HttpServletRequest req, String key, String d) + { + String value = req.getParameter(key); + return StringUtils.isNonZero(value) ? value.trim() : d; + } + /***********************************************************************/ + public static String loadUpperCaseString(String i) + { + return com.spun.util.StringUtils.isNonZero(i) ? i.trim().toUpperCase() : null; + } + /***********************************************************************/ + public static String loadUpperCaseString(HttpServletRequest req, String key) + { + return loadUpperCaseString(req.getParameter(key)); + } + /***********************************************************************/ + public static String loadNullableString(HttpServletRequest req, String key) + { + if (key == null) { return null; } + String value = req.getParameter(key); + return StringUtils.isNonZero(value) ? value.trim() : null; + } + /***********************************************************************/ + public static String loadNullableString(String value) + { + return StringUtils.loadNullableString(value); + } + /***********************************************************************/ + protected String getLogFile() + { + return null; + } + /***********************************************************************/ + protected ParseCall getParser() + { + return VelocityParser.FileParseCall.INSTANCE; + } + /***********************************************************************/ + protected String getErrorTemplate() + { + return null; + } + /***********************************************************************/ + public String processError(Throwable t, HttpServletRequest req) + { + return processError(t, req, new ErrorToString()); + } + public String processError(Throwable t, HttpServletRequest req, SecondaryErrorProcessor secondardErrorProcessor) + { + try + { + error = new TemplateError(t, this); + String servletInfo = extractServletInformation(req); + MySystem.warning(servletInfo, t instanceof ServletParameterException ? null : t, ServletLogWriterFactory + .getWriter(this)); + // postErrorToLogServer(t, servletInfo); + return getParser().parse(getErrorTemplate(), error); + } + catch (Throwable t2) + { + return secondardErrorProcessor.processError(error, t2); + } + } + /***********************************************************************/ + private void postErrorToLogServer(Throwable t, String servletInfo) + { + HttpClient client = new HttpClient(); + PostMethod post = new PostMethod("http://mgwap.com:9090/Log/Insert"); + post.addParameter(new NameValuePair("level", "Severe")); + post.addParameter(new NameValuePair("message", t.getMessage())); + post.addParameter(new NameValuePair("process", servletInfo)); + StringWriter sw = new StringWriter(); + t.printStackTrace(new PrintWriter(sw)); + post.addParameter(new NameValuePair("stacktrace", sw.toString())); + try + { + client.executeMethod(post); + } + catch (HttpException e) + { + throw new Error("Unable to contact logging server: " + e.getMessage(), e); + } + catch (IOException e) + { + throw new Error("Unable to contact logging server: " + e.getMessage(), e); + } + finally + { + post.releaseConnection(); + } + } + /***********************************************************************/ + private String extractServletInformation(HttpServletRequest req) + { + if (req == null) { return null; } + String browser = req.getHeader("user-agent"); + ArrayList parameters = getParameters(req); + String servletName = this.getClass().getName(); + String info = "Servlet called from " + browser + "\n" + "[Servlet,Parameters] : [" + + servletName.substring(servletName.lastIndexOf(".") + 1) + ", " + parameters + "]"; + return info; + } + /***********************************************************************/ + public static ArrayList getHeaders(HttpServletRequest req) + { + Enumeration e = req.getHeaderNames(); + ArrayList parameters = new ArrayList(); + while (e.hasMoreElements()) + { + String s = (String) e.nextElement(); + parameters.add(new Property(s, req.getHeader(s))); + } + return parameters; + } + /***********************************************************************/ + public static void setContentTypeAsZip(HttpServletResponse res, String fileName) + { + res.setContentType("application/zip"); + res.setHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\""); + res.setLocale(Locale.US); + } + /***********************************************************************/ + public static void setContentTypeAsExcel(HttpServletResponse res, String fileName) + { + res.setContentType("application/octet-stream"); + res.setHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\""); + res.setLocale(Locale.US); + } + /***********************************************************************/ + public static void setContentTypeAsImage(HttpServletResponse res) + { + res.setContentType("image/gif"); + res.setLocale(Locale.US); + } + /***********************************************************************/ + public static ArrayList getParameters(HttpServletRequest req) + { + Enumeration e = req.getParameterNames(); + ArrayList parameters = new ArrayList(); + while (e.hasMoreElements()) + { + String s = (String) e.nextElement(); + parameters.add(new Property(s, req.getParameter(s))); + } + return parameters; + } + /***********************************************************************/ + public static Object getSessionData(HttpServletRequest req, String sessionKey) + { + Object o = req.getSession().getAttribute(sessionKey); + if (o == null) { throw new ExpiredSessionError(); } + return o; + } + /***********************************************************************/ + /***********************************************************************/ + public static class Property + { + private String value; + private String name; + /***********************************************************************/ + public Property(String name, String value) + { + this.value = value; + this.name = name; + } + @Override + public String toString() + { + return "[" + name + " = '" + value + "']"; + } + } + public static String setContentTypeAsXml(HttpServletResponse res, String xml) throws IOException + { + res.setContentType("text/xml"); + ServletOutputStream out = res.getOutputStream(); + out.println(xml); + out.close(); + return null; + } +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/servlets/EasyEmailLoader.java b/src/main/java/com/spun/util/servlets/EasyEmailLoader.java new file mode 100644 index 0000000..555feb0 --- /dev/null +++ b/src/main/java/com/spun/util/servlets/EasyEmailLoader.java @@ -0,0 +1,26 @@ +package com.spun.util.servlets; + +import com.spun.util.servlets.EmailServer.EmailLoader; + +public class EasyEmailLoader implements EmailLoader +{ + + private final String subject; + private final String text; + private final String html; + /***********************************************************************/ + public EasyEmailLoader(String subject,String text,String html) + { + this.subject = subject; + this.text = text; + this.html = html; + } + /***********************************************************************/ + public void load(EmailServer server) + { + server.setEmailHtmlBody(html); + server.setEmailSubject(subject); + server.setEmailTextBody(text); + } + /***********************************************************************/ +} diff --git a/src/main/java/com/spun/util/servlets/EmailServer.java b/src/main/java/com/spun/util/servlets/EmailServer.java new file mode 100644 index 0000000..da41ec7 --- /dev/null +++ b/src/main/java/com/spun/util/servlets/EmailServer.java @@ -0,0 +1,330 @@ +package com.spun.util.servlets; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Date; +import java.util.Properties; + +import javax.activation.DataHandler; +import javax.mail.Message; +import javax.mail.MessagingException; +import javax.mail.Multipart; +import javax.mail.PasswordAuthentication; +import javax.mail.Session; +import javax.mail.Transport; +import javax.mail.internet.InternetAddress; +import javax.mail.internet.MimeBodyPart; +import javax.mail.internet.MimeMessage; +import javax.mail.internet.MimeMultipart; + +import org.apache.velocity.context.Context; + +import com.spun.util.ByteArrayDataSource; +import com.spun.util.StringUtils; +import com.spun.util.ArrayUtils; +import com.spun.util.velocity.ContextAware; +import com.spun.util.velocity.ParseCall; + +public class EmailServer +{ + private EmailLoader loader = null; + private String emailSubject = null; + private String emailHtmlBody = null; + private String emailTextBody = null; + private ArrayList bcc = new ArrayList(); + private String to[]; + private String from; + private String smtpServer; + private ArrayList parts = new ArrayList(); + private ArrayList images = new ArrayList(); + private static boolean mockTransport = false; + public static Message lastMockSentItem = null; + private String gmailUser; + private String gmailPass; + /***********************************************************************/ + public static void setMockTransport(boolean mockTransport) + { + EmailServer.mockTransport = mockTransport; + lastMockSentItem = null; + } + public static Message getLastSentItem() + { + return lastMockSentItem; + } + /***********************************************************************/ + public static boolean isEmailValid(String email) + { + try + { + new javax.mail.internet.InternetAddress(email); + return email.indexOf("@") != -1; + } + catch (javax.mail.internet.AddressException e) + { + return false; + } + catch (Throwable e) + { + return false; + } + } + /***********************************************************************/ + public EmailServer(String smtpServer, String velocityTemplate, ParseCall parser, ContextAware contextAware, + String to, String from) + { + this(smtpServer, velocityTemplate, parser, contextAware, new String[]{to}, from); + } + /***********************************************************************/ + public EmailServer(String smtpServer, String velocityTemplate, ParseCall parser, ContextAware contextAware, + String[] to, String from) + { + this(smtpServer, new VelocityEmailLoader(velocityTemplate, parser, contextAware), to, from); + } + /***********************************************************************/ + public EmailServer(String smtpServer, EmailLoader loader, String[] to, String from) + { + this.smtpServer = smtpServer; + this.loader = loader; + this.to = to; + this.from = from; + } + /***********************************************************************/ + public void addTo(String email) + { + to = (String[]) ArrayUtils.addToArray(to, email); + } + /***********************************************************************/ + public void clearTo() + { + to = new String[0]; + } + /***********************************************************************/ + public void addBCC(String email) + { + bcc.add(email); + } + /***********************************************************************/ + public void clearBCC() + { + bcc = new ArrayList(); + } + /***********************************************************************/ + public void send() throws Exception + { + send(false, null, null); + } + /***********************************************************************/ + public void send(boolean useGoogle, String user, String pass) throws Exception + { + + gmailUser = user; + gmailPass = pass; + + Properties props = System.getProperties(); + props.put("mail.smtp.host", smtpServer); + + Session session = null; + + if(useGoogle) { + props.setProperty("mail.transport.protocol", "smtp"); + props.setProperty("mail.host", smtpServer); + props.put("mail.smtp.auth", "true"); + props.put("mail.smtp.port", "587"); + props.put("mail.smtp.socketFactory.port", "587"); + props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); + props.put("mail.smtp.socketFactory.fallback", "false"); + props.put("mail.smtp.starttls.enable", "true"); + props.put("mail.smtp.ssl", "true"); + + session = Session.getDefaultInstance(props, + new javax.mail.Authenticator() { + protected PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication(gmailUser, gmailPass); + } + } + ); + session.setDebug(false); + } else { + session = Session.getDefaultInstance(props); + } + + Message msg = new MimeMessage(session); + msg.setFrom(new InternetAddress(from)); + for (int i = 0; i < to.length; i++) + { + msg.addRecipient(Message.RecipientType.TO, new InternetAddress(to[i])); + } + for (int i = 0; i < bcc.size(); i++) + { + msg.addRecipient(Message.RecipientType.BCC, new InternetAddress(bcc.get(i))); + // My_System.variable("BBC - '"+bcc.get(i).toString()+"'"); + } + msg.setHeader("X-Priority","3"); + msg.setHeader("X-MSMail-Priority","Normal"); + msg.setHeader("X-Mailer", "Microsoft Outlook Express 6.00.2900.3138"); + msg.setHeader("X-MimeOLE","Produced By Microsoft MimeOLE V6.00.2900.3138"); + msg.setHeader("X-Virus-Scanned","Symantec AntiVirus Scan Engine"); + msg.setSentDate(new Date()); + loader.load(this); + Multipart mp = new MimeMultipart("alternative"); + + if (emailTextBody != null) + { + MimeBodyPart part = new MimeBodyPart(); + part.getAllHeaders(); + part.setText(emailTextBody, "iso-8859-1"); + part.setHeader("Content-Transfer-Encoding", "Quoted-printable"); + mp.addBodyPart(part); + } + if (emailHtmlBody != null) + { + MimeBodyPart part = new MimeBodyPart(); + part.setDataHandler(new DataHandler(new ByteArrayDataSource(emailHtmlBody, "text/html"))); + part.setHeader("Content-Transfer-Encoding", "Quoted-printable"); + mp.addBodyPart(part); + for (int i = 0; i < images.size(); i++) + { + mp.addBodyPart((MimeBodyPart) images.get(i)); + } + } + if (parts.size() != 0) + { + Multipart mp1 = mp; + mp = new MimeMultipart("mixed"); + //Add Text Part + MimeBodyPart part = new MimeBodyPart(); + part.setContent(mp1); + mp.addBodyPart(part); + for (int i = 0; i < parts.size(); i++) + { + mp.addBodyPart((MimeBodyPart) parts.get(i)); + } + } + msg.setContent(mp); + msg.setSubject(emailSubject); + msg.saveChanges(); // don't forget this + if (!mockTransport) + { + Transport.send(msg); + } + else + { + lastMockSentItem = msg; + } + } + /***********************************************************************/ + public void addPart(MimeBodyPart part) + { + parts.add(part); + } + /***********************************************************************/ + public static void addExcelFile(EmailServer email, String excelFileContent, String fileName) + throws MessagingException + { + MimeBodyPart part = new MimeBodyPart(); + part.setDataHandler(new DataHandler(new ByteArrayDataSource(excelFileContent, "application/octet-stream"))); + // Define the encoding (choose between BASE64, UUENCODE, QUOTED-PRINTABLE) + part.setHeader("Content-Transfer-Encoding", "QUOTED-PRINTABLE"); + part.setFileName(fileName); + email.addPart(part); + } + /***********************************************************************/ + public void addHTMLImage(String file, String url) throws FileNotFoundException, MessagingException + { + String fileName = file.substring(file.lastIndexOf(File.separator) + 1); + //My_System.variable("fileName = " + fileName); + FileInputStream fileInputStream = new FileInputStream(file); + addHTMLImage(url, fileName, fileInputStream); + } + /***********************************************************************/ + public void addHTMLImage(String url, String fileName, InputStream inputStream) throws MessagingException + { + MimeBodyPart part = new MimeBodyPart(); + url = url == null ? "" : url; + part.setDataHandler(new DataHandler(new ByteArrayDataSource(inputStream, "image/gif"))); + // Define the encoding (choose between BASE64, UUENCODE, QUOTED-PRINTABLE) + part.setHeader("Content-Transfer-Encoding", "BASE64"); + part.addHeader("Content-Location", url + fileName); + part.setFileName(fileName); + images.add(part); + } + /***********************************************************************/ + /***********************************************************************/ + public static interface EmailLoader + { + public void load(EmailServer server); + } + public static class VelocityEmailLoader implements EmailLoader, ContextAware + { + public static String TEXT_BODY = "TextBody"; + public static String HTML_BODY = "HtmlBody"; + public static String SUBJECT = "Subject"; + private String template = null; + private ContextAware contextAware = null; + private String currentEmailPart; + private ParseCall parser; + /***********************************************************************/ + public VelocityEmailLoader(String template, ParseCall parser, ContextAware contextAware) + { + this.template = template; + this.contextAware = contextAware; + this.parser = parser; + } + /***********************************************************************/ + public void load(EmailServer server) + { + try + { + server.emailTextBody = getTextBody(); + server.emailHtmlBody = getHtmlBody(); + server.emailSubject = getSubject(); + } + catch (Throwable t) + { + throw new Error(t); + } + } + /***********************************************************************/ + public String getTextBody() + { + currentEmailPart = TEXT_BODY; + String result = parser.parse(template, this); + return StringUtils.loadNullableString(result); + } + /***********************************************************************/ + public String getHtmlBody() + { + currentEmailPart = HTML_BODY; + String result = parser.parse(template, this); + return StringUtils.loadNullableString(result); + } + /***********************************************************************/ + public String getSubject() + { + currentEmailPart = SUBJECT; + String result = parser.parse(template, this); + return StringUtils.loadNullableString(result); + } + /***********************************************************************/ + public void setupContext(Context context) + { + contextAware.setupContext(context); + context.put("emailPart", currentEmailPart); + } + } + public void setEmailHtmlBody(String emailHtmlBody) + { + this.emailHtmlBody = emailHtmlBody; + } + public void setEmailSubject(String emailSubject) + { + this.emailSubject = emailSubject; + } + public void setEmailTextBody(String emailTextBody) + { + this.emailTextBody = emailTextBody; + } +} diff --git a/src/main/java/com/spun/util/servlets/ErrorToString.java b/src/main/java/com/spun/util/servlets/ErrorToString.java new file mode 100644 index 0000000..99e2de0 --- /dev/null +++ b/src/main/java/com/spun/util/servlets/ErrorToString.java @@ -0,0 +1,17 @@ +package com.spun.util.servlets; + +import com.spun.util.MySystem; +import com.spun.util.parser.TemplateError; + +public class ErrorToString implements SecondaryErrorProcessor +{ + @Override + public String processError(TemplateError original, Throwable secondary) + { + MySystem.warning(secondary); + TemplateError e = new TemplateError(secondary, this); + String output = "
" + original.getMessage() + "\n" + original.getStackTrace() + "
" + "
"
+        + e.getMessage() + "\n" + e.getStackTrace() + "
"; + return output; + } +} diff --git a/src/main/java/com/spun/util/servlets/ExpiredSessionError.java b/src/main/java/com/spun/util/servlets/ExpiredSessionError.java new file mode 100644 index 0000000..6c395df --- /dev/null +++ b/src/main/java/com/spun/util/servlets/ExpiredSessionError.java @@ -0,0 +1,27 @@ +package com.spun.util.servlets; + + +public class ExpiredSessionError + extends RuntimeException +{ + + private String htmlText; + + /***********************************************************************/ + public ExpiredSessionError() + { + htmlText = "

You are trying to reload an expired page

"; + } + /***********************************************************************/ + public void setHTMLText(String htmlText) + { + this.htmlText = htmlText; + } + /***********************************************************************/ + public String getHTMLText() + { + return htmlText; + } + /***********************************************************************/ + /***********************************************************************/ +} diff --git a/src/main/java/com/spun/util/servlets/InvokerServlet.java b/src/main/java/com/spun/util/servlets/InvokerServlet.java new file mode 100644 index 0000000..780fccd --- /dev/null +++ b/src/main/java/com/spun/util/servlets/InvokerServlet.java @@ -0,0 +1,113 @@ +package com.spun.util.servlets; + +/* + * 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. + */ +import java.io.IOException; +import java.util.HashMap; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import com.spun.util.MySystem; +import com.spun.util.ObjectUtils; + +/** + * The default servlet-invoking servlet for most web applications, + * used to serve requests to servlets that have not been registered + * in the web application deployment descriptor. + * + * @author Craig R. McClanahan + * @version $Revision$ $Date$ + */ +public final class InvokerServlet extends HttpServlet +{ + HashMap servlets = new HashMap(); + private String mask; + public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException + { + serveRequest(request, response); + } + public void doHead(HttpServletRequest request, HttpServletResponse response) throws IOException, + ServletException + { + serveRequest(request, response); + } + public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, + ServletException + { + serveRequest(request, response); + } + /** + * Initialize this servlet. + */ + public void init() throws ServletException + { + mask = getServletConfig().getInitParameter("mask"); + MySystem.variable("Mask", mask); + } + /***********************************************************************/ + public void destroy() + { + for (HttpServlet servlet : servlets.values()) + { + servlet.destroy(); + } + super.destroy(); + } + /***********************************************************************/ + public void serveRequest(HttpServletRequest request, HttpServletResponse response) throws IOException, + ServletException + { + String pathInfo = request.getPathInfo(); + String servletClass = pathInfo.substring(1); + int slash = servletClass.indexOf('/'); + if (slash >= 0) + { + // pathInfo = servletClass.substring(slash); + servletClass = servletClass.substring(0, slash); + } + else + { + // pathInfo = ""; + } + // My_System.variable("servletClass",servletClass); + if (!servletClass.startsWith(mask)) + { + response.sendError(HttpServletResponse.SC_NOT_FOUND, servletClass); + return; + } + HttpServlet servlet; + synchronized (this) + { + servlet = servlets.get(servletClass); + if (servlet == null) + { + try + { + servlet = (HttpServlet) Class.forName(servletClass).newInstance(); + servlet.init(getServletConfig()); + } + catch (Throwable e) + { + ObjectUtils.throwAsError(e); + } + servlets.put(servletClass, servlet); + } + } + servlet.service(request, response); + } +} diff --git a/src/main/java/com/spun/util/servlets/PassThrough.java b/src/main/java/com/spun/util/servlets/PassThrough.java new file mode 100644 index 0000000..8de1a31 --- /dev/null +++ b/src/main/java/com/spun/util/servlets/PassThrough.java @@ -0,0 +1,101 @@ +package com.spun.util.servlets; + +import javax.servlet.http.HttpServletRequest; + + + +public class PassThrough +{ + private String key = null; + private SynchronizedServlet servlet= null; + private String htmlText = null; + private Throwable error = null; + private long created = 0; + private ProgressBar progressBar; + /***********************************************************************/ + public PassThrough(HttpServletRequest req, SynchronizedServlet servlet) + { + this(req, servlet, null); + } + /***********************************************************************/ + public PassThrough(HttpServletRequest req, SynchronizedServlet servlet, ProgressBar progressBar) + { + try + { + this.key = req.getSession().getId(); + } + catch(java.lang.NoSuchMethodError e) + { + this.key = req.getRemoteAddr(); // backwards compatability. + } + this.progressBar = progressBar; + this.servlet = servlet; + created = System.currentTimeMillis(); + } + /***********************************************************************/ + public PassThrough(String key, SynchronizedServlet servlet) + { + this.key = key; + this.servlet = servlet; + created = System.currentTimeMillis(); + } + /***********************************************************************/ + public SynchronizedServlet getSynchronizedServlet() + { + return servlet; + } + /***********************************************************************/ + public String getKey() + { + return key; + } + /***********************************************************************/ + public long getCreationTime() + { + return created; + } + /***********************************************************************/ + public String getResponse() + throws InterruptedException, Throwable + { + while (htmlText == null) + { + Thread.sleep(200); + if (error != null) + { + if (progressBar != null) + { + progressBar.doFinish(); + } + throw error; + } + } + if (progressBar != null) + { + progressBar.doFinish(); + } + return htmlText; + + } + /***********************************************************************/ + public void setResponse(String text) + { + this.htmlText = text; + } + /***********************************************************************/ + public void setError(Throwable error) + { + this.error = error; + } + /***********************************************************************/ + public void doProgressReport(double amountDone) + { + if (progressBar != null) + { + progressBar.doProgressReport(amountDone); + } + } + + /***********************************************************************/ + /***********************************************************************/ +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/servlets/ProgressBar.java b/src/main/java/com/spun/util/servlets/ProgressBar.java new file mode 100644 index 0000000..cb6118e --- /dev/null +++ b/src/main/java/com/spun/util/servlets/ProgressBar.java @@ -0,0 +1,12 @@ +package com.spun.util.servlets; + + +public interface ProgressBar +{ + /***********************************************************************/ + public void doProgressReport(double amountDone); + /***********************************************************************/ + public void doFinish(); + /***********************************************************************/ + /***********************************************************************/ +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/servlets/SecondaryErrorProcessor.java b/src/main/java/com/spun/util/servlets/SecondaryErrorProcessor.java new file mode 100644 index 0000000..6455a06 --- /dev/null +++ b/src/main/java/com/spun/util/servlets/SecondaryErrorProcessor.java @@ -0,0 +1,8 @@ +package com.spun.util.servlets; + +import com.spun.util.parser.TemplateError; + +public interface SecondaryErrorProcessor +{ + public String processError(TemplateError error, Throwable t2); +} diff --git a/src/main/java/com/spun/util/servlets/ServletLogWriterFactory.java b/src/main/java/com/spun/util/servlets/ServletLogWriterFactory.java new file mode 100644 index 0000000..a10df8d --- /dev/null +++ b/src/main/java/com/spun/util/servlets/ServletLogWriterFactory.java @@ -0,0 +1,54 @@ +package com.spun.util.servlets; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.HashMap; + +import com.spun.util.MySystem; + +public class ServletLogWriterFactory +{ + private static String TOMCAT_LOGS_PATH = getLogPath(); + private static HashMap writers = new HashMap(); + public static void reset() + { + TOMCAT_LOGS_PATH = getLogPath(); + writers = new HashMap(); + } + public static PrintWriter getWriter(BasicServlet servlet) throws IOException + { + String name = servlet.getClass().getName(); + if (writers.get(name) == null) + { + return createWriter(name); + } + else + { + return (PrintWriter) writers.get(name); + } + } + private static String getLogPath() + { + String catalina = System.getProperty("catalina.base"); + if (catalina == null) + { + MySystem.variable("properties", System.getProperties()); + } + catalina = catalina == null ? "." + File.separator : catalina; + return catalina + File.separator + "logs"; + } + private static PrintWriter createWriter(String name) throws IOException + { + String shortName = name.indexOf("$") == -1 ? name.substring(name.lastIndexOf(".") + 1) : name.substring(name + .lastIndexOf("$") + 1); + File file = new File(TOMCAT_LOGS_PATH + File.separator + shortName + ".log"); + file.getParentFile().mkdirs(); + BufferedWriter writer = new BufferedWriter(new FileWriter(file)); + PrintWriter bWriter = new PrintWriter(writer, true); + writers.put(name, bWriter); + return bWriter; + } +} diff --git a/src/main/java/com/spun/util/servlets/ServletParameterException.java b/src/main/java/com/spun/util/servlets/ServletParameterException.java new file mode 100644 index 0000000..37b7273 --- /dev/null +++ b/src/main/java/com/spun/util/servlets/ServletParameterException.java @@ -0,0 +1,21 @@ +package com.spun.util.servlets; + +public class ServletParameterException extends RuntimeException +{ + + private String value; + private String label; + + public ServletParameterException(String label, String value) + { + this.label = label; + this.value = value; + } + + public String getMessage() + { + + return "[" + label + " = '" + value + "']"; + } + +} diff --git a/src/main/java/com/spun/util/servlets/ServletSynchronizer.java b/src/main/java/com/spun/util/servlets/ServletSynchronizer.java new file mode 100644 index 0000000..f7ef438 --- /dev/null +++ b/src/main/java/com/spun/util/servlets/ServletSynchronizer.java @@ -0,0 +1,57 @@ +package com.spun.util.servlets; + +import java.util.Hashtable; + +/** + * This is the top level servlet which all others extend. + **/ +public class ServletSynchronizer +{ + private Hashtable keyHolder = new Hashtable(); + private long timeOut = 120000; + /***********************************************************************/ + public synchronized void queueServlet(PassThrough pass) + { + PassThrough old = (PassThrough) keyHolder.put(pass.getKey(), pass); + if (old != null) + { +// My_System.event("Aborted on key '" + pass.getKey() + "'"); + old.setResponse("Aborted"); + } + if ((old == null) || ((System.currentTimeMillis() - old.getCreationTime()) > timeOut)) + { + pass.getSynchronizedServlet().init(this, pass.getKey()); +// My_System.event("Started on Key '" + pass.getKey() + "'"); + new Thread(pass.getSynchronizedServlet()).start(); + } + } + /***********************************************************************/ + /** + * To pass on the response + **/ + public synchronized void servletFinished(String response, String key) + { + PassThrough pass = (PassThrough) keyHolder.remove(key); + pass.setResponse(response); + } + /***********************************************************************/ + /** + * To pass on the response + **/ + public synchronized void servletProgressReport(double amountDone, String key) + { + PassThrough pass = (PassThrough) keyHolder.get(key); + pass.doProgressReport(amountDone); + } + /***********************************************************************/ + /** + * To pass on a exception + **/ + public synchronized void servletFinished(Throwable error, String key) + { + PassThrough pass = (PassThrough) keyHolder.remove(key); + pass.setError(error); + } + /***********************************************************************/ + /***********************************************************************/ +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/servlets/StageServlet.java b/src/main/java/com/spun/util/servlets/StageServlet.java new file mode 100644 index 0000000..48f652a --- /dev/null +++ b/src/main/java/com/spun/util/servlets/StageServlet.java @@ -0,0 +1,14 @@ +package com.spun.util.servlets; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public interface StageServlet +{ + /***********************************************************************/ + public String doStage(int stage, HttpServletRequest req, HttpServletResponse res) throws Throwable; + /***********************************************************************/ + public String processError(Throwable t, HttpServletRequest req); + /***********************************************************************/ + /***********************************************************************/ +} diff --git a/src/main/java/com/spun/util/servlets/StageServletUtils.java b/src/main/java/com/spun/util/servlets/StageServletUtils.java new file mode 100644 index 0000000..e6f5dac --- /dev/null +++ b/src/main/java/com/spun/util/servlets/StageServletUtils.java @@ -0,0 +1,69 @@ +package com.spun.util.servlets; + +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.spun.util.MySystem; +import com.spun.util.NumberUtils; + +public class StageServletUtils +{ + public static final String TEXT_HTML = "text/html"; + private static long lastTime = 0; + /***********************************************************************/ + public static void doStageServlet(StageServlet servlet, HttpServletRequest req, HttpServletResponse res) + { + doStageServlet(servlet, 1, req, res); + } + /***********************************************************************/ + public static void doStageServlet(StageServlet servlet, int defaultStage, HttpServletRequest req, + HttpServletResponse res) + { + ServletOutputStream out = null; + try + { + try + { + int stage = NumberUtils.load(req.getParameter("loadStage"), defaultStage); + String html = servlet.doStage(stage, req, res); + if (html != null) + { + res.setContentType(TEXT_HTML); // Required for HTTP + out = res.getOutputStream(); + out.println(html); + } + } + catch (ExpiredSessionError e) + { + out.println(e.getHTMLText()); + } + catch (Throwable t) + { + out.println(servlet.processError(t, req)); + } + finally + { + if (out != null) + { + out.close(); + } + } + } + catch (Throwable t2) + { + MySystem.warning(t2); + } + garbageCollect(); + } + public static void garbageCollect() + { + if (30000 > (System.currentTimeMillis() - lastTime)) + { + System.gc(); + lastTime = System.currentTimeMillis(); + } + } + /***********************************************************************/ + /***********************************************************************/ +} diff --git a/src/main/java/com/spun/util/servlets/SynchronizedServlet.java b/src/main/java/com/spun/util/servlets/SynchronizedServlet.java new file mode 100644 index 0000000..f763ab1 --- /dev/null +++ b/src/main/java/com/spun/util/servlets/SynchronizedServlet.java @@ -0,0 +1,16 @@ +package com.spun.util.servlets; + +public interface SynchronizedServlet + extends Runnable +{ + /***********************************************************************/ + /** + * This should run the servlet. when it is completed, it should make a call + * back to ServletSynchronizer.servletFinished(key, result) + * @see com.spun.util.servlets.ServletSynchronizer.servletFinished(String,String) + **/ + public void init(ServletSynchronizer sync, String key); + + /***********************************************************************/ + /***********************************************************************/ +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/servlets/ValidationError.java b/src/main/java/com/spun/util/servlets/ValidationError.java new file mode 100644 index 0000000..5a8fb61 --- /dev/null +++ b/src/main/java/com/spun/util/servlets/ValidationError.java @@ -0,0 +1,182 @@ +package com.spun.util.servlets; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import com.spun.util.StringUtils; + +public class ValidationError extends RuntimeException +{ + public static final ValidationError EMPTY = new ValidationError(); + private HashMap errors = new HashMap(); + private HashSet assertions = null; + private ValidationTracker iterator = null; + /***********************************************************************/ + public ValidationError(Enum enumumations[]) + { + this.assertions = new HashSet(); + for (Enum e : enumumations) + { + this.assertions.add(e.toString()); + } + } + /***********************************************************************/ + public ValidationError(String assertions[]) + { + this.assertions = new HashSet(); + if (assertions != null) + { + this.assertions.addAll(Arrays.asList(assertions)); + } + } + public ValidationError() + { + this.assertions = new HashSet(); + } + /***********************************************************************/ + public String getMessage() + { + return toString(); + } + /***********************************************************************/ + public String toString() + { + return "Validation(s) failed " + errors.keySet().toString() + " - " + errors.values().toString(); + } + /***********************************************************************/ + public ValidationTracker getTracker() + { + if (iterator == null) + { + iterator = new ValidationTracker(this); + } + return iterator; + } + /***********************************************************************/ + public void set(Enum assertion, boolean isOk, String errorDescription) + { + setError(assertion.toString(), !isOk, errorDescription); + } + /***********************************************************************/ + public void setError(String assertion, boolean isError, String errorDescription) + { + if (isError && !StringUtils.isNonZero(errorDescription)) { throw new Error( + "You can not use empty error descriptions"); } + assertValidAssertion(assertion); + if (isError) + { + errors.put(assertion, errorDescription); + } + else + { + errors.remove(assertion); + } + } + /***********************************************************************/ + public void setIfValid(String assertion, boolean isError, String errorDescription) + { + if (!isOk()) { return; } + setError(assertion, isError, errorDescription); + } + /***********************************************************************/ + public ValidationError add(String prefix, int index, ValidationError error) + { + return add(getPrefixForIndex(prefix, index), error); + } + /***********************************************************************/ + public ValidationError addForRange(String prefix, int startInclusive, int endExclusive, ValidationError error) + { + for (int i = startInclusive; i < endExclusive; i++) + { + add(getPrefixForIndex(prefix, i), error); + } + return this; + } + /***********************************************************************/ + public static String getPrefixForIndex(String prefix, int index) + { + return prefix + "[" + index + "]"; + } + /***********************************************************************/ + public ValidationError add(String prefix, ValidationError error) + { + prefix = StringUtils.isEmpty(prefix) ? "" : (prefix + "."); + String[] assertions = StringUtils.toArray(error.assertions); + for (int i = 0; i < assertions.length; i++) + { + this.assertions.add(prefix + assertions[i]); + } + Iterator iterator = error.errors.keySet().iterator(); + while (iterator.hasNext()) + { + String key = (String) iterator.next(); + errors.put(prefix + key, error.errors.get(key)); + } + return this; + } + /***********************************************************************/ + public boolean isOk() + { + return (errors.size() == 0); + } + /***********************************************************************/ + private void assertValidAssertion(String assertion) + { + if (!this.assertions.contains(assertion)) + { + //My_System.warning("Assertion '" + assertion + "' not found from " + assertions.toString()); + throw new Error("Assertion '" + assertion + "' not found from " + assertions.toString()); + } + } + /***********************************************************************/ + public boolean isValid(Enum e) + { + return isValid(e.toString()); + } + /***********************************************************************/ + public boolean isValid(String assertion) + { + assertValidAssertion(assertion); + return (errors.get(assertion) == null); + } + /***********************************************************************/ + public int size() + { + return errors.size(); + } + /***********************************************************************/ + public String getErrorDescription(Enum assertion) + { + return getErrorDescription(assertion.toString()); + } + /***********************************************************************/ + /** + * This get the description of the error + * @return The text description of the error or "" if the assertion was valid + **/ + public String getErrorDescription(String assertion) + { + assertValidAssertion(assertion); + String errorDescription = (String) errors.get(assertion); + return (errorDescription == null) ? "" : errorDescription; + } + /***********************************************************************/ + public String[] getAllErrorTitles() + { + return StringUtils.toArray(errors.keySet()); + } + /***********************************************************************/ + public void assertValid() + { + if (!isOk()) { throw this; } + } + /***********************************************************************/ + /***********************************************************************/ + public boolean isOnlyProblem(Enum e) + { + String assertion = e.toString(); + assertValidAssertion(assertion); + return (errors.get(assertion) != null) && errors.size() == 1; + } +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/servlets/ValidationTracker.java b/src/main/java/com/spun/util/servlets/ValidationTracker.java new file mode 100644 index 0000000..945e25f --- /dev/null +++ b/src/main/java/com/spun/util/servlets/ValidationTracker.java @@ -0,0 +1,67 @@ +package com.spun.util.servlets; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Arrays; +import com.spun.util.StringUtils; + +public class ValidationTracker implements Serializable +{ + private static final long serialVersionUID = -5910435589128935375L; + private ArrayList errors = null; + private ValidationError validationError = null; + + /***********************************************************************/ + public ValidationTracker(ValidationError validationError) + { + this.validationError = validationError; + errors = new ArrayList(); + errors.addAll(Arrays.asList(validationError.getAllErrorTitles())); + } + + /***********************************************************************/ + public boolean isValid(Enum assertion) + { + return isValid(assertion.toString()); + } + + /***********************************************************************/ + public boolean isValid(String assertion) + { + errors.remove(assertion); + return validationError.isValid(assertion); + } + + /***********************************************************************/ + public boolean isValidForIndex(String prefix, int index, String assertion) + { + return isValid(ValidationError.getPrefixForIndex(prefix, index) + "." + + assertion); + } + + /***********************************************************************/ + public String[] getRemainingErrors() + { + return StringUtils.toArray(errors); + } + + /***********************************************************************/ + public boolean hasRemainingErrors() + { + boolean hasRemainingErrors = !errors.isEmpty(); + if (hasRemainingErrors) + { + throw new Error("HTML did not catch following errors: " + + errors.toString()); + } + return hasRemainingErrors; + } + + /***********************************************************************/ + public ValidationError getValidationError() + { + return validationError; + } + /***********************************************************************/ + /***********************************************************************/ +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/timers/Clock.java b/src/main/java/com/spun/util/timers/Clock.java new file mode 100644 index 0000000..8a3f7b5 --- /dev/null +++ b/src/main/java/com/spun/util/timers/Clock.java @@ -0,0 +1,9 @@ +package com.spun.util.timers; + +public class Clock +{ + public long getTime() + { + return System.currentTimeMillis(); + } +} diff --git a/src/main/java/com/spun/util/timers/Counter.java b/src/main/java/com/spun/util/timers/Counter.java new file mode 100644 index 0000000..68ff395 --- /dev/null +++ b/src/main/java/com/spun/util/timers/Counter.java @@ -0,0 +1,105 @@ +package com.spun.util.timers; + +import com.spun.util.DateDifference; + +/** + * A Utility for counting things. + **/ +public class Counter +{ + private int count = 0; + private long lastTime = 0; + private long startTime = 0; + private String label = null; + /************************************************************************/ + public Counter() + { + this(null); + } + /************************************************************************/ + public Counter(String label) + { + this.label = label; + this.startTime = System.currentTimeMillis(); + this.lastTime = this.startTime; + } + /************************************************************************/ + public void inc() + { + count++; + lastTime = System.currentTimeMillis(); + } + /************************************************************************/ + public void reset() + { + count = 0; + lastTime = System.currentTimeMillis(); + } + /************************************************************************/ + public int getCount() + { + return count; + } + /************************************************************************/ + public long getLastTime() + { + return lastTime; + } + /************************************************************************/ + public int getAverageClicksPerTime(long timeInMilli) + { + return (int) (getCount() / ((double) getTimeSinceStart() / timeInMilli)); + } + /************************************************************************/ + public long getTimeSinceLast() + { + return System.currentTimeMillis() - lastTime; + } + /************************************************************************/ + public long getTimeSinceStart() + { + return System.currentTimeMillis() - startTime; + } + /************************************************************************/ + public DateDifference getLastTimeDifference() + { + return new DateDifference(System.currentTimeMillis() - lastTime); + } + /************************************************************************/ + public String toString() + { + return "Counter [Count, Time] = [" + count + ", " + getLastTimeDifference().getStandardTimeText(2) + "]"; + } + /************************************************************************/ + /** + * A convenience function to turn a vector of Counter objects + * into an Array of the Counter objects. + * @param vectorOf a Vector of Counter objects + * @return the array of Counter. + * @throws Error if an element of vectorOf is not a Counter object. + **/ + public static Counter[] toArray(java.util.Vector vectorOf) + { + if (vectorOf == null) { return new Counter[0]; } + Counter array[] = new Counter[vectorOf.size()]; + for (int i = 0; i < array.length; i++) + { + java.lang.Object rowObject = vectorOf.elementAt(i); + if (rowObject instanceof Counter) + { + array[i] = (Counter) rowObject; + } + else + { + throw new Error("toArray[i] is not an instance of Counter but a " + rowObject.getClass().getName()); + } + } + return array; + } + /************************************************************************/ + /************************************************************************/ + public String getLabel() + { + return label; + } +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/timers/EventTime.java b/src/main/java/com/spun/util/timers/EventTime.java new file mode 100644 index 0000000..51b4156 --- /dev/null +++ b/src/main/java/com/spun/util/timers/EventTime.java @@ -0,0 +1,222 @@ +package com.spun.util.timers; + +import java.io.Serializable; +import com.spun.util.DateDifference; + +/** + * A Utility for timing an event multiple times. + * Holds min, max, timeouts. ect... + **/ +public class EventTime +{ + public enum SortBy { + NAME, COUNT, TOTAL_TIME, AVERAGE_TIME, MIN_TIME, MAX_TIME, EXCEEDED_COUNT + } + private static final String enumeration[] = {"unknown", + "name", + "count", + "total time", + "average time", + "min time", + "max time", + "excceded count" }; + private int count = 0; + private long totalTime = 0; + private String label = null; + private long maxTime = 0; + private long minTime = Long.MAX_VALUE; + private long timeLimit = 0; + private Counter timeLimitExceeded = null; + /************************************************************************/ + public EventTime() + { + } + /************************************************************************/ + public EventTime(String eventName, long timeLimit) + { + this.label = eventName; + this.timeLimit = timeLimit; + this.timeLimitExceeded = (timeLimit > 0) ? new Counter() : null; + } + /************************************************************************/ + public static int convertEnumerationString(String enumm) + { + int found = 0; + for (int i = 0; i < enumeration.length; i++) + { + if (enumeration[i].equalsIgnoreCase(enumm)) + { + found = i; + break; + } + } + return found; + } + /************************************************************************/ + public void add(long time) + { + totalTime += time; + count++; + maxTime = (time > maxTime) ? time : maxTime; + minTime = (time < minTime) ? time : minTime; + if ((timeLimitExceeded != null) && (time > timeLimit)) + { + timeLimitExceeded.inc(); + } + } + /************************************************************************/ + public void reset() + { + maxTime = 0; + minTime = Long.MAX_VALUE; + count = 0; + totalTime = 0; + } + /************************************************************************/ + public int getCount() + { + return count; + } + /************************************************************************/ + public String getLabel() + { + return label; + } + /************************************************************************/ + public long getTotalTime() + { + return totalTime; + } + /************************************************************************/ + public long getMaxTime() + { + return maxTime; + } + /************************************************************************/ + public DateDifference getMaxTimeAsDateDifference() + { + return new DateDifference(maxTime); + } + /************************************************************************/ + public long getTimeLimit() + { + return timeLimit; + } + /************************************************************************/ + public DateDifference getTimeLimitAsDateDifference() + { + return new DateDifference(timeLimit); + } + /************************************************************************/ + public Counter getTimeLimitExceededCounter() + { + return timeLimitExceeded; + } + /************************************************************************/ + public long getMinTime() + { + return minTime; + } + /************************************************************************/ + public DateDifference getMinTimeAsDateDifference() + { + return new DateDifference(minTime); + } + /************************************************************************/ + public long getAverageTime() + { + return (getCount() == 0) ? 0 : getTotalTime() / getCount(); + } + /************************************************************************/ + public DateDifference getAverageTimeAsDateDifference() + { + return new DateDifference(getAverageTime()); + } + /************************************************************************/ + public String toString() + { + String value = "com.spun.util.timers.EventTime["; + value += " count = " + count + ",\n" + " label = '" + label + "'" + ",\n" + " maxTime = " + maxTime + ",\n" + + " minTime = " + minTime + ",\n" + " timeLimit = " + timeLimit + ",\n" + " totalTime = " + totalTime + + "]"; + return value; + } + /************************************************************************/ + /** + * A convenience function to turn a vector of EventTime objects + * into an Array of the EventTime objects. + * @param vectorOf a Vector of EventTime objects + * @return the array of EventTime. + * @throws Error if an element of vectorOf is not a EventTime object. + **/ + public static EventTime[] toArray(java.util.Vector vectorOf) + { + if (vectorOf == null) { return new EventTime[0]; } + EventTime array[] = new EventTime[vectorOf.size()]; + for (int i = 0; i < array.length; i++) + { + java.lang.Object rowObject = vectorOf.elementAt(i); + if (rowObject instanceof EventTime) + { + array[i] = (EventTime) rowObject; + } + else + { + throw new Error("toArray[i] is not an instance of EventTime but a " + rowObject.getClass().getName()); + } + } + return array; + } + /************************************************************************/ + /** Inner Classes **/ + /************************************************************************/ + /** + * For use with java.util.Arrays.sort(Trade[], Trade.SortAddDate). + **/ + public static class SortEventTimers implements java.util.Comparator, Serializable + { + private SortBy type = null; + private int asc = 0; + /************************************************************************/ + public SortEventTimers(SortBy type, boolean asc) + { + this.type = type; + this.asc = (asc) ? 1 : -1; + } + /************************************************************************/ + public int compare(Object o1, Object o2) throws java.lang.ClassCastException + { + if ((o1 instanceof EventTime) && (o2 instanceof EventTime)) + { + EventTime et1 = (EventTime) o1; + EventTime et2 = (EventTime) o2; + switch (type) + { + case NAME : + return asc * et1.getLabel().compareToIgnoreCase(et2.getLabel()); + case COUNT : + return asc * (et1.getCount() - et2.getCount()); + case TOTAL_TIME : + return asc * (int) (et1.getTotalTime() - et2.getTotalTime()); + case AVERAGE_TIME : + return asc * (int) (et1.getAverageTime() - et2.getAverageTime()); + case MIN_TIME : + return asc * (int) (et1.getMinTime() - et2.getMinTime()); + case MAX_TIME : + return asc * (int) (et1.getMaxTime() - et2.getMaxTime()); + case EXCEEDED_COUNT : + return asc + * (et1.getTimeLimitExceededCounter().getCount() - et2.getTimeLimitExceededCounter().getCount()); + default : + return 0;//this cannot be reached + } + } + else + { + throw new java.lang.ClassCastException("Tried to compare apples and oranges in SortAddDate"); + } + } + /************************************************************************/ + /************************************************************************/ + } +} diff --git a/src/main/java/com/spun/util/timers/EventTimer.java b/src/main/java/com/spun/util/timers/EventTimer.java new file mode 100644 index 0000000..85bea30 --- /dev/null +++ b/src/main/java/com/spun/util/timers/EventTimer.java @@ -0,0 +1,42 @@ +package com.spun.util.timers; + +import java.util.Date; +import java.util.HashMap; + +/** + * A Utility for timing things. this is multi-thread safe. + **/ +public class EventTimer +{ + private EventTime time = null; + private HashMap startTimes = new HashMap(); + /************************************************************************/ + public EventTimer() + { + time = new EventTime(); + } + /************************************************************************/ + public EventTimer(String label, long timeLimit) + { + time = new EventTime(label, timeLimit); + } + /************************************************************************/ + public EventTime getEventTime() + { + return time; + } + /************************************************************************/ + public void start() + { + startTimes.put("" + Thread.currentThread().hashCode(), new Date()); + } + /************************************************************************/ + public void end() + { + Date startTime = (Date) startTimes.remove("" + Thread.currentThread().hashCode()); + if (startTime == null) { throw new Error("Tried to end when not started"); } + time.add(System.currentTimeMillis() - startTime.getTime()); + } + /************************************************************************/ + /************************************************************************/ +} diff --git a/src/main/java/com/spun/util/timers/LapTime.java b/src/main/java/com/spun/util/timers/LapTime.java new file mode 100644 index 0000000..ae55afa --- /dev/null +++ b/src/main/java/com/spun/util/timers/LapTime.java @@ -0,0 +1,81 @@ +package com.spun.util.timers; + +import com.spun.util.DateDifference; + +/** + * A Utility for timing things. this is multi-thread safe. + **/ +public class LapTime +{ + private long lapTime = 0; + private String label = null; + + /************************************************************************/ + public LapTime(long lapTime, String label) + { + this.label = label; + this.lapTime = lapTime; + } + + /************************************************************************/ + public long getLapTime() + { + return lapTime; + } + + /************************************************************************/ + public String getLabel() + { + return label; + } + + /************************************************************************/ + public DateDifference getLapTimeAsDateDifference() + { + return new DateDifference(lapTime); + } + + /************************************************************************/ + /** + * A convenience function to turn a ArrayList of LapTime objects into an Array + * of the LapTime objects. + * + * @param ArrayListOf + * a ArrayList of LapTime objects + * @return the array of LapTime. + * @throws Error + * if an element of ArrayListOf is not a LapTime object. + **/ + public static LapTime[] toArray(java.util.ArrayList ArrayListOf) + { + if (ArrayListOf == null) + { + return new LapTime[0]; + } + LapTime array[] = new LapTime[ArrayListOf.size()]; + for (int i = 0; i < array.length; i++) + { + java.lang.Object rowObject = ArrayListOf.get(i); + if (rowObject instanceof LapTime) + { + array[i] = (LapTime) rowObject; + } else + { + throw new Error("toArray[i] is not an instance of LapTime but a " + + rowObject.getClass().getName()); + } + } + return array; + } + + /************************************************************************/ + public String toString() + { + String value = "com.spun.util.timers.LapTime["; + value += " Label = '" + label + "'" + ",\n" + " Lap Time = " + + getLapTimeAsDateDifference().getStandardTimeText(1) + "]"; + return value; + } + /***********************************************************************/ + /***********************************************************************/ +} diff --git a/src/main/java/com/spun/util/timers/LapTimeStatistics.java b/src/main/java/com/spun/util/timers/LapTimeStatistics.java new file mode 100644 index 0000000..57d53ef --- /dev/null +++ b/src/main/java/com/spun/util/timers/LapTimeStatistics.java @@ -0,0 +1,78 @@ +package com.spun.util.timers; + +/** + * A Utility for timing things. this is multi-thread safe. + **/ +public class LapTimeStatistics +{ + private String label = null; + private EventTime totalTime = null; + private EventTime times[] = null; + /************************************************************************/ + public LapTimeStatistics(LapTimer lapTimer) + { + loadFirstLapTimer(lapTimer); + } + /************************************************************************/ + public LapTimeStatistics(String label) + { + this.label = label; + } + /************************************************************************/ + public int getCount() + { + return (totalTime == null) ? 0 : totalTime.getCount(); + } + /************************************************************************/ + private void loadFirstLapTimer(LapTimer lapTimer) + { + if (label == null) + { + lapTimer.getLabel(); + } + totalTime = new EventTime("Total Time", 0); + totalTime.add(lapTimer.getTotalTime()); + LapTime lapTimes[] = lapTimer.getLapTimes(); + times = new EventTime[lapTimes.length]; + for (int i = 0; i < lapTimes.length; i++) + { + times[i] = new EventTime(lapTimes[i].getLabel(), 0); + times[i].add(lapTimes[i].getLapTime()); + } + } + /************************************************************************/ + public EventTime getTotalTime() + { + return totalTime; + } + /************************************************************************/ + public String getLabel() + { + return label; + } + /************************************************************************/ + public synchronized void add(LapTimer lapTimer) + { + if (totalTime == null) + { + loadFirstLapTimer(lapTimer); + } + else + { + totalTime.add(lapTimer.getTotalTime()); + LapTime lapTimes[] = lapTimer.getLapTimes(); + if (lapTimes.length != times.length) { throw new Error("Tried to add a LapTimer with " + lapTimes.length + " laps. Must have " + times.length); } + for (int i = 0; i < lapTimes.length; i++) + { + times[i].add(lapTimes[i].getLapTime()); + } + } + } + /***********************************************************************/ + public EventTime[] getLapTimes() + { + return this.times; + } + /***********************************************************************/ + /***********************************************************************/ +} diff --git a/src/main/java/com/spun/util/timers/LapTimer.java b/src/main/java/com/spun/util/timers/LapTimer.java new file mode 100644 index 0000000..6c92132 --- /dev/null +++ b/src/main/java/com/spun/util/timers/LapTimer.java @@ -0,0 +1,171 @@ +package com.spun.util.timers; + +import java.util.ArrayList; +import com.spun.util.DateDifference; +import com.spun.util.MySystem; + +/** + * A Utility for timing things. this is NOT multi-thread safe. + **/ +public class LapTimer +{ + private long startTime = 0; + private long lapTime = 0; + private long endTime = 0; + private ArrayList lapTimes = null; + private String label = null; + private long pausedTime = 0; + private long pausedTotalTime = 0; + private static Clock clock = new Clock(); + public static void registerClock(Clock clock) + { + LapTimer.clock = clock; + } + /************************************************************************/ + public LapTimer() + { + this(null); + } + /************************************************************************/ + public LapTimer(String label) + { + startTime = getCurrentTime(); + lapTime = startTime; + lapTimes = new ArrayList(); + this.label = label; + } + private long getCurrentTime() + { + return clock.getTime(); + } + /************************************************************************/ + public String getLabel() + { + return label; + } + /************************************************************************/ + /** + * Marks the time for a lap & a label. + * ie. A timer could store - 1 hour 10 mins ["1st Quarter", 15 mins,"2nd Quarter", 15 mins,"Half Time", 10 mins, "3rd Quarter", 15 mins,"4th Quarter", 15 mins] + **/ + public long lap(String label) + { + return lap(false, label); + } + /************************************************************************/ + public long end(String label) + { + return lap(true, label); + } + /************************************************************************/ + public boolean isPaused() + { + return pausedTime != 0; + } + /************************************************************************/ + public void pause() + { + if (!isPaused()) + { + pausedTime = getCurrentTime(); + } + } + /************************************************************************/ + public void resume() + { + if (isPaused()) + { + lapTime = getCurrentTime(); + pausedTotalTime += lapTime - pausedTime; + pausedTime = 0; + } + } + /************************************************************************/ + public long lap(boolean end, String label) + { + long newTime = getCurrentTime(); + long difference = newTime - lapTime; + MySystem.variable("difference", difference); + lapTimes.add(new LapTime(difference, label)); + lapTime = newTime; + endTime = (end) ? newTime : 0; + return difference; + } + /************************************************************************/ + public LapTime[] getLapTimes() + { + return LapTime.toArray(lapTimes); + } + /************************************************************************/ + public int getLapCount() + { + return lapTimes.size(); + } + /************************************************************************/ + public LapTime getLap(int i) + { + if (i >= lapTimes.size()) { return null; } + return (LapTime) lapTimes.get(i); + } + /************************************************************************/ + public LapTime getLap(String label) + { + for (int i = 0; i < lapTimes.size(); i++) + { + LapTime time = (LapTime) lapTimes.get(i); + if (label.equals(time.getLabel())) { return time; } + } + return null; + } + /************************************************************************/ + public long getTotalTime() + { + long lastrecordedTime = 0; + if (endTime != 0) + { + lastrecordedTime = endTime; + } + else if (isPaused()) + { + lastrecordedTime = pausedTime; + } + else + { + lastrecordedTime = getCurrentTime(); + } + return lastrecordedTime - startTime - pausedTotalTime; + } + /************************************************************************/ + public DateDifference getTotalTimeAsDateDifference() + { + return new DateDifference(getTotalTime()); + } + /************************************************************************/ + public String toString() + { + String value = String + .format( + "com.spun.util.timers.LapTimer[ Label = '%s',\n isPaused = %s ,\n Lap Times = %s ,\n Total Paused Time = %s ,\n Total Time = %s]", + label, isPaused(), getPrintableLapTimesArray(), new DateDifference(pausedTotalTime) + .getStandardTimeText(1), getTotalTimeAsDateDifference().getStandardTimeText(1)); + return value; + } + /************************************************************************/ + /** + * convenience function for toString(). + **/ + private String getPrintableLapTimesArray() + { + LapTime times[] = getLapTimes(); + String output = "["; + for (int i = 0; i < times.length; i++) + { + output += (i > 0) ? ", " : ""; + output += times[i].getLapTimeAsDateDifference().getStandardTimeText(2); + } + output += "]"; + return output; + } + /***********************************************************************/ + /***********************************************************************/ +} diff --git a/src/main/java/com/spun/util/timers/MetricsDisplayer.java b/src/main/java/com/spun/util/timers/MetricsDisplayer.java new file mode 100644 index 0000000..97ea64e --- /dev/null +++ b/src/main/java/com/spun/util/timers/MetricsDisplayer.java @@ -0,0 +1,36 @@ +package com.spun.util.timers; + +import org.apache.velocity.context.Context; +import com.spun.util.velocity.ContextAware; +import com.spun.util.velocity.VelocityParser; + +/** + * A Utility for timing things. this is multi-thread safe. + **/ +public class MetricsDisplayer implements ContextAware +{ + public static String TEMPLATE = "C:\\metrics_template.htm"; + private LapTimeStatistics stats = null; + /************************************************************************/ + public MetricsDisplayer(LapTimeStatistics stats) + { + this.stats = stats; + } + /************************************************************************/ + public String saveToFile(String outputFileName) + { + return VelocityParser.parseFile(TEMPLATE, outputFileName, this); + } + /***********************************************************************/ + public LapTimeStatistics getStatistics() + { + return stats; + } + /***********************************************************************/ + public void setupContext(Context context) + { + context.put("stats", stats); + } + /***********************************************************************/ + /***********************************************************************/ +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/velocity/ContextAware.java b/src/main/java/com/spun/util/velocity/ContextAware.java new file mode 100644 index 0000000..1945676 --- /dev/null +++ b/src/main/java/com/spun/util/velocity/ContextAware.java @@ -0,0 +1,41 @@ +package com.spun.util.velocity; + +import java.util.HashMap; +import java.util.Map.Entry; + +import org.apache.velocity.context.Context; + +public interface ContextAware +{ + public void setupContext(Context context); + /***********************************************************************/ + /* INNER CLASS */ + /***********************************************************************/ + public static class ContextAwareMap implements ContextAware + { + HashMap add = new HashMap(); + /***********************************************************************/ + public ContextAwareMap() + { + } + /***********************************************************************/ + public ContextAwareMap(String key, Object object) + { + put(key, object); + } + public void put(String key, Object object) + { + add.put(key, object); + } + /***********************************************************************/ + public void setupContext(Context context) + { + for (Entry entry : add.entrySet()) + { + context.put(entry.getKey(), entry.getValue()); + } + } + } + /***********************************************************************/ + /***********************************************************************/ +} diff --git a/src/main/java/com/spun/util/velocity/ParseCall.java b/src/main/java/com/spun/util/velocity/ParseCall.java new file mode 100644 index 0000000..0d7cee5 --- /dev/null +++ b/src/main/java/com/spun/util/velocity/ParseCall.java @@ -0,0 +1,6 @@ +package com.spun.util.velocity; + +public interface ParseCall +{ + public String parse(String template, ContextAware process); +} diff --git a/src/main/java/com/spun/util/velocity/ParserDateUtils.java b/src/main/java/com/spun/util/velocity/ParserDateUtils.java new file mode 100644 index 0000000..4b66e71 --- /dev/null +++ b/src/main/java/com/spun/util/velocity/ParserDateUtils.java @@ -0,0 +1,113 @@ +package com.spun.util.velocity; + +import java.util.Calendar; +import com.spun.util.DateUtils; +import com.spun.util.StringUtils; + +/***********************************************************************/ +public class ParserDateUtils +{ + public static final ParserDateUtils INSTANCE = new ParserDateUtils(); + public static Month[] getMonths() + { + return new Month[]{new Month("00", "------"), new Month("01", "Jan (01)"), new Month("02", "Feb (02)"), new Month("03", "Mar (03)"), new Month("04", "Apr (04)"), new Month("05", "May (05)"), new Month("06", "Jun (06)"), new Month("07", "Jul (07)"), new Month("08", "Aug (08)"), + new Month("09", "Sep (09)"), new Month("10", "Oct (10)"), new Month("11", "Nov (11)"), new Month("12", "Dec (12)")}; + } + /***********************************************************************/ + public static Day[] getDaysOfMonth() + { + Day[] days = new Day[32]; + days[0] = new Day("00", "--"); + for (int i = 1; i <= 31; i++) + { + days[i] = new Day(i); + } + return days; + } + /***********************************************************************/ + public static Year[] getNextXYears(int x) + { + return getNextXYears(x, 0); + } + /***********************************************************************/ + public static Year[] getNextXYears(int x, int backDateXDays) + { + Year[] years = new Year[x + 1]; + years[0] = new Year("0000", "----"); + int startingYear = DateUtils.asCalendar(DateUtils.getStartOfXDaysAgo(backDateXDays)).get(Calendar.YEAR); + for (int i = 0; i < x; i++) + { + years[i + 1] = new Year(startingYear + i); + } + return years; + } + /***********************************************************************/ + /***********************************************************************/ + /***********************************************************************/ + public static class Year extends DateValue + { + /***********************************************************************/ + public String getTwoDigitNumber() + { + return getNumber().substring(2); + } + public Year(String number, String displayText) + { + super(number, displayText); + } + /***********************************************************************/ + public Year(int i) + { + super("" + i, "" + i); + } + + } + /***********************************************************************/ + public static class Day extends DateValue + { + public Day(int i) + { + super(StringUtils.padNumber(i, 2), "" + i); + } + public Day(String number, String displayText) + { + super(number, displayText); + } + } + /***********************************************************************/ + public static class Month extends DateValue + { + public Month(String number, String displayText) + { + super(number, displayText); + } + } + /***********************************************************************/ + public static class DateValue + { + private String number; + private String displayText; + /***********************************************************************/ + public boolean isDefault() + { + return displayText.startsWith("--"); + } + /***********************************************************************/ + public DateValue(String number, String displayText) + { + this.number= number; + this.displayText = displayText; + } + /***********************************************************************/ + public String getNumber() + { + return number; + } + /***********************************************************************/ + public String getDisplayText() + { + return displayText; + } + /***********************************************************************/ + } +} diff --git a/src/main/java/com/spun/util/velocity/ServletContextLoader.java b/src/main/java/com/spun/util/velocity/ServletContextLoader.java new file mode 100644 index 0000000..8dfd9c0 --- /dev/null +++ b/src/main/java/com/spun/util/velocity/ServletContextLoader.java @@ -0,0 +1,95 @@ +package com.spun.util.velocity; + +import java.io.InputStream; +import java.util.Arrays; +import javax.servlet.ServletContext; +import org.apache.commons.collections.ExtendedProperties; +import org.apache.velocity.exception.ResourceNotFoundException; +import org.apache.velocity.runtime.resource.Resource; +import org.apache.velocity.runtime.resource.loader.ResourceLoader; + +public class ServletContextLoader extends ResourceLoader +{ + /** The root paths for templates (relative to webapp's root). */ + protected String[] paths = null; + protected static ServletContext servletContext = null; + /** + * This is abstract in the base class, so we need it. + *
+ * NOTE: this expects that the ServletContext has already + * been placed in the runtime's application attributes + * under its full class name (i.e. "javax.servlet.ServletContext"). + * + * @param configuration the {@link ExtendedProperties} associated with + * this resource loader. + */ + public void init(ExtendedProperties configuration) + { + paths = configuration.getStringArray("path"); + if (paths == null || paths.length == 0) + { + paths = new String[1]; + paths[0] = "/"; + } + else + { + /* make sure the paths end with a '/' */ + for (int i = 0; i < paths.length; i++) + { + if (!paths[i].endsWith("/")) + { + paths[i] += '/'; + } + } + } + //My_System.variable("paths", paths); + } + /** + * Get an InputStream so that the Runtime can build a + * template with it. + * + * @param name name of template to get + * @return InputStream containing the template + * @throws ResourceNotFoundException if template not found + * in classpath. + */ + public synchronized InputStream getResourceStream(String name) throws ResourceNotFoundException + { + if (name == null || name.length() == 0) { return null;} + /* since the paths always ends in '/', + * make sure the name never ends in one */ + while (name.startsWith("/")) + { + name = name.substring(1); + } + for (int i = 0; i < paths.length; i++) + { + InputStream result = null; + result = servletContext.getResourceAsStream(paths[i] + name); + if (result != null) + { + /* exit the loop if we found the template */ + return result; + } + } + throw new ResourceNotFoundException(String.format("Template '%s' not found from %s", name, Arrays.asList(paths))); + } + /** + * Defaults to return false. + */ + public boolean isSourceModified(Resource resource) + { + return false; + } + /** + * Defaults to return 0 + */ + public long getLastModified(Resource resource) + { + return 0; + } + public static void registerServletContext(ServletContext servletContext) + { + ServletContextLoader.servletContext = servletContext; + } +} diff --git a/src/main/java/com/spun/util/velocity/StringResourceLoader.java b/src/main/java/com/spun/util/velocity/StringResourceLoader.java new file mode 100644 index 0000000..c6e6a7a --- /dev/null +++ b/src/main/java/com/spun/util/velocity/StringResourceLoader.java @@ -0,0 +1,55 @@ +package com.spun.util.velocity; + +/* + * Copyright 2001-2002,2004 The Apache Software Foundation. + * + * 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. + */ +import java.io.InputStream; + +import org.apache.commons.collections.ExtendedProperties; +import org.apache.velocity.exception.ResourceNotFoundException; +import org.apache.velocity.runtime.resource.Resource; +import org.apache.velocity.runtime.resource.loader.ResourceLoader; + +import com.spun.util.StringUtils; + +/** + * This is a simple resource loader that loads the string as a template + * + **/ +public class StringResourceLoader extends ResourceLoader +{ + /***********************************************************************/ + public boolean isSourceModified(Resource resource) + { + return true; + } + /***********************************************************************/ + public long getLastModified(Resource resource) + { + return 0; + } + /***********************************************************************/ + public synchronized InputStream getResourceStream(String name) throws ResourceNotFoundException + { + return StringUtils.convertToInputStream(name); + } + /***********************************************************************/ + public void init(ExtendedProperties arg0) + { +// My_System.event("initialize"); + } + /***********************************************************************/ + /***********************************************************************/ +} diff --git a/src/main/java/com/spun/util/velocity/TestableUberspect.java b/src/main/java/com/spun/util/velocity/TestableUberspect.java new file mode 100644 index 0000000..7caf751 --- /dev/null +++ b/src/main/java/com/spun/util/velocity/TestableUberspect.java @@ -0,0 +1,275 @@ +package com.spun.util.velocity; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Enumeration; +import java.util.Iterator; +import java.util.Map; +import org.apache.velocity.runtime.RuntimeLogger; +import org.apache.velocity.runtime.parser.node.AbstractExecutor; +import org.apache.velocity.runtime.parser.node.BooleanPropertyExecutor; +import org.apache.velocity.runtime.parser.node.GetExecutor; +import org.apache.velocity.runtime.parser.node.PropertyExecutor; +import org.apache.velocity.util.ArrayIterator; +import org.apache.velocity.util.EnumerationIterator; +import org.apache.velocity.util.introspection.Info; +import org.apache.velocity.util.introspection.Introspector; +import org.apache.velocity.util.introspection.IntrospectorBase; +import org.apache.velocity.util.introspection.Uberspect; +import org.apache.velocity.util.introspection.UberspectLoggable; +import org.apache.velocity.util.introspection.VelMethod; +import org.apache.velocity.util.introspection.VelPropertyGet; +import org.apache.velocity.util.introspection.VelPropertySet; +import com.spun.util.ObjectUtils; + +/** + * Implementation of Uberspect to provide the default introspective + * functionality of Velocity + * + * @author Geir Magnusson Jr. + * @version $Id: UberspectImpl.java,v 1.2.4.1 2004/03/03 23:23:08 geirm Exp $ + */ +public class TestableUberspect implements Uberspect, UberspectLoggable +{ + /** + * the default Velocity introspector + */ + private static IntrospectorBase introspector; + private static Introspector introspectorWithLog; + private RuntimeLogger log; + private static boolean beKindToNulls = false; + /***********************************************************************/ + /** + * init - does nothing - we need to have setRuntimeLogger + * called before getting our introspector, as the default + * vel introspector depends upon it.; + */ + public void init() throws Exception + { + } + /***********************************************************************/ + public void setRuntimeLogger(RuntimeLogger runtimeLogger) + { + introspector = new IntrospectorBase(); + introspectorWithLog = new Introspector(runtimeLogger); + log = runtimeLogger; + } + public void setBeKindToNulls(boolean behavior) + { + beKindToNulls = behavior; + } + /***********************************************************************/ + public Iterator getIterator(Object obj, Info i) throws Exception + { + return getStandardIterator(obj, i); + } + /***********************************************************************/ + public static Iterator getStandardIterator(Object obj, Info i) + { + if (obj.getClass().isArray()) + { + return new ArrayIterator(obj); + } + else if (obj instanceof Collection) + { + return ((Collection) obj).iterator(); + } + else if (obj instanceof Map) + { + return ((Map) obj).values().iterator(); + } + else if (obj instanceof Iterator) + { + return ((Iterator) obj); + } + else if (obj instanceof Enumeration) { return new EnumerationIterator((Enumeration) obj); } + throw new VelocityParsingError("Could not determine type of iterator in " + "#foreach loop ", i); + } + /***********************************************************************/ + public VelMethod getMethod(Object obj, String methodName, Object[] args, Info i) throws Exception + { + if (obj == null) + { + if(beKindToNulls) + { + return null; + } + else + { + throw new VelocityParsingError("tried " + getMethodText("null", methodName, args), i); + } + } + Method m = introspector.getMethod(obj.getClass(), methodName, args); + if (m == null) { throw new VelocityParsingError("Method " + getMethodText(obj.getClass().getName(), methodName, args) + " does not exist.", i); } + return new VelMethodImpl(m); + } + /***********************************************************************/ + public static String getMethodText(String className, String methodName, Object[] args) + { + StringBuffer methodSignature = new StringBuffer(); + for (int i = 0; args != null && i < args.length; i++) + { + methodSignature.append(ObjectUtils.getClassName(args[i])); + methodSignature.append(i == (args.length - 1) ? "" : ", "); + } + return className + "." + methodName + "(" + methodSignature + ") "; + } + /***********************************************************************/ + public VelPropertyGet getPropertyGet(Object obj, String identifier, Info i) throws Exception + { + AbstractExecutor executor; + if (obj == null) { throw new VelocityParsingError("tried " + getPropertyText("null", identifier), i); } + Class claz = obj.getClass(); + // trying getFoo() + executor = new PropertyExecutor(log, introspectorWithLog, claz, identifier); + if (!executor.isAlive()) + { + // trying get("foo") + executor = new GetExecutor(log, introspectorWithLog, claz, identifier); + } + if (!executor.isAlive()) + { + // trying isFoo() + executor = new BooleanPropertyExecutor(log, introspectorWithLog, claz, identifier); + } + if (!executor.isAlive()) { throw new VelocityParsingError("Did not find " + getPropertyText(obj.getClass().getName(), identifier), i); } + return new VelGetterImpl(executor); + } + /***********************************************************************/ + private String getPropertyText(String className, String identifier) + { + return className + "." + identifier + " "; + } + /***********************************************************************/ + public VelPropertySet getPropertySet(Object obj, String identifier, Object arg, Info i) throws Exception + { + Class claz = obj.getClass(); + VelMethod vm = null; + try + { + /* + * first, we introspect for the set setter method + */ + Object[] params = {arg}; + try + { + vm = getMethod(obj, "set" + identifier, params, i); + if (vm == null) { throw new NoSuchMethodException(); } + } + catch (NoSuchMethodException nsme2) + { + StringBuffer sb = new StringBuffer("set"); + sb.append(identifier); + if (Character.isLowerCase(sb.charAt(3))) + { + sb.setCharAt(3, Character.toUpperCase(sb.charAt(3))); + } + else + { + sb.setCharAt(3, Character.toLowerCase(sb.charAt(3))); + } + vm = getMethod(obj, sb.toString(), params, i); + if (vm == null) { throw new NoSuchMethodException(); } + } + } + catch (NoSuchMethodException nsme) + { + /* + * right now, we only support the Map interface + */ + if (Map.class.isAssignableFrom(claz)) + { + Object[] params = {new Object(), new Object()}; + vm = getMethod(obj, "put", params, i); + if (vm != null) + return new VelSetterImpl(vm, identifier); + } + } + return (vm != null) ? new VelSetterImpl(vm) : null; + } + /***********************************************************************/ + /* INNER CLASS */ + /***********************************************************************/ + public static class VelMethodImpl implements VelMethod + { + Method method = null; + public VelMethodImpl(Method m) + { + method = m; + } + public Object invoke(Object o, Object[] params) throws Exception + { + return method.invoke(o, params); + } + public boolean isCacheable() + { + return true; + } + public String getMethodName() + { + return method.getName(); + } + public Class getReturnType() + { + return method.getReturnType(); + } + } + public static class VelGetterImpl implements VelPropertyGet + { + AbstractExecutor ae = null; + public VelGetterImpl(AbstractExecutor exec) + { + ae = exec; + } + public Object invoke(Object o) throws Exception + { + return ae.execute(o); + } + public boolean isCacheable() + { + return true; + } + public String getMethodName() + { + return ae.getMethod().getName(); + } + } + public static class VelSetterImpl implements VelPropertySet + { + VelMethod vm = null; + String putKey = null; + public VelSetterImpl(VelMethod velmethod) + { + this.vm = velmethod; + } + public VelSetterImpl(VelMethod velmethod, String key) + { + this.vm = velmethod; + putKey = key; + } + public Object invoke(Object o, Object value) throws Exception + { + ArrayList al = new ArrayList(); + if (putKey != null) + { + al.add(putKey); + al.add(value); + } + else + { + al.add(value); + } + return vm.invoke(o, al.toArray()); + } + public boolean isCacheable() + { + return true; + } + public String getMethodName() + { + return vm.getMethodName(); + } + } + +} diff --git a/src/main/java/com/spun/util/velocity/VelocityParser.java b/src/main/java/com/spun/util/velocity/VelocityParser.java new file mode 100644 index 0000000..5d6733e --- /dev/null +++ b/src/main/java/com/spun/util/velocity/VelocityParser.java @@ -0,0 +1,188 @@ +package com.spun.util.velocity; + +import java.io.File; +import java.io.StringWriter; +import java.io.Writer; +import java.util.Enumeration; +import java.util.Properties; + +import org.apache.log4j.Level; +import org.apache.log4j.LogManager; +import org.apache.log4j.Logger; +import org.apache.velocity.Template; +import org.apache.velocity.VelocityContext; +import org.apache.velocity.app.VelocityEngine; +import org.apache.velocity.context.Context; +import org.apache.velocity.runtime.RuntimeConstants; +import org.apache.velocity.runtime.log.NullLogSystem; + +import com.spun.util.Asserts; +import com.spun.util.ObjectUtils; +import com.spun.util.io.FileUtils; +import com.spun.util.parser.ParserCommons; + +public class VelocityParser +{ + private static VelocityEngine currentEngine = null; + /***********************************************************************/ + static + { + for (Enumeration e = LogManager.getCurrentLoggers(); e.hasMoreElements();) + { + ((Logger) e.nextElement()).setLevel(Level.OFF); + } + } + /***********************************************************************/ + public static String parseFile(String template, ContextAware process) + { + Asserts.assertFileExists("Velocity template", template); + Properties props = new Properties(); + int pathBreak = template.lastIndexOf(File.separatorChar); + pathBreak = pathBreak == -1 ? template.length() : pathBreak; + String path = template.substring(0, pathBreak); + String file = template.substring(pathBreak + 1); + props.put("resource.loader", "file"); + props.put("runtime.introspector.uberspect", TestableUberspect.class.getName()); + props.put("file.resource.loader.path", path); + props.put("velocimacro.context.localscope", "" + true); + props.put("velocimacro.permissions.allow.inline.local.scope", "" + true); + return parse(file, props, new ContextAware[]{process, Default.INSTANCE}); + } + /***********************************************************************/ + public static String parseJar(String template, ContextAware process) + { + Properties props = new Properties(); + props.put("resource.loader", "class"); + props.put("class.resource.loader.description", "Velocity Classpath Resource Loader"); + props.put("class.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); + props.put("class.resource.cache", "" + true); + props.put("runtime.introspector.uberspect", "com.spun.util.velocity.TestableUberspect"); + props.put("velocimacro.context.localscope", "" + true); + props.put("velocimacro.permissions.allow.inline.local.scope", "" + true); + return parse(template, props, new ContextAware[]{process,Default.INSTANCE}); + } + /***********************************************************************/ + public static String parseString(String template, ContextAware process) + { + Properties props = new Properties(); + props.put("resource.loader", "class"); + props.put("class.resource.loader.class", StringResourceLoader.class.getName()); + props.put("velocimacro.context.localscope", "" + true); + props.put("runtime.introspector.uberspect", TestableUberspect.class.getName()); + props.put("velocimacro.permissions.allow.inline.local.scope", "" + true); + return parse(template, props, new ContextAware[]{process,Default.INSTANCE}); + } + /***********************************************************************/ + public static String parse(String template, Properties props, ContextAware process) + { + + return parse(template, props, new ContextAware[]{process,Default.INSTANCE}); +}/***********************************************************************/ + public static String parse(String template, Properties props, ContextAware[] process) + { + StringWriter out = new StringWriter(); + parse(template, props, process, out); + return out.toString(); + } + /***********************************************************************/ + public static Writer parse(String template, Properties props, ContextAware process[], Writer out) + { + try + { + props.put("directive.foreach.counter.initial.value", "0"); + props.put(RuntimeConstants.RUNTIME_LOG_LOGSYSTEM_CLASS, NullLogSystem.class.getName()); + VelocityEngine engine = initializeEngine(props); + VelocityContext context = new VelocityContext(); + Template velocityTemplate = engine.getTemplate(template); + for (int i = 0; i < process.length; i++) + { + if(process[i] != null) process[i].setupContext(context); + } + velocityTemplate.merge(context, out); + return out; + } + catch (Exception e) + { + throw ObjectUtils.throwAsError(e); + } + } + public static synchronized VelocityEngine initializeEngine(Properties props) throws Exception + { + if (currentEngine == null || isDifferentForProperties(props, currentEngine, new String[]{"resource.loader", "file.resource.loader.path"})) + { + currentEngine = new VelocityEngine(); + currentEngine.init(props); + } + return currentEngine; + } + /***********************************************************************/ + private static boolean isDifferentForProperties(Properties props, VelocityEngine velo, String[] keys) + { + for (int i = 0; i < keys.length; i++) + { + String key = keys[i]; + if (!ObjectUtils.isEqual(props.get(key), velo.getProperty(key))) { return true; } + } + return false; + } + /***********************************************************************/ + /** + * Parse a File to a File + **/ + public static String parseFile(String templateFileName, String outputFileName, ContextAware process) + { + return parseFile(templateFileName, new File(outputFileName), process); + } + /***********************************************************************/ + /** + * Parse a File to a File + **/ + public static String parseFile(String templateFileName, File outputFile, ContextAware process) + { + try + { + String output = parseFile(templateFileName, process); + FileUtils.writeFile(outputFile, output); + return output; + } + catch (Exception e) + { + throw ObjectUtils.throwAsError(e); + } + } + /***********************************************************************/ + public static class FileParseCall implements ParseCall + { + public static FileParseCall INSTANCE = new FileParseCall(); + public String parse(String template, ContextAware process) + { + return parseFile(template, process); + } + } + /***********************************************************************/ + public static class JarParseCall implements ParseCall + { + public static JarParseCall INSTANCE = new JarParseCall(); + public String parse(String template, ContextAware process) + { + return parseJar(template, process); + } + } + /***********************************************************************/ + public static class Default implements ContextAware + { + public static ContextAware INSTANCE = new Default(); + public void setupContext(Context context) + { + context.put("commons", ParserCommons.INSTANCE); + } + } + /***********************************************************************/ + /***********************************************************************/ + public static String parseFromClassPath(Class clazz, String string, ContextAware context) + { + String resource = FileUtils.readFromClassPath(clazz, string); + return parseString(resource, context); + } + +} diff --git a/src/main/java/com/spun/util/velocity/VelocityParsingError.java b/src/main/java/com/spun/util/velocity/VelocityParsingError.java new file mode 100644 index 0000000..1ab4b3e --- /dev/null +++ b/src/main/java/com/spun/util/velocity/VelocityParsingError.java @@ -0,0 +1,32 @@ +package com.spun.util.velocity; + +import org.apache.velocity.util.introspection.Info; + +public class VelocityParsingError extends Error +{ + + private String message; + private transient Info info; + + public VelocityParsingError(String message, Info info) + { + this.message = message; + this.info = info; + } + + public String getMessage() + { + return message + " " + getInfoText(info); + } + /***********************************************************************/ + public static String getInfoText(Info i) + { + return " at [" + i.getLine() + "," + i.getColumn() + "]" + " in template " + i.getTemplateName(); + } + + public Info getInfo() + { + return info; + } + +} diff --git a/src/main/java/org/approvaltests/Approvals.java b/src/main/java/org/approvaltests/Approvals.java new file mode 100644 index 0000000..7488e52 --- /dev/null +++ b/src/main/java/org/approvaltests/Approvals.java @@ -0,0 +1,240 @@ +package org.approvaltests; + +import java.awt.Component; +import java.awt.Image; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.FileFilter; +import java.io.FilenameFilter; +import java.nio.file.Path; +import java.sql.ResultSet; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +import org.approvaltests.ReporterFactory.FileTypes; +import org.approvaltests.approvers.FileApprover; +import org.approvaltests.core.ApprovalFailureOverrider; +import org.approvaltests.core.ApprovalFailureReporter; +import org.approvaltests.core.ApprovalWriter; +import org.approvaltests.namer.ApprovalNamer; +import org.approvaltests.namer.JUnitStackTraceNamer; +import org.approvaltests.writers.ApprovalBinaryFileWriter; +import org.approvaltests.writers.ApprovalTextWriter; +import org.approvaltests.writers.ApprovalXmlWriter; +import org.approvaltests.writers.ComponentApprovalWriter; +import org.approvaltests.writers.DirectoryToDirectoryWriter; +import org.approvaltests.writers.FileApprovalWriter; +import org.approvaltests.writers.ImageApprovalWriter; +import org.approvaltests.writers.ResultSetApprovalWriter; +import org.lambda.functions.Function1; +import org.lambda.functions.implementations.F1; +import org.lambda.query.Query; + +import com.spun.util.ArrayUtils; +import com.spun.util.ObjectUtils; +import com.spun.util.StringUtils; +import com.spun.util.persistence.ExecutableQuery; +import com.spun.util.persistence.SqlLoader; + +public class Approvals { + public static void verify(String response) throws Exception { + verify(new ApprovalTextWriter(response, "txt"), FileTypes.Text); + } + + public static void verify(Object o) throws Exception { + verify("" + o); + } + + public static void verifyAll(String label, T[] array) throws Exception { + verify(new ApprovalTextWriter(StringUtils.toString(label, array), "txt"), + FileTypes.Text); + } + + public static void verifyAll(String header, String label, T[] array) + throws Exception { + verify(new ApprovalTextWriter(formatHeader(header) + + StringUtils.toString(label, array), "txt"), FileTypes.Text); + } + + public static void verifyAll(T[] values, Function1 f1) { + String text = ArrayUtils.toString(values, f1); + verify(new ApprovalTextWriter(text, "txt"), FileTypes.Text); + } + + public static void verifyAll(String header, T[] values, + Function1 f1) { + verifyAll(header, Arrays.asList(values), f1); + } + + public static void verifyAll(String header, Iterable array, + Function1 f1) { + String text = formatHeader(header) + ArrayUtils.toString(array, f1); + verify(new ApprovalTextWriter(text, "txt"), FileTypes.Text); + } + + private static String formatHeader(String header) { + return StringUtils.isEmpty(header) ? "" : header + "\r\n\r\n\r\n"; + } + + public static void verifyAll(String label, Iterable array) + throws Exception { + verify(new ApprovalTextWriter(StringUtils.toString(label, array), "txt"), + FileTypes.Text); + } + + public static void verifyAll(String header, String label, + Iterable array) throws Exception { + verify(new ApprovalTextWriter(formatHeader(header) + + StringUtils.toString(label, array), "txt"), FileTypes.Text); + } + + public static void verify(Component c) throws Exception { + verify(new ComponentApprovalWriter(c), FileTypes.Image); + } + + public static void verifyHtml(String response) throws Exception { + verify(new ApprovalTextWriter(response, "html"), FileTypes.Html); + } + + public static void verify(File generateFile) { + verify(new FileApprovalWriter(generateFile), FileTypes.File); + } + + public static void verify(Image image) { + // approve(ImageWriter.toBufferedImage(image), createApprovalNamer()); + } + + public static void verify(BufferedImage bufferedImage) { + verify(new ImageApprovalWriter(bufferedImage), FileTypes.Image); + } + + public static void verify(ApprovalWriter writter, ApprovalNamer namer, + ApprovalFailureReporter reporter) { + verify(new FileApprover(writter, namer), reporter); + } + + public static void verify(ApprovalWriter writter, String fileType) { + verify(writter, createApprovalNamer(), ReporterFactory.get(fileType)); + } + + public static void verifyXml(String xml) throws Exception { + verify(new ApprovalXmlWriter(xml), FileTypes.Text); + } + + public static void verify(FileApprover approver, + ApprovalFailureReporter reporter) { + try { + if (!approver.approve()) { + boolean passed = false; + if (reporter instanceof ApprovalFailureOverrider) { + passed = approver + .askToChangeReceivedToApproved((ApprovalFailureOverrider) reporter); + } + if (!passed) { + approver.reportFailure(reporter); + approver.fail(); + } else { + approver.cleanUpAfterSuccess(reporter); + } + } else { + approver.cleanUpAfterSuccess(reporter); + } + } catch (Exception e) { + throw ObjectUtils.throwAsError(e); + } + } + + // public static void verify(ExecutableQuery query) throws Exception + // { + // verify(new ApprovalTextWriter(query.getQuery(), "txt"), + // createApprovalNamer(), new ExecutableQueryFailure( + // query)); + // } + public static void verify(Map map) throws Exception { + verify(new ApprovalTextWriter(StringUtils.toString(map), "txt"), + FileTypes.Text); + } + + // public static void verify(RackResponse response) throws Exception + // { + // if (isImage(response)) + // { + // String fileType = "png"; + // verify(new ApprovalBinaryFileWriter(response.getResponse(), fileType), + // fileType); + // } + // else + // { + // verifyHtml(response.getResponse().toString()); + // } + // } + public static void verify(ResultSet rs) throws Exception { + verify(new ResultSetApprovalWriter(rs), "csv"); + } + + public static void verify(SqlLoader loader) throws Exception { + verify(new SqlLoader.ExecutableWrapper(loader)); + } + +// private static boolean isImage(RackResponse response) { +// String type = response.getHeaders().get(RackResponseUtils.CONTENT_TYPE); +// return RackResponseUtils.CONTENT_TYPE_IMAGE.equals(type); +// } + + public static ApprovalNamer createApprovalNamer() { + return new JUnitStackTraceNamer(); + } + + private static void approve(BufferedImage bufferedImage, ApprovalNamer namer) { + verify(new ImageApprovalWriter(bufferedImage), FileTypes.Image); + } +// +// public static void verifyEachFileInDirectory(File directory) { +// verifyEachFileAgainstMasterDirectory(directory.listFiles()); +// } +// +// public static void verifyEachFileInDirectory(File directory, +// FileFilter filter) { +// verifyEachFileAgainstMasterDirectory(directory.listFiles(filter)); +// } +// +// public static void verifyEachFileInDirectory(File directory, +// FilenameFilter filter) { +// verifyEachFileAgainstMasterDirectory(directory.listFiles(filter)); +// } + +// private static void verifyEachFileAgainstMasterDirectory(File[] files) +// throws Error { +// ApprovalNamer namer = createApprovalNamer(); +// String dirName = namer.getSourceFilePath() + Path.SEPARATOR +// + namer.getApprovalName() + ".Files"; +// File approvedDirectory = new File(dirName); +// List mismatched = new ArrayList(); +// for (File f : files) { +// if (!f.isDirectory()) { +// try { +// verify(new DirectoryToDirectoryWriter(f, approvedDirectory), +// FileTypes.File); +// } catch (Throwable e) { +// mismatched.add(f); +// } +// } +// } +// if (!mismatched.isEmpty()) { +// String message = "The Following Files did not match up: " +// + getFileNameList(mismatched); +// throw new Error(message); +// } +// } + + private static String getFileNameList(List mismatched) { + return Query.select(mismatched, + new F1(mismatched.get(1)) { + { + ret(a.getName()); + } + }).toString(); + } +} \ No newline at end of file diff --git a/src/main/java/org/approvaltests/ReporterFactory.java b/src/main/java/org/approvaltests/ReporterFactory.java new file mode 100644 index 0000000..336da28 --- /dev/null +++ b/src/main/java/org/approvaltests/ReporterFactory.java @@ -0,0 +1,107 @@ +package org.approvaltests; + +import java.lang.annotation.Annotation; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import org.approvaltests.core.ApprovalFailureReporter; +import org.approvaltests.reporters.DiffReporter; +import org.approvaltests.reporters.FileLauncherReporter; +import org.approvaltests.reporters.ImageReporter; +import org.approvaltests.reporters.MultiReporter; +import org.approvaltests.reporters.QuietReporter; +import org.approvaltests.reporters.UseReporter; + +import com.spun.util.ClassUtils; + +public class ReporterFactory +{ + private static HashMap> reporters = new HashMap>(); + public static class FileTypes + { + public static final String Text = "txt"; + public static final String Html = "html"; + public static final String Excel = "csv"; + public static final String File = "file"; + public static final String Image = "png"; + private static final String Default = "default"; + } + static + { + setupReporters(); + } + public static ApprovalFailureReporter get(String string) + { + ApprovalFailureReporter returned = getFromAnnotation(); + returned = tryFor(returned, reporters.get(string)); + returned = tryFor(returned, reporters.get(FileTypes.Default)); + return returned; + } + public static ApprovalFailureReporter getFromAnnotation() + { + UseReporter reporter = getAnnotationFromStackTrace(UseReporter.class); + return reporter == null ? null : getReporter(reporter); + } + private static ApprovalFailureReporter getReporter(UseReporter reporter) + { + Class[] classes = reporter.value(); + List reporters = new ArrayList(); + for (Class clazz : classes) + { + ApprovalFailureReporter instance = ClassUtils.create(clazz); + reporters.add(instance); + } + return reporters.size() == 1 ? reporters.get(0) : new MultiReporter(reporters); + } + private static T getAnnotationFromStackTrace(Class annotationClass) + { + StackTraceElement[] trace = Thread.currentThread().getStackTrace(); + for (StackTraceElement stack : trace) + { + Method method = null; + Class clazz = null; + try + { + String methodName = stack.getMethodName(); + clazz = Class.forName(stack.getClassName()); + method = clazz.getMethod(methodName, (Class[]) null); + } + catch (Exception e) + { + //ignore + } + T annotation = null; + if (method != null) + { + annotation = method.getAnnotation(annotationClass); + } + if (annotation != null) { return annotation; } + annotation = clazz.getAnnotation(annotationClass); + if (annotation != null) { return annotation; } + } + return null; + } + private static ApprovalFailureReporter tryFor(ApprovalFailureReporter returned, + Class trying) + { + if (returned == null && trying != null) { return ClassUtils.create(trying); } + return returned; + } + private static void setupReporters() + { + reporters.put(FileTypes.Text, DiffReporter.class); + reporters.put(FileTypes.Html, DiffReporter.class); + reporters.put(FileTypes.Excel, FileLauncherReporter.class); + reporters.put(FileTypes.File, FileLauncherReporter.class); + reporters.put(FileTypes.Image, ImageReporter.class); + reporters.put(FileTypes.Default, QuietReporter.class); + } + public static void clearAllReportersExceptDefault() + { + Class all = reporters.get(FileTypes.Default); + reporters.clear(); + reporters.put(FileTypes.Default, all); + } +} diff --git a/src/main/java/org/approvaltests/approvers/ApprovalApprover.java b/src/main/java/org/approvaltests/approvers/ApprovalApprover.java new file mode 100644 index 0000000..a0e39f1 --- /dev/null +++ b/src/main/java/org/approvaltests/approvers/ApprovalApprover.java @@ -0,0 +1,11 @@ +package org.approvaltests.approvers; + +import org.approvaltests.core.ApprovalFailureReporter; + +public interface ApprovalApprover +{ + boolean approve() throws Exception; + public void cleanUpAfterSuccess(ApprovalFailureReporter reporter) throws Exception; + void fail(); + void reportFailure(ApprovalFailureReporter reporter) throws Exception; +} diff --git a/src/main/java/org/approvaltests/approvers/FileApprover.java b/src/main/java/org/approvaltests/approvers/FileApprover.java new file mode 100644 index 0000000..6c315d1 --- /dev/null +++ b/src/main/java/org/approvaltests/approvers/FileApprover.java @@ -0,0 +1,63 @@ +package org.approvaltests.approvers; + +import java.io.File; +import java.io.IOException; + +import junit.framework.TestCase; + +import org.approvaltests.core.ApprovalFailureOverrider; +import org.approvaltests.core.ApprovalFailureReporter; +import org.approvaltests.core.ApprovalReporterWithCleanUp; +import org.approvaltests.core.ApprovalWriter; +import org.approvaltests.namer.ApprovalNamer; +import org.approvaltests.namer.NamerFactory; + +import com.spun.util.ObjectUtils; +import com.spun.util.io.FileUtils; + +public class FileApprover implements ApprovalApprover +{ + private File received; + private File approved; + private final ApprovalWriter writter; + public FileApprover(ApprovalWriter writter, ApprovalNamer namer) + { + this.writter = writter; + String base = String.format("%s%s%s", namer.getSourceFilePath(), namer.getApprovalName(), + NamerFactory.getAndClearAdditionalInformation()); + received = new File(writter.getReceivedFilename(base)); + approved = new File(writter.getApprovalFilename(base)); + } + public boolean approve() throws Exception + { + received = new File(writter.writeReceivedFile(received.getAbsolutePath())); + return approveTextFile(received, approved); + } + public void cleanUpAfterSuccess(ApprovalFailureReporter reporter) throws Exception + { + received.delete(); + if (reporter instanceof ApprovalReporterWithCleanUp) + { + ((ApprovalReporterWithCleanUp) reporter).cleanUp(received.getAbsolutePath(), approved.getAbsolutePath()); + } + } + public void reportFailure(ApprovalFailureReporter reporter) throws Exception + { + reporter.report(received.getAbsolutePath(), approved.getAbsolutePath()); + } + public void fail() + { + TestCase.assertEquals("Failed Approval", approved.getAbsolutePath(), received.getAbsolutePath()); + } + public static boolean approveTextFile(File expected, File actual) throws IOException + { + if (!expected.exists() || !actual.exists()) { return false; } + String t1 = FileUtils.readFile(expected); + String t2 = FileUtils.readFile(actual); + return ObjectUtils.isEqual(t1, t2); + } + public boolean askToChangeReceivedToApproved(ApprovalFailureOverrider reporter) throws Exception + { + return reporter.askToChangeReceivedToApproved(received.getAbsolutePath(), approved.getAbsolutePath()); + } +} diff --git a/src/main/java/org/approvaltests/core/ApprovalFailureOverrider.java b/src/main/java/org/approvaltests/core/ApprovalFailureOverrider.java new file mode 100644 index 0000000..15a2338 --- /dev/null +++ b/src/main/java/org/approvaltests/core/ApprovalFailureOverrider.java @@ -0,0 +1,7 @@ +package org.approvaltests.core; + + +public interface ApprovalFailureOverrider extends ApprovalFailureReporter +{ + public boolean askToChangeReceivedToApproved(String received, String approved) throws Exception; +} diff --git a/src/main/java/org/approvaltests/core/ApprovalFailureReporter.java b/src/main/java/org/approvaltests/core/ApprovalFailureReporter.java new file mode 100644 index 0000000..e2c6c37 --- /dev/null +++ b/src/main/java/org/approvaltests/core/ApprovalFailureReporter.java @@ -0,0 +1,6 @@ +package org.approvaltests.core; + +public interface ApprovalFailureReporter +{ + public void report(String received, String approved) throws Exception; +} diff --git a/src/main/java/org/approvaltests/core/ApprovalReporterWithCleanUp.java b/src/main/java/org/approvaltests/core/ApprovalReporterWithCleanUp.java new file mode 100644 index 0000000..aba8c6f --- /dev/null +++ b/src/main/java/org/approvaltests/core/ApprovalReporterWithCleanUp.java @@ -0,0 +1,6 @@ +package org.approvaltests.core; + +public interface ApprovalReporterWithCleanUp +{ + public void cleanUp(String received, String approved) throws Exception; +} diff --git a/src/main/java/org/approvaltests/core/ApprovalWriter.java b/src/main/java/org/approvaltests/core/ApprovalWriter.java new file mode 100644 index 0000000..213a5f3 --- /dev/null +++ b/src/main/java/org/approvaltests/core/ApprovalWriter.java @@ -0,0 +1,9 @@ +package org.approvaltests.core; + + +public interface ApprovalWriter +{ + public String writeReceivedFile(String received) throws Exception; + public String getReceivedFilename(String base); + public String getApprovalFilename(String base); +} diff --git a/src/main/java/org/approvaltests/namer/ApprovalNamer.java b/src/main/java/org/approvaltests/namer/ApprovalNamer.java new file mode 100644 index 0000000..7a77667 --- /dev/null +++ b/src/main/java/org/approvaltests/namer/ApprovalNamer.java @@ -0,0 +1,7 @@ +package org.approvaltests.namer; + +public interface ApprovalNamer +{ + String getApprovalName(); + String getSourceFilePath(); +} diff --git a/src/main/java/org/approvaltests/namer/ApprovalResults.java b/src/main/java/org/approvaltests/namer/ApprovalResults.java new file mode 100644 index 0000000..0fd265e --- /dev/null +++ b/src/main/java/org/approvaltests/namer/ApprovalResults.java @@ -0,0 +1,15 @@ +package org.approvaltests.namer; + +public class ApprovalResults +{ + public static void UniqueForOs() + { + NamerFactory.asMachineSpecificTest(new OsEnvironmentLabeller()); + } + public MultipleFilesLabeller useMultipleFiles() + { + MultipleFilesLabeller l = new MultipleFilesLabeller(); + l.next(); + return l; + } +} diff --git a/src/main/java/org/approvaltests/namer/IdeLabeller.java b/src/main/java/org/approvaltests/namer/IdeLabeller.java new file mode 100644 index 0000000..7e9549a --- /dev/null +++ b/src/main/java/org/approvaltests/namer/IdeLabeller.java @@ -0,0 +1,24 @@ +package org.approvaltests.namer; + + +import org.lambda.functions.Function0; + +public class IdeLabeller implements Function0 +{ + @Override + public String call() + { + StackTraceElement[] stackTrace = new RuntimeException().getStackTrace(); + for (StackTraceElement stackTraceElement : stackTrace) { + String className = stackTraceElement.getClassName(); + if (className.contains("intellij")) { + return "intellij"; + } else if (className.contains("eclipse")) { + return "eclipse"; + } + } + return "unknown"; + } + + +} diff --git a/src/main/java/org/approvaltests/namer/JUnitStackTraceNamer.java b/src/main/java/org/approvaltests/namer/JUnitStackTraceNamer.java new file mode 100644 index 0000000..51569a0 --- /dev/null +++ b/src/main/java/org/approvaltests/namer/JUnitStackTraceNamer.java @@ -0,0 +1,77 @@ +package org.approvaltests.namer; + +import java.io.File; +import java.lang.reflect.Method; + +import junit.framework.TestCase; + +import org.junit.Test; + +import com.spun.util.ObjectUtils; +import com.spun.util.StackTraceReflectionResult; +import com.spun.util.TestUtils; +import com.spun.util.io.StackElementSelector; + +public class JUnitStackTraceNamer implements ApprovalNamer +{ + private StackTraceReflectionResult info; + public JUnitStackTraceNamer() + { + info = TestUtils.getCurrentFileForMethod(new JUnit3StackSelector()); + } + @Override + public String getApprovalName() + { + return String.format("%s.%s", info.getClassName(), info.getMethodName()); + } + @Override + public String getSourceFilePath() + { + return info.getSourceFile().getAbsolutePath() + File.separator; + } + /**************************************************************/ + /* INNER CLASSES */ + /**************************************************************/ + public static class JUnit3StackSelector implements StackElementSelector + { + @Override + public StackTraceElement selectElement(StackTraceElement[] trace) throws Exception + { + boolean inTestCase = false; + for (int i = 0; i < trace.length; i++) + { + if (isTestCase(trace[i])) + { + inTestCase = true; + } + else if (inTestCase) { return trace[i - 1]; } + } + throw new RuntimeException("Could not find Junit TestCase you are running"); + } + private boolean isTestCase(StackTraceElement element) throws ClassNotFoundException + { + String fullClassName = element.getClassName(); + Class clazz = Class.forName(fullClassName); + boolean junit3 = ObjectUtils.isThisInstanceOfThat(clazz, TestCase.class); + if (!junit3) + { + junit3 = isTestAttribute(clazz, element.getMethodName()); + } + return junit3; + } + private boolean isTestAttribute(Class clazz, String methodName) throws ClassNotFoundException, SecurityException + { + Method method; + try + { + method = clazz.getMethod(methodName); + } + catch (Throwable e) + { + return false; + } + + return method.isAnnotationPresent(Test.class); + } + } +} diff --git a/src/main/java/org/approvaltests/namer/MultipleFilesLabeller.java b/src/main/java/org/approvaltests/namer/MultipleFilesLabeller.java new file mode 100644 index 0000000..4e99ffc --- /dev/null +++ b/src/main/java/org/approvaltests/namer/MultipleFilesLabeller.java @@ -0,0 +1,17 @@ +package org.approvaltests.namer; + +import org.lambda.functions.Function0; + +public class MultipleFilesLabeller implements Function0 +{ + private int count = 1; + @Override + public String call() + { + return "" + (count++); + } + public void next() + { + NamerFactory.asMachineSpecificTest(this); + } +} \ No newline at end of file diff --git a/src/main/java/org/approvaltests/namer/NamerFactory.java b/src/main/java/org/approvaltests/namer/NamerFactory.java new file mode 100644 index 0000000..a296bc2 --- /dev/null +++ b/src/main/java/org/approvaltests/namer/NamerFactory.java @@ -0,0 +1,20 @@ +package org.approvaltests.namer; + +import org.lambda.functions.Function0; + +public class NamerFactory +{ + private static String additionalInformation; + public static String getAndClearAdditionalInformation() + { + if (additionalInformation == null) { return ""; } + String out = "." + additionalInformation; + additionalInformation = null; + return out; + } + public static void asMachineSpecificTest(Function0 environmentLabeller) + { + additionalInformation = environmentLabeller.call(); + } + public static ApprovalResults ApprovalResults = new ApprovalResults(); +} diff --git a/src/main/java/org/approvaltests/namer/OsEnvironmentLabeller.java b/src/main/java/org/approvaltests/namer/OsEnvironmentLabeller.java new file mode 100644 index 0000000..df46f80 --- /dev/null +++ b/src/main/java/org/approvaltests/namer/OsEnvironmentLabeller.java @@ -0,0 +1,12 @@ +package org.approvaltests.namer; + +import org.lambda.functions.Function0; + +public class OsEnvironmentLabeller implements Function0 +{ + @Override + public String call() + { + return System.getProperty("os.name").replace(' ', '_'); + } +} diff --git a/src/main/java/org/approvaltests/reporters/ClipboardReporter.java b/src/main/java/org/approvaltests/reporters/ClipboardReporter.java new file mode 100644 index 0000000..1bcef2d --- /dev/null +++ b/src/main/java/org/approvaltests/reporters/ClipboardReporter.java @@ -0,0 +1,47 @@ +package org.approvaltests.reporters; + +import java.awt.GraphicsEnvironment; +import java.io.File; + +import com.spun.util.SystemUtils; +import com.spun.util.WindowUtils; + +/** + * A reporter which creates the command to accept the received + * file as the approve file and copies it to the clipboard:
+ * move received.txt approved.txt + */ +public class ClipboardReporter implements EnvironmentAwareReporter +{ + @Override + public void report(String received, String approved) throws Exception + { + WindowUtils.copyToClipBoard(getCommandLine(received, approved), false); + } + public static String getCommandLine(String received, String approved) + { + File r = new File(received); + File a = new File(approved); + String commandLine = ClipboardReporter.getAcceptApprovalText(r.getAbsolutePath(), a.getAbsolutePath()); + return commandLine; + } + /** + * The clipboard will not be available in a headless environment. + */ + @Override + public boolean isWorkingInThisEnvironment(String forFile) + { + return !GraphicsEnvironment.isHeadless(); + } + public static String getAcceptApprovalText(String received, String approved) + { + if (SystemUtils.isWindowsEnviroment()) + { + return String.format("move /Y \"%s\" \"%s\"", received, approved); + } + else + { + return String.format("mv %s %s", received, approved); + } + } +} diff --git a/src/main/java/org/approvaltests/reporters/DelayedClipboardReporter.java b/src/main/java/org/approvaltests/reporters/DelayedClipboardReporter.java new file mode 100644 index 0000000..ce50c2a --- /dev/null +++ b/src/main/java/org/approvaltests/reporters/DelayedClipboardReporter.java @@ -0,0 +1,31 @@ +package org.approvaltests.reporters; + +import java.awt.GraphicsEnvironment; + +import com.spun.util.StringUtils; +import com.spun.util.WindowUtils; + +/** + * A reporter which creates the command to accept the received + * file as the approve file and copies it to the clipboard:
+ * move received.txt approved.txt + */ +public class DelayedClipboardReporter implements EnvironmentAwareReporter +{ + private static StringBuffer text = new StringBuffer(); + @Override + public void report(String received, String approved) throws Exception + { + String commandLine = ClipboardReporter.getCommandLine(received, approved); + text.append(commandLine + StringUtils.NEW_LINE); + WindowUtils.copyToClipBoard(text.toString(), false); + } + /** + * The clipboard will not be available in a headless environment. + */ + @Override + public boolean isWorkingInThisEnvironment(String forFile) + { + return !GraphicsEnvironment.isHeadless(); + } +} diff --git a/src/main/java/org/approvaltests/reporters/DiffReporter.java b/src/main/java/org/approvaltests/reporters/DiffReporter.java new file mode 100644 index 0000000..eaf94eb --- /dev/null +++ b/src/main/java/org/approvaltests/reporters/DiffReporter.java @@ -0,0 +1,13 @@ +package org.approvaltests.reporters; + +import org.approvaltests.reporters.macosx.MacDiffReporter; +import org.approvaltests.reporters.windows.WindowsDiffReporter; + +public class DiffReporter extends FirstWorkingReporter +{ + public static final DiffReporter INSTANCE = new DiffReporter(); + public DiffReporter() + { + super(WindowsDiffReporter.INSTANCE, MacDiffReporter.INSTANCE, JunitReporter.INSTANCE, QuietReporter.INSTANCE); + } +} diff --git a/src/main/java/org/approvaltests/reporters/EnvironmentAwareReporter.java b/src/main/java/org/approvaltests/reporters/EnvironmentAwareReporter.java new file mode 100644 index 0000000..ff1327b --- /dev/null +++ b/src/main/java/org/approvaltests/reporters/EnvironmentAwareReporter.java @@ -0,0 +1,8 @@ +package org.approvaltests.reporters; + +import org.approvaltests.core.ApprovalFailureReporter; + +public interface EnvironmentAwareReporter extends ApprovalFailureReporter +{ + boolean isWorkingInThisEnvironment(String forFile); +} diff --git a/src/main/java/org/approvaltests/reporters/ExecutableQueryFailure.java b/src/main/java/org/approvaltests/reporters/ExecutableQueryFailure.java new file mode 100644 index 0000000..edc4c66 --- /dev/null +++ b/src/main/java/org/approvaltests/reporters/ExecutableQueryFailure.java @@ -0,0 +1,43 @@ +package org.approvaltests.reporters; + +import java.io.File; +import java.io.IOException; + +import org.approvaltests.ReporterFactory; +import org.approvaltests.core.ApprovalFailureReporter; +import org.approvaltests.core.ApprovalReporterWithCleanUp; + +import com.spun.util.io.FileUtils; +import com.spun.util.persistence.ExecutableQuery; + +public class ExecutableQueryFailure implements ApprovalFailureReporter, ApprovalReporterWithCleanUp +{ + private static final String FILE_ADDITION = ".queryresults.txt"; + private final ExecutableQuery query; + public ExecutableQueryFailure(ExecutableQuery query) + { + this.query = query; + } + public void report(String received, String approved) throws Exception + { + ApprovalFailureReporter reporter = ReporterFactory.get(ReporterFactory.FileTypes.Text); + reporter.report(runQueryAndGetPath(received), runQueryAndGetPath(approved)); + reporter.report(received, approved); + } + private String runQueryAndGetPath(String filename) throws IOException, Exception + { + if (!new File(filename).exists()) { return filename; } + String newQuery = FileUtils.readFile(filename).trim(); + String newResult = query.executeQuery(newQuery); + File newFile = new File(filename + FILE_ADDITION); + String header = "\t\tDo NOT approve\r\n\t\tThis File will be Deleted\r\n\t\tit is for feedback purposes only\r\n"; + FileUtils.writeFile(newFile, String.format("%squery:\n%s\n\nresult:\n%s", header, newQuery, newResult)); + return newFile.getAbsolutePath(); + } + @Override + public void cleanUp(String received, String approved) throws Exception + { + new File(received + FILE_ADDITION).delete(); + new File(approved + FILE_ADDITION).delete(); + } +} diff --git a/src/main/java/org/approvaltests/reporters/FileLauncherReporter.java b/src/main/java/org/approvaltests/reporters/FileLauncherReporter.java new file mode 100644 index 0000000..ced7faa --- /dev/null +++ b/src/main/java/org/approvaltests/reporters/FileLauncherReporter.java @@ -0,0 +1,20 @@ +package org.approvaltests.reporters; + + +import org.approvaltests.core.ApprovalFailureReporter; + +import com.spun.util.TestUtils; +import com.spun.util.io.FileUtils; + +public class FileLauncherReporter implements ApprovalFailureReporter +{ + //@Override + public void report(String received, String approved) throws Exception + { + if (FileUtils.isNonEmptyFile(approved)) + { + TestUtils.displayFile(approved); + } + TestUtils.displayFile(received); + } +} diff --git a/src/main/java/org/approvaltests/reporters/FirstWorkingReporter.java b/src/main/java/org/approvaltests/reporters/FirstWorkingReporter.java new file mode 100644 index 0000000..879f526 --- /dev/null +++ b/src/main/java/org/approvaltests/reporters/FirstWorkingReporter.java @@ -0,0 +1,31 @@ +package org.approvaltests.reporters; + +public class FirstWorkingReporter implements EnvironmentAwareReporter +{ + private final EnvironmentAwareReporter[] reporters; + public FirstWorkingReporter(EnvironmentAwareReporter... reporters) + { + this.reporters = reporters; + } + @Override + public void report(String received, String approved) throws Exception + { + for (EnvironmentAwareReporter reporter : reporters) + { + if (reporter.isWorkingInThisEnvironment(received)) + { + reporter.report(received, approved); + return; + } + } + } + @Override + public boolean isWorkingInThisEnvironment(String forFile) + { + for (EnvironmentAwareReporter reporter : reporters) + { + if (reporter.isWorkingInThisEnvironment(forFile)) { return true; } + } + return false; + } +} diff --git a/src/main/java/org/approvaltests/reporters/GenericDiffReporter.java b/src/main/java/org/approvaltests/reporters/GenericDiffReporter.java new file mode 100644 index 0000000..f2d4b01 --- /dev/null +++ b/src/main/java/org/approvaltests/reporters/GenericDiffReporter.java @@ -0,0 +1,84 @@ +package org.approvaltests.reporters; + +import java.io.File; +import java.io.IOException; +import java.util.Arrays; +import java.util.List; + +import com.spun.util.ThreadUtils; +import com.spun.util.io.FileUtils; + +public class GenericDiffReporter implements EnvironmentAwareReporter +{ + public static final String STANDARD_ARGUMENTS = "%s %s"; + public static boolean REPORT_MISSING_FILES = false; + protected String diffProgram; + protected String arguments; + protected String diffProgramNotFoundMessage; + private List validExtensions; + public static List TEXT_FILE_EXTENSIONS = Arrays.asList(".txt", ".csv", ".htm", ".html", ".xml", + ".eml", ".java", ".css", ".js"); + public static List IMAGE_FILE_EXTENSIONS = Arrays.asList(".png", ".gif", ".jpg", ".jpeg", ".bmp", + ".tif", ".tiff"); + public GenericDiffReporter(String diffProgram, String diffProgramNotFoundMessage) + { + this(diffProgram, STANDARD_ARGUMENTS, diffProgramNotFoundMessage); + } + private GenericDiffReporter(String diffProgram, String argumentsFormat, String diffProgramNotFoundMessage) + { + this(diffProgram, argumentsFormat, diffProgramNotFoundMessage, TEXT_FILE_EXTENSIONS); + } + public GenericDiffReporter(String diffProgram, String argumentsFormat, String diffProgramNotFoundMessage, + List validFileExtensions) + { + this.diffProgram = diffProgram; + this.arguments = argumentsFormat; + this.diffProgramNotFoundMessage = diffProgramNotFoundMessage; + validExtensions = validFileExtensions; + } + @Override + public void report(String received, String approved) throws Exception + { + if (!isWorkingInThisEnvironment(received)) { throw new RuntimeException(diffProgramNotFoundMessage); } + FileUtils.createIfNeeded(approved); + launch(received, approved); + } + private void launch(String received, String approved) throws IOException + { + ProcessBuilder builder = new ProcessBuilder(getCommandLine(received, approved)); + Process process = builder.start(); + ThreadUtils.sleep(500); //Give program time to start + } + public String[] getCommandLine(String received, String approved) + { + String[] p = arguments.split(" "); + String r = String.format(p[0], received); + String a = String.format(p[1], approved); + String[] commands = new String[]{diffProgram, r, a}; + System.out.println(Arrays.toString(commands)); + return commands; + } + @Override + public boolean isWorkingInThisEnvironment(String forFile) + { + return checkFileExists() && isFileExtensionHandled(forFile); + } + public boolean checkFileExists() + { + boolean exists = new File(diffProgram).exists(); + if (REPORT_MISSING_FILES && !exists) + { + System.out.println(String.format("%s can't find '%s'", this.getClass().getSimpleName(), diffProgram)); + } + return exists; + } + public boolean isFileExtensionHandled(String forFile) + { + return isFileExtensionValid(forFile, validExtensions); + } + public static boolean isFileExtensionValid(String forFile, List validExtensionsWithDot) + { + String extensionWithDot = FileUtils.getExtensionWithDot(forFile); + return validExtensionsWithDot.contains(extensionWithDot); + } +} diff --git a/src/main/java/org/approvaltests/reporters/ImageReporter.java b/src/main/java/org/approvaltests/reporters/ImageReporter.java new file mode 100644 index 0000000..2a5ea66 --- /dev/null +++ b/src/main/java/org/approvaltests/reporters/ImageReporter.java @@ -0,0 +1,14 @@ +package org.approvaltests.reporters; + +import org.approvaltests.reporters.macosx.KaleidoscopeDiffReporter; +import org.approvaltests.reporters.windows.BeyondCompareReporter; +import org.approvaltests.reporters.windows.TortoiseImageDiffReporter; + +public class ImageReporter extends FirstWorkingReporter +{ + public ImageReporter() + { + super(TortoiseImageDiffReporter.INSTANCE, BeyondCompareReporter.INSTANCE, KaleidoscopeDiffReporter.INSTANCE, + ImageWebReporter.INSTANCE, QuietReporter.INSTANCE); + } +} diff --git a/src/main/java/org/approvaltests/reporters/ImageWebReporter.java b/src/main/java/org/approvaltests/reporters/ImageWebReporter.java new file mode 100644 index 0000000..9c9d734 --- /dev/null +++ b/src/main/java/org/approvaltests/reporters/ImageWebReporter.java @@ -0,0 +1,27 @@ +package org.approvaltests.reporters; + +import java.awt.GraphicsEnvironment; + +import com.spun.util.TestUtils; + +public class ImageWebReporter implements EnvironmentAwareReporter +{ + public static final ImageWebReporter INSTANCE = new ImageWebReporter(); + @Override + public void report(String received, String approved) throws Exception + { + String text = "
approvedreceived
%s
to approve : copy clipboard to command window
%s
"; + String moveText = ClipboardReporter.getAcceptApprovalText(received, approved); + text = String.format(text, approved, received, received, moveText); + TestUtils.displayHtml(text); + } + /** + * We assume any environment that is not headless will have a web browser to display the image in a web page. + */ + @Override + public boolean isWorkingInThisEnvironment(String forFile) + { + return !GraphicsEnvironment.isHeadless() + && GenericDiffReporter.isFileExtensionValid(forFile, GenericDiffReporter.IMAGE_FILE_EXTENSIONS); + } +} diff --git a/src/main/java/org/approvaltests/reporters/JunitReporter.java b/src/main/java/org/approvaltests/reporters/JunitReporter.java new file mode 100644 index 0000000..ee9ef10 --- /dev/null +++ b/src/main/java/org/approvaltests/reporters/JunitReporter.java @@ -0,0 +1,34 @@ +package org.approvaltests.reporters; + +import java.io.File; + +import junit.framework.TestCase; + +import com.spun.util.io.FileUtils; + +public class JunitReporter implements EnvironmentAwareReporter +{ + public static final JunitReporter INSTANCE = new JunitReporter(); + @Override + public void report(String received, String approved) throws Exception + { + String aText = new File(approved).exists() ? FileUtils.readFile(approved) : ""; + String rText = FileUtils.readFile(received); + String approveCommand = "To approve run : " + ClipboardReporter.getAcceptApprovalText(received, approved); + System.out.println(approveCommand); + TestCase.assertEquals(aText, rText); + } + @Override + public boolean isWorkingInThisEnvironment(String forFile) + { + try + { + TestCase.assertTrue(true); + } + catch (Throwable t) + { + return false; + } + return GenericDiffReporter.isFileExtensionValid(forFile, GenericDiffReporter.TEXT_FILE_EXTENSIONS); + } +} \ No newline at end of file diff --git a/src/main/java/org/approvaltests/reporters/MultiReporter.java b/src/main/java/org/approvaltests/reporters/MultiReporter.java new file mode 100644 index 0000000..3fe408a --- /dev/null +++ b/src/main/java/org/approvaltests/reporters/MultiReporter.java @@ -0,0 +1,41 @@ +package org.approvaltests.reporters; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; + +import org.approvaltests.core.ApprovalFailureReporter; + +public class MultiReporter implements ApprovalFailureReporter +{ + private final Collection reporters; + public MultiReporter(Collection reporters) + { + this.reporters = reporters; + } + public MultiReporter(ApprovalFailureReporter... reporters) + { + this.reporters = Arrays.asList(reporters); + } + @Override + public void report(String received, String approved) throws Exception + { + ArrayList exceptions = new ArrayList(); + for (ApprovalFailureReporter reporter : reporters) + { + try + { + reporter.report(received, approved); + } + catch (Throwable t) + { + exceptions.add(t); + } + } + MultipleExceptions.rethrowExceptions(exceptions); + } + public ApprovalFailureReporter[] getReporters() + { + return reporters.toArray(new ApprovalFailureReporter[0]); + } +} diff --git a/src/main/java/org/approvaltests/reporters/MultipleExceptions.java b/src/main/java/org/approvaltests/reporters/MultipleExceptions.java new file mode 100644 index 0000000..fab8281 --- /dev/null +++ b/src/main/java/org/approvaltests/reporters/MultipleExceptions.java @@ -0,0 +1,43 @@ +package org.approvaltests.reporters; + +import java.util.ArrayList; + +public class MultipleExceptions extends RuntimeException +{ + private ArrayList exceptions; + public MultipleExceptions(ArrayList exceptions) + { + super(getText(exceptions), exceptions.get(0)); + this.exceptions = exceptions; + } + public Throwable[] getExceptions() + { + return exceptions.toArray(new Throwable[0]); + } + public static void rethrowExceptions(ArrayList exceptions) throws Exception + { + if (exceptions.size() == 0) + { + return; + } + else if (exceptions.size() == 0) + { + Throwable t = exceptions.get(0); + if (t instanceof Exception) { throw ((Exception) t); } + throw (Error) t; + } + else + { + throw new MultipleExceptions(exceptions); + } + } + private static String getText(ArrayList exceptions) + { + StringBuffer b = new StringBuffer("Multiple Exceptions Thrown:"); + for (int i = 0; i < exceptions.size(); i++) + { + b.append(String.format("\n #%s): %s", i + 1, exceptions.get(i).getMessage())); + } + return b.toString(); + } +} diff --git a/src/main/java/org/approvaltests/reporters/NotePadLancher.java b/src/main/java/org/approvaltests/reporters/NotePadLancher.java new file mode 100644 index 0000000..88fb9bb --- /dev/null +++ b/src/main/java/org/approvaltests/reporters/NotePadLancher.java @@ -0,0 +1,16 @@ +package org.approvaltests.reporters; + +import org.approvaltests.core.ApprovalFailureReporter; + +public class NotePadLancher implements ApprovalFailureReporter +{ + @Override + public void report(String received, String approved) throws Exception + { + { + String text = "\"C:\\Program Files\\Notepad++\\notepad++.exe\" \"%s\""; + text = String.format(text, received); + Runtime.getRuntime().exec(text); + } + } +} diff --git a/src/main/java/org/approvaltests/reporters/QuietReporter.java b/src/main/java/org/approvaltests/reporters/QuietReporter.java new file mode 100644 index 0000000..7ff61c8 --- /dev/null +++ b/src/main/java/org/approvaltests/reporters/QuietReporter.java @@ -0,0 +1,16 @@ +package org.approvaltests.reporters; + +public class QuietReporter implements EnvironmentAwareReporter +{ + public static final QuietReporter INSTANCE = new QuietReporter(); + @Override + public void report(String received, String approved) throws Exception + { + System.out.println(ClipboardReporter.getAcceptApprovalText(received, approved)); + } + @Override + public boolean isWorkingInThisEnvironment(String forFile) + { + return true; + } +} diff --git a/src/main/java/org/approvaltests/reporters/TextWebReporter.java b/src/main/java/org/approvaltests/reporters/TextWebReporter.java new file mode 100644 index 0000000..874c95f --- /dev/null +++ b/src/main/java/org/approvaltests/reporters/TextWebReporter.java @@ -0,0 +1,21 @@ +package org.approvaltests.reporters; + +import java.io.File; + +import org.approvaltests.core.ApprovalFailureReporter; + +import com.spun.util.TestUtils; +import com.spun.util.io.FileUtils; + +public class TextWebReporter implements ApprovalFailureReporter +{ + @Override + public void report(String received, String approved) throws Exception + { + String text = "
%s
%s
approvedreceived
to approve : copy clipboard to command window
"; + String aText = new File(approved).exists() ? FileUtils.readFile(approved) : ""; + String rText = FileUtils.readFile(received); + text = String.format(text, aText.replace("<", "<"), rText.replace("<", "<")); + TestUtils.displayHtml(text); + } +} diff --git a/src/main/java/org/approvaltests/reporters/UseReporter.java b/src/main/java/org/approvaltests/reporters/UseReporter.java new file mode 100644 index 0000000..5147c26 --- /dev/null +++ b/src/main/java/org/approvaltests/reporters/UseReporter.java @@ -0,0 +1,11 @@ +package org.approvaltests.reporters; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +import org.approvaltests.core.ApprovalFailureReporter; + +@Retention(RetentionPolicy.RUNTIME) +public @interface UseReporter { + Class[] value(); +} diff --git a/src/main/java/org/approvaltests/reporters/macosx/DiffMergeReporter.java b/src/main/java/org/approvaltests/reporters/macosx/DiffMergeReporter.java new file mode 100644 index 0000000..99b64ad --- /dev/null +++ b/src/main/java/org/approvaltests/reporters/macosx/DiffMergeReporter.java @@ -0,0 +1,17 @@ +package org.approvaltests.reporters.macosx; + +import java.text.MessageFormat; + +import org.approvaltests.reporters.GenericDiffReporter; + +public class DiffMergeReporter extends GenericDiffReporter +{ + private static final String DIFF_PROGRAM = "/Applications/DiffMerge.app/Contents/MacOS/DiffMerge"; + static final String MESSAGE = MessageFormat.format("Unable to find DiffMerge at {0}", + DIFF_PROGRAM); + public static final DiffMergeReporter INSTANCE = new DiffMergeReporter(); + public DiffMergeReporter() + { + super(DIFF_PROGRAM, GenericDiffReporter.STANDARD_ARGUMENTS, MESSAGE, GenericDiffReporter.TEXT_FILE_EXTENSIONS); + } +} diff --git a/src/main/java/org/approvaltests/reporters/macosx/KaleidoscopeDiffReporter.java b/src/main/java/org/approvaltests/reporters/macosx/KaleidoscopeDiffReporter.java new file mode 100644 index 0000000..1f8960b --- /dev/null +++ b/src/main/java/org/approvaltests/reporters/macosx/KaleidoscopeDiffReporter.java @@ -0,0 +1,24 @@ +package org.approvaltests.reporters.macosx; + +import java.text.MessageFormat; +import java.util.List; + +import org.approvaltests.reporters.GenericDiffReporter; + +import com.spun.util.ArrayUtils; + +public class KaleidoscopeDiffReporter extends GenericDiffReporter +{ + private static final String DIFF_PROGRAM = "/Applications/Kaleidoscope.app/Contents/MacOS/ksdiff"; + static final String MESSAGE = MessageFormat + .format("Unable to find Kaleidoscope at {0}", + DIFF_PROGRAM); + private static List fileTypes = ArrayUtils.combine( + GenericDiffReporter.IMAGE_FILE_EXTENSIONS, + GenericDiffReporter.TEXT_FILE_EXTENSIONS); + public static final KaleidoscopeDiffReporter INSTANCE = new KaleidoscopeDiffReporter(); + public KaleidoscopeDiffReporter() + { + super(DIFF_PROGRAM, GenericDiffReporter.STANDARD_ARGUMENTS, MESSAGE, fileTypes); + } +} diff --git a/src/main/java/org/approvaltests/reporters/macosx/MacDiffReporter.java b/src/main/java/org/approvaltests/reporters/macosx/MacDiffReporter.java new file mode 100644 index 0000000..58894e0 --- /dev/null +++ b/src/main/java/org/approvaltests/reporters/macosx/MacDiffReporter.java @@ -0,0 +1,12 @@ +package org.approvaltests.reporters.macosx; + +import org.approvaltests.reporters.FirstWorkingReporter; + +public class MacDiffReporter extends FirstWorkingReporter +{ + public static final MacDiffReporter INSTANCE = new MacDiffReporter(); + public MacDiffReporter() + { + super(DiffMergeReporter.INSTANCE, KaleidoscopeDiffReporter.INSTANCE, P4MergeReporter.INSTANCE, TkDiffReporter.INSTANCE); + } +} diff --git a/src/main/java/org/approvaltests/reporters/macosx/P4MergeReporter.java b/src/main/java/org/approvaltests/reporters/macosx/P4MergeReporter.java new file mode 100644 index 0000000..be3bb4a --- /dev/null +++ b/src/main/java/org/approvaltests/reporters/macosx/P4MergeReporter.java @@ -0,0 +1,26 @@ +package org.approvaltests.reporters.macosx; + +import java.text.MessageFormat; +import java.util.List; + +import org.approvaltests.reporters.GenericDiffReporter; + +import com.spun.util.ArrayUtils; + +public class P4MergeReporter extends GenericDiffReporter +{ + private static final String DIFF_PROGRAM = "/Applications/p4merge.app/Contents/MacOS/p4merge"; + public static final String MESSAGE = MessageFormat + .format( + "Unable to find P4Merge at {0}" + + "\nYou can install P4Merge " + + "at http://www.perforce.com/downloads/Perforce/20-User#10", + DIFF_PROGRAM); + private static List fileTypes = ArrayUtils.combine(GenericDiffReporter.IMAGE_FILE_EXTENSIONS, + GenericDiffReporter.TEXT_FILE_EXTENSIONS); + public static final P4MergeReporter INSTANCE = new P4MergeReporter(); + public P4MergeReporter() + { + super(DIFF_PROGRAM, GenericDiffReporter.STANDARD_ARGUMENTS, P4MergeReporter.MESSAGE, fileTypes); + } +} diff --git a/src/main/java/org/approvaltests/reporters/macosx/TkDiffReporter.java b/src/main/java/org/approvaltests/reporters/macosx/TkDiffReporter.java new file mode 100644 index 0000000..e489346 --- /dev/null +++ b/src/main/java/org/approvaltests/reporters/macosx/TkDiffReporter.java @@ -0,0 +1,17 @@ +package org.approvaltests.reporters.macosx; + +import java.text.MessageFormat; + +import org.approvaltests.reporters.GenericDiffReporter; + +public class TkDiffReporter extends GenericDiffReporter +{ + private static final String DIFF_PROGRAM = "/Applications/TkDiff.app/Contents/MacOS/tkdiff"; + static final String MESSAGE = MessageFormat.format("Unable to find TkDiffMerge at {0}", + DIFF_PROGRAM); + public static final TkDiffReporter INSTANCE = new TkDiffReporter(); + public TkDiffReporter() + { + super(DIFF_PROGRAM, GenericDiffReporter.STANDARD_ARGUMENTS, MESSAGE, GenericDiffReporter.TEXT_FILE_EXTENSIONS); + } +} diff --git a/src/main/java/org/approvaltests/reporters/windows/BeyondCompareReporter.java b/src/main/java/org/approvaltests/reporters/windows/BeyondCompareReporter.java new file mode 100644 index 0000000..cc43003 --- /dev/null +++ b/src/main/java/org/approvaltests/reporters/windows/BeyondCompareReporter.java @@ -0,0 +1,17 @@ +package org.approvaltests.reporters.windows; + +import java.text.MessageFormat; + +import org.approvaltests.reporters.GenericDiffReporter; + +public class BeyondCompareReporter extends GenericDiffReporter +{ + public static final BeyondCompareReporter INSTANCE = new BeyondCompareReporter(); + static final String DIFF_PROGRAM = "C:\\Program Files\\Beyond Compare 3\\BCompare.exe"; + static final String MESSAGE = MessageFormat.format( + "Unable to find Beyond Compare at {0}", DIFF_PROGRAM); + public BeyondCompareReporter() + { + super(DIFF_PROGRAM, MESSAGE); + } +} diff --git a/src/main/java/org/approvaltests/reporters/windows/TortoiseDiffReporter.java b/src/main/java/org/approvaltests/reporters/windows/TortoiseDiffReporter.java new file mode 100644 index 0000000..e5b38bd --- /dev/null +++ b/src/main/java/org/approvaltests/reporters/windows/TortoiseDiffReporter.java @@ -0,0 +1,12 @@ +package org.approvaltests.reporters.windows; + +import org.approvaltests.reporters.FirstWorkingReporter; + +public class TortoiseDiffReporter extends FirstWorkingReporter +{ + public static final TortoiseDiffReporter INSTANCE = new TortoiseDiffReporter(); + public TortoiseDiffReporter() + { + super(TortoiseTextDiffReporter.INSTANCE, TortoiseImageDiffReporter.INSTANCE); + } +} diff --git a/src/main/java/org/approvaltests/reporters/windows/TortoiseImageDiffReporter.java b/src/main/java/org/approvaltests/reporters/windows/TortoiseImageDiffReporter.java new file mode 100644 index 0000000..cb35b99 --- /dev/null +++ b/src/main/java/org/approvaltests/reporters/windows/TortoiseImageDiffReporter.java @@ -0,0 +1,13 @@ +package org.approvaltests.reporters.windows; + +import org.approvaltests.reporters.GenericDiffReporter; + +public class TortoiseImageDiffReporter extends GenericDiffReporter +{ + public static final TortoiseImageDiffReporter INSTANCE = new TortoiseImageDiffReporter(); + public TortoiseImageDiffReporter() + { + super("C:\\Program Files\\TortoiseSVN\\bin\\TortoiseIDiff.exe", "/left:%s /right:%s", + TortoiseTextDiffReporter.MESSAGE, GenericDiffReporter.IMAGE_FILE_EXTENSIONS); + } +} diff --git a/src/main/java/org/approvaltests/reporters/windows/TortoiseTextDiffReporter.java b/src/main/java/org/approvaltests/reporters/windows/TortoiseTextDiffReporter.java new file mode 100644 index 0000000..99e0c65 --- /dev/null +++ b/src/main/java/org/approvaltests/reporters/windows/TortoiseTextDiffReporter.java @@ -0,0 +1,21 @@ +package org.approvaltests.reporters.windows; + +import java.text.MessageFormat; + +import org.approvaltests.reporters.GenericDiffReporter; + +public class TortoiseTextDiffReporter extends GenericDiffReporter +{ + public static final TortoiseTextDiffReporter INSTANCE = new TortoiseTextDiffReporter(); + static final String DIFF_PROGRAM = "C:\\Program Files\\TortoiseSVN\\bin\\TortoiseMerge.exe"; + static final String MESSAGE = MessageFormat + .format( + "Unable to find TortoiseMerge at {0}" + + "\nYou can install TortoiseMerge as part " + + "of TortoiseSVN at http://tortisesvn.tigris.org", + DIFF_PROGRAM); + public TortoiseTextDiffReporter() + { + super(DIFF_PROGRAM, MESSAGE); + } +} diff --git a/src/main/java/org/approvaltests/reporters/windows/WinMergeReporter.java b/src/main/java/org/approvaltests/reporters/windows/WinMergeReporter.java new file mode 100644 index 0000000..0d01192 --- /dev/null +++ b/src/main/java/org/approvaltests/reporters/windows/WinMergeReporter.java @@ -0,0 +1,18 @@ +package org.approvaltests.reporters.windows; + +import java.text.MessageFormat; + +import org.approvaltests.reporters.GenericDiffReporter; + +public class WinMergeReporter extends GenericDiffReporter +{ + public static final WinMergeReporter INSTANCE = new WinMergeReporter(); ; + static final String DIFF_PROGRAM = "C:\\Program Files\\WinMerge\\WinMergeU.exe"; + static final String MESSAGE = MessageFormat.format("Unable to find WinMerge at {0}" + + "\nYou can install it at http://winmerge.org/", + DIFF_PROGRAM); + public WinMergeReporter() + { + super(DIFF_PROGRAM, MESSAGE); + } +} diff --git a/src/main/java/org/approvaltests/reporters/windows/WindowsDiffReporter.java b/src/main/java/org/approvaltests/reporters/windows/WindowsDiffReporter.java new file mode 100644 index 0000000..5c9a4a6 --- /dev/null +++ b/src/main/java/org/approvaltests/reporters/windows/WindowsDiffReporter.java @@ -0,0 +1,12 @@ +package org.approvaltests.reporters.windows; + +import org.approvaltests.reporters.FirstWorkingReporter; + +public class WindowsDiffReporter extends FirstWorkingReporter +{ + public static final WindowsDiffReporter INSTANCE = new WindowsDiffReporter(); + public WindowsDiffReporter() + { + super(TortoiseDiffReporter.INSTANCE, BeyondCompareReporter.INSTANCE, WinMergeReporter.INSTANCE); + } +} diff --git a/src/main/java/org/approvaltests/writers/ApprovalBinaryFileWriter.java b/src/main/java/org/approvaltests/writers/ApprovalBinaryFileWriter.java new file mode 100644 index 0000000..6c01f9a --- /dev/null +++ b/src/main/java/org/approvaltests/writers/ApprovalBinaryFileWriter.java @@ -0,0 +1,50 @@ +package org.approvaltests.writers; + +import java.io.File; +import java.io.InputStream; +import java.nio.channels.Channels; +import java.nio.channels.ReadableByteChannel; + +import org.approvaltests.core.ApprovalWriter; + +import com.spun.util.io.FileUtils; + +public class ApprovalBinaryFileWriter implements ApprovalWriter { + private CharSequence data; + private String fileExtension; + private InputStream dataStream; + + public ApprovalBinaryFileWriter(CharSequence charSequence, String fileExtensionWithoutDot) { + this.data = charSequence; + this.fileExtension = fileExtensionWithoutDot; + } + + public ApprovalBinaryFileWriter(InputStream stream, String fileExtensionWithoutDot) { + this.dataStream = stream; + this.fileExtension = fileExtensionWithoutDot; + } + + public ApprovalBinaryFileWriter(ReadableByteChannel stream, String fileExtensionWithoutDot) { + this(Channels.newInputStream(stream), fileExtensionWithoutDot); + } + + @Override + public String writeReceivedFile(String received) throws Exception { + if (dataStream == null) { + FileUtils.writeFile(new File(received), data); + } else { + FileUtils.writeFile(new File(received), dataStream); + } + return received; + } + + @Override + public String getApprovalFilename(String base) { + return base + Writer.approved + "." + fileExtension; + } + + @Override + public String getReceivedFilename(String base) { + return base + Writer.received + fileExtension; + } +} diff --git a/src/main/java/org/approvaltests/writers/ApprovalTextWriter.java b/src/main/java/org/approvaltests/writers/ApprovalTextWriter.java new file mode 100644 index 0000000..224787f --- /dev/null +++ b/src/main/java/org/approvaltests/writers/ApprovalTextWriter.java @@ -0,0 +1,34 @@ +package org.approvaltests.writers; + +import java.io.File; + +import org.approvaltests.core.ApprovalWriter; + +import com.spun.util.io.FileUtils; + +public class ApprovalTextWriter implements ApprovalWriter +{ + private final String text; + private final String fileExtensionWithoutDot; + public ApprovalTextWriter(String text, String fileExtensionWithoutDot) + { + this.text = text; + this.fileExtensionWithoutDot = fileExtensionWithoutDot; + } + @Override + public String writeReceivedFile(String received) throws Exception + { + FileUtils.writeFile(new File(received), text); + return received; + } + @Override + public String getApprovalFilename(String base) + { + return base + Writer.approved + "."+ fileExtensionWithoutDot; + } + @Override + public String getReceivedFilename(String base) + { + return base + Writer.received + "."+fileExtensionWithoutDot; + } +} diff --git a/src/main/java/org/approvaltests/writers/ApprovalXmlWriter.java b/src/main/java/org/approvaltests/writers/ApprovalXmlWriter.java new file mode 100644 index 0000000..1cdef3f --- /dev/null +++ b/src/main/java/org/approvaltests/writers/ApprovalXmlWriter.java @@ -0,0 +1,30 @@ +package org.approvaltests.writers; + +import java.io.InputStream; + +import com.spun.util.io.FileUtils; + +public class ApprovalXmlWriter extends ApprovalTextWriter +{ + public ApprovalXmlWriter(String text) + { + super(text, "xml"); + } + @Override + public String writeReceivedFile(String received) throws Exception + { + received = super.writeReceivedFile(received); + format(received); + return received; + } + private void format(String fileName) throws Exception + { + String text = "\"C:\\temp\\xmlstarlet-1.0.1\\xml.exe\" format \"%s\""; + text = String.format(text, fileName); + Process exec = Runtime.getRuntime().exec(text); + InputStream stream = exec.getInputStream(); + Thread.sleep(400); + FileUtils.redirectInputToFile(fileName, stream); + + } +} diff --git a/src/main/java/org/approvaltests/writers/ComponentApprovalWriter.java b/src/main/java/org/approvaltests/writers/ComponentApprovalWriter.java new file mode 100644 index 0000000..2a91bc2 --- /dev/null +++ b/src/main/java/org/approvaltests/writers/ComponentApprovalWriter.java @@ -0,0 +1,52 @@ +package org.approvaltests.writers; + +import java.awt.Component; +import java.awt.Graphics; +import java.awt.image.BufferedImage; + +import javax.swing.JFrame; + +import org.approvaltests.core.ApprovalWriter; + +public class ComponentApprovalWriter implements ApprovalWriter +{ + private ImageApprovalWriter image = null; + public ComponentApprovalWriter(Component c) + { + BufferedImage image = drawComponent(c); + this.image = new ImageApprovalWriter(image); + } + public static BufferedImage drawComponent(Component c) + { + validateComponent(c); + BufferedImage image = new BufferedImage(c.getWidth(), c.getHeight(), BufferedImage.TYPE_INT_ARGB); + Graphics g = image.createGraphics(); + c.paint(g); + g.dispose(); + return image; + } + private static void validateComponent(Component c) + { + if (!c.isValid()) + { + JFrame frame = new JFrame(); + frame.getContentPane().add(c); + frame.pack(); + } + } + @Override + public String getApprovalFilename(String base) + { + return image.getApprovalFilename(base); + } + @Override + public String getReceivedFilename(String base) + { + return image.getReceivedFilename(base); + } + @Override + public String writeReceivedFile(String filename) throws Exception + { + return image.writeReceivedFile(filename); + } +} diff --git a/src/main/java/org/approvaltests/writers/DirectoryToDirectoryWriter.java b/src/main/java/org/approvaltests/writers/DirectoryToDirectoryWriter.java new file mode 100644 index 0000000..4a2af5c --- /dev/null +++ b/src/main/java/org/approvaltests/writers/DirectoryToDirectoryWriter.java @@ -0,0 +1,31 @@ +package org.approvaltests.writers; + +import java.io.File; + +import org.approvaltests.core.ApprovalWriter; + +public class DirectoryToDirectoryWriter implements ApprovalWriter +{ + private final File recieved; + private final File goldMasterDirectory; + public DirectoryToDirectoryWriter(File recieved, File goldMasterDirectory) + { + this.recieved = recieved; + this.goldMasterDirectory = goldMasterDirectory; + } + @Override + public String writeReceivedFile(String received) throws Exception + { + return this.recieved.getAbsolutePath(); + } + @Override + public String getReceivedFilename(String base) + { + return recieved.getAbsolutePath(); + } + @Override + public String getApprovalFilename(String base) + { + return goldMasterDirectory.getAbsolutePath() + File.separator + recieved.getName(); + } +} \ No newline at end of file diff --git a/src/main/java/org/approvaltests/writers/FileApprovalWriter.java b/src/main/java/org/approvaltests/writers/FileApprovalWriter.java new file mode 100644 index 0000000..f20da34 --- /dev/null +++ b/src/main/java/org/approvaltests/writers/FileApprovalWriter.java @@ -0,0 +1,33 @@ +package org.approvaltests.writers; + +import java.io.File; + +import org.approvaltests.core.ApprovalWriter; + +import com.spun.util.io.FileUtils; + +public class FileApprovalWriter implements ApprovalWriter +{ + private final File newFile; + private String extensionWithDot; + public FileApprovalWriter(File newFile) + { + this.newFile = newFile; + extensionWithDot = FileUtils.getExtensionWithDot(newFile.getName()); + } + @Override + public String writeReceivedFile(String received) throws Exception + { + return newFile.getAbsolutePath(); + } + @Override + public String getApprovalFilename(String base) + { + return base + Writer.approved + extensionWithDot; + } + @Override + public String getReceivedFilename(String base) + { + return base + Writer.received + extensionWithDot; + } +} diff --git a/src/main/java/org/approvaltests/writers/FlyingSaucerHtmlToPdfWriter.java b/src/main/java/org/approvaltests/writers/FlyingSaucerHtmlToPdfWriter.java new file mode 100644 index 0000000..7ebcff4 --- /dev/null +++ b/src/main/java/org/approvaltests/writers/FlyingSaucerHtmlToPdfWriter.java @@ -0,0 +1,42 @@ +package org.approvaltests.writers; + +import org.approvaltests.core.ApprovalWriter; + +import com.spun.util.NotImplementedException; + + +public class FlyingSaucerHtmlToPdfWriter implements ApprovalWriter +{ + private final String html; + public FlyingSaucerHtmlToPdfWriter(String html) + { + this.html = html; + } + //@Override + public String getApprovalFilename(String base) + { + return base + Writer.approved + ".pdf"; + } + //@Override + public String getReceivedFilename(String base) + { + return base + Writer.received + ".pdf"; + } + //@Override + public String writeReceivedFile(String received) throws Exception + { + // String s = new ApprovalTextWriter(html, + // ".html").writeReceivedFile(File.createTempFile("temp", + // ".html").getAbsolutePath()); + // File f = new File(s); + // String url = f.toURI().toURL().toString(); + // OutputStream os = new FileOutputStream(received); + // ITextRenderer renderer = new ITextRenderer(); + // renderer.setDocument(url); + // renderer.layout(); + // renderer.createPDF(os); + // os.close(); + // return received; + throw new NotImplementedException(); + } +} diff --git a/src/main/java/org/approvaltests/writers/ImageApprovalWriter.java b/src/main/java/org/approvaltests/writers/ImageApprovalWriter.java new file mode 100644 index 0000000..38354e1 --- /dev/null +++ b/src/main/java/org/approvaltests/writers/ImageApprovalWriter.java @@ -0,0 +1,33 @@ +package org.approvaltests.writers; + +import java.awt.image.BufferedImage; +import java.io.File; + +import javax.imageio.ImageIO; + +import org.approvaltests.core.ApprovalWriter; + +public class ImageApprovalWriter implements ApprovalWriter +{ + private final BufferedImage image; + public ImageApprovalWriter(BufferedImage image) + { + this.image = image; + } + @Override + public String writeReceivedFile(String received) throws Exception + { + ImageIO.write(image, "png", new File(received)); + return received; + } + @Override + public String getApprovalFilename(String base) + { + return base + Writer.approved + ".png"; + } + @Override + public String getReceivedFilename(String base) + { + return base + Writer.received + ".png"; + } +} diff --git a/src/main/java/org/approvaltests/writers/ResultSetApprovalWriter.java b/src/main/java/org/approvaltests/writers/ResultSetApprovalWriter.java new file mode 100644 index 0000000..dd40799 --- /dev/null +++ b/src/main/java/org/approvaltests/writers/ResultSetApprovalWriter.java @@ -0,0 +1,45 @@ +package org.approvaltests.writers; + +import java.io.File; +import java.sql.ResultSet; + +import org.approvaltests.core.ApprovalWriter; + +import com.spun.util.database.ResultSetWriter; +import com.spun.util.io.FileUtils; +import com.spun.util.velocity.ContextAware; +import com.spun.util.velocity.ContextAware.ContextAwareMap; +import com.spun.util.velocity.VelocityParser; + +public class ResultSetApprovalWriter implements ApprovalWriter +{ + private final ResultSet resultSet; + public ResultSetApprovalWriter(ResultSet resultSet) + { + this.resultSet = resultSet; + } + @Override + public String getApprovalFilename(String base) + { + return base + Writer.approved + ".csv"; + } + @Override + public String getReceivedFilename(String base) + { + return base + Writer.received + ".csv"; + } + @Override + public String writeReceivedFile(String received) throws Exception + { + String template = "#foreach ($row in $commons.asArray($metaData))$row.get()#if (!$row.isLast()),#end#end\r\n" + + "\r\n" + + "#foreach ($row in $results)\r\n" + + "#foreach ($column in $commons.asArray($row))$commons.asExcel($column.get())#if (!$column.isLast()),#end#end \r\n" + + "\r\n" + "#end "; + ContextAwareMap map = new ContextAware.ContextAwareMap("metaData", ResultSetWriter.extractMetaData(resultSet)); + map.put("results", ResultSetWriter.extractResults(resultSet)); + String output = VelocityParser.parseString(template, map); + FileUtils.writeFile(new File(received), output); + return received; + } +} diff --git a/src/main/java/org/approvaltests/writers/Writer.java b/src/main/java/org/approvaltests/writers/Writer.java new file mode 100644 index 0000000..8cd0fcc --- /dev/null +++ b/src/main/java/org/approvaltests/writers/Writer.java @@ -0,0 +1,7 @@ +package org.approvaltests.writers; + +public interface Writer +{ + final static String received = ".received"; + final static String approved = ".approved"; +} diff --git a/src/main/java/org/lambda/actions/Action0.java b/src/main/java/org/lambda/actions/Action0.java new file mode 100644 index 0000000..13373a3 --- /dev/null +++ b/src/main/java/org/lambda/actions/Action0.java @@ -0,0 +1,6 @@ +package org.lambda.actions; + +public interface Action0 +{ + public void call(); +} diff --git a/src/main/java/org/lambda/actions/Action1.java b/src/main/java/org/lambda/actions/Action1.java new file mode 100644 index 0000000..9b789d5 --- /dev/null +++ b/src/main/java/org/lambda/actions/Action1.java @@ -0,0 +1,6 @@ +package org.lambda.actions; + +public interface Action1 +{ + public void call(In1 a); +} diff --git a/src/main/java/org/lambda/actions/Action2.java b/src/main/java/org/lambda/actions/Action2.java new file mode 100644 index 0000000..b2f4f5a --- /dev/null +++ b/src/main/java/org/lambda/actions/Action2.java @@ -0,0 +1,6 @@ +package org.lambda.actions; + +public interface Action2 +{ + public void call(In1 a, In2 b); +} diff --git a/src/main/java/org/lambda/actions/Action3.java b/src/main/java/org/lambda/actions/Action3.java new file mode 100644 index 0000000..4c51d53 --- /dev/null +++ b/src/main/java/org/lambda/actions/Action3.java @@ -0,0 +1,6 @@ +package org.lambda.actions; + +public interface Action3 +{ + public void call(In1 a, In2 b, In3 c); +} diff --git a/src/main/java/org/lambda/actions/Action4.java b/src/main/java/org/lambda/actions/Action4.java new file mode 100644 index 0000000..6dd4b01 --- /dev/null +++ b/src/main/java/org/lambda/actions/Action4.java @@ -0,0 +1,6 @@ +package org.lambda.actions; + +public interface Action4 +{ + public void call(In1 a, In2 b, In3 c, In4 d); +} diff --git a/src/main/java/org/lambda/actions/Action5.java b/src/main/java/org/lambda/actions/Action5.java new file mode 100644 index 0000000..ae7de7f --- /dev/null +++ b/src/main/java/org/lambda/actions/Action5.java @@ -0,0 +1,6 @@ +package org.lambda.actions; + +public interface Action5 +{ + public void call(In1 a, In2 b, In3 c, In4 d, In5 e); +} diff --git a/src/main/java/org/lambda/actions/Action6.java b/src/main/java/org/lambda/actions/Action6.java new file mode 100644 index 0000000..2b4d334 --- /dev/null +++ b/src/main/java/org/lambda/actions/Action6.java @@ -0,0 +1,6 @@ +package org.lambda.actions; + +public interface Action6 +{ + public void call(In1 a, In2 b, In3 c, In4 d, In5 e, In6 f); +} diff --git a/src/main/java/org/lambda/actions/Action7.java b/src/main/java/org/lambda/actions/Action7.java new file mode 100644 index 0000000..4efbb1b --- /dev/null +++ b/src/main/java/org/lambda/actions/Action7.java @@ -0,0 +1,6 @@ +package org.lambda.actions; + +public interface Action7 +{ + public void call(In1 a, In2 b, In3 c, In4 d, In5 e, In6 f, In7 g); +} diff --git a/src/main/java/org/lambda/actions/Action8.java b/src/main/java/org/lambda/actions/Action8.java new file mode 100644 index 0000000..9e128ae --- /dev/null +++ b/src/main/java/org/lambda/actions/Action8.java @@ -0,0 +1,6 @@ +package org.lambda.actions; + +public interface Action8 +{ + public void call(In1 a, In2 b, In3 c, In4 d, In5 e, In6 f, In7 g, In8 h); +} diff --git a/src/main/java/org/lambda/actions/Action9.java b/src/main/java/org/lambda/actions/Action9.java new file mode 100644 index 0000000..3727286 --- /dev/null +++ b/src/main/java/org/lambda/actions/Action9.java @@ -0,0 +1,6 @@ +package org.lambda.actions; + +public interface Action9 +{ + public void call(In1 a, In2 b, In3 c, In4 d, In5 e, In6 f, In7 g, In8 h, In9 i); +} diff --git a/src/main/java/org/lambda/actions/implementations/A0.java b/src/main/java/org/lambda/actions/implementations/A0.java new file mode 100644 index 0000000..d279fd3 --- /dev/null +++ b/src/main/java/org/lambda/actions/implementations/A0.java @@ -0,0 +1,23 @@ +package org.lambda.actions.implementations; + +import org.lambda.functions.implementations.F1; + +public class A0 extends F1 implements org.lambda.actions.Action0 +{ + public boolean run; + public A0(boolean a, Object... extraVariables) + { + super(a, extraVariables); + run = a; + } + @Override + public void returnValue(String returnValue) + { + throw new Error("Return Values are not allowed for actions"); + } + @Override + public void call() + { + super.call(true); + } +} diff --git a/src/main/java/org/lambda/actions/implementations/A1.java b/src/main/java/org/lambda/actions/implementations/A1.java new file mode 100644 index 0000000..a54ddc5 --- /dev/null +++ b/src/main/java/org/lambda/actions/implementations/A1.java @@ -0,0 +1,23 @@ +package org.lambda.actions.implementations; + +import org.lambda.functions.implementations.F2; + +public class A1 extends F2 implements org.lambda.actions.Action1 +{ + public boolean run; + public A1(boolean a, In b, Object... extraVariables) + { + super(a, b, extraVariables); + run = a; + } + @Override + public void returnValue(String returnValue) + { + throw new Error("Return Values are not allowed for actions"); + } + @Override + public void call(In a) + { + super.call(true, a); + } +} diff --git a/src/main/java/org/lambda/functions/Function0.java b/src/main/java/org/lambda/functions/Function0.java new file mode 100644 index 0000000..ac79839 --- /dev/null +++ b/src/main/java/org/lambda/functions/Function0.java @@ -0,0 +1,6 @@ +package org.lambda.functions; + +public interface Function0 +{ + public Out call(); +} diff --git a/src/main/java/org/lambda/functions/Function1.java b/src/main/java/org/lambda/functions/Function1.java new file mode 100644 index 0000000..b7f0ed6 --- /dev/null +++ b/src/main/java/org/lambda/functions/Function1.java @@ -0,0 +1,6 @@ +package org.lambda.functions; + +public interface Function1 +{ + public Out call(In i); +} diff --git a/src/main/java/org/lambda/functions/Function2.java b/src/main/java/org/lambda/functions/Function2.java new file mode 100644 index 0000000..a759df5 --- /dev/null +++ b/src/main/java/org/lambda/functions/Function2.java @@ -0,0 +1,6 @@ +package org.lambda.functions; + +public interface Function2 +{ + public Out call(In1 a, In2 b); +} diff --git a/src/main/java/org/lambda/functions/Function3.java b/src/main/java/org/lambda/functions/Function3.java new file mode 100644 index 0000000..5c7e651 --- /dev/null +++ b/src/main/java/org/lambda/functions/Function3.java @@ -0,0 +1,6 @@ +package org.lambda.functions; + +public interface Function3 +{ + public Out call(In1 a, In2 b, In3 c); +} diff --git a/src/main/java/org/lambda/functions/Function4.java b/src/main/java/org/lambda/functions/Function4.java new file mode 100644 index 0000000..bc49095 --- /dev/null +++ b/src/main/java/org/lambda/functions/Function4.java @@ -0,0 +1,6 @@ +package org.lambda.functions; + +public interface Function4 +{ + public Out call(In1 a, In2 b, In3 c, In4 d); +} diff --git a/src/main/java/org/lambda/functions/Function5.java b/src/main/java/org/lambda/functions/Function5.java new file mode 100644 index 0000000..27ef5ef --- /dev/null +++ b/src/main/java/org/lambda/functions/Function5.java @@ -0,0 +1,6 @@ +package org.lambda.functions; + +public interface Function5 +{ + public Out call(In1 a, In2 b, In3 c, In4 d, In5 e); +} diff --git a/src/main/java/org/lambda/functions/Function6.java b/src/main/java/org/lambda/functions/Function6.java new file mode 100644 index 0000000..6db124c --- /dev/null +++ b/src/main/java/org/lambda/functions/Function6.java @@ -0,0 +1,6 @@ +package org.lambda.functions; + +public interface Function6 +{ + public Out call(In1 a, In2 b, In3 c, In4 d, In5 e, In6 f); +} diff --git a/src/main/java/org/lambda/functions/Function7.java b/src/main/java/org/lambda/functions/Function7.java new file mode 100644 index 0000000..49f52f2 --- /dev/null +++ b/src/main/java/org/lambda/functions/Function7.java @@ -0,0 +1,6 @@ +package org.lambda.functions; + +public interface Function7 +{ + public Out call(In1 a, In2 b, In3 c, In4 d, In5 e, In6 f, In7 g); +} diff --git a/src/main/java/org/lambda/functions/Function8.java b/src/main/java/org/lambda/functions/Function8.java new file mode 100644 index 0000000..aa9747d --- /dev/null +++ b/src/main/java/org/lambda/functions/Function8.java @@ -0,0 +1,6 @@ +package org.lambda.functions; + +public interface Function8 +{ + public Out call(In1 a, In2 b, In3 c, In4 d, In5 e, In6 f, In7 g, In8 h); +} diff --git a/src/main/java/org/lambda/functions/Function9.java b/src/main/java/org/lambda/functions/Function9.java new file mode 100644 index 0000000..1dece20 --- /dev/null +++ b/src/main/java/org/lambda/functions/Function9.java @@ -0,0 +1,6 @@ +package org.lambda.functions; + +public interface Function9 +{ + public Out call(In1 a, In2 b, In3 c, In4 d, In5 e, In6 f, In7 g, In8 h, In9 i); +} diff --git a/src/main/java/org/lambda/functions/implementations/B1.java b/src/main/java/org/lambda/functions/implementations/B1.java new file mode 100644 index 0000000..a62a1a5 --- /dev/null +++ b/src/main/java/org/lambda/functions/implementations/B1.java @@ -0,0 +1,9 @@ +package org.lambda.functions.implementations; + +public class B1 extends F1 +{ + public B1(In a, Object... extraVariables) + { + super(a, extraVariables); + } +} diff --git a/src/main/java/org/lambda/functions/implementations/F0.java b/src/main/java/org/lambda/functions/implementations/F0.java new file mode 100644 index 0000000..12c5f62 --- /dev/null +++ b/src/main/java/org/lambda/functions/implementations/F0.java @@ -0,0 +1,15 @@ +package org.lambda.functions.implementations; + +public class F0 extends Function + implements + org.lambda.functions.Function0 +{ + public F0(Object... extraVariables) + { + super(extraVariables); + } + public Out call() + { + return call(new Object[0]); + } +} diff --git a/src/main/java/org/lambda/functions/implementations/F1.java b/src/main/java/org/lambda/functions/implementations/F1.java new file mode 100644 index 0000000..b75b8ca --- /dev/null +++ b/src/main/java/org/lambda/functions/implementations/F1.java @@ -0,0 +1,16 @@ +package org.lambda.functions.implementations; + +public class F1 extends Function + implements + org.lambda.functions.Function1 +{ + public F1(In a, Object... extraVariables) + { + super(extraVariables); + this.a = a; + } + public Out call(In i) + { + return call(new Object[]{i}); + } +} diff --git a/src/main/java/org/lambda/functions/implementations/F2.java b/src/main/java/org/lambda/functions/implementations/F2.java new file mode 100644 index 0000000..bfb97f0 --- /dev/null +++ b/src/main/java/org/lambda/functions/implementations/F2.java @@ -0,0 +1,19 @@ +package org.lambda.functions.implementations; + +public class F2 + extends + Function + implements + org.lambda.functions.Function2 +{ + public F2(In1 a, In2 b, Object... extraVariables) + { + super(extraVariables); + this.a = a; + this.b = b; + } + public Out call(In1 a, In2 b) + { + return call(new Object[]{a, b}); + } +} diff --git a/src/main/java/org/lambda/functions/implementations/F3.java b/src/main/java/org/lambda/functions/implementations/F3.java new file mode 100644 index 0000000..9faace1 --- /dev/null +++ b/src/main/java/org/lambda/functions/implementations/F3.java @@ -0,0 +1,20 @@ +package org.lambda.functions.implementations; + +public class F3 + extends + Function + implements + org.lambda.functions.Function3 +{ + public F3(In1 a, In2 b, In3 c, Object... extraVariables) + { + super(extraVariables); + this.a = a; + this.b = b; + this.c = c; + } + public Out call(In1 a, In2 b, In3 c) + { + return call(new Object[]{a, b, c,}); + } +} diff --git a/src/main/java/org/lambda/functions/implementations/F4.java b/src/main/java/org/lambda/functions/implementations/F4.java new file mode 100644 index 0000000..daa1272 --- /dev/null +++ b/src/main/java/org/lambda/functions/implementations/F4.java @@ -0,0 +1,21 @@ +package org.lambda.functions.implementations; + +public class F4 + extends + Function + implements + org.lambda.functions.Function4 +{ + public F4(In1 a, In2 b, In3 c, In4 d, Object... extraVariables) + { + super(extraVariables); + this.a = a; + this.b = b; + this.c = c; + this.d = d; + } + public Out call(In1 a, In2 b, In3 c, In4 d) + { + return call(new Object[]{a, b, c, d}); + } +} diff --git a/src/main/java/org/lambda/functions/implementations/F5.java b/src/main/java/org/lambda/functions/implementations/F5.java new file mode 100644 index 0000000..74adc08 --- /dev/null +++ b/src/main/java/org/lambda/functions/implementations/F5.java @@ -0,0 +1,22 @@ +package org.lambda.functions.implementations; + +public class F5 + extends + Function + implements + org.lambda.functions.Function5 +{ + public F5(In1 a, In2 b, In3 c, In4 d, In5 e, Object... extraVariables) + { + super(extraVariables); + this.a = a; + this.b = b; + this.c = c; + this.d = d; + this.e = e; + } + public Out call(In1 a, In2 b, In3 c, In4 d, In5 e) + { + return call(new Object[]{a, b, c, d, e}); + } +} diff --git a/src/main/java/org/lambda/functions/implementations/F6.java b/src/main/java/org/lambda/functions/implementations/F6.java new file mode 100644 index 0000000..4b60d40 --- /dev/null +++ b/src/main/java/org/lambda/functions/implementations/F6.java @@ -0,0 +1,23 @@ +package org.lambda.functions.implementations; + +public class F6 + extends + Function + implements + org.lambda.functions.Function6 +{ + public F6(In1 a, In2 b, In3 c, In4 d, In5 e, In6 f, Object... extraVariables) + { + super(extraVariables); + this.a = a; + this.b = b; + this.c = c; + this.d = d; + this.e = e; + this.f = f; + } + public Out call(In1 a, In2 b, In3 c, In4 d, In5 e, In6 f) + { + return call(new Object[]{a, b, c, d, e, f}); + } +} diff --git a/src/main/java/org/lambda/functions/implementations/F7.java b/src/main/java/org/lambda/functions/implementations/F7.java new file mode 100644 index 0000000..3d4269d --- /dev/null +++ b/src/main/java/org/lambda/functions/implementations/F7.java @@ -0,0 +1,24 @@ +package org.lambda.functions.implementations; + +public class F7 + extends + Function + implements + org.lambda.functions.Function7 +{ + public F7(In1 a, In2 b, In3 c, In4 d, In5 e, In6 f, In7 g, Object... extraVariables) + { + super(extraVariables); + this.a = a; + this.b = b; + this.c = c; + this.d = d; + this.e = e; + this.f = f; + this.g = g; + } + public Out call(In1 a, In2 b, In3 c, In4 d, In5 e, In6 f, In7 g) + { + return call(new Object[]{a, b, c, d, e, f, g}); + } +} diff --git a/src/main/java/org/lambda/functions/implementations/F8.java b/src/main/java/org/lambda/functions/implementations/F8.java new file mode 100644 index 0000000..906a900 --- /dev/null +++ b/src/main/java/org/lambda/functions/implementations/F8.java @@ -0,0 +1,25 @@ +package org.lambda.functions.implementations; + +public class F8 + extends + Function + implements + org.lambda.functions.Function8 +{ + public F8(In1 a, In2 b, In3 c, In4 d, In5 e, In6 f, In7 g, In8 h, Object... extraVariables) + { + super(extraVariables); + this.a = a; + this.b = b; + this.c = c; + this.d = d; + this.e = e; + this.f = f; + this.g = g; + this.h = h; + } + public Out call(In1 a, In2 b, In3 c, In4 d, In5 e, In6 f, In7 g, In8 h) + { + return call(new Object[]{a, b, c, d, e, f, g, h}); + } +} diff --git a/src/main/java/org/lambda/functions/implementations/F9.java b/src/main/java/org/lambda/functions/implementations/F9.java new file mode 100644 index 0000000..66596cd --- /dev/null +++ b/src/main/java/org/lambda/functions/implementations/F9.java @@ -0,0 +1,26 @@ +package org.lambda.functions.implementations; + +public class F9 + extends + Function + implements + org.lambda.functions.Function9 +{ + public F9(In1 a, In2 b, In3 c, In4 d, In5 e, In6 f, In7 g, In8 h, In9 i, Object... extraVariables) + { + super(extraVariables); + this.a = a; + this.b = b; + this.c = c; + this.d = d; + this.e = e; + this.f = f; + this.g = g; + this.h = h; + this.i = i; + } + public Out call(In1 a, In2 b, In3 c, In4 d, In5 e, In6 f, In7 g, In8 h, In9 i) + { + return call(new Object[]{a, b, c, d, e, f, g, h, i}); + } +} diff --git a/src/main/java/org/lambda/functions/implementations/Function.java b/src/main/java/org/lambda/functions/implementations/Function.java new file mode 100644 index 0000000..bf03658 --- /dev/null +++ b/src/main/java/org/lambda/functions/implementations/Function.java @@ -0,0 +1,147 @@ +package org.lambda.functions.implementations; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.Arrays; + +import com.spun.util.ObjectUtils; + +public class Function +{ + public Out returnValue; + private final Object[] extraVariables; + private Object[] params; + private int startAt = 0; + private int totalLengthOfParameters; + private Constructor constructor; + public In1 a; + public In2 b; + public In3 c; + public In4 d; + public In5 e; + public In6 f; + public In7 g; + public In8 h; + public In9 i; + public Function(Object[] extraVariables) + { + this.extraVariables = extraVariables; + } + protected Out call(Object[] mainParams) + { + Object[] parameters = null; + try + { + initalizeConstructor(); + parameters = getParameters(totalLengthOfParameters, extraVariables, mainParams); + Function intsance = constructor.newInstance(parameters); + return (Out) intsance.returnValue; + } + catch (IllegalArgumentException e) + { + throw new RuntimeException(e.getMessage() + "\r\nExpected " + + Arrays.toString(constructor.getParameterTypes()) + "\r\nGot " + Arrays.toString(parameters)); + } + catch (Throwable e) + { + throw ObjectUtils.throwAsError(e); + } + } + @SuppressWarnings({"unchecked", "rawtypes"}) + public void initalizeConstructor() + { + if (constructor == null) + { + Class clazz = this.getClass(); + constructor = (Constructor) clazz.getDeclaredConstructors()[0]; + constructor.setAccessible(true); + totalLengthOfParameters = constructor.getParameterTypes().length; + } + } + private Object[] getParameters(int length, Object[] extraVariables2, Object[] mainParams) + { + if (params == null) + { + params = initalizeParameters(length, extraVariables2, mainParams); + } + for (int i = 0; i < mainParams.length; i++) + { + params[i + startAt] = mainParams[i]; + } + return params; + } + private Object[] initalizeParameters(int total, Object[] extraVariables, Object[] mainParams) + { + ArrayList list = new ArrayList(total); + if ((extraVariables.length + 1 + mainParams.length) != total) + { + startAt = 1; + list.add(getParentThisReference()); + } + for (Object object : mainParams) + { + list.add(object); + } + list.add(extraVariables); + for (Object object : extraVariables) + { + list.add(object); + } + return list.toArray(); + } + private Object getParentThisReference() + { + Object parent = tryToGetParentByName(); + if (parent == null) + { + parent = tryToGetParentByType(); + } + return parent; + } + private Object tryToGetParentByType() + { + try + { + Class clazz = this.getClass(); + Field[] fields = clazz.getDeclaredFields(); + Class desiredType = clazz.getDeclaredConstructors()[0].getParameterTypes()[0]; + for (Field field : fields) + { + if (field.getType().equals(desiredType)) + { + field.setAccessible(true); + return field.get(this); + } + } + } + catch (Exception e) + { + // Couldn't find method of parent type. + } + return null; + } + private Object tryToGetParentByName() + { + try + { + Class clazz = this.getClass(); + Field parentField = clazz.getDeclaredField("this$0"); + parentField.setAccessible(true); + return parentField.get(this); + } + catch (Exception e) + { + // Failed try 1 -> this$0 field doesn't exist + } + return null; + } + public void returnValue(Out returnValue) + { + this.returnValue = returnValue; + } + public void ret(Out returnValue) + { + returnValue(returnValue); + } +} diff --git a/src/main/java/org/lambda/functions/implementations/S1.java b/src/main/java/org/lambda/functions/implementations/S1.java new file mode 100644 index 0000000..eb0971c --- /dev/null +++ b/src/main/java/org/lambda/functions/implementations/S1.java @@ -0,0 +1,9 @@ +package org.lambda.functions.implementations; + +public class S1 extends F1 +{ + public S1(In a, Object... extraVariables) + { + super(a, extraVariables); + } +} diff --git a/src/main/java/org/lambda/query/Echo1.java b/src/main/java/org/lambda/query/Echo1.java new file mode 100644 index 0000000..aff8938 --- /dev/null +++ b/src/main/java/org/lambda/query/Echo1.java @@ -0,0 +1,14 @@ +package org.lambda.query; + +import org.lambda.functions.Function1; + +/** + * A super fast Lambda that simply return whatever is sent + **/ +public class Echo1 implements Function1 +{ + public T call(T i) + { + return i; + } +} diff --git a/src/main/java/org/lambda/query/Loops.java b/src/main/java/org/lambda/query/Loops.java new file mode 100644 index 0000000..55260ed --- /dev/null +++ b/src/main/java/org/lambda/query/Loops.java @@ -0,0 +1,14 @@ +package org.lambda.query; + +import org.lambda.actions.Action1; + +public class Loops +{ + public static void forEach(Iterable students, Action1 a1) + { + for (In in : students) + { + a1.call(in); + } + } +} diff --git a/src/main/java/org/lambda/query/OrderBy.java b/src/main/java/org/lambda/query/OrderBy.java new file mode 100644 index 0000000..182a3ff --- /dev/null +++ b/src/main/java/org/lambda/query/OrderBy.java @@ -0,0 +1,29 @@ +package org.lambda.query; + +import java.util.Comparator; + +import org.lambda.functions.Function1; + +@SuppressWarnings("rawtypes") +public class OrderBy implements Comparator +{ + public static enum Order { + Ascending, Descending + } + private Function1 f1; + private int ascending; + public OrderBy(Function1 f1) + { + this(Order.Ascending, f1); + } + public OrderBy(Order order, Function1 f1) + { + this.f1 = f1; + this.ascending = order == Order.Ascending ? 1 : -1; + } + @Override + public int compare(T a, T b) + { + return f1.call(a).compareTo(f1.call(b)) * ascending; + } +} diff --git a/src/main/java/org/lambda/query/ParallelLoops.java b/src/main/java/org/lambda/query/ParallelLoops.java new file mode 100644 index 0000000..23f5a17 --- /dev/null +++ b/src/main/java/org/lambda/query/ParallelLoops.java @@ -0,0 +1,43 @@ +package org.lambda.query; + +import java.util.concurrent.atomic.AtomicInteger; + +import org.lambda.actions.Action1; +import org.lambda.actions.implementations.A0; + +import com.spun.util.ThreadLauncher; + +public class ParallelLoops +{ + public static void forEach(Iterable list, final Action1 a1) + { + final AtomicInteger done = new AtomicInteger(); + int count = 0; + for (T i : list) + { + count++; + final T piece = i; + ThreadLauncher.launch(new A0(false, a1, piece, done) + { + { + if (run) + { + a1.call(piece); + done.incrementAndGet(); + } + } + }); + } + while (done.get() != count) + { + try + { + Thread.sleep(2); + } + catch (InterruptedException e) + { + // do nothing + } + } + } +} diff --git a/src/main/java/org/lambda/query/ParallelQuery.java b/src/main/java/org/lambda/query/ParallelQuery.java new file mode 100644 index 0000000..9f1f07c --- /dev/null +++ b/src/main/java/org/lambda/query/ParallelQuery.java @@ -0,0 +1,50 @@ +package org.lambda.query; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +import org.lambda.actions.implementations.A0; +import org.lambda.functions.Function1; + +import com.spun.util.ThreadLauncher; + +public class ParallelQuery +{ + public static List where(Iterable list, final Function1 funct) + { + final ArrayList out = new ArrayList(); + final AtomicInteger done = new AtomicInteger(); + int count = 0; + for (In i : list) + { + count++; + final In piece = i; + ThreadLauncher.launch(new A0(false, funct, piece, out, done) + { + { + if (run) + { + if (funct.call(piece)) + { + out.add(piece); + } + done.incrementAndGet(); + } + } + }); + } + while (done.get() != count) + { + try + { + Thread.sleep(2); + } + catch (InterruptedException e) + { + // do nothing + } + } + return out; + } +} diff --git a/src/main/java/org/lambda/query/Query.java b/src/main/java/org/lambda/query/Query.java new file mode 100644 index 0000000..a91ff85 --- /dev/null +++ b/src/main/java/org/lambda/query/Query.java @@ -0,0 +1,137 @@ +package org.lambda.query; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +import org.lambda.functions.Function1; +import org.lambda.query.OrderBy.Order; + +import com.spun.util.ArrayUtils; + +public class Query +{ + public static List select(List list, Function1 function) + { + ArrayList out = new ArrayList(); + for (In i : list) + { + out.add(function.call(i)); + } + return out; + } + public static List select(In[] list, Function1 function) + { + return select(Arrays.asList(list), function); + } + public static List where(Iterable list, Function1 funct) + { + ArrayList out = new ArrayList(); + for (In i : list) + { + if (funct.call(i)) + { + out.add(i); + } + } + return out; + } + public static List where(In[] list, Function1 funct) + { + ArrayList out = new ArrayList(); + for (In i : list) + { + if (funct.call(i)) + { + out.add(i); + } + } + return out; + } + public static In max(List list, Function1 f1) + { + return getTop(list, f1, 1); + } + public static In min(List list, Function1 f1) + { + return getTop(list, f1, -1); + } + public static Double average(List list, Function1 f1) + { + double total = 0.00; + for (In in : list) + { + total += f1.call(in).doubleValue(); + } + return total / list.size(); + } + private static In getTop(List list, Function1 f1, int modifier) + { + if (ArrayUtils.isEmpty(list)) { return null; } + In found = list.get(0); + Comparable max = f1.call(found); + for (In in : list) + { + Comparable current = f1.call(in); + if (max.compareTo(current) * modifier < 0) + { + max = current; + found = in; + } + } + return found; + } + public static T[] orderBy(T[] list, Function1 f1) + { + return orderBy(list, Order.Ascending, f1); + } + public static T[] orderBy(T[] list, Order order, Function1 f1) + { + Arrays.sort(list, new OrderBy(order, f1)); + return list; + } + public static List orderBy(List list, Function1 f1) + { + return orderBy(list, Order.Ascending, f1); + } + public static List orderBy(List list, Order order, Function1 f1) + { + Collections.sort(list, new OrderBy(order, f1)); + return list; + } + public static Double sum(In[] list, Function1 f1) + { + return sum(Arrays.asList(list), f1); + } + public static Double sum(Collection list, Function1 f1) + { + double sum = 0; + for (In in : list) + { + sum += f1.call(in).doubleValue(); + } + return sum; + } + public static Double sum(Collection list) + { + return sum(list, new Echo1()); + } + public static Double sum(Out[] list) + { + return sum(list, new Echo1()); + } + public static T max(List numbers) + { + return (T) max((List) numbers, new Echo1()); + } + public static T max(T[] numbers) + { + return max(Arrays.asList(numbers)); + } + public static T min(List numbers) + { + return (T) min((List) numbers, new Echo1()); + } +} diff --git a/src/main/java/org/teachingextensions/utils/Viewer.java b/src/main/java/org/teachingextensions/utils/Viewer.java index 8742363..49b7177 100644 --- a/src/main/java/org/teachingextensions/utils/Viewer.java +++ b/src/main/java/org/teachingextensions/utils/Viewer.java @@ -5,7 +5,7 @@ import java.io.IOException; import com.spun.util.ObjectUtils; -import com.spun.util.tests.TestUtils; +import com.spun.util.TestUtils; public class Viewer { diff --git a/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.java b/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.java index 363eea1..a4ceba7 100644 --- a/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.java +++ b/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.java @@ -16,9 +16,9 @@ import org.approvaltests.reporters.windows.TortoiseTextDiffReporter; import com.spun.util.StringUtils; +import com.spun.util.TestUtils; import com.spun.util.Tuple; import com.spun.util.io.FileUtils; -import com.spun.util.tests.TestUtils; import com.spun.util.velocity.ContextAware.ContextAwareMap; import com.spun.util.velocity.VelocityParser; From 10600933f064c527cb45f133223ffc48c51018a9 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Wed, 4 Mar 2015 11:09:37 -0800 Subject: [PATCH 006/111] crlf --- .classpath | 58 +++---- .settings/org.eclipse.core.resources.prefs | 12 +- .settings/org.eclipse.jdt.core.prefs | 10 +- .settings/org.eclipse.m2e.core.prefs | 8 +- pom.xml | 170 ++++++++++----------- 5 files changed, 129 insertions(+), 129 deletions(-) diff --git a/.classpath b/.classpath index 392cb6f..0c04dc7 100644 --- a/.classpath +++ b/.classpath @@ -1,29 +1,29 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs index 04cfa2c..29abf99 100644 --- a/.settings/org.eclipse.core.resources.prefs +++ b/.settings/org.eclipse.core.resources.prefs @@ -1,6 +1,6 @@ -eclipse.preferences.version=1 -encoding//src/main/java=UTF-8 -encoding//src/main/resources=UTF-8 -encoding//src/test/java=UTF-8 -encoding//src/test/resources=UTF-8 -encoding/=UTF-8 +eclipse.preferences.version=1 +encoding//src/main/java=UTF-8 +encoding//src/main/resources=UTF-8 +encoding//src/test/java=UTF-8 +encoding//src/test/resources=UTF-8 +encoding/=UTF-8 diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs index d59e09c..714351a 100644 --- a/.settings/org.eclipse.jdt.core.prefs +++ b/.settings/org.eclipse.jdt.core.prefs @@ -1,5 +1,5 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 -org.eclipse.jdt.core.compiler.compliance=1.8 -org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning -org.eclipse.jdt.core.compiler.source=1.8 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs index 14b697b..f897a7f 100644 --- a/.settings/org.eclipse.m2e.core.prefs +++ b/.settings/org.eclipse.m2e.core.prefs @@ -1,4 +1,4 @@ -activeProfiles= -eclipse.preferences.version=1 -resolveWorkspaceProjects=true -version=1 +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/pom.xml b/pom.xml index 90d447e..03bb1e2 100644 --- a/pom.xml +++ b/pom.xml @@ -1,86 +1,86 @@ - - 4.0.0 - - org.teachingkidsprogramming - 0.0.1-SNAPSHOT - TeachingKidsProgramming.Source.Java - This is the Source Code for Tortoise and many other utils that are used for the TKP Java Library. - TeachingKidsProgramming - http://teachingkidsprogramming.com/ - - - UTF-8 - - - - scm:git:git@github.com:TeachingKidsProgramming/TeachingKidsProgramming.Source.Java.git - scm:git:git@github.com:TeachingKidsProgramming/TeachingKidsProgramming.Source.Java.git - https://github.com/TeachingKidsProgramming/TeachingKidsProgramming.Source.Java.git - - - - - Bhagat Singh - bhagat.rawat@gmail.com - - - Jim Counts - jcounts18@gmail.com - Teaching Kids Programming - http://teachingkidsprogramming.com/ - - - Lynn Langit - lynn@teachingkidsprogramming.org - Teaching Kids Programming - http://teachingkidsprogramming.com/ - - - - - - org.teachingkidsprogramming - ApprovalTest - 0.0.1-SNAPSHOT - - - junit - junit - 4.12 - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - - 1.8 - 1.8 - - - - org.apache.maven.plugins - maven-javadoc-plugin - - private - true - - - - org.apache.maven.plugins - maven-compiler-plugin - - - org/teachingkidsprogramming/recipes/completed/*.* - org/teachingkidsprogramming/section*/*.* - - - - - - + + 4.0.0 + + org.teachingkidsprogramming + 0.0.1-SNAPSHOT + TeachingKidsProgramming.Source.Java + This is the Source Code for Tortoise and many other utils that are used for the TKP Java Library. + TeachingKidsProgramming + http://teachingkidsprogramming.com/ + + + UTF-8 + + + + scm:git:git@github.com:TeachingKidsProgramming/TeachingKidsProgramming.Source.Java.git + scm:git:git@github.com:TeachingKidsProgramming/TeachingKidsProgramming.Source.Java.git + https://github.com/TeachingKidsProgramming/TeachingKidsProgramming.Source.Java.git + + + + + Bhagat Singh + bhagat.rawat@gmail.com + + + Jim Counts + jcounts18@gmail.com + Teaching Kids Programming + http://teachingkidsprogramming.com/ + + + Lynn Langit + lynn@teachingkidsprogramming.org + Teaching Kids Programming + http://teachingkidsprogramming.com/ + + + + + + org.teachingkidsprogramming + ApprovalTest + 0.0.1-SNAPSHOT + + + junit + junit + 4.12 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + 1.8 + 1.8 + + + + org.apache.maven.plugins + maven-javadoc-plugin + + private + true + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org/teachingkidsprogramming/recipes/completed/*.* + org/teachingkidsprogramming/section*/*.* + + + + + + \ No newline at end of file From 6a4131dfc7d49fc798f1811aab6e2cc00f3a3741 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Wed, 4 Mar 2015 12:11:31 -0800 Subject: [PATCH 007/111] Fixed encoding --- .settings/org.eclipse.core.resources.prefs | 3 +-- pom.xml | 18 +++++------------- 2 files changed, 6 insertions(+), 15 deletions(-) diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs index 29abf99..8fe5fbd 100644 --- a/.settings/org.eclipse.core.resources.prefs +++ b/.settings/org.eclipse.core.resources.prefs @@ -1,6 +1,5 @@ eclipse.preferences.version=1 -encoding//src/main/java=UTF-8 encoding//src/main/resources=UTF-8 encoding//src/test/java=UTF-8 encoding//src/test/resources=UTF-8 -encoding/=UTF-8 +encoding/=ISO-8859-1 diff --git a/pom.xml b/pom.xml index 282afe4..793c270 100644 --- a/pom.xml +++ b/pom.xml @@ -17,9 +17,6 @@ This is the Source Code for Tortoise and many other utils that are used for the TKP Java Library. https://github.com/TeachingKidsProgramming/TeachingKidsProgramming.Source.Java - - UTF-8 - scm:git:git@github.com:TeachingKidsProgramming/TeachingKidsProgramming.Source.Java.git @@ -120,6 +117,7 @@ 1.8 1.8 + ISO-8859-1 @@ -130,16 +128,10 @@ true - + From 57e317946507c760664e2535d22d2003ef16a61b Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Wed, 4 Mar 2015 19:45:33 -0800 Subject: [PATCH 008/111] Removed some unnecessary ApprovalTests classes --- pom.xml | 24 +- src/main/java/com/spun/util/CallMethod.java | 30 - src/main/java/com/spun/util/Colors.java | 1551 ----------------- .../java/com/spun/util/EmbeddedSorter.java | 26 - .../com/spun/util/MethodExecutionPath.java | 199 --- src/main/java/com/spun/util/MethodSorter.java | 203 --- src/main/java/com/spun/util/NumberUtils.java | 41 +- src/main/java/com/spun/util/ObjectUtils.java | 54 +- .../java/com/spun/util/ThreadLauncher.java | 8 +- .../ReverseOrderLimitQueryWriter.java | 135 -- .../java/com/spun/util/database/SQLQuery.java | 338 ---- .../com/spun/util/database/SQLQueryUtils.java | 99 -- .../spun/util/database/SQLQueryWriter.java | 11 - .../spun/util/database/SQLStatementUtils.java | 55 - .../java/com/spun/util/database/SQLWhere.java | 159 -- .../spun/util/database/SimpleQueryWriter.java | 132 -- .../java/com/spun/util/date/DateRange.java | 182 -- .../com/spun/util/date/DateRangeUtils.java | 17 - .../com/spun/util/filters/MethodFilter.java | 79 - .../util/filters/MethodFilterBuilder.java | 42 - .../com/spun/util/parser/ParserCommons.java | 277 --- .../spun/util/parser/PercentageAmount.java | 61 - .../spun/util/parser/TemplateNumberUtils.java | 105 -- .../com/spun/util/persistence/SqlLoader.java | 33 - .../com/spun/util/servlets/BasicServlet.java | 328 ---- .../servlets/ServletLogWriterFactory.java | 54 - .../spun/util/servlets/StageServletUtils.java | 69 - .../spun/util/timers/MetricsDisplayer.java | 36 - .../spun/util/velocity/VelocityParser.java | 188 -- .../java/org/approvaltests/Approvals.java | 80 - .../writers/ResultSetApprovalWriter.java | 45 - .../org/teachingextensions/logo/Colors.java | 326 ++-- .../teachingextensions/logo/PenColors.java | 326 ++-- .../quizzes/graders/AdLibsQuizGrader.java | 232 +-- .../quizzes/graders/HiLowQuizGrader.java | 4 +- .../quizzes/graders/HousesQuizGrader.java | 8 +- .../graders/PentagonCrazyQuizGrader.java | 10 +- .../quizzes/graders/QuizBuzzGrader.java | 4 +- .../quizzes/graders/SpiderWebQuizGrader.java | 8 +- .../quizzes/graders/TreeQuizGrader.java | 6 +- 40 files changed, 477 insertions(+), 5108 deletions(-) delete mode 100644 src/main/java/com/spun/util/CallMethod.java delete mode 100644 src/main/java/com/spun/util/Colors.java delete mode 100644 src/main/java/com/spun/util/EmbeddedSorter.java delete mode 100644 src/main/java/com/spun/util/MethodExecutionPath.java delete mode 100644 src/main/java/com/spun/util/MethodSorter.java delete mode 100644 src/main/java/com/spun/util/database/ReverseOrderLimitQueryWriter.java delete mode 100644 src/main/java/com/spun/util/database/SQLQuery.java delete mode 100644 src/main/java/com/spun/util/database/SQLQueryUtils.java delete mode 100644 src/main/java/com/spun/util/database/SQLQueryWriter.java delete mode 100644 src/main/java/com/spun/util/database/SQLStatementUtils.java delete mode 100644 src/main/java/com/spun/util/database/SQLWhere.java delete mode 100644 src/main/java/com/spun/util/database/SimpleQueryWriter.java delete mode 100644 src/main/java/com/spun/util/date/DateRange.java delete mode 100644 src/main/java/com/spun/util/date/DateRangeUtils.java delete mode 100644 src/main/java/com/spun/util/filters/MethodFilter.java delete mode 100644 src/main/java/com/spun/util/filters/MethodFilterBuilder.java delete mode 100644 src/main/java/com/spun/util/parser/ParserCommons.java delete mode 100644 src/main/java/com/spun/util/parser/PercentageAmount.java delete mode 100644 src/main/java/com/spun/util/parser/TemplateNumberUtils.java delete mode 100644 src/main/java/com/spun/util/persistence/SqlLoader.java delete mode 100644 src/main/java/com/spun/util/servlets/BasicServlet.java delete mode 100644 src/main/java/com/spun/util/servlets/ServletLogWriterFactory.java delete mode 100644 src/main/java/com/spun/util/servlets/StageServletUtils.java delete mode 100644 src/main/java/com/spun/util/timers/MetricsDisplayer.java delete mode 100644 src/main/java/com/spun/util/velocity/VelocityParser.java delete mode 100644 src/main/java/org/approvaltests/writers/ResultSetApprovalWriter.java diff --git a/pom.xml b/pom.xml index 793c270..70a1edc 100644 --- a/pom.xml +++ b/pom.xml @@ -112,26 +112,19 @@ org.apache.maven.plugins - maven-compiler-plugin - - - 1.8 - 1.8 - ISO-8859-1 - + maven-javadoc-plugin + 2.10.1 org.apache.maven.plugins - maven-javadoc-plugin + maven-compiler-plugin + 3.2 - private - true + 1.8 + 1.8 + ISO-8859-1 - @@ -139,4 +132,7 @@ http://teachingkidsprogramming.com/ Teaching Kids Programming + + ISO-8859-1 + \ No newline at end of file diff --git a/src/main/java/com/spun/util/CallMethod.java b/src/main/java/com/spun/util/CallMethod.java deleted file mode 100644 index 0ae0891..0000000 --- a/src/main/java/com/spun/util/CallMethod.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.spun.util; - -import java.util.ArrayList; - -public class CallMethod -{ - private final Class clazz; - private ArrayList methodNames = new ArrayList(); - private ArrayList params = new ArrayList(); - public CallMethod(Class clazz) - { - this.clazz = clazz; - } - public CallMethod method(String methodName, Object... parameters) - { - methodNames.add(methodName); - if (!ArrayUtils.isEmpty(parameters)) - { - params.add(new MethodExecutionPath.Parameters(parameters)); - } - else { - params.add(new MethodExecutionPath.Parameters((Object[])null)); - } - return this; - } - public MethodExecutionPath go() - { - return new MethodExecutionPath(clazz, methodNames.toArray(new String[0]), params.toArray(new MethodExecutionPath.Parameters[0])); - } -} diff --git a/src/main/java/com/spun/util/Colors.java b/src/main/java/com/spun/util/Colors.java deleted file mode 100644 index 5e86e65..0000000 --- a/src/main/java/com/spun/util/Colors.java +++ /dev/null @@ -1,1551 +0,0 @@ -package com.spun.util; - -import java.awt.Color; -import java.util.Random; - -/** - * Every color under the - * rainbow, - * and different ways to get them. - */ -public class Colors -{ - public static class Blues - { - /** - * The color Navy - * - * - * - * - *
 
- **/ - public static final Color Navy = Color.decode("#000080"); - /** - * The color DarkBlue - * - * - * - * - *
 
- **/ - public static final Color DarkBlue = Color.decode("#00008B"); - /** - * The color MidnightBlue - * - * - * - * - *
 
- **/ - public static final Color MidnightBlue = Color.decode("#191970"); - /** - * The color MediumBlue - * - * - * - * - *
 
- **/ - public static final Color MediumBlue = Color.decode("#0000CD"); - /** - * The color Blue - * - * - * - * - *
 
- **/ - public static final Color Blue = Color.decode("#0000FF"); - /** - * The color Teal - * - * - * - * - *
 
- **/ - public static final Color Teal = Color.decode("#008080"); - /** - * The color DarkSlateBlue - * - * - * - * - *
 
- **/ - public static final Color DarkSlateBlue = Color.decode("#483D8B"); - /** - * The color DarkCyan - * - * - * - * - *
 
- **/ - public static final Color DarkCyan = Color.decode("#008B8B"); - /** - * The color SteelBlue - * - * - * - * - *
 
- **/ - public static final Color SteelBlue = Color.decode("#4682B4"); - /** - * The color RoyalBlue - * - * - * - * - *
 
- **/ - public static final Color RoyalBlue = Color.decode("#4169E1"); - /** - * The color SlateBlue - * - * - * - * - *
 
- **/ - public static final Color SlateBlue = Color.decode("#6A5ACD"); - /** - * The color CadetBlue - * - * - * - * - *
 
- **/ - public static final Color CadetBlue = Color.decode("#5F9EA0"); - /** - * The color DarkTurquoise - * - * - * - * - *
 
- **/ - public static final Color DarkTurquoise = Color.decode("#00CED1"); - /** - * The color DodgerBlue - * - * - * - * - *
 
- **/ - public static final Color DodgerBlue = Color.decode("#1E90FF"); - /** - * The color DeepSkyBlue - * - * - * - * - *
 
- **/ - public static final Color DeepSkyBlue = Color.decode("#00BFFF"); - /** - * The color MediumSlateBlue - * - * - * - * - *
 
- **/ - public static final Color MediumSlateBlue = Color.decode("#7B68EE"); - /** - * The color MediumTurquoise - * - * - * - * - *
 
- **/ - public static final Color MediumTurquoise = Color.decode("#48D1CC"); - /** - * The color CornflowerBlue - * - * - * - * - *
 
- **/ - public static final Color CornflowerBlue = Color.decode("#6495ED"); - /** - * The color Turquoise - * - * - * - * - *
 
- **/ - public static final Color Turquoise = Color.decode("#40E0D0"); - /** - * The color Aqua - * - * - * - * - *
 
- **/ - public static final Color Aqua = Color.decode("#00FFFF"); - /** - * The color Cyan - * - * - * - * - *
 
- **/ - public static final Color Cyan = Color.decode("#00FFFF"); - /** - * The color SkyBlue - * - * - * - * - *
 
- **/ - public static final Color SkyBlue = Color.decode("#87CEEB"); - /** - * The color LightSkyBlue - * - * - * - * - *
 
- **/ - public static final Color LightSkyBlue = Color.decode("#87CEFA"); - /** - * The color Aquamarine - * - * - * - * - *
 
- **/ - public static final Color Aquamarine = Color.decode("#7FFFD4"); - /** - * The color LightSteelBlue - * - * - * - * - *
 
- **/ - public static final Color LightSteelBlue = Color.decode("#B0C4DE"); - /** - * The color LightBlue - * - * - * - * - *
 
- **/ - public static final Color LightBlue = Color.decode("#ADD8E6"); - /** - * The color PowderBlue - * - * - * - * - *
 
- **/ - public static final Color PowderBlue = Color.decode("#B0E0E6"); - /** - * The color PaleTurquoise - * - * - * - * - *
 
- **/ - public static final Color PaleTurquoise = Color.decode("#AFEEEE"); - /** - * The color LightCyan - * - * - * - * - *
 
- **/ - public static final Color LightCyan = Color.decode("#E0FFFF"); - /** - * The color AliceBlue - * - * - * - * - *
 
- **/ - public static final Color AliceBlue = Color.decode("#F0F8FF"); - /** - * The color Azure - * - * - * - * - *
 
- **/ - public static final Color Azure = Color.decode("#F0FFFF"); - } - public static class Browns - { - /** - * The color Maroon - * - * - * - * - *
 
- **/ - public static final Color Maroon = Color.decode("#800000"); - /** - * The color SaddleBrown - * - * - * - * - *
 
- **/ - public static final Color SaddleBrown = Color.decode("#8B4513"); - /** - * The color Brown - * - * - * - * - *
 
- **/ - public static final Color Brown = Color.decode("#A52A2A"); - /** - * The color Sienna - * - * - * - * - *
 
- **/ - public static final Color Sienna = Color.decode("#A0522D"); - /** - * The color DarkGoldenrod - * - * - * - * - *
 
- **/ - public static final Color DarkGoldenrod = Color.decode("#B8860B"); - /** - * The color Chocolate - * - * - * - * - *
 
- **/ - public static final Color Chocolate = Color.decode("#D2691E"); - /** - * The color Peru - * - * - * - * - *
 
- **/ - public static final Color Peru = Color.decode("#CD853F"); - /** - * The color Goldenrod - * - * - * - * - *
 
- **/ - public static final Color Goldenrod = Color.decode("#DAA520"); - /** - * The color RosyBrown - * - * - * - * - *
 
- **/ - public static final Color RosyBrown = Color.decode("#BC8F8F"); - /** - * The color SandyBrown - * - * - * - * - *
 
- **/ - public static final Color SandyBrown = Color.decode("#F4A460"); - /** - * The color Tan - * - * - * - * - *
 
- **/ - public static final Color Tan = Color.decode("#D2B48C"); - /** - * The color BurlyWood - * - * - * - * - *
 
- **/ - public static final Color BurlyWood = Color.decode("#DEB887"); - /** - * The color Wheat - * - * - * - * - *
 
- **/ - public static final Color Wheat = Color.decode("#F5DEB3"); - /** - * The color NavajoWhite - * - * - * - * - *
 
- **/ - public static final Color NavajoWhite = Color.decode("#FFDEAD"); - /** - * The color Bisque - * - * - * - * - *
 
- **/ - public static final Color Bisque = Color.decode("#FFE4C4"); - /** - * The color BlanchedAlmond - * - * - * - * - *
 
- **/ - public static final Color BlanchedAlmond = Color.decode("#FFEBCD"); - /** - * The color Cornsilk - * - * - * - * - *
 
- **/ - public static final Color Cornsilk = Color.decode("#FFF8DC"); - } - public static class Grays - { - /** - * The color Black - * - * - * - * - *
 
- **/ - public static final Color Black = Color.decode("#000000"); - /** - * The color DarkSlateGray - * - * - * - * - *
 
- **/ - public static final Color DarkSlateGray = Color.decode("#2F4F4F"); - /** - * The color DimGray - * - * - * - * - *
 
- **/ - public static final Color DimGray = Color.decode("#696969"); - /** - * The color Gray - * - * - * - * - *
 
- **/ - public static final Color Gray = Color.decode("#808080"); - /** - * The color SlateGray - * - * - * - * - *
 
- **/ - public static final Color SlateGray = Color.decode("#708090"); - /** - * The color LightSlateGray - * - * - * - * - *
 
- **/ - public static final Color LightSlateGray = Color.decode("#778899"); - /** - * The color DarkGray - * - * - * - * - *
 
- **/ - public static final Color DarkGray = Color.decode("#A9A9A9"); - /** - * The color Silver - * - * - * - * - *
 
- **/ - public static final Color Silver = Color.decode("#C0C0C0"); - /** - * The color LightGray - * - * - * - * - *
 
- **/ - public static final Color LightGray = Color.decode("#D3D3D3"); - /** - * The color Gainsboro - * - * - * - * - *
 
- **/ - public static final Color Gainsboro = Color.decode("#DCDCDC"); - } - public static class Greens - { - /** - * The color DarkGreen - * - * - * - * - *
 
- **/ - public static final Color DarkGreen = Color.decode("#006400"); - /** - * The color Green - * - * - * - * - *
 
- **/ - public static final Color Green = Color.decode("#008000"); - /** - * The color ForestGreen - * - * - * - * - *
 
- **/ - public static final Color ForestGreen = Color.decode("#228B22"); - /** - * The color DarkOliveGreen - * - * - * - * - *
 
- **/ - public static final Color DarkOliveGreen = Color.decode("#556B2F"); - /** - * The color Lime - * - * - * - * - *
 
- **/ - public static final Color Lime = Color.decode("#00FF00"); - /** - * The color Olive - * - * - * - * - *
 
- **/ - public static final Color Olive = Color.decode("#808000"); - /** - * The color Teal - * - * - * - * - *
 
- **/ - public static final Color Teal = Color.decode("#008080"); - /** - * The color SeaGreen - * - * - * - * - *
 
- **/ - public static final Color SeaGreen = Color.decode("#2E8B57"); - /** - * The color DarkCyan - * - * - * - * - *
 
- **/ - public static final Color DarkCyan = Color.decode("#008B8B"); - /** - * The color OliveDrab - * - * - * - * - *
 
- **/ - public static final Color OliveDrab = Color.decode("#6B8E23"); - /** - * The color LimeGreen - * - * - * - * - *
 
- **/ - public static final Color LimeGreen = Color.decode("#32CD32"); - /** - * The color MediumSeaGreen - * - * - * - * - *
 
- **/ - public static final Color MediumSeaGreen = Color.decode("#3CB371"); - /** - * The color LawnGreen - * - * - * - * - *
 
- **/ - public static final Color LawnGreen = Color.decode("#7CFC00"); - /** - * The color LightSeaGreen - * - * - * - * - *
 
- **/ - public static final Color LightSeaGreen = Color.decode("#20B2AA"); - /** - * The color Chartreuse - * - * - * - * - *
 
- **/ - public static final Color Chartreuse = Color.decode("#7FFF00"); - /** - * The color SpringGreen - * - * - * - * - *
 
- **/ - public static final Color SpringGreen = Color.decode("#00FF7F"); - /** - * The color MediumSpringGreen - * - * - * - * - *
 
- **/ - public static final Color MediumSpringGreen = Color.decode("#00FA9A"); - /** - * The color YellowGreen - * - * - * - * - *
 
- **/ - public static final Color YellowGreen = Color.decode("#9ACD32"); - /** - * The color DarkTurquoise - * - * - * - * - *
 
- **/ - public static final Color DarkTurquoise = Color.decode("#00CED1"); - /** - * The color DarkSeaGreen - * - * - * - * - *
 
- **/ - public static final Color DarkSeaGreen = Color.decode("#8FBC8F"); - /** - * The color GreenYellow - * - * - * - * - *
 
- **/ - public static final Color GreenYellow = Color.decode("#ADFF2F"); - /** - * The color MediumAquamarine - * - * - * - * - *
 
- **/ - public static final Color MediumAquamarine = Color.decode("#66CDAA"); - /** - * The color MediumTurquoise - * - * - * - * - *
 
- **/ - public static final Color MediumTurquoise = Color.decode("#48D1CC"); - /** - * The color Turquoise - * - * - * - * - *
 
- **/ - public static final Color Turquoise = Color.decode("#40E0D0"); - /** - * The color LightGreen - * - * - * - * - *
 
- **/ - public static final Color LightGreen = Color.decode("#90EE90"); - /** - * The color PaleGreen - * - * - * - * - *
 
- **/ - public static final Color PaleGreen = Color.decode("#98FB98"); - /** - * The color Aquamarine - * - * - * - * - *
 
- **/ - public static final Color Aquamarine = Color.decode("#7FFFD4"); - /** - * The color PaleTurquoise - * - * - * - * - *
 
- **/ - public static final Color PaleTurquoise = Color.decode("#AFEEEE"); - } - public static class Oranges - { - /** - * The color OrangeRed - * - * - * - * - *
 
- **/ - public static final Color OrangeRed = Color.decode("#FF4500"); - /** - * The color DarkOrange - * - * - * - * - *
 
- **/ - public static final Color DarkOrange = Color.decode("#FF8C00"); - /** - * The color Orange - * - * - * - * - *
 
- **/ - public static final Color Orange = Color.decode("#FFA500"); - /** - * The color Tomato - * - * - * - * - *
 
- **/ - public static final Color Tomato = Color.decode("#FF6347"); - /** - * The color Coral - * - * - * - * - *
 
- **/ - public static final Color Coral = Color.decode("#FF7F50"); - /** - * The color LightSalmon - * - * - * - * - *
 
- **/ - public static final Color LightSalmon = Color.decode("#FFA07A"); - } - public static class Pinks - { - /** - * The color MediumVioletRed - * - * - * - * - *
 
- **/ - public static final Color MediumVioletRed = Color.decode("#C71585"); - /** - * The color DeepPink - * - * - * - * - *
 
- **/ - public static final Color DeepPink = Color.decode("#FF1493"); - /** - * The color PaleVioletRed - * - * - * - * - *
 
- **/ - public static final Color PaleVioletRed = Color.decode("#DB7093"); - /** - * The color Fuchsia - * - * - * - * - *
 
- **/ - public static final Color Fuchsia = Color.decode("#FF00FF"); - /** - * The color HotPink - * - * - * - * - *
 
- **/ - public static final Color HotPink = Color.decode("#FF69B4"); - /** - * The color LightPink - * - * - * - * - *
 
- **/ - public static final Color LightPink = Color.decode("#FFB6C1"); - /** - * The color Pink - * - * - * - * - *
 
- **/ - public static final Color Pink = Color.decode("#FFC0CB"); - } - public static class Purples - { - /** - * The color Indigo - * - * - * - * - *
 
- **/ - public static final Color Indigo = Color.decode("#4B0082"); - /** - * The color Purple - * - * - * - * - *
 
- **/ - public static final Color Purple = Color.decode("#800080"); - /** - * The color DarkSlateBlue - * - * - * - * - *
 
- **/ - public static final Color DarkSlateBlue = Color.decode("#483D8B"); - /** - * The color DarkMagenta - * - * - * - * - *
 
- **/ - public static final Color DarkMagenta = Color.decode("#8B008B"); - /** - * The color MediumVioletRed - * - * - * - * - *
 
- **/ - public static final Color MediumVioletRed = Color.decode("#C71585"); - /** - * The color DarkViolet - * - * - * - * - *
 
- **/ - public static final Color DarkViolet = Color.decode("#9400D3"); - /** - * The color SlateBlue - * - * - * - * - *
 
- **/ - public static final Color SlateBlue = Color.decode("#6A5ACD"); - /** - * The color BlueViolet - * - * - * - * - *
 
- **/ - public static final Color BlueViolet = Color.decode("#8A2BE2"); - /** - * The color DarkOrchid - * - * - * - * - *
 
- **/ - public static final Color DarkOrchid = Color.decode("#9932CC"); - /** - * The color MediumSlateBlue - * - * - * - * - *
 
- **/ - public static final Color MediumSlateBlue = Color.decode("#7B68EE"); - /** - * The color RosyBrown - * - * - * - * - *
 
- **/ - public static final Color RosyBrown = Color.decode("#BC8F8F"); - /** - * The color MediumPurple - * - * - * - * - *
 
- **/ - public static final Color MediumPurple = Color.decode("#9370DB"); - /** - * The color PaleVioletRed - * - * - * - * - *
 
- **/ - public static final Color PaleVioletRed = Color.decode("#DB7093"); - /** - * The color MediumOrchid - * - * - * - * - *
 
- **/ - public static final Color MediumOrchid = Color.decode("#BA55D3"); - /** - * The color Fuchsia - * - * - * - * - *
 
- **/ - public static final Color Fuchsia = Color.decode("#FF00FF"); - /** - * The color Magenta - * - * - * - * - *
 
- **/ - public static final Color Magenta = Color.decode("#FF00FF"); - /** - * The color Orchid - * - * - * - * - *
 
- **/ - public static final Color Orchid = Color.decode("#DA70D6"); - /** - * The color Plum - * - * - * - * - *
 
- **/ - public static final Color Plum = Color.decode("#DDA0DD"); - /** - * The color Violet - * - * - * - * - *
 
- **/ - public static final Color Violet = Color.decode("#EE82EE"); - /** - * The color Thistle - * - * - * - * - *
 
- **/ - public static final Color Thistle = Color.decode("#D8BFD8"); - /** - * The color Lavender - * - * - * - * - *
 
- **/ - public static final Color Lavender = Color.decode("#E6E6FA"); - } - public static class Reds - { - /** - * The color DarkRed - * - * - * - * - *
 
- **/ - public static final Color DarkRed = Color.decode("#8B0000"); - /** - * The color FireBrick - * - * - * - * - *
 
- **/ - public static final Color FireBrick = Color.decode("#B22222"); - /** - * The color Red - * - * - * - * - *
 
- **/ - public static final Color Red = Color.decode("#FF0000"); - /** - * The color Crimson - * - * - * - * - *
 
- **/ - public static final Color Crimson = Color.decode("#DC143C"); - /** - * The color OrangeRed - * - * - * - * - *
 
- **/ - public static final Color OrangeRed = Color.decode("#FF4500"); - /** - * The color MediumVioletRed - * - * - * - * - *
 
- **/ - public static final Color MediumVioletRed = Color.decode("#C71585"); - /** - * The color IndianRed - * - * - * - * - *
 
- **/ - public static final Color IndianRed = Color.decode("#CD5C5C"); - /** - * The color Tomato - * - * - * - * - *
 
- **/ - public static final Color Tomato = Color.decode("#FF6347"); - /** - * The color PaleVioletRed - * - * - * - * - *
 
- **/ - public static final Color PaleVioletRed = Color.decode("#DB7093"); - /** - * The color Salmon - * - * - * - * - *
 
- **/ - public static final Color Salmon = Color.decode("#FA8072"); - /** - * The color LightCoral - * - * - * - * - *
 
- **/ - public static final Color LightCoral = Color.decode("#F08080"); - /** - * The color DarkSalmon - * - * - * - * - *
 
- **/ - public static final Color DarkSalmon = Color.decode("#E9967A"); - /** - * The color LightSalmon - * - * - * - * - *
 
- **/ - public static final Color LightSalmon = Color.decode("#FFA07A"); - } - public static class Whites - { - /** - * The color AntiqueWhite - * - * - * - * - *
 
- **/ - public static final Color AntiqueWhite = Color.decode("#FAEBD7"); - /** - * The color MistyRose - * - * - * - * - *
 
- **/ - public static final Color MistyRose = Color.decode("#FFE4E1"); - /** - * The color Beige - * - * - * - * - *
 
- **/ - public static final Color Beige = Color.decode("#F5F5DC"); - /** - * The color Linen - * - * - * - * - *
 
- **/ - public static final Color Linen = Color.decode("#FAF0E6"); - /** - * The color OldLace - * - * - * - * - *
 
- **/ - public static final Color OldLace = Color.decode("#FDF5E6"); - /** - * The color Honeydew - * - * - * - * - *
 
- **/ - public static final Color Honeydew = Color.decode("#F0FFF0"); - /** - * The color WhiteSmoke - * - * - * - * - *
 
- **/ - public static final Color WhiteSmoke = Color.decode("#F5F5F5"); - /** - * The color Seashell - * - * - * - * - *
 
- **/ - public static final Color Seashell = Color.decode("#FFF5EE"); - /** - * The color LavenderBlush - * - * - * - * - *
 
- **/ - public static final Color LavenderBlush = Color.decode("#FFF0F5"); - /** - * The color AliceBlue - * - * - * - * - *
 
- **/ - public static final Color AliceBlue = Color.decode("#F0F8FF"); - /** - * The color FloralWhite - * - * - * - * - *
 
- **/ - public static final Color FloralWhite = Color.decode("#FFFAF0"); - /** - * The color MintCream - * - * - * - * - *
 
- **/ - public static final Color MintCream = Color.decode("#F5FFFA"); - /** - * The color Azure - * - * - * - * - *
 
- **/ - public static final Color Azure = Color.decode("#F0FFFF"); - /** - * The color Ivory - * - * - * - * - *
 
- **/ - public static final Color Ivory = Color.decode("#FFFFF0"); - /** - * The color GhostWhite - * - * - * - * - *
 
- **/ - public static final Color GhostWhite = Color.decode("#F8F8FF"); - /** - * The color Snow - * - * - * - * - *
 
- **/ - public static final Color Snow = Color.decode("#FFFAFA"); - /** - * The color White - * - * - * - * - *
 
- **/ - public static final Color White = Color.decode("#FFFFFF"); - } - public static class Yellows - { - /** - * The color DarkGoldenrod - * - * - * - * - *
 
- **/ - public static final Color DarkGoldenrod = Color.decode("#B8860B"); - /** - * The color Goldenrod - * - * - * - * - *
 
- **/ - public static final Color Goldenrod = Color.decode("#DAA520"); - /** - * The color Gold - * - * - * - * - *
 
- **/ - public static final Color Gold = Color.decode("#FFD700"); - /** - * The color DarkKhaki - * - * - * - * - *
 
- **/ - public static final Color DarkKhaki = Color.decode("#BDB76B"); - /** - * The color Yellow - * - * - * - * - *
 
- **/ - public static final Color Yellow = Color.decode("#FFFF00"); - /** - * The color Khaki - * - * - * - * - *
 
- **/ - public static final Color Khaki = Color.decode("#F0E68C"); - /** - * The color PaleGoldenrod - * - * - * - * - *
 
- **/ - public static final Color PaleGoldenrod = Color.decode("#EEE8AA"); - /** - * The color PeachPuff - * - * - * - * - *
 
- **/ - public static final Color PeachPuff = Color.decode("#FFDAB9"); - /** - * The color Moccasin - * - * - * - * - *
 
- **/ - public static final Color Moccasin = Color.decode("#FFE4B5"); - /** - * The color PapayaWhip - * - * - * - * - *
 
- **/ - public static final Color PapayaWhip = Color.decode("#FFEFD5"); - /** - * The color LemonChiffon - * - * - * - * - *
 
- **/ - public static final Color LemonChiffon = Color.decode("#FFFACD"); - /** - * The color LightGoldenrodYellow - * - * - * - * - *
 
- **/ - public static final Color LightGoldenrodYellow = Color.decode("#FAFAD2"); - /** - * The color LightYellow - * - * - * - * - *
 
- **/ - public static final Color LightYellow = Color.decode("#FFFFE0"); - } - private static Random RANDOM = new Random(); - public static Color darken(Color color) - { - int red = decrease(color.getRed(), 10); - int green = decrease(color.getGreen(), 10); - int blue = decrease(color.getBlue(), 10); - return new Color(red, green, blue); - } - private static int decrease(int amount, int decreaseBy) - { - return Math.max(0, amount - decreaseBy); - } - public static Color lighten(Color color) - { - int red = increase(color.getRed(), 10); - int green = increase(color.getGreen(), 10); - int blue = increase(color.getBlue(), 10); - return new Color(red, green, blue); - } - private static int increase(int amount, int increaseBy) - { - return Math.min(255, amount + increaseBy); - } - public static Color getRandomColor() - { - return new Color(RANDOM.nextInt(255), RANDOM.nextInt(255), RANDOM.nextInt(255)); - } - public static void mockRandom() - { - RANDOM.setSeed(5); - } - public static int calculateTransparency(int percentTransparent) - { - int opacity = (percentTransparent * 255) / 100; - return (255 - opacity); - } - public static Color getTransparentVersion(Color color, int percentTransparency) - { - return new Color(color.getRed(), color.getGreen(), color.getBlue(), calculateTransparency(percentTransparency)); - } -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/EmbeddedSorter.java b/src/main/java/com/spun/util/EmbeddedSorter.java deleted file mode 100644 index 977a273..0000000 --- a/src/main/java/com/spun/util/EmbeddedSorter.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.spun.util; - -import java.util.Comparator; - -public class EmbeddedSorter - implements java.util.Comparator -{ - private MethodExecutionPath executionPath; - private Comparator comparator; - - /************************************************************************/ - public EmbeddedSorter(Comparator comparator, MethodExecutionPath executionPath) - { - this.comparator = comparator; - this.executionPath = executionPath; - } - /************************************************************************/ - public int compare(T o1, T o2) - { - Object e1 = executionPath.extractValue(o1); - Object e2 = executionPath.extractValue(o2); - return comparator.compare(e1, e2); - } - /************************************************************************/ - /************************************************************************/ -} diff --git a/src/main/java/com/spun/util/MethodExecutionPath.java b/src/main/java/com/spun/util/MethodExecutionPath.java deleted file mode 100644 index e979ab4..0000000 --- a/src/main/java/com/spun/util/MethodExecutionPath.java +++ /dev/null @@ -1,199 +0,0 @@ -package com.spun.util; - -import java.io.Serializable; -import java.lang.reflect.Method; -import java.util.Arrays; - -import com.spun.util.filters.Filter; -import com.spun.util.filters.FilterUtils; - -public class MethodExecutionPath implements Serializable -{ - public static final Object NULL_ENCOUNTERED_ON_PATH = new Object(); - private Class classType, returnType; - private String methodNames[]; - private Parameters[] parameters; - private Method methods[]; - /***********************************************************************/ - public MethodExecutionPath(Class clazz, String methodName) - { - this(clazz, new String[]{methodName}, null); - } - /***********************************************************************/ - public MethodExecutionPath(Class clazz, String... methodNames) - { - this(clazz, methodNames, null); - } - /***********************************************************************/ - public MethodExecutionPath(Class clazz, String methodName, Parameters parameters) - { - this(clazz, new String[]{methodName}, new Parameters[]{parameters}); - } - /***********************************************************************/ - public MethodExecutionPath(Class clazz, String[] methodNames, Parameters[] parameters) - { - this.classType = clazz; - this.methodNames = methodNames; - this.parameters = parameters; - this.methods = getRecursiveMethods(clazz, methodNames, parameters); - this.returnType = (this.methods != null) ? methods[methods.length - 1].getReturnType() : null; - } - /************************************************************************/ - public static MethodExecutionPath method(Class class1, String method, Object... paramaters) - { - return new MethodExecutionPath(class1, new String[]{method}, new Parameters[]{new Parameters(paramaters)}); - } - public static Method[] getRecursiveMethods(Class clazz, String[] methodNames, Parameters[] parameters) - { - if (clazz == null) { return null; } - Method methods[] = new Method[methodNames.length]; - String currentMethodName = null; - Parameters parameter = null; - try - { - for (int i = 0; i < methods.length; i++) - { - currentMethodName = methodNames[i]; - parameter = Parameters.getParametersFor(parameters, i); - methods[i] = parameter.getBestFitMethod(clazz, currentMethodName); - clazz = methods[i].getReturnType(); - } - return methods; - } - catch (Exception e) - { - throw new Error("Unable to get method for " + clazz.getName() + "." + currentMethodName + "(" + parameter - + ")", e); - } - } - /***********************************************************************/ - public Object extractValue(Object object) - { - if (object == null) { return NULL_ENCOUNTERED_ON_PATH; } - Method[] methods = this.methods == null ? getRecursiveMethods(object.getClass(), this.methodNames, - this.parameters) : this.methods; - for (int i = 0; i < methods.length; i++) - { - if (object == null) { return NULL_ENCOUNTERED_ON_PATH; } - object = extractValue(object, methods[i], Parameters.getParametersFor(parameters, i).values); - } - return object; - } - /************************************************************************/ - private static Object extractValue(Object object, Method method, Object values[]) - { - try - { - return method.invoke(object, values); - } - catch (Exception e) - { - throw new Error("Problems extracting values from " + object.getClass().getName() + "." + method.getName(), e); - } - } - /************************************************************************/ - public Class getClassType() - { - return classType; - } - /***********************************************************************/ - public Class getReturnType() - { - return returnType; - } - /***********************************************************************/ - /***********************************************************************/ - public static class Parameters - { - public static final Parameters EMPTY = new Parameters(null, null); - public Class[] definitions; - public Object[] values; - /***********************************************************************/ - public Parameters(Object... values) - { - if (!ArrayUtils.isEmpty(values)) - { - this.values = values; - this.definitions = (Class[]) ObjectUtils.extractArray(values, "getClass"); - } - } - /***********************************************************************/ - public Parameters(Class[] definitions, Object[] values) - { - this.definitions = definitions; - this.values = values; - } - /***********************************************************************/ - public Method getBestFitMethod(Class clazz, String currentMethodName) throws NoSuchMethodException - { - return getBestFitMethod(clazz, currentMethodName, definitions); - } - /***********************************************************************/ - public static Method getBestFitMethod(Class clazz, String currentMethodName, Class[] definitions) - throws NoSuchMethodException - { - try - { - return clazz.getMethod(currentMethodName, definitions); - } - catch (NoSuchMethodException e) - { - Method[] methods = (Method[]) FilterUtils.retainExtracted(clazz.getMethods(), - new MethodParameterFilter(currentMethodName, definitions)).toArray(new Method[0]); - if (methods.length == 0) { throw e; } - if (methods.length == 1) - { - return methods[0]; - } - else - { - throw new Error("Don't know how to handle multiple available methods yet."); - } - } - } - /***********************************************************************/ - public static Parameters getParametersFor(Parameters[] parameters, int i) - { - if (parameters == null || (i >= parameters.length) || parameters[i] == null) { return EMPTY; } - return parameters[i]; - } - /***********************************************************************/ - public String toString() - { - return definitions == null ? "" : Arrays.asList(definitions).toString(); - } - } - public static class MethodParameterFilter implements Filter - { - private String methodName; - private Class[] classParameters; - /***********************************************************************/ - public MethodParameterFilter(String methodName, Class[] classParameters) - { - super(); - this.methodName = methodName; - this.classParameters = classParameters; - } - /***********************************************************************/ - public boolean isExtracted(Object object) throws IllegalArgumentException - { - ObjectUtils.assertInstance(Method.class, object); - Method m = (Method) object; - if (m.getName().equals(methodName) && m.getParameterTypes().length == classParameters.length) - { - Class[] params = m.getParameterTypes(); - for (int i = 0; i < params.length; i++) - { - if (!ObjectUtils.isThisInstanceOfThat(classParameters[i], params[i])) { return false; } - } - return true; - } - else - { - return false; - } - } - } - /***********************************************************************/ - /***********************************************************************/ -} diff --git a/src/main/java/com/spun/util/MethodSorter.java b/src/main/java/com/spun/util/MethodSorter.java deleted file mode 100644 index e3e73fe..0000000 --- a/src/main/java/com/spun/util/MethodSorter.java +++ /dev/null @@ -1,203 +0,0 @@ -package com.spun.util; - -import java.io.Serializable; -import java.util.Comparator; -import java.util.Date; - -public class MethodSorter implements java.util.Comparator, Serializable -{ - public static enum SortOrder { - Ascending, Decending; - public boolean toBoolean() - { - return this == Ascending; - } - public static SortOrder isAscending(boolean ascending) - { - return ascending ? Ascending : Decending; - } - } - private Comparator comparator; - private MethodExecutionPath path; - /************************************************************************/ - public MethodSorter(MethodExecutionPath path, SortOrder sortOrder) - { - SortOrder s = sortOrder; - this.path = path; - this.comparator = getComparatorForType(path.getReturnType(), s.toBoolean()); - } - /************************************************************************/ - public MethodSorter(Class classType, String methodName, boolean ascending) - { - this(new MethodExecutionPath(classType, methodName), SortOrder.isAscending(ascending)); - } - /************************************************************************/ - public MethodSorter(Class classType, String[] methodNames, boolean ascending) - { - - this(new MethodExecutionPath(classType, methodNames), SortOrder.isAscending(ascending)); - } - /************************************************************************/ - public Class getClassType() - { - return path.getClassType(); - } - /************************************************************************/ - private static Comparator getComparatorForType(Class type, boolean ascending) - { - if (String.class.isAssignableFrom(type)) - { - return new StringComparator(ascending); - } - else if (Double.TYPE.isAssignableFrom(type)) - { - return new NumberComparator(ascending); - } - else if (Integer.TYPE.isAssignableFrom(type) || Integer.class.isAssignableFrom(type)) - { - return new NumberComparator(ascending); - } - else if (Date.class.isAssignableFrom(type)) - { - return new DateComparator(ascending); - } - else if (Character.TYPE.isAssignableFrom(type)) - { - return new CharacterComparator(ascending); - } - else if (type.isArray()) - { - return new ArraySizeComparator(ascending); - } - else - { - throw new Error("Cannot handle class of type " + type.getName()); - } - } - /************************************************************************/ - private Object extractValue(T object) - { - Object o = path.extractValue(object); - return (MethodExecutionPath.NULL_ENCOUNTERED_ON_PATH == o) ? null : o; - } - /************************************************************************/ - public int compare(T o1, T o2) - { - return comparator.compare(extractValue(o1), extractValue(o2)); - } - private static int compareNull(Object o1, Object o2) - { - if (o1 == o2) { return 0; } - return (o1 == null) ? -1 : 1; - } - /************************************************************************/ - /************************************************************************/ - /* INNNER CLASSES */ - /************************************************************************/ - public static class NumberComparator implements Comparator, Serializable - { - private boolean ascending; - /************************************************************************/ - public NumberComparator(boolean ascending) - { - this.ascending = ascending; - } - /************************************************************************/ - public int compare(Object o1, Object o2) throws java.lang.ClassCastException - { - int value = 0; - if (o1 == null || o2 == null) - { - value = compareNull(o1, o2); - } - else - { - value = Double.compare(((Number) o1).doubleValue(), ((Number) o2).doubleValue()); - } - return ascending ? value : -value; - } - } - /***********************************************************************/ - public static class DateComparator implements Comparator, Serializable - { - private boolean ascending; - /************************************************************************/ - public DateComparator(boolean ascending) - { - this.ascending = ascending; - } - /************************************************************************/ - public int compare(Object o1, Object o2) - { - if (o1 == null || o2 == null) { return compareNull(o1, o2); } - Date date1 = (Date) o1; - Date date2 = (Date) o2; - return date1.compareTo(date2) * (ascending ? 1 : -1); - } - } - /***********************************************************************/ - public static class ArraySizeComparator implements Comparator - { - private boolean ascending; - /************************************************************************/ - public ArraySizeComparator(boolean ascending) - { - this.ascending = ascending; - } - /************************************************************************/ - public int compare(Object o1, Object o2) - { - Object[] array1 = (Object[]) o1; - Object[] array2 = (Object[]) o2; - return Double.compare(array1.length, array2.length) * (ascending ? 1 : -1); - } - } - /***********************************************************************/ - public static class CharacterComparator implements Comparator, Serializable - { - private boolean ascending; - /************************************************************************/ - public CharacterComparator(boolean ascending) - { - this.ascending = ascending; - } - /************************************************************************/ - public int compare(Object o1, Object o2) - { - Character c1 = (Character) o1; - Character c2 = (Character) o2; - return c1.compareTo(c2) * (ascending ? 1 : -1); - } - } - /***********************************************************************/ - public static class StringComparator implements Comparator, Serializable - { - private boolean ascending; - /************************************************************************/ - public StringComparator(boolean ascending) - { - this.ascending = ascending; - } - /************************************************************************/ - public int compare(Object o1, Object o2) - { - return StringComparator.compare((String) o1, (String) o2, ascending); - } - /************************************************************************/ - public static int compare(String o1, String o2, boolean ascending) - { - int value = 0; - if (o1 == null || o2 == null) - { - value = compareNull(o1, o2); - } - else - { - value = o1.compareTo(o2); - } - return ascending ? value : -value; - } - } - /************************************************************************/ - /************************************************************************/ -} diff --git a/src/main/java/com/spun/util/NumberUtils.java b/src/main/java/com/spun/util/NumberUtils.java index a305a7d..a5a856d 100644 --- a/src/main/java/com/spun/util/NumberUtils.java +++ b/src/main/java/com/spun/util/NumberUtils.java @@ -150,50 +150,13 @@ public static boolean isIn(int check, int[] available) } return false; } - /***********************************************************************/ - /** - * @deprecated use Query.sum() - */ - public static double sum(Object[] attribs, String methodName, Object[] params) - { - try - { - if (attribs == null || attribs.length == 0) { return 0.00; } - Method method = MethodExecutionPath.Parameters.getBestFitMethod(attribs[0].getClass(), methodName, - params == null ? null : (Class[]) ObjectUtils.extractArray(params, "getClass")); - double sum = 0; - for (int i = 0; i < attribs.length; i++) - { - sum += ((Number) method.invoke(attribs[i], params)).doubleValue(); - } - return sum; - } - catch (Throwable t) - { - throw ObjectUtils.throwAsError(t); - } - } + /***********************************************************************/ public static boolean isEven(int number) { return ((number % 2) == 0); } - /***********************************************************************/ - /** - * @deprecated use Query.sum() - */ - public static double sum(Object[] onArray, String forMethodName) - { - return sum(onArray, forMethodName, null); - } - /***********************************************************************/ - /** - * @deprecated use Query.sum() - */ - public static double sum(Collection onCollection, String forMethodName) - { - return sum(onCollection.toArray(), forMethodName, null); - } + /***********************************************************************/ public static T[] getShuffled(T[] objects, int numberToReturn) { diff --git a/src/main/java/com/spun/util/ObjectUtils.java b/src/main/java/com/spun/util/ObjectUtils.java index f6126d1..c83f6da 100644 --- a/src/main/java/com/spun/util/ObjectUtils.java +++ b/src/main/java/com/spun/util/ObjectUtils.java @@ -86,39 +86,7 @@ public static boolean isIn(Object target, Object[] objects) } return false; } - /***********************************************************************/ - public static T getForMethod(T[] onArray, Object forValue, String... onMethods) - { - return getForMethod(onArray, forValue, new MethodExecutionPath(null, onMethods)); - } - /***********************************************************************/ - public static T getForMethod(T[] onArray, Object forValue, String onMethod) - { - return getForMethod(onArray, forValue, new MethodExecutionPath(null, onMethod, null)); - } - /***********************************************************************/ - public static T getForMethod(T[] onArray, Object forValue, String onMethod, Object[] params) - { - return getForMethod(onArray, forValue, new MethodExecutionPath(null, onMethod, - new MethodExecutionPath.Parameters(params))); - } - /***********************************************************************/ - public static T getForMethod(T[] onArray, Object forValue, MethodExecutionPath path) - { - if (onArray == null || (onArray.length == 0)) { return null; } - try - { - for (int i = 0; i < onArray.length; i++) - { - if (isEqual(forValue, path.extractValue(onArray[i]))) { return onArray[i]; } - } - return null; - } - catch (Throwable t) - { - throw throwAsError(t); - } - } + /***********************************************************************/ public static boolean isThisInstanceOfThat(Class thiz, Class that) { @@ -253,25 +221,7 @@ public static void assertInstanceOrNull(Class type, Object value) assertInstance(type, value); } } - /************************************************************************/ - public static void move(Object from, Object to, String[] getters) - { - try - { - for (String method : getters) - { - Method getMethod = from.getClass().getMethod("get" + method, (Class[]) null); - Object value = getMethod.invoke(from, (Object[]) null); - Method m = MethodExecutionPath.Parameters.getBestFitMethod(to.getClass(), "set" + method, - new Class[]{getBestClass(value, getMethod)}); - m.invoke(to, value); - } - } - catch (Exception e) - { - throw throwAsError(e); - } - } + /************************************************************************/ private static Class getBestClass(Object value, Method method) { diff --git a/src/main/java/com/spun/util/ThreadLauncher.java b/src/main/java/com/spun/util/ThreadLauncher.java index 50f13e3..5f3e152 100644 --- a/src/main/java/com/spun/util/ThreadLauncher.java +++ b/src/main/java/com/spun/util/ThreadLauncher.java @@ -46,13 +46,7 @@ public ThreadLauncher(Object object, String methodName) throws SecurityException { this(object, object.getClass().getMethod(methodName, (Class[]) null), null, 0); } - /***********************************************************************/ - public ThreadLauncher(Object object, String methodName, Object[] objectParams, long delay) - throws SecurityException, NoSuchMethodException - { - this(object, MethodExecutionPath.Parameters.getBestFitMethod(object.getClass(), methodName, - getClassArray(objectParams)), objectParams, delay); - } + /***********************************************************************/ private static Class[] getClassArray(Object[] objectParams) { diff --git a/src/main/java/com/spun/util/database/ReverseOrderLimitQueryWriter.java b/src/main/java/com/spun/util/database/ReverseOrderLimitQueryWriter.java deleted file mode 100644 index 44d98f8..0000000 --- a/src/main/java/com/spun/util/database/ReverseOrderLimitQueryWriter.java +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Created on Mar 25, 2004 - * - * To change the template for this generated file go to - * Window - Preferences - Java - Code Generation - Code and Comments - */ -package com.spun.util.database; - - -import com.spun.util.database.SQLQuery.FromPart; -import com.spun.util.database.SQLQuery.LimitPart; -import com.spun.util.database.SQLQuery.OrderByPart; -import com.spun.util.servlets.ValidationError; - -/** - * @author Llewellyn Falco - * - * To change the template for this generated type comment go to - * Window - Preferences - Java - Code Generation - Code and Comments - */ -public class ReverseOrderLimitQueryWriter implements SQLQueryWriter -{ - private int databaseType; - - /**************************************************************************/ - public ReverseOrderLimitQueryWriter(int databaseType) - { - this.databaseType = databaseType; - } - /**************************************************************************/ - public String toString(SQLQuery query) - { - assertQueryValid(query); - query.setOrderReversed(true); - String innerQuery = constructInnerQuery(query).toString(databaseType); - String outerQuery = constructOuterQuery(innerQuery, query).toString(databaseType); - - return outerQuery; - } - - /***********************************************************************/ - private SQLQuery constructOuterQuery(String innerQuery, SQLQuery query) - { - SQLQuery outer = new SQLQuery(query.getAliasCount()); - // add the from parts - Replacer replacer = new Replacer(query.getFromParts().length); - - FromPart[] fromParts = query.getFromParts(); - for (int i = 0; i < fromParts.length; i++) - { - outer.addFromPart(new FromPart(replacer.replace(fromParts[i].part), fromParts[i].isJoin)); - } - String alias = outer.addFrom("(" + innerQuery + ")"); - String pkeyColumn = "." + query.getLimitPart().mainTablePkeyColumn; - outer.addWhere(alias + pkeyColumn + " = " + replacer.replace(query.getLimitPart().mainTableAlias) + pkeyColumn, true); - - OrderByPart[] orderByParts = query.getOrderByParts(); - for (int i = 0; i < orderByParts.length; i++) - { - outer.addOrderBy(replacer.replace(orderByParts[i].part), !orderByParts[i].ascending); - } - String[] selects = query.getSelectParts(); - for (int i = 0; i < selects.length; i++) - { - outer.addSelect(replacer.replace(selects[i])); - } - - outer.setLimitPart(new LimitPart(0, query.getLimitPart().numberOfRowsDesired, query.getLimitPart().mainTableAlias, query.getLimitPart().mainTablePkeyColumn)); - return outer; - } - - /***********************************************************************/ - private SQLQuery constructInnerQuery(SQLQuery query) - { - SQLQuery inner = new SQLQuery(); - // add the from parts - - FromPart[] fromParts = query.getFromParts(); - for (int i = 0; i < fromParts.length; i++) - { - inner.addFromPart(fromParts[i]); - } - SQLWhere wherePart = query.getWherePart(); - inner.addWhere(wherePart); - - OrderByPart[] orderByParts = query.getOrderByParts(); - for (int i = 0; i < orderByParts.length; i++) - { - inner.addOrderByPart(orderByParts[i]); - } - inner.addSelect(query.getLimitPart().mainTableAlias + "." + query.getLimitPart().mainTablePkeyColumn + " AS " + query.getLimitPart().mainTablePkeyColumn); - inner.setLimitPart(new LimitPart(0, query.getLimitPart().numberOfRowsDesired + query.getLimitPart().getStartingZeroBasedIndex(), query.getLimitPart().mainTableAlias, query.getLimitPart().mainTablePkeyColumn)); - - return inner; - } - - /***********************************************************************/ - private void assertQueryValid(SQLQuery query) - { - String[] assertions = new String[]{"groupByNull", "limitExists", "mainTableValid", "mainTablePkeyValid"}; - ValidationError error = new ValidationError(assertions); - error.setError("groupByNull", query.getGroupByParts().length > 0, "Cannot have group by in limit query."); - error.setError("limitExists", query.getLimitPart() == null || query.getLimitPart().getStartingZeroBasedIndex() == 0, "Must have a lower limit."); - error.setError("mainTableValid",query.getLimitPart() == null || query.getLimitPart().mainTableAlias == null, "Must define main table."); - error.setError("mainTablePkeyValid", query.getLimitPart() == null || query.getLimitPart().mainTablePkeyColumn == null, "Must define main table pkey column name."); - - if (!error.isOk()) - { - throw error; - } - } - /**************************************************************************/ - public static class Replacer - { - int index; - - /**************************************************************************/ - public Replacer(int index) - { - this.index = index; - } - /**************************************************************************/ - public String replace(String string) - { - for (int i = 0; i < index; i++) - { - char letter = (char)('a' + i); - string = string.replaceAll("\\b" + letter + "\\b", letter + "1"); - } - return string; - } - /**************************************************************************/ - } - -} diff --git a/src/main/java/com/spun/util/database/SQLQuery.java b/src/main/java/com/spun/util/database/SQLQuery.java deleted file mode 100644 index 908076c..0000000 --- a/src/main/java/com/spun/util/database/SQLQuery.java +++ /dev/null @@ -1,338 +0,0 @@ -package com.spun.util.database; - -import java.sql.SQLException; -import java.sql.Statement; -import java.util.ArrayList; -import com.spun.util.DatabaseUtils; -import com.spun.util.ObjectUtils; -import com.spun.util.StringUtils; - -public class SQLQuery -{ - public static final class JOINS - { - public static final String INNER_JOIN = "INNER JOIN"; - public static final String LEFT_OUTER_JOIN = "LEFT OUTER JOIN"; - public static final String RIGHT_OUTER_JOIN = "RIGHT OUTER JOIN"; - } - public static final String BREAK = "\n"; - private ArrayList select = null; - private ArrayList from = null; - private SQLWhere where = null; - private ArrayList orderBy = null; - private ArrayList groupBy = null; - private ArrayList having = null; - private boolean reversed = false; - private LimitPart limitPart; - private int tableAliasOffset; - private boolean distinct; - /**************************************************************************/ - public SQLQuery() - { - this(0); - } - /**************************************************************************/ - public SQLQuery(int tableAliasOffset) - { - this.tableAliasOffset = tableAliasOffset; - select = new ArrayList(); - from = new ArrayList(); - where = null; - orderBy = new ArrayList(); - groupBy = new ArrayList(); - having = new ArrayList(); - } - /**************************************************************************/ - public void addSelect(String part) - { - select.add(part); - } - /**************************************************************************/ - public void addSelect(String part, String alias) - { - select.add(part + " AS " + alias); - } - /**************************************************************************/ - public void addDistinct() - { - distinct = true; - } - /***********************************************************************/ - public boolean isDistinct() - { - return distinct; - } - /**************************************************************************/ - public String getFirstAliasForTableName(String tableName) - { - for (int i = 0; i < from.size(); i++) - { - FromPart part = (FromPart) from.get(i); - if (part.part.indexOf(tableName + " AS") != -1) { return "" + ((char) ('a' + i)); } - } - return null; - } - /**************************************************************************/ - public void addFromPart(FromPart from) - { - this.from.add(from); - } - /**************************************************************************/ - public void addOrderByPart(OrderByPart orderBy) - { - this.orderBy.add(orderBy); - } - /**************************************************************************/ - public void setLimitPart(LimitPart limit) - { - this.limitPart = limit; - } - /***********************************************************************/ - public int getAliasCount() - { - return getFromParts().length; - } - /**************************************************************************/ - public String addFrom(String table) - { - String alias = "" + (char) ('a' + tableAliasOffset + from.size()); - from.add(new FromPart(table + " AS " + alias, false)); - return alias; - } - /**************************************************************************/ - public String addFromWithInnerJoin(String table, String joinWith, String joinOn) - { - return addFromWithJoin(table, joinWith, joinOn, JOINS.INNER_JOIN); - } - /**************************************************************************/ - public String addFromWithLeftOuterJoin(String table, String joinWith, String joinOn) - { - return addFromWithJoin(table, joinWith, joinOn, JOINS.LEFT_OUTER_JOIN); - } - /***********************************************************************/ - public String addFromWithRightOuterJoin(String table, String joinWith, String joinOn) - { - return addFromWithJoin(table, joinWith, joinOn, JOINS.RIGHT_OUTER_JOIN); - } - /**************************************************************************/ - public String addFromWithJoin(String table, String joinWith, String joinOn, String joinType) - { - String alias = "" + (char) ('a' + tableAliasOffset + from.size()); - String sql = (joinType + " " + table + " AS " + alias + " ON " + joinWith + " = " + alias + "." + joinOn); - from.add(new FromPart(sql, true)); - return alias; - } - /**************************************************************************/ - public void addWhere(String part) - { - addWhere(new SQLWhere(part), true); - } - /**************************************************************************/ - public void addWhere(SQLWhere part) - { - addWhere(part, true); - } - /**************************************************************************/ - public void addWhere(String part, boolean joinWithAnd) - { - addWhere(new SQLWhere(part), joinWithAnd); - } - /**************************************************************************/ - public void addWhere(SQLWhere part, boolean joinWithAnd) - { - where = joinWithAnd ? SQLWhere.joinByAnd(where, part) : SQLWhere.joinByOr(where, part); - } - /**************************************************************************/ - public String toString() - { - return toString(DatabaseUtils.SQLSERVER); - } - /**************************************************************************/ - public String toString(Statement stmt) - { - try - { - return toString(DatabaseUtils.getDatabaseType(stmt)); - } - catch (SQLException e) - { - throw ObjectUtils.throwAsError(e); - } - } - /**************************************************************************/ - public String toString(int databaseType) - { - SQLQueryWriter writer = getSQLQueryWriter(databaseType); - return writer.toString(this); - } - /***********************************************************************/ - private SQLQueryWriter getSQLQueryWriter(int databaseType) - { - if (limitPart == null || DatabaseUtils.MY_SQL == databaseType) - { - return new SimpleQueryWriter(databaseType); - } - else if (limitPart.startingZeroBasedIndex == 0) - { - return new SimpleQueryWriter(databaseType); - } - else - { - return new ReverseOrderLimitQueryWriter(databaseType); - } - } - /***********************************************************************/ - public void addOrderBy(String orderByClause, boolean ascending) - { - orderBy.add(new OrderByPart(orderByClause, ascending)); - } - /***********************************************************************/ - public void addOrderBy(ColumnMetadata submitted, String alias, boolean ascending) - { - addOrderBy(submitted.getNameWithPrefix(alias),ascending); - - } - /***********************************************************************/ - public void addGroupBy(String groupByClause) - { - groupBy.add(groupByClause); - } - /***********************************************************************/ - public void addHaving(String havingClause) - { - having.add(havingClause); - } - /***********************************************************************/ - public void setOrderReversed(boolean reversed) - { - this.reversed = reversed; - } - /***********************************************************************/ - public boolean isOrderReversed() - { - return reversed; - } - /***********************************************************************/ - public void addLimit(int startingZeroBasedIndex, int numberOfRowsDesired, String mainTableAlias, String mainTablePkeyColumn) - { - this.limitPart = new LimitPart(startingZeroBasedIndex, numberOfRowsDesired, mainTableAlias, mainTablePkeyColumn); - } - /***********************************************************************/ - public void addLimit(int startingZeroBasedIndex, int numberOfRowsDesired, String mainTableAlias, ColumnMetadata mainTablePkeyColumn) - { - addLimit(startingZeroBasedIndex, numberOfRowsDesired, mainTableAlias, mainTablePkeyColumn.getName()); - } - /***********************************************************************/ - public LimitPart getLimitPart() - { - return limitPart; - } - /***********************************************************************/ - public String[] getSelectParts() - { - return StringUtils.toArray(select); - } - /***********************************************************************/ - public String[] getGroupByParts() - { - return StringUtils.toArray(groupBy); - } - /***********************************************************************/ - public String[] getHavingParts() - { - return StringUtils.toArray(having); - } - /***********************************************************************/ - public FromPart[] getFromParts() - { - return (FromPart[]) from.toArray(new FromPart[from.size()]); - } - /***********************************************************************/ - public SQLWhere getWherePart() - { - return where; - } - /***********************************************************************/ - public OrderByPart[] getOrderByParts() - { - return (OrderByPart[]) orderBy.toArray(new OrderByPart[orderBy.size()]); - } - /**************************************************************************/ - /** INNER CLASSES **/ - /**************************************************************************/ - public static class LimitPart implements Cloneable - { - private int startingZeroBasedIndex; - public int numberOfRowsDesired; - public String mainTableAlias; - public String mainTablePkeyColumn; - /**************************************************************************/ - public LimitPart(int startingZeroBasedIndex, int numberOfRowsDesired, String mainTableAlias, String mainTablePkeyColumn) - { - this.setStartingZeroBasedIndex(startingZeroBasedIndex); - this.numberOfRowsDesired = numberOfRowsDesired; - this.mainTableAlias = mainTableAlias; - this.mainTablePkeyColumn = mainTablePkeyColumn; - } - /***********************************************************************/ - public int getStartingZeroBasedIndex() - { - return startingZeroBasedIndex; - } - /***********************************************************************/ - public void setStartingZeroBasedIndex(int startingZeroBasedIndex) - { - if (startingZeroBasedIndex < 0) { throw new Error("startingZeroBasedIndex: " + startingZeroBasedIndex + " must be greater than 0."); } - this.startingZeroBasedIndex = startingZeroBasedIndex; - } - /**************************************************************************/ - /**************************************************************************/ - } - public static class OrderByPart implements Cloneable - { - public String part = null; - public boolean ascending = false; - /**************************************************************************/ - public OrderByPart(String part, boolean ascending) - { - this.part = part; - this.ascending = ascending; - } - /**************************************************************************/ - public String toString(boolean isFirst) - { - String sql = part + (ascending ? " ASC " : " DESC "); - if (!isFirst) - { - sql = (isFirst ? " " : ", ") + sql; - } - return sql; - } - /**************************************************************************/ - /**************************************************************************/ - } - public static class FromPart implements Cloneable - { - public String part = null; - public boolean isJoin = false; - /**************************************************************************/ - public FromPart(String part, boolean isJoin) - { - this.part = part; - this.isJoin = isJoin; - } - /**************************************************************************/ - public String toString(boolean isFirst) - { - String sql = part; - if (!isFirst) - { - sql = (isJoin ? " " : ", ") + sql; - } - return sql; - } - /**************************************************************************/ - /**************************************************************************/ - } - -} diff --git a/src/main/java/com/spun/util/database/SQLQueryUtils.java b/src/main/java/com/spun/util/database/SQLQueryUtils.java deleted file mode 100644 index 4a5e7b9..0000000 --- a/src/main/java/com/spun/util/database/SQLQueryUtils.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Created on Mar 25, 2004 - * - * To change the template for this generated file go to - * Window - Preferences - Java - Code Generation - Code and Comments - */ -package com.spun.util.database; - -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import java.sql.Timestamp; - -import com.spun.util.database.SQLQuery.FromPart; -import com.spun.util.database.SQLQuery.LimitPart; - -public class SQLQueryUtils -{ - public static class IntegerExtractor implements ResultSetExtractor - { - @Override - public Integer extract(ResultSet rs) throws SQLException - { - return rs.getInt(1); - } - } - public static class TimestampExtractor implements ResultSetExtractor - { - @Override - public Timestamp extract(ResultSet rs) throws SQLException - { - return rs.getTimestamp(1); - } - } - public static interface ResultSetExtractor - { - public T extract(ResultSet rs) throws SQLException; - } - /**************************************************************************/ - public static SQLQuery extractCountingQuery(SQLQuery query) - { - SQLQuery counter = new SQLQuery(); - // add the from parts - FromPart[] fromParts = query.getFromParts(); - for (int i = 0; i < fromParts.length; i++) - { - counter.addFromPart(fromParts[i]); - } - SQLWhere where = query.getWherePart(); - counter.addWhere(where); - counter.addSelect("count(*) AS thecount "); - return counter; - } - /**************************************************************************/ - public static SQLQuery refineLimitQuery(int maximum, SQLQuery query) - { - LimitPart limitPart = query.getLimitPart(); - if (limitPart.getStartingZeroBasedIndex() >= maximum) - { - limitPart.setStartingZeroBasedIndex(maximum - 1); - } - if (limitPart.numberOfRowsDesired + limitPart.getStartingZeroBasedIndex() > maximum) - { - limitPart.numberOfRowsDesired = maximum - limitPart.getStartingZeroBasedIndex(); - } - return query; - } - /***********************************************************************/ - public static int executeCountOnQuery(SQLQuery query, Statement stmt) throws SQLException - { - return executeSingleIntQuery(extractCountingQuery(query).toString(), stmt); - } - /***********************************************************************/ - public static int executeSingleIntQuery(String sql, Statement stmt) throws SQLException - { - ResultSet rs = SQLStatementUtils.executeQuery(sql, stmt); - return extractSingleRow(sql, rs, new IntegerExtractor()); - } - public static Timestamp executeSingleDateQuery(String sql, Statement stmt) throws SQLException - { - ResultSet rs = SQLStatementUtils.executeQuery(sql, stmt); - return extractSingleRow(sql, rs, new TimestampExtractor()); - } - /***********************************************************************/ - private static T extractSingleRow(String sql, ResultSet rs, ResultSetExtractor extractor) - throws SQLException - { - if (rs.next()) - { - T out = extractor.extract(rs); - rs.close(); - return out; - } - else - { - throw new SQLException("No results returned from query - " + sql); - } - } -} diff --git a/src/main/java/com/spun/util/database/SQLQueryWriter.java b/src/main/java/com/spun/util/database/SQLQueryWriter.java deleted file mode 100644 index 837c82c..0000000 --- a/src/main/java/com/spun/util/database/SQLQueryWriter.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.spun.util.database; - - -public interface SQLQueryWriter -{ - /**************************************************************************/ - public String toString(SQLQuery query); - /**************************************************************************/ - /**************************************************************************/ - -} diff --git a/src/main/java/com/spun/util/database/SQLStatementUtils.java b/src/main/java/com/spun/util/database/SQLStatementUtils.java deleted file mode 100644 index 508430f..0000000 --- a/src/main/java/com/spun/util/database/SQLStatementUtils.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.spun.util.database; - -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; - -import com.spun.util.DatabaseUtils; - -public class SQLStatementUtils -{ - /***********************************************************************/ - public static ResultSet executeQuery(SQLQuery query, Statement stmt) throws SQLException - { - return executeQuery(query.toString(DatabaseUtils.getDatabaseType(stmt)), stmt); - } - /***********************************************************************/ - public static ResultSet executeQuery(String query, Statement stmt) throws SQLInformationException - { - try - { - //My_System.query(query); - return stmt.executeQuery(query); - } - catch (SQLException e) - { - throw new SQLInformationException(query, e); - } - } - /***********************************************************************/ - public static int executeUpdate(String query, Statement stmt) throws SQLInformationException - { - try - { - return stmt.executeUpdate(query); - } - catch (SQLException e) - { - throw new SQLInformationException(query, e); - } - } - /***********************************************************************/ - public static boolean execute(String query, Statement stmt) throws SQLInformationException - { - try - { - return stmt.execute(query); - } - catch (SQLException e) - { - throw new SQLInformationException(query, e); - } - } - /***********************************************************************/ - /***********************************************************************/ -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/database/SQLWhere.java b/src/main/java/com/spun/util/database/SQLWhere.java deleted file mode 100644 index d7aa19d..0000000 --- a/src/main/java/com/spun/util/database/SQLWhere.java +++ /dev/null @@ -1,159 +0,0 @@ -package com.spun.util.database; - -import java.sql.Timestamp; -import java.util.Date; - -import com.spun.util.DatabaseUtils; -import com.spun.util.date.DateRange; - -/* - * This class is immutable - */ -public class SQLWhere -{ - private String part; - /**************************************************************************/ - public SQLWhere(String part) - { - this.part = part.trim(); - } - /**************************************************************************/ - public SQLWhere(ColumnMetadata metadata, String alias, String comparator, Object part2) - { - this(SQLUtils.compareBy(metadata, alias, comparator, part2)); - } - /**************************************************************************/ - public SQLWhere(ColumnMetadata metadata, String alias, Object value) - { - this(SQLUtils.compareByEquals(metadata, alias, value)); - } - /**************************************************************************/ - public SQLWhere(String part1, String comparator, ColumnMetadata metadata, String alias) - { - this(part1 + " " + comparator + " " + metadata.getNameWithPrefix(alias)); - } - /**************************************************************************/ - public SQLWhere(ColumnMetadata metadata1, String alias1, String comparator, ColumnMetadata metadata2, - String alias2) - { - this(metadata1.getNameWithPrefix(alias1) + " " + comparator + " " + metadata2.getNameWithPrefix(alias2)); - } - /**************************************************************************/ - public SQLWhere(String part1, String comparator, String part2) - { - this(part1 + " " + comparator + " " + part2); - } - /***********************************************************************/ - public SQLWhere(ColumnMetadata metadata, String alias, boolean value) - { - this(SQLUtils.compareBy(metadata, alias, "=", value)); - } - public SQLWhere(SQLQuery query, String comparator, String value) - { - this("(" + query.toString() + ")", comparator, value); - } - /**************************************************************************/ - public static SQLWhere joinByOr(SQLWhere a, SQLWhere b) - { - if (a == null) - { - return b; - } - else if (b == null) { return a; } - return new SQLWhere(join(a, "OR", b)); - } - /**************************************************************************/ - public static SQLWhere joinByOr(SQLWhere a, SQLWhere b, SQLWhere c) - { - return new SQLWhere(a.toString() + " OR " + b.toString() + " OR " + c.toString()); - } - /**************************************************************************/ - private static String join(SQLWhere a, String join, SQLWhere b) - { - return a.toString() + " " + join + " " + b.toString(); - } - /**************************************************************************/ - public SQLWhere joinByAnd(SQLWhere a) - { - return joinByAnd(this, a); - } - /**************************************************************************/ - public static SQLWhere joinByAnd(SQLWhere a, SQLWhere b) - { - if (a == null) - { - return b; - } - else if (b == null) { return a; } - return new SQLWhere(join(a, "AND", b)); - } - /**************************************************************************/ - @Override - public String toString() - { - return isPartWrapped(part) ? part : "(" + part + ")"; - } - /**************************************************************************/ - public static boolean isPartWrapped(String part) - { - if (part.charAt(0) != '(' || part.charAt(part.length() - 1) != ')') { return false; } - int count = 1; - for (int i = 1; i < part.length() - 1; i++) - { - switch (part.charAt(i)) - { - case '(' : - count++; - break; - case ')' : - count--; - if (count == 0) { return false; } - break; - } - } - return true; - } - /***********************************************************************/ - public static SQLWhere createBetween(ColumnMetadata column, String prefix, DateRange range) - { - return createBetween(range.getStart(), column, prefix, range.getEnd()); - } - public static SQLWhere createBetween(Date startTime, ColumnMetadata column, String prefix, Date endTime) - { - return new SQLWhere(SQLUtils.createSQLBetween(new Timestamp(startTime.getTime()).toString(), column - .getNameWithPrefix(prefix), new Timestamp(endTime.getTime()).toString())); - } - /***********************************************************************/ - public static SQLWhere createInSQLStatement(ColumnMetadata metadata, String alias, Object... values) - { - return new SQLWhere(SQLUtils.createInSQLStatement(metadata, alias, false, values)); - } - /***********************************************************************/ - public static SQLWhere createNotInSQLStatement(ColumnMetadata metadata, String alias, Object[] values) - { - return new SQLWhere(SQLUtils.createInSQLStatement(metadata, alias, true, values)); - } - /***********************************************************************/ - public static SQLWhere createInSQLStatement(ColumnMetadata metadata, String alias, boolean not, Object[] values) - { - return new SQLWhere(SQLUtils.createInSQLStatement(metadata, alias, not, values)); - } - /**************************************************************************/ - public static SQLWhere createLike(ColumnMetadata metaData, String alias, String search, int databaseType) - { - SQLWhere sql = new SQLWhere(metaData, alias, DatabaseUtils.getLike(databaseType), search); - return sql; - } - /**************************************************************************/ - public static SQLWhere createNotNull(ColumnMetadata metadata, String alias) - { - return new SQLWhere(SQLUtils.compareBy(metadata, alias, "!=", null)); - } - /**************************************************************************/ - /**************************************************************************/ - public static SQLWhere createNotLike(ColumnMetadata metaData, String alias, String search, int databaseType) - { - SQLWhere sql = new SQLWhere(metaData, alias, "NOT " + DatabaseUtils.getLike(databaseType), search); - return sql; - } -} diff --git a/src/main/java/com/spun/util/database/SimpleQueryWriter.java b/src/main/java/com/spun/util/database/SimpleQueryWriter.java deleted file mode 100644 index 02f9aae..0000000 --- a/src/main/java/com/spun/util/database/SimpleQueryWriter.java +++ /dev/null @@ -1,132 +0,0 @@ -package com.spun.util.database; - -import com.spun.util.DatabaseUtils; -import com.spun.util.database.SQLQuery.FromPart; -import com.spun.util.database.SQLQuery.OrderByPart; - -class SimpleQueryWriter implements SQLQueryWriter -{ - private int databaseType; - - /**************************************************************************/ - public SimpleQueryWriter(int databaseType) - { - this.databaseType = databaseType; - } - /**************************************************************************/ - public String toString(SQLQuery query) - { - StringBuffer sql = new StringBuffer("SELECT "); - if (query.isDistinct()) - { - sql.append("DISTINCT "); - } - // limit - if (DatabaseUtils.isSqlServer(databaseType) && query.getLimitPart() != null) - { - if (query.getLimitPart().getStartingZeroBasedIndex() != 0) - { - throw new Error("Wrong Sql writer for lower bound of " + query.getLimitPart().getStartingZeroBasedIndex()); - } - sql.append("TOP " + query.getLimitPart().numberOfRowsDesired + " "); - } - addSelectPart(sql, query.getSelectParts()); - addFromPart(sql, query.getFromParts()); - addWherePart(sql, query.getWherePart()); - addGroupBy(sql, query.getGroupByParts()); - addHaving(sql, query.getHavingParts()); - addOrderByPart(sql, query.getOrderByParts()); - //limit - if ((databaseType == DatabaseUtils.POSTGRESQL || databaseType == DatabaseUtils.MY_SQL) && query.getLimitPart() != null) - { - sql.append(" LIMIT "); - if (databaseType == DatabaseUtils.MY_SQL && query.getLimitPart().getStartingZeroBasedIndex() != 0) - { - sql.append(query.getLimitPart().getStartingZeroBasedIndex() + ", "); - } - sql.append(query.getLimitPart().numberOfRowsDesired); - } - return sql.toString(); - } - /***********************************************************************/ - private void addOrderByPart(StringBuffer sql, OrderByPart[] orderBys) - { - //order by - if (orderBys.length > 0) - { - sql.append(SQLQuery.BREAK + "ORDER BY "); - for (int i = 0; i < orderBys.length; i++) - { - sql.append(orderBys[i].toString(i == 0)); - } - sql.append(" "); - } - } - /***********************************************************************/ - private void addWherePart(StringBuffer sql, SQLWhere wherePart) - { - if (wherePart != null ) - { - sql.append(SQLQuery.BREAK + "WHERE "); - sql.append(wherePart.toString()); - } - } - /***********************************************************************/ - private void addFromPart(StringBuffer sql, FromPart[] froms) - { - if (froms.length > 0) - { - sql.append(SQLQuery.BREAK + "FROM "); - for (int i = 0; i < froms.length; i++) - { - sql.append(froms[i].toString(i == 0)); - } - sql.append(" "); - } - } - /***********************************************************************/ - private void addGroupBy(StringBuffer sql, String[] groupBys) - { - if (groupBys.length > 0) - { - sql.append(SQLQuery.BREAK + "GROUP BY "); - for (int i = 0; i < groupBys.length; i++) - { - sql.append(groupBys[i]); - sql.append(", "); - } - sql.setLength(sql.length() - 2); - sql.append(" "); - } - } - /***********************************************************************/ - private void addHaving(StringBuffer sql, String[] havings) - { - if (havings.length > 0) - { - sql.append(SQLQuery.BREAK + "HAVING "); - for (int i = 0; i < havings.length; i++) - { - sql.append(havings[i]); - sql.append(", "); - } - sql.setLength(sql.length() - 2); - sql.append(" "); - } - } - /***********************************************************************/ - private void addSelectPart(StringBuffer sql, String[] selectParts) - { - for (int i = 0; i < selectParts.length; i++) - { - sql.append(selectParts[i]); - sql.append(", "); - } - sql.setLength(sql.length() - 2); - sql.append(" "); - - } - /**************************************************************************/ - /**************************************************************************/ - -} diff --git a/src/main/java/com/spun/util/date/DateRange.java b/src/main/java/com/spun/util/date/DateRange.java deleted file mode 100644 index c4ef149..0000000 --- a/src/main/java/com/spun/util/date/DateRange.java +++ /dev/null @@ -1,182 +0,0 @@ -package com.spun.util.date; - -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Date; - -import com.spun.util.DateUtils; -import com.spun.util.MethodExecutionPath; -import com.spun.util.ObjectUtils; -import com.spun.util.filters.Filter; -import com.spun.util.parser.TemplateDate; - -public class DateRange -{ - public static final DateRange ALL = new DateRange(new Date(0), new Date(Long.MAX_VALUE)); - private final Date end; - private final Date start; - /************************************************************************/ - public DateRange(Date start, Date end) - { - this.start = start; - this.end = end; - } - /************************************************************************/ - public Filter getFilter(Class clazz, String... methodCalls) - { - return getFilter(new MethodExecutionPath(clazz, methodCalls)); - } - /************************************************************************/ - public Filter getFilter(MethodExecutionPath path) - { - return new DateRangeFilter(this, path); - } - /************************************************************************/ - public boolean contains(Date time) - { - time = (time == null) ? new Date() : time; - return (start.getTime() <= time.getTime()) && (time.getTime() < end.getTime()); - } - public static DateRange getRangeContaining(DateRange[] ranges, DateRange target) - { - for (DateRange dateRange : ranges) - { - if (dateRange.contains(target)) { return dateRange; } - } - return null; - } - private boolean contains(DateRange range) - { - return contains(range.end) || contains(range.start); - } - /************************************************************************/ - public Date getEnd() - { - return end; - } - /************************************************************************/ - public Date getStart() - { - return start; - } - /************************************************************************/ - @Override - public int hashCode() - { - return ObjectUtils.generateHashCode(start.getTime(), end.getTime()); - } - /************************************************************************/ - @Override - public boolean equals(Object object) - { - if (this == object) - { - return true; - } - else if (object instanceof DateRange) - { - DateRange that = (DateRange) object; - return this.start.getTime() == that.start.getTime() && this.end.getTime() == that.end.getTime(); - } - else - { - return false; - } - } - /************************************************************************/ - @Override - public String toString() - { - return String.format("[%s - %s]", new TemplateDate(start).getDateAndTime(), new TemplateDate(end) - .getDateAndTime()); - } - /***********************************************************************/ - public DateRange[] getWeeks() - { - return getUnits(new WeekAware()); - } - private DateRange[] getUnits(UnitAware unit) - { - ArrayList ranges = new ArrayList(); - Calendar start = DateUtils.asCalendar(getStart()); - Calendar end = (Calendar) start.clone(); - while (!(getEnd().getTime() <= end.getTime().getTime())) - { - end.add(Calendar.DAY_OF_YEAR, 1); - if (unit.isStart(end) || getEnd().getTime() <= end.getTime().getTime()) - { - ranges.add(new DateRange(start.getTime(), end.getTime())); - start = (Calendar) end.clone(); - } - } - return ranges.toArray(new DateRange[ranges.size()]); - } - /***********************************************************************/ - public DateRange[] getMonths() - { - return getUnits(new MonthAware()); - } - public DateRange[] getQuarters() - { - return getUnits(new QuarterAware()); - } - /************************************************************************/ - public boolean containsDayOfWeek(int day) - { - return getFirst(day) != null; - } - public Date getFirst(int day) - { - Calendar start = DateUtils.asCalendar(getStart()); - while (start.getTime().getTime() <= getEnd().getTime()) - { - start.add(Calendar.DAY_OF_YEAR, 1); - if (start.get(Calendar.DAY_OF_WEEK) == day) { return start.getTime(); } - } - return null; - } - /************************************************************************/ - /* INNER CLASSES */ - /************************************************************************/ - public static class DateRangeFilter implements Filter - { - private final MethodExecutionPath path; - private final DateRange range; - public DateRangeFilter(DateRange range, MethodExecutionPath path) - { - this.range = range; - this.path = path; - } - public boolean isExtracted(Object object) throws IllegalArgumentException - { - return range.contains((Date) path.extractValue(object)); - } - } - public static interface UnitAware - { - public boolean isStart(Calendar end); - } - public static class WeekAware implements UnitAware - { - public boolean isStart(Calendar end) - { - return end.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY; - } - } - public static class MonthAware implements UnitAware - { - public boolean isStart(Calendar end) - { - return end.get(Calendar.DAY_OF_MONTH) == 1; - } - } - public static class QuarterAware implements UnitAware - { - public boolean isStart(Calendar end) - { - return end.get(Calendar.DAY_OF_MONTH) == 1 && end.get(Calendar.MONTH) % 3 == 0; - } - } - /************************************************************************/ - /************************************************************************/ -} diff --git a/src/main/java/com/spun/util/date/DateRangeUtils.java b/src/main/java/com/spun/util/date/DateRangeUtils.java deleted file mode 100644 index c0e573b..0000000 --- a/src/main/java/com/spun/util/date/DateRangeUtils.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.spun.util.date; - -import java.sql.Timestamp; -import java.util.Date; - -import com.spun.util.DateUtils; - -public class DateRangeUtils -{ - public static DateRange getDay(Timestamp date) - { - Date start = DateUtils.getStartOfXDaysAgo(0, date); - Date end = DateUtils.getStartOfXDaysAgo(-1, date); - DateRange range = new DateRange(start, end); - return range; - } -} diff --git a/src/main/java/com/spun/util/filters/MethodFilter.java b/src/main/java/com/spun/util/filters/MethodFilter.java deleted file mode 100644 index 5703752..0000000 --- a/src/main/java/com/spun/util/filters/MethodFilter.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.spun.util.filters; - -import java.util.Date; - -import com.spun.util.MethodExecutionPath; -import com.spun.util.ObjectUtils; - -/************************************************************************/ -/** - * @deprecated use Query.where() - */ -public class MethodFilter implements com.spun.util.filters.Filter -{ - private MethodExecutionPath path = null; - private Object value = null; - private CompareBy operation; - public enum CompareBy{GREATER_THAN_OR_EQUAL,LESS_THAN_OR_EQUAL,EQUAL} - - - /************************************************************************/ - public MethodFilter(Class clazz, Object value, String... methodNames) - { - this(new MethodExecutionPath(clazz, methodNames), CompareBy.EQUAL, value); - } - /************************************************************************/ - public MethodFilter(Class clazz, Object value, CompareBy operation, String... methodNames) - { - this(new MethodExecutionPath(clazz, methodNames), operation, value); - } - /************************************************************************/ - public MethodFilter(Class clazz, Object value, MethodExecutionPath path) - { - this(path, CompareBy.EQUAL, value); - } - /************************************************************************/ - public MethodFilter(MethodExecutionPath path, CompareBy operation, Object value) - { - this.value = value; - this.path = path; - this.operation = operation; - ObjectUtils.assertInstanceOrNull(path.getReturnType(), value); - } - public MethodFilter(Class clazz, Object value, String method, Object parameter) - { - this(MethodExecutionPath.method(clazz, method, parameter), CompareBy.EQUAL, value); - } - /************************************************************************/ - - public boolean isExtracted(Object object) throws IllegalArgumentException - { - ObjectUtils.assertInstance(path.getClassType(), object); - Object extracted = path.extractValue(object); - switch (operation) - { - case EQUAL: - return ObjectUtils.isEqual(extracted, value); - case GREATER_THAN_OR_EQUAL: - if (value instanceof Date) - { - ObjectUtils.assertInstance(Date.class, extracted); - return ((Date)value).getTime() >= ((Date)extracted).getTime() ; - } - ObjectUtils.assertInstance(Number.class, value); - ObjectUtils.assertInstance(Number.class, extracted); - return ((Number)value).doubleValue() >= ((Number)extracted).doubleValue() ; - default: - return false; - } - - } - public static MethodFilterBuilder on(Class clazz) - { - return new MethodFilterBuilder(clazz); - } - - - /************************************************************************/ - /************************************************************************/ -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/filters/MethodFilterBuilder.java b/src/main/java/com/spun/util/filters/MethodFilterBuilder.java deleted file mode 100644 index 2c14ccb..0000000 --- a/src/main/java/com/spun/util/filters/MethodFilterBuilder.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.spun.util.filters; - -import java.util.ArrayList; - -import com.spun.util.CallMethod; -import com.spun.util.filters.MethodFilter.CompareBy; - -public class MethodFilterBuilder -{ - - private CompareBy compareBy; - private Object value; - private CallMethod path; - - public MethodFilterBuilder(Class clazz) - { - this.path = new CallMethod(clazz); - } - - public MethodFilterBuilder isEqual(Object o) - { - compareBy = CompareBy.EQUAL; - value = o; - return this; - } - - public MethodFilterBuilder method(String methodName, Object... parameters) - { - path.method(methodName, parameters); - return this; - } - - public ArrayList filterExtracted(T[] all) - { - return FilterUtils.retainExtracted(all, getFilter()); - } - - public Filter getFilter() - { - return new MethodFilter(path.go(),compareBy,value); - } -} diff --git a/src/main/java/com/spun/util/parser/ParserCommons.java b/src/main/java/com/spun/util/parser/ParserCommons.java deleted file mode 100644 index a56b683..0000000 --- a/src/main/java/com/spun/util/parser/ParserCommons.java +++ /dev/null @@ -1,277 +0,0 @@ -package com.spun.util.parser; - -import java.util.Collection; -import java.util.Collections; -import java.util.Date; -import java.util.List; -import com.spun.util.NumberUtils; -import com.spun.util.ObjectUtils; -import com.spun.util.PhoneNumber; -import com.spun.util.velocity.ParserDateUtils; - -public class ParserCommons -{ - public static TemplateStringUtils stringUtils = TemplateStringUtils.INSTANCE; - public static TemplateNumberUtils numberUtils = TemplateNumberUtils.INSTANCE; - public static TemplateDate today = TemplateDate.INSTANCE; - public static ParserCommons INSTANCE = new ParserCommons(); - - /***********************************************************************/ - public static TemplateNumberUtils getNumberUtils() - { - return numberUtils; - } - - /***********************************************************************/ - public static Class getClass(String clazz) throws ClassNotFoundException - { - return Class.forName(clazz); - } - - public static Object createNew(String clazz) throws InstantiationException, - IllegalAccessException, ClassNotFoundException - { - return getClass(clazz).newInstance(); - } - - /***********************************************************************/ - public static Object getNull() - { - return null; - } - - /***********************************************************************/ - public static ParserDateUtils getDateUtils() - { - return ParserDateUtils.INSTANCE; - } - - /***********************************************************************/ - public static TemplateStringUtils getStringUtils() - { - return stringUtils; - } - - /***********************************************************************/ - public static String asJavascript(Object obj) - { - return TemplateStringUtils.toJavaScriptEncode(obj); - } - - /***********************************************************************/ - public static TemplateDate getToday() - { - return today; - } - - /***********************************************************************/ - public static TemplateDate asDate(Date date) - { - return new TemplateDate(date); - } - - /***********************************************************************/ - public static TemplateDouble asDouble(double number) - { - return new TemplateDouble(number); - } - - /***********************************************************************/ - public static PhoneNumber asPhoneNumber(String number) - { - return new PhoneNumber(number); - } - - /***********************************************************************/ - public static String asExcel(String text) - { - return TemplateStringUtils.formatExcelString(text); - } - - /***********************************************************************/ - public static boolean isNull(Object object) - { - return object == null; - } - - /***********************************************************************/ - public static PercentageAmount asPercentage(double d) - { - return new PercentageAmount(d); - } - - /***********************************************************************/ - public static TemplateDouble asDouble(Number number) - { - return new TemplateDouble(number.doubleValue()); - } - - /***********************************************************************/ - public static List asArray(Object[] array, int offset, int stepping) - { - return new VelocityList(array, offset, stepping).getAll(); - } - - /***********************************************************************/ - public static List asArray(Object[] array, int offset, int stepping1, - int stepping2) - { - return new VelocityList(array, offset, new int[] { stepping1, stepping2 }) - .getAll(); - } - - /***********************************************************************/ - public static List asArray(Object[] array) - { - return new VelocityList(array).getAll(); - } - - /***********************************************************************/ - public static List asArray(Object nullObject) - { - if (nullObject != null) - { - throw new Error("Improper usage"); - } - return new VelocityList(Collections.EMPTY_LIST).getAll(); - } - - /***********************************************************************/ - public static List asArray(List list) - { - return new VelocityList(list).getAll(); - } - - /***********************************************************************/ - public static TemplateDouble asDouble(int number) - { - return new TemplateDouble(number); - } - - /***********************************************************************/ - public static CurrencyAmount asCurrency(double number) - { - return new CurrencyAmount(number); - } - - /***********************************************************************/ - public static CurrencyAmount asCurrency(Number number) - { - return number == null ? new CurrencyAmount(0.00) : new CurrencyAmount( - number.doubleValue()); - } - - /***********************************************************************/ - public static CurrencyAmount asCurrency(int number) - { - return new CurrencyAmount(number); - } - - /***********************************************************************/ - public static CurrencyAmount asCurrencyAmount(double number) - { - return new CurrencyAmount(number); - } - - /***********************************************************************/ - public static CurrencyAmount asCurrencyAmount(Number number) - { - return new CurrencyAmount(number.doubleValue()); - } - - /***********************************************************************/ - public static CurrencyAmount asCurrencyAmount(int number) - { - return new CurrencyAmount(number); - } - - /***********************************************************************/ - public static TemplateDouble sum(Object[] array, String methodName) - { - return new TemplateDouble(NumberUtils.sum(array, methodName, null)); - } - - /***********************************************************************/ - public static TemplateDouble sum(Object[] array, String methodName, - Object param1) - { - return new TemplateDouble(NumberUtils.sum(array, methodName, - new Object[] { param1 })); - } - - /***********************************************************************/ - public static TemplateDouble sum(Object[] array, String methodName, - Object param1, Object param2) - { - return new TemplateDouble(NumberUtils.sum(array, methodName, new Object[] { - param1, param2 })); - } - - /***********************************************************************/ - public static int getArrayLength(Object[] array) - { - return array == null ? 0 : array.length; - } - - /***********************************************************************/ - public static int getLength(Object[] array) - { - return array == null ? 0 : array.length; - } - - /***********************************************************************/ - public static int getLength(Collection collection) - { - return collection == null ? 0 : collection.size(); - } - - /***********************************************************************/ - public static boolean isEmpty(Object[] array) - { - return getArrayLength(array) == 0; - } - - /***********************************************************************/ - public static boolean isNotEmpty(Object[] array) - { - return !isEmpty(array); - } - - /***********************************************************************/ - public static boolean isEmpty(List list) - { - return (list == null || list.size() == 0); - } - - /***********************************************************************/ - public static Object ternary(boolean test, Object ifTrue, Object ifFalse) - { - return test ? ifTrue : ifFalse; - } - - /***********************************************************************/ - public static Object get(Object[] array, int index) - { - return getArrayLength(array) > index ? array[index] : null; - } - - /***********************************************************************/ - public static Object get(List list, int index) - { - return list == null ? null : list.get(index); - } - - /***********************************************************************/ - public static void throwError(String errorString) - { - throw new Error(errorString); - } - - /***********************************************************************/ - public static void throwError(Throwable t) - { - throw ObjectUtils.throwAsError(t); - } - /***********************************************************************/ - /***********************************************************************/ -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/parser/PercentageAmount.java b/src/main/java/com/spun/util/parser/PercentageAmount.java deleted file mode 100644 index 9c4c89c..0000000 --- a/src/main/java/com/spun/util/parser/PercentageAmount.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.spun.util.parser; - -import com.spun.util.NumberUtils; - -public class PercentageAmount extends TemplateDouble -{ - /************************************************************************/ - public PercentageAmount(double amount) - { - super(amount, "", "%", 0, 2); - } - /************************************************************************/ - public static PercentageAmount createFromRatio(double a, double b) - { - return new PercentageAmount(getAmount(a, a + b)); - } - /************************************************************************/ - public static PercentageAmount createFromFraction(double a, double b) - { - return new PercentageAmount(getAmount(a, b)); - } - /************************************************************************/ - private static double getAmount(double a, double b) - { - double amount = NumberUtils.equals(b, 0, 0.00001) ? 1 : (a / b); - return amount; - } - /************************************************************************/ - public PercentageAmount getInverse() - { - return new PercentageAmount(1 - amount); - } - /***********************************************************************/ - public String inDefaultFormat() - { - return inFormat(amount * 100, "", 2, 0, "%", true); - } - /***********************************************************************/ - public String inIntegerFormat() - { - return inFormat(amount * 100, "", 0, 0, "%", true); - } - /***********************************************************************/ - public String inDefaultFormat(String prefix, int precision, int minimumPrecision, String postfix, - boolean useGrouping) - { - return inFormat(amount * 100, prefix, precision, minimumPrecision, postfix, useGrouping); - } - /************************************************************************/ - public String toString() - { - return inDefaultFormat(); - } - /************************************************************************/ - public String withoutPostfix() - { - return inFormat(amount * 100, null, 6, 0, null, false); - } - /************************************************************************/ - /************************************************************************/ -} diff --git a/src/main/java/com/spun/util/parser/TemplateNumberUtils.java b/src/main/java/com/spun/util/parser/TemplateNumberUtils.java deleted file mode 100644 index 7f346d0..0000000 --- a/src/main/java/com/spun/util/parser/TemplateNumberUtils.java +++ /dev/null @@ -1,105 +0,0 @@ -package com.spun.util.parser; - -import org.lambda.query.Query; - -import com.spun.util.NumberUtils; - -public class TemplateNumberUtils -{ - public static TemplateNumberUtils INSTANCE = new TemplateNumberUtils(); - /************************************************************************/ - private TemplateNumberUtils() - { - } - public static boolean isZero(double d) - { - return isZero(d, 0.005); - } - /***********************************************************************/ - public static boolean isZero(Number d) - { - return d == null || isZero(d.doubleValue(), 0.005); - } - /***********************************************************************/ - public static int asInt(Number d) - { - return d == null ? 0 : d.intValue(); - } - /***********************************************************************/ - public static boolean isZero(double d, double delta) - { - return NumberUtils.equals(0, d, delta); - } - /***********************************************************************/ - private int getScaling(double have, double max, double scale) - { - if (max == 0) - { - throw new Error("Maximum cannot be zero"); - } - else - { - return (int)((have * scale) / max); - } - } - /***********************************************************************/ - public int getScaling(Integer have, Integer max, Integer scale) - { - return getScaling(have.doubleValue(), max.doubleValue(), scale.doubleValue()); - } - /***********************************************************************/ - public static double doArithmetic(int arg1, String operation, int arg2) - { - return doArithmetic(new String[]{"" + arg1, operation, "" + arg2}); - } - /***********************************************************************/ - public static double doArithmetic(String[] params) - { - if (params == null || params.length == 0) { return 0.00; } - double totalNumber = 0; - double currentNumber = 0; - char operator = '+'; - for (int i = 0; i < params.length; i++) - { - if (i % 2 == 0) - { - currentNumber = NumberUtils.load(params[i], 0.00); - switch (operator) - { - case '+' : - totalNumber = totalNumber + currentNumber; - break; - case '-' : - totalNumber = totalNumber - currentNumber; - break; - case '*' : - totalNumber = totalNumber * currentNumber; - break; - case '/' : - totalNumber = totalNumber / currentNumber; - break; - case '%' : - totalNumber = totalNumber % currentNumber; - break; - default : - throw new Error("Unknown arithmetic operator " + operator); - } - } - else - { - operator = params[i].charAt(0); - } - } - return totalNumber; - } - /************************************************************************/ - /************************************************************************/ - public static TemplateDouble max(Number... numbers) - { - return new TemplateDouble(Query.max(numbers)); - } - public static TemplateDouble max(Number n1, Number n2, Number n3) - { - return max(new Number[]{n1,n2,n3}); - } -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/persistence/SqlLoader.java b/src/main/java/com/spun/util/persistence/SqlLoader.java deleted file mode 100644 index 2cbcd29..0000000 --- a/src/main/java/com/spun/util/persistence/SqlLoader.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.spun.util.persistence; - -import java.sql.ResultSet; -import java.sql.Statement; - -import com.spun.util.database.ResultSetWriter; -import com.spun.util.database.SQLQuery; -import com.spun.util.database.SQLStatementUtils; - -public interface SqlLoader extends Loader -{ - public static class ExecutableWrapper implements ExecutableQuery - { - private SqlLoader loader; - public ExecutableWrapper(SqlLoader loader) - { - this.loader = loader; - } - @Override - public String executeQuery(String query) throws Exception - { - ResultSet sql = SQLStatementUtils.executeQuery(query, loader.getStatement()); - return ResultSetWriter.toString(sql); - } - @Override - public String getQuery() throws Exception - { - return loader.getQuery().toString(); - } - } - public SQLQuery getQuery() throws Exception; - public Statement getStatement() throws Exception; -} diff --git a/src/main/java/com/spun/util/servlets/BasicServlet.java b/src/main/java/com/spun/util/servlets/BasicServlet.java deleted file mode 100644 index c591c34..0000000 --- a/src/main/java/com/spun/util/servlets/BasicServlet.java +++ /dev/null @@ -1,328 +0,0 @@ -package com.spun.util.servlets; - -import java.io.IOException; -import java.io.PrintWriter; -import java.io.StringWriter; -import java.sql.Timestamp; -import java.util.ArrayList; -import java.util.Enumeration; -import java.util.GregorianCalendar; -import java.util.Locale; - -import javax.servlet.ServletConfig; -import javax.servlet.ServletContext; -import javax.servlet.ServletException; -import javax.servlet.ServletOutputStream; -import javax.servlet.http.Cookie; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.apache.commons.httpclient.HttpClient; -import org.apache.commons.httpclient.HttpException; -import org.apache.commons.httpclient.NameValuePair; -import org.apache.commons.httpclient.methods.PostMethod; - -import com.spun.util.DateUtils; -import com.spun.util.MySystem; -import com.spun.util.NumberUtils; -import com.spun.util.ObjectUtils; -import com.spun.util.StringUtils; -import com.spun.util.parser.TemplateError; -import com.spun.util.velocity.ParseCall; -import com.spun.util.velocity.VelocityParser; - -/** - * This is the top level servlet which all others extend. - **/ -public class BasicServlet extends HttpServlet -{ - private TemplateError error = null; - private static ServletContext servletContext; - protected Throwable connectionError = null; - /***********************************************************************/ - @Override - public void init(ServletConfig config) throws ServletException - { - super.init(config); - try - { - MySystem.useOutputFile(getLogFile(), true); - servletContext = getServletContext(); - } - catch (Exception e) - { - // just in case - } - } - public static ServletContext getContext() - { - return servletContext; - } - /***********************************************************************/ - @Override - public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException - { - doGet(req, res); - } - /***********************************************************************/ - public static int load(HttpServletRequest req, String key, int defaultValue) - { - return NumberUtils.load(req.getParameter(key), defaultValue); - } - /***********************************************************************/ - public static int load(String i, int defaultValue) - { - return NumberUtils.load(i, defaultValue); - } - /***********************************************************************/ - public static double load(HttpServletRequest req, String key, double defaultValue) - { - return NumberUtils.load(req.getParameter(key), defaultValue); - } - /***********************************************************************/ - public static double load(String i, double defaultValue) - { - return NumberUtils.load(i, defaultValue); - } - /***********************************************************************/ - public static boolean loadCheckBox(String i, boolean d) - { - return (i == null) ? d : "on".equalsIgnoreCase(i); - } - /***********************************************************************/ - public static boolean loadCheckBox(HttpServletRequest req, String key, boolean d) - { - return loadCheckBox(req.getParameter(key), d); - } - /***********************************************************************/ - public static Cookie loadCookie(HttpServletRequest req, String cookieName) - { - return ObjectUtils.getForMethod(req.getCookies(), cookieName, "getName"); - } - /***********************************************************************/ - public static String loadCookieValue(HttpServletRequest req, String cookieName) - { - Cookie cookie = ObjectUtils.getForMethod(req.getCookies(), cookieName, "getName"); - return cookie == null ? null : cookie.getValue(); - } - /***********************************************************************/ - public static void setCookie(HttpServletResponse response, String name, String value, int maxAge) - { - Cookie cookie = new Cookie(name, value); - cookie.setMaxAge(maxAge); - response.addCookie(cookie); - } - /***********************************************************************/ - public static java.util.Calendar loadDate(HttpServletRequest req, String month, String day, String year) - { - int m = load(req.getParameter(month), 0); - int d = load(req.getParameter(day), 0); - int y = load(req.getParameter(year), 0); - java.util.Calendar date = (y * d * m == 0) ? null : new GregorianCalendar(y, m - 1, d, 0, 1); - return date; - } - /***********************************************************************/ - public static Timestamp loadDate(HttpServletRequest req, String key, java.util.Date defaultValue) - { - try - { - String text = loadNullableString(req, key); - defaultValue = new java.text.SimpleDateFormat("MM/dd/yyyy").parse(text); - } - catch (Exception e) - { - } - return DateUtils.asTimestamp(defaultValue); - } - /***********************************************************************/ - public static boolean load(HttpServletRequest req, String key, boolean d) - { - return load(req.getParameter(key), d); - } - /***********************************************************************/ - public static boolean load(String i, boolean d) - { - return NumberUtils.load(i, d); - } - /***********************************************************************/ - public static String load(HttpServletRequest req, String key, String d) - { - String value = req.getParameter(key); - return StringUtils.isNonZero(value) ? value.trim() : d; - } - /***********************************************************************/ - public static String loadUpperCaseString(String i) - { - return com.spun.util.StringUtils.isNonZero(i) ? i.trim().toUpperCase() : null; - } - /***********************************************************************/ - public static String loadUpperCaseString(HttpServletRequest req, String key) - { - return loadUpperCaseString(req.getParameter(key)); - } - /***********************************************************************/ - public static String loadNullableString(HttpServletRequest req, String key) - { - if (key == null) { return null; } - String value = req.getParameter(key); - return StringUtils.isNonZero(value) ? value.trim() : null; - } - /***********************************************************************/ - public static String loadNullableString(String value) - { - return StringUtils.loadNullableString(value); - } - /***********************************************************************/ - protected String getLogFile() - { - return null; - } - /***********************************************************************/ - protected ParseCall getParser() - { - return VelocityParser.FileParseCall.INSTANCE; - } - /***********************************************************************/ - protected String getErrorTemplate() - { - return null; - } - /***********************************************************************/ - public String processError(Throwable t, HttpServletRequest req) - { - return processError(t, req, new ErrorToString()); - } - public String processError(Throwable t, HttpServletRequest req, SecondaryErrorProcessor secondardErrorProcessor) - { - try - { - error = new TemplateError(t, this); - String servletInfo = extractServletInformation(req); - MySystem.warning(servletInfo, t instanceof ServletParameterException ? null : t, ServletLogWriterFactory - .getWriter(this)); - // postErrorToLogServer(t, servletInfo); - return getParser().parse(getErrorTemplate(), error); - } - catch (Throwable t2) - { - return secondardErrorProcessor.processError(error, t2); - } - } - /***********************************************************************/ - private void postErrorToLogServer(Throwable t, String servletInfo) - { - HttpClient client = new HttpClient(); - PostMethod post = new PostMethod("http://mgwap.com:9090/Log/Insert"); - post.addParameter(new NameValuePair("level", "Severe")); - post.addParameter(new NameValuePair("message", t.getMessage())); - post.addParameter(new NameValuePair("process", servletInfo)); - StringWriter sw = new StringWriter(); - t.printStackTrace(new PrintWriter(sw)); - post.addParameter(new NameValuePair("stacktrace", sw.toString())); - try - { - client.executeMethod(post); - } - catch (HttpException e) - { - throw new Error("Unable to contact logging server: " + e.getMessage(), e); - } - catch (IOException e) - { - throw new Error("Unable to contact logging server: " + e.getMessage(), e); - } - finally - { - post.releaseConnection(); - } - } - /***********************************************************************/ - private String extractServletInformation(HttpServletRequest req) - { - if (req == null) { return null; } - String browser = req.getHeader("user-agent"); - ArrayList parameters = getParameters(req); - String servletName = this.getClass().getName(); - String info = "Servlet called from " + browser + "\n" + "[Servlet,Parameters] : [" - + servletName.substring(servletName.lastIndexOf(".") + 1) + ", " + parameters + "]"; - return info; - } - /***********************************************************************/ - public static ArrayList getHeaders(HttpServletRequest req) - { - Enumeration e = req.getHeaderNames(); - ArrayList parameters = new ArrayList(); - while (e.hasMoreElements()) - { - String s = (String) e.nextElement(); - parameters.add(new Property(s, req.getHeader(s))); - } - return parameters; - } - /***********************************************************************/ - public static void setContentTypeAsZip(HttpServletResponse res, String fileName) - { - res.setContentType("application/zip"); - res.setHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\""); - res.setLocale(Locale.US); - } - /***********************************************************************/ - public static void setContentTypeAsExcel(HttpServletResponse res, String fileName) - { - res.setContentType("application/octet-stream"); - res.setHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\""); - res.setLocale(Locale.US); - } - /***********************************************************************/ - public static void setContentTypeAsImage(HttpServletResponse res) - { - res.setContentType("image/gif"); - res.setLocale(Locale.US); - } - /***********************************************************************/ - public static ArrayList getParameters(HttpServletRequest req) - { - Enumeration e = req.getParameterNames(); - ArrayList parameters = new ArrayList(); - while (e.hasMoreElements()) - { - String s = (String) e.nextElement(); - parameters.add(new Property(s, req.getParameter(s))); - } - return parameters; - } - /***********************************************************************/ - public static Object getSessionData(HttpServletRequest req, String sessionKey) - { - Object o = req.getSession().getAttribute(sessionKey); - if (o == null) { throw new ExpiredSessionError(); } - return o; - } - /***********************************************************************/ - /***********************************************************************/ - public static class Property - { - private String value; - private String name; - /***********************************************************************/ - public Property(String name, String value) - { - this.value = value; - this.name = name; - } - @Override - public String toString() - { - return "[" + name + " = '" + value + "']"; - } - } - public static String setContentTypeAsXml(HttpServletResponse res, String xml) throws IOException - { - res.setContentType("text/xml"); - ServletOutputStream out = res.getOutputStream(); - out.println(xml); - out.close(); - return null; - } -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/servlets/ServletLogWriterFactory.java b/src/main/java/com/spun/util/servlets/ServletLogWriterFactory.java deleted file mode 100644 index a10df8d..0000000 --- a/src/main/java/com/spun/util/servlets/ServletLogWriterFactory.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.spun.util.servlets; - -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.io.PrintWriter; -import java.util.HashMap; - -import com.spun.util.MySystem; - -public class ServletLogWriterFactory -{ - private static String TOMCAT_LOGS_PATH = getLogPath(); - private static HashMap writers = new HashMap(); - public static void reset() - { - TOMCAT_LOGS_PATH = getLogPath(); - writers = new HashMap(); - } - public static PrintWriter getWriter(BasicServlet servlet) throws IOException - { - String name = servlet.getClass().getName(); - if (writers.get(name) == null) - { - return createWriter(name); - } - else - { - return (PrintWriter) writers.get(name); - } - } - private static String getLogPath() - { - String catalina = System.getProperty("catalina.base"); - if (catalina == null) - { - MySystem.variable("properties", System.getProperties()); - } - catalina = catalina == null ? "." + File.separator : catalina; - return catalina + File.separator + "logs"; - } - private static PrintWriter createWriter(String name) throws IOException - { - String shortName = name.indexOf("$") == -1 ? name.substring(name.lastIndexOf(".") + 1) : name.substring(name - .lastIndexOf("$") + 1); - File file = new File(TOMCAT_LOGS_PATH + File.separator + shortName + ".log"); - file.getParentFile().mkdirs(); - BufferedWriter writer = new BufferedWriter(new FileWriter(file)); - PrintWriter bWriter = new PrintWriter(writer, true); - writers.put(name, bWriter); - return bWriter; - } -} diff --git a/src/main/java/com/spun/util/servlets/StageServletUtils.java b/src/main/java/com/spun/util/servlets/StageServletUtils.java deleted file mode 100644 index e6f5dac..0000000 --- a/src/main/java/com/spun/util/servlets/StageServletUtils.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.spun.util.servlets; - -import javax.servlet.ServletOutputStream; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import com.spun.util.MySystem; -import com.spun.util.NumberUtils; - -public class StageServletUtils -{ - public static final String TEXT_HTML = "text/html"; - private static long lastTime = 0; - /***********************************************************************/ - public static void doStageServlet(StageServlet servlet, HttpServletRequest req, HttpServletResponse res) - { - doStageServlet(servlet, 1, req, res); - } - /***********************************************************************/ - public static void doStageServlet(StageServlet servlet, int defaultStage, HttpServletRequest req, - HttpServletResponse res) - { - ServletOutputStream out = null; - try - { - try - { - int stage = NumberUtils.load(req.getParameter("loadStage"), defaultStage); - String html = servlet.doStage(stage, req, res); - if (html != null) - { - res.setContentType(TEXT_HTML); // Required for HTTP - out = res.getOutputStream(); - out.println(html); - } - } - catch (ExpiredSessionError e) - { - out.println(e.getHTMLText()); - } - catch (Throwable t) - { - out.println(servlet.processError(t, req)); - } - finally - { - if (out != null) - { - out.close(); - } - } - } - catch (Throwable t2) - { - MySystem.warning(t2); - } - garbageCollect(); - } - public static void garbageCollect() - { - if (30000 > (System.currentTimeMillis() - lastTime)) - { - System.gc(); - lastTime = System.currentTimeMillis(); - } - } - /***********************************************************************/ - /***********************************************************************/ -} diff --git a/src/main/java/com/spun/util/timers/MetricsDisplayer.java b/src/main/java/com/spun/util/timers/MetricsDisplayer.java deleted file mode 100644 index 97ea64e..0000000 --- a/src/main/java/com/spun/util/timers/MetricsDisplayer.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.spun.util.timers; - -import org.apache.velocity.context.Context; -import com.spun.util.velocity.ContextAware; -import com.spun.util.velocity.VelocityParser; - -/** - * A Utility for timing things. this is multi-thread safe. - **/ -public class MetricsDisplayer implements ContextAware -{ - public static String TEMPLATE = "C:\\metrics_template.htm"; - private LapTimeStatistics stats = null; - /************************************************************************/ - public MetricsDisplayer(LapTimeStatistics stats) - { - this.stats = stats; - } - /************************************************************************/ - public String saveToFile(String outputFileName) - { - return VelocityParser.parseFile(TEMPLATE, outputFileName, this); - } - /***********************************************************************/ - public LapTimeStatistics getStatistics() - { - return stats; - } - /***********************************************************************/ - public void setupContext(Context context) - { - context.put("stats", stats); - } - /***********************************************************************/ - /***********************************************************************/ -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/velocity/VelocityParser.java b/src/main/java/com/spun/util/velocity/VelocityParser.java deleted file mode 100644 index 5d6733e..0000000 --- a/src/main/java/com/spun/util/velocity/VelocityParser.java +++ /dev/null @@ -1,188 +0,0 @@ -package com.spun.util.velocity; - -import java.io.File; -import java.io.StringWriter; -import java.io.Writer; -import java.util.Enumeration; -import java.util.Properties; - -import org.apache.log4j.Level; -import org.apache.log4j.LogManager; -import org.apache.log4j.Logger; -import org.apache.velocity.Template; -import org.apache.velocity.VelocityContext; -import org.apache.velocity.app.VelocityEngine; -import org.apache.velocity.context.Context; -import org.apache.velocity.runtime.RuntimeConstants; -import org.apache.velocity.runtime.log.NullLogSystem; - -import com.spun.util.Asserts; -import com.spun.util.ObjectUtils; -import com.spun.util.io.FileUtils; -import com.spun.util.parser.ParserCommons; - -public class VelocityParser -{ - private static VelocityEngine currentEngine = null; - /***********************************************************************/ - static - { - for (Enumeration e = LogManager.getCurrentLoggers(); e.hasMoreElements();) - { - ((Logger) e.nextElement()).setLevel(Level.OFF); - } - } - /***********************************************************************/ - public static String parseFile(String template, ContextAware process) - { - Asserts.assertFileExists("Velocity template", template); - Properties props = new Properties(); - int pathBreak = template.lastIndexOf(File.separatorChar); - pathBreak = pathBreak == -1 ? template.length() : pathBreak; - String path = template.substring(0, pathBreak); - String file = template.substring(pathBreak + 1); - props.put("resource.loader", "file"); - props.put("runtime.introspector.uberspect", TestableUberspect.class.getName()); - props.put("file.resource.loader.path", path); - props.put("velocimacro.context.localscope", "" + true); - props.put("velocimacro.permissions.allow.inline.local.scope", "" + true); - return parse(file, props, new ContextAware[]{process, Default.INSTANCE}); - } - /***********************************************************************/ - public static String parseJar(String template, ContextAware process) - { - Properties props = new Properties(); - props.put("resource.loader", "class"); - props.put("class.resource.loader.description", "Velocity Classpath Resource Loader"); - props.put("class.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); - props.put("class.resource.cache", "" + true); - props.put("runtime.introspector.uberspect", "com.spun.util.velocity.TestableUberspect"); - props.put("velocimacro.context.localscope", "" + true); - props.put("velocimacro.permissions.allow.inline.local.scope", "" + true); - return parse(template, props, new ContextAware[]{process,Default.INSTANCE}); - } - /***********************************************************************/ - public static String parseString(String template, ContextAware process) - { - Properties props = new Properties(); - props.put("resource.loader", "class"); - props.put("class.resource.loader.class", StringResourceLoader.class.getName()); - props.put("velocimacro.context.localscope", "" + true); - props.put("runtime.introspector.uberspect", TestableUberspect.class.getName()); - props.put("velocimacro.permissions.allow.inline.local.scope", "" + true); - return parse(template, props, new ContextAware[]{process,Default.INSTANCE}); - } - /***********************************************************************/ - public static String parse(String template, Properties props, ContextAware process) - { - - return parse(template, props, new ContextAware[]{process,Default.INSTANCE}); -}/***********************************************************************/ - public static String parse(String template, Properties props, ContextAware[] process) - { - StringWriter out = new StringWriter(); - parse(template, props, process, out); - return out.toString(); - } - /***********************************************************************/ - public static Writer parse(String template, Properties props, ContextAware process[], Writer out) - { - try - { - props.put("directive.foreach.counter.initial.value", "0"); - props.put(RuntimeConstants.RUNTIME_LOG_LOGSYSTEM_CLASS, NullLogSystem.class.getName()); - VelocityEngine engine = initializeEngine(props); - VelocityContext context = new VelocityContext(); - Template velocityTemplate = engine.getTemplate(template); - for (int i = 0; i < process.length; i++) - { - if(process[i] != null) process[i].setupContext(context); - } - velocityTemplate.merge(context, out); - return out; - } - catch (Exception e) - { - throw ObjectUtils.throwAsError(e); - } - } - public static synchronized VelocityEngine initializeEngine(Properties props) throws Exception - { - if (currentEngine == null || isDifferentForProperties(props, currentEngine, new String[]{"resource.loader", "file.resource.loader.path"})) - { - currentEngine = new VelocityEngine(); - currentEngine.init(props); - } - return currentEngine; - } - /***********************************************************************/ - private static boolean isDifferentForProperties(Properties props, VelocityEngine velo, String[] keys) - { - for (int i = 0; i < keys.length; i++) - { - String key = keys[i]; - if (!ObjectUtils.isEqual(props.get(key), velo.getProperty(key))) { return true; } - } - return false; - } - /***********************************************************************/ - /** - * Parse a File to a File - **/ - public static String parseFile(String templateFileName, String outputFileName, ContextAware process) - { - return parseFile(templateFileName, new File(outputFileName), process); - } - /***********************************************************************/ - /** - * Parse a File to a File - **/ - public static String parseFile(String templateFileName, File outputFile, ContextAware process) - { - try - { - String output = parseFile(templateFileName, process); - FileUtils.writeFile(outputFile, output); - return output; - } - catch (Exception e) - { - throw ObjectUtils.throwAsError(e); - } - } - /***********************************************************************/ - public static class FileParseCall implements ParseCall - { - public static FileParseCall INSTANCE = new FileParseCall(); - public String parse(String template, ContextAware process) - { - return parseFile(template, process); - } - } - /***********************************************************************/ - public static class JarParseCall implements ParseCall - { - public static JarParseCall INSTANCE = new JarParseCall(); - public String parse(String template, ContextAware process) - { - return parseJar(template, process); - } - } - /***********************************************************************/ - public static class Default implements ContextAware - { - public static ContextAware INSTANCE = new Default(); - public void setupContext(Context context) - { - context.put("commons", ParserCommons.INSTANCE); - } - } - /***********************************************************************/ - /***********************************************************************/ - public static String parseFromClassPath(Class clazz, String string, ContextAware context) - { - String resource = FileUtils.readFromClassPath(clazz, string); - return parseString(resource, context); - } - -} diff --git a/src/main/java/org/approvaltests/Approvals.java b/src/main/java/org/approvaltests/Approvals.java index 7488e52..f8fc14f 100644 --- a/src/main/java/org/approvaltests/Approvals.java +++ b/src/main/java/org/approvaltests/Approvals.java @@ -4,11 +4,6 @@ import java.awt.Image; import java.awt.image.BufferedImage; import java.io.File; -import java.io.FileFilter; -import java.io.FilenameFilter; -import java.nio.file.Path; -import java.sql.ResultSet; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; @@ -20,14 +15,11 @@ import org.approvaltests.core.ApprovalWriter; import org.approvaltests.namer.ApprovalNamer; import org.approvaltests.namer.JUnitStackTraceNamer; -import org.approvaltests.writers.ApprovalBinaryFileWriter; import org.approvaltests.writers.ApprovalTextWriter; import org.approvaltests.writers.ApprovalXmlWriter; import org.approvaltests.writers.ComponentApprovalWriter; -import org.approvaltests.writers.DirectoryToDirectoryWriter; import org.approvaltests.writers.FileApprovalWriter; import org.approvaltests.writers.ImageApprovalWriter; -import org.approvaltests.writers.ResultSetApprovalWriter; import org.lambda.functions.Function1; import org.lambda.functions.implementations.F1; import org.lambda.query.Query; @@ -35,8 +27,6 @@ import com.spun.util.ArrayUtils; import com.spun.util.ObjectUtils; import com.spun.util.StringUtils; -import com.spun.util.persistence.ExecutableQuery; -import com.spun.util.persistence.SqlLoader; public class Approvals { public static void verify(String response) throws Exception { @@ -146,43 +136,11 @@ public static void verify(FileApprover approver, } } - // public static void verify(ExecutableQuery query) throws Exception - // { - // verify(new ApprovalTextWriter(query.getQuery(), "txt"), - // createApprovalNamer(), new ExecutableQueryFailure( - // query)); - // } public static void verify(Map map) throws Exception { verify(new ApprovalTextWriter(StringUtils.toString(map), "txt"), FileTypes.Text); } - // public static void verify(RackResponse response) throws Exception - // { - // if (isImage(response)) - // { - // String fileType = "png"; - // verify(new ApprovalBinaryFileWriter(response.getResponse(), fileType), - // fileType); - // } - // else - // { - // verifyHtml(response.getResponse().toString()); - // } - // } - public static void verify(ResultSet rs) throws Exception { - verify(new ResultSetApprovalWriter(rs), "csv"); - } - - public static void verify(SqlLoader loader) throws Exception { - verify(new SqlLoader.ExecutableWrapper(loader)); - } - -// private static boolean isImage(RackResponse response) { -// String type = response.getHeaders().get(RackResponseUtils.CONTENT_TYPE); -// return RackResponseUtils.CONTENT_TYPE_IMAGE.equals(type); -// } - public static ApprovalNamer createApprovalNamer() { return new JUnitStackTraceNamer(); } @@ -190,44 +148,6 @@ public static ApprovalNamer createApprovalNamer() { private static void approve(BufferedImage bufferedImage, ApprovalNamer namer) { verify(new ImageApprovalWriter(bufferedImage), FileTypes.Image); } -// -// public static void verifyEachFileInDirectory(File directory) { -// verifyEachFileAgainstMasterDirectory(directory.listFiles()); -// } -// -// public static void verifyEachFileInDirectory(File directory, -// FileFilter filter) { -// verifyEachFileAgainstMasterDirectory(directory.listFiles(filter)); -// } -// -// public static void verifyEachFileInDirectory(File directory, -// FilenameFilter filter) { -// verifyEachFileAgainstMasterDirectory(directory.listFiles(filter)); -// } - -// private static void verifyEachFileAgainstMasterDirectory(File[] files) -// throws Error { -// ApprovalNamer namer = createApprovalNamer(); -// String dirName = namer.getSourceFilePath() + Path.SEPARATOR -// + namer.getApprovalName() + ".Files"; -// File approvedDirectory = new File(dirName); -// List mismatched = new ArrayList(); -// for (File f : files) { -// if (!f.isDirectory()) { -// try { -// verify(new DirectoryToDirectoryWriter(f, approvedDirectory), -// FileTypes.File); -// } catch (Throwable e) { -// mismatched.add(f); -// } -// } -// } -// if (!mismatched.isEmpty()) { -// String message = "The Following Files did not match up: " -// + getFileNameList(mismatched); -// throw new Error(message); -// } -// } private static String getFileNameList(List mismatched) { return Query.select(mismatched, diff --git a/src/main/java/org/approvaltests/writers/ResultSetApprovalWriter.java b/src/main/java/org/approvaltests/writers/ResultSetApprovalWriter.java deleted file mode 100644 index dd40799..0000000 --- a/src/main/java/org/approvaltests/writers/ResultSetApprovalWriter.java +++ /dev/null @@ -1,45 +0,0 @@ -package org.approvaltests.writers; - -import java.io.File; -import java.sql.ResultSet; - -import org.approvaltests.core.ApprovalWriter; - -import com.spun.util.database.ResultSetWriter; -import com.spun.util.io.FileUtils; -import com.spun.util.velocity.ContextAware; -import com.spun.util.velocity.ContextAware.ContextAwareMap; -import com.spun.util.velocity.VelocityParser; - -public class ResultSetApprovalWriter implements ApprovalWriter -{ - private final ResultSet resultSet; - public ResultSetApprovalWriter(ResultSet resultSet) - { - this.resultSet = resultSet; - } - @Override - public String getApprovalFilename(String base) - { - return base + Writer.approved + ".csv"; - } - @Override - public String getReceivedFilename(String base) - { - return base + Writer.received + ".csv"; - } - @Override - public String writeReceivedFile(String received) throws Exception - { - String template = "#foreach ($row in $commons.asArray($metaData))$row.get()#if (!$row.isLast()),#end#end\r\n" - + "\r\n" - + "#foreach ($row in $results)\r\n" - + "#foreach ($column in $commons.asArray($row))$commons.asExcel($column.get())#if (!$column.isLast()),#end#end \r\n" - + "\r\n" + "#end "; - ContextAwareMap map = new ContextAware.ContextAwareMap("metaData", ResultSetWriter.extractMetaData(resultSet)); - map.put("results", ResultSetWriter.extractResults(resultSet)); - String output = VelocityParser.parseString(template, map); - FileUtils.writeFile(new File(received), output); - return received; - } -} diff --git a/src/main/java/org/teachingextensions/logo/Colors.java b/src/main/java/org/teachingextensions/logo/Colors.java index 189de3c..28bdc39 100644 --- a/src/main/java/org/teachingextensions/logo/Colors.java +++ b/src/main/java/org/teachingextensions/logo/Colors.java @@ -21,7 +21,7 @@ public static class Blues { /** * The color Navy - * + *
* * * @@ -30,7 +30,7 @@ public static class Blues public static final Color Navy = Color.decode("#000080"); /** * The color DarkBlue - *
 
+ *
* * * @@ -39,7 +39,7 @@ public static class Blues public static final Color DarkBlue = Color.decode("#00008B"); /** * The color MidnightBlue - *
 
+ *
* * * @@ -48,7 +48,7 @@ public static class Blues public static final Color MidnightBlue = Color.decode("#191970"); /** * The color MediumBlue - *
 
+ *
* * * @@ -57,7 +57,7 @@ public static class Blues public static final Color MediumBlue = Color.decode("#0000CD"); /** * The color Blue - *
 
+ *
* * * @@ -66,7 +66,7 @@ public static class Blues public static final Color Blue = Color.decode("#0000FF"); /** * The color Teal - *
 
+ *
* * * @@ -75,7 +75,7 @@ public static class Blues public static final Color Teal = Color.decode("#008080"); /** * The color DarkSlateBlue - *
 
+ *
* * * @@ -84,7 +84,7 @@ public static class Blues public static final Color DarkSlateBlue = Color.decode("#483D8B"); /** * The color DarkCyan - *
 
+ *
* * * @@ -93,7 +93,7 @@ public static class Blues public static final Color DarkCyan = Color.decode("#008B8B"); /** * The color SteelBlue - *
 
+ *
* * * @@ -102,7 +102,7 @@ public static class Blues public static final Color SteelBlue = Color.decode("#4682B4"); /** * The color RoyalBlue - *
 
+ *
* * * @@ -111,7 +111,7 @@ public static class Blues public static final Color RoyalBlue = Color.decode("#4169E1"); /** * The color SlateBlue - *
 
+ *
* * * @@ -120,7 +120,7 @@ public static class Blues public static final Color SlateBlue = Color.decode("#6A5ACD"); /** * The color CadetBlue - *
 
+ *
* * * @@ -129,7 +129,7 @@ public static class Blues public static final Color CadetBlue = Color.decode("#5F9EA0"); /** * The color DarkTurquoise - *
 
+ *
* * * @@ -138,7 +138,7 @@ public static class Blues public static final Color DarkTurquoise = Color.decode("#00CED1"); /** * The color DodgerBlue - *
 
+ *
* * * @@ -147,7 +147,7 @@ public static class Blues public static final Color DodgerBlue = Color.decode("#1E90FF"); /** * The color DeepSkyBlue - *
 
+ *
* * * @@ -156,7 +156,7 @@ public static class Blues public static final Color DeepSkyBlue = Color.decode("#00BFFF"); /** * The color MediumSlateBlue - *
 
+ *
* * * @@ -165,7 +165,7 @@ public static class Blues public static final Color MediumSlateBlue = Color.decode("#7B68EE"); /** * The color MediumTurquoise - *
 
+ *
* * * @@ -174,7 +174,7 @@ public static class Blues public static final Color MediumTurquoise = Color.decode("#48D1CC"); /** * The color CornflowerBlue - *
 
+ *
* * * @@ -183,7 +183,7 @@ public static class Blues public static final Color CornflowerBlue = Color.decode("#6495ED"); /** * The color Turquoise - *
 
+ *
* * * @@ -192,7 +192,7 @@ public static class Blues public static final Color Turquoise = Color.decode("#40E0D0"); /** * The color Aqua - *
 
+ *
* * * @@ -201,7 +201,7 @@ public static class Blues public static final Color Aqua = Color.decode("#00FFFF"); /** * The color Cyan - *
 
+ *
* * * @@ -210,7 +210,7 @@ public static class Blues public static final Color Cyan = Color.decode("#00FFFF"); /** * The color SkyBlue - *
 
+ *
* * * @@ -219,7 +219,7 @@ public static class Blues public static final Color SkyBlue = Color.decode("#87CEEB"); /** * The color LightSkyBlue - *
 
+ *
* * * @@ -228,7 +228,7 @@ public static class Blues public static final Color LightSkyBlue = Color.decode("#87CEFA"); /** * The color Aquamarine - *
 
+ *
* * * @@ -237,7 +237,7 @@ public static class Blues public static final Color Aquamarine = Color.decode("#7FFFD4"); /** * The color LightSteelBlue - *
 
+ *
* * * @@ -246,7 +246,7 @@ public static class Blues public static final Color LightSteelBlue = Color.decode("#B0C4DE"); /** * The color LightBlue - *
 
+ *
* * * @@ -255,7 +255,7 @@ public static class Blues public static final Color LightBlue = Color.decode("#ADD8E6"); /** * The color PowderBlue - *
 
+ *
* * * @@ -264,7 +264,7 @@ public static class Blues public static final Color PowderBlue = Color.decode("#B0E0E6"); /** * The color PaleTurquoise - *
 
+ *
* * * @@ -273,7 +273,7 @@ public static class Blues public static final Color PaleTurquoise = Color.decode("#AFEEEE"); /** * The color LightCyan - *
 
+ *
* * * @@ -282,7 +282,7 @@ public static class Blues public static final Color LightCyan = Color.decode("#E0FFFF"); /** * The color AliceBlue - *
 
+ *
* * * @@ -291,7 +291,7 @@ public static class Blues public static final Color AliceBlue = Color.decode("#F0F8FF"); /** * The color Azure - *
 
+ *
* * * @@ -303,7 +303,7 @@ public static class Browns { /** * The color Maroon - *
 
+ *
* * * @@ -312,7 +312,7 @@ public static class Browns public static final Color Maroon = Color.decode("#800000"); /** * The color SaddleBrown - *
 
+ *
* * * @@ -321,7 +321,7 @@ public static class Browns public static final Color SaddleBrown = Color.decode("#8B4513"); /** * The color Brown - *
 
+ *
* * * @@ -330,7 +330,7 @@ public static class Browns public static final Color Brown = Color.decode("#A52A2A"); /** * The color Sienna - *
 
+ *
* * * @@ -339,7 +339,7 @@ public static class Browns public static final Color Sienna = Color.decode("#A0522D"); /** * The color DarkGoldenrod - *
 
+ *
* * * @@ -348,7 +348,7 @@ public static class Browns public static final Color DarkGoldenrod = Color.decode("#B8860B"); /** * The color Chocolate - *
 
+ *
* * * @@ -357,7 +357,7 @@ public static class Browns public static final Color Chocolate = Color.decode("#D2691E"); /** * The color Peru - *
 
+ *
* * * @@ -366,7 +366,7 @@ public static class Browns public static final Color Peru = Color.decode("#CD853F"); /** * The color Goldenrod - *
 
+ *
* * * @@ -375,7 +375,7 @@ public static class Browns public static final Color Goldenrod = Color.decode("#DAA520"); /** * The color RosyBrown - *
 
+ *
* * * @@ -384,7 +384,7 @@ public static class Browns public static final Color RosyBrown = Color.decode("#BC8F8F"); /** * The color SandyBrown - *
 
+ *
* * * @@ -393,7 +393,7 @@ public static class Browns public static final Color SandyBrown = Color.decode("#F4A460"); /** * The color Tan - *
 
+ *
* * * @@ -402,7 +402,7 @@ public static class Browns public static final Color Tan = Color.decode("#D2B48C"); /** * The color BurlyWood - *
 
+ *
* * * @@ -411,7 +411,7 @@ public static class Browns public static final Color BurlyWood = Color.decode("#DEB887"); /** * The color Wheat - *
 
+ *
* * * @@ -420,7 +420,7 @@ public static class Browns public static final Color Wheat = Color.decode("#F5DEB3"); /** * The color NavajoWhite - *
 
+ *
* * * @@ -429,7 +429,7 @@ public static class Browns public static final Color NavajoWhite = Color.decode("#FFDEAD"); /** * The color Bisque - *
 
+ *
* * * @@ -438,7 +438,7 @@ public static class Browns public static final Color Bisque = Color.decode("#FFE4C4"); /** * The color BlanchedAlmond - *
 
+ *
* * * @@ -447,7 +447,7 @@ public static class Browns public static final Color BlanchedAlmond = Color.decode("#FFEBCD"); /** * The color Cornsilk - *
 
+ *
* * * @@ -459,7 +459,7 @@ public static class Grays { /** * The color Black - *
 
+ *
* * * @@ -468,7 +468,7 @@ public static class Grays public static final Color Black = Color.decode("#000000"); /** * The color DarkSlateGray - *
 
+ *
* * * @@ -477,7 +477,7 @@ public static class Grays public static final Color DarkSlateGray = Color.decode("#2F4F4F"); /** * The color DimGray - *
 
+ *
* * * @@ -486,7 +486,7 @@ public static class Grays public static final Color DimGray = Color.decode("#696969"); /** * The color Gray - *
 
+ *
* * * @@ -495,7 +495,7 @@ public static class Grays public static final Color Gray = Color.decode("#808080"); /** * The color SlateGray - *
 
+ *
* * * @@ -504,7 +504,7 @@ public static class Grays public static final Color SlateGray = Color.decode("#708090"); /** * The color LightSlateGray - *
 
+ *
* * * @@ -513,7 +513,7 @@ public static class Grays public static final Color LightSlateGray = Color.decode("#778899"); /** * The color DarkGray - *
 
+ *
* * * @@ -522,7 +522,7 @@ public static class Grays public static final Color DarkGray = Color.decode("#A9A9A9"); /** * The color Silver - *
 
+ *
* * * @@ -531,7 +531,7 @@ public static class Grays public static final Color Silver = Color.decode("#C0C0C0"); /** * The color LightGray - *
 
+ *
* * * @@ -540,7 +540,7 @@ public static class Grays public static final Color LightGray = Color.decode("#D3D3D3"); /** * The color Gainsboro - *
 
+ *
* * * @@ -552,7 +552,7 @@ public static class Greens { /** * The color DarkGreen - *
 
+ *
* * * @@ -561,7 +561,7 @@ public static class Greens public static final Color DarkGreen = Color.decode("#006400"); /** * The color Green - *
 
+ *
* * * @@ -570,7 +570,7 @@ public static class Greens public static final Color Green = Color.decode("#008000"); /** * The color ForestGreen - *
 
+ *
* * * @@ -579,7 +579,7 @@ public static class Greens public static final Color ForestGreen = Color.decode("#228B22"); /** * The color DarkOliveGreen - *
 
+ *
* * * @@ -588,7 +588,7 @@ public static class Greens public static final Color DarkOliveGreen = Color.decode("#556B2F"); /** * The color Lime - *
 
+ *
* * * @@ -597,7 +597,7 @@ public static class Greens public static final Color Lime = Color.decode("#00FF00"); /** * The color Olive - *
 
+ *
* * * @@ -606,7 +606,7 @@ public static class Greens public static final Color Olive = Color.decode("#808000"); /** * The color Teal - *
 
+ *
* * * @@ -615,7 +615,7 @@ public static class Greens public static final Color Teal = Color.decode("#008080"); /** * The color SeaGreen - *
 
+ *
* * * @@ -624,7 +624,7 @@ public static class Greens public static final Color SeaGreen = Color.decode("#2E8B57"); /** * The color DarkCyan - *
 
+ *
* * * @@ -633,7 +633,7 @@ public static class Greens public static final Color DarkCyan = Color.decode("#008B8B"); /** * The color OliveDrab - *
 
+ *
* * * @@ -642,7 +642,7 @@ public static class Greens public static final Color OliveDrab = Color.decode("#6B8E23"); /** * The color LimeGreen - *
 
+ *
* * * @@ -651,7 +651,7 @@ public static class Greens public static final Color LimeGreen = Color.decode("#32CD32"); /** * The color MediumSeaGreen - *
 
+ *
* * * @@ -660,7 +660,7 @@ public static class Greens public static final Color MediumSeaGreen = Color.decode("#3CB371"); /** * The color LawnGreen - *
 
+ *
* * * @@ -669,7 +669,7 @@ public static class Greens public static final Color LawnGreen = Color.decode("#7CFC00"); /** * The color LightSeaGreen - *
 
+ *
* * * @@ -678,7 +678,7 @@ public static class Greens public static final Color LightSeaGreen = Color.decode("#20B2AA"); /** * The color Chartreuse - *
 
+ *
* * * @@ -687,7 +687,7 @@ public static class Greens public static final Color Chartreuse = Color.decode("#7FFF00"); /** * The color SpringGreen - *
 
+ *
* * * @@ -696,7 +696,7 @@ public static class Greens public static final Color SpringGreen = Color.decode("#00FF7F"); /** * The color MediumSpringGreen - *
 
+ *
* * * @@ -705,7 +705,7 @@ public static class Greens public static final Color MediumSpringGreen = Color.decode("#00FA9A"); /** * The color YellowGreen - *
 
+ *
* * * @@ -714,7 +714,7 @@ public static class Greens public static final Color YellowGreen = Color.decode("#9ACD32"); /** * The color DarkTurquoise - *
 
+ *
* * * @@ -723,7 +723,7 @@ public static class Greens public static final Color DarkTurquoise = Color.decode("#00CED1"); /** * The color DarkSeaGreen - *
 
+ *
* * * @@ -732,7 +732,7 @@ public static class Greens public static final Color DarkSeaGreen = Color.decode("#8FBC8F"); /** * The color GreenYellow - *
 
+ *
* * * @@ -741,7 +741,7 @@ public static class Greens public static final Color GreenYellow = Color.decode("#ADFF2F"); /** * The color MediumAquamarine - *
 
+ *
* * * @@ -750,7 +750,7 @@ public static class Greens public static final Color MediumAquamarine = Color.decode("#66CDAA"); /** * The color MediumTurquoise - *
 
+ *
* * * @@ -759,7 +759,7 @@ public static class Greens public static final Color MediumTurquoise = Color.decode("#48D1CC"); /** * The color Turquoise - *
 
+ *
* * * @@ -768,7 +768,7 @@ public static class Greens public static final Color Turquoise = Color.decode("#40E0D0"); /** * The color LightGreen - *
 
+ *
* * * @@ -777,7 +777,7 @@ public static class Greens public static final Color LightGreen = Color.decode("#90EE90"); /** * The color PaleGreen - *
 
+ *
* * * @@ -786,7 +786,7 @@ public static class Greens public static final Color PaleGreen = Color.decode("#98FB98"); /** * The color Aquamarine - *
 
+ *
* * * @@ -795,7 +795,7 @@ public static class Greens public static final Color Aquamarine = Color.decode("#7FFFD4"); /** * The color PaleTurquoise - *
 
+ *
* * * @@ -807,7 +807,7 @@ public static class Oranges { /** * The color OrangeRed - *
 
+ *
* * * @@ -816,7 +816,7 @@ public static class Oranges public static final Color OrangeRed = Color.decode("#FF4500"); /** * The color DarkOrange - *
 
+ *
* * * @@ -825,7 +825,7 @@ public static class Oranges public static final Color DarkOrange = Color.decode("#FF8C00"); /** * The color Orange - *
 
+ *
* * * @@ -834,7 +834,7 @@ public static class Oranges public static final Color Orange = Color.decode("#FFA500"); /** * The color Tomato - *
 
+ *
* * * @@ -843,7 +843,7 @@ public static class Oranges public static final Color Tomato = Color.decode("#FF6347"); /** * The color Coral - *
 
+ *
* * * @@ -852,7 +852,7 @@ public static class Oranges public static final Color Coral = Color.decode("#FF7F50"); /** * The color LightSalmon - *
 
+ *
* * * @@ -864,7 +864,7 @@ public static class Pinks { /** * The color MediumVioletRed - *
 
+ *
* * * @@ -873,7 +873,7 @@ public static class Pinks public static final Color MediumVioletRed = Color.decode("#C71585"); /** * The color DeepPink - *
 
+ *
* * * @@ -882,7 +882,7 @@ public static class Pinks public static final Color DeepPink = Color.decode("#FF1493"); /** * The color PaleVioletRed - *
 
+ *
* * * @@ -891,7 +891,7 @@ public static class Pinks public static final Color PaleVioletRed = Color.decode("#DB7093"); /** * The color Fuchsia - *
 
+ *
* * * @@ -900,7 +900,7 @@ public static class Pinks public static final Color Fuchsia = Color.decode("#FF00FF"); /** * The color HotPink - *
 
+ *
* * * @@ -909,7 +909,7 @@ public static class Pinks public static final Color HotPink = Color.decode("#FF69B4"); /** * The color LightPink - *
 
+ *
* * * @@ -918,7 +918,7 @@ public static class Pinks public static final Color LightPink = Color.decode("#FFB6C1"); /** * The color Pink - *
 
+ *
* * * @@ -930,7 +930,7 @@ public static class Purples { /** * The color Indigo - *
 
+ *
* * * @@ -939,7 +939,7 @@ public static class Purples public static final Color Indigo = Color.decode("#4B0082"); /** * The color Purple - *
 
+ *
* * * @@ -948,7 +948,7 @@ public static class Purples public static final Color Purple = Color.decode("#800080"); /** * The color DarkSlateBlue - *
 
+ *
* * * @@ -957,7 +957,7 @@ public static class Purples public static final Color DarkSlateBlue = Color.decode("#483D8B"); /** * The color DarkMagenta - *
 
+ *
* * * @@ -966,7 +966,7 @@ public static class Purples public static final Color DarkMagenta = Color.decode("#8B008B"); /** * The color MediumVioletRed - *
 
+ *
* * * @@ -975,7 +975,7 @@ public static class Purples public static final Color MediumVioletRed = Color.decode("#C71585"); /** * The color DarkViolet - *
 
+ *
* * * @@ -984,7 +984,7 @@ public static class Purples public static final Color DarkViolet = Color.decode("#9400D3"); /** * The color SlateBlue - *
 
+ *
* * * @@ -993,7 +993,7 @@ public static class Purples public static final Color SlateBlue = Color.decode("#6A5ACD"); /** * The color BlueViolet - *
 
+ *
* * * @@ -1002,7 +1002,7 @@ public static class Purples public static final Color BlueViolet = Color.decode("#8A2BE2"); /** * The color DarkOrchid - *
 
+ *
* * * @@ -1011,7 +1011,7 @@ public static class Purples public static final Color DarkOrchid = Color.decode("#9932CC"); /** * The color MediumSlateBlue - *
 
+ *
* * * @@ -1020,7 +1020,7 @@ public static class Purples public static final Color MediumSlateBlue = Color.decode("#7B68EE"); /** * The color RosyBrown - *
 
+ *
* * * @@ -1029,7 +1029,7 @@ public static class Purples public static final Color RosyBrown = Color.decode("#BC8F8F"); /** * The color MediumPurple - *
 
+ *
* * * @@ -1038,7 +1038,7 @@ public static class Purples public static final Color MediumPurple = Color.decode("#9370DB"); /** * The color PaleVioletRed - *
 
+ *
* * * @@ -1047,7 +1047,7 @@ public static class Purples public static final Color PaleVioletRed = Color.decode("#DB7093"); /** * The color MediumOrchid - *
 
+ *
* * * @@ -1056,7 +1056,7 @@ public static class Purples public static final Color MediumOrchid = Color.decode("#BA55D3"); /** * The color Fuchsia - *
 
+ *
* * * @@ -1065,7 +1065,7 @@ public static class Purples public static final Color Fuchsia = Color.decode("#FF00FF"); /** * The color Magenta - *
 
+ *
* * * @@ -1074,7 +1074,7 @@ public static class Purples public static final Color Magenta = Color.decode("#FF00FF"); /** * The color Orchid - *
 
+ *
* * * @@ -1083,7 +1083,7 @@ public static class Purples public static final Color Orchid = Color.decode("#DA70D6"); /** * The color Plum - *
 
+ *
* * * @@ -1092,7 +1092,7 @@ public static class Purples public static final Color Plum = Color.decode("#DDA0DD"); /** * The color Violet - *
 
+ *
* * * @@ -1101,7 +1101,7 @@ public static class Purples public static final Color Violet = Color.decode("#EE82EE"); /** * The color Thistle - *
 
+ *
* * * @@ -1110,7 +1110,7 @@ public static class Purples public static final Color Thistle = Color.decode("#D8BFD8"); /** * The color Lavender - *
 
+ *
* * * @@ -1122,7 +1122,7 @@ public static class Reds { /** * The color DarkRed - *
 
+ *
* * * @@ -1131,7 +1131,7 @@ public static class Reds public static final Color DarkRed = Color.decode("#8B0000"); /** * The color FireBrick - *
 
+ *
* * * @@ -1140,7 +1140,7 @@ public static class Reds public static final Color FireBrick = Color.decode("#B22222"); /** * The color Red - *
 
+ *
* * * @@ -1149,7 +1149,7 @@ public static class Reds public static final Color Red = Color.decode("#FF0000"); /** * The color Crimson - *
 
+ *
* * * @@ -1158,7 +1158,7 @@ public static class Reds public static final Color Crimson = Color.decode("#DC143C"); /** * The color OrangeRed - *
 
+ *
* * * @@ -1167,7 +1167,7 @@ public static class Reds public static final Color OrangeRed = Color.decode("#FF4500"); /** * The color MediumVioletRed - *
 
+ *
* * * @@ -1176,7 +1176,7 @@ public static class Reds public static final Color MediumVioletRed = Color.decode("#C71585"); /** * The color IndianRed - *
 
+ *
* * * @@ -1185,7 +1185,7 @@ public static class Reds public static final Color IndianRed = Color.decode("#CD5C5C"); /** * The color Tomato - *
 
+ *
* * * @@ -1194,7 +1194,7 @@ public static class Reds public static final Color Tomato = Color.decode("#FF6347"); /** * The color PaleVioletRed - *
 
+ *
* * * @@ -1203,7 +1203,7 @@ public static class Reds public static final Color PaleVioletRed = Color.decode("#DB7093"); /** * The color Salmon - *
 
+ *
* * * @@ -1212,7 +1212,7 @@ public static class Reds public static final Color Salmon = Color.decode("#FA8072"); /** * The color LightCoral - *
 
+ *
* * * @@ -1221,7 +1221,7 @@ public static class Reds public static final Color LightCoral = Color.decode("#F08080"); /** * The color DarkSalmon - *
 
+ *
* * * @@ -1230,7 +1230,7 @@ public static class Reds public static final Color DarkSalmon = Color.decode("#E9967A"); /** * The color LightSalmon - *
 
+ *
* * * @@ -1242,7 +1242,7 @@ public static class Whites { /** * The color AntiqueWhite - *
 
+ *
* * * @@ -1251,7 +1251,7 @@ public static class Whites public static final Color AntiqueWhite = Color.decode("#FAEBD7"); /** * The color MistyRose - *
 
+ *
* * * @@ -1260,7 +1260,7 @@ public static class Whites public static final Color MistyRose = Color.decode("#FFE4E1"); /** * The color Beige - *
 
+ *
* * * @@ -1269,7 +1269,7 @@ public static class Whites public static final Color Beige = Color.decode("#F5F5DC"); /** * The color Linen - *
 
+ *
* * * @@ -1278,7 +1278,7 @@ public static class Whites public static final Color Linen = Color.decode("#FAF0E6"); /** * The color OldLace - *
 
+ *
* * * @@ -1287,7 +1287,7 @@ public static class Whites public static final Color OldLace = Color.decode("#FDF5E6"); /** * The color Honeydew - *
 
+ *
* * * @@ -1296,7 +1296,7 @@ public static class Whites public static final Color Honeydew = Color.decode("#F0FFF0"); /** * The color WhiteSmoke - *
 
+ *
* * * @@ -1305,7 +1305,7 @@ public static class Whites public static final Color WhiteSmoke = Color.decode("#F5F5F5"); /** * The color Seashell - *
 
+ *
* * * @@ -1314,7 +1314,7 @@ public static class Whites public static final Color Seashell = Color.decode("#FFF5EE"); /** * The color LavenderBlush - *
 
+ *
* * * @@ -1323,7 +1323,7 @@ public static class Whites public static final Color LavenderBlush = Color.decode("#FFF0F5"); /** * The color AliceBlue - *
 
+ *
* * * @@ -1332,7 +1332,7 @@ public static class Whites public static final Color AliceBlue = Color.decode("#F0F8FF"); /** * The color FloralWhite - *
 
+ *
* * * @@ -1341,7 +1341,7 @@ public static class Whites public static final Color FloralWhite = Color.decode("#FFFAF0"); /** * The color MintCream - *
 
+ *
* * * @@ -1350,7 +1350,7 @@ public static class Whites public static final Color MintCream = Color.decode("#F5FFFA"); /** * The color Azure - *
 
+ *
* * * @@ -1359,7 +1359,7 @@ public static class Whites public static final Color Azure = Color.decode("#F0FFFF"); /** * The color Ivory - *
 
+ *
* * * @@ -1368,7 +1368,7 @@ public static class Whites public static final Color Ivory = Color.decode("#FFFFF0"); /** * The color GhostWhite - *
 
+ *
* * * @@ -1377,7 +1377,7 @@ public static class Whites public static final Color GhostWhite = Color.decode("#F8F8FF"); /** * The color Snow - *
 
+ *
* * * @@ -1386,7 +1386,7 @@ public static class Whites public static final Color Snow = Color.decode("#FFFAFA"); /** * The color White - *
 
+ *
* * * @@ -1398,7 +1398,7 @@ public static class Yellows { /** * The color DarkGoldenrod - *
 
+ *
* * * @@ -1407,7 +1407,7 @@ public static class Yellows public static final Color DarkGoldenrod = Color.decode("#B8860B"); /** * The color Goldenrod - *
 
+ *
* * * @@ -1416,7 +1416,7 @@ public static class Yellows public static final Color Goldenrod = Color.decode("#DAA520"); /** * The color Gold - *
 
+ *
* * * @@ -1425,7 +1425,7 @@ public static class Yellows public static final Color Gold = Color.decode("#FFD700"); /** * The color DarkKhaki - *
 
+ *
* * * @@ -1434,7 +1434,7 @@ public static class Yellows public static final Color DarkKhaki = Color.decode("#BDB76B"); /** * The color Yellow - *
 
+ *
* * * @@ -1443,7 +1443,7 @@ public static class Yellows public static final Color Yellow = Color.decode("#FFFF00"); /** * The color Khaki - *
 
+ *
* * * @@ -1452,7 +1452,7 @@ public static class Yellows public static final Color Khaki = Color.decode("#F0E68C"); /** * The color PaleGoldenrod - *
 
+ *
* * * @@ -1461,7 +1461,7 @@ public static class Yellows public static final Color PaleGoldenrod = Color.decode("#EEE8AA"); /** * The color PeachPuff - *
 
+ *
* * * @@ -1470,7 +1470,7 @@ public static class Yellows public static final Color PeachPuff = Color.decode("#FFDAB9"); /** * The color Moccasin - *
 
+ *
* * * @@ -1479,7 +1479,7 @@ public static class Yellows public static final Color Moccasin = Color.decode("#FFE4B5"); /** * The color PapayaWhip - *
 
+ *
* * * @@ -1488,7 +1488,7 @@ public static class Yellows public static final Color PapayaWhip = Color.decode("#FFEFD5"); /** * The color LemonChiffon - *
 
+ *
* * * @@ -1497,7 +1497,7 @@ public static class Yellows public static final Color LemonChiffon = Color.decode("#FFFACD"); /** * The color LightGoldenrodYellow - *
 
+ *
* * * @@ -1506,7 +1506,7 @@ public static class Yellows public static final Color LightGoldenrodYellow = Color.decode("#FAFAD2"); /** * The color LightYellow - *
 
+ *
* * * diff --git a/src/main/java/org/teachingextensions/logo/PenColors.java b/src/main/java/org/teachingextensions/logo/PenColors.java index 517a5d7..c7a5c77 100644 --- a/src/main/java/org/teachingextensions/logo/PenColors.java +++ b/src/main/java/org/teachingextensions/logo/PenColors.java @@ -16,7 +16,7 @@ public static class Blues { /** * The color Navy - *
 
+ *
* * * @@ -25,7 +25,7 @@ public static class Blues public static final Color Navy = Color.decode("#000080"); /** * The color DarkBlue - *
 
+ *
* * * @@ -34,7 +34,7 @@ public static class Blues public static final Color DarkBlue = Color.decode("#00008B"); /** * The color MidnightBlue - *
 
+ *
* * * @@ -43,7 +43,7 @@ public static class Blues public static final Color MidnightBlue = Color.decode("#191970"); /** * The color MediumBlue - *
 
+ *
* * * @@ -52,7 +52,7 @@ public static class Blues public static final Color MediumBlue = Color.decode("#0000CD"); /** * The color Blue - *
 
+ *
* * * @@ -61,7 +61,7 @@ public static class Blues public static final Color Blue = Color.decode("#0000FF"); /** * The color Teal - *
 
+ *
* * * @@ -70,7 +70,7 @@ public static class Blues public static final Color Teal = Color.decode("#008080"); /** * The color DarkSlateBlue - *
 
+ *
* * * @@ -79,7 +79,7 @@ public static class Blues public static final Color DarkSlateBlue = Color.decode("#483D8B"); /** * The color DarkCyan - *
 
+ *
* * * @@ -88,7 +88,7 @@ public static class Blues public static final Color DarkCyan = Color.decode("#008B8B"); /** * The color SteelBlue - *
 
+ *
* * * @@ -97,7 +97,7 @@ public static class Blues public static final Color SteelBlue = Color.decode("#4682B4"); /** * The color RoyalBlue - *
 
+ *
* * * @@ -106,7 +106,7 @@ public static class Blues public static final Color RoyalBlue = Color.decode("#4169E1"); /** * The color SlateBlue - *
 
+ *
* * * @@ -115,7 +115,7 @@ public static class Blues public static final Color SlateBlue = Color.decode("#6A5ACD"); /** * The color CadetBlue - *
 
+ *
* * * @@ -124,7 +124,7 @@ public static class Blues public static final Color CadetBlue = Color.decode("#5F9EA0"); /** * The color DarkTurquoise - *
 
+ *
* * * @@ -133,7 +133,7 @@ public static class Blues public static final Color DarkTurquoise = Color.decode("#00CED1"); /** * The color DodgerBlue - *
 
+ *
* * * @@ -142,7 +142,7 @@ public static class Blues public static final Color DodgerBlue = Color.decode("#1E90FF"); /** * The color DeepSkyBlue - *
 
+ *
* * * @@ -151,7 +151,7 @@ public static class Blues public static final Color DeepSkyBlue = Color.decode("#00BFFF"); /** * The color MediumSlateBlue - *
 
+ *
* * * @@ -160,7 +160,7 @@ public static class Blues public static final Color MediumSlateBlue = Color.decode("#7B68EE"); /** * The color MediumTurquoise - *
 
+ *
* * * @@ -169,7 +169,7 @@ public static class Blues public static final Color MediumTurquoise = Color.decode("#48D1CC"); /** * The color CornflowerBlue - *
 
+ *
* * * @@ -178,7 +178,7 @@ public static class Blues public static final Color CornflowerBlue = Color.decode("#6495ED"); /** * The color Turquoise - *
 
+ *
* * * @@ -187,7 +187,7 @@ public static class Blues public static final Color Turquoise = Color.decode("#40E0D0"); /** * The color Aqua - *
 
+ *
* * * @@ -196,7 +196,7 @@ public static class Blues public static final Color Aqua = Color.decode("#00FFFF"); /** * The color Cyan - *
 
+ *
* * * @@ -205,7 +205,7 @@ public static class Blues public static final Color Cyan = Color.decode("#00FFFF"); /** * The color SkyBlue - *
 
+ *
* * * @@ -214,7 +214,7 @@ public static class Blues public static final Color SkyBlue = Color.decode("#87CEEB"); /** * The color LightSkyBlue - *
 
+ *
* * * @@ -223,7 +223,7 @@ public static class Blues public static final Color LightSkyBlue = Color.decode("#87CEFA"); /** * The color Aquamarine - *
 
+ *
* * * @@ -232,7 +232,7 @@ public static class Blues public static final Color Aquamarine = Color.decode("#7FFFD4"); /** * The color LightSteelBlue - *
 
+ *
* * * @@ -241,7 +241,7 @@ public static class Blues public static final Color LightSteelBlue = Color.decode("#B0C4DE"); /** * The color LightBlue - *
 
+ *
* * * @@ -250,7 +250,7 @@ public static class Blues public static final Color LightBlue = Color.decode("#ADD8E6"); /** * The color PowderBlue - *
 
+ *
* * * @@ -259,7 +259,7 @@ public static class Blues public static final Color PowderBlue = Color.decode("#B0E0E6"); /** * The color PaleTurquoise - *
 
+ *
* * * @@ -268,7 +268,7 @@ public static class Blues public static final Color PaleTurquoise = Color.decode("#AFEEEE"); /** * The color LightCyan - *
 
+ *
* * * @@ -277,7 +277,7 @@ public static class Blues public static final Color LightCyan = Color.decode("#E0FFFF"); /** * The color AliceBlue - *
 
+ *
* * * @@ -286,7 +286,7 @@ public static class Blues public static final Color AliceBlue = Color.decode("#F0F8FF"); /** * The color Azure - *
 
+ *
* * * @@ -298,7 +298,7 @@ public static class Browns { /** * The color Maroon - *
 
+ *
* * * @@ -307,7 +307,7 @@ public static class Browns public static final Color Maroon = Color.decode("#800000"); /** * The color SaddleBrown - *
 
+ *
* * * @@ -316,7 +316,7 @@ public static class Browns public static final Color SaddleBrown = Color.decode("#8B4513"); /** * The color Brown - *
 
+ *
* * * @@ -325,7 +325,7 @@ public static class Browns public static final Color Brown = Color.decode("#A52A2A"); /** * The color Sienna - *
 
+ *
* * * @@ -334,7 +334,7 @@ public static class Browns public static final Color Sienna = Color.decode("#A0522D"); /** * The color DarkGoldenrod - *
 
+ *
* * * @@ -343,7 +343,7 @@ public static class Browns public static final Color DarkGoldenrod = Color.decode("#B8860B"); /** * The color Chocolate - *
 
+ *
* * * @@ -352,7 +352,7 @@ public static class Browns public static final Color Chocolate = Color.decode("#D2691E"); /** * The color Peru - *
 
+ *
* * * @@ -361,7 +361,7 @@ public static class Browns public static final Color Peru = Color.decode("#CD853F"); /** * The color Goldenrod - *
 
+ *
* * * @@ -370,7 +370,7 @@ public static class Browns public static final Color Goldenrod = Color.decode("#DAA520"); /** * The color RosyBrown - *
 
+ *
* * * @@ -379,7 +379,7 @@ public static class Browns public static final Color RosyBrown = Color.decode("#BC8F8F"); /** * The color SandyBrown - *
 
+ *
* * * @@ -388,7 +388,7 @@ public static class Browns public static final Color SandyBrown = Color.decode("#F4A460"); /** * The color Tan - *
 
+ *
* * * @@ -397,7 +397,7 @@ public static class Browns public static final Color Tan = Color.decode("#D2B48C"); /** * The color BurlyWood - *
 
+ *
* * * @@ -406,7 +406,7 @@ public static class Browns public static final Color BurlyWood = Color.decode("#DEB887"); /** * The color Wheat - *
 
+ *
* * * @@ -415,7 +415,7 @@ public static class Browns public static final Color Wheat = Color.decode("#F5DEB3"); /** * The color NavajoWhite - *
 
+ *
* * * @@ -424,7 +424,7 @@ public static class Browns public static final Color NavajoWhite = Color.decode("#FFDEAD"); /** * The color Bisque - *
 
+ *
* * * @@ -433,7 +433,7 @@ public static class Browns public static final Color Bisque = Color.decode("#FFE4C4"); /** * The color BlanchedAlmond - *
 
+ *
* * * @@ -442,7 +442,7 @@ public static class Browns public static final Color BlanchedAlmond = Color.decode("#FFEBCD"); /** * The color Cornsilk - *
 
+ *
* * * @@ -454,7 +454,7 @@ public static class Grays { /** * The color Black - *
 
+ *
* * * @@ -463,7 +463,7 @@ public static class Grays public static final Color Black = Color.decode("#000000"); /** * The color DarkSlateGray - *
 
+ *
* * * @@ -472,7 +472,7 @@ public static class Grays public static final Color DarkSlateGray = Color.decode("#2F4F4F"); /** * The color DimGray - *
 
+ *
* * * @@ -481,7 +481,7 @@ public static class Grays public static final Color DimGray = Color.decode("#696969"); /** * The color Gray - *
 
+ *
* * * @@ -490,7 +490,7 @@ public static class Grays public static final Color Gray = Color.decode("#808080"); /** * The color SlateGray - *
 
+ *
* * * @@ -499,7 +499,7 @@ public static class Grays public static final Color SlateGray = Color.decode("#708090"); /** * The color LightSlateGray - *
 
+ *
* * * @@ -508,7 +508,7 @@ public static class Grays public static final Color LightSlateGray = Color.decode("#778899"); /** * The color DarkGray - *
 
+ *
* * * @@ -517,7 +517,7 @@ public static class Grays public static final Color DarkGray = Color.decode("#A9A9A9"); /** * The color Silver - *
 
+ *
* * * @@ -526,7 +526,7 @@ public static class Grays public static final Color Silver = Color.decode("#C0C0C0"); /** * The color LightGray - *
 
+ *
* * * @@ -535,7 +535,7 @@ public static class Grays public static final Color LightGray = Color.decode("#D3D3D3"); /** * The color Gainsboro - *
 
+ *
* * * @@ -547,7 +547,7 @@ public static class Greens { /** * The color DarkGreen - *
 
+ *
* * * @@ -556,7 +556,7 @@ public static class Greens public static final Color DarkGreen = Color.decode("#006400"); /** * The color Green - *
 
+ *
* * * @@ -565,7 +565,7 @@ public static class Greens public static final Color Green = Color.decode("#008000"); /** * The color ForestGreen - *
 
+ *
* * * @@ -574,7 +574,7 @@ public static class Greens public static final Color ForestGreen = Color.decode("#228B22"); /** * The color DarkOliveGreen - *
 
+ *
* * * @@ -583,7 +583,7 @@ public static class Greens public static final Color DarkOliveGreen = Color.decode("#556B2F"); /** * The color Lime - *
 
+ *
* * * @@ -592,7 +592,7 @@ public static class Greens public static final Color Lime = Color.decode("#00FF00"); /** * The color Olive - *
 
+ *
* * * @@ -601,7 +601,7 @@ public static class Greens public static final Color Olive = Color.decode("#808000"); /** * The color Teal - *
 
+ *
* * * @@ -610,7 +610,7 @@ public static class Greens public static final Color Teal = Color.decode("#008080"); /** * The color SeaGreen - *
 
+ *
* * * @@ -619,7 +619,7 @@ public static class Greens public static final Color SeaGreen = Color.decode("#2E8B57"); /** * The color DarkCyan - *
 
+ *
* * * @@ -628,7 +628,7 @@ public static class Greens public static final Color DarkCyan = Color.decode("#008B8B"); /** * The color OliveDrab - *
 
+ *
* * * @@ -637,7 +637,7 @@ public static class Greens public static final Color OliveDrab = Color.decode("#6B8E23"); /** * The color LimeGreen - *
 
+ *
* * * @@ -646,7 +646,7 @@ public static class Greens public static final Color LimeGreen = Color.decode("#32CD32"); /** * The color MediumSeaGreen - *
 
+ *
* * * @@ -655,7 +655,7 @@ public static class Greens public static final Color MediumSeaGreen = Color.decode("#3CB371"); /** * The color LawnGreen - *
 
+ *
* * * @@ -664,7 +664,7 @@ public static class Greens public static final Color LawnGreen = Color.decode("#7CFC00"); /** * The color LightSeaGreen - *
 
+ *
* * * @@ -673,7 +673,7 @@ public static class Greens public static final Color LightSeaGreen = Color.decode("#20B2AA"); /** * The color Chartreuse - *
 
+ *
* * * @@ -682,7 +682,7 @@ public static class Greens public static final Color Chartreuse = Color.decode("#7FFF00"); /** * The color SpringGreen - *
 
+ *
* * * @@ -691,7 +691,7 @@ public static class Greens public static final Color SpringGreen = Color.decode("#00FF7F"); /** * The color MediumSpringGreen - *
 
+ *
* * * @@ -700,7 +700,7 @@ public static class Greens public static final Color MediumSpringGreen = Color.decode("#00FA9A"); /** * The color YellowGreen - *
 
+ *
* * * @@ -709,7 +709,7 @@ public static class Greens public static final Color YellowGreen = Color.decode("#9ACD32"); /** * The color DarkTurquoise - *
 
+ *
* * * @@ -718,7 +718,7 @@ public static class Greens public static final Color DarkTurquoise = Color.decode("#00CED1"); /** * The color DarkSeaGreen - *
 
+ *
* * * @@ -727,7 +727,7 @@ public static class Greens public static final Color DarkSeaGreen = Color.decode("#8FBC8F"); /** * The color GreenYellow - *
 
+ *
* * * @@ -736,7 +736,7 @@ public static class Greens public static final Color GreenYellow = Color.decode("#ADFF2F"); /** * The color MediumAquamarine - *
 
+ *
* * * @@ -745,7 +745,7 @@ public static class Greens public static final Color MediumAquamarine = Color.decode("#66CDAA"); /** * The color MediumTurquoise - *
 
+ *
* * * @@ -754,7 +754,7 @@ public static class Greens public static final Color MediumTurquoise = Color.decode("#48D1CC"); /** * The color Turquoise - *
 
+ *
* * * @@ -763,7 +763,7 @@ public static class Greens public static final Color Turquoise = Color.decode("#40E0D0"); /** * The color LightGreen - *
 
+ *
* * * @@ -772,7 +772,7 @@ public static class Greens public static final Color LightGreen = Color.decode("#90EE90"); /** * The color PaleGreen - *
 
+ *
* * * @@ -781,7 +781,7 @@ public static class Greens public static final Color PaleGreen = Color.decode("#98FB98"); /** * The color Aquamarine - *
 
+ *
* * * @@ -790,7 +790,7 @@ public static class Greens public static final Color Aquamarine = Color.decode("#7FFFD4"); /** * The color PaleTurquoise - *
 
+ *
* * * @@ -802,7 +802,7 @@ public static class Oranges { /** * The color OrangeRed - *
 
+ *
* * * @@ -811,7 +811,7 @@ public static class Oranges public static final Color OrangeRed = Color.decode("#FF4500"); /** * The color DarkOrange - *
 
+ *
* * * @@ -820,7 +820,7 @@ public static class Oranges public static final Color DarkOrange = Color.decode("#FF8C00"); /** * The color Orange - *
 
+ *
* * * @@ -829,7 +829,7 @@ public static class Oranges public static final Color Orange = Color.decode("#FFA500"); /** * The color Tomato - *
 
+ *
* * * @@ -838,7 +838,7 @@ public static class Oranges public static final Color Tomato = Color.decode("#FF6347"); /** * The color Coral - *
 
+ *
* * * @@ -847,7 +847,7 @@ public static class Oranges public static final Color Coral = Color.decode("#FF7F50"); /** * The color LightSalmon - *
 
+ *
* * * @@ -859,7 +859,7 @@ public static class Pinks { /** * The color MediumVioletRed - *
 
+ *
* * * @@ -868,7 +868,7 @@ public static class Pinks public static final Color MediumVioletRed = Color.decode("#C71585"); /** * The color DeepPink - *
 
+ *
* * * @@ -877,7 +877,7 @@ public static class Pinks public static final Color DeepPink = Color.decode("#FF1493"); /** * The color PaleVioletRed - *
 
+ *
* * * @@ -886,7 +886,7 @@ public static class Pinks public static final Color PaleVioletRed = Color.decode("#DB7093"); /** * The color Fuchsia - *
 
+ *
* * * @@ -895,7 +895,7 @@ public static class Pinks public static final Color Fuchsia = Color.decode("#FF00FF"); /** * The color HotPink - *
 
+ *
* * * @@ -904,7 +904,7 @@ public static class Pinks public static final Color HotPink = Color.decode("#FF69B4"); /** * The color LightPink - *
 
+ *
* * * @@ -913,7 +913,7 @@ public static class Pinks public static final Color LightPink = Color.decode("#FFB6C1"); /** * The color Pink - *
 
+ *
* * * @@ -925,7 +925,7 @@ public static class Purples { /** * The color Indigo - *
 
+ *
* * * @@ -934,7 +934,7 @@ public static class Purples public static final Color Indigo = Color.decode("#4B0082"); /** * The color Purple - *
 
+ *
* * * @@ -943,7 +943,7 @@ public static class Purples public static final Color Purple = Color.decode("#800080"); /** * The color DarkSlateBlue - *
 
+ *
* * * @@ -952,7 +952,7 @@ public static class Purples public static final Color DarkSlateBlue = Color.decode("#483D8B"); /** * The color DarkMagenta - *
 
+ *
* * * @@ -961,7 +961,7 @@ public static class Purples public static final Color DarkMagenta = Color.decode("#8B008B"); /** * The color MediumVioletRed - *
 
+ *
* * * @@ -970,7 +970,7 @@ public static class Purples public static final Color MediumVioletRed = Color.decode("#C71585"); /** * The color DarkViolet - *
 
+ *
* * * @@ -979,7 +979,7 @@ public static class Purples public static final Color DarkViolet = Color.decode("#9400D3"); /** * The color SlateBlue - *
 
+ *
* * * @@ -988,7 +988,7 @@ public static class Purples public static final Color SlateBlue = Color.decode("#6A5ACD"); /** * The color BlueViolet - *
 
+ *
* * * @@ -997,7 +997,7 @@ public static class Purples public static final Color BlueViolet = Color.decode("#8A2BE2"); /** * The color DarkOrchid - *
 
+ *
* * * @@ -1006,7 +1006,7 @@ public static class Purples public static final Color DarkOrchid = Color.decode("#9932CC"); /** * The color MediumSlateBlue - *
 
+ *
* * * @@ -1015,7 +1015,7 @@ public static class Purples public static final Color MediumSlateBlue = Color.decode("#7B68EE"); /** * The color RosyBrown - *
 
+ *
* * * @@ -1024,7 +1024,7 @@ public static class Purples public static final Color RosyBrown = Color.decode("#BC8F8F"); /** * The color MediumPurple - *
 
+ *
* * * @@ -1033,7 +1033,7 @@ public static class Purples public static final Color MediumPurple = Color.decode("#9370DB"); /** * The color PaleVioletRed - *
 
+ *
* * * @@ -1042,7 +1042,7 @@ public static class Purples public static final Color PaleVioletRed = Color.decode("#DB7093"); /** * The color MediumOrchid - *
 
+ *
* * * @@ -1051,7 +1051,7 @@ public static class Purples public static final Color MediumOrchid = Color.decode("#BA55D3"); /** * The color Fuchsia - *
 
+ *
* * * @@ -1060,7 +1060,7 @@ public static class Purples public static final Color Fuchsia = Color.decode("#FF00FF"); /** * The color Magenta - *
 
+ *
* * * @@ -1069,7 +1069,7 @@ public static class Purples public static final Color Magenta = Color.decode("#FF00FF"); /** * The color Orchid - *
 
+ *
* * * @@ -1078,7 +1078,7 @@ public static class Purples public static final Color Orchid = Color.decode("#DA70D6"); /** * The color Plum - *
 
+ *
* * * @@ -1087,7 +1087,7 @@ public static class Purples public static final Color Plum = Color.decode("#DDA0DD"); /** * The color Violet - *
 
+ *
* * * @@ -1096,7 +1096,7 @@ public static class Purples public static final Color Violet = Color.decode("#EE82EE"); /** * The color Thistle - *
 
+ *
* * * @@ -1105,7 +1105,7 @@ public static class Purples public static final Color Thistle = Color.decode("#D8BFD8"); /** * The color Lavender - *
 
+ *
* * * @@ -1117,7 +1117,7 @@ public static class Reds { /** * The color DarkRed - *
 
+ *
* * * @@ -1126,7 +1126,7 @@ public static class Reds public static final Color DarkRed = Color.decode("#8B0000"); /** * The color FireBrick - *
 
+ *
* * * @@ -1135,7 +1135,7 @@ public static class Reds public static final Color FireBrick = Color.decode("#B22222"); /** * The color Red - *
 
+ *
* * * @@ -1144,7 +1144,7 @@ public static class Reds public static final Color Red = Color.decode("#FF0000"); /** * The color Crimson - *
 
+ *
* * * @@ -1153,7 +1153,7 @@ public static class Reds public static final Color Crimson = Color.decode("#DC143C"); /** * The color OrangeRed - *
 
+ *
* * * @@ -1162,7 +1162,7 @@ public static class Reds public static final Color OrangeRed = Color.decode("#FF4500"); /** * The color MediumVioletRed - *
 
+ *
* * * @@ -1171,7 +1171,7 @@ public static class Reds public static final Color MediumVioletRed = Color.decode("#C71585"); /** * The color IndianRed - *
 
+ *
* * * @@ -1180,7 +1180,7 @@ public static class Reds public static final Color IndianRed = Color.decode("#CD5C5C"); /** * The color Tomato - *
 
+ *
* * * @@ -1189,7 +1189,7 @@ public static class Reds public static final Color Tomato = Color.decode("#FF6347"); /** * The color PaleVioletRed - *
 
+ *
* * * @@ -1198,7 +1198,7 @@ public static class Reds public static final Color PaleVioletRed = Color.decode("#DB7093"); /** * The color Salmon - *
 
+ *
* * * @@ -1207,7 +1207,7 @@ public static class Reds public static final Color Salmon = Color.decode("#FA8072"); /** * The color LightCoral - *
 
+ *
* * * @@ -1216,7 +1216,7 @@ public static class Reds public static final Color LightCoral = Color.decode("#F08080"); /** * The color DarkSalmon - *
 
+ *
* * * @@ -1225,7 +1225,7 @@ public static class Reds public static final Color DarkSalmon = Color.decode("#E9967A"); /** * The color LightSalmon - *
 
+ *
* * * @@ -1237,7 +1237,7 @@ public static class Whites { /** * The color AntiqueWhite - *
 
+ *
* * * @@ -1246,7 +1246,7 @@ public static class Whites public static final Color AntiqueWhite = Color.decode("#FAEBD7"); /** * The color MistyRose - *
 
+ *
* * * @@ -1255,7 +1255,7 @@ public static class Whites public static final Color MistyRose = Color.decode("#FFE4E1"); /** * The color Beige - *
 
+ *
* * * @@ -1264,7 +1264,7 @@ public static class Whites public static final Color Beige = Color.decode("#F5F5DC"); /** * The color Linen - *
 
+ *
* * * @@ -1273,7 +1273,7 @@ public static class Whites public static final Color Linen = Color.decode("#FAF0E6"); /** * The color OldLace - *
 
+ *
* * * @@ -1282,7 +1282,7 @@ public static class Whites public static final Color OldLace = Color.decode("#FDF5E6"); /** * The color Honeydew - *
 
+ *
* * * @@ -1291,7 +1291,7 @@ public static class Whites public static final Color Honeydew = Color.decode("#F0FFF0"); /** * The color WhiteSmoke - *
 
+ *
* * * @@ -1300,7 +1300,7 @@ public static class Whites public static final Color WhiteSmoke = Color.decode("#F5F5F5"); /** * The color Seashell - *
 
+ *
* * * @@ -1309,7 +1309,7 @@ public static class Whites public static final Color Seashell = Color.decode("#FFF5EE"); /** * The color LavenderBlush - *
 
+ *
* * * @@ -1318,7 +1318,7 @@ public static class Whites public static final Color LavenderBlush = Color.decode("#FFF0F5"); /** * The color AliceBlue - *
 
+ *
* * * @@ -1327,7 +1327,7 @@ public static class Whites public static final Color AliceBlue = Color.decode("#F0F8FF"); /** * The color FloralWhite - *
 
+ *
* * * @@ -1336,7 +1336,7 @@ public static class Whites public static final Color FloralWhite = Color.decode("#FFFAF0"); /** * The color MintCream - *
 
+ *
* * * @@ -1345,7 +1345,7 @@ public static class Whites public static final Color MintCream = Color.decode("#F5FFFA"); /** * The color Azure - *
 
+ *
* * * @@ -1354,7 +1354,7 @@ public static class Whites public static final Color Azure = Color.decode("#F0FFFF"); /** * The color Ivory - *
 
+ *
* * * @@ -1363,7 +1363,7 @@ public static class Whites public static final Color Ivory = Color.decode("#FFFFF0"); /** * The color GhostWhite - *
 
+ *
* * * @@ -1372,7 +1372,7 @@ public static class Whites public static final Color GhostWhite = Color.decode("#F8F8FF"); /** * The color Snow - *
 
+ *
* * * @@ -1381,7 +1381,7 @@ public static class Whites public static final Color Snow = Color.decode("#FFFAFA"); /** * The color White - *
 
+ *
* * * @@ -1393,7 +1393,7 @@ public static class Yellows { /** * The color DarkGoldenrod - *
 
+ *
* * * @@ -1402,7 +1402,7 @@ public static class Yellows public static final Color DarkGoldenrod = Color.decode("#B8860B"); /** * The color Goldenrod - *
 
+ *
* * * @@ -1411,7 +1411,7 @@ public static class Yellows public static final Color Goldenrod = Color.decode("#DAA520"); /** * The color Gold - *
 
+ *
* * * @@ -1420,7 +1420,7 @@ public static class Yellows public static final Color Gold = Color.decode("#FFD700"); /** * The color DarkKhaki - *
 
+ *
* * * @@ -1429,7 +1429,7 @@ public static class Yellows public static final Color DarkKhaki = Color.decode("#BDB76B"); /** * The color Yellow - *
 
+ *
* * * @@ -1438,7 +1438,7 @@ public static class Yellows public static final Color Yellow = Color.decode("#FFFF00"); /** * The color Khaki - *
 
+ *
* * * @@ -1447,7 +1447,7 @@ public static class Yellows public static final Color Khaki = Color.decode("#F0E68C"); /** * The color PaleGoldenrod - *
 
+ *
* * * @@ -1456,7 +1456,7 @@ public static class Yellows public static final Color PaleGoldenrod = Color.decode("#EEE8AA"); /** * The color PeachPuff - *
 
+ *
* * * @@ -1465,7 +1465,7 @@ public static class Yellows public static final Color PeachPuff = Color.decode("#FFDAB9"); /** * The color Moccasin - *
 
+ *
* * * @@ -1474,7 +1474,7 @@ public static class Yellows public static final Color Moccasin = Color.decode("#FFE4B5"); /** * The color PapayaWhip - *
 
+ *
* * * @@ -1483,7 +1483,7 @@ public static class Yellows public static final Color PapayaWhip = Color.decode("#FFEFD5"); /** * The color LemonChiffon - *
 
+ *
* * * @@ -1492,7 +1492,7 @@ public static class Yellows public static final Color LemonChiffon = Color.decode("#FFFACD"); /** * The color LightGoldenrodYellow - *
 
+ *
* * * @@ -1501,7 +1501,7 @@ public static class Yellows public static final Color LightGoldenrodYellow = Color.decode("#FAFAD2"); /** * The color LightYellow - *
 
+ *
* * * diff --git a/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/AdLibsQuizGrader.java b/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/AdLibsQuizGrader.java index c2a29ce..f34c930 100644 --- a/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/AdLibsQuizGrader.java +++ b/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/AdLibsQuizGrader.java @@ -5,125 +5,125 @@ import javax.swing.JPanel; -import org.teachingextensions.logo.Colors; import org.teachingextensions.logo.Paintable; +import org.teachingextensions.logo.PenColors; import org.teachingextensions.logo.Tortoise; import org.teachingextensions.simpleparser.Parser; import org.teachingkidsprogramming.recipes.quizzes.graders.AdLibsQuizAdapter.Pieces; -public class AdLibsQuizGrader implements Paintable -{ - private static class Model - { - public String three; - public Model(String three) - { - this.three = three; - } - } - private boolean[] answers; - public static int TURTLE_SPEED = 9; - private AdLibsQuizAdapter quiz; - private void displayScreen() - { - QuizUtils.prepareScoringScreen(answers, this, TURTLE_SPEED); - } - public void grade(AdLibsQuizAdapter quiz) - { - this.quiz = quiz; - answers = new boolean[]{grade1You(), grade2Won(), grade3The(), grade4Game()}; - displayScreen(); - } - public void paint(Graphics2D g, JPanel caller) - { - QuizUtils.displayScores(g, 300, answers); - Tortoise.hide(); - drawRewardShape(g); - } - public void drawRewardShape(Graphics2D g) - { - drawYou(g); - drawWin(g); - drawThe(g); - drawGame(g); - } - private void drawGame(Graphics2D g) - { - quiz.template4 = ""; - Pieces pieces = new Pieces(); - quiz.question4(pieces); - pieces.middle = "am"; - String word = Parser.parse(quiz.template4, pieces); - drawWord(g, word, 0, 4, true); - } - private void drawThe(Graphics2D g) - { - quiz.word3 = ""; - Pieces model = new Pieces(); - model.middle = "H"; - quiz.question3("T{middle}E", model); - drawWord(g, quiz.word3, 3, 2, false); - } - private void drawWin(Graphics2D g) - { - quiz.word2 = "WO"; - quiz.question2("n"); - drawWord(g, quiz.word2, 1, 0, false); - } - private void drawWord(Graphics2D g, String word, int x, int y, boolean horizontal) - { - char[] letters = word.toUpperCase().toCharArray(); - int dx = horizontal ? 1 : 0; - int dy = horizontal ? 0 : 1; - for (int i = 0; i < letters.length; i++) - { - char c = letters[i]; - drawLetter(getPosition(x + dx * i), getPosition(y + dy * i), c, g); - } - } - private int getPosition(int i) - { - return 100 + i * 53; - } - private void drawYou(Graphics2D g) - { - quiz.word1 = "NOT"; - quiz.question1("y", "u"); - drawWord(g, quiz.word1, 0, 1, true); - } - private void drawLetter(int x, int y, char c, Graphics2D g) - { - g.setColor(Colors.Browns.BurlyWood); - g.drawRect(x, y, 50, 50); - g.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 36)); - int charWidth = g.getFontMetrics().charWidth(c); - int charHeight = g.getFontMetrics().getAscent(); - int textY = y + (40 - charHeight) / 2 + charHeight; - int textX = x + (50 - charWidth) / 2; - g.drawString("" + c, textX, textY); - } - private boolean grade1You() - { - quiz.word1 = "fake"; - quiz.question1("f", "o"); - return "foo".equals(quiz.word1); - } - private boolean grade2Won() - { - quiz.word2 = "passe"; - quiz.question2("d"); - return "passed".equals(quiz.word2); - } - private boolean grade3The() - { - quiz.word3 = "fake"; - quiz.question3("12{three}4", new Model("3")); - return "1234".equals(quiz.word3); - } - private boolean grade4Game() - { - quiz.template4 = "fake"; - quiz.question4(new Pieces()); - return "g{middle}e".equals(quiz.template4); - } +public class AdLibsQuizGrader implements Paintable { + private static class Model { + public String three; + + public Model(String three) { + this.three = three; + } + } + + private boolean[] answers; + public static int TURTLE_SPEED = 9; + private AdLibsQuizAdapter quiz; + + private void displayScreen() { + QuizUtils.prepareScoringScreen(answers, this, TURTLE_SPEED); + } + + public void grade(AdLibsQuizAdapter quiz) { + this.quiz = quiz; + answers = new boolean[] { grade1You(), grade2Won(), grade3The(), + grade4Game() }; + displayScreen(); + } + + public void paint(Graphics2D g, JPanel caller) { + QuizUtils.displayScores(g, 300, answers); + Tortoise.hide(); + drawRewardShape(g); + } + + public void drawRewardShape(Graphics2D g) { + drawYou(g); + drawWin(g); + drawThe(g); + drawGame(g); + } + + private void drawGame(Graphics2D g) { + quiz.template4 = ""; + Pieces pieces = new Pieces(); + quiz.question4(pieces); + pieces.middle = "am"; + String word = Parser.parse(quiz.template4, pieces); + drawWord(g, word, 0, 4, true); + } + + private void drawThe(Graphics2D g) { + quiz.word3 = ""; + Pieces model = new Pieces(); + model.middle = "H"; + quiz.question3("T{middle}E", model); + drawWord(g, quiz.word3, 3, 2, false); + } + + private void drawWin(Graphics2D g) { + quiz.word2 = "WO"; + quiz.question2("n"); + drawWord(g, quiz.word2, 1, 0, false); + } + + private void drawWord(Graphics2D g, String word, int x, int y, + boolean horizontal) { + char[] letters = word.toUpperCase().toCharArray(); + int dx = horizontal ? 1 : 0; + int dy = horizontal ? 0 : 1; + for (int i = 0; i < letters.length; i++) { + char c = letters[i]; + drawLetter(getPosition(x + dx * i), getPosition(y + dy * i), c, g); + } + } + + private int getPosition(int i) { + return 100 + i * 53; + } + + private void drawYou(Graphics2D g) { + quiz.word1 = "NOT"; + quiz.question1("y", "u"); + drawWord(g, quiz.word1, 0, 1, true); + } + + private void drawLetter(int x, int y, char c, Graphics2D g) { + g.setColor(PenColors.Browns.BurlyWood); + g.drawRect(x, y, 50, 50); + g.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 36)); + int charWidth = g.getFontMetrics().charWidth(c); + int charHeight = g.getFontMetrics().getAscent(); + int textY = y + (40 - charHeight) / 2 + charHeight; + int textX = x + (50 - charWidth) / 2; + g.drawString("" + c, textX, textY); + } + + private boolean grade1You() { + quiz.word1 = "fake"; + quiz.question1("f", "o"); + return "foo".equals(quiz.word1); + } + + private boolean grade2Won() { + quiz.word2 = "passe"; + quiz.question2("d"); + return "passed".equals(quiz.word2); + } + + private boolean grade3The() { + quiz.word3 = "fake"; + quiz.question3("12{three}4", new Model("3")); + return "1234".equals(quiz.word3); + } + + private boolean grade4Game() { + quiz.template4 = "fake"; + quiz.question4(new Pieces()); + return "g{middle}e".equals(quiz.template4); + } } diff --git a/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/HiLowQuizGrader.java b/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/HiLowQuizGrader.java index 1238fad..c3d74e3 100644 --- a/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/HiLowQuizGrader.java +++ b/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/HiLowQuizGrader.java @@ -4,8 +4,8 @@ import javax.swing.JPanel; -import org.teachingextensions.logo.Colors; import org.teachingextensions.logo.Paintable; +import org.teachingextensions.logo.PenColors; import org.teachingextensions.logo.Tortoise; import org.teachingextensions.logo.utils.TortoiseUtils; import org.teachingextensions.windows.MessageBox; @@ -35,7 +35,7 @@ private void drawRewardShape() 70, 85, 25, 43, 40, 18, 26, 50, 113, 25, 85, 40, 30, 30, 20, 20, 20, 10, 20, 10, 10, 20, 10, 10, 30, 30, 60, 183}; Tortoise.setX(20); - Tortoise.setPenColor(Colors.Greens.LawnGreen); + Tortoise.setPenColor(PenColors.Greens.LawnGreen); for (int i = 0; i < lengths.length; i++) { Tortoise.turn(angles[i]); diff --git a/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/HousesQuizGrader.java b/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/HousesQuizGrader.java index 05f78ec..b99bf49 100644 --- a/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/HousesQuizGrader.java +++ b/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/HousesQuizGrader.java @@ -4,8 +4,8 @@ import javax.swing.JPanel; -import org.teachingextensions.logo.Colors; import org.teachingextensions.logo.Paintable; +import org.teachingextensions.logo.PenColors; import org.teachingextensions.logo.Tortoise; import org.teachingextensions.logo.Turtle; import org.teachingextensions.logo.utils.TortoiseUtils; @@ -98,7 +98,7 @@ private void drawTriangle() for (int i = 0; i < 2; i++) { Tortoise.setPenWidth(3); - Tortoise.setPenColor(Colors.Purples.Lavender); + Tortoise.setPenColor(PenColors.Purples.Lavender); quiz.question3(); quiz.question4(); Tortoise.turn(180); @@ -129,7 +129,7 @@ private void moveMedium() { quiz.question2(); Tortoise.setPenWidth(2); - Tortoise.setPenColor(Colors.Blues.LightBlue); + Tortoise.setPenColor(PenColors.Blues.LightBlue); quiz.question4(); Tortoise.turn(180); quiz.question4(); @@ -139,7 +139,7 @@ private void moveMedium() private void drawSmallestLine() { Tortoise.setPenWidth(1); - Tortoise.setPenColor(Colors.Blues.PowderBlue); + Tortoise.setPenColor(PenColors.Blues.PowderBlue); quiz.question1(); quiz.question4(); Tortoise.turn(360.0 / 6); diff --git a/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/PentagonCrazyQuizGrader.java b/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/PentagonCrazyQuizGrader.java index 26b778a..3a7a89a 100644 --- a/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/PentagonCrazyQuizGrader.java +++ b/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/PentagonCrazyQuizGrader.java @@ -6,11 +6,11 @@ import javax.swing.JPanel; import org.teachingextensions.logo.ColorWheel; -import org.teachingextensions.logo.Colors; import org.teachingextensions.logo.Paintable; +import org.teachingextensions.logo.PenColors; import org.teachingextensions.logo.Tortoise; -import org.teachingextensions.logo.Wheel; import org.teachingextensions.logo.Turtle; +import org.teachingextensions.logo.Wheel; import org.teachingextensions.logo.utils.TortoiseUtils; import com.spun.util.NumberUtils; @@ -75,7 +75,7 @@ private boolean grade3Lime() { ColorWheel.removeAllColors(); quiz.question3(); - return Colors.Greens.Lime.equals(getSafeColor()); + return PenColors.Greens.Lime.equals(getSafeColor()); } public Color getSafeColor() { @@ -85,14 +85,14 @@ public Color getSafeColor() } catch (Exception e) { - return Colors.Yellows.Yellow; + return PenColors.Yellows.Yellow; } } private boolean grade4Red() { ColorWheel.removeAllColors(); quiz.question4(); - return Colors.Reds.Red.equals(getSafeColor()); + return PenColors.Reds.Red.equals(getSafeColor()); } public void setColors() { diff --git a/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/QuizBuzzGrader.java b/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/QuizBuzzGrader.java index d62b94c..502ff15 100644 --- a/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/QuizBuzzGrader.java +++ b/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/QuizBuzzGrader.java @@ -5,8 +5,8 @@ import javax.swing.JPanel; -import org.teachingextensions.logo.Colors; import org.teachingextensions.logo.Paintable; +import org.teachingextensions.logo.PenColors; import org.teachingextensions.logo.Tortoise; import org.teachingextensions.simpleparser.Parser; import org.teachingkidsprogramming.recipes.quizzes.graders.AdLibsQuizAdapter.Pieces; @@ -93,7 +93,7 @@ private void drawYou(Graphics2D g) } private void drawLetter(int x, int y, char c, Graphics2D g) { - g.setColor(Colors.Browns.BurlyWood); + g.setColor(PenColors.Browns.BurlyWood); g.drawRect(x, y, 50, 50); g.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 36)); int charWidth = g.getFontMetrics().charWidth(c); diff --git a/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/SpiderWebQuizGrader.java b/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/SpiderWebQuizGrader.java index 3f9cb83..a75e5e8 100644 --- a/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/SpiderWebQuizGrader.java +++ b/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/SpiderWebQuizGrader.java @@ -5,8 +5,8 @@ import javax.swing.JPanel; import org.teachingextensions.logo.ColorWheel; -import org.teachingextensions.logo.Colors; import org.teachingextensions.logo.Paintable; +import org.teachingextensions.logo.PenColors; import org.teachingextensions.logo.Tortoise; import org.teachingextensions.logo.utils.TortoiseUtils; @@ -37,9 +37,9 @@ public void initialize(SpiderQuiz quiz) TortoiseUtils.setOrientation(150, 200, 0); Tortoise.setPenWidth(15); ColorWheel.removeAllColors(); - ColorWheel.addColor(Colors.Grays.Black); - ColorWheel.addColor(Colors.Whites.White); - Tortoise.getBackgroundWindow().setBackground(Colors.Grays.Silver); + ColorWheel.addColor(PenColors.Grays.Black); + ColorWheel.addColor(PenColors.Whites.White); + Tortoise.getBackgroundWindow().setBackground(PenColors.Grays.Silver); quiz.number = 16; quiz.length = 15; } diff --git a/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/TreeQuizGrader.java b/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/TreeQuizGrader.java index ef02eac..6d3bcc5 100644 --- a/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/TreeQuizGrader.java +++ b/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/TreeQuizGrader.java @@ -6,8 +6,8 @@ import javax.swing.JPanel; -import org.teachingextensions.logo.Colors; import org.teachingextensions.logo.Paintable; +import org.teachingextensions.logo.PenColors; import org.teachingextensions.logo.Tortoise; import org.teachingextensions.logo.utils.TortoiseUtils; @@ -67,7 +67,7 @@ public void drawRewardShape() TortoiseUtils.setOrientation(xTop - 15, yTop + 15, 90); quiz.length = 15; quiz.question1(); - Tortoise.setPenColor(Colors.Greens.Lime); + Tortoise.setPenColor(PenColors.Greens.Lime); Tortoise.setPenWidth(2); int[] turns = { 0, 90, 0, -90, 90 - 36, -90, 0, 90, -90, 0, 0, 0, -90, -90, 0, 0, 90, 0, 0, 90, 0, 0, 0, 0, 90, 90, -90, @@ -101,7 +101,7 @@ else if (turns[i] != 90) } private void drawMaze(Graphics2D g) { - g.setColor(Colors.Grays.DarkGray); + g.setColor(PenColors.Grays.DarkGray); g.setStroke(new BasicStroke(4, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)); int[][] verticalLines = { {1, 4}, {0, 2, 3, 1}, {2, 1}, {0, 1}, {1, 3}, {1, 2}, {2, 1}, new int[0], {1, 1, 3, 2}, {2, 1}, {0, 4}}; From 10fc5ce726b2b37211cf90be383b7c85f1624078 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Wed, 4 Mar 2015 20:56:17 -0800 Subject: [PATCH 009/111] Removed more unneeded classes. --- .../com/spun/util/ConfigXMLFileReader.java | 56 --- .../com/spun/util/ConfigXMLFileWriter.java | 102 ----- .../com/spun/util/ConfigXMLNodeExtractor.java | 36 -- src/main/java/com/spun/util/Country.java | 48 -- src/main/java/com/spun/util/NumberUtils.java | 431 ++++++++---------- src/main/java/com/spun/util/PhoneNumber.java | 259 ----------- src/main/java/com/spun/util/State.java | 81 ---- src/main/java/com/spun/util/StringUtils.java | 43 +- .../java/com/spun/util/database/SQLUtils.java | 145 ------ .../database/XmlDatabaseMapExtractor.java | 60 --- .../util/io/CommaDelimitedFileParser.java | 151 ------ .../com/spun/util/io/XMLNodeExtractor.java | 35 -- src/main/java/com/spun/util/io/XMLUtils.java | 107 ----- .../com/spun/util/io/xml/BasicExtractor.java | 106 ----- .../util/io/xml/DatabaseObjectXMLUtils.java | 75 --- .../com/spun/util/io/xml/XmlExtractable.java | 12 - .../spun/util/io/xml/XmlExtractorUtil.java | 74 --- .../java/com/spun/util/io/xml/XmlMap.java | 132 ------ .../com/spun/util/io/xml/XmlMapExtractor.java | 44 -- .../spun/util/io/xml/XmlMapTranslator.java | 21 - .../com/spun/util/io/xml/XmlTranslator.java | 75 --- .../spun/util/servlets/ValidationError.java | 349 +++++++------- .../util/velocity/StringResourceLoader.java | 55 --- .../java/org/approvaltests/Approvals.java | 19 +- .../lambda/actions/implementations/A0.java | 23 - .../lambda/actions/implementations/A1.java | 23 - .../lambda/functions/implementations/B1.java | 9 - .../lambda/functions/implementations/F0.java | 15 - .../lambda/functions/implementations/F1.java | 16 - .../lambda/functions/implementations/F2.java | 19 - .../lambda/functions/implementations/F3.java | 20 - .../lambda/functions/implementations/F4.java | 21 - .../lambda/functions/implementations/F5.java | 22 - .../lambda/functions/implementations/F6.java | 23 - .../lambda/functions/implementations/F7.java | 24 - .../lambda/functions/implementations/F8.java | 25 - .../lambda/functions/implementations/F9.java | 26 -- .../functions/implementations/Function.java | 147 ------ .../lambda/functions/implementations/S1.java | 9 - .../java/org/lambda/query/ParallelLoops.java | 43 -- .../java/org/lambda/query/ParallelQuery.java | 50 -- .../teachingextensions/logo/PenColors.java | 326 ++++++------- .../simpleparser/Parser.java | 8 +- .../utils/VirtualProctor.java | 119 ++--- .../windows/MessageBox.java | 135 +++--- .../windows/ProgramWindow.java | 113 +++-- 46 files changed, 749 insertions(+), 2983 deletions(-) delete mode 100644 src/main/java/com/spun/util/ConfigXMLFileReader.java delete mode 100644 src/main/java/com/spun/util/ConfigXMLFileWriter.java delete mode 100644 src/main/java/com/spun/util/ConfigXMLNodeExtractor.java delete mode 100644 src/main/java/com/spun/util/Country.java delete mode 100644 src/main/java/com/spun/util/PhoneNumber.java delete mode 100644 src/main/java/com/spun/util/State.java delete mode 100644 src/main/java/com/spun/util/database/SQLUtils.java delete mode 100644 src/main/java/com/spun/util/database/XmlDatabaseMapExtractor.java delete mode 100644 src/main/java/com/spun/util/io/CommaDelimitedFileParser.java delete mode 100644 src/main/java/com/spun/util/io/XMLNodeExtractor.java delete mode 100644 src/main/java/com/spun/util/io/XMLUtils.java delete mode 100644 src/main/java/com/spun/util/io/xml/BasicExtractor.java delete mode 100644 src/main/java/com/spun/util/io/xml/DatabaseObjectXMLUtils.java delete mode 100644 src/main/java/com/spun/util/io/xml/XmlExtractable.java delete mode 100644 src/main/java/com/spun/util/io/xml/XmlExtractorUtil.java delete mode 100644 src/main/java/com/spun/util/io/xml/XmlMap.java delete mode 100644 src/main/java/com/spun/util/io/xml/XmlMapExtractor.java delete mode 100644 src/main/java/com/spun/util/io/xml/XmlMapTranslator.java delete mode 100644 src/main/java/com/spun/util/io/xml/XmlTranslator.java delete mode 100644 src/main/java/com/spun/util/velocity/StringResourceLoader.java delete mode 100644 src/main/java/org/lambda/actions/implementations/A0.java delete mode 100644 src/main/java/org/lambda/actions/implementations/A1.java delete mode 100644 src/main/java/org/lambda/functions/implementations/B1.java delete mode 100644 src/main/java/org/lambda/functions/implementations/F0.java delete mode 100644 src/main/java/org/lambda/functions/implementations/F1.java delete mode 100644 src/main/java/org/lambda/functions/implementations/F2.java delete mode 100644 src/main/java/org/lambda/functions/implementations/F3.java delete mode 100644 src/main/java/org/lambda/functions/implementations/F4.java delete mode 100644 src/main/java/org/lambda/functions/implementations/F5.java delete mode 100644 src/main/java/org/lambda/functions/implementations/F6.java delete mode 100644 src/main/java/org/lambda/functions/implementations/F7.java delete mode 100644 src/main/java/org/lambda/functions/implementations/F8.java delete mode 100644 src/main/java/org/lambda/functions/implementations/F9.java delete mode 100644 src/main/java/org/lambda/functions/implementations/Function.java delete mode 100644 src/main/java/org/lambda/functions/implementations/S1.java delete mode 100644 src/main/java/org/lambda/query/ParallelLoops.java delete mode 100644 src/main/java/org/lambda/query/ParallelQuery.java diff --git a/src/main/java/com/spun/util/ConfigXMLFileReader.java b/src/main/java/com/spun/util/ConfigXMLFileReader.java deleted file mode 100644 index 60878e7..0000000 --- a/src/main/java/com/spun/util/ConfigXMLFileReader.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.spun.util; - -import java.lang.reflect.Field; -import java.util.HashMap; - -import com.spun.util.io.XMLUtils; - -/** - * @author Llewellyn Falco - * - * To change the template for this generated type comment go to - * Window - Preferences - Java - Code Generation - Code and Comments - */ -public class ConfigXMLFileReader -{ - /***********************************************************************/ - public static String loadXML(Class clazz, String exclude[], String fileLocation, String[] backupPaths) throws Exception - { - String fileNameUsed = XMLUtils.locateFile(fileLocation, backupPaths); - loadXML(clazz, exclude,fileNameUsed); - return fileNameUsed; - } - /***********************************************************************/ - public static void loadXML(Class clazz, String exclude[], String knownFileLocation) throws Exception - { - HashMap properties = XMLUtils.parseProperties(knownFileLocation, new ConfigXMLNodeExtractor()); - loadClass(clazz, exclude, properties); - } - /***********************************************************************/ - private static void loadClass(Class clazz, String exclude[], HashMap properties) throws IllegalArgumentException, IllegalAccessException - { - Field[] fields = ConfigXMLFileWriter.getFields(clazz, exclude); - for (int i = 0; i < fields.length; i++) - { - assignField(fields[i], properties); - } - //My_System.variable("fields " ,ObjectUtils.extractArray(fields, "getName")); - } - /***********************************************************************/ - private static void assignField(Field field, HashMap properties) throws IllegalArgumentException, IllegalAccessException - { - String name = field.getName(); - Object value = properties.get(name); - if (value == null) {} // do nothing, leave default - else if (field.getType().isAssignableFrom(String.class)) { field.set(null, value); } - else if (field.getType().isAssignableFrom(String[].class)) { field.set(null, value); } - else if (field.getType().isAssignableFrom(int.class)) { field.setInt(null, NumberUtils.load((String) value, field.getInt(null))); } - else if (field.getType().isAssignableFrom(double.class)) { field.setDouble(null, NumberUtils.load((String) value, field.getDouble(null))); } - else if (field.getType().isAssignableFrom(boolean.class)) { field.setBoolean(null, NumberUtils.load((String) value, field.getBoolean(null))); } - else { throw new Error("don't know how to handle field of type " + field.getType().getName());} - - } - - /***********************************************************************/ - /***********************************************************************/ -} diff --git a/src/main/java/com/spun/util/ConfigXMLFileWriter.java b/src/main/java/com/spun/util/ConfigXMLFileWriter.java deleted file mode 100644 index 334ec16..0000000 --- a/src/main/java/com/spun/util/ConfigXMLFileWriter.java +++ /dev/null @@ -1,102 +0,0 @@ -package com.spun.util; - -import java.io.DataOutputStream; -import java.io.FileOutputStream; -import java.lang.reflect.Field; -import java.util.Arrays; -import java.util.List; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.transform.OutputKeys; -import javax.xml.transform.Transformer; -import javax.xml.transform.TransformerFactory; -import javax.xml.transform.dom.DOMSource; -import javax.xml.transform.stream.StreamResult; - -import org.lambda.functions.implementations.F1; -import org.lambda.functions.implementations.S1; -import org.lambda.query.Query; -import org.w3c.dom.Document; -import org.w3c.dom.Element; - -/** - * A static class of convenience functions for database access - **/ -public class ConfigXMLFileWriter -{ - /************************************************************************/ - public static void writeToFile(Class clazz, String fileName, String exclude[]) throws Exception - { - Document domDocument = createDocument(); - Field fields[] = getFields(clazz, exclude); - for (int i = 0; i < fields.length; i++) - { - addLine(fields[i], domDocument); - } - writeToIndentedXMLFile(fileName, domDocument); - } - /***********************************************************************/ - private static void addLine(Field field, Document domDocument) - { - Element elem = domDocument.createElement(field.getName()); - if (field.getType().isArray()) - { - Element inner = domDocument.createElement("VALUE"); - inner.appendChild(domDocument.createTextNode(" ")); - elem.appendChild(inner); - inner = domDocument.createElement("VALUE"); - inner.appendChild(domDocument.createTextNode(" ")); - elem.appendChild(inner); - } - else - { - elem.appendChild(domDocument.createTextNode(" ")); - } - domDocument.getDocumentElement().appendChild(elem); - } - /***********************************************************************/ - public static Field[] getFields(Class clazz, String... exclude) - { - Field fields[] = clazz.getFields(); - Field a = fields[0]; - final List excludeNames = Arrays.asList(exclude); - F1 selector = new F1(a, excludeNames) - { - { - ret(ClassUtils.IsPublicStatic(a) && ClassUtils.isPrimitiveField(a) && !excludeNames.contains(a.getName())); - } - }; - fields = Query.where(fields, selector).toArray(new Field[0]); - return Query.orderBy(fields, new S1(a) - { - { - ret(a.getName()); - } - }); - } - /***********************************************************************/ - private static Document createDocument() throws Exception - { - DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); - documentBuilderFactory.setNamespaceAware(false); - documentBuilderFactory.setIgnoringElementContentWhitespace(true); - DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); - return documentBuilder.getDOMImplementation().createDocument("", "XML", null); - } - /***********************************************************************/ - public static void writeToIndentedXMLFile(String configFile, Document domDocument) throws Exception - { - DataOutputStream out = new DataOutputStream(new FileOutputStream(configFile)); - TransformerFactory tFactory = TransformerFactory.newInstance(); - Transformer transformer = tFactory.newTransformer(); - DOMSource source = new DOMSource(domDocument); - StreamResult result = new StreamResult(out); - transformer.setOutputProperty(OutputKeys.INDENT, "yes"); - transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); - transformer.transform(source, result); - out.close(); - } - /************************************************************************/ - /************************************************************************/ -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/ConfigXMLNodeExtractor.java b/src/main/java/com/spun/util/ConfigXMLNodeExtractor.java deleted file mode 100644 index 06c71af..0000000 --- a/src/main/java/com/spun/util/ConfigXMLNodeExtractor.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.spun.util; - -import java.util.ArrayList; -import java.util.HashMap; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; - -import com.spun.util.io.XMLNodeExtractor; - -public class ConfigXMLNodeExtractor implements XMLNodeExtractor -{ - /***********************************************************************/ - public void extractProperty(Node node, HashMap properties) - { - //String name = node.getNodeName(); - if (XMLNodeExtractor.Utils.extractSingleton(node, properties)) - { - // do nothing - } - else if (node.getChildNodes().getLength() > 0) - { - NodeList childNodes = node.getChildNodes(); - ArrayList v = new ArrayList(); - for (int i = 0; i < childNodes.getLength(); i++) - { - if (childNodes.item(i).getNodeName().equals("VALUE")) - { - v.add(StringUtils.loadNullableString(childNodes.item(i).getChildNodes().item(0).getNodeValue())); - } - } - properties.put(node.getNodeName(), StringUtils.toArray(v)); - } - } - /***********************************************************************/ - /***********************************************************************/ -} diff --git a/src/main/java/com/spun/util/Country.java b/src/main/java/com/spun/util/Country.java deleted file mode 100644 index 12145e2..0000000 --- a/src/main/java/com/spun/util/Country.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.spun.util; - - -public enum Country { - Albania, Algeria, AmericanSamoa("American Samoa"), Andorra, Angola, Anguilla, AntiguaAndBarbuda("Antigua & Barbuda"), Argentina, Armenia, Aruba, Australia, Austria, Azerbaijan, Azores, Bahamas, Bahrain, Bangladesh, Barbados, Belarus, Belgium, Belize, Benin, Bermuda, Bolivia, Bonaire, Bosnia, Botswana, Brazil, BritishVirginIsles( - "British Virgin Isles"), Brunei, Bulgaria, BurkinaFaso("Burkina Faso"), Burundi, Cambodia, Cameroon, Canada, CanaryIslands("Canary Islands"), CapeVerde( - "Cape Verde"), CaymanIslands("Cayman Islands"), CentralAfricanRepublic("Central African Republic"), Chad, ChannelIslands("Channel Islands"), Chile, Colombia, CookIslands( - "Cook Islands"), CostaRica("Costa Rica"), CotedIvoire("Cote d' Ivoire"), Croatia, Cuba, Curacao, Cyprus, CzechRepublic("Czech Republic"), DemRepublicofCongo( - "Dem. Republic of Congo"), Denmark, Djibouti, Dominica, DominicanRepublic("Dominican Republic"), Ecuador, Egypt, ElSalvador("El Salvador"), England, EquatorialGuinea( - "Equatorial Guinea"), Eritrea, Estonia, Ethiopia, FaeroeIslands("Faeroe Islands"), Fiji, Finland, France, FrenchGuiana("French Guiana"), FrenchPolynesia( - "French Polynesia"), Gabon, Gambia, Georgia, Germany, Ghana, Gibraltar, Greece, Greenland, Grenada, Guadeloupe, Guam, Guatemala, Guinea, GuineaBissau( - "Guinea-Bissau"), Guyana, Haiti, Holland, Honduras, HongKong("Hong Kong"), Hungary, Iceland, India, Indonesia, Iran, Iraq, Israel, Italy, Jamaica, Japan, Jordan, Kazakhstan, Kenya, Kiribati, Kosrae, Kuwait, Kyrgyzstan, Laos, Latvia, Lebanon, Lesotho, Liberia, Libya, Liechtenstein, Lithuania, Luxembourg, Macau, Macedonia, Madagascar, Madeira, Malawi, Malaysia, Maldives, Mali, Malta, MarshallIslands( - "Marshall Islands"), Martinique, Mauritania, Mauritius, Mexico, Micronesia, Moldova, Monaco, Mongolia, Montserrat, Morocco, Mozambique, Myanmar, NMarianaIslands( - "N. Mariana Islands"), Namibia, Nepal, Netherlands, NetherlandsAntilles("Netherlands Antilles"), NewCaledonia("New Caledonia"), NewZealand( - "New Zealand"), Nicaragua, Niger, Nigeria, NorfolkIsland("Norfolk Island"), NorthKorea("North Korea"), NorthernIreland("Northern Ireland"), Norway, Oman, Pakistan, Palau, Panama, PapuaNewGuinea( - "Papua New Guinea"), Paraguay, PeoplesRepublicofChina("Peoples Republic of China"), Peru, Philippines, Poland, Ponape, Portugal, PuertoRico( - "Puerto Rico"), Qatar, RepublicofCongo("Republic of Congo"), RepublicofIreland("Republic of Ireland"), RepublicofYemen("Republic of Yemen"), Reunion, Romania, Rota, Russia, Rwanda, Saba, Saipan, SanMarino( - "San Marino"), SaudiArabia("Saudi Arabia"), Scotland, Senegal, Seychelles, SierraLeone("Sierra Leone"), Singapore, Slovakia, Slovenia, SolomonIslands( - "Solomon Islands"), SouthAfrica("South Africa"), SouthKorea("South Korea"), Spain, SriLanka("Sri Lanka"), StVincentGrenadine( - "St Vincent/Grenadine"), StBarthelemy("St. Barthelemy"), StChristopher("St. Christopher"), StCroix("St. Croix"), StEustatius("St. Eustatius"), StJohn( - "St. John"), StKittsAndNevis("St. Kitts & Nevis"), StLucia("St. Lucia"), StMaarten("St. Maarten"), StMartin("St. Martin"), StThomas( - "St. Thomas"), Sudan, Suriname, Swaziland, Sweden, Switzerland, Syria, Tahiti, Taiwan, Tajikistan, Tanzania, Thailand, Tinian, Togo, Tonga, Tortola, TrinidadAndTobago( - "Trinidad & Tobago"), Truk, Tunisia, Turkey, Turkmenistan, TurksAndCaicosIsles("Turks & Caicos Isles"), Tuvalu, Uganda, Ukraine, UnionIsland( - "Union Island"), UnitedArabEmirates("United Arab Emirates"), UnitedKingdom("United Kingdom"), UnitedStates("United States"), Uruguay, USVirginIslands( - "US Virgin Islands"), Uzbekistan, Vanuatu, VaticanCityState("Vatican City State"), Venezuela, Vietnam, VirginGorda("Virgin Gorda"), WakeIsland( - "Wake Island"), Wales, WallisAndFutunaIsle("Wallis & Futuna Isle"), WesternSamoa("Western Samoa"), Yap, Yugoslavia, Zambia, Zimbabwe; - String altText = null; - private Country() - { - } - private Country(String altText) - { - this.altText = altText; - } - public String toString() - { - return altText == null ? super.toString() : altText; - } - private static String[] names = null; - public synchronized static String[] getStringValues() - { - if (names == null) - { - names = (String[]) ObjectUtils.extractArray(Country.values(),"toString"); - } - return names; - } -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/NumberUtils.java b/src/main/java/com/spun/util/NumberUtils.java index a5a856d..aff20f8 100644 --- a/src/main/java/com/spun/util/NumberUtils.java +++ b/src/main/java/com/spun/util/NumberUtils.java @@ -1,247 +1,206 @@ package com.spun.util; import java.io.Serializable; -import java.lang.reflect.Array; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; import java.util.Random; /** * A static class of convenience functions for Manipulating numbers **/ -public class NumberUtils -{ - public static Random RANDOM = new Random(); - /***********************************************************************/ - public static int getMax(int value1, int value2) - { - return value1 > value2 ? value1 : value2; - } - /***********************************************************************/ - /** - * Loads an int from a String. - **/ - public static int load(String i, int defaultValue) - { - return load(i, defaultValue, true); - } - /***********************************************************************/ - /** - * Loads an int from a String. - **/ - public static int load(String i, int defaultValue, boolean stripNonNumeric) - { - try - { - i = stripNonNumeric ? StringUtils.stripNonNumeric(i, true, true) : i; - defaultValue = Integer.parseInt(i); - } - catch (Exception e) - {} - return defaultValue; - } - /***********************************************************************/ - /** - * Loads an int from a String. - **/ - public static long load(String i, long defaultValue) - { - try - { - defaultValue = Long.parseLong(i); - } - catch (Exception e) - {} - return defaultValue; - } - /***********************************************************************/ - /** +public class NumberUtils { + public static Random RANDOM = new Random(); + + /***********************************************************************/ + public static int getMax(int value1, int value2) { + return value1 > value2 ? value1 : value2; + } + + /***********************************************************************/ + /** + * Loads an int from a String. + **/ + public static int load(String i, int defaultValue) { + return load(i, defaultValue, true); + } + + /***********************************************************************/ + /** + * Loads an int from a String. + **/ + public static int load(String i, int defaultValue, boolean stripNonNumeric) { + try { + i = stripNonNumeric ? StringUtils.stripNonNumeric(i, true, true) + : i; + defaultValue = Integer.parseInt(i); + } catch (Exception e) { + } + return defaultValue; + } + + /***********************************************************************/ + /** + * Loads an int from a String. + **/ + public static long load(String i, long defaultValue) { + try { + defaultValue = Long.parseLong(i); + } catch (Exception e) { + } + return defaultValue; + } + + /***********************************************************************/ + /** * **/ - public static double load(String i, double defaultValue) - { - try - { - i = StringUtils.stripNonNumeric(i, true, true); - defaultValue = Double.parseDouble(i); - } - catch (Exception e) - {} - return defaultValue; - } - /***********************************************************************/ - public static boolean load(String i, boolean d) - { - return (i == null) ? d : "true".equalsIgnoreCase(i); - } - /***********************************************************************/ - public static int[] loadArray(String summaryString, String seperator, int defaultWhenLoading) - { - String parts[] = StringUtils.split(summaryString, seperator); - int integers[] = new int[parts.length]; - for (int i = 0; i < parts.length; i++) - { - integers[i] = load(parts[i], defaultWhenLoading); - } - return integers; - } - /************************************************************************/ - public static double setSignificantDigit(double onNumber, int digit) - { - double power = Math.pow(10, digit); - onNumber = onNumber * power; - onNumber = Math.round(onNumber); - onNumber = onNumber / power; - return onNumber; - } - /************************************************************************/ - /** - * a unit test of sorts :-) - **/ - public static void main(String args[]) - { - Random r = new Random(); - for (int i = 0; i < 20; i++) - { - double d = r.nextDouble(); - int s = r.nextInt(5); - MySystem.event(d + " , " + s + " -> " + setSignificantDigit(d, s)); - } - } - /***********************************************************************/ - public static boolean doRandomPercentage(int i) - { - return RANDOM.nextInt(100) < i; - } - /***********************************************************************/ - public static boolean equals(double one, double two, double delta) - { - double actualDelta = one - two; - return (-delta < actualDelta) && (actualDelta < delta); - } - /***********************************************************************/ - public static Integer[] wrapIntegers(int[] ints) - { - Integer[] integers = new Integer[ints.length]; - for (int i = 0; i < ints.length; i++) - { - integers[i] = ints[i]; - } - return integers; - } - /***********************************************************************/ - public static String createRandomStringOfNumbers(int digits) - { - StringBuffer buffer = new StringBuffer(digits); - for (int i = 0; i < digits; i++) - { - buffer.append(RANDOM.nextInt(10)); - } - return buffer.toString(); - } - /***********************************************************************/ - public static boolean isIn(int check, int[] available) - { - for (int i = 0; i < available.length; i++) - { - if (check == available[i]) { return true; } - } - return false; - } - - /***********************************************************************/ - public static boolean isEven(int number) - { - return ((number % 2) == 0); - } - - /***********************************************************************/ - public static T[] getShuffled(T[] objects, int numberToReturn) - { - Shuffler[] shuffles = new Shuffler[objects.length]; - for (int i = 0; i < objects.length; i++) - { - shuffles[i] = new Shuffler(i); - } - Arrays.sort(shuffles, new Shuffler(0)); - ArrayList list = new ArrayList(numberToReturn); - for (int i = 0; i < numberToReturn; i++) - { - list.add(objects[shuffles[i].oldPosition]); - } - Object[] objects2 = null; - try - { - objects2 = (Object[]) Array.newInstance(objects.getClass().getComponentType(), numberToReturn); - } - catch (Exception e) - { - MySystem.warning(e); - objects2 = new Object[numberToReturn]; - } - return (T[]) list.toArray(objects2); - } - /***********************************************************************/ - /** - * randomly chooses a number between the minimum and maximum - *
Example: {@code int grade = NumberUtils.getRandomInt(1,100);}
- * - * @param minimum - * The lowest possible value (inclusive) - * @param maximum - * The highest possible value (inclusive) - * @return the random number - */ - public static int getRandomInt(int minimum, int maximum) - { - int diff = maximum - minimum; - if (diff == 0) - { - return maximum; - } - else - { - return RANDOM.nextInt(diff) + minimum; - } - } - /***********************************************************************/ - public static int floor(double i) - { - return (int) Math.floor(i); - } - /***********************************************************************/ - public static int getNumberOfDigits(int number) - { - return ("" + number).length(); - } - /***********************************************************************/ - public static double convertDoubleToPercentage(double doub) - { - return doub * 100; - } - /***********************************************************************/ - public static double convertPercentageToDouble(double percent) - { - return percent / 100; - } - /***********************************************************************/ - /* INNER CLASS */ - /***********************************************************************/ - public static class Shuffler implements java.util.Comparator, Serializable - { - public int oldPosition = 0; - public int newPosition = 0; - public Shuffler(int oldPosition) - { - this.oldPosition = oldPosition; - this.newPosition = RANDOM.nextInt(); - } - public int compare(Shuffler s1, Shuffler s2) - { - return Double.compare(s1.newPosition, (s2).newPosition); - } - } - /***********************************************************************/ + public static double load(String i, double defaultValue) { + try { + i = StringUtils.stripNonNumeric(i, true, true); + defaultValue = Double.parseDouble(i); + } catch (Exception e) { + } + return defaultValue; + } + + /***********************************************************************/ + public static boolean load(String i, boolean d) { + return (i == null) ? d : "true".equalsIgnoreCase(i); + } + + /***********************************************************************/ + public static int[] loadArray(String summaryString, String seperator, + int defaultWhenLoading) { + String parts[] = StringUtils.split(summaryString, seperator); + int integers[] = new int[parts.length]; + for (int i = 0; i < parts.length; i++) { + integers[i] = load(parts[i], defaultWhenLoading); + } + return integers; + } + + /************************************************************************/ + public static double setSignificantDigit(double onNumber, int digit) { + double power = Math.pow(10, digit); + onNumber = onNumber * power; + onNumber = Math.round(onNumber); + onNumber = onNumber / power; + return onNumber; + } + + /************************************************************************/ + /** + * a unit test of sorts :-) + **/ + public static void main(String args[]) { + Random r = new Random(); + for (int i = 0; i < 20; i++) { + double d = r.nextDouble(); + int s = r.nextInt(5); + MySystem.event(d + " , " + s + " -> " + setSignificantDigit(d, s)); + } + } + + /***********************************************************************/ + public static boolean doRandomPercentage(int i) { + return RANDOM.nextInt(100) < i; + } + + /***********************************************************************/ + public static boolean equals(double one, double two, double delta) { + double actualDelta = one - two; + return (-delta < actualDelta) && (actualDelta < delta); + } + + /***********************************************************************/ + public static Integer[] wrapIntegers(int[] ints) { + Integer[] integers = new Integer[ints.length]; + for (int i = 0; i < ints.length; i++) { + integers[i] = ints[i]; + } + return integers; + } + + /***********************************************************************/ + public static String createRandomStringOfNumbers(int digits) { + StringBuffer buffer = new StringBuffer(digits); + for (int i = 0; i < digits; i++) { + buffer.append(RANDOM.nextInt(10)); + } + return buffer.toString(); + } + + /***********************************************************************/ + public static boolean isIn(int check, int[] available) { + for (int i = 0; i < available.length; i++) { + if (check == available[i]) { + return true; + } + } + return false; + } + + /***********************************************************************/ + public static boolean isEven(int number) { + return ((number % 2) == 0); + } + + /***********************************************************************/ + /** + * randomly chooses a number between the minimum and maximum + *
Example: + * {@code int grade = NumberUtils.getRandomInt(1,100);}
+ * + * @param minimum + * The lowest possible value (inclusive) + * @param maximum + * The highest possible value (inclusive) + * @return the random number + */ + public static int getRandomInt(int minimum, int maximum) { + int diff = maximum - minimum; + if (diff == 0) { + return maximum; + } else { + return RANDOM.nextInt(diff) + minimum; + } + } + + /***********************************************************************/ + public static int floor(double i) { + return (int) Math.floor(i); + } + + /***********************************************************************/ + public static int getNumberOfDigits(int number) { + return ("" + number).length(); + } + + /***********************************************************************/ + public static double convertDoubleToPercentage(double doub) { + return doub * 100; + } + + /***********************************************************************/ + public static double convertPercentageToDouble(double percent) { + return percent / 100; + } + + /***********************************************************************/ + /* INNER CLASS */ + /***********************************************************************/ + public static class Shuffler implements java.util.Comparator, + Serializable { + private static final long serialVersionUID = -466404450070994039L; + public int oldPosition = 0; + public int newPosition = 0; + + public Shuffler(int oldPosition) { + this.oldPosition = oldPosition; + this.newPosition = RANDOM.nextInt(); + } + + public int compare(Shuffler s1, Shuffler s2) { + return Double.compare(s1.newPosition, (s2).newPosition); + } + } + /***********************************************************************/ } \ No newline at end of file diff --git a/src/main/java/com/spun/util/PhoneNumber.java b/src/main/java/com/spun/util/PhoneNumber.java deleted file mode 100644 index 49841f9..0000000 --- a/src/main/java/com/spun/util/PhoneNumber.java +++ /dev/null @@ -1,259 +0,0 @@ -package com.spun.util; - - -/** - * Phone number validation, and formatter. - * this class is immutable. - **/ -public class PhoneNumber -{ - public static final int USA = 0; - public static final String[] COUNTRY_CODES = { - "1", "20", "212", "213", "216", "218", "220", "221", "222", "223", - "224", "225", "226", "227", "228", "229", "230", "231", "232", "233", - "234", "235", "236", "237", "238", "239", "240", "241", "242", "243", - "244", "245", "246", "247", "248", "249", "250", "251", "252", "253", - "254", "255", "256", "257", "258", "260", "261", "262", "263", "264", - "265", "266", "267", "268", "269", "27", "290", "291", "297", "298", - "299", "30", "31", "32", "33", "34", "350", "351", "352", "353", - "354", "355", "356", "357", "358", "359", "36", "370", "371", "372", - "373", "374", "375", "376", "377", "378", "380", "381", "385", "386", - "387", "389", "39", "40", "41", "420", "421", "423", "43", "44", - "45", "46", "47", "48", "49", "500", "501", "502", "503", "504", - "505", "506", "507", "508", "509", "51", "52", "53", "5399", "54", - "55", "56", "57", "58", "590", "591", "592", "593", "594", "595", - "596", "597", "598", "599", "60", "61", "618", "62", "63", "64", - "65", "66", "670", "672", "673", "674", "675", "676", "677", "678", - "679", "680", "681", "682", "683", "684", "685", "686", "687", "688", - "689", "690", "691", "692", "7", "808", "81", "82", "84", "850", - "852", "853", "855", "856", "86", "870", "871", "872", "873", "874", - "878", "880", "881", "8816", "8817", "88213", "88216", "886", "90", "91", - "92", "93", "94", "95", "960", "961", "962", "963", "964", "965", - "966", "967", "968", "970", "971", "972", "973", "974", "975", "976", - "977", "98", "992", "993", "994", "995", "996", "998"}; - - private static final String REASONS[] = {"Phone Number Too Long or Too Short", "US Number must be length 10", "Unknown Country Code"}; - - /** The original value. */ - private String originalValue = null; - private int countryCode = USA; - private String strippedValue = null; - private String invalidReason = null; - private int nonValidCountryCode = 0; - public PhoneNumber(String originalValue) - { - originalValue = StringUtils.loadNullableString(originalValue); - this.originalValue = originalValue; - if (this.originalValue == null) { return; } - this.strippedValue = stripPhoneNumber(this.originalValue); - this.countryCode = getCountryCode(strippedValue); - this.invalidReason = validate(countryCode, strippedValue); - if (invalidReason != null) - { - nonValidCountryCode = countryCode; - countryCode = -1; - } - } - /**************************************************************************/ - private static String stripPhoneNumber(String number) - { - if (number == null) {return null;} - boolean xAppended = false; - StringBuffer result = new StringBuffer(); - for(int i = 0; i< number.length(); i++) - { - char c = number.charAt(i); - switch (c) - { - case '0' : - case '1' : - case '2' : - case '3' : - case '4' : - case '5' : - case '6' : - case '7' : - case '8' : - case '9' : result.append(c); break; - case '+' : if (result.length() == 0){result.append(c);} break; - case 'X': - case 'x': { - if (! xAppended) - { - result.append('x'); - xAppended = true; - } - break; - } - default : break; - } - } - - char c = result.length() == 0 ? ' ' : result.charAt(0); - switch (c) - { - case '+': break; // do nothing - case '1': result.insert(0, "+"); break; // insert a 1 - default: result.insert(0, "+1"); // if neither insert a +1 - } - - return result.toString(); - } - /**************************************************************************/ - private static int getCountryCode(String strippedNumber) - { - String alt = strippedNumber.substring(1); - for (int i = 0; i < COUNTRY_CODES.length; i++) - { - String code = COUNTRY_CODES[i]; - if (alt.startsWith(code)) { return i; } - } - return -1; - } - /**************************************************************************/ - private static String validate(int countryCode, String stripedNumber) - { - return (countryCode == USA) ? validateNorthAmerican(countryCode, stripedNumber) : validateInternational(countryCode, stripedNumber); - } - /**************************************************************************/ - private static String validateInternational(int countryCode, String strippedNumber) - { - if (countryCode == -1) - return "Invalid country code"; - String body = extractPhoneBody(countryCode, strippedNumber); - String prefix = COUNTRY_CODES[countryCode]; - int nl = prefix.length() + body.length(); - return (nl > 15) || (nl < 9) ? REASONS[0] : null; - } - /**************************************************************************/ - private static String validateNorthAmerican(int countryCode, String strippedNumber) - { - if (countryCode != USA) - return "Invalid country code"; - String body = extractPhoneBody(countryCode, strippedNumber); - return (body.length() != 10) ? REASONS[0] : null; - } - /**************************************************************************/ - private static String extractPhoneBody(int countryCode, String strippedNumber) - { - if (countryCode == -1) - throw new IllegalArgumentException("Invalid country code"); - String prefix = "+" + COUNTRY_CODES[countryCode]; - String body = strippedNumber.substring(prefix.length()); - int indexOfExt = body.indexOf('x'); - if (indexOfExt > -1) - { - body = body.substring(0, indexOfExt); - } - return body; - } - /**************************************************************************/ - public String getValue() - { - if (isValid() && strippedValue != null) - { - return (isNorthAmericanNumber()) ? getValueAsNorthAmerican() : getValueAsInternational(); - } - else - { - return originalValue; - } - } - /**************************************************************************/ - public String getValueAsUps() - { - return getValueAsUps(countryCode, this.strippedValue); - } - /**************************************************************************/ - private static String getValueAsUps(int countryCode, String strippedNumber) - { - if (strippedNumber == null) { return null; } - if (countryCode < 0) { throw new IllegalArgumentException("# '" + strippedNumber + "' is not an international number"); } - String body = extractPhoneBody(countryCode, strippedNumber); - String prefix = COUNTRY_CODES[countryCode]; - if (countryCode == USA) - { - return body; - } - else - { - return prefix + body; - } - } - /**************************************************************************/ - private static String getValueAsNorthAmerican(int countryCode, String stripped) - { - if (countryCode != USA) - throw new IllegalArgumentException("# '" + stripped + "' is not a NorthAmerican number"); - StringBuffer number = new StringBuffer(stripped.substring(2)); - number.insert(6, "-"); - number.insert(3, ")"); - number.insert(0, "("); - return number.toString(); - } - /**************************************************************************/ - private static String getValueAsInternational(int countryCode, String stripped) - { - if (stripped == null) { return null; } - if (countryCode < USA) { throw new IllegalArgumentException("# '" + stripped + "' is not an international number"); } - StringBuffer number = new StringBuffer(stripped); - int intlLength = COUNTRY_CODES[countryCode].length() + 1; - int bodyLength = extractPhoneBody(countryCode, stripped).length(); - if (bodyLength > 6) - { - number.insert(intlLength + 6, "."); - } - if (bodyLength > 3) - { - number.insert(intlLength + 3, "."); - } - number.insert(intlLength, "."); - return number.toString(); - } - /**************************************************************************/ - public String getValueAsNorthAmerican() - { - return getValueAsNorthAmerican(this.countryCode, this.strippedValue); - } - /**************************************************************************/ - public String getValueAsInternational() - { - return getValueAsInternational(this.countryCode, this.strippedValue); - } - /**************************************************************************/ - public String getPartiallyFormattedAsInternational() - { - return getValueAsInternational(this.nonValidCountryCode, this.strippedValue); - } - /**************************************************************************/ - public boolean isValid() - { - return (this.invalidReason == null); - } - /**************************************************************************/ - public String getInvalidReason() - { - return this.invalidReason; - } - /**************************************************************************/ - public boolean isNorthAmericanNumber() - { - return this.countryCode == USA; - } - /**************************************************************************/ - public String getOriginalText() - { - return originalValue; - } - /**************************************************************************/ - public String toString() - { - return getValue(); - } - /**************************************************************************/ - /**************************************************************************/ - public Country getCountry() - { - return Country.UnitedStates; - } -} diff --git a/src/main/java/com/spun/util/State.java b/src/main/java/com/spun/util/State.java deleted file mode 100644 index 37e64d7..0000000 --- a/src/main/java/com/spun/util/State.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.spun.util; - -public enum State { - Alabama("AL"), Alaska("AK"), Arizona("AZ"), Arkansas("AR"), California("CA"), Colorado("CO"), Connecticut("CT"), - Delaware("DE"), DistrictOfColumbia("Washington D.C.", "DC"), Florida("FL"), Georgia("GA"), Hawaii("HI"), - Idaho("ID"), Illinois("IL"), Indiana("IN"), Iowa("IA"), Kansas("KS"), Kentucky("KY"), Louisiana("LA"), - Maine("ME"), Maryland("MD"), Massachusetts("MA"), Michigan("MI"), Minnesota("MN"), Mississippi("MS"), - Missouri("MO"), Montana("MT"), Nebraska("NE"), Nevada("NV"), NewHampshire("New Hampshire", "NH"), - NewJersey("New Jersey", "NJ"), NewMexico("New Mexico", "NM"), NewYork("New York", "NY"), - NorthCarolina("North Carolina", "NC"), NorthDakota("North Dakota", "ND"), Ohio("OH"), Oklahoma("OK"), - Oregon("OR"), Pennsylvania("PA"), RhodeIsland("Rhode Island", "RI"), SouthCarolina("South Carolina", "SC"), - SouthDakota("South Dakota", "SD"), Tennessee("TN"), Texas("TX"), Utah("UT"), Vermont("VT"), Virginia("VA"), - Washington("WA"), WestVirginia("West Virginia", "WV"), Wisconsin("WI"), Wyoming("WY"); - String altText = null; - public String abbreviation = null; - /************************************************************************/ - private State(String abbreviation) - { - this.abbreviation = abbreviation; - } - /************************************************************************/ - private State(String altText, String abbreviation) - { - this.altText = altText; - this.abbreviation = abbreviation; - } - /************************************************************************/ - @Override - public String toString() - { - return altText == null ? super.toString() : altText; - } - /************************************************************************/ - public static String toStandardText(String state) - { - // needs to return the corresponding abbreviation or, if not found, return what was passed in - for (State s : State.values()) - { - if (s.toString().equalsIgnoreCase(state) || s.abbreviation.equalsIgnoreCase(state)) { return s.abbreviation; } - } - return state; - } - /************************************************************************/ - public static String[] getStateAbbreviations() - { - State[] allStates = State.values(); - String[] abbreviations = new String[allStates.length]; - for (int i = 0; i < allStates.length; i++) - { - abbreviations[i] = allStates[i].abbreviation; - } - return abbreviations; - } - /************************************************************************/ - public static boolean isStateAbbreviation(String text) - { - for (State s : values()) - { - if (s.getAbbreviation().equalsIgnoreCase(text)) { return true; } - } - return false; - } - /************************************************************************/ - private static String[] names = null; - /************************************************************************/ - public static synchronized String[] getStringValues() - { - if (names == null) - { - names = (String[]) ObjectUtils.extractArray(State.values(), "toString"); - } - return names; - } - /************************************************************************/ - public String getAbbreviation() - { - return abbreviation; - } - /************************************************************************/ - /************************************************************************/ -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/StringUtils.java b/src/main/java/com/spun/util/StringUtils.java index 36b609b..7ab13c2 100644 --- a/src/main/java/com/spun/util/StringUtils.java +++ b/src/main/java/com/spun/util/StringUtils.java @@ -3,16 +3,11 @@ import java.io.ByteArrayInputStream; import java.io.InputStream; import java.io.UnsupportedEncodingException; -import java.lang.reflect.Field; import java.util.Arrays; -import java.util.List; import java.util.Map; import java.util.Properties; import java.util.Vector; -import org.lambda.functions.implementations.F1; -import org.lambda.query.Query; - /** * A static class of convenience functions for database access **/ @@ -432,25 +427,25 @@ public static void assertIn(String target, boolean allowNulls, String... options { assertIn(target, options, allowNulls); } - /***********************************************************************/ - public static String convertEnumeration(final Object forValue, Class clazz) throws Exception - { - F1 f1 = new F1(null, forValue) - { - { - ret(ClassUtils.IsPublicStatic(a) && a.get(null).equals(forValue)); - } - }; - List fields = Query.where(clazz.getFields(), f1); - if (fields.isEmpty()) - { - return "unknown Type " + forValue; - } - else - { - return fields.get(0).getName(); - } - } +// /***********************************************************************/ +// public static String convertEnumeration(final Object forValue, Class clazz) throws Exception +// { +// F1 f1 = new F1(null, forValue) +// { +// { +// ret(ClassUtils.IsPublicStatic(a) && a.get(null).equals(forValue)); +// } +// }; +// List fields = Query.where(clazz.getFields(), f1); +// if (fields.isEmpty()) +// { +// return "unknown Type " + forValue; +// } +// else +// { +// return fields.get(0).getName(); +// } +// } /************************************************************************/ /** * 'Tom S Hardy' -> 'Tom S' - 'Hardy' diff --git a/src/main/java/com/spun/util/database/SQLUtils.java b/src/main/java/com/spun/util/database/SQLUtils.java deleted file mode 100644 index e8364c0..0000000 --- a/src/main/java/com/spun/util/database/SQLUtils.java +++ /dev/null @@ -1,145 +0,0 @@ -package com.spun.util.database; - -import java.sql.ResultSet; -import java.sql.SQLException; -import com.spun.util.DatabaseUtils; -import com.spun.util.ObjectUtils; - -public class SQLUtils -{ - /***********************************************************************/ - public static String createInSQLStatement(DatabaseObject from[]) - { - from = (from == null) ? new DatabaseObject[0] : from; - Integer[] array = new Integer[from.length]; - for (int i = 0; i < from.length; i++) - { - array[i] = from[i].getPkey(); - } - return createInSQLStatement((Object[]) array); - } - /***********************************************************************/ - public static String createInSQLStatement(String values[]) - { - return createInSQLStatement((Object[]) values); - } - /***********************************************************************/ - public static String createInSQLStatement(Object values[]) - { - if (values == null || values.length == 0) { return "(null)"; } - StringBuffer sql = new StringBuffer("("); - for (int i = 0; i < values.length; i++) - { - sql.append(DatabaseUtils.formatNullableObject(values[i])); - sql.append(", "); - } - sql.setLength(sql.length() - 2); - sql.append(") "); - return sql.toString(); - } - /***********************************************************************/ - /** - * Done via Reflection. - * They should all be the same Type of object! - * And the method signature should have empty arguments! - **/ - public static String createInSQLStatement(Object from[], String methodName) - { - Object[] array = ObjectUtils.extractArray(from, methodName); - return createInSQLStatement(array); - } - /***********************************************************************/ - public static String loadInSQLStatement(ResultSet rs) throws SQLException - { - StringBuffer sql = new StringBuffer("("); - while (rs.next()) - { - sql.append(DatabaseUtils.formatNullableObject(rs.getObject(1))); - sql.append(", "); - } - if (sql.length() == 1) { return null; } - sql.setLength(sql.length() - 2); - sql.append(") "); - return sql.toString(); - } - /***********************************************************************/ - public static String createSQLBetween(String lowerValue, String betweenVariable, String upperValue) - { - return "(" + DatabaseUtils.formatNullableObject(lowerValue) + " <= " + betweenVariable + " AND " + betweenVariable + " < " + DatabaseUtils.formatNullableObject(upperValue) + ")"; - } - /***********************************************************************/ - public static String compareBy(ColumnMetadata metadata, String alias, String compareBy, Object value) - { - String sql = null; - if (value == null && "=".equals(compareBy)) - { - sql = metadata.getNameWithPrefix(alias) + " IS NULL"; - } - else if (value == null && "!=".equals(compareBy)) - { - sql = metadata.getNameWithPrefix(alias) + " IS NOT NULL"; - } - else - { - sql = metadata.getNameWithPrefix(alias) + " " + compareBy + " " + DatabaseUtils.formatNullableObject(value); - } - return sql; - } - /***********************************************************************/ - public static String compareBy(ColumnMetadata metadata, String alias, String compareBy, boolean value) - { - return metadata.getNameWithPrefix(alias) + " " + compareBy + " " + DatabaseUtils.formatBoolean(value); - } - /***********************************************************************/ - public static String compareByEquals(ColumnMetadata metadata, String alias, Object value) - { - return compareBy(metadata, alias, "=", value); - } - /***********************************************************************/ - public static String createInSQLStatement(ColumnMetadata metadata, String alias, Object[] values) - { - return createInSQLStatement(metadata, alias, false, values); - } - /***********************************************************************/ - public static String createInSQLStatement(ColumnMetadata metadata, String alias, boolean not, Object[] values) - { - String sql = null; - String in = not ? " NOT IN " : " IN "; - if (values == null) - { - sql = compareBy(metadata, alias,not ? "!=" : "=", null); - } - else if (values.length == 1) - { - sql = compareBy(metadata, alias,not ? "!=" : "=", values[0]); - } - else if (values instanceof DatabaseObject[]) - { - sql = metadata.getNameWithPrefix(alias) + in + createInSQLStatement((DatabaseObject[]) values); - } -// else if (values.length < 5) -// { -// return createOrOptimizedInSqlStatement(metadata, alias, not, values); -// } - else - { - sql = metadata.getNameWithPrefix(alias) + in + createInSQLStatement(values); - } - return sql; - } - /***********************************************************************/ - private static String createOrOptimizedInSqlStatement(ColumnMetadata metadata, String alias, boolean not, Object[] values) - { - StringBuffer buffer = new StringBuffer("("); - String compare = not ? "!=" : "="; - for (int i = 0; i < values.length; i++) - { - buffer.append(compareBy(metadata, alias,compare, values[i])).append(" OR "); - } - buffer.setLength(buffer.length() - 4); - buffer.append(")"); - return buffer.toString(); - } - /***********************************************************************/ - /***********************************************************************/ -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/database/XmlDatabaseMapExtractor.java b/src/main/java/com/spun/util/database/XmlDatabaseMapExtractor.java deleted file mode 100644 index 1a60d40..0000000 --- a/src/main/java/com/spun/util/database/XmlDatabaseMapExtractor.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.spun.util.database; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import org.w3c.dom.Node; -import com.spun.util.ObjectUtils; -import com.spun.util.io.xml.XmlExtractable; -import com.spun.util.io.xml.XmlExtractor; -import com.spun.util.io.xml.XmlExtractorUtil; -import com.spun.util.io.xml.XmlMap; -import com.spun.util.io.xml.XmlMapTranslator; -import com.spun.util.io.xml.XmlTranslator; - -/***********************************************************************/ -public class XmlDatabaseMapExtractor implements XmlExtractor -{ - private Class clazz; - private XmlTranslator translator; - private Method creator = null; - /***********************************************************************/ - public XmlDatabaseMapExtractor(Class clazz) - { - this.clazz = clazz; - } - /***********************************************************************/ - public Object extractObjectForNode(Node node) - { - try - { - Object object = getCreator().invoke(null,(Object[])null); - XmlExtractorUtil.extractAndTranslateForNode(node, object, getTranslator()); - return object; - } - catch (Throwable t) - { - throw ObjectUtils.throwAsError(t); - } - } - /***********************************************************************/ - private XmlTranslator getTranslator() throws IllegalArgumentException, SecurityException, IllegalAccessException, InvocationTargetException, NoSuchMethodException, InstantiationException - { - if (translator == null) - { - XmlMap[] xmlMaps = ((XmlExtractable) getCreator().invoke(null,(Object[])null)).getXmlMap(); - this.translator = XmlMapTranslator.get(clazz, xmlMaps); - } - return translator; - } - /***********************************************************************/ - private Method getCreator() throws SecurityException, NoSuchMethodException - { - if (creator == null) - { - this.creator = clazz.getMethod("create", (Class[])null); - } - return creator; - } - /***********************************************************************/ - /***********************************************************************/ -} diff --git a/src/main/java/com/spun/util/io/CommaDelimitedFileParser.java b/src/main/java/com/spun/util/io/CommaDelimitedFileParser.java deleted file mode 100644 index d0d7473..0000000 --- a/src/main/java/com/spun/util/io/CommaDelimitedFileParser.java +++ /dev/null @@ -1,151 +0,0 @@ -package com.spun.util.io; - -import java.io.BufferedReader; -import java.io.File; -import java.io.IOException; -import java.io.Reader; -import java.io.StringReader; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import com.spun.util.StringUtils; - -public class CommaDelimitedFileParser -{ - /***********************************************************************/ - public static String[][] parse(File databaseFile) - { - return parse(FileUtils.readFileWithSuppressedExceptions(databaseFile)); - } - /***********************************************************************/ - public static String[][] parse(String data) - { - return parse(new StringReader(data)); - } - /***********************************************************************/ - public static String[][] parse(Reader data) - { - try - { - List records = new ArrayList(); - BufferedReader reader = new BufferedReader(data); - boolean done = false; - StringBuffer pastLines = null; - while (!done) - { - String line = reader.readLine(); - if (line == null) - { - done = true; - } - else - { - if (pastLines != null) - { - pastLines.append("\r\n"); - pastLines.append(line); - line = pastLines.toString(); - } - String[] parseLine = parseLine(line); - if (parseLine == null) - { - if (pastLines == null) - { - pastLines = new StringBuffer(line); - } - } - else - { - records.add(parseLine); - pastLines = null; - } - } - } - return records.toArray(new String[records.size()][]); - } - catch (IOException e) - { - throw new RuntimeException(e); - } - } - /***********************************************************************/ - private static String[] parseLine(String line) throws IOException - { - String[] rawtokens = StringUtils.split(line, ",", false); - boolean in = false; - List tokens = new ArrayList(); - String fullToken = null; - for (int i = 0; i < rawtokens.length; i++) - { - String string = rawtokens[i]; - if (in) - { - fullToken += ","; - fullToken += string; - if (fullToken.endsWith("\"")) - { - tokens.add(clearQuotes(fullToken)); - in = false; - } - } - else - { - if (string.startsWith("\"") && !string.endsWith("\"")) - { - fullToken = string; - in = true; - } - else - { - tokens.add(clearQuotes(string)); - } - } - } - return in ? null : StringUtils.toArray(tokens); - } - /***********************************************************************/ - private static String clearQuotes(String string) - { - String s = (string.startsWith("\"") && string.endsWith("\"")) - ? string.substring(1, string.length() - 1) - : string; - return s.trim(); - } - /***********************************************************************/ - public static Map[] parseToMap(File file) - { - try - { - return parseToMap(FileUtils.readFileWithSuppressedExceptions(file)); - } - catch (RuntimeException e) - { - System.out.println("Filename : " + file.toString()); - throw e; - } - } - /***********************************************************************/ - public static Map[] parseToMap(String data) - { - return parseToMap(new StringReader(data)); - } - public static Map[] parseToMap(Reader data) - { - String[][] out = parse(data); - Map[] maps = new HashMap[out.length - 1]; - String[] labels = out[0]; - for (int i = 1; i < out.length; i++) - { - Map map = new HashMap(labels.length); - for (int j = 0; j < labels.length; j++) - { - map.put(labels[j], out[i][j]); - } - maps[i - 1] = map; - } - return maps; - } - /***********************************************************************/ - /***********************************************************************/ -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/io/XMLNodeExtractor.java b/src/main/java/com/spun/util/io/XMLNodeExtractor.java deleted file mode 100644 index fd9e484..0000000 --- a/src/main/java/com/spun/util/io/XMLNodeExtractor.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.spun.util.io; - -import java.util.HashMap; - -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; - -import com.spun.util.StringUtils; - - -public interface XMLNodeExtractor -{ - /***********************************************************************/ - public void extractProperty(Node node, HashMap properties); - /************************************************************************/ - /* INNER CLASS */ - /************************************************************************/ - public static class Utils - { - public static boolean extractSingleton(Node node, HashMap properties) - { - String name = node.getNodeName(); - - NodeList childNodes = node.getChildNodes(); - if ((childNodes.getLength() == 1) && (childNodes.item(0).getChildNodes().getLength() == 0)) - { - properties.put(name, StringUtils.loadNullableString(childNodes.item(0).getNodeValue())); - return true; - } - return false; - } - } - /************************************************************************/ - /************************************************************************/ -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/io/XMLUtils.java b/src/main/java/com/spun/util/io/XMLUtils.java deleted file mode 100644 index a9ddd1a..0000000 --- a/src/main/java/com/spun/util/io/XMLUtils.java +++ /dev/null @@ -1,107 +0,0 @@ -package com.spun.util.io; - -import java.io.File; -import java.io.FileInputStream; -import java.io.InputStream; -import java.io.StringReader; -import java.util.Arrays; -import java.util.HashMap; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; - -import org.w3c.dom.Document; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.xml.sax.InputSource; - -import com.spun.util.MySystem; -import com.spun.util.StringUtils; - - -public class XMLUtils -{ - /***********************************************************************/ - public static String locateFile(String fileLocation, String backupPaths[]) throws Exception - { - String[] newArray = new String[backupPaths.length+1]; - System.arraycopy(backupPaths, 0, newArray, 1, backupPaths.length); - newArray[0] = "."; - backupPaths = newArray; - for (int i = 0; i < backupPaths.length; i++) - { - String tfileLocation = backupPaths[i] + File.separator + fileLocation; - File file = new File(tfileLocation); - if (file.exists()) - { - return file.getAbsolutePath(); - } - } - throw new Error(String.format("Couldn't find '%s' from locations %s with current directory '%s'" ,fileLocation ,Arrays.asList(backupPaths),new File(".").getAbsolutePath())); - } - /***********************************************************************/ - public static HashMap parseProperties(String absoluteFileLocation, XMLNodeExtractor extractor) throws Exception - { - try - { - FileInputStream stream = new FileInputStream(absoluteFileLocation); - Document document = parseXML(stream); - return extractProperties(document, extractor); - } - catch (Exception e) - { - MySystem.variable("Property File ", absoluteFileLocation); - throw e; - } - } - /***********************************************************************/ - - private static HashMap extractProperties(Document document, XMLNodeExtractor extractor) - { - HashMap properties = new HashMap(); - NodeList list = document.getDocumentElement().getChildNodes(); - for (int i = 0; i < list.getLength(); i++) - { - extractor.extractProperty(list.item(i), properties); - } - return properties; - } - /***********************************************************************/ - - public static Document parseXML(String xml) throws Exception - { - DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); - return builder.parse(new InputSource(new StringReader(xml))); - } - - /***********************************************************************/ - public static Document parseXML(File xml) throws Exception - { - return DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new FileInputStream(xml)); - } - /***********************************************************************/ - - public static Document parseXML(InputStream stream) throws Exception - { - return DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(stream); - } - /***********************************************************************/ - - public static String extractStringValue(Node node) - { - NodeList childNodes = node.getChildNodes(); - if ((childNodes.getLength() == 1) && (childNodes.item(0).getChildNodes().getLength() == 0)) - { - return StringUtils.loadNullableString(childNodes.item(0).getNodeValue()); - } - else if (childNodes.getLength() > 1) - { - throw new Error("Should not be multiple children for node '" + node.getNodeName()+ "'"); - } - return null; - } - /**********************************************************************/ - /************************************************************************/ - - -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/io/xml/BasicExtractor.java b/src/main/java/com/spun/util/io/xml/BasicExtractor.java deleted file mode 100644 index 5b34f80..0000000 --- a/src/main/java/com/spun/util/io/xml/BasicExtractor.java +++ /dev/null @@ -1,106 +0,0 @@ -package com.spun.util.io.xml; - -import java.sql.Timestamp; -import org.w3c.dom.Node; -import com.spun.util.io.XMLUtils; - -public class BasicExtractor -{ - /***********************************************************************/ - public static XmlExtractor get(Class clazz) - { - XmlExtractor extractor = null; - if (String.class.isAssignableFrom(clazz)) - { - extractor = StringExtractor.INSTANCE; - } - else if (double.class.isAssignableFrom(clazz) || Double.class.isAssignableFrom(clazz)) - { - extractor = DoubleExtractor.INSTANCE; - } - else if (Integer.class.isAssignableFrom(clazz) || int.class.isAssignableFrom(clazz)) - { - extractor = IntegerExtractor.INSTANCE; - } - else if (boolean.class.isAssignableFrom(clazz) || Boolean.class.isAssignableFrom(clazz)) - { - extractor = BooleanExtractor.INSTANCE; - } - else if (Timestamp.class.isAssignableFrom(clazz) || Timestamp.class.isAssignableFrom(clazz)) - { - extractor = TimestampExtractor.INSTANCE; - } - return extractor; - } - private static abstract class ExtractorBase implements XmlExtractor - { - public String toString() - { - String name = this.getClass().getName(); - int divider = name.lastIndexOf("$"); - return name.substring(divider + 1); - } - } - /***********************************************************************/ - public static class StringExtractor extends ExtractorBase - { - public static StringExtractor INSTANCE = new StringExtractor(); - private StringExtractor() - { - } - public Object extractObjectForNode(Node node) - { - return XMLUtils.extractStringValue(node); - } - } - /***********************************************************************/ - public static class DoubleExtractor extends ExtractorBase - { - public static DoubleExtractor INSTANCE = new DoubleExtractor(); - private DoubleExtractor() - { - } - public Object extractObjectForNode(Node node) - { - return Double.valueOf(XMLUtils.extractStringValue(node)); - } - } - /***********************************************************************/ - public static class IntegerExtractor extends ExtractorBase - { - public static IntegerExtractor INSTANCE = new IntegerExtractor(); - private IntegerExtractor() - { - } - public Object extractObjectForNode(Node node) - { - return Integer.valueOf(XMLUtils.extractStringValue(node)); - } - } - /***********************************************************************/ - public static class BooleanExtractor extends ExtractorBase - { - public static BooleanExtractor INSTANCE = new BooleanExtractor(); - private BooleanExtractor() - { - } - public Object extractObjectForNode(Node node) - { - return Boolean.valueOf(XMLUtils.extractStringValue(node)); - } - } - /***********************************************************************/ - public static class TimestampExtractor extends ExtractorBase - { - public static TimestampExtractor INSTANCE = new TimestampExtractor(); - private TimestampExtractor() - { - } - public Object extractObjectForNode(Node node) - { - return Timestamp.valueOf(XMLUtils.extractStringValue(node)); - } - } - /***********************************************************************/ - /***********************************************************************/ -} diff --git a/src/main/java/com/spun/util/io/xml/DatabaseObjectXMLUtils.java b/src/main/java/com/spun/util/io/xml/DatabaseObjectXMLUtils.java deleted file mode 100644 index 2bfcd47..0000000 --- a/src/main/java/com/spun/util/io/xml/DatabaseObjectXMLUtils.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.spun.util.io.xml; - -import java.lang.reflect.Array; -import java.util.ArrayList; -import java.util.List; - -import org.lambda.functions.implementations.S1; -import org.lambda.query.Query; -import org.w3c.dom.Node; - -import com.spun.util.ClassUtils; -import com.spun.util.ObjectUtils; -import com.spun.util.database.DatabaseObject; -import com.spun.util.database.Syncable; -import com.spun.util.database.TemporaryCache; -import com.spun.util.database.XmlDatabaseMapExtractor; -import com.spun.util.filters.ClassFilter; -import com.spun.util.filters.FilterUtils; -import com.spun.util.io.XMLUtils; - -/***********************************************************************/ -public class DatabaseObjectXMLUtils -{ - /***********************************************************************/ - public static DatabaseObject[] extract(String xml, XmlMap[] xmlMaps) - { - try - { - DatabaseObject objects[] = extract(XMLUtils.parseXML(xml), xmlMaps); - TemporaryCache cache = new TemporaryCache(objects); - cache.forceGenericObjectType(); - for (int i = 0; i < objects.length; i++) - { - ((Syncable) objects[i]).sync(cache); - } - return Query.orderBy(objects, new S1(DatabaseObject.Null) - { - { - ret(a.getPkey()); - } - }); - } - catch (Throwable t) - { - throw ObjectUtils.throwAsError(t); - } - } - /***********************************************************************/ - private static DatabaseObject[] extract(Node node, XmlMap[] xmlMaps) throws Exception - { - ArrayList list = new ArrayList(); - XmlExtractorUtil.extractAndTranslateForNode(XmlExtractorUtil.traverseToTag("data", node), list, - XmlMapTranslator.get(ArrayList.class, xmlMaps)); - return list.toArray(new DatabaseObject[list.size()]); - } - /***********************************************************************/ - public static XmlMap map(Class clazz) - { - return new XmlMap(ClassUtils.getClassName(clazz), "add", new XmlDatabaseMapExtractor(clazz)); - } - /***********************************************************************/ - /***********************************************************************/ - public static T[] extractClass(Class clazz, DatabaseObject[] databaseObjects) - { - List list = FilterUtils.retainExtracted(databaseObjects, new ClassFilter(clazz)); - return list.toArray((T[]) Array.newInstance(clazz, list.size())); - } - public static void mockOld(DatabaseObject[] objects) - { - for (DatabaseObject object : objects) - { - object.setNew(false); - } - } -} diff --git a/src/main/java/com/spun/util/io/xml/XmlExtractable.java b/src/main/java/com/spun/util/io/xml/XmlExtractable.java deleted file mode 100644 index 81e509f..0000000 --- a/src/main/java/com/spun/util/io/xml/XmlExtractable.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.spun.util.io.xml; - -/***********************************************************************/ - -public interface XmlExtractable -{ - /***********************************************************************/ - public XmlMap[] getXmlMap(); - - /***********************************************************************/ - /***********************************************************************/ -} diff --git a/src/main/java/com/spun/util/io/xml/XmlExtractorUtil.java b/src/main/java/com/spun/util/io/xml/XmlExtractorUtil.java deleted file mode 100644 index 5d8b244..0000000 --- a/src/main/java/com/spun/util/io/xml/XmlExtractorUtil.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.spun.util.io.xml; - -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; - -public class XmlExtractorUtil -{ - /***********************************************************************/ - @SuppressWarnings("unchecked") - public static Object[] extract(Node node, String xmlName, Class clazz) - throws Exception - { - ArrayList list = new ArrayList(); - extractAndTranslateForNode(traverseToTag("XML", node), list, - XmlMapTranslator.get(ArrayList.class, new XmlMap[] { new XmlMap( - xmlName, "add", new XmlMapExtractor(clazz)) })); - return list.toArray(); - } - - /***********************************************************************/ - public static Node traverseToTag(String tag, Node node) - { - Node n = traverseToInnerTag(tag, node); - if (n == null) - { - throw new NullPointerException(String.format( - "The Tag '%s' could not be found from '%s'", tag, node)); - } - return n; - } - - /***********************************************************************/ - private static Node traverseToInnerTag(String tag, Node node) - { - String name = node.getNodeName(); - if (name.equals(tag)) - { - return node; - } else - { - NodeList childNodes = node.getChildNodes(); - for (int i = 0; i < childNodes.getLength(); i++) - { - Node child = traverseToInnerTag(tag, childNodes.item(i)); - if (child != null) - { - return child; - } - } - } - return null; - } - - /***********************************************************************/ - public static Object extractAndTranslateForNode(Node node, - Object addToObject, XmlTranslator translator) - throws IllegalArgumentException, IllegalAccessException, - InvocationTargetException, InstantiationException - { - NodeList childNodes = node.getChildNodes(); - for (int i = 0; i < childNodes.getLength(); i++) - { - if (childNodes.item(i).getNodeType() == Node.ELEMENT_NODE) - { - translator.extractAndTranslateForNode(childNodes.item(i), addToObject); - } - } - return addToObject; - } - /***********************************************************************/ - /***********************************************************************/ -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/io/xml/XmlMap.java b/src/main/java/com/spun/util/io/xml/XmlMap.java deleted file mode 100644 index 2dbf7b9..0000000 --- a/src/main/java/com/spun/util/io/xml/XmlMap.java +++ /dev/null @@ -1,132 +0,0 @@ -package com.spun.util.io.xml; - -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; -import java.util.List; - -import com.spun.util.ObjectUtils; -import com.spun.util.filters.Filter; -import com.spun.util.filters.FilterUtils; - -/***********************************************************************/ - -public class XmlMap -{ - - - private String settingFunction; - private String xmlName; - private XmlExtractor extractor; - private Method settingMethod; - private Class type; - /***********************************************************************/ - - public XmlMap(String xmlName, String settingFunction, Class type) - { - this.xmlName = xmlName; - this.settingFunction = settingFunction; - this.type = type; - } - public XmlMap(String xmlName, String settingFunction) - { - this.xmlName = xmlName; - this.settingFunction = settingFunction; - } - /***********************************************************************/ - - public Method getSettingMethod() - { - return settingMethod; - } - /***********************************************************************/ - - public String getNodeName() - { - return xmlName; - }/***********************************************************************/ - - public XmlMap(String xmlName, String settingFunction, XmlExtractor extractor) - { - - this.xmlName = xmlName; - this.settingFunction = settingFunction; - this.extractor = extractor; - } - /***********************************************************************/ - public void initialize(Class clazz) throws InstantiationException, IllegalAccessException - { - - List methods = FilterUtils.retainExtracted(clazz.getMethods(), new SingleSetterMethodFilter(settingFunction, type)); - settingMethod = getBestMethodFit(methods); - if (extractor == null) - { - Class takes = settingMethod.getParameterTypes()[0]; - extractor = getExtractorFor(takes); - } - } - /***********************************************************************/ - - private XmlExtractor getExtractorFor(Class takes) throws InstantiationException, IllegalAccessException - { - XmlExtractor extractor = BasicExtractor.get(takes); - // basic type get basic type extractor - if(extractor != null) - {} - else if (XmlExtractable.class.isAssignableFrom(takes)) - { - extractor = new XmlMapExtractor(takes); - } - else - { - throw new Error("Unable to extract for class '" + takes.getName() + "'"); - } - return extractor; - } - /***********************************************************************/ - - private Method getBestMethodFit(List methods) - { - if (methods.size() == 0) - { - throw new Error("no method found for '" + settingFunction + "'"); - } - else if (methods.size() == 1) - { - return (Method)methods.get(0); - } - else - { - throw new Error("Need to Find best method for '" + settingFunction + "' from " + methods); - } - } - /***********************************************************************/ - public XmlExtractor getExtractor() - { - return extractor; - } - /***********************************************************************/ - - public class SingleSetterMethodFilter implements Filter - { - - private String methodName = null; - private Class argument = null; - public SingleSetterMethodFilter(String methodName, Class argument) - { - this.methodName = methodName; - this.argument = argument; - } - /***********************************************************************/ - - public boolean isExtracted(Object object) throws IllegalArgumentException - { - ObjectUtils.assertInstance(Method.class, object); - Method method = (Method)object; - return method.getParameterTypes().length == 1 && (argument == null || method.getParameterTypes()[0] == argument) && Modifier.isPublic(method.getModifiers()) && method.getName().equals(methodName); - } - - } - /***********************************************************************/ - /***********************************************************************/ - -} diff --git a/src/main/java/com/spun/util/io/xml/XmlMapExtractor.java b/src/main/java/com/spun/util/io/xml/XmlMapExtractor.java deleted file mode 100644 index b724dd4..0000000 --- a/src/main/java/com/spun/util/io/xml/XmlMapExtractor.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.spun.util.io.xml; - -import java.lang.reflect.InvocationTargetException; - -import org.w3c.dom.Node; -import com.spun.util.ClassUtils; - -/***********************************************************************/ - -public class XmlMapExtractor implements XmlExtractor -{ - private Class clazz; - private XmlTranslator translator; - /***********************************************************************/ - public XmlMapExtractor(XmlMap[] xmlMaps, Class clazz) throws InstantiationException, IllegalAccessException - { - this.clazz = clazz; - this.translator = XmlMapTranslator.get(clazz, xmlMaps); - - - } - /***********************************************************************/ - public XmlMapExtractor(Class clazz) throws InstantiationException, IllegalAccessException - { - - this(((XmlExtractable)clazz.newInstance()).getXmlMap(), clazz); - } - /***********************************************************************/ - - public Object extractObjectForNode(Node node) - throws IllegalArgumentException, InvocationTargetException, InstantiationException, IllegalAccessException - { - Object object = clazz.newInstance(); - XmlExtractorUtil.extractAndTranslateForNode(node, object, translator); - return object; - - } - public String toString() - { - return ClassUtils.getClassName(clazz) + ".extractor"; - } - /***********************************************************************/ - /***********************************************************************/ -} diff --git a/src/main/java/com/spun/util/io/xml/XmlMapTranslator.java b/src/main/java/com/spun/util/io/xml/XmlMapTranslator.java deleted file mode 100644 index ad786e4..0000000 --- a/src/main/java/com/spun/util/io/xml/XmlMapTranslator.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.spun.util.io.xml; - -/***********************************************************************/ - -public class XmlMapTranslator -{ - /***********************************************************************/ - - public static XmlTranslator get(Class clazz, XmlMap[] maps) throws InstantiationException, IllegalAccessException - { - for (int i = 0; i < maps.length; i++) - { - maps[i].initialize(clazz); - } - return new XmlTranslator(maps); - - } - /***********************************************************************/ - /***********************************************************************/ - -} diff --git a/src/main/java/com/spun/util/io/xml/XmlTranslator.java b/src/main/java/com/spun/util/io/xml/XmlTranslator.java deleted file mode 100644 index 936b0f7..0000000 --- a/src/main/java/com/spun/util/io/xml/XmlTranslator.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.spun.util.io.xml; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.HashMap; -import java.util.Map.Entry; -import org.w3c.dom.Node; - -/***********************************************************************/ -public class XmlTranslator -{ - private HashMap extractors = new HashMap(); - private HashMap setters = new HashMap(); - /***********************************************************************/ - public XmlTranslator(XmlMap[] maps) - { - for (int i = 0; i < maps.length; i++) - { - String nodeName = maps[i].getNodeName(); - extractors.put(nodeName, maps[i].getExtractor()); - setters.put(nodeName, maps[i].getSettingMethod()); - } - } - /***********************************************************************/ - public Object extractAndTranslateForNode(Node node, Object addToObject) throws IllegalArgumentException, - IllegalAccessException, InvocationTargetException, InstantiationException - { - String name = node.getNodeName(); - Method method = (Method) setters.get(name); - XmlExtractor extractor = (XmlExtractor) extractors.get(name); - if (extractor == null) { - throw new Error("No Extractor Found for Node '" + getNamePath(node) + "'"); - } - Object o = extractor.extractObjectForNode(node); - this.setObject(o, addToObject, method); - return o; - } - /***********************************************************************/ - private static String getNamePath(Node node) - { - StringBuffer buffer = new StringBuffer(node.getNodeName()); - while (node.getParentNode() != null) - { - node = node.getParentNode(); - buffer.insert(0, node.getNodeName() + "."); - } - return buffer.toString(); - } - /***********************************************************************/ - private void setObject(Object o, Object addToObject, Method settingMethod) throws IllegalArgumentException, - IllegalAccessException, InvocationTargetException - { - try - { - settingMethod.invoke(addToObject, new Object[]{o}); - } - catch (IllegalArgumentException e) - { - throw e; - } - } - public String toString() - { - StringBuffer out = new StringBuffer(); - for (Entry entry : extractors.entrySet() ) - { - String key = entry.getKey(); - XmlExtractor value = entry.getValue(); - out.append(String.format("%s => %s\n",key, value)); - } - return out.toString(); - } - /***********************************************************************/ - /***********************************************************************/ -} diff --git a/src/main/java/com/spun/util/servlets/ValidationError.java b/src/main/java/com/spun/util/servlets/ValidationError.java index 5a8fb61..b581521 100644 --- a/src/main/java/com/spun/util/servlets/ValidationError.java +++ b/src/main/java/com/spun/util/servlets/ValidationError.java @@ -6,177 +6,180 @@ import java.util.Iterator; import com.spun.util.StringUtils; -public class ValidationError extends RuntimeException -{ - public static final ValidationError EMPTY = new ValidationError(); - private HashMap errors = new HashMap(); - private HashSet assertions = null; - private ValidationTracker iterator = null; - /***********************************************************************/ - public ValidationError(Enum enumumations[]) - { - this.assertions = new HashSet(); - for (Enum e : enumumations) - { - this.assertions.add(e.toString()); - } - } - /***********************************************************************/ - public ValidationError(String assertions[]) - { - this.assertions = new HashSet(); - if (assertions != null) - { - this.assertions.addAll(Arrays.asList(assertions)); - } - } - public ValidationError() - { - this.assertions = new HashSet(); - } - /***********************************************************************/ - public String getMessage() - { - return toString(); - } - /***********************************************************************/ - public String toString() - { - return "Validation(s) failed " + errors.keySet().toString() + " - " + errors.values().toString(); - } - /***********************************************************************/ - public ValidationTracker getTracker() - { - if (iterator == null) - { - iterator = new ValidationTracker(this); - } - return iterator; - } - /***********************************************************************/ - public void set(Enum assertion, boolean isOk, String errorDescription) - { - setError(assertion.toString(), !isOk, errorDescription); - } - /***********************************************************************/ - public void setError(String assertion, boolean isError, String errorDescription) - { - if (isError && !StringUtils.isNonZero(errorDescription)) { throw new Error( - "You can not use empty error descriptions"); } - assertValidAssertion(assertion); - if (isError) - { - errors.put(assertion, errorDescription); - } - else - { - errors.remove(assertion); - } - } - /***********************************************************************/ - public void setIfValid(String assertion, boolean isError, String errorDescription) - { - if (!isOk()) { return; } - setError(assertion, isError, errorDescription); - } - /***********************************************************************/ - public ValidationError add(String prefix, int index, ValidationError error) - { - return add(getPrefixForIndex(prefix, index), error); - } - /***********************************************************************/ - public ValidationError addForRange(String prefix, int startInclusive, int endExclusive, ValidationError error) - { - for (int i = startInclusive; i < endExclusive; i++) - { - add(getPrefixForIndex(prefix, i), error); - } - return this; - } - /***********************************************************************/ - public static String getPrefixForIndex(String prefix, int index) - { - return prefix + "[" + index + "]"; - } - /***********************************************************************/ - public ValidationError add(String prefix, ValidationError error) - { - prefix = StringUtils.isEmpty(prefix) ? "" : (prefix + "."); - String[] assertions = StringUtils.toArray(error.assertions); - for (int i = 0; i < assertions.length; i++) - { - this.assertions.add(prefix + assertions[i]); - } - Iterator iterator = error.errors.keySet().iterator(); - while (iterator.hasNext()) - { - String key = (String) iterator.next(); - errors.put(prefix + key, error.errors.get(key)); - } - return this; - } - /***********************************************************************/ - public boolean isOk() - { - return (errors.size() == 0); - } - /***********************************************************************/ - private void assertValidAssertion(String assertion) - { - if (!this.assertions.contains(assertion)) - { - //My_System.warning("Assertion '" + assertion + "' not found from " + assertions.toString()); - throw new Error("Assertion '" + assertion + "' not found from " + assertions.toString()); - } - } - /***********************************************************************/ - public boolean isValid(Enum e) - { - return isValid(e.toString()); - } - /***********************************************************************/ - public boolean isValid(String assertion) - { - assertValidAssertion(assertion); - return (errors.get(assertion) == null); - } - /***********************************************************************/ - public int size() - { - return errors.size(); - } - /***********************************************************************/ - public String getErrorDescription(Enum assertion) - { - return getErrorDescription(assertion.toString()); - } - /***********************************************************************/ - /** - * This get the description of the error - * @return The text description of the error or "" if the assertion was valid - **/ - public String getErrorDescription(String assertion) - { - assertValidAssertion(assertion); - String errorDescription = (String) errors.get(assertion); - return (errorDescription == null) ? "" : errorDescription; - } - /***********************************************************************/ - public String[] getAllErrorTitles() - { - return StringUtils.toArray(errors.keySet()); - } - /***********************************************************************/ - public void assertValid() - { - if (!isOk()) { throw this; } - } - /***********************************************************************/ - /***********************************************************************/ - public boolean isOnlyProblem(Enum e) - { - String assertion = e.toString(); - assertValidAssertion(assertion); - return (errors.get(assertion) != null) && errors.size() == 1; - } +public class ValidationError extends RuntimeException { + private static final long serialVersionUID = 7940285202708976073L; + public static final ValidationError EMPTY = new ValidationError(); + private HashMap errors = new HashMap(); + private HashSet assertions = null; + private ValidationTracker iterator = null; + + /***********************************************************************/ + public ValidationError(Enum enumumations[]) { + this.assertions = new HashSet(); + for (Enum e : enumumations) { + this.assertions.add(e.toString()); + } + } + + /***********************************************************************/ + public ValidationError(String assertions[]) { + this.assertions = new HashSet(); + if (assertions != null) { + this.assertions.addAll(Arrays.asList(assertions)); + } + } + + public ValidationError() { + this.assertions = new HashSet(); + } + + /***********************************************************************/ + public String getMessage() { + return toString(); + } + + /***********************************************************************/ + public String toString() { + return "Validation(s) failed " + errors.keySet().toString() + " - " + + errors.values().toString(); + } + + /***********************************************************************/ + public ValidationTracker getTracker() { + if (iterator == null) { + iterator = new ValidationTracker(this); + } + return iterator; + } + + /***********************************************************************/ + public void set(Enum assertion, boolean isOk, String errorDescription) { + setError(assertion.toString(), !isOk, errorDescription); + } + + /***********************************************************************/ + public void setError(String assertion, boolean isError, + String errorDescription) { + if (isError && !StringUtils.isNonZero(errorDescription)) { + throw new Error("You can not use empty error descriptions"); + } + assertValidAssertion(assertion); + if (isError) { + errors.put(assertion, errorDescription); + } else { + errors.remove(assertion); + } + } + + /***********************************************************************/ + public void setIfValid(String assertion, boolean isError, + String errorDescription) { + if (!isOk()) { + return; + } + setError(assertion, isError, errorDescription); + } + + /***********************************************************************/ + public ValidationError add(String prefix, int index, ValidationError error) { + return add(getPrefixForIndex(prefix, index), error); + } + + /***********************************************************************/ + public ValidationError addForRange(String prefix, int startInclusive, + int endExclusive, ValidationError error) { + for (int i = startInclusive; i < endExclusive; i++) { + add(getPrefixForIndex(prefix, i), error); + } + return this; + } + + /***********************************************************************/ + public static String getPrefixForIndex(String prefix, int index) { + return prefix + "[" + index + "]"; + } + + /***********************************************************************/ + public ValidationError add(String prefix, ValidationError error) { + prefix = StringUtils.isEmpty(prefix) ? "" : (prefix + "."); + String[] assertions = StringUtils.toArray(error.assertions); + for (int i = 0; i < assertions.length; i++) { + this.assertions.add(prefix + assertions[i]); + } + Iterator iterator = error.errors.keySet().iterator(); + while (iterator.hasNext()) { + String key = (String) iterator.next(); + errors.put(prefix + key, error.errors.get(key)); + } + return this; + } + + /***********************************************************************/ + public boolean isOk() { + return (errors.size() == 0); + } + + /***********************************************************************/ + private void assertValidAssertion(String assertion) { + if (!this.assertions.contains(assertion)) { + // My_System.warning("Assertion '" + assertion + "' not found from " + // + assertions.toString()); + throw new Error("Assertion '" + assertion + "' not found from " + + assertions.toString()); + } + } + + /***********************************************************************/ + public boolean isValid(Enum e) { + return isValid(e.toString()); + } + + /***********************************************************************/ + public boolean isValid(String assertion) { + assertValidAssertion(assertion); + return (errors.get(assertion) == null); + } + + /***********************************************************************/ + public int size() { + return errors.size(); + } + + /***********************************************************************/ + public String getErrorDescription(Enum assertion) { + return getErrorDescription(assertion.toString()); + } + + /***********************************************************************/ + /** + * This get the description of the error + * + * @return The text description of the error or "" if the assertion was + * valid + **/ + public String getErrorDescription(String assertion) { + assertValidAssertion(assertion); + String errorDescription = (String) errors.get(assertion); + return (errorDescription == null) ? "" : errorDescription; + } + + /***********************************************************************/ + public String[] getAllErrorTitles() { + return StringUtils.toArray(errors.keySet()); + } + + /***********************************************************************/ + public void assertValid() { + if (!isOk()) { + throw this; + } + } + + /***********************************************************************/ + /***********************************************************************/ + public boolean isOnlyProblem(Enum e) { + String assertion = e.toString(); + assertValidAssertion(assertion); + return (errors.get(assertion) != null) && errors.size() == 1; + } } \ No newline at end of file diff --git a/src/main/java/com/spun/util/velocity/StringResourceLoader.java b/src/main/java/com/spun/util/velocity/StringResourceLoader.java deleted file mode 100644 index c6e6a7a..0000000 --- a/src/main/java/com/spun/util/velocity/StringResourceLoader.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.spun.util.velocity; - -/* - * Copyright 2001-2002,2004 The Apache Software Foundation. - * - * 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. - */ -import java.io.InputStream; - -import org.apache.commons.collections.ExtendedProperties; -import org.apache.velocity.exception.ResourceNotFoundException; -import org.apache.velocity.runtime.resource.Resource; -import org.apache.velocity.runtime.resource.loader.ResourceLoader; - -import com.spun.util.StringUtils; - -/** - * This is a simple resource loader that loads the string as a template - * - **/ -public class StringResourceLoader extends ResourceLoader -{ - /***********************************************************************/ - public boolean isSourceModified(Resource resource) - { - return true; - } - /***********************************************************************/ - public long getLastModified(Resource resource) - { - return 0; - } - /***********************************************************************/ - public synchronized InputStream getResourceStream(String name) throws ResourceNotFoundException - { - return StringUtils.convertToInputStream(name); - } - /***********************************************************************/ - public void init(ExtendedProperties arg0) - { -// My_System.event("initialize"); - } - /***********************************************************************/ - /***********************************************************************/ -} diff --git a/src/main/java/org/approvaltests/Approvals.java b/src/main/java/org/approvaltests/Approvals.java index f8fc14f..f4de54a 100644 --- a/src/main/java/org/approvaltests/Approvals.java +++ b/src/main/java/org/approvaltests/Approvals.java @@ -5,7 +5,6 @@ import java.awt.image.BufferedImage; import java.io.File; import java.util.Arrays; -import java.util.List; import java.util.Map; import org.approvaltests.ReporterFactory.FileTypes; @@ -21,8 +20,6 @@ import org.approvaltests.writers.FileApprovalWriter; import org.approvaltests.writers.ImageApprovalWriter; import org.lambda.functions.Function1; -import org.lambda.functions.implementations.F1; -import org.lambda.query.Query; import com.spun.util.ArrayUtils; import com.spun.util.ObjectUtils; @@ -149,12 +146,12 @@ private static void approve(BufferedImage bufferedImage, ApprovalNamer namer) { verify(new ImageApprovalWriter(bufferedImage), FileTypes.Image); } - private static String getFileNameList(List mismatched) { - return Query.select(mismatched, - new F1(mismatched.get(1)) { - { - ret(a.getName()); - } - }).toString(); - } +// private static String getFileNameList(List mismatched) { +// return Query.select(mismatched, +// new F1(mismatched.get(1)) { +// { +// ret(a.getName()); +// } +// }).toString(); +// } } \ No newline at end of file diff --git a/src/main/java/org/lambda/actions/implementations/A0.java b/src/main/java/org/lambda/actions/implementations/A0.java deleted file mode 100644 index d279fd3..0000000 --- a/src/main/java/org/lambda/actions/implementations/A0.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.lambda.actions.implementations; - -import org.lambda.functions.implementations.F1; - -public class A0 extends F1 implements org.lambda.actions.Action0 -{ - public boolean run; - public A0(boolean a, Object... extraVariables) - { - super(a, extraVariables); - run = a; - } - @Override - public void returnValue(String returnValue) - { - throw new Error("Return Values are not allowed for actions"); - } - @Override - public void call() - { - super.call(true); - } -} diff --git a/src/main/java/org/lambda/actions/implementations/A1.java b/src/main/java/org/lambda/actions/implementations/A1.java deleted file mode 100644 index a54ddc5..0000000 --- a/src/main/java/org/lambda/actions/implementations/A1.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.lambda.actions.implementations; - -import org.lambda.functions.implementations.F2; - -public class A1 extends F2 implements org.lambda.actions.Action1 -{ - public boolean run; - public A1(boolean a, In b, Object... extraVariables) - { - super(a, b, extraVariables); - run = a; - } - @Override - public void returnValue(String returnValue) - { - throw new Error("Return Values are not allowed for actions"); - } - @Override - public void call(In a) - { - super.call(true, a); - } -} diff --git a/src/main/java/org/lambda/functions/implementations/B1.java b/src/main/java/org/lambda/functions/implementations/B1.java deleted file mode 100644 index a62a1a5..0000000 --- a/src/main/java/org/lambda/functions/implementations/B1.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.lambda.functions.implementations; - -public class B1 extends F1 -{ - public B1(In a, Object... extraVariables) - { - super(a, extraVariables); - } -} diff --git a/src/main/java/org/lambda/functions/implementations/F0.java b/src/main/java/org/lambda/functions/implementations/F0.java deleted file mode 100644 index 12c5f62..0000000 --- a/src/main/java/org/lambda/functions/implementations/F0.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.lambda.functions.implementations; - -public class F0 extends Function - implements - org.lambda.functions.Function0 -{ - public F0(Object... extraVariables) - { - super(extraVariables); - } - public Out call() - { - return call(new Object[0]); - } -} diff --git a/src/main/java/org/lambda/functions/implementations/F1.java b/src/main/java/org/lambda/functions/implementations/F1.java deleted file mode 100644 index b75b8ca..0000000 --- a/src/main/java/org/lambda/functions/implementations/F1.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.lambda.functions.implementations; - -public class F1 extends Function - implements - org.lambda.functions.Function1 -{ - public F1(In a, Object... extraVariables) - { - super(extraVariables); - this.a = a; - } - public Out call(In i) - { - return call(new Object[]{i}); - } -} diff --git a/src/main/java/org/lambda/functions/implementations/F2.java b/src/main/java/org/lambda/functions/implementations/F2.java deleted file mode 100644 index bfb97f0..0000000 --- a/src/main/java/org/lambda/functions/implementations/F2.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.lambda.functions.implementations; - -public class F2 - extends - Function - implements - org.lambda.functions.Function2 -{ - public F2(In1 a, In2 b, Object... extraVariables) - { - super(extraVariables); - this.a = a; - this.b = b; - } - public Out call(In1 a, In2 b) - { - return call(new Object[]{a, b}); - } -} diff --git a/src/main/java/org/lambda/functions/implementations/F3.java b/src/main/java/org/lambda/functions/implementations/F3.java deleted file mode 100644 index 9faace1..0000000 --- a/src/main/java/org/lambda/functions/implementations/F3.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.lambda.functions.implementations; - -public class F3 - extends - Function - implements - org.lambda.functions.Function3 -{ - public F3(In1 a, In2 b, In3 c, Object... extraVariables) - { - super(extraVariables); - this.a = a; - this.b = b; - this.c = c; - } - public Out call(In1 a, In2 b, In3 c) - { - return call(new Object[]{a, b, c,}); - } -} diff --git a/src/main/java/org/lambda/functions/implementations/F4.java b/src/main/java/org/lambda/functions/implementations/F4.java deleted file mode 100644 index daa1272..0000000 --- a/src/main/java/org/lambda/functions/implementations/F4.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.lambda.functions.implementations; - -public class F4 - extends - Function - implements - org.lambda.functions.Function4 -{ - public F4(In1 a, In2 b, In3 c, In4 d, Object... extraVariables) - { - super(extraVariables); - this.a = a; - this.b = b; - this.c = c; - this.d = d; - } - public Out call(In1 a, In2 b, In3 c, In4 d) - { - return call(new Object[]{a, b, c, d}); - } -} diff --git a/src/main/java/org/lambda/functions/implementations/F5.java b/src/main/java/org/lambda/functions/implementations/F5.java deleted file mode 100644 index 74adc08..0000000 --- a/src/main/java/org/lambda/functions/implementations/F5.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.lambda.functions.implementations; - -public class F5 - extends - Function - implements - org.lambda.functions.Function5 -{ - public F5(In1 a, In2 b, In3 c, In4 d, In5 e, Object... extraVariables) - { - super(extraVariables); - this.a = a; - this.b = b; - this.c = c; - this.d = d; - this.e = e; - } - public Out call(In1 a, In2 b, In3 c, In4 d, In5 e) - { - return call(new Object[]{a, b, c, d, e}); - } -} diff --git a/src/main/java/org/lambda/functions/implementations/F6.java b/src/main/java/org/lambda/functions/implementations/F6.java deleted file mode 100644 index 4b60d40..0000000 --- a/src/main/java/org/lambda/functions/implementations/F6.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.lambda.functions.implementations; - -public class F6 - extends - Function - implements - org.lambda.functions.Function6 -{ - public F6(In1 a, In2 b, In3 c, In4 d, In5 e, In6 f, Object... extraVariables) - { - super(extraVariables); - this.a = a; - this.b = b; - this.c = c; - this.d = d; - this.e = e; - this.f = f; - } - public Out call(In1 a, In2 b, In3 c, In4 d, In5 e, In6 f) - { - return call(new Object[]{a, b, c, d, e, f}); - } -} diff --git a/src/main/java/org/lambda/functions/implementations/F7.java b/src/main/java/org/lambda/functions/implementations/F7.java deleted file mode 100644 index 3d4269d..0000000 --- a/src/main/java/org/lambda/functions/implementations/F7.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.lambda.functions.implementations; - -public class F7 - extends - Function - implements - org.lambda.functions.Function7 -{ - public F7(In1 a, In2 b, In3 c, In4 d, In5 e, In6 f, In7 g, Object... extraVariables) - { - super(extraVariables); - this.a = a; - this.b = b; - this.c = c; - this.d = d; - this.e = e; - this.f = f; - this.g = g; - } - public Out call(In1 a, In2 b, In3 c, In4 d, In5 e, In6 f, In7 g) - { - return call(new Object[]{a, b, c, d, e, f, g}); - } -} diff --git a/src/main/java/org/lambda/functions/implementations/F8.java b/src/main/java/org/lambda/functions/implementations/F8.java deleted file mode 100644 index 906a900..0000000 --- a/src/main/java/org/lambda/functions/implementations/F8.java +++ /dev/null @@ -1,25 +0,0 @@ -package org.lambda.functions.implementations; - -public class F8 - extends - Function - implements - org.lambda.functions.Function8 -{ - public F8(In1 a, In2 b, In3 c, In4 d, In5 e, In6 f, In7 g, In8 h, Object... extraVariables) - { - super(extraVariables); - this.a = a; - this.b = b; - this.c = c; - this.d = d; - this.e = e; - this.f = f; - this.g = g; - this.h = h; - } - public Out call(In1 a, In2 b, In3 c, In4 d, In5 e, In6 f, In7 g, In8 h) - { - return call(new Object[]{a, b, c, d, e, f, g, h}); - } -} diff --git a/src/main/java/org/lambda/functions/implementations/F9.java b/src/main/java/org/lambda/functions/implementations/F9.java deleted file mode 100644 index 66596cd..0000000 --- a/src/main/java/org/lambda/functions/implementations/F9.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.lambda.functions.implementations; - -public class F9 - extends - Function - implements - org.lambda.functions.Function9 -{ - public F9(In1 a, In2 b, In3 c, In4 d, In5 e, In6 f, In7 g, In8 h, In9 i, Object... extraVariables) - { - super(extraVariables); - this.a = a; - this.b = b; - this.c = c; - this.d = d; - this.e = e; - this.f = f; - this.g = g; - this.h = h; - this.i = i; - } - public Out call(In1 a, In2 b, In3 c, In4 d, In5 e, In6 f, In7 g, In8 h, In9 i) - { - return call(new Object[]{a, b, c, d, e, f, g, h, i}); - } -} diff --git a/src/main/java/org/lambda/functions/implementations/Function.java b/src/main/java/org/lambda/functions/implementations/Function.java deleted file mode 100644 index bf03658..0000000 --- a/src/main/java/org/lambda/functions/implementations/Function.java +++ /dev/null @@ -1,147 +0,0 @@ -package org.lambda.functions.implementations; - -import java.lang.reflect.Constructor; -import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.Arrays; - -import com.spun.util.ObjectUtils; - -public class Function -{ - public Out returnValue; - private final Object[] extraVariables; - private Object[] params; - private int startAt = 0; - private int totalLengthOfParameters; - private Constructor constructor; - public In1 a; - public In2 b; - public In3 c; - public In4 d; - public In5 e; - public In6 f; - public In7 g; - public In8 h; - public In9 i; - public Function(Object[] extraVariables) - { - this.extraVariables = extraVariables; - } - protected Out call(Object[] mainParams) - { - Object[] parameters = null; - try - { - initalizeConstructor(); - parameters = getParameters(totalLengthOfParameters, extraVariables, mainParams); - Function intsance = constructor.newInstance(parameters); - return (Out) intsance.returnValue; - } - catch (IllegalArgumentException e) - { - throw new RuntimeException(e.getMessage() + "\r\nExpected " - + Arrays.toString(constructor.getParameterTypes()) + "\r\nGot " + Arrays.toString(parameters)); - } - catch (Throwable e) - { - throw ObjectUtils.throwAsError(e); - } - } - @SuppressWarnings({"unchecked", "rawtypes"}) - public void initalizeConstructor() - { - if (constructor == null) - { - Class clazz = this.getClass(); - constructor = (Constructor) clazz.getDeclaredConstructors()[0]; - constructor.setAccessible(true); - totalLengthOfParameters = constructor.getParameterTypes().length; - } - } - private Object[] getParameters(int length, Object[] extraVariables2, Object[] mainParams) - { - if (params == null) - { - params = initalizeParameters(length, extraVariables2, mainParams); - } - for (int i = 0; i < mainParams.length; i++) - { - params[i + startAt] = mainParams[i]; - } - return params; - } - private Object[] initalizeParameters(int total, Object[] extraVariables, Object[] mainParams) - { - ArrayList list = new ArrayList(total); - if ((extraVariables.length + 1 + mainParams.length) != total) - { - startAt = 1; - list.add(getParentThisReference()); - } - for (Object object : mainParams) - { - list.add(object); - } - list.add(extraVariables); - for (Object object : extraVariables) - { - list.add(object); - } - return list.toArray(); - } - private Object getParentThisReference() - { - Object parent = tryToGetParentByName(); - if (parent == null) - { - parent = tryToGetParentByType(); - } - return parent; - } - private Object tryToGetParentByType() - { - try - { - Class clazz = this.getClass(); - Field[] fields = clazz.getDeclaredFields(); - Class desiredType = clazz.getDeclaredConstructors()[0].getParameterTypes()[0]; - for (Field field : fields) - { - if (field.getType().equals(desiredType)) - { - field.setAccessible(true); - return field.get(this); - } - } - } - catch (Exception e) - { - // Couldn't find method of parent type. - } - return null; - } - private Object tryToGetParentByName() - { - try - { - Class clazz = this.getClass(); - Field parentField = clazz.getDeclaredField("this$0"); - parentField.setAccessible(true); - return parentField.get(this); - } - catch (Exception e) - { - // Failed try 1 -> this$0 field doesn't exist - } - return null; - } - public void returnValue(Out returnValue) - { - this.returnValue = returnValue; - } - public void ret(Out returnValue) - { - returnValue(returnValue); - } -} diff --git a/src/main/java/org/lambda/functions/implementations/S1.java b/src/main/java/org/lambda/functions/implementations/S1.java deleted file mode 100644 index eb0971c..0000000 --- a/src/main/java/org/lambda/functions/implementations/S1.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.lambda.functions.implementations; - -public class S1 extends F1 -{ - public S1(In a, Object... extraVariables) - { - super(a, extraVariables); - } -} diff --git a/src/main/java/org/lambda/query/ParallelLoops.java b/src/main/java/org/lambda/query/ParallelLoops.java deleted file mode 100644 index 23f5a17..0000000 --- a/src/main/java/org/lambda/query/ParallelLoops.java +++ /dev/null @@ -1,43 +0,0 @@ -package org.lambda.query; - -import java.util.concurrent.atomic.AtomicInteger; - -import org.lambda.actions.Action1; -import org.lambda.actions.implementations.A0; - -import com.spun.util.ThreadLauncher; - -public class ParallelLoops -{ - public static void forEach(Iterable list, final Action1 a1) - { - final AtomicInteger done = new AtomicInteger(); - int count = 0; - for (T i : list) - { - count++; - final T piece = i; - ThreadLauncher.launch(new A0(false, a1, piece, done) - { - { - if (run) - { - a1.call(piece); - done.incrementAndGet(); - } - } - }); - } - while (done.get() != count) - { - try - { - Thread.sleep(2); - } - catch (InterruptedException e) - { - // do nothing - } - } - } -} diff --git a/src/main/java/org/lambda/query/ParallelQuery.java b/src/main/java/org/lambda/query/ParallelQuery.java deleted file mode 100644 index 9f1f07c..0000000 --- a/src/main/java/org/lambda/query/ParallelQuery.java +++ /dev/null @@ -1,50 +0,0 @@ -package org.lambda.query; - -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; - -import org.lambda.actions.implementations.A0; -import org.lambda.functions.Function1; - -import com.spun.util.ThreadLauncher; - -public class ParallelQuery -{ - public static List where(Iterable list, final Function1 funct) - { - final ArrayList out = new ArrayList(); - final AtomicInteger done = new AtomicInteger(); - int count = 0; - for (In i : list) - { - count++; - final In piece = i; - ThreadLauncher.launch(new A0(false, funct, piece, out, done) - { - { - if (run) - { - if (funct.call(piece)) - { - out.add(piece); - } - done.incrementAndGet(); - } - } - }); - } - while (done.get() != count) - { - try - { - Thread.sleep(2); - } - catch (InterruptedException e) - { - // do nothing - } - } - return out; - } -} diff --git a/src/main/java/org/teachingextensions/logo/PenColors.java b/src/main/java/org/teachingextensions/logo/PenColors.java index c7a5c77..dcba265 100644 --- a/src/main/java/org/teachingextensions/logo/PenColors.java +++ b/src/main/java/org/teachingextensions/logo/PenColors.java @@ -16,7 +16,7 @@ public static class Blues { /** * The color Navy - *
 
+ *
* * * @@ -25,7 +25,7 @@ public static class Blues public static final Color Navy = Color.decode("#000080"); /** * The color DarkBlue - *
 
+ *
* * * @@ -34,7 +34,7 @@ public static class Blues public static final Color DarkBlue = Color.decode("#00008B"); /** * The color MidnightBlue - *
 
+ *
* * * @@ -43,7 +43,7 @@ public static class Blues public static final Color MidnightBlue = Color.decode("#191970"); /** * The color MediumBlue - *
 
+ *
* * * @@ -52,7 +52,7 @@ public static class Blues public static final Color MediumBlue = Color.decode("#0000CD"); /** * The color Blue - *
 
+ *
* * * @@ -61,7 +61,7 @@ public static class Blues public static final Color Blue = Color.decode("#0000FF"); /** * The color Teal - *
 
+ *
* * * @@ -70,7 +70,7 @@ public static class Blues public static final Color Teal = Color.decode("#008080"); /** * The color DarkSlateBlue - *
 
+ *
* * * @@ -79,7 +79,7 @@ public static class Blues public static final Color DarkSlateBlue = Color.decode("#483D8B"); /** * The color DarkCyan - *
 
+ *
* * * @@ -88,7 +88,7 @@ public static class Blues public static final Color DarkCyan = Color.decode("#008B8B"); /** * The color SteelBlue - *
 
+ *
* * * @@ -97,7 +97,7 @@ public static class Blues public static final Color SteelBlue = Color.decode("#4682B4"); /** * The color RoyalBlue - *
 
+ *
* * * @@ -106,7 +106,7 @@ public static class Blues public static final Color RoyalBlue = Color.decode("#4169E1"); /** * The color SlateBlue - *
 
+ *
* * * @@ -115,7 +115,7 @@ public static class Blues public static final Color SlateBlue = Color.decode("#6A5ACD"); /** * The color CadetBlue - *
 
+ *
* * * @@ -124,7 +124,7 @@ public static class Blues public static final Color CadetBlue = Color.decode("#5F9EA0"); /** * The color DarkTurquoise - *
 
+ *
* * * @@ -133,7 +133,7 @@ public static class Blues public static final Color DarkTurquoise = Color.decode("#00CED1"); /** * The color DodgerBlue - *
 
+ *
* * * @@ -142,7 +142,7 @@ public static class Blues public static final Color DodgerBlue = Color.decode("#1E90FF"); /** * The color DeepSkyBlue - *
 
+ *
* * * @@ -151,7 +151,7 @@ public static class Blues public static final Color DeepSkyBlue = Color.decode("#00BFFF"); /** * The color MediumSlateBlue - *
 
+ *
* * * @@ -160,7 +160,7 @@ public static class Blues public static final Color MediumSlateBlue = Color.decode("#7B68EE"); /** * The color MediumTurquoise - *
 
+ *
* * * @@ -169,7 +169,7 @@ public static class Blues public static final Color MediumTurquoise = Color.decode("#48D1CC"); /** * The color CornflowerBlue - *
 
+ *
* * * @@ -178,7 +178,7 @@ public static class Blues public static final Color CornflowerBlue = Color.decode("#6495ED"); /** * The color Turquoise - *
 
+ *
* * * @@ -187,7 +187,7 @@ public static class Blues public static final Color Turquoise = Color.decode("#40E0D0"); /** * The color Aqua - *
 
+ *
* * * @@ -196,7 +196,7 @@ public static class Blues public static final Color Aqua = Color.decode("#00FFFF"); /** * The color Cyan - *
 
+ *
* * * @@ -205,7 +205,7 @@ public static class Blues public static final Color Cyan = Color.decode("#00FFFF"); /** * The color SkyBlue - *
 
+ *
* * * @@ -214,7 +214,7 @@ public static class Blues public static final Color SkyBlue = Color.decode("#87CEEB"); /** * The color LightSkyBlue - *
 
+ *
* * * @@ -223,7 +223,7 @@ public static class Blues public static final Color LightSkyBlue = Color.decode("#87CEFA"); /** * The color Aquamarine - *
 
+ *
* * * @@ -232,7 +232,7 @@ public static class Blues public static final Color Aquamarine = Color.decode("#7FFFD4"); /** * The color LightSteelBlue - *
 
+ *
* * * @@ -241,7 +241,7 @@ public static class Blues public static final Color LightSteelBlue = Color.decode("#B0C4DE"); /** * The color LightBlue - *
 
+ *
* * * @@ -250,7 +250,7 @@ public static class Blues public static final Color LightBlue = Color.decode("#ADD8E6"); /** * The color PowderBlue - *
 
+ *
* * * @@ -259,7 +259,7 @@ public static class Blues public static final Color PowderBlue = Color.decode("#B0E0E6"); /** * The color PaleTurquoise - *
 
+ *
* * * @@ -268,7 +268,7 @@ public static class Blues public static final Color PaleTurquoise = Color.decode("#AFEEEE"); /** * The color LightCyan - *
 
+ *
* * * @@ -277,7 +277,7 @@ public static class Blues public static final Color LightCyan = Color.decode("#E0FFFF"); /** * The color AliceBlue - *
 
+ *
* * * @@ -286,7 +286,7 @@ public static class Blues public static final Color AliceBlue = Color.decode("#F0F8FF"); /** * The color Azure - *
 
+ *
* * * @@ -298,7 +298,7 @@ public static class Browns { /** * The color Maroon - *
 
+ *
* * * @@ -307,7 +307,7 @@ public static class Browns public static final Color Maroon = Color.decode("#800000"); /** * The color SaddleBrown - *
 
+ *
* * * @@ -316,7 +316,7 @@ public static class Browns public static final Color SaddleBrown = Color.decode("#8B4513"); /** * The color Brown - *
 
+ *
* * * @@ -325,7 +325,7 @@ public static class Browns public static final Color Brown = Color.decode("#A52A2A"); /** * The color Sienna - *
 
+ *
* * * @@ -334,7 +334,7 @@ public static class Browns public static final Color Sienna = Color.decode("#A0522D"); /** * The color DarkGoldenrod - *
 
+ *
* * * @@ -343,7 +343,7 @@ public static class Browns public static final Color DarkGoldenrod = Color.decode("#B8860B"); /** * The color Chocolate - *
 
+ *
* * * @@ -352,7 +352,7 @@ public static class Browns public static final Color Chocolate = Color.decode("#D2691E"); /** * The color Peru - *
 
+ *
* * * @@ -361,7 +361,7 @@ public static class Browns public static final Color Peru = Color.decode("#CD853F"); /** * The color Goldenrod - *
 
+ *
* * * @@ -370,7 +370,7 @@ public static class Browns public static final Color Goldenrod = Color.decode("#DAA520"); /** * The color RosyBrown - *
 
+ *
* * * @@ -379,7 +379,7 @@ public static class Browns public static final Color RosyBrown = Color.decode("#BC8F8F"); /** * The color SandyBrown - *
 
+ *
* * * @@ -388,7 +388,7 @@ public static class Browns public static final Color SandyBrown = Color.decode("#F4A460"); /** * The color Tan - *
 
+ *
* * * @@ -397,7 +397,7 @@ public static class Browns public static final Color Tan = Color.decode("#D2B48C"); /** * The color BurlyWood - *
 
+ *
* * * @@ -406,7 +406,7 @@ public static class Browns public static final Color BurlyWood = Color.decode("#DEB887"); /** * The color Wheat - *
 
+ *
* * * @@ -415,7 +415,7 @@ public static class Browns public static final Color Wheat = Color.decode("#F5DEB3"); /** * The color NavajoWhite - *
 
+ *
* * * @@ -424,7 +424,7 @@ public static class Browns public static final Color NavajoWhite = Color.decode("#FFDEAD"); /** * The color Bisque - *
 
+ *
* * * @@ -433,7 +433,7 @@ public static class Browns public static final Color Bisque = Color.decode("#FFE4C4"); /** * The color BlanchedAlmond - *
 
+ *
* * * @@ -442,7 +442,7 @@ public static class Browns public static final Color BlanchedAlmond = Color.decode("#FFEBCD"); /** * The color Cornsilk - *
 
+ *
* * * @@ -454,7 +454,7 @@ public static class Grays { /** * The color Black - *
 
+ *
* * * @@ -463,7 +463,7 @@ public static class Grays public static final Color Black = Color.decode("#000000"); /** * The color DarkSlateGray - *
 
+ *
* * * @@ -472,7 +472,7 @@ public static class Grays public static final Color DarkSlateGray = Color.decode("#2F4F4F"); /** * The color DimGray - *
 
+ *
* * * @@ -481,7 +481,7 @@ public static class Grays public static final Color DimGray = Color.decode("#696969"); /** * The color Gray - *
 
+ *
* * * @@ -490,7 +490,7 @@ public static class Grays public static final Color Gray = Color.decode("#808080"); /** * The color SlateGray - *
 
+ *
* * * @@ -499,7 +499,7 @@ public static class Grays public static final Color SlateGray = Color.decode("#708090"); /** * The color LightSlateGray - *
 
+ *
* * * @@ -508,7 +508,7 @@ public static class Grays public static final Color LightSlateGray = Color.decode("#778899"); /** * The color DarkGray - *
 
+ *
* * * @@ -517,7 +517,7 @@ public static class Grays public static final Color DarkGray = Color.decode("#A9A9A9"); /** * The color Silver - *
 
+ *
* * * @@ -526,7 +526,7 @@ public static class Grays public static final Color Silver = Color.decode("#C0C0C0"); /** * The color LightGray - *
 
+ *
* * * @@ -535,7 +535,7 @@ public static class Grays public static final Color LightGray = Color.decode("#D3D3D3"); /** * The color Gainsboro - *
 
+ *
* * * @@ -547,7 +547,7 @@ public static class Greens { /** * The color DarkGreen - *
 
+ *
* * * @@ -556,7 +556,7 @@ public static class Greens public static final Color DarkGreen = Color.decode("#006400"); /** * The color Green - *
 
+ *
* * * @@ -565,7 +565,7 @@ public static class Greens public static final Color Green = Color.decode("#008000"); /** * The color ForestGreen - *
 
+ *
* * * @@ -574,7 +574,7 @@ public static class Greens public static final Color ForestGreen = Color.decode("#228B22"); /** * The color DarkOliveGreen - *
 
+ *
* * * @@ -583,7 +583,7 @@ public static class Greens public static final Color DarkOliveGreen = Color.decode("#556B2F"); /** * The color Lime - *
 
+ *
* * * @@ -592,7 +592,7 @@ public static class Greens public static final Color Lime = Color.decode("#00FF00"); /** * The color Olive - *
 
+ *
* * * @@ -601,7 +601,7 @@ public static class Greens public static final Color Olive = Color.decode("#808000"); /** * The color Teal - *
 
+ *
* * * @@ -610,7 +610,7 @@ public static class Greens public static final Color Teal = Color.decode("#008080"); /** * The color SeaGreen - *
 
+ *
* * * @@ -619,7 +619,7 @@ public static class Greens public static final Color SeaGreen = Color.decode("#2E8B57"); /** * The color DarkCyan - *
 
+ *
* * * @@ -628,7 +628,7 @@ public static class Greens public static final Color DarkCyan = Color.decode("#008B8B"); /** * The color OliveDrab - *
 
+ *
* * * @@ -637,7 +637,7 @@ public static class Greens public static final Color OliveDrab = Color.decode("#6B8E23"); /** * The color LimeGreen - *
 
+ *
* * * @@ -646,7 +646,7 @@ public static class Greens public static final Color LimeGreen = Color.decode("#32CD32"); /** * The color MediumSeaGreen - *
 
+ *
* * * @@ -655,7 +655,7 @@ public static class Greens public static final Color MediumSeaGreen = Color.decode("#3CB371"); /** * The color LawnGreen - *
 
+ *
* * * @@ -664,7 +664,7 @@ public static class Greens public static final Color LawnGreen = Color.decode("#7CFC00"); /** * The color LightSeaGreen - *
 
+ *
* * * @@ -673,7 +673,7 @@ public static class Greens public static final Color LightSeaGreen = Color.decode("#20B2AA"); /** * The color Chartreuse - *
 
+ *
* * * @@ -682,7 +682,7 @@ public static class Greens public static final Color Chartreuse = Color.decode("#7FFF00"); /** * The color SpringGreen - *
 
+ *
* * * @@ -691,7 +691,7 @@ public static class Greens public static final Color SpringGreen = Color.decode("#00FF7F"); /** * The color MediumSpringGreen - *
 
+ *
* * * @@ -700,7 +700,7 @@ public static class Greens public static final Color MediumSpringGreen = Color.decode("#00FA9A"); /** * The color YellowGreen - *
 
+ *
* * * @@ -709,7 +709,7 @@ public static class Greens public static final Color YellowGreen = Color.decode("#9ACD32"); /** * The color DarkTurquoise - *
 
+ *
* * * @@ -718,7 +718,7 @@ public static class Greens public static final Color DarkTurquoise = Color.decode("#00CED1"); /** * The color DarkSeaGreen - *
 
+ *
* * * @@ -727,7 +727,7 @@ public static class Greens public static final Color DarkSeaGreen = Color.decode("#8FBC8F"); /** * The color GreenYellow - *
 
+ *
* * * @@ -736,7 +736,7 @@ public static class Greens public static final Color GreenYellow = Color.decode("#ADFF2F"); /** * The color MediumAquamarine - *
 
+ *
* * * @@ -745,7 +745,7 @@ public static class Greens public static final Color MediumAquamarine = Color.decode("#66CDAA"); /** * The color MediumTurquoise - *
 
+ *
* * * @@ -754,7 +754,7 @@ public static class Greens public static final Color MediumTurquoise = Color.decode("#48D1CC"); /** * The color Turquoise - *
 
+ *
* * * @@ -763,7 +763,7 @@ public static class Greens public static final Color Turquoise = Color.decode("#40E0D0"); /** * The color LightGreen - *
 
+ *
* * * @@ -772,7 +772,7 @@ public static class Greens public static final Color LightGreen = Color.decode("#90EE90"); /** * The color PaleGreen - *
 
+ *
* * * @@ -781,7 +781,7 @@ public static class Greens public static final Color PaleGreen = Color.decode("#98FB98"); /** * The color Aquamarine - *
 
+ *
* * * @@ -790,7 +790,7 @@ public static class Greens public static final Color Aquamarine = Color.decode("#7FFFD4"); /** * The color PaleTurquoise - *
 
+ *
* * * @@ -802,7 +802,7 @@ public static class Oranges { /** * The color OrangeRed - *
 
+ *
* * * @@ -811,7 +811,7 @@ public static class Oranges public static final Color OrangeRed = Color.decode("#FF4500"); /** * The color DarkOrange - *
 
+ *
* * * @@ -820,7 +820,7 @@ public static class Oranges public static final Color DarkOrange = Color.decode("#FF8C00"); /** * The color Orange - *
 
+ *
* * * @@ -829,7 +829,7 @@ public static class Oranges public static final Color Orange = Color.decode("#FFA500"); /** * The color Tomato - *
 
+ *
* * * @@ -838,7 +838,7 @@ public static class Oranges public static final Color Tomato = Color.decode("#FF6347"); /** * The color Coral - *
 
+ *
* * * @@ -847,7 +847,7 @@ public static class Oranges public static final Color Coral = Color.decode("#FF7F50"); /** * The color LightSalmon - *
 
+ *
* * * @@ -859,7 +859,7 @@ public static class Pinks { /** * The color MediumVioletRed - *
 
+ *
* * * @@ -868,7 +868,7 @@ public static class Pinks public static final Color MediumVioletRed = Color.decode("#C71585"); /** * The color DeepPink - *
 
+ *
* * * @@ -877,7 +877,7 @@ public static class Pinks public static final Color DeepPink = Color.decode("#FF1493"); /** * The color PaleVioletRed - *
 
+ *
* * * @@ -886,7 +886,7 @@ public static class Pinks public static final Color PaleVioletRed = Color.decode("#DB7093"); /** * The color Fuchsia - *
 
+ *
* * * @@ -895,7 +895,7 @@ public static class Pinks public static final Color Fuchsia = Color.decode("#FF00FF"); /** * The color HotPink - *
 
+ *
* * * @@ -904,7 +904,7 @@ public static class Pinks public static final Color HotPink = Color.decode("#FF69B4"); /** * The color LightPink - *
 
+ *
* * * @@ -913,7 +913,7 @@ public static class Pinks public static final Color LightPink = Color.decode("#FFB6C1"); /** * The color Pink - *
 
+ *
* * * @@ -925,7 +925,7 @@ public static class Purples { /** * The color Indigo - *
 
+ *
* * * @@ -934,7 +934,7 @@ public static class Purples public static final Color Indigo = Color.decode("#4B0082"); /** * The color Purple - *
 
+ *
* * * @@ -943,7 +943,7 @@ public static class Purples public static final Color Purple = Color.decode("#800080"); /** * The color DarkSlateBlue - *
 
+ *
* * * @@ -952,7 +952,7 @@ public static class Purples public static final Color DarkSlateBlue = Color.decode("#483D8B"); /** * The color DarkMagenta - *
 
+ *
* * * @@ -961,7 +961,7 @@ public static class Purples public static final Color DarkMagenta = Color.decode("#8B008B"); /** * The color MediumVioletRed - *
 
+ *
* * * @@ -970,7 +970,7 @@ public static class Purples public static final Color MediumVioletRed = Color.decode("#C71585"); /** * The color DarkViolet - *
 
+ *
* * * @@ -979,7 +979,7 @@ public static class Purples public static final Color DarkViolet = Color.decode("#9400D3"); /** * The color SlateBlue - *
 
+ *
* * * @@ -988,7 +988,7 @@ public static class Purples public static final Color SlateBlue = Color.decode("#6A5ACD"); /** * The color BlueViolet - *
 
+ *
* * * @@ -997,7 +997,7 @@ public static class Purples public static final Color BlueViolet = Color.decode("#8A2BE2"); /** * The color DarkOrchid - *
 
+ *
* * * @@ -1006,7 +1006,7 @@ public static class Purples public static final Color DarkOrchid = Color.decode("#9932CC"); /** * The color MediumSlateBlue - *
 
+ *
* * * @@ -1015,7 +1015,7 @@ public static class Purples public static final Color MediumSlateBlue = Color.decode("#7B68EE"); /** * The color RosyBrown - *
 
+ *
* * * @@ -1024,7 +1024,7 @@ public static class Purples public static final Color RosyBrown = Color.decode("#BC8F8F"); /** * The color MediumPurple - *
 
+ *
* * * @@ -1033,7 +1033,7 @@ public static class Purples public static final Color MediumPurple = Color.decode("#9370DB"); /** * The color PaleVioletRed - *
 
+ *
* * * @@ -1042,7 +1042,7 @@ public static class Purples public static final Color PaleVioletRed = Color.decode("#DB7093"); /** * The color MediumOrchid - *
 
+ *
* * * @@ -1051,7 +1051,7 @@ public static class Purples public static final Color MediumOrchid = Color.decode("#BA55D3"); /** * The color Fuchsia - *
 
+ *
* * * @@ -1060,7 +1060,7 @@ public static class Purples public static final Color Fuchsia = Color.decode("#FF00FF"); /** * The color Magenta - *
 
+ *
* * * @@ -1069,7 +1069,7 @@ public static class Purples public static final Color Magenta = Color.decode("#FF00FF"); /** * The color Orchid - *
 
+ *
* * * @@ -1078,7 +1078,7 @@ public static class Purples public static final Color Orchid = Color.decode("#DA70D6"); /** * The color Plum - *
 
+ *
* * * @@ -1087,7 +1087,7 @@ public static class Purples public static final Color Plum = Color.decode("#DDA0DD"); /** * The color Violet - *
 
+ *
* * * @@ -1096,7 +1096,7 @@ public static class Purples public static final Color Violet = Color.decode("#EE82EE"); /** * The color Thistle - *
 
+ *
* * * @@ -1105,7 +1105,7 @@ public static class Purples public static final Color Thistle = Color.decode("#D8BFD8"); /** * The color Lavender - *
 
+ *
* * * @@ -1117,7 +1117,7 @@ public static class Reds { /** * The color DarkRed - *
 
+ *
* * * @@ -1126,7 +1126,7 @@ public static class Reds public static final Color DarkRed = Color.decode("#8B0000"); /** * The color FireBrick - *
 
+ *
* * * @@ -1135,7 +1135,7 @@ public static class Reds public static final Color FireBrick = Color.decode("#B22222"); /** * The color Red - *
 
+ *
* * * @@ -1144,7 +1144,7 @@ public static class Reds public static final Color Red = Color.decode("#FF0000"); /** * The color Crimson - *
 
+ *
* * * @@ -1153,7 +1153,7 @@ public static class Reds public static final Color Crimson = Color.decode("#DC143C"); /** * The color OrangeRed - *
 
+ *
* * * @@ -1162,7 +1162,7 @@ public static class Reds public static final Color OrangeRed = Color.decode("#FF4500"); /** * The color MediumVioletRed - *
 
+ *
* * * @@ -1171,7 +1171,7 @@ public static class Reds public static final Color MediumVioletRed = Color.decode("#C71585"); /** * The color IndianRed - *
 
+ *
* * * @@ -1180,7 +1180,7 @@ public static class Reds public static final Color IndianRed = Color.decode("#CD5C5C"); /** * The color Tomato - *
 
+ *
* * * @@ -1189,7 +1189,7 @@ public static class Reds public static final Color Tomato = Color.decode("#FF6347"); /** * The color PaleVioletRed - *
 
+ *
* * * @@ -1198,7 +1198,7 @@ public static class Reds public static final Color PaleVioletRed = Color.decode("#DB7093"); /** * The color Salmon - *
 
+ *
* * * @@ -1207,7 +1207,7 @@ public static class Reds public static final Color Salmon = Color.decode("#FA8072"); /** * The color LightCoral - *
 
+ *
* * * @@ -1216,7 +1216,7 @@ public static class Reds public static final Color LightCoral = Color.decode("#F08080"); /** * The color DarkSalmon - *
 
+ *
* * * @@ -1225,7 +1225,7 @@ public static class Reds public static final Color DarkSalmon = Color.decode("#E9967A"); /** * The color LightSalmon - *
 
+ *
* * * @@ -1237,7 +1237,7 @@ public static class Whites { /** * The color AntiqueWhite - *
 
+ *
* * * @@ -1246,7 +1246,7 @@ public static class Whites public static final Color AntiqueWhite = Color.decode("#FAEBD7"); /** * The color MistyRose - *
 
+ *
* * * @@ -1255,7 +1255,7 @@ public static class Whites public static final Color MistyRose = Color.decode("#FFE4E1"); /** * The color Beige - *
 
+ *
* * * @@ -1264,7 +1264,7 @@ public static class Whites public static final Color Beige = Color.decode("#F5F5DC"); /** * The color Linen - *
 
+ *
* * * @@ -1273,7 +1273,7 @@ public static class Whites public static final Color Linen = Color.decode("#FAF0E6"); /** * The color OldLace - *
 
+ *
* * * @@ -1282,7 +1282,7 @@ public static class Whites public static final Color OldLace = Color.decode("#FDF5E6"); /** * The color Honeydew - *
 
+ *
* * * @@ -1291,7 +1291,7 @@ public static class Whites public static final Color Honeydew = Color.decode("#F0FFF0"); /** * The color WhiteSmoke - *
 
+ *
* * * @@ -1300,7 +1300,7 @@ public static class Whites public static final Color WhiteSmoke = Color.decode("#F5F5F5"); /** * The color Seashell - *
 
+ *
* * * @@ -1309,7 +1309,7 @@ public static class Whites public static final Color Seashell = Color.decode("#FFF5EE"); /** * The color LavenderBlush - *
 
+ *
* * * @@ -1318,7 +1318,7 @@ public static class Whites public static final Color LavenderBlush = Color.decode("#FFF0F5"); /** * The color AliceBlue - *
 
+ *
* * * @@ -1327,7 +1327,7 @@ public static class Whites public static final Color AliceBlue = Color.decode("#F0F8FF"); /** * The color FloralWhite - *
 
+ *
* * * @@ -1336,7 +1336,7 @@ public static class Whites public static final Color FloralWhite = Color.decode("#FFFAF0"); /** * The color MintCream - *
 
+ *
* * * @@ -1345,7 +1345,7 @@ public static class Whites public static final Color MintCream = Color.decode("#F5FFFA"); /** * The color Azure - *
 
+ *
* * * @@ -1354,7 +1354,7 @@ public static class Whites public static final Color Azure = Color.decode("#F0FFFF"); /** * The color Ivory - *
 
+ *
* * * @@ -1363,7 +1363,7 @@ public static class Whites public static final Color Ivory = Color.decode("#FFFFF0"); /** * The color GhostWhite - *
 
+ *
* * * @@ -1372,7 +1372,7 @@ public static class Whites public static final Color GhostWhite = Color.decode("#F8F8FF"); /** * The color Snow - *
 
+ *
* * * @@ -1381,7 +1381,7 @@ public static class Whites public static final Color Snow = Color.decode("#FFFAFA"); /** * The color White - *
 
+ *
* * * @@ -1393,7 +1393,7 @@ public static class Yellows { /** * The color DarkGoldenrod - *
 
+ *
* * * @@ -1402,7 +1402,7 @@ public static class Yellows public static final Color DarkGoldenrod = Color.decode("#B8860B"); /** * The color Goldenrod - *
 
+ *
* * * @@ -1411,7 +1411,7 @@ public static class Yellows public static final Color Goldenrod = Color.decode("#DAA520"); /** * The color Gold - *
 
+ *
* * * @@ -1420,7 +1420,7 @@ public static class Yellows public static final Color Gold = Color.decode("#FFD700"); /** * The color DarkKhaki - *
 
+ *
* * * @@ -1429,7 +1429,7 @@ public static class Yellows public static final Color DarkKhaki = Color.decode("#BDB76B"); /** * The color Yellow - *
 
+ *
* * * @@ -1438,7 +1438,7 @@ public static class Yellows public static final Color Yellow = Color.decode("#FFFF00"); /** * The color Khaki - *
 
+ *
* * * @@ -1447,7 +1447,7 @@ public static class Yellows public static final Color Khaki = Color.decode("#F0E68C"); /** * The color PaleGoldenrod - *
 
+ *
* * * @@ -1456,7 +1456,7 @@ public static class Yellows public static final Color PaleGoldenrod = Color.decode("#EEE8AA"); /** * The color PeachPuff - *
 
+ *
* * * @@ -1465,7 +1465,7 @@ public static class Yellows public static final Color PeachPuff = Color.decode("#FFDAB9"); /** * The color Moccasin - *
 
+ *
* * * @@ -1474,7 +1474,7 @@ public static class Yellows public static final Color Moccasin = Color.decode("#FFE4B5"); /** * The color PapayaWhip - *
 
+ *
* * * @@ -1483,7 +1483,7 @@ public static class Yellows public static final Color PapayaWhip = Color.decode("#FFEFD5"); /** * The color LemonChiffon - *
 
+ *
* * * @@ -1492,7 +1492,7 @@ public static class Yellows public static final Color LemonChiffon = Color.decode("#FFFACD"); /** * The color LightGoldenrodYellow - *
 
+ *
* * * @@ -1501,7 +1501,7 @@ public static class Yellows public static final Color LightGoldenrodYellow = Color.decode("#FAFAD2"); /** * The color LightYellow - *
 
+ *
* * * diff --git a/src/main/java/org/teachingextensions/simpleparser/Parser.java b/src/main/java/org/teachingextensions/simpleparser/Parser.java index bdc34b9..5c68b4d 100644 --- a/src/main/java/org/teachingextensions/simpleparser/Parser.java +++ b/src/main/java/org/teachingextensions/simpleparser/Parser.java @@ -14,10 +14,10 @@ public class Parser /** * Parses a template with a data object to create a string * - *
Example: Words data = new Words ();
- * data.action = "Shake";
- * data.weapon = "spear";
- * String greeting = Parser.parse("Captain {action}{weapon}!!!",data)
+ *
Example: Words data = new Words ();
+ * data.action = "Shake";
+ * data.weapon = "spear";
+ * String greeting = Parser.parse("Captain {action}{weapon}!!!",data)
* * Captain Shakespear!!! * diff --git a/src/main/java/org/teachingextensions/utils/VirtualProctor.java b/src/main/java/org/teachingextensions/utils/VirtualProctor.java index 162e8c6..39e5e7e 100644 --- a/src/main/java/org/teachingextensions/utils/VirtualProctor.java +++ b/src/main/java/org/teachingextensions/utils/VirtualProctor.java @@ -6,64 +6,65 @@ import com.spun.util.io.FileUtils; /** - * - * Virtual Proctor allows you to see what all the TKPJava coders are making + * A teacher at a blackboard Virtual + * Proctor allows you to see what all the TKPJava coders are making */ -public class VirtualProctor -{ - public static class internals - { - private static final String FILE_NAME = ".virtual_proctor.txt"; - public static String getName() - { - String name = getCustomName(); - if (name == null) - { - name = getComputerName(); - } - if (name == null) - { - name = getUserName(); - } - return name; - } - private static String getCustomName() - { - File file = new File(FILE_NAME); - if (file.exists()) { return FileUtils.readFileWithSuppressedExceptions(file).trim(); } - return null; - } - public static String getComputerName() - { - return System.getenv("COMPUTERNAME"); - } - public static String getUserName() - { - return System.getenv("USER"); - } - public static void resetName() - { - File file = new File(FILE_NAME); - if (file.exists()) - { - file.delete(); - } - } - /** - * Allows you to set the displayed username in Virtual Proctor - *
Example: {@code virtualProctor.setName(name)}
- * - * @param name - * A name that is displayed for the user in the Virtual Proctor client - */ - public static void setName(String name) - { - if (StringUtils.isEmpty(name)) { return; } - FileUtils.writeFileQuietly(new File(FILE_NAME), name); - } - } - public static void setName(String name) - { - internals.setName(name); - } +public class VirtualProctor { + public static class internals { + private static final String FILE_NAME = ".virtual_proctor.txt"; + + public static String getName() { + String name = getCustomName(); + if (name == null) { + name = getComputerName(); + } + if (name == null) { + name = getUserName(); + } + return name; + } + + private static String getCustomName() { + File file = new File(FILE_NAME); + if (file.exists()) { + return FileUtils.readFileWithSuppressedExceptions(file).trim(); + } + return null; + } + + public static String getComputerName() { + return System.getenv("COMPUTERNAME"); + } + + public static String getUserName() { + return System.getenv("USER"); + } + + public static void resetName() { + File file = new File(FILE_NAME); + if (file.exists()) { + file.delete(); + } + } + + /** + * Allows you to set the displayed username in Virtual Proctor + *
Example: {@code virtualProctor.setName(name)}
+ * + * @param name + * A name that is displayed for the user in the Virtual + * Proctor client + */ + public static void setName(String name) { + if (StringUtils.isEmpty(name)) { + return; + } + FileUtils.writeFileQuietly(new File(FILE_NAME), name); + } + } + + public static void setName(String name) { + internals.setName(name); + } } diff --git a/src/main/java/org/teachingextensions/windows/MessageBox.java b/src/main/java/org/teachingextensions/windows/MessageBox.java index 006447c..59836d4 100644 --- a/src/main/java/org/teachingextensions/windows/MessageBox.java +++ b/src/main/java/org/teachingextensions/windows/MessageBox.java @@ -5,72 +5,73 @@ import com.spun.util.NumberUtils; /** - * - *
- *
- *
- *
- *
- * MessageBox is a pop up window
- * Use it to collect numerical input from the user
- * Or to display a message for the user to read.
+ * A message box
+ *
+ *
+ *
+ *
+ * MessageBox is a pop up window
+ * Use it to collect numerical input from the user
+ * Or to display a message for the user to read.
*/ -public class MessageBox -{ - private static MessageBoxInstance messageBox = new MessageBoxInstance(); - /** - * Prints a request for a numerical input to the window.
- * Example: {@code int cookies = MessageBox.askForNumericalInput("How many cookies would you like?");} - * - * @param message - * the text to be displayed - * @return the user input - */ - public static int askForNumericalInput(String message) - { - return messageBox.askForNumericalInput(message); - } - /** - * Prints a request for a text input to the window.
- * Example: {@code String name = MessageBox.askForTextInput("What is your nickname?");} - * - * @param message - * the text to be displayed - * @return the user input - */ - public static String askForTextInput(String message) - { - return messageBox.askForTextInput(message); - } - /** - * Prints the message to the window.
- * Example: {@code MessageBox.showMessage("Girl programmers rule!");} - * - * @param message - * the text to be displayed - */ - public static void showMessage(String message) - { - messageBox.showMessage(message); - } - public static void mock(MessageBoxInstance messageBoxMock) - { - messageBox = messageBoxMock; - } - public static class MessageBoxInstance - { - public int askForNumericalInput(String message) - { - String input = askForTextInput(message); - return NumberUtils.load(input, 0); - } - public String askForTextInput(String message) - { - return JOptionPane.showInputDialog(message); - } - public void showMessage(String message) - { - JOptionPane.showMessageDialog(null, message); - } - } +public class MessageBox { + private static MessageBoxInstance messageBox = new MessageBoxInstance(); + + /** + * Prints a request for a numerical input to the window.
+ * Example: + * {@code int cookies = MessageBox.askForNumericalInput("How many cookies would you like?");} + * + * @param message + * the text to be displayed + * @return the user input + */ + public static int askForNumericalInput(String message) { + return messageBox.askForNumericalInput(message); + } + + /** + * Prints a request for a text input to the window.
+ * Example: + * {@code String name = MessageBox.askForTextInput("What is your nickname?");} + * + * @param message + * the text to be displayed + * @return the user input + */ + public static String askForTextInput(String message) { + return messageBox.askForTextInput(message); + } + + /** + * Prints the message to the window.
+ * Example: {@code MessageBox.showMessage("Girl programmers rule!");} + * + * @param message + * the text to be displayed + */ + public static void showMessage(String message) { + messageBox.showMessage(message); + } + + public static void mock(MessageBoxInstance messageBoxMock) { + messageBox = messageBoxMock; + } + + public static class MessageBoxInstance { + public int askForNumericalInput(String message) { + String input = askForTextInput(message); + return NumberUtils.load(input, 0); + } + + public String askForTextInput(String message) { + return JOptionPane.showInputDialog(message); + } + + public void showMessage(String message) { + JOptionPane.showMessageDialog(null, message); + } + } } diff --git a/src/main/java/org/teachingextensions/windows/ProgramWindow.java b/src/main/java/org/teachingextensions/windows/ProgramWindow.java index 5289121..4aeb8c5 100644 --- a/src/main/java/org/teachingextensions/windows/ProgramWindow.java +++ b/src/main/java/org/teachingextensions/windows/ProgramWindow.java @@ -18,62 +18,61 @@ import com.spun.util.WindowUtils; /** - * - * Program Window allows you to change the color of the background and more... + * A window image Program Window + * allows you to change the color of the background and more... */ -@SuppressWarnings({"serial"}) -public class ProgramWindow extends JPanel -{ - public ArrayList additional = new ArrayList(); - public ProgramWindow(String title) - { - this(); - JFrame frame = new JFrame(title); - frame.getContentPane().add(this); - ProgramWindow.createStandardFrame(frame); - } - public ProgramWindow() - { - setPreferredSize(new Dimension(627, 442)); - setColor(PenColors.Whites.White); - } - public static void createStandardFrame(JFrame frame) - { - WindowUtils.testFrame(frame, new VirtualProctorWeb(), new FrameCloser()); - } - @Override - public void paint(Graphics g) - { - super.paint(g); - for (Paintable p : additional) - { - p.paint((Graphics2D) g, this); - } - } - public void setColor(Color backgroundColor) - { - setBackground(backgroundColor); - } - public void addPaintable(Paintable additional) - { - this.additional.add(additional); - repaint(); - } - public void removePaintable() - { - additional.clear(); - repaint(); - } - public void addMouseRightClickListener(MouseRightClickListener listener) - { - addMouseListener(new RightClickMouseAdapter(listener)); - } - public void addMouseLeftClickListener(MouseLeftClickListener listener) - { - addMouseListener(new LeftClickMouseAdapter(listener)); - } - public void setBackgroundImage(String url) - { - addPaintable(new ImageBackground(url)); - } +@SuppressWarnings({ "serial" }) +public class ProgramWindow extends JPanel { + public ArrayList additional = new ArrayList(); + + public ProgramWindow(String title) { + this(); + JFrame frame = new JFrame(title); + frame.getContentPane().add(this); + ProgramWindow.createStandardFrame(frame); + } + + public ProgramWindow() { + setPreferredSize(new Dimension(627, 442)); + setColor(PenColors.Whites.White); + } + + public static void createStandardFrame(JFrame frame) { + WindowUtils + .testFrame(frame, new VirtualProctorWeb(), new FrameCloser()); + } + + @Override + public void paint(Graphics g) { + super.paint(g); + for (Paintable p : additional) { + p.paint((Graphics2D) g, this); + } + } + + public void setColor(Color backgroundColor) { + setBackground(backgroundColor); + } + + public void addPaintable(Paintable additional) { + this.additional.add(additional); + repaint(); + } + + public void removePaintable() { + additional.clear(); + repaint(); + } + + public void addMouseRightClickListener(MouseRightClickListener listener) { + addMouseListener(new RightClickMouseAdapter(listener)); + } + + public void addMouseLeftClickListener(MouseLeftClickListener listener) { + addMouseListener(new LeftClickMouseAdapter(listener)); + } + + public void setBackgroundImage(String url) { + addPaintable(new ImageBackground(url)); + } } From 5c1965d96f805f65ba5312c0487c4fe51a5f1ba1 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Wed, 4 Mar 2015 22:12:58 -0800 Subject: [PATCH 010/111] Removed additional classes --- src/main/java/com/spun/util/ArrayUtils.java | 90 +++-- src/main/java/com/spun/util/MultiSorter.java | 25 -- src/main/java/com/spun/util/ObjectUtils.java | 81 +---- .../java/com/spun/util/ThreadLauncher.java | 11 - .../spun/util/database/TemporaryCache.java | 97 ----- .../java/com/spun/util/filters/AndFilter.java | 33 -- .../com/spun/util/filters/FilterUtils.java | 78 ----- .../com/spun/util/parser/JarFileLocator.java | 33 -- .../com/spun/util/parser/ListSection.java | 174 --------- .../com/spun/util/parser/ListSectionInfo.java | 85 ----- .../spun/util/parser/TemplateStringUtils.java | 177 ---------- .../util/persistence/DatabaseObjectSaver.java | 26 -- .../spun/util/servlets/EasyEmailLoader.java | 26 -- .../com/spun/util/servlets/EmailServer.java | 330 ------------------ .../com/spun/util/servlets/PassThrough.java | 101 ------ .../util/servlets/ServletSynchronizer.java | 57 --- .../util/servlets/SynchronizedServlet.java | 16 - .../spun/util/timers/LapTimeStatistics.java | 78 ----- .../java/com/spun/util/timers/LapTimer.java | 171 --------- .../org/approvaltests/ReporterFactory.java | 2 +- src/main/java/org/lambda/query/OrderBy.java | 29 -- src/main/java/org/lambda/query/Query.java | 58 --- .../teachingextensions/logo/ColorWheel.java | 14 +- .../org/teachingextensions/logo/Colors.java | 4 +- .../teachingextensions/logo/PenColors.java | 2 +- .../org/teachingextensions/logo/Pizza.java | 2 +- .../org/teachingextensions/logo/Tortoise.java | 56 +-- .../org/teachingextensions/logo/Turtle.java | 2 +- .../org/teachingextensions/logo/Wheel.java | 7 +- .../logo/shapes/Circle.java | 2 +- .../teachingextensions/logo/shapes/Text.java | 4 +- .../teachingextensions/logo/utils/Sounds.java | 4 +- 32 files changed, 91 insertions(+), 1784 deletions(-) delete mode 100644 src/main/java/com/spun/util/MultiSorter.java delete mode 100644 src/main/java/com/spun/util/database/TemporaryCache.java delete mode 100644 src/main/java/com/spun/util/filters/AndFilter.java delete mode 100644 src/main/java/com/spun/util/filters/FilterUtils.java delete mode 100644 src/main/java/com/spun/util/parser/JarFileLocator.java delete mode 100644 src/main/java/com/spun/util/parser/ListSection.java delete mode 100644 src/main/java/com/spun/util/parser/ListSectionInfo.java delete mode 100644 src/main/java/com/spun/util/parser/TemplateStringUtils.java delete mode 100644 src/main/java/com/spun/util/persistence/DatabaseObjectSaver.java delete mode 100644 src/main/java/com/spun/util/servlets/EasyEmailLoader.java delete mode 100644 src/main/java/com/spun/util/servlets/EmailServer.java delete mode 100644 src/main/java/com/spun/util/servlets/PassThrough.java delete mode 100644 src/main/java/com/spun/util/servlets/ServletSynchronizer.java delete mode 100644 src/main/java/com/spun/util/servlets/SynchronizedServlet.java delete mode 100644 src/main/java/com/spun/util/timers/LapTimeStatistics.java delete mode 100644 src/main/java/com/spun/util/timers/LapTimer.java delete mode 100644 src/main/java/org/lambda/query/OrderBy.java diff --git a/src/main/java/com/spun/util/ArrayUtils.java b/src/main/java/com/spun/util/ArrayUtils.java index ee1019c..1528f8d 100644 --- a/src/main/java/com/spun/util/ArrayUtils.java +++ b/src/main/java/com/spun/util/ArrayUtils.java @@ -43,7 +43,7 @@ public static String toString(Iterable values, Function1 forma return b.toString(); } /***********************************************************************/ - public static Vector toReverseVector(Vector vector) + public static Vector toReverseVector(Vector vector) { Vector reverse = new Vector(vector.size()); for (int i = vector.size() - 1; i >= 0; i--) @@ -65,32 +65,32 @@ public static T[] toReverseArray(T[] array) } return array; } - /***********************************************************************/ - public static T[] addToArray(T[] array, T object) - { - Object[] newArray = null; - if (array == null) - { - newArray = (Object[]) Array.newInstance(object.getClass(), 1); - newArray[0] = object; - } - else - { - newArray = (Object[]) Array.newInstance(array.getClass().getComponentType(), array.length + 1); - System.arraycopy(array, 0, newArray, 0, array.length); - newArray[array.length] = object; - } - return (T[]) newArray; - } - /***********************************************************************/ - public static T[] getSubsection(T[] array, int startInclusive, int endExclusive) - { - int length = endExclusive - startInclusive; - length = length > array.length ? array.length : length; - T[] newArray = (T[]) Array.newInstance(array.getClass().getComponentType(), length); - System.arraycopy(array, startInclusive, newArray, 0, length); - return newArray; - } +// /***********************************************************************/ +// public static T[] addToArray(T[] array, T object) +// { +// Object[] newArray = null; +// if (array == null) +// { +// newArray = (Object[]) Array.newInstance(object.getClass(), 1); +// newArray[0] = object; +// } +// else +// { +// newArray = (Object[]) Array.newInstance(array.getClass().getComponentType(), array.length + 1); +// System.arraycopy(array, 0, newArray, 0, array.length); +// newArray[array.length] = object; +// } +// return (T[]) newArray; +// } +// /***********************************************************************/ +// public static T[] getSubsection(T[] array, int startInclusive, int endExclusive) +// { +// int length = endExclusive - startInclusive; +// length = length > array.length ? array.length : length; +// T[] newArray = (T[]) Array.newInstance(array.getClass().getComponentType(), length); +// System.arraycopy(array, startInclusive, newArray, 0, length); +// return newArray; +// } /***********************************************************************/ public static boolean isEmpty(Object[] array) { @@ -120,21 +120,21 @@ public static T getFirst(T[] array, Comparator compartor) { return get(array, compartor, true); } - /***********************************************************************/ - public static T getFirst(Collection array, Comparator sorter) - { - return get((T[]) array.toArray(), sorter, true); - } +// /***********************************************************************/ +// public static T getFirst(Collection array, Comparator sorter) +// { +// return get((T[]) array.toArray(), sorter, true); +// } /***********************************************************************/ public static T getLast(T[] array, Comparator sorter) { return get(array, sorter, false); } - /***********************************************************************/ - public static T getLast(Collection array, Comparator sorter) - { - return get((T[]) array.toArray(), sorter, false); - } +// /***********************************************************************/ +// public static T getLast(Collection array, Comparator sorter) +// { +// return get((T[]) array.toArray(), sorter, false); +// } /***********************************************************************/ private static T get(T[] array, Comparator sorter, boolean wantFirst) { @@ -150,19 +150,7 @@ private static T get(T[] array, Comparator sorter, boolean w } return last; } - /***********************************************************************/ - public static List combineResults(Object[] array, String invokeMethod) - { - if (ArrayUtils.isEmpty(array)) { return Collections.EMPTY_LIST; } - try - { - return combineResults(array, ObjectUtils.getGreatestCommonDenominator(array, invokeMethod)); - } - catch (Exception e) - { - throw ObjectUtils.throwAsError(e); - } - } + /***********************************************************************/ @SuppressWarnings("rawtypes") public static List combineResults(Object[] array, Method method) @@ -278,7 +266,7 @@ public static List combine(List list1, List list2) } public static Iterable asIterable(Iterator iterator) { - return new IterableWrapper(iterator); + return new IterableWrapper(iterator); } public static class IterableWrapper implements Iterable { diff --git a/src/main/java/com/spun/util/MultiSorter.java b/src/main/java/com/spun/util/MultiSorter.java deleted file mode 100644 index 7e6deaf..0000000 --- a/src/main/java/com/spun/util/MultiSorter.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.spun.util; - -import java.util.Comparator; - -public class MultiSorter implements java.util.Comparator -{ - private Comparator[] comparators = null; - /************************************************************************/ - public MultiSorter(Comparator... comparators) - { - this.comparators = comparators; - } - /************************************************************************/ - public int compare(T o1, T o2) throws java.lang.ClassCastException - { - for (Comparator comp : comparators) - { - int value = comp.compare(o1, o2); - if (value != 0) { return value; } - } - return 0; - } - /************************************************************************/ - /************************************************************************/ -} diff --git a/src/main/java/com/spun/util/ObjectUtils.java b/src/main/java/com/spun/util/ObjectUtils.java index c83f6da..0d86211 100644 --- a/src/main/java/com/spun/util/ObjectUtils.java +++ b/src/main/java/com/spun/util/ObjectUtils.java @@ -1,10 +1,7 @@ package com.spun.util; -import java.lang.reflect.Array; import java.lang.reflect.Method; import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; /** * A static class of convenience functions for Manipulating objects @@ -49,7 +46,7 @@ public static Method[] getMethodsForObject(Object o2, String[] passedMethods) th NoSuchMethodException { Method methods[] = new Method[passedMethods.length]; - Class clazz = o2.getClass(); + Class clazz = o2.getClass(); for (int i = 0; i < passedMethods.length; i++) { methods[i] = clazz.getMethod(passedMethods[i], (Class[]) null); @@ -115,56 +112,6 @@ public static T getRandomIndex(T[] array) return array[NumberUtils.RANDOM.nextInt(array.length)]; } /***********************************************************************/ - /** - * @deprecated use Query.select() - */ - public static Object[] extractArray(Object[] from, String methodName) - { - try - { - if (from == null || from.length == 0) { return new Object[0]; } - Method method = getGreatestCommonDenominator(from, methodName); - Object[] array = null; - if (Object.class.isAssignableFrom(method.getReturnType())) - { - array = (Object[]) Array.newInstance(method.getReturnType(), from.length); - } - else - { - array = (Object[]) Array.newInstance(ClassUtils.getWrapperClass(method.getReturnType()), from.length); - } - for (int i = 0; i < from.length; i++) - { - array[i] = method.invoke(from[i], (Object[]) null); - } - return array; - } - catch (Exception e) - { - MySystem.warning(e); - throw ObjectUtils.throwAsError(e); - } - } - /***********************************************************************/ - public static Method getGreatestCommonDenominator(Object[] from, String methodName) throws SecurityException, - NoSuchMethodException - { - List classes = new ArrayList(); - ArrayUtils.addArray(classes, getAllCastableClasses(from[0])); - for (Object o : from) - { - for (int i = classes.size() - 1; i >= 0; i--) - { - Class clazz = classes.get(i); - if (!isThisInstanceOfThat(o.getClass(), clazz) || !ClassUtils.hasMethod(clazz, methodName)) - { - classes.remove(i); - } - } - } - return classes.size() == 0 ? null : ArrayUtils.getLast(classes).getMethod(methodName, (Class[]) null); - } - /***********************************************************************/ private static Class[] getAllCastableClasses(Object object) { Class clazz = object.getClass(); @@ -192,35 +139,11 @@ public static Object executeMethod(Object object, String method, Class[] methodS } } /***********************************************************************/ - public static void assertInstance(Class clazz, Object object) - { - assertInstance(new Class[]{clazz}, object); - } - /***********************************************************************/ - public static void assertInstance(Class classes[], Object object) - { - if (object == null) { throw new NullPointerException("Expected Object of Type " - + Arrays.asList(extractArray(classes, "getName")) + " but was null"); } - for (int i = 0; i < classes.length; i++) - { - if (ClassUtils.getWrapperClass(classes[i]).isInstance(object)) { return; } - } - throw new IllegalArgumentException("Expected Object of Type " - + Arrays.asList(extractArray(classes, "getName")) + " but got " + object.getClass().getName()); - } - /***********************************************************************/ public static String getClassName(Object o) { return o == null ? "null" : o.getClass().getName(); } - /***********************************************************************/ - public static void assertInstanceOrNull(Class type, Object value) - { - if (value != null) - { - assertInstance(type, value); - } - } + /************************************************************************/ private static Class getBestClass(Object value, Method method) diff --git a/src/main/java/com/spun/util/ThreadLauncher.java b/src/main/java/com/spun/util/ThreadLauncher.java index 5f3e152..2528363 100644 --- a/src/main/java/com/spun/util/ThreadLauncher.java +++ b/src/main/java/com/spun/util/ThreadLauncher.java @@ -25,17 +25,6 @@ public ThreadLauncher(Object object, Method method, Object[] objectParams) this(object, method, objectParams, 0); } /***********************************************************************/ - public ThreadLauncher(Class clazz, String methodName, long delay) throws SecurityException, - NoSuchMethodException - { - this(null, clazz.getMethod(methodName, (Class[]) null), null, delay); - } - /***********************************************************************/ - public ThreadLauncher(Class clazz, String methodName) throws SecurityException, NoSuchMethodException - { - this(null, clazz.getMethod(methodName, (Class[]) null), null, 0); - } - /***********************************************************************/ public ThreadLauncher(Object object, String methodName, long delay) throws SecurityException, NoSuchMethodException { diff --git a/src/main/java/com/spun/util/database/TemporaryCache.java b/src/main/java/com/spun/util/database/TemporaryCache.java deleted file mode 100644 index 1a200e6..0000000 --- a/src/main/java/com/spun/util/database/TemporaryCache.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.spun.util.database; - -import java.sql.SQLException; -import java.sql.Statement; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; - -public class TemporaryCache implements DatabaseCache -{ - private Map cache = null; - private Class defaultClass = null; - private boolean linkBack = true; - /**************************************************************************/ - public TemporaryCache(T object) - { - this(object, true); - } - /**************************************************************************/ - public TemporaryCache(T object, boolean linkBack) - { - this.linkBack = linkBack; - if (object != null) - { - defaultClass = object.getClass(); - cache = Collections.singletonMap(object.getPkey(), object); - } - else - { - cache = Collections.EMPTY_MAP; - } - } - /**************************************************************************/ - public TemporaryCache(T objects[]) - { - this(objects, true); - } - /**************************************************************************/ - public TemporaryCache(T objects[], boolean linkBack) - { - this.linkBack = linkBack; - cache = new HashMap(objects.length); - for (int i = 0; i < objects.length; i++) - { - cache.put(objects[i].getPkey(), objects[i]); - if (i == 0) - { - defaultClass = objects[i].getClass(); - } - else if (defaultClass != objects[i].getClass()) - { - defaultClass = null; - } - } - } - /**************************************************************************/ - public void forceGenericObjectType() - { - defaultClass = null; - } - /**************************************************************************/ - public Class getObjectType() - { - return defaultClass; - } - /**************************************************************************/ - public boolean isLinkBackOn() - { - return linkBack; - } - /**************************************************************************/ - /** - * loads the chache from the database - **/ - public synchronized void load(Statement stmt) throws SQLException - { - throw new UnsupportedOperationException("This only supports loaded objects"); - } - /**************************************************************************/ - /** - * clears the cache and reloads it from the database - **/ - public void reset(Statement stmt) throws SQLException - { - throw new UnsupportedOperationException("This only supports loaded objects"); - } - /**************************************************************************/ - /** - * @return the object from the cache with the corosponding pkey - **/ - public T get(int pkey) - { - return cache.get(pkey); - } - /**************************************************************************/ - /**************************************************************************/ -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/filters/AndFilter.java b/src/main/java/com/spun/util/filters/AndFilter.java deleted file mode 100644 index 5240636..0000000 --- a/src/main/java/com/spun/util/filters/AndFilter.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.spun.util.filters; - -/** - * Listens to the state of a EnabledConditions object - **/ - - -public class AndFilter - implements Filter -{ - private Filter filter1 = null; - private Filter filter2 = null; - - - /***********************************************************************/ - public AndFilter(Filter filter1,Filter filter2) - { - this.filter1 = filter1; - this.filter2 = filter2; - } - /***********************************************************************/ - /** - * @return true if the object would be extracted by the filter - * @throws IllegalArgumentException if the object is not supported by the filter - **/ - public boolean isExtracted(Object object) - throws IllegalArgumentException - { - return filter1.isExtracted(object) && filter2.isExtracted(object); - } - /**************************************************************************/ - /**************************************************************************/ -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/filters/FilterUtils.java b/src/main/java/com/spun/util/filters/FilterUtils.java deleted file mode 100644 index b1d7909..0000000 --- a/src/main/java/com/spun/util/filters/FilterUtils.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.spun.util.filters; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; - -/** - * Listens to the state of a EnabledConditions object - **/ -public class FilterUtils -{ - /***********************************************************************/ - /** - * @return a new List containing all elements of the list for which isExtracted() would return true - **/ - public static ArrayList retainExtracted(Collection fromList, Filter filter) throws IllegalArgumentException - { - return filter(fromList, filter, true); - } - /***********************************************************************/ - /** - * @return a new List containing all elements of the list for which isExtracted() would return false - **/ - public static ArrayList retainPurified(List fromList, Filter filter) throws IllegalArgumentException - { - return filter(fromList, filter, false); - } - /***********************************************************************/ - /** - * @return a new List containing all elements of the list for which isExtracted() would return true - **/ - public static ArrayList retainExtracted(T fromObjects[], Filter filter) throws IllegalArgumentException - { - return fromObjects == null ? new ArrayList() : filter(Arrays.asList(fromObjects), filter, true); - } - /***********************************************************************/ - /** - * @return a new List containing all elements of the list for which isExtracted() would return true - **/ - private static ArrayList filter(Iterable collection, Filter filter, boolean retainExtracted) throws IllegalArgumentException - { - ArrayList extracted = new ArrayList(); - if (collection != null) - { - for (T t : collection) - { - boolean ex = (filter == null || filter.isExtracted(t)); - if (ex == retainExtracted) - { - extracted.add(t); - } - } - } - return extracted; - } - /***********************************************************************/ - /** - * @return a new List containing all elements of the list for which isExtracted() would return false - **/ - public static ArrayList retainPurified(T fromObjects[], Filter filter) throws IllegalArgumentException - { - return filter(Arrays.asList(fromObjects), filter, false); - } - /***********************************************************************/ - /* INNER CLASSES */ - /***********************************************************************/ - public static class FilterNotNull implements Filter - { - /***********************************************************************/ - public boolean isExtracted(Object object) throws IllegalArgumentException - { - return object != null; - } - } - /***********************************************************************/ - /***********************************************************************/ -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/parser/JarFileLocator.java b/src/main/java/com/spun/util/parser/JarFileLocator.java deleted file mode 100644 index 29a3843..0000000 --- a/src/main/java/com/spun/util/parser/JarFileLocator.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.spun.util.parser; - -import java.util.HashMap; - -public class JarFileLocator implements ResourceLocator -{ - private HashMap paths = new HashMap(); - private String basePath; - /***********************************************************************/ - public JarFileLocator(String basePath) - { - this.basePath = basePath; - } - /***********************************************************************/ - public String getLocation(String fileName) - { - String absolutePath = (String) paths.get(fileName); - String temp = basePath + '/' + fileName; - if (absolutePath == null) - { - ClassLoader cl = JarFileLocator.class.getClassLoader(); - if (cl.getResource(temp) != null) - { - absolutePath = temp; - paths.put(fileName, absolutePath); - } - } - if (absolutePath == null) { throw new NullPointerException(" The resource '" + fileName + "' could not be found at " + temp); } - return absolutePath; - } - /***********************************************************************/ - /***********************************************************************/ -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/parser/ListSection.java b/src/main/java/com/spun/util/parser/ListSection.java deleted file mode 100644 index 13a69a3..0000000 --- a/src/main/java/com/spun/util/parser/ListSection.java +++ /dev/null @@ -1,174 +0,0 @@ -package com.spun.util.parser; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import com.spun.util.MySystem; - -public class ListSection -{ - private List section = null; - private int startingPoint = 0; - private int overAllSize = 0; - - /************************************************************************/ - public ListSection(List section, int startingPoint, int overAllSize) - { - this.startingPoint = startingPoint; - this.overAllSize = overAllSize; - this.section = section; - } - /************************************************************************/ - public ListSection(Object[] objects, int startingPoint, int overAllSize) - { - this(Arrays.asList(objects), startingPoint, overAllSize); - } - /************************************************************************/ - public ListSection(Object[] objects, ListSectionInfo listSection) - { - this(objects,listSection.getStart()-1, listSection.getTotalSize()); - } - /************************************************************************/ - public ListSection(List section, ListSectionInfo listSection) - { - this(section,listSection.getStart()-1, listSection.getTotalSize()); - } - /************************************************************************/ - public void setSection(List section) - { - this.section = section; - } - /************************************************************************/ - public void setSection(Object[] objects) - { - this.section = Arrays.asList(objects); - } - /************************************************************************/ - public List getSection() - { - return this.section; - } - /************************************************************************/ - public boolean isListPoint() - { - return (section.size() == 1); - } - /************************************************************************/ - public int getSectionStartingPoint(int offset) - { - return (getSize() == 0) ? 0 : startingPoint + offset; - } - /************************************************************************/ - public int getSectionEndPoint(int offset) - { - // 1-2 of 3 = (0,1,2) - // size = 2, starting point = 0, - return startingPoint + section.size() - 1 + offset; - } - /************************************************************************/ - public boolean isBeforeSection() - { - return startingPoint > 0; - } - /************************************************************************/ - public boolean isAfterSection() - { - return getSectionEndPoint(1) != getSize(); - } - /************************************************************************/ - public boolean isEmpty() - { - return section.size() == 0; - } - /************************************************************************/ - public int getSize() - { - return overAllSize; - } - /************************************************************************/ - public int getBeforeSectionSize(int max) - { - return (startingPoint > max || max == -1) ? max : startingPoint; - } - /************************************************************************/ - public int getBeforeSectionStartIndex(int max, int offset) - { - return startingPoint - getBeforeSectionSize(max) + offset; - } - /************************************************************************/ - public int getBeforeSectionEndIndex(int offset) - { - return startingPoint - 1 + offset; - } - /************************************************************************/ - public int getAfterSectionSize(int max) - { - int afterSize = getSize() - getSectionEndPoint(1); - return (afterSize > max || max == -1) ? max : afterSize; - } - /************************************************************************/ - public int getAfterSectionStartIndex(int offset) - { - return getSectionEndPoint(1) + offset; - } - /************************************************************************/ - public int getAfterSectionEndIndex(int max, int offset) - { - return getSectionEndPoint(0) + getAfterSectionSize(max) + offset; - } - /************************************************************************/ - public static void main(String args[]) - { - ArrayList v = new ArrayList(); - v.add(null);v.add(null);v.add(null);v.add(null);v.add(null); - v.add(null);v.add(null);v.add(null);v.add(null);v.add(null); - v.add(null);v.add(null);v.add(null);v.add(null);v.add(null); - v.add(null);v.add(null);v.add(null);v.add(null);v.add(null); - ListSection l = new ListSection(v,40,63); - int offset = 1; - int max = 20; - MySystem.variable("isListPoint() = " + l.isListPoint()); - MySystem.variable("getSectionStartingPoint() = " + l.getSectionStartingPoint(offset)); - MySystem.variable("getSectionEndPoint() = " + l.getSectionEndPoint(offset)); - MySystem.variable("isBeforeSection() = " + l.isBeforeSection()); - MySystem.variable("isAfterSection() = " + l.isAfterSection()); - MySystem.variable("getSize() = " + l.getSize()); - MySystem.variable("getBeforeSectionSize() = " + l.getBeforeSectionSize(max)); - MySystem.variable("getBeforeSectionStartIndex() = " + l.getBeforeSectionStartIndex(max,offset)); - MySystem.variable("getBeforeSectionEndIndex() = " + l.getBeforeSectionEndIndex(offset)); - MySystem.variable("getAfterSectionSize() = " + l.getAfterSectionSize(max)); - MySystem.variable("getAfterSectionStartIndex() = " + l.getAfterSectionStartIndex(offset)); - MySystem.variable("getAfterSectionEndIndex() = " + l.getAfterSectionEndIndex(max,offset)); - } - /** - * @return Returns the overAllSize. - */ - public int getOverAllSize() - { - return overAllSize; - } - /** - * @param overAllSize The overAllSize to set. - */ - public void setOverAllSize(int overAllSize) - { - this.overAllSize = overAllSize; - } - /** - * @return Returns the startingPoint. - */ - public int getStartingPoint() - { - return startingPoint; - } - /** - * @param startingPoint The startingPoint to set. - */ - public void setStartingPoint(int startingPoint) - { - this.startingPoint = startingPoint; - } - - /************************************************************************/ - /************************************************************************/ -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/parser/ListSectionInfo.java b/src/main/java/com/spun/util/parser/ListSectionInfo.java deleted file mode 100644 index 038b289..0000000 --- a/src/main/java/com/spun/util/parser/ListSectionInfo.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.spun.util.parser; - -/** - * Import Note : Unlike much of java, - * this is not Zero indexed and is inclusive on both ends
- * i.e.
- * [1,2,3,4,5,6,7,8] with a section - * Start = 1 & SectionSize = 4] - * Has the following properties - * Start = 1 - * Section Size = 4 - * End = 4 - * Total size = 8 - **/ -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; - -public class ListSectionInfo -{ - public int start = 0; - public int sectionSize = 0; - public int totalSize = 0; - /************************************************************************/ - public ListSectionInfo(int start, int sectionSize, int totalSize) - { - this.totalSize = totalSize; - this.start = start; - if (start > totalSize) - { - this.sectionSize = 0; - } - else - { - this.sectionSize = ((start + sectionSize) > this.totalSize) ? this.totalSize - this.start + 1 : sectionSize; - } - } - /************************************************************************/ - /** - * [Start,End] => [3,5] => 3,4,5 - * @return start point (inclusive) - **/ - public int getStart() - { - return start; - } - /************************************************************************/ - /** - * [Start,End] => [3,5] => 3,4,5 - * @return end point (inclusive) - **/ - public int getEnd() - { - return start + sectionSize - 1; - } - /************************************************************************/ - public int getTotalSize() - { - return totalSize; - } - /************************************************************************/ - public int getSectionSize() - { - return sectionSize; - } - /************************************************************************/ - public static ListSectionInfo getListSectionBySQL(int start, int sectionSize, String sql, Statement stmt) - throws SQLException - { - ResultSet rsCount = stmt.executeQuery(sql); - rsCount.next(); - // This is done without an if to throw an error if the expected result is not given - return new ListSectionInfo(start, sectionSize, rsCount.getInt(1)); - } - /************************************************************************/ - public String toString() - { - String value = "com.spun.util.parser.ListSection["; - value += " start = " + start + ",\n" + " sectionSize = " + sectionSize + ",\n" + " getEnd = " + getEnd() - + ",\n" + " totalSize = " + totalSize + "]"; - return value; - } - /************************************************************************/ - /************************************************************************/ -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/parser/TemplateStringUtils.java b/src/main/java/com/spun/util/parser/TemplateStringUtils.java deleted file mode 100644 index d031884..0000000 --- a/src/main/java/com/spun/util/parser/TemplateStringUtils.java +++ /dev/null @@ -1,177 +0,0 @@ -package com.spun.util.parser; - -import java.io.File; - -import com.spun.util.StringUtils; - -public class TemplateStringUtils -{ - public static TemplateStringUtils INSTANCE = new TemplateStringUtils(); - /************************************************************************/ - private TemplateStringUtils() - { - } - /***********************************************************************/ - public String truncate(String onString, int maxLength) - { - return truncate(onString, maxLength, new String[]{}); - } - /***********************************************************************/ - public String plural(int number, String singular, String plural) - { - return String.format("%s %s", number, (number == 1 ? singular:plural)); - } - /***********************************************************************/ - public String truncate(String onString, int maxLength, String minus1, String minus2) - { - return truncate(onString, maxLength, new String[]{"", "", minus1, minus2}); - } - /***********************************************************************/ - public String truncate(String onString, int maxLength, String minus1) - { - return truncate(onString, maxLength, new String[]{"", "", minus1}); - } - /***********************************************************************/ - private String truncate(String onString, int maxLength, String minus[]) - { - if (onString == null || onString.equals("null")) { return ""; } - for (int i = 2; i < minus.length; i++) - { - maxLength -= minus[i] != null ? minus[i].length() : 0; - } - maxLength = (maxLength < 0) ? 0 : maxLength; - return StringUtils.truncate(onString, maxLength); - } - /************************************************************************/ - public static String clearNull(String value) - { - return clearNull(value, ""); - } - /************************************************************************/ - public static String clearNull(Object value, String replacingValue) - { - return (("null".equals(value) || value == null) ? replacingValue : value.toString()); - } - /************************************************************************/ - /** - * Compare if arg [0] equals any other argument starting at [1]. - * @param params - * @return - **/ - private boolean isIn(String[] params) - { - for (int i = 1; i < params.length; i++) - { - if (params[0].equals(params[i])) { return true; } - } - return false; - } - /************************************************************************/ - /** - * Compare if arg [0] equals any other argument starting at [1]. - * @param params - * @return - **/ - public static boolean isIn(String compare, String inParameter1, String inParameter2) - { - return StringUtils.isIn(compare, new String[]{inParameter1, inParameter2}); - } - /***********************************************************************/ - public static boolean isIn(String compare, String inParameter1) - { - return StringUtils.isIn(compare, new String[]{inParameter1}); - } - /***********************************************************************/ - public static String pad(String original, int length, String paddingCharacter) - { - original = original == null ? "" : original; - int paddingNeeded = length - original.length(); - StringBuffer buffer = new StringBuffer(original); - for (int i = 0; i < paddingNeeded; i++) - { - buffer.append(paddingCharacter); - } - return buffer.toString(); - } - /***********************************************************************/ - private boolean isNull(String main) - { - return !StringUtils.isNonZero(clearNull(main)); - } - /***********************************************************************/ - public String getFileName(String fileName) - { - return fileName.substring(fileName.lastIndexOf(File.separatorChar) + 1); - } - /***********************************************************************/ - public static String formatExcelString(String in) - { - if ("0".equals(in) || "null".equals(in) || in == null) // So that null's & int(0) show up empty - { - return "\"\""; - } - else if (in.indexOf('\"') == -1) - { - return '\"' + in + '\"'; - } - else - { - StringBuffer buffer = new StringBuffer(); - buffer.append('\"'); - for (int i = 0; i < in.length(); i++) - { - char c = in.charAt(i); - buffer.append((c == '\"') ? "\"\"" : "" + c); - } - buffer.append('\"'); - return buffer.toString(); - } - } - /************************************************************************/ - public static int getLength(String s) - { - return s == null ? 0 : s.length(); - } - /************************************************************************/ - public String toHTMLEncode(String string) - { - return StringUtils.toHTMLEncode(clearNull(string)); - } - /************************************************************************/ - public String toURLEncode(String string) - { - return StringUtils.toURLEncode(clearNull(string)); - } - /************************************************************************/ - public static String toJavaScriptEncode(String string) - { - return StringUtils.toJavaScriptEncode(clearNull(string, null)); - } - /************************************************************************/ - public static String toJavaScriptEncode(Number n) - { - return n == null ? "null" : n.toString(); - } - /************************************************************************/ - public static String toJavaScriptEncode(Object n) - { - if (n == null) - { - return "null"; - } - else if (n instanceof Number) - { - return toJavaScriptEncode((Number) n); - } - else - { - return toJavaScriptEncode(n.toString()); - } - } - public static String asXml(String s) - { - return StringUtils.escapeForXml(s); - } - /************************************************************************/ - /************************************************************************/ -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/persistence/DatabaseObjectSaver.java b/src/main/java/com/spun/util/persistence/DatabaseObjectSaver.java deleted file mode 100644 index 1dda4d2..0000000 --- a/src/main/java/com/spun/util/persistence/DatabaseObjectSaver.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.spun.util.persistence; - -import java.sql.SQLException; -import java.sql.Statement; -import com.spun.util.database.DatabaseObject; - -public class DatabaseObjectSaver implements Saver -{ - private Statement stmt; - public DatabaseObjectSaver(Statement stmt) - { - this.stmt = stmt; - } - public DatabaseObject save(DatabaseObject save) throws SavingException - { - try - { - save.save(stmt); - return save; - } - catch (SQLException e) - { - throw new SavingException(e); - } - } -} diff --git a/src/main/java/com/spun/util/servlets/EasyEmailLoader.java b/src/main/java/com/spun/util/servlets/EasyEmailLoader.java deleted file mode 100644 index 555feb0..0000000 --- a/src/main/java/com/spun/util/servlets/EasyEmailLoader.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.spun.util.servlets; - -import com.spun.util.servlets.EmailServer.EmailLoader; - -public class EasyEmailLoader implements EmailLoader -{ - - private final String subject; - private final String text; - private final String html; - /***********************************************************************/ - public EasyEmailLoader(String subject,String text,String html) - { - this.subject = subject; - this.text = text; - this.html = html; - } - /***********************************************************************/ - public void load(EmailServer server) - { - server.setEmailHtmlBody(html); - server.setEmailSubject(subject); - server.setEmailTextBody(text); - } - /***********************************************************************/ -} diff --git a/src/main/java/com/spun/util/servlets/EmailServer.java b/src/main/java/com/spun/util/servlets/EmailServer.java deleted file mode 100644 index da41ec7..0000000 --- a/src/main/java/com/spun/util/servlets/EmailServer.java +++ /dev/null @@ -1,330 +0,0 @@ -package com.spun.util.servlets; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.Date; -import java.util.Properties; - -import javax.activation.DataHandler; -import javax.mail.Message; -import javax.mail.MessagingException; -import javax.mail.Multipart; -import javax.mail.PasswordAuthentication; -import javax.mail.Session; -import javax.mail.Transport; -import javax.mail.internet.InternetAddress; -import javax.mail.internet.MimeBodyPart; -import javax.mail.internet.MimeMessage; -import javax.mail.internet.MimeMultipart; - -import org.apache.velocity.context.Context; - -import com.spun.util.ByteArrayDataSource; -import com.spun.util.StringUtils; -import com.spun.util.ArrayUtils; -import com.spun.util.velocity.ContextAware; -import com.spun.util.velocity.ParseCall; - -public class EmailServer -{ - private EmailLoader loader = null; - private String emailSubject = null; - private String emailHtmlBody = null; - private String emailTextBody = null; - private ArrayList bcc = new ArrayList(); - private String to[]; - private String from; - private String smtpServer; - private ArrayList parts = new ArrayList(); - private ArrayList images = new ArrayList(); - private static boolean mockTransport = false; - public static Message lastMockSentItem = null; - private String gmailUser; - private String gmailPass; - /***********************************************************************/ - public static void setMockTransport(boolean mockTransport) - { - EmailServer.mockTransport = mockTransport; - lastMockSentItem = null; - } - public static Message getLastSentItem() - { - return lastMockSentItem; - } - /***********************************************************************/ - public static boolean isEmailValid(String email) - { - try - { - new javax.mail.internet.InternetAddress(email); - return email.indexOf("@") != -1; - } - catch (javax.mail.internet.AddressException e) - { - return false; - } - catch (Throwable e) - { - return false; - } - } - /***********************************************************************/ - public EmailServer(String smtpServer, String velocityTemplate, ParseCall parser, ContextAware contextAware, - String to, String from) - { - this(smtpServer, velocityTemplate, parser, contextAware, new String[]{to}, from); - } - /***********************************************************************/ - public EmailServer(String smtpServer, String velocityTemplate, ParseCall parser, ContextAware contextAware, - String[] to, String from) - { - this(smtpServer, new VelocityEmailLoader(velocityTemplate, parser, contextAware), to, from); - } - /***********************************************************************/ - public EmailServer(String smtpServer, EmailLoader loader, String[] to, String from) - { - this.smtpServer = smtpServer; - this.loader = loader; - this.to = to; - this.from = from; - } - /***********************************************************************/ - public void addTo(String email) - { - to = (String[]) ArrayUtils.addToArray(to, email); - } - /***********************************************************************/ - public void clearTo() - { - to = new String[0]; - } - /***********************************************************************/ - public void addBCC(String email) - { - bcc.add(email); - } - /***********************************************************************/ - public void clearBCC() - { - bcc = new ArrayList(); - } - /***********************************************************************/ - public void send() throws Exception - { - send(false, null, null); - } - /***********************************************************************/ - public void send(boolean useGoogle, String user, String pass) throws Exception - { - - gmailUser = user; - gmailPass = pass; - - Properties props = System.getProperties(); - props.put("mail.smtp.host", smtpServer); - - Session session = null; - - if(useGoogle) { - props.setProperty("mail.transport.protocol", "smtp"); - props.setProperty("mail.host", smtpServer); - props.put("mail.smtp.auth", "true"); - props.put("mail.smtp.port", "587"); - props.put("mail.smtp.socketFactory.port", "587"); - props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); - props.put("mail.smtp.socketFactory.fallback", "false"); - props.put("mail.smtp.starttls.enable", "true"); - props.put("mail.smtp.ssl", "true"); - - session = Session.getDefaultInstance(props, - new javax.mail.Authenticator() { - protected PasswordAuthentication getPasswordAuthentication() { - return new PasswordAuthentication(gmailUser, gmailPass); - } - } - ); - session.setDebug(false); - } else { - session = Session.getDefaultInstance(props); - } - - Message msg = new MimeMessage(session); - msg.setFrom(new InternetAddress(from)); - for (int i = 0; i < to.length; i++) - { - msg.addRecipient(Message.RecipientType.TO, new InternetAddress(to[i])); - } - for (int i = 0; i < bcc.size(); i++) - { - msg.addRecipient(Message.RecipientType.BCC, new InternetAddress(bcc.get(i))); - // My_System.variable("BBC - '"+bcc.get(i).toString()+"'"); - } - msg.setHeader("X-Priority","3"); - msg.setHeader("X-MSMail-Priority","Normal"); - msg.setHeader("X-Mailer", "Microsoft Outlook Express 6.00.2900.3138"); - msg.setHeader("X-MimeOLE","Produced By Microsoft MimeOLE V6.00.2900.3138"); - msg.setHeader("X-Virus-Scanned","Symantec AntiVirus Scan Engine"); - msg.setSentDate(new Date()); - loader.load(this); - Multipart mp = new MimeMultipart("alternative"); - - if (emailTextBody != null) - { - MimeBodyPart part = new MimeBodyPart(); - part.getAllHeaders(); - part.setText(emailTextBody, "iso-8859-1"); - part.setHeader("Content-Transfer-Encoding", "Quoted-printable"); - mp.addBodyPart(part); - } - if (emailHtmlBody != null) - { - MimeBodyPart part = new MimeBodyPart(); - part.setDataHandler(new DataHandler(new ByteArrayDataSource(emailHtmlBody, "text/html"))); - part.setHeader("Content-Transfer-Encoding", "Quoted-printable"); - mp.addBodyPart(part); - for (int i = 0; i < images.size(); i++) - { - mp.addBodyPart((MimeBodyPart) images.get(i)); - } - } - if (parts.size() != 0) - { - Multipart mp1 = mp; - mp = new MimeMultipart("mixed"); - //Add Text Part - MimeBodyPart part = new MimeBodyPart(); - part.setContent(mp1); - mp.addBodyPart(part); - for (int i = 0; i < parts.size(); i++) - { - mp.addBodyPart((MimeBodyPart) parts.get(i)); - } - } - msg.setContent(mp); - msg.setSubject(emailSubject); - msg.saveChanges(); // don't forget this - if (!mockTransport) - { - Transport.send(msg); - } - else - { - lastMockSentItem = msg; - } - } - /***********************************************************************/ - public void addPart(MimeBodyPart part) - { - parts.add(part); - } - /***********************************************************************/ - public static void addExcelFile(EmailServer email, String excelFileContent, String fileName) - throws MessagingException - { - MimeBodyPart part = new MimeBodyPart(); - part.setDataHandler(new DataHandler(new ByteArrayDataSource(excelFileContent, "application/octet-stream"))); - // Define the encoding (choose between BASE64, UUENCODE, QUOTED-PRINTABLE) - part.setHeader("Content-Transfer-Encoding", "QUOTED-PRINTABLE"); - part.setFileName(fileName); - email.addPart(part); - } - /***********************************************************************/ - public void addHTMLImage(String file, String url) throws FileNotFoundException, MessagingException - { - String fileName = file.substring(file.lastIndexOf(File.separator) + 1); - //My_System.variable("fileName = " + fileName); - FileInputStream fileInputStream = new FileInputStream(file); - addHTMLImage(url, fileName, fileInputStream); - } - /***********************************************************************/ - public void addHTMLImage(String url, String fileName, InputStream inputStream) throws MessagingException - { - MimeBodyPart part = new MimeBodyPart(); - url = url == null ? "" : url; - part.setDataHandler(new DataHandler(new ByteArrayDataSource(inputStream, "image/gif"))); - // Define the encoding (choose between BASE64, UUENCODE, QUOTED-PRINTABLE) - part.setHeader("Content-Transfer-Encoding", "BASE64"); - part.addHeader("Content-Location", url + fileName); - part.setFileName(fileName); - images.add(part); - } - /***********************************************************************/ - /***********************************************************************/ - public static interface EmailLoader - { - public void load(EmailServer server); - } - public static class VelocityEmailLoader implements EmailLoader, ContextAware - { - public static String TEXT_BODY = "TextBody"; - public static String HTML_BODY = "HtmlBody"; - public static String SUBJECT = "Subject"; - private String template = null; - private ContextAware contextAware = null; - private String currentEmailPart; - private ParseCall parser; - /***********************************************************************/ - public VelocityEmailLoader(String template, ParseCall parser, ContextAware contextAware) - { - this.template = template; - this.contextAware = contextAware; - this.parser = parser; - } - /***********************************************************************/ - public void load(EmailServer server) - { - try - { - server.emailTextBody = getTextBody(); - server.emailHtmlBody = getHtmlBody(); - server.emailSubject = getSubject(); - } - catch (Throwable t) - { - throw new Error(t); - } - } - /***********************************************************************/ - public String getTextBody() - { - currentEmailPart = TEXT_BODY; - String result = parser.parse(template, this); - return StringUtils.loadNullableString(result); - } - /***********************************************************************/ - public String getHtmlBody() - { - currentEmailPart = HTML_BODY; - String result = parser.parse(template, this); - return StringUtils.loadNullableString(result); - } - /***********************************************************************/ - public String getSubject() - { - currentEmailPart = SUBJECT; - String result = parser.parse(template, this); - return StringUtils.loadNullableString(result); - } - /***********************************************************************/ - public void setupContext(Context context) - { - contextAware.setupContext(context); - context.put("emailPart", currentEmailPart); - } - } - public void setEmailHtmlBody(String emailHtmlBody) - { - this.emailHtmlBody = emailHtmlBody; - } - public void setEmailSubject(String emailSubject) - { - this.emailSubject = emailSubject; - } - public void setEmailTextBody(String emailTextBody) - { - this.emailTextBody = emailTextBody; - } -} diff --git a/src/main/java/com/spun/util/servlets/PassThrough.java b/src/main/java/com/spun/util/servlets/PassThrough.java deleted file mode 100644 index 8de1a31..0000000 --- a/src/main/java/com/spun/util/servlets/PassThrough.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.spun.util.servlets; - -import javax.servlet.http.HttpServletRequest; - - - -public class PassThrough -{ - private String key = null; - private SynchronizedServlet servlet= null; - private String htmlText = null; - private Throwable error = null; - private long created = 0; - private ProgressBar progressBar; - /***********************************************************************/ - public PassThrough(HttpServletRequest req, SynchronizedServlet servlet) - { - this(req, servlet, null); - } - /***********************************************************************/ - public PassThrough(HttpServletRequest req, SynchronizedServlet servlet, ProgressBar progressBar) - { - try - { - this.key = req.getSession().getId(); - } - catch(java.lang.NoSuchMethodError e) - { - this.key = req.getRemoteAddr(); // backwards compatability. - } - this.progressBar = progressBar; - this.servlet = servlet; - created = System.currentTimeMillis(); - } - /***********************************************************************/ - public PassThrough(String key, SynchronizedServlet servlet) - { - this.key = key; - this.servlet = servlet; - created = System.currentTimeMillis(); - } - /***********************************************************************/ - public SynchronizedServlet getSynchronizedServlet() - { - return servlet; - } - /***********************************************************************/ - public String getKey() - { - return key; - } - /***********************************************************************/ - public long getCreationTime() - { - return created; - } - /***********************************************************************/ - public String getResponse() - throws InterruptedException, Throwable - { - while (htmlText == null) - { - Thread.sleep(200); - if (error != null) - { - if (progressBar != null) - { - progressBar.doFinish(); - } - throw error; - } - } - if (progressBar != null) - { - progressBar.doFinish(); - } - return htmlText; - - } - /***********************************************************************/ - public void setResponse(String text) - { - this.htmlText = text; - } - /***********************************************************************/ - public void setError(Throwable error) - { - this.error = error; - } - /***********************************************************************/ - public void doProgressReport(double amountDone) - { - if (progressBar != null) - { - progressBar.doProgressReport(amountDone); - } - } - - /***********************************************************************/ - /***********************************************************************/ -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/servlets/ServletSynchronizer.java b/src/main/java/com/spun/util/servlets/ServletSynchronizer.java deleted file mode 100644 index f7ef438..0000000 --- a/src/main/java/com/spun/util/servlets/ServletSynchronizer.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.spun.util.servlets; - -import java.util.Hashtable; - -/** - * This is the top level servlet which all others extend. - **/ -public class ServletSynchronizer -{ - private Hashtable keyHolder = new Hashtable(); - private long timeOut = 120000; - /***********************************************************************/ - public synchronized void queueServlet(PassThrough pass) - { - PassThrough old = (PassThrough) keyHolder.put(pass.getKey(), pass); - if (old != null) - { -// My_System.event("Aborted on key '" + pass.getKey() + "'"); - old.setResponse("Aborted"); - } - if ((old == null) || ((System.currentTimeMillis() - old.getCreationTime()) > timeOut)) - { - pass.getSynchronizedServlet().init(this, pass.getKey()); -// My_System.event("Started on Key '" + pass.getKey() + "'"); - new Thread(pass.getSynchronizedServlet()).start(); - } - } - /***********************************************************************/ - /** - * To pass on the response - **/ - public synchronized void servletFinished(String response, String key) - { - PassThrough pass = (PassThrough) keyHolder.remove(key); - pass.setResponse(response); - } - /***********************************************************************/ - /** - * To pass on the response - **/ - public synchronized void servletProgressReport(double amountDone, String key) - { - PassThrough pass = (PassThrough) keyHolder.get(key); - pass.doProgressReport(amountDone); - } - /***********************************************************************/ - /** - * To pass on a exception - **/ - public synchronized void servletFinished(Throwable error, String key) - { - PassThrough pass = (PassThrough) keyHolder.remove(key); - pass.setError(error); - } - /***********************************************************************/ - /***********************************************************************/ -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/servlets/SynchronizedServlet.java b/src/main/java/com/spun/util/servlets/SynchronizedServlet.java deleted file mode 100644 index f763ab1..0000000 --- a/src/main/java/com/spun/util/servlets/SynchronizedServlet.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.spun.util.servlets; - -public interface SynchronizedServlet - extends Runnable -{ - /***********************************************************************/ - /** - * This should run the servlet. when it is completed, it should make a call - * back to ServletSynchronizer.servletFinished(key, result) - * @see com.spun.util.servlets.ServletSynchronizer.servletFinished(String,String) - **/ - public void init(ServletSynchronizer sync, String key); - - /***********************************************************************/ - /***********************************************************************/ -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/timers/LapTimeStatistics.java b/src/main/java/com/spun/util/timers/LapTimeStatistics.java deleted file mode 100644 index 57d53ef..0000000 --- a/src/main/java/com/spun/util/timers/LapTimeStatistics.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.spun.util.timers; - -/** - * A Utility for timing things. this is multi-thread safe. - **/ -public class LapTimeStatistics -{ - private String label = null; - private EventTime totalTime = null; - private EventTime times[] = null; - /************************************************************************/ - public LapTimeStatistics(LapTimer lapTimer) - { - loadFirstLapTimer(lapTimer); - } - /************************************************************************/ - public LapTimeStatistics(String label) - { - this.label = label; - } - /************************************************************************/ - public int getCount() - { - return (totalTime == null) ? 0 : totalTime.getCount(); - } - /************************************************************************/ - private void loadFirstLapTimer(LapTimer lapTimer) - { - if (label == null) - { - lapTimer.getLabel(); - } - totalTime = new EventTime("Total Time", 0); - totalTime.add(lapTimer.getTotalTime()); - LapTime lapTimes[] = lapTimer.getLapTimes(); - times = new EventTime[lapTimes.length]; - for (int i = 0; i < lapTimes.length; i++) - { - times[i] = new EventTime(lapTimes[i].getLabel(), 0); - times[i].add(lapTimes[i].getLapTime()); - } - } - /************************************************************************/ - public EventTime getTotalTime() - { - return totalTime; - } - /************************************************************************/ - public String getLabel() - { - return label; - } - /************************************************************************/ - public synchronized void add(LapTimer lapTimer) - { - if (totalTime == null) - { - loadFirstLapTimer(lapTimer); - } - else - { - totalTime.add(lapTimer.getTotalTime()); - LapTime lapTimes[] = lapTimer.getLapTimes(); - if (lapTimes.length != times.length) { throw new Error("Tried to add a LapTimer with " + lapTimes.length + " laps. Must have " + times.length); } - for (int i = 0; i < lapTimes.length; i++) - { - times[i].add(lapTimes[i].getLapTime()); - } - } - } - /***********************************************************************/ - public EventTime[] getLapTimes() - { - return this.times; - } - /***********************************************************************/ - /***********************************************************************/ -} diff --git a/src/main/java/com/spun/util/timers/LapTimer.java b/src/main/java/com/spun/util/timers/LapTimer.java deleted file mode 100644 index 6c92132..0000000 --- a/src/main/java/com/spun/util/timers/LapTimer.java +++ /dev/null @@ -1,171 +0,0 @@ -package com.spun.util.timers; - -import java.util.ArrayList; -import com.spun.util.DateDifference; -import com.spun.util.MySystem; - -/** - * A Utility for timing things. this is NOT multi-thread safe. - **/ -public class LapTimer -{ - private long startTime = 0; - private long lapTime = 0; - private long endTime = 0; - private ArrayList lapTimes = null; - private String label = null; - private long pausedTime = 0; - private long pausedTotalTime = 0; - private static Clock clock = new Clock(); - public static void registerClock(Clock clock) - { - LapTimer.clock = clock; - } - /************************************************************************/ - public LapTimer() - { - this(null); - } - /************************************************************************/ - public LapTimer(String label) - { - startTime = getCurrentTime(); - lapTime = startTime; - lapTimes = new ArrayList(); - this.label = label; - } - private long getCurrentTime() - { - return clock.getTime(); - } - /************************************************************************/ - public String getLabel() - { - return label; - } - /************************************************************************/ - /** - * Marks the time for a lap & a label. - * ie. A timer could store - 1 hour 10 mins ["1st Quarter", 15 mins,"2nd Quarter", 15 mins,"Half Time", 10 mins, "3rd Quarter", 15 mins,"4th Quarter", 15 mins] - **/ - public long lap(String label) - { - return lap(false, label); - } - /************************************************************************/ - public long end(String label) - { - return lap(true, label); - } - /************************************************************************/ - public boolean isPaused() - { - return pausedTime != 0; - } - /************************************************************************/ - public void pause() - { - if (!isPaused()) - { - pausedTime = getCurrentTime(); - } - } - /************************************************************************/ - public void resume() - { - if (isPaused()) - { - lapTime = getCurrentTime(); - pausedTotalTime += lapTime - pausedTime; - pausedTime = 0; - } - } - /************************************************************************/ - public long lap(boolean end, String label) - { - long newTime = getCurrentTime(); - long difference = newTime - lapTime; - MySystem.variable("difference", difference); - lapTimes.add(new LapTime(difference, label)); - lapTime = newTime; - endTime = (end) ? newTime : 0; - return difference; - } - /************************************************************************/ - public LapTime[] getLapTimes() - { - return LapTime.toArray(lapTimes); - } - /************************************************************************/ - public int getLapCount() - { - return lapTimes.size(); - } - /************************************************************************/ - public LapTime getLap(int i) - { - if (i >= lapTimes.size()) { return null; } - return (LapTime) lapTimes.get(i); - } - /************************************************************************/ - public LapTime getLap(String label) - { - for (int i = 0; i < lapTimes.size(); i++) - { - LapTime time = (LapTime) lapTimes.get(i); - if (label.equals(time.getLabel())) { return time; } - } - return null; - } - /************************************************************************/ - public long getTotalTime() - { - long lastrecordedTime = 0; - if (endTime != 0) - { - lastrecordedTime = endTime; - } - else if (isPaused()) - { - lastrecordedTime = pausedTime; - } - else - { - lastrecordedTime = getCurrentTime(); - } - return lastrecordedTime - startTime - pausedTotalTime; - } - /************************************************************************/ - public DateDifference getTotalTimeAsDateDifference() - { - return new DateDifference(getTotalTime()); - } - /************************************************************************/ - public String toString() - { - String value = String - .format( - "com.spun.util.timers.LapTimer[ Label = '%s',\n isPaused = %s ,\n Lap Times = %s ,\n Total Paused Time = %s ,\n Total Time = %s]", - label, isPaused(), getPrintableLapTimesArray(), new DateDifference(pausedTotalTime) - .getStandardTimeText(1), getTotalTimeAsDateDifference().getStandardTimeText(1)); - return value; - } - /************************************************************************/ - /** - * convenience function for toString(). - **/ - private String getPrintableLapTimesArray() - { - LapTime times[] = getLapTimes(); - String output = "["; - for (int i = 0; i < times.length; i++) - { - output += (i > 0) ? ", " : ""; - output += times[i].getLapTimeAsDateDifference().getStandardTimeText(2); - } - output += "]"; - return output; - } - /***********************************************************************/ - /***********************************************************************/ -} diff --git a/src/main/java/org/approvaltests/ReporterFactory.java b/src/main/java/org/approvaltests/ReporterFactory.java index 336da28..c117b6f 100644 --- a/src/main/java/org/approvaltests/ReporterFactory.java +++ b/src/main/java/org/approvaltests/ReporterFactory.java @@ -100,7 +100,7 @@ private static void setupReporters() } public static void clearAllReportersExceptDefault() { - Class all = reporters.get(FileTypes.Default); + Class all = reporters.get(FileTypes.Default); reporters.clear(); reporters.put(FileTypes.Default, all); } diff --git a/src/main/java/org/lambda/query/OrderBy.java b/src/main/java/org/lambda/query/OrderBy.java deleted file mode 100644 index 182a3ff..0000000 --- a/src/main/java/org/lambda/query/OrderBy.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.lambda.query; - -import java.util.Comparator; - -import org.lambda.functions.Function1; - -@SuppressWarnings("rawtypes") -public class OrderBy implements Comparator -{ - public static enum Order { - Ascending, Descending - } - private Function1 f1; - private int ascending; - public OrderBy(Function1 f1) - { - this(Order.Ascending, f1); - } - public OrderBy(Order order, Function1 f1) - { - this.f1 = f1; - this.ascending = order == Order.Ascending ? 1 : -1; - } - @Override - public int compare(T a, T b) - { - return f1.call(a).compareTo(f1.call(b)) * ascending; - } -} diff --git a/src/main/java/org/lambda/query/Query.java b/src/main/java/org/lambda/query/Query.java index a91ff85..bd887a8 100644 --- a/src/main/java/org/lambda/query/Query.java +++ b/src/main/java/org/lambda/query/Query.java @@ -3,13 +3,9 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; -import java.util.Collections; import java.util.List; import org.lambda.functions.Function1; -import org.lambda.query.OrderBy.Order; - -import com.spun.util.ArrayUtils; public class Query { @@ -50,14 +46,6 @@ public static List where(In[] list, Function1 funct) } return out; } - public static In max(List list, Function1 f1) - { - return getTop(list, f1, 1); - } - public static In min(List list, Function1 f1) - { - return getTop(list, f1, -1); - } public static Double average(List list, Function1 f1) { double total = 0.00; @@ -67,40 +55,6 @@ public static Double average(List list, Function1 f1) } return total / list.size(); } - private static In getTop(List list, Function1 f1, int modifier) - { - if (ArrayUtils.isEmpty(list)) { return null; } - In found = list.get(0); - Comparable max = f1.call(found); - for (In in : list) - { - Comparable current = f1.call(in); - if (max.compareTo(current) * modifier < 0) - { - max = current; - found = in; - } - } - return found; - } - public static T[] orderBy(T[] list, Function1 f1) - { - return orderBy(list, Order.Ascending, f1); - } - public static T[] orderBy(T[] list, Order order, Function1 f1) - { - Arrays.sort(list, new OrderBy(order, f1)); - return list; - } - public static List orderBy(List list, Function1 f1) - { - return orderBy(list, Order.Ascending, f1); - } - public static List orderBy(List list, Order order, Function1 f1) - { - Collections.sort(list, new OrderBy(order, f1)); - return list; - } public static Double sum(In[] list, Function1 f1) { return sum(Arrays.asList(list), f1); @@ -122,16 +76,4 @@ public static Double sum(Out[] list) { return sum(list, new Echo1()); } - public static T max(List numbers) - { - return (T) max((List) numbers, new Echo1()); - } - public static T max(T[] numbers) - { - return max(Arrays.asList(numbers)); - } - public static T min(List numbers) - { - return (T) min((List) numbers, new Echo1()); - } } diff --git a/src/main/java/org/teachingextensions/logo/ColorWheel.java b/src/main/java/org/teachingextensions/logo/ColorWheel.java index 9519c83..7c93e35 100644 --- a/src/main/java/org/teachingextensions/logo/ColorWheel.java +++ b/src/main/java/org/teachingextensions/logo/ColorWheel.java @@ -3,13 +3,13 @@ import java.awt.Color; /** - * - * ColorWheel is a place to store a color palette.
+ * A painter's palette + * ColorWheel is a place to store a color palette.
* Example: If you have a palette of * blue, * red, - * and purple
- * and then used it to print out the numbers, you would get
+ * and purple
+ * and then used it to print out the numbers, you would get
* 1 * 2 * 3 @@ -24,7 +24,7 @@ public class ColorWheel { private static Wheel wheel = new Wheel(); /** - * This method adds a color to the ColorWheel.
+ * This method adds a color to the ColorWheel.
* Example: {@code ColorWheel.addColor(PenColors.Reds.Red);} * @param color * the color to add to the wheel @@ -34,7 +34,7 @@ public static void addColor(Color color) wheel.add(color); } /** - * This method returns the next color of the ColorWheel.
+ * This method returns the next color of the ColorWheel.
* Example: {@code Color color = ColorWheel.getNextColor();} * * @return the next color of the ColorWheel @@ -44,7 +44,7 @@ public static Color getNextColor() return wheel.next(); } /** - * This method returns the a random color from the options on the ColorWheel.
+ * This method returns the a random color from the options on the ColorWheel.
* Example: {@code Color color = ColorWheel.getNextColor();} * * @return A random color from the ColorWheel diff --git a/src/main/java/org/teachingextensions/logo/Colors.java b/src/main/java/org/teachingextensions/logo/Colors.java index 28bdc39..261732f 100644 --- a/src/main/java/org/teachingextensions/logo/Colors.java +++ b/src/main/java/org/teachingextensions/logo/Colors.java @@ -4,7 +4,7 @@ import java.util.Random; /** - * + * A color wheel * Every color under the * rainbow, @@ -12,7 +12,7 @@ * * * Use PenColors - * @deprecated use {@link PenColors()} instead. + * @deprecated use {@link PenColors} instead. */ @Deprecated public class Colors diff --git a/src/main/java/org/teachingextensions/logo/PenColors.java b/src/main/java/org/teachingextensions/logo/PenColors.java index dcba265..2474a74 100644 --- a/src/main/java/org/teachingextensions/logo/PenColors.java +++ b/src/main/java/org/teachingextensions/logo/PenColors.java @@ -4,7 +4,7 @@ import java.util.Random; /** - * + * A color wheel * Every pen color under the * rainbow, diff --git a/src/main/java/org/teachingextensions/logo/Pizza.java b/src/main/java/org/teachingextensions/logo/Pizza.java index 1b864e9..080c24e 100644 --- a/src/main/java/org/teachingextensions/logo/Pizza.java +++ b/src/main/java/org/teachingextensions/logo/Pizza.java @@ -3,7 +3,7 @@ import java.util.ArrayList; /** - * + * A slice of pizza * The Pizza allows you to make different sizes and kinds of pizza! */ public class Pizza diff --git a/src/main/java/org/teachingextensions/logo/Tortoise.java b/src/main/java/org/teachingextensions/logo/Tortoise.java index fe72b83..f23c2c0 100644 --- a/src/main/java/org/teachingextensions/logo/Tortoise.java +++ b/src/main/java/org/teachingextensions/logo/Tortoise.java @@ -6,7 +6,7 @@ import org.teachingextensions.logo.utils.TortoiseUtils; /** - * + * A tortoise drawing a line * The Tortoise allows you to draw lines and shapes by moving it around on the window */ public class Tortoise @@ -41,7 +41,7 @@ public static int getSpeed() return turtle().getSpeed(); } /** - * Sets the color drawn by the Tortoise.
+ * Sets the color drawn by the Tortoise.
*
Example: {@code Tortoise.setPenColor(PenColors.Reds.Red)}
* * @param color @@ -53,7 +53,7 @@ public static void setPenColor(Color color) turtle().setPenColor(color); } /** - * Moves the Tortoise Forward the number of pixels specified.
+ * Moves the Tortoise Forward the number of pixels specified.
*
Example: {@code Tortoise.move(72)}
* * @param lengthInPixels @@ -65,7 +65,7 @@ public static void move(Number lengthInPixels) turtle().move(lengthInPixels); } /** - * Turns the Tortoise to the right (clockwise) the degrees specified.
+ * Turns the Tortoise to the right (clockwise) the degrees specified.
*
Example: {@code Tortoise.turn(90)}
* * @param degreesToTheRight @@ -77,7 +77,7 @@ public static void turn(Number degreesToTheRight) turtle().turn(degreesToTheRight.doubleValue()); } /** - * Sets the width of the pen drawn by the Tortoise.
+ * Sets the width of the pen drawn by the Tortoise.
*
Example: {@code Tortoise.setPenWidth(2)}
* * @param width @@ -89,7 +89,7 @@ public static void setPenWidth(Number width) } /** * Gives you access to the window the - * Tortoise is moving on so you can do things like change it's color.
+ * Tortoise is moving on so you can do things like change it's color.
* Example: {@code TurtlePanel panel = Tortoise.getBackgroundWindow()} */ public static TurtlePanel getBackgroundWindow() @@ -97,7 +97,7 @@ public static TurtlePanel getBackgroundWindow() return turtle().getBackgroundWindow(); } /** - * Gets the current width of the pen drawn by the Tortoise.
+ * Gets the current width of the pen drawn by the Tortoise.
*
Example: {@code width = Tortoise.getPenWidth()}
* * @return the width of the pen stroke @@ -107,7 +107,7 @@ public static int getPenWidth() return turtle().getPenWidth(); } /** - * Gets the current color of the pen drawn by the Tortoise.
+ * Gets the current color of the pen drawn by the Tortoise.
*
Example: {@code pen = Tortoise.getPenColor()}
* * @return the color of the pen stroke @@ -117,8 +117,8 @@ public static Color getPenColor() return turtle().getPenColor(); } /** - * Sets the position of the Tortoise on the y axis.
- * (0,0) is the top left of the screen
+ * Sets the position of the Tortoise on the y axis.
+ * (0,0) is the top left of the screen
*
Example: {@code Tortoise.setY(30);}
* * @param y @@ -129,8 +129,8 @@ public static void setY(int y) turtle().setY(y); } /** - * Sets the position of the Tortoise on the x axis.
- * (0,0) is the top left of the screen
+ * Sets the position of the Tortoise on the x axis.
+ * (0,0) is the top left of the screen
*
Example: {@code Tortoise.setX(30);}
* * @param x @@ -141,8 +141,8 @@ public static void setX(int x) turtle().setX(x); } /** - * Gets the current position of the Tortoise on the y axis.
- * (0,0) is the top left of the screen
+ * Gets the current position of the Tortoise on the y axis.
+ * (0,0) is the top left of the screen
*
Example: {@code y = Tortoise.getY()}
* * @return y the position in pixels of the Tortoise on the Y axis @@ -152,8 +152,8 @@ public static int getY() return turtle().getY(); } /** - * Gets the current position of the Tortoise on the x axis.
- * (0,0) is the top left of the screen
+ * Gets the current position of the Tortoise on the x axis.
+ * (0,0) is the top left of the screen
*
Example: {@code x = Tortoise.getX()}
* * @return x the position in pixels of the Tortoise on the X axis @@ -163,9 +163,9 @@ public static int getX() return turtle().getX(); } /** - * Gets the current heading of the Tortoise.
- * 0 degrees is due north.
- * 90 degrees is due east.
+ * Gets the current heading of the Tortoise.
+ * 0 degrees is due north.
+ * 90 degrees is due east.
*
Example: {@code angle = Tortoise.getAngleInDegrees()}
* * @return the angle in degrees of the Tortoise @@ -175,7 +175,7 @@ public static double getAngle() return turtle().getAngleInDegrees(); } /** - * Changes the type of animal you are using.
+ * Changes the type of animal you are using.
*
Example: {@code Tortoise.setAnimal(Animals.Spider);}
* * @see Animals @@ -185,7 +185,7 @@ public static void setAnimal(Animals animal) turtle().setAnimal(animal); } /** - * Blows up your turtle!
+ * Blows up your turtle!
*
Example: {@code Tortoise.explode(Animals.ExplodedTurtle);}
* * @see Animals @@ -195,7 +195,7 @@ public static void explode() turtle().setAnimal(Animals.ExplodedTurtle); } /** - * Makes it so the tortoise will not draw a line of color out of its butt.
+ * Makes it so the tortoise will not draw a line of color out of its butt.
* Example: {@code Tortoise.penUp()} */ public static void penUp() @@ -203,7 +203,7 @@ public static void penUp() turtle().penUp(); } /** - * Makes it so a line of color out of will trail from the Tortoise.
+ * Makes it so a line of color out of will trail from the Tortoise.
* Example: {@code Tortoise.penDown()} */ public static void penDown() @@ -211,7 +211,7 @@ public static void penDown() turtle().penDown(); } /** - * Removes everything from the window.
+ * Removes everything from the window.
* Example: {@code Tortoise.clear()} */ public static void clear() @@ -219,7 +219,7 @@ public static void clear() turtle().clear(); } /** - * Hides the tortoise, you will still see the pen markings it made before and after it's hidden.
+ * Hides the tortoise, you will still see the pen markings it made before and after it's hidden.
* Example: {@code Tortoise.hide()} */ public static void hide() @@ -231,8 +231,8 @@ private static Turtle turtle() return TortoiseUtils.getTurtle(); } /** - * Sets the angle the Tortoise is facing.
- * 0 is straight up (like 'North')
+ * Sets the angle the Tortoise is facing.
+ * 0 is straight up (like 'North')
*
Example: {@code Tortoise.setAngle(42);}
* * @param angle @@ -243,7 +243,7 @@ public static void setAngle(int angle) turtle().setAngleInDegrees(angle); } /** - * Moves the Tortoise to a particular spot on the canvas.
+ * Moves the Tortoise to a particular spot on the canvas.
*
Example: {@code Tortoise.moveTo(100,200);}
* * @param x diff --git a/src/main/java/org/teachingextensions/logo/Turtle.java b/src/main/java/org/teachingextensions/logo/Turtle.java index 363d6d3..c4c098b 100644 --- a/src/main/java/org/teachingextensions/logo/Turtle.java +++ b/src/main/java/org/teachingextensions/logo/Turtle.java @@ -18,7 +18,7 @@ import com.spun.util.persistence.SavingException; /** - * + * A turtle drawing a line * The Turtle allows you to draw lines and shapes by moving it around on the window, and you can put more than one turtle on the same window... */ public class Turtle diff --git a/src/main/java/org/teachingextensions/logo/Wheel.java b/src/main/java/org/teachingextensions/logo/Wheel.java index 4ee14a9..dd7e9ee 100644 --- a/src/main/java/org/teachingextensions/logo/Wheel.java +++ b/src/main/java/org/teachingextensions/logo/Wheel.java @@ -6,7 +6,7 @@ import com.spun.util.NumberUtils; /** - * A Wheel is a List with no ending on beginning
+ * A Wheel is a List with no ending on beginning
* * Example: {@code * Wheel names = new Wheel(); @@ -17,7 +17,7 @@ * System.out.print(name + " "); * } * } - * Would result in :
+ * Would result in :
* Chocolate Peanut Butter Chocolate Peanut Butter Chocolate Peanut Butter * * @param @@ -26,7 +26,8 @@ public class Wheel { private List list = new ArrayList(); private int index = 0; - public Wheel(T... loadWith) + @SafeVarargs +public Wheel(T... loadWith) { for (T t : loadWith) { diff --git a/src/main/java/org/teachingextensions/logo/shapes/Circle.java b/src/main/java/org/teachingextensions/logo/shapes/Circle.java index a79160c..b9e83f5 100644 --- a/src/main/java/org/teachingextensions/logo/shapes/Circle.java +++ b/src/main/java/org/teachingextensions/logo/shapes/Circle.java @@ -10,7 +10,7 @@ import org.teachingextensions.windows.ProgramWindow; /** - * + * A blue circle * The Circle allows you to draw circles on the window */ public class Circle implements Paintable diff --git a/src/main/java/org/teachingextensions/logo/shapes/Text.java b/src/main/java/org/teachingextensions/logo/shapes/Text.java index 709777e..7b53039 100644 --- a/src/main/java/org/teachingextensions/logo/shapes/Text.java +++ b/src/main/java/org/teachingextensions/logo/shapes/Text.java @@ -10,7 +10,7 @@ import org.teachingextensions.logo.TurtlePanel; /** - * + * A sheet of paper with text on it * Text allows you to write text on the window */ public class Text implements Paintable @@ -29,7 +29,7 @@ public Text(String string) * * @param x * the X position - * @param + * @param y * the Y position */ public Text setTopLeft(int x, int y) diff --git a/src/main/java/org/teachingextensions/logo/utils/Sounds.java b/src/main/java/org/teachingextensions/logo/utils/Sounds.java index e865039..b2b887a 100644 --- a/src/main/java/org/teachingextensions/logo/utils/Sounds.java +++ b/src/main/java/org/teachingextensions/logo/utils/Sounds.java @@ -3,13 +3,13 @@ import java.awt.Toolkit; /** - * + * A speaker with sound waves * Sounds allows you to play sounds, like a 'beep' */ public class Sounds { /** - * Plays a beep through your speakers. BEEP!
+ * Plays a beep through your speakers. BEEP!
* Example: {@code Sounds.playBeep()} */ public static void playBeep() From 54b10a347ae6b1c08984e90181a0ca9b51a29c79 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Thu, 5 Mar 2015 10:22:09 -0800 Subject: [PATCH 011/111] Removed Unused classes --- .../java/com/spun/util/DatabaseUtils.java | 1362 ++++++++--------- src/main/java/com/spun/util/MySystem.java | 4 +- src/main/java/com/spun/util/ObjectUtils.java | 3 +- src/main/java/com/spun/util/StringUtils.java | 21 +- .../database/AutomaticVariableSetter.java | 36 +- .../database/CircularRedundancyError.java | 72 +- .../spun/util/database/ColumnMetadata.java | 292 ++-- .../com/spun/util/database/DatabaseCache.java | 80 +- .../util/database/DatabaseLifeCycleUtils.java | 596 ++++---- .../spun/util/database/DatabaseLoader.java | 76 +- .../util/database/DatabaseLoadingTracker.java | 80 +- .../spun/util/database/DatabaseObject.java | 208 +-- .../DatabaseRelationshipPersistent.java | 18 +- .../database/DatabaseTransactionInfo.java | 114 +- .../java/com/spun/util/database/Metadata.java | 36 +- .../util/database/NullDatabaseObject.java | 84 +- .../java/com/spun/util/database/Syncable.java | 12 +- src/main/java/com/spun/util/io/FileUtils.java | 22 +- .../com/spun/util/io/xml/XMLSerializable.java | 24 - .../persistence/DatabaseObjectDeletor.java | 26 - 20 files changed, 1549 insertions(+), 1617 deletions(-) delete mode 100644 src/main/java/com/spun/util/io/xml/XMLSerializable.java delete mode 100644 src/main/java/com/spun/util/persistence/DatabaseObjectDeletor.java diff --git a/src/main/java/com/spun/util/DatabaseUtils.java b/src/main/java/com/spun/util/DatabaseUtils.java index 51f828b..8e6820b 100644 --- a/src/main/java/com/spun/util/DatabaseUtils.java +++ b/src/main/java/com/spun/util/DatabaseUtils.java @@ -1,681 +1,681 @@ -package com.spun.util; - -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.ArrayList; -import java.util.Iterator; -import com.spun.util.database.DatabaseObject; -import com.spun.util.database.DatabaseTransactionInfo; -import com.spun.util.database.SqlConnectionException; - -/** - * A static class of convenience functions for database access - */ -public class DatabaseUtils -{ - private static ArrayList connections = new ArrayList(); - public static final int NEW = 1; - public static final int NEW_MODIFIED = 2; - public static final int OLD = 3; - public static final int OLD_MODIFIED = 4; - public static final int ACCESS = 0; - public static final int POSTGRESQL = 1; - public static final int SYBASE = 2; - public static final int ORACLE = 3; - public static final int SQLSERVER = 4; - public static final int SQLSERVER2000 = 5; - public static final int MY_SQL = 6; - public static final int SQLSERVER2005 = 7; - public static final String DATABASE_TYPES[] = {"Access", - "PostgreSQL", - "Sybase", - "Oracle", - "Microsoft SQL Server 7.00", - "Microsoft SQL Server 2000", - "MySQL", - "Microsoft SQL Server" }; - /***********************************************************************/ - public static String getDatabaseType(int type) - { - return DATABASE_TYPES[type]; - } - /***********************************************************************/ - public static int getDatabaseType(Statement stmt) throws SQLException - { - return getDatabaseType(stmt.getConnection()); - } - /***********************************************************************/ - public static int getDatabaseType(Connection con) throws SQLException - { - String dbName = con.getMetaData().getDatabaseProductName(); - for (int i = 0; i < DATABASE_TYPES.length; i++) - { - if (DATABASE_TYPES[i].equalsIgnoreCase(dbName.trim())) { return i; } - } - throw new Error("Unrecognized database product name: " + dbName); - } - /***********************************************************************/ - /** - * Finds the database type name for a jdbc sql type - */ - public static String findDatabaseName(int i) - { - String name = null; - switch (i) - { - case java.sql.Types.BIT : - name = "boolean"; - break; - case java.sql.Types.CHAR : - name = "char"; - break; - case java.sql.Types.DECIMAL : - name = "decimal"; - break; - case java.sql.Types.DOUBLE : - name = "numeric"; - break; - case java.sql.Types.FLOAT : - name = "numeric"; - break; - case java.sql.Types.INTEGER : - name = "integer"; - break; - case java.sql.Types.NUMERIC : - name = "numeric"; - break; - case java.sql.Types.TIMESTAMP : - name = "timestamp"; - break; - case java.sql.Types.VARCHAR : - name = "varchar"; - break; - default : - MySystem.warning("The Type not found(" + i + ")"); - break; - } - return name; - } - /***********************************************************************/ - /** - * Finds the java object or primative for a sql type - */ - public static String findSQLName(int i) - { - String name = null; - switch (i) - { - case java.sql.Types.ARRAY : - name = "unknown"; - break; - case java.sql.Types.BIGINT : - name = "long"; - break; - case java.sql.Types.BINARY : - name = "byte[]"; - break; - case java.sql.Types.BIT : - name = "boolean"; - break; - case java.sql.Types.BLOB : - name = "BLOB"; - break; - case java.sql.Types.CHAR : - name = "java.lang.String"; - break; - case java.sql.Types.CLOB : - name = "CLOB"; - break; - case java.sql.Types.DATE : - name = "java.sql.Date"; - break; - case java.sql.Types.DECIMAL : - name = "java.math.BigDecimal"; - break; - case java.sql.Types.DISTINCT : - name = "DISTINCT"; - break; - case java.sql.Types.DOUBLE : - name = "double"; - break; - case java.sql.Types.FLOAT : - name = "double"; - break; - case java.sql.Types.INTEGER : - name = "int"; - break; - case java.sql.Types.JAVA_OBJECT : - name = "unknown"; - break; - case java.sql.Types.LONGVARBINARY : - name = "byte[]"; - break; - case java.sql.Types.LONGVARCHAR : - name = "String"; - break; - case java.sql.Types.NULL : - name = "NULL"; - break; - case java.sql.Types.NUMERIC : - name = "java.math.BigDecimal"; - break; - case java.sql.Types.OTHER : - name = "OTHER"; - break; - case java.sql.Types.REAL : - name = "float"; - break; - case java.sql.Types.REF : - name = "REF"; - break; - case java.sql.Types.SMALLINT : - name = "short"; - break; - case java.sql.Types.STRUCT : - name = "STRUCT"; - break; - case java.sql.Types.TIME : - name = "java.sql.Time"; - break; - case java.sql.Types.TIMESTAMP : - name = "java.sql.Timestamp"; - break; - case java.sql.Types.TINYINT : - name = "byte"; - break; - case java.sql.Types.VARBINARY : - name = "byte[]"; - break; - case java.sql.Types.VARCHAR : - name = "java.lang.String"; - break; - case 11 : - name = "java.sql.Date"; - break; - case -9 : - name = "java.lang.String"; - break; - default : - MySystem.warning("The Type not found(" + i + ")"); - printSQLValues(); - break; - } - return name; - } - public static boolean isSqlServer(int databaseType) - { - switch (databaseType) - { - case SQLSERVER2000 : - case DatabaseUtils.SQLSERVER2005 : - case DatabaseUtils.SQLSERVER : - return true; - default : - return false; - } - } - /***********************************************************************/ - public static String makeSQL2000URL(String protocol, String server, String port, String database) - { - String theURL = ""; - protocol = (StringUtils.isNonZero(protocol)) ? (protocol) + "://" : ""; - server = (StringUtils.isNonZero(server)) ? (server) : ""; - port = (StringUtils.isNonZero(port)) ? (":" + port) : ""; - database = (StringUtils.isNonZero(database)) ? (";DatabaseName=" + database) : ""; - theURL = protocol + server + port + database + ";SelectMethod=cursor"; - return theURL; - } - /***********************************************************************/ - /** - * Creates a connection to the Database. - */ - public static String makeMySqlURL(String protocol, String server, String port, String database) - { - String theURL = ""; - protocol = (StringUtils.isNonZero(protocol)) ? (protocol) + "://" : ""; - server = (StringUtils.isNonZero(server)) ? (server) : ""; - port = (StringUtils.isNonZero(port)) ? (":" + port) : ""; - database = (StringUtils.isNonZero(database)) ? ("/" + database) : ""; - theURL = protocol + server + port + database; - return theURL; - } - /***********************************************************************/ - /** - * Creates a connection to the Database, and stores it in the cookies table. - */ - public static String makeURL(String protocol, String server, String port, String database, int type) - { - switch (type) - { - case ACCESS : - return makeJDBCAccessURL(protocol, server, port, database); - case SQLSERVER2000 : - case DatabaseUtils.SQLSERVER2005 : - return makeSQL2000URL(protocol, server, port, database); - case ORACLE : - case SQLSERVER : - case POSTGRESQL : - case SYBASE : - return makeMySqlURL(protocol, server, port, database); - case MY_SQL : - return makeMySqlURL(protocol, server, port, database) + "?useUnicode=true&characterEncoding=UTF-8"; - } - throw new Error("Database Type '" + type + "' not supported"); - } - /***********************************************************************/ - /** - * Creates a connection to the Database. This is for Access, which is crap! - */ - public static String makeJDBCAccessURL(String protocol, String server, String port, String database) - { - String theURL = ""; - // port = (StringUtils.isNonZero(port)) ? (":" + port) : ""; - // server = (StringUtils.isNonZero(server)) ? (server) : ""; - database = (StringUtils.isNonZero(database)) ? ("" + database) : ""; - theURL = protocol + database; - return theURL; - } - /***********************************************************************/ - /** - * Creates a connection to the Database. - */ - public static Connection makeConnection(String driver, String protocol, String server, String port, - String database, String userName, String password, int type) - { - Connection con = null; - String theURL = null; - try - { - driver = (StringUtils.isNonZero(driver)) ? (driver) : "sun.jdbc.odbc.JdbcOdbcDriver"; - theURL = makeURL(protocol, server, port, database, type); - MySystem.variable("URL = " + theURL); - // My_System.variable(driver); - Class.forName(driver).newInstance(); - con = DriverManager.getConnection(theURL, userName, password); - } - catch (SQLException e) - { - throw new SqlConnectionException(driver, theURL, protocol, server, port, database, userName, password, type, - e); - } - catch (Exception e) - { - MySystem.warning("URL : " + theURL); - ObjectUtils.throwAsError(e); - } - return con; - } - /***********************************************************************/ - public static void printSQLValues() - { - MySystem.variable("java.sql.Types.BIT = " + java.sql.Types.BIT); - MySystem.variable("java.sql.Types.TINYINT = " + java.sql.Types.TINYINT); - MySystem.variable("java.sql.Types.BIGINT = " + java.sql.Types.BIGINT); - MySystem.variable("java.sql.Types.LONGVARBINARY = " + java.sql.Types.LONGVARBINARY); - MySystem.variable("java.sql.Types.VARBINARY = " + java.sql.Types.VARBINARY); - MySystem.variable("java.sql.Types.BINARY = " + java.sql.Types.BINARY); - MySystem.variable("java.sql.Types.LONGVARCHAR = " + java.sql.Types.LONGVARCHAR); - MySystem.variable("java.sql.Types.NULL = " + java.sql.Types.NULL); - MySystem.variable("java.sql.Types.CHAR = " + java.sql.Types.CHAR); - MySystem.variable("java.sql.Types.NUMERIC = " + java.sql.Types.NUMERIC); - MySystem.variable("java.sql.Types.DECIMAL = " + java.sql.Types.DECIMAL); - MySystem.variable("java.sql.Types.INTEGER = " + java.sql.Types.INTEGER); - MySystem.variable("java.sql.Types.SMALLINT = " + java.sql.Types.SMALLINT); - MySystem.variable("java.sql.Types.FLOAT = " + java.sql.Types.FLOAT); - MySystem.variable("java.sql.Types.REAL = " + java.sql.Types.REAL); - MySystem.variable("java.sql.Types.DOUBLE = " + java.sql.Types.DOUBLE); - MySystem.variable("java.sql.Types.VARCHAR = " + java.sql.Types.VARCHAR); - MySystem.variable("java.sql.Types.DATE = " + java.sql.Types.DATE); - MySystem.variable("java.sql.Types.TIME = " + java.sql.Types.TIME); - MySystem.variable("java.sql.Types.TIMESTAMP = " + java.sql.Types.TIMESTAMP); - MySystem.variable("java.sql.Types.OTHER = " + java.sql.Types.OTHER); - MySystem.variable("java.sql.Types.JAVA_OBJECT = " + java.sql.Types.JAVA_OBJECT); - MySystem.variable("java.sql.Types.DISTINCT = " + java.sql.Types.DISTINCT); - MySystem.variable("java.sql.Types.STRUCT = " + java.sql.Types.STRUCT); - MySystem.variable("java.sql.Types.ARRAY = " + java.sql.Types.ARRAY); - MySystem.variable("java.sql.Types.BLOB = " + java.sql.Types.BLOB); - MySystem.variable("java.sql.Types.CLOB = " + java.sql.Types.CLOB); - MySystem.variable("java.sql.Types.REF = " + java.sql.Types.REF); - } - /***********************************************************************/ - public static String getMethodName(String databaseName) - { - return getVariableName(databaseName, true); - } - /***********************************************************************/ - public static String getVariableName(String databaseName) - { - return getVariableName(databaseName, false); - } - /***********************************************************************/ - public static String getVariableName(String databaseName, boolean capFirstLetter) - { - StringBuffer returning = new StringBuffer(databaseName.length()); - String upper = databaseName.toUpperCase(); - int place = 0; - while (place < databaseName.length()) - { - char letter = databaseName.charAt(place); - if (letter == '_') - { - returning.append(upper.charAt(++place)); - } - else if ((place == 0) && (capFirstLetter)) - { - returning.append(upper.charAt(0)); - } - else - { - returning.append(letter); - } - place++; - } - return returning.toString(); - } - /***********************************************************************/ - public static String formatNullableObject(Object o) - { - return formatNullableObject(o, POSTGRESQL); - } - /***********************************************************************/ - public static String formatNullableObject(Object o, int type) - { - if (o == null) - { - return "null"; - } - else - { - if (o instanceof Integer) - { - return o.toString(); - } - else - { - String text = null; - switch (type) - { - case DatabaseUtils.SQLSERVER2005 : - case SQLSERVER2000 : - case SQLSERVER : - text = "'" + toEscapeMSSQL(o.toString()) + "'"; - break; - case ACCESS : - text = "'" + toEscapeACCESS_SQL(o.toString()) + "'"; - break; - case ORACLE : - case POSTGRESQL : - case SYBASE : - text = "'" + toEscapeSQL(o.toString()) + "'"; - break; - } - return text; - } - } - } - /***********************************************************************/ - public static String toEscapeMSSQL(String unformattedString) - { - if (unformattedString.indexOf('\'') == -1) { return unformattedString; } - StringBuffer b = new StringBuffer(unformattedString); - for (int i = 0; i < b.length(); i++) - { - char c = b.charAt(i); - switch (c) - { - case '\'' : - b.insert(i, '\''); - i++; - break; - } - } - return b.toString(); - } - /***********************************************************************/ - public static String toEscapeACCESS_SQL(String unformattedString) - { - if ((unformattedString.indexOf('\'') == -1) && (unformattedString.indexOf('\"') == -1) - && (unformattedString.indexOf('\\') == -1)) { return unformattedString; } - StringBuffer b = new StringBuffer(unformattedString); - for (int i = 0; i < b.length(); i++) - { - char c = b.charAt(i); - switch (c) - { - case '\"' : - case '\\' : - b.insert(i, '\\'); - i++; - break; - case '\'' : - b.insert(i, '\''); - i++; - break; - } - } - return b.toString(); - } - /***********************************************************************/ - public static String toEscapeSQL(String unformattedString) - { - if ((unformattedString == null) - || ((unformattedString.indexOf('\'') == -1) && (unformattedString.indexOf('\"') == -1) && (unformattedString - .indexOf('\\') == -1))) { return unformattedString; } - StringBuffer b = new StringBuffer(unformattedString); - for (int i = 0; i < b.length(); i++) - { - char c = b.charAt(i); - switch (c) - { - case '\"' : - case '\\' : - case '\'' : - b.insert(i, '\\'); - i++; - break; - } - } - return b.toString(); - } - /***********************************************************************/ - public static void beginTransaction(Statement stmt) throws SQLException - { - beginTransaction(stmt.getConnection(), 1); - } - /***********************************************************************/ - public static void beginTransaction(Connection con) throws SQLException - { - beginTransaction(con, 1); - } - /***********************************************************************/ - private static void beginTransaction(Connection con, int offset) throws SQLException - { - if (getConnection(connections, con) == null) - { - synchronized (connections) - { - //My_System.event("Starting transaction " + DatabaseTransactionInfo.getOriginatorText(offset + 1)); - connections.add(new DatabaseTransactionInfo(con, 1 + offset)); - } - con.setAutoCommit(false); - } - else - { - //My_System.event("already exist"); - } - } - /***********************************************************************/ - private static DatabaseTransactionInfo getConnection(ArrayList connections2, - Connection con) - { - for (DatabaseTransactionInfo info : connections2) - { - if (con.equals(info.getConnection())) { return info; } - } - return null; - } - /***********************************************************************/ - public static void commit(Statement stmt) throws SQLException - { - commit(stmt.getConnection(), 1); - } - /***********************************************************************/ - public static void commit(Connection con) throws SQLException - { - commit(con, 1); - } - /***********************************************************************/ - private static void commit(Connection con, int offset) throws SQLException - { - DatabaseTransactionInfo commit = null; - synchronized (connections) - { - Iterator i = connections.iterator(); - while (i.hasNext()) - { - DatabaseTransactionInfo held = (DatabaseTransactionInfo) i.next(); - if (held.isFinalizeable()) - { - i.remove(); - } - else if (held.isOriginator(con, 1 + offset)) - { - commit = held; - i.remove(); - } - } - } - if (commit != null) - { - con.commit(); - commit.cleanConnection(); - } - } - /***********************************************************************/ - public static void rollback(Statement stmt) throws SQLException - { - rollback(stmt.getConnection()); - } - /***********************************************************************/ - public static void rollback(Connection con) throws SQLException - { - if (con != null) - { - con.rollback(); - } - } - /***********************************************************************/ - public static String formatBoolean(boolean b) - { - return (b) ? "'1'" : "'0'"; // added quotes for postgres - } - /***********************************************************************/ - /** - * This is for none space single words, such as email, name, handle - */ - public static boolean isAcceptableDatabaseString(String string) - { - if (string == null) { return true; } - for (int i = 0; i < string.length(); i++) - { - char c = string.charAt(i); - boolean bad = false; - bad = (c == ' ') || (c == '\n') || (c == '\t') || (c == '\'') || (c == '"'); - if (bad) { return false; } - } - return true; - } - /***********************************************************************/ - public static String getLike(int databaseType) - { - return databaseType == POSTGRESQL ? "ILIKE" : "LIKE"; - } - /***********************************************************************/ - /** - * A convenience function to turn the int's into readable text for debuging. - * - * @param status - * The status to be translated - * @return The Text representation of static variable. - * @see com.spun.utilDatabaseUtils#NEW - * @see com.spun.utilDatabaseUtils#NEW_MODIFIED - * @see com.spun.utilDatabaseUtils#OLD - * @see com.spun.utilDatabaseUtils#OLD_MODIFIED - */ - public static final String getDatabaseStatusString(int status) - { - String value = "UNKNOWN DATABASE STATUS"; - switch (status) - { - case DatabaseUtils.NEW : - value = "DatabaseUtils.NEW"; - break; - case DatabaseUtils.OLD : - value = "DatabaseUtils.OLD"; - break; - case DatabaseUtils.NEW_MODIFIED : - value = "DatabaseUtils.NEWMODIFIED"; - break; - case DatabaseUtils.OLD_MODIFIED : - value = "DatabaseUtils.OLDMODIFIED"; - break; - } - return value; - } - /***********************************************************************/ - public static void saveAll(DatabaseObject[] databaseObjects, Statement stmt) throws SQLException - { - for (int i = 0; i < databaseObjects.length; i++) - { - databaseObjects[i].save(stmt); - } - } - /***********************************************************************/ - public static void close(ResultSet rs) - { - if (rs != null) - { - try - { - rs.close(); - } - catch (SQLException e) - { - throw ObjectUtils.throwAsError(e); - } - } - } - /***********************************************************************/ - public static void close(Statement stmt) - { - if (stmt != null) - { - try - { - stmt.close(); - } - catch (SQLException e) - { - throw ObjectUtils.throwAsError(e); - } - } - } - /***********************************************************************/ - public static void close(Connection con) - { - if (con != null) - { - try - { - con.close(); - } - catch (SQLException e) - { - throw ObjectUtils.throwAsError(e); - } - } - } -} \ No newline at end of file +//package com.spun.util; +// +//import java.sql.Connection; +//import java.sql.DriverManager; +//import java.sql.ResultSet; +//import java.sql.SQLException; +//import java.sql.Statement; +//import java.util.ArrayList; +//import java.util.Iterator; +//import com.spun.util.database.DatabaseObject; +//import com.spun.util.database.DatabaseTransactionInfo; +//import com.spun.util.database.SqlConnectionException; +// +///** +// * A static class of convenience functions for database access +// */ +//public class DatabaseUtils +//{ +// private static ArrayList connections = new ArrayList(); +// public static final int NEW = 1; +// public static final int NEW_MODIFIED = 2; +// public static final int OLD = 3; +// public static final int OLD_MODIFIED = 4; +// public static final int ACCESS = 0; +// public static final int POSTGRESQL = 1; +// public static final int SYBASE = 2; +// public static final int ORACLE = 3; +// public static final int SQLSERVER = 4; +// public static final int SQLSERVER2000 = 5; +// public static final int MY_SQL = 6; +// public static final int SQLSERVER2005 = 7; +// public static final String DATABASE_TYPES[] = {"Access", +// "PostgreSQL", +// "Sybase", +// "Oracle", +// "Microsoft SQL Server 7.00", +// "Microsoft SQL Server 2000", +// "MySQL", +// "Microsoft SQL Server" }; +// /***********************************************************************/ +// public static String getDatabaseType(int type) +// { +// return DATABASE_TYPES[type]; +// } +// /***********************************************************************/ +// public static int getDatabaseType(Statement stmt) throws SQLException +// { +// return getDatabaseType(stmt.getConnection()); +// } +// /***********************************************************************/ +// public static int getDatabaseType(Connection con) throws SQLException +// { +// String dbName = con.getMetaData().getDatabaseProductName(); +// for (int i = 0; i < DATABASE_TYPES.length; i++) +// { +// if (DATABASE_TYPES[i].equalsIgnoreCase(dbName.trim())) { return i; } +// } +// throw new Error("Unrecognized database product name: " + dbName); +// } +// /***********************************************************************/ +// /** +// * Finds the database type name for a jdbc sql type +// */ +// public static String findDatabaseName(int i) +// { +// String name = null; +// switch (i) +// { +// case java.sql.Types.BIT : +// name = "boolean"; +// break; +// case java.sql.Types.CHAR : +// name = "char"; +// break; +// case java.sql.Types.DECIMAL : +// name = "decimal"; +// break; +// case java.sql.Types.DOUBLE : +// name = "numeric"; +// break; +// case java.sql.Types.FLOAT : +// name = "numeric"; +// break; +// case java.sql.Types.INTEGER : +// name = "integer"; +// break; +// case java.sql.Types.NUMERIC : +// name = "numeric"; +// break; +// case java.sql.Types.TIMESTAMP : +// name = "timestamp"; +// break; +// case java.sql.Types.VARCHAR : +// name = "varchar"; +// break; +// default : +// MySystem.warning("The Type not found(" + i + ")"); +// break; +// } +// return name; +// } +// /***********************************************************************/ +// /** +// * Finds the java object or primative for a sql type +// */ +// public static String findSQLName(int i) +// { +// String name = null; +// switch (i) +// { +// case java.sql.Types.ARRAY : +// name = "unknown"; +// break; +// case java.sql.Types.BIGINT : +// name = "long"; +// break; +// case java.sql.Types.BINARY : +// name = "byte[]"; +// break; +// case java.sql.Types.BIT : +// name = "boolean"; +// break; +// case java.sql.Types.BLOB : +// name = "BLOB"; +// break; +// case java.sql.Types.CHAR : +// name = "java.lang.String"; +// break; +// case java.sql.Types.CLOB : +// name = "CLOB"; +// break; +// case java.sql.Types.DATE : +// name = "java.sql.Date"; +// break; +// case java.sql.Types.DECIMAL : +// name = "java.math.BigDecimal"; +// break; +// case java.sql.Types.DISTINCT : +// name = "DISTINCT"; +// break; +// case java.sql.Types.DOUBLE : +// name = "double"; +// break; +// case java.sql.Types.FLOAT : +// name = "double"; +// break; +// case java.sql.Types.INTEGER : +// name = "int"; +// break; +// case java.sql.Types.JAVA_OBJECT : +// name = "unknown"; +// break; +// case java.sql.Types.LONGVARBINARY : +// name = "byte[]"; +// break; +// case java.sql.Types.LONGVARCHAR : +// name = "String"; +// break; +// case java.sql.Types.NULL : +// name = "NULL"; +// break; +// case java.sql.Types.NUMERIC : +// name = "java.math.BigDecimal"; +// break; +// case java.sql.Types.OTHER : +// name = "OTHER"; +// break; +// case java.sql.Types.REAL : +// name = "float"; +// break; +// case java.sql.Types.REF : +// name = "REF"; +// break; +// case java.sql.Types.SMALLINT : +// name = "short"; +// break; +// case java.sql.Types.STRUCT : +// name = "STRUCT"; +// break; +// case java.sql.Types.TIME : +// name = "java.sql.Time"; +// break; +// case java.sql.Types.TIMESTAMP : +// name = "java.sql.Timestamp"; +// break; +// case java.sql.Types.TINYINT : +// name = "byte"; +// break; +// case java.sql.Types.VARBINARY : +// name = "byte[]"; +// break; +// case java.sql.Types.VARCHAR : +// name = "java.lang.String"; +// break; +// case 11 : +// name = "java.sql.Date"; +// break; +// case -9 : +// name = "java.lang.String"; +// break; +// default : +// MySystem.warning("The Type not found(" + i + ")"); +// printSQLValues(); +// break; +// } +// return name; +// } +// public static boolean isSqlServer(int databaseType) +// { +// switch (databaseType) +// { +// case SQLSERVER2000 : +// case DatabaseUtils.SQLSERVER2005 : +// case DatabaseUtils.SQLSERVER : +// return true; +// default : +// return false; +// } +// } +// /***********************************************************************/ +// public static String makeSQL2000URL(String protocol, String server, String port, String database) +// { +// String theURL = ""; +// protocol = (StringUtils.isNonZero(protocol)) ? (protocol) + "://" : ""; +// server = (StringUtils.isNonZero(server)) ? (server) : ""; +// port = (StringUtils.isNonZero(port)) ? (":" + port) : ""; +// database = (StringUtils.isNonZero(database)) ? (";DatabaseName=" + database) : ""; +// theURL = protocol + server + port + database + ";SelectMethod=cursor"; +// return theURL; +// } +// /***********************************************************************/ +// /** +// * Creates a connection to the Database. +// */ +// public static String makeMySqlURL(String protocol, String server, String port, String database) +// { +// String theURL = ""; +// protocol = (StringUtils.isNonZero(protocol)) ? (protocol) + "://" : ""; +// server = (StringUtils.isNonZero(server)) ? (server) : ""; +// port = (StringUtils.isNonZero(port)) ? (":" + port) : ""; +// database = (StringUtils.isNonZero(database)) ? ("/" + database) : ""; +// theURL = protocol + server + port + database; +// return theURL; +// } +// /***********************************************************************/ +// /** +// * Creates a connection to the Database, and stores it in the cookies table. +// */ +// public static String makeURL(String protocol, String server, String port, String database, int type) +// { +// switch (type) +// { +// case ACCESS : +// return makeJDBCAccessURL(protocol, server, port, database); +// case SQLSERVER2000 : +// case DatabaseUtils.SQLSERVER2005 : +// return makeSQL2000URL(protocol, server, port, database); +// case ORACLE : +// case SQLSERVER : +// case POSTGRESQL : +// case SYBASE : +// return makeMySqlURL(protocol, server, port, database); +// case MY_SQL : +// return makeMySqlURL(protocol, server, port, database) + "?useUnicode=true&characterEncoding=UTF-8"; +// } +// throw new Error("Database Type '" + type + "' not supported"); +// } +// /***********************************************************************/ +// /** +// * Creates a connection to the Database. This is for Access, which is crap! +// */ +// public static String makeJDBCAccessURL(String protocol, String server, String port, String database) +// { +// String theURL = ""; +// // port = (StringUtils.isNonZero(port)) ? (":" + port) : ""; +// // server = (StringUtils.isNonZero(server)) ? (server) : ""; +// database = (StringUtils.isNonZero(database)) ? ("" + database) : ""; +// theURL = protocol + database; +// return theURL; +// } +// /***********************************************************************/ +// /** +// * Creates a connection to the Database. +// */ +// public static Connection makeConnection(String driver, String protocol, String server, String port, +// String database, String userName, String password, int type) +// { +// Connection con = null; +// String theURL = null; +// try +// { +// driver = (StringUtils.isNonZero(driver)) ? (driver) : "sun.jdbc.odbc.JdbcOdbcDriver"; +// theURL = makeURL(protocol, server, port, database, type); +// MySystem.variable("URL = " + theURL); +// // My_System.variable(driver); +// Class.forName(driver).newInstance(); +// con = DriverManager.getConnection(theURL, userName, password); +// } +// catch (SQLException e) +// { +// throw new SqlConnectionException(driver, theURL, protocol, server, port, database, userName, password, type, +// e); +// } +// catch (Exception e) +// { +// MySystem.warning("URL : " + theURL); +// ObjectUtils.throwAsError(e); +// } +// return con; +// } +// /***********************************************************************/ +// public static void printSQLValues() +// { +// MySystem.variable("java.sql.Types.BIT = " + java.sql.Types.BIT); +// MySystem.variable("java.sql.Types.TINYINT = " + java.sql.Types.TINYINT); +// MySystem.variable("java.sql.Types.BIGINT = " + java.sql.Types.BIGINT); +// MySystem.variable("java.sql.Types.LONGVARBINARY = " + java.sql.Types.LONGVARBINARY); +// MySystem.variable("java.sql.Types.VARBINARY = " + java.sql.Types.VARBINARY); +// MySystem.variable("java.sql.Types.BINARY = " + java.sql.Types.BINARY); +// MySystem.variable("java.sql.Types.LONGVARCHAR = " + java.sql.Types.LONGVARCHAR); +// MySystem.variable("java.sql.Types.NULL = " + java.sql.Types.NULL); +// MySystem.variable("java.sql.Types.CHAR = " + java.sql.Types.CHAR); +// MySystem.variable("java.sql.Types.NUMERIC = " + java.sql.Types.NUMERIC); +// MySystem.variable("java.sql.Types.DECIMAL = " + java.sql.Types.DECIMAL); +// MySystem.variable("java.sql.Types.INTEGER = " + java.sql.Types.INTEGER); +// MySystem.variable("java.sql.Types.SMALLINT = " + java.sql.Types.SMALLINT); +// MySystem.variable("java.sql.Types.FLOAT = " + java.sql.Types.FLOAT); +// MySystem.variable("java.sql.Types.REAL = " + java.sql.Types.REAL); +// MySystem.variable("java.sql.Types.DOUBLE = " + java.sql.Types.DOUBLE); +// MySystem.variable("java.sql.Types.VARCHAR = " + java.sql.Types.VARCHAR); +// MySystem.variable("java.sql.Types.DATE = " + java.sql.Types.DATE); +// MySystem.variable("java.sql.Types.TIME = " + java.sql.Types.TIME); +// MySystem.variable("java.sql.Types.TIMESTAMP = " + java.sql.Types.TIMESTAMP); +// MySystem.variable("java.sql.Types.OTHER = " + java.sql.Types.OTHER); +// MySystem.variable("java.sql.Types.JAVA_OBJECT = " + java.sql.Types.JAVA_OBJECT); +// MySystem.variable("java.sql.Types.DISTINCT = " + java.sql.Types.DISTINCT); +// MySystem.variable("java.sql.Types.STRUCT = " + java.sql.Types.STRUCT); +// MySystem.variable("java.sql.Types.ARRAY = " + java.sql.Types.ARRAY); +// MySystem.variable("java.sql.Types.BLOB = " + java.sql.Types.BLOB); +// MySystem.variable("java.sql.Types.CLOB = " + java.sql.Types.CLOB); +// MySystem.variable("java.sql.Types.REF = " + java.sql.Types.REF); +// } +// /***********************************************************************/ +// public static String getMethodName(String databaseName) +// { +// return getVariableName(databaseName, true); +// } +// /***********************************************************************/ +// public static String getVariableName(String databaseName) +// { +// return getVariableName(databaseName, false); +// } +// /***********************************************************************/ +// public static String getVariableName(String databaseName, boolean capFirstLetter) +// { +// StringBuffer returning = new StringBuffer(databaseName.length()); +// String upper = databaseName.toUpperCase(); +// int place = 0; +// while (place < databaseName.length()) +// { +// char letter = databaseName.charAt(place); +// if (letter == '_') +// { +// returning.append(upper.charAt(++place)); +// } +// else if ((place == 0) && (capFirstLetter)) +// { +// returning.append(upper.charAt(0)); +// } +// else +// { +// returning.append(letter); +// } +// place++; +// } +// return returning.toString(); +// } +// /***********************************************************************/ +// public static String formatNullableObject(Object o) +// { +// return formatNullableObject(o, POSTGRESQL); +// } +// /***********************************************************************/ +// public static String formatNullableObject(Object o, int type) +// { +// if (o == null) +// { +// return "null"; +// } +// else +// { +// if (o instanceof Integer) +// { +// return o.toString(); +// } +// else +// { +// String text = null; +// switch (type) +// { +// case DatabaseUtils.SQLSERVER2005 : +// case SQLSERVER2000 : +// case SQLSERVER : +// text = "'" + toEscapeMSSQL(o.toString()) + "'"; +// break; +// case ACCESS : +// text = "'" + toEscapeACCESS_SQL(o.toString()) + "'"; +// break; +// case ORACLE : +// case POSTGRESQL : +// case SYBASE : +// text = "'" + toEscapeSQL(o.toString()) + "'"; +// break; +// } +// return text; +// } +// } +// } +// /***********************************************************************/ +// public static String toEscapeMSSQL(String unformattedString) +// { +// if (unformattedString.indexOf('\'') == -1) { return unformattedString; } +// StringBuffer b = new StringBuffer(unformattedString); +// for (int i = 0; i < b.length(); i++) +// { +// char c = b.charAt(i); +// switch (c) +// { +// case '\'' : +// b.insert(i, '\''); +// i++; +// break; +// } +// } +// return b.toString(); +// } +// /***********************************************************************/ +// public static String toEscapeACCESS_SQL(String unformattedString) +// { +// if ((unformattedString.indexOf('\'') == -1) && (unformattedString.indexOf('\"') == -1) +// && (unformattedString.indexOf('\\') == -1)) { return unformattedString; } +// StringBuffer b = new StringBuffer(unformattedString); +// for (int i = 0; i < b.length(); i++) +// { +// char c = b.charAt(i); +// switch (c) +// { +// case '\"' : +// case '\\' : +// b.insert(i, '\\'); +// i++; +// break; +// case '\'' : +// b.insert(i, '\''); +// i++; +// break; +// } +// } +// return b.toString(); +// } +// /***********************************************************************/ +// public static String toEscapeSQL(String unformattedString) +// { +// if ((unformattedString == null) +// || ((unformattedString.indexOf('\'') == -1) && (unformattedString.indexOf('\"') == -1) && (unformattedString +// .indexOf('\\') == -1))) { return unformattedString; } +// StringBuffer b = new StringBuffer(unformattedString); +// for (int i = 0; i < b.length(); i++) +// { +// char c = b.charAt(i); +// switch (c) +// { +// case '\"' : +// case '\\' : +// case '\'' : +// b.insert(i, '\\'); +// i++; +// break; +// } +// } +// return b.toString(); +// } +// /***********************************************************************/ +// public static void beginTransaction(Statement stmt) throws SQLException +// { +// beginTransaction(stmt.getConnection(), 1); +// } +// /***********************************************************************/ +// public static void beginTransaction(Connection con) throws SQLException +// { +// beginTransaction(con, 1); +// } +// /***********************************************************************/ +// private static void beginTransaction(Connection con, int offset) throws SQLException +// { +// if (getConnection(connections, con) == null) +// { +// synchronized (connections) +// { +// //My_System.event("Starting transaction " + DatabaseTransactionInfo.getOriginatorText(offset + 1)); +// connections.add(new DatabaseTransactionInfo(con, 1 + offset)); +// } +// con.setAutoCommit(false); +// } +// else +// { +// //My_System.event("already exist"); +// } +// } +// /***********************************************************************/ +// private static DatabaseTransactionInfo getConnection(ArrayList connections2, +// Connection con) +// { +// for (DatabaseTransactionInfo info : connections2) +// { +// if (con.equals(info.getConnection())) { return info; } +// } +// return null; +// } +// /***********************************************************************/ +// public static void commit(Statement stmt) throws SQLException +// { +// commit(stmt.getConnection(), 1); +// } +// /***********************************************************************/ +// public static void commit(Connection con) throws SQLException +// { +// commit(con, 1); +// } +// /***********************************************************************/ +// private static void commit(Connection con, int offset) throws SQLException +// { +// DatabaseTransactionInfo commit = null; +// synchronized (connections) +// { +// Iterator i = connections.iterator(); +// while (i.hasNext()) +// { +// DatabaseTransactionInfo held = (DatabaseTransactionInfo) i.next(); +// if (held.isFinalizeable()) +// { +// i.remove(); +// } +// else if (held.isOriginator(con, 1 + offset)) +// { +// commit = held; +// i.remove(); +// } +// } +// } +// if (commit != null) +// { +// con.commit(); +// commit.cleanConnection(); +// } +// } +// /***********************************************************************/ +// public static void rollback(Statement stmt) throws SQLException +// { +// rollback(stmt.getConnection()); +// } +// /***********************************************************************/ +// public static void rollback(Connection con) throws SQLException +// { +// if (con != null) +// { +// con.rollback(); +// } +// } +// /***********************************************************************/ +// public static String formatBoolean(boolean b) +// { +// return (b) ? "'1'" : "'0'"; // added quotes for postgres +// } +// /***********************************************************************/ +// /** +// * This is for none space single words, such as email, name, handle +// */ +// public static boolean isAcceptableDatabaseString(String string) +// { +// if (string == null) { return true; } +// for (int i = 0; i < string.length(); i++) +// { +// char c = string.charAt(i); +// boolean bad = false; +// bad = (c == ' ') || (c == '\n') || (c == '\t') || (c == '\'') || (c == '"'); +// if (bad) { return false; } +// } +// return true; +// } +// /***********************************************************************/ +// public static String getLike(int databaseType) +// { +// return databaseType == POSTGRESQL ? "ILIKE" : "LIKE"; +// } +// /***********************************************************************/ +// /** +// * A convenience function to turn the int's into readable text for debuging. +// * +// * @param status +// * The status to be translated +// * @return The Text representation of static variable. +// * @see com.spun.utilDatabaseUtils#NEW +// * @see com.spun.utilDatabaseUtils#NEW_MODIFIED +// * @see com.spun.utilDatabaseUtils#OLD +// * @see com.spun.utilDatabaseUtils#OLD_MODIFIED +// */ +// public static final String getDatabaseStatusString(int status) +// { +// String value = "UNKNOWN DATABASE STATUS"; +// switch (status) +// { +// case DatabaseUtils.NEW : +// value = "DatabaseUtils.NEW"; +// break; +// case DatabaseUtils.OLD : +// value = "DatabaseUtils.OLD"; +// break; +// case DatabaseUtils.NEW_MODIFIED : +// value = "DatabaseUtils.NEWMODIFIED"; +// break; +// case DatabaseUtils.OLD_MODIFIED : +// value = "DatabaseUtils.OLDMODIFIED"; +// break; +// } +// return value; +// } +// /***********************************************************************/ +// public static void saveAll(DatabaseObject[] databaseObjects, Statement stmt) throws SQLException +// { +// for (int i = 0; i < databaseObjects.length; i++) +// { +// databaseObjects[i].save(stmt); +// } +// } +// /***********************************************************************/ +// public static void close(ResultSet rs) +// { +// if (rs != null) +// { +// try +// { +// rs.close(); +// } +// catch (SQLException e) +// { +// throw ObjectUtils.throwAsError(e); +// } +// } +// } +// /***********************************************************************/ +// public static void close(Statement stmt) +// { +// if (stmt != null) +// { +// try +// { +// stmt.close(); +// } +// catch (SQLException e) +// { +// throw ObjectUtils.throwAsError(e); +// } +// } +// } +// /***********************************************************************/ +// public static void close(Connection con) +// { +// if (con != null) +// { +// try +// { +// con.close(); +// } +// catch (SQLException e) +// { +// throw ObjectUtils.throwAsError(e); +// } +// } +// } +//} \ No newline at end of file diff --git a/src/main/java/com/spun/util/MySystem.java b/src/main/java/com/spun/util/MySystem.java index 6b6b723..b35c954 100644 --- a/src/main/java/com/spun/util/MySystem.java +++ b/src/main/java/com/spun/util/MySystem.java @@ -492,7 +492,7 @@ public static void dumpMemory(PrintWriter out) /************************************************************************/ /** * Dumps the current thread status for ALL groups. - * @see My_System.dumpAllThreadsInGroup(ThreadGroup) + * @see MySystem#dumpAllThreadsInGroup(ThreadGroup) dumpAllThreadsInGroup **/ public static String dumpAllThreads() { @@ -518,4 +518,4 @@ public static String getStringArrayToString(String array[]) } /***********************************************************************/ /***********************************************************************/ -} \ No newline at end of file +} diff --git a/src/main/java/com/spun/util/ObjectUtils.java b/src/main/java/com/spun/util/ObjectUtils.java index 0d86211..e9cb60d 100644 --- a/src/main/java/com/spun/util/ObjectUtils.java +++ b/src/main/java/com/spun/util/ObjectUtils.java @@ -56,7 +56,8 @@ public static Method[] getMethodsForObject(Object o2, String[] passedMethods) th /***********************************************************************/ /** * A convenience function to check if 2 strings are equal. - * @param string The string in question + * @param s1 The string in question + * @param s2 The other string * @return true if Equal. **/ public static boolean isEqual(Object s1, Object s2) diff --git a/src/main/java/com/spun/util/StringUtils.java b/src/main/java/com/spun/util/StringUtils.java index 7ab13c2..fc25cf2 100644 --- a/src/main/java/com/spun/util/StringUtils.java +++ b/src/main/java/com/spun/util/StringUtils.java @@ -427,28 +427,9 @@ public static void assertIn(String target, boolean allowNulls, String... options { assertIn(target, options, allowNulls); } -// /***********************************************************************/ -// public static String convertEnumeration(final Object forValue, Class clazz) throws Exception -// { -// F1 f1 = new F1(null, forValue) -// { -// { -// ret(ClassUtils.IsPublicStatic(a) && a.get(null).equals(forValue)); -// } -// }; -// List fields = Query.where(clazz.getFields(), f1); -// if (fields.isEmpty()) -// { -// return "unknown Type " + forValue; -// } -// else -// { -// return fields.get(0).getName(); -// } -// } /************************************************************************/ /** - * 'Tom S Hardy' -> 'Tom S' - 'Hardy' + * 'Tom S Hardy' -> 'Tom S' - 'Hardy' **/ public static String[] splitName(String fullName) { diff --git a/src/main/java/com/spun/util/database/AutomaticVariableSetter.java b/src/main/java/com/spun/util/database/AutomaticVariableSetter.java index b4810e6..fe72427 100644 --- a/src/main/java/com/spun/util/database/AutomaticVariableSetter.java +++ b/src/main/java/com/spun/util/database/AutomaticVariableSetter.java @@ -1,18 +1,18 @@ -package com.spun.util.database; - -import java.sql.SQLException; -import java.sql.Statement; - -public interface AutomaticVariableSetter -{ - public static final int INSERT = 0; - public static final int INSERT_COMPLETED = 1; - public static final int UPDATE = 2; - public static final int UPDATE_COMPLETED = 3; - public static final int LOAD = 4; - public static final String STAGES[] = {"insert", "insertCompleted", "update", "updateCompleted", "load"}; - /***********************************************************************/ - public void setFor(DatabaseObject forObject, int atStage, Statement stmt) throws SQLException; - /***********************************************************************/ - /***********************************************************************/ -} \ No newline at end of file +//package com.spun.util.database; +// +//import java.sql.SQLException; +//import java.sql.Statement; +// +//public interface AutomaticVariableSetter +//{ +// public static final int INSERT = 0; +// public static final int INSERT_COMPLETED = 1; +// public static final int UPDATE = 2; +// public static final int UPDATE_COMPLETED = 3; +// public static final int LOAD = 4; +// public static final String STAGES[] = {"insert", "insertCompleted", "update", "updateCompleted", "load"}; +// /***********************************************************************/ +// public void setFor(DatabaseObject forObject, int atStage, Statement stmt) throws SQLException; +// /***********************************************************************/ +// /***********************************************************************/ +//} \ No newline at end of file diff --git a/src/main/java/com/spun/util/database/CircularRedundancyError.java b/src/main/java/com/spun/util/database/CircularRedundancyError.java index 46b1d72..3c0f712 100644 --- a/src/main/java/com/spun/util/database/CircularRedundancyError.java +++ b/src/main/java/com/spun/util/database/CircularRedundancyError.java @@ -1,36 +1,36 @@ -package com.spun.util.database; - -import com.spun.util.ObjectUtils; - -public class CircularRedundancyError extends Error -{ - private DatabaseObject source; - private String causedBy; - private String xmlState; - public CircularRedundancyError(DatabaseObject source, String causedBy, String xmlState) - { - this.source = source; - this.causedBy = causedBy; - this.xmlState = xmlState; - } - public String getMessage() - { - return "Circular Redundancy occurred while saving :" + ObjectUtils.getClassName(source) + "\n" - + "cause by :" + causedBy + "\n" - + "state : " + xmlState; - } - public String getCausedBy() - { - return causedBy; - } - public DatabaseObject getSource() - { - return source; - } - public String getXmlState() - { - return xmlState; - } - - -} +//package com.spun.util.database; +// +//import com.spun.util.ObjectUtils; +// +//public class CircularRedundancyError extends Error +//{ +// private DatabaseObject source; +// private String causedBy; +// private String xmlState; +// public CircularRedundancyError(DatabaseObject source, String causedBy, String xmlState) +// { +// this.source = source; +// this.causedBy = causedBy; +// this.xmlState = xmlState; +// } +// public String getMessage() +// { +// return "Circular Redundancy occurred while saving :" + ObjectUtils.getClassName(source) + "\n" +// + "cause by :" + causedBy + "\n" +// + "state : " + xmlState; +// } +// public String getCausedBy() +// { +// return causedBy; +// } +// public DatabaseObject getSource() +// { +// return source; +// } +// public String getXmlState() +// { +// return xmlState; +// } +// +// +//} diff --git a/src/main/java/com/spun/util/database/ColumnMetadata.java b/src/main/java/com/spun/util/database/ColumnMetadata.java index 3dcd391..1a855bd 100644 --- a/src/main/java/com/spun/util/database/ColumnMetadata.java +++ b/src/main/java/com/spun/util/database/ColumnMetadata.java @@ -1,146 +1,146 @@ -package com.spun.util.database; - -import com.spun.util.DatabaseUtils; - -public class ColumnMetadata -{ - private Metadata tableMetadata; - private String name; - private Class type; - private int length; - private boolean nullable; - private int sqlType; - private int decimalDigits; - private String comments; - private int columnPosition; - private String foreignTable; - private ColumnMetadata foreignColumn; - /**************************************************************************/ - public ColumnMetadata(Metadata tableMetadata, String name, Class type, int length, int columnPosition, boolean nullable, int sqlType, - int decimalDigits, String comments) - { - this(tableMetadata, name, type, length, columnPosition, nullable, sqlType, decimalDigits, comments, null, null); - } - /**************************************************************************/ - public ColumnMetadata(Metadata tableMetadata, String name, Class type, int length, int columnPosition, boolean nullable, int sqlType, - int decimalDigits, String comments, String foreignTable, ColumnMetadata foreignColumn) - { - this.columnPosition = columnPosition; - this.tableMetadata = tableMetadata; - this.name = name; - this.type = type; - this.length = length; - this.nullable = nullable; - this.sqlType = sqlType; - this.decimalDigits = decimalDigits; - this.comments = comments; - this.foreignTable = foreignTable; - this.foreignColumn = foreignColumn; - } - /***********************************************************************/ - public int getLength() - { - return length; - } - /***********************************************************************/ - public int getSqlType() - { - return sqlType; - } - /***********************************************************************/ - public String getSqlTypeName() - { - String name = DatabaseUtils.findDatabaseName(sqlType); - if (name == null) - name = "unknown: " + getType(); - else if (name == "decimal" || name.startsWith("numeric")) - { - name += "(" + length + ", " + decimalDigits + ")"; - } - else if (name == "varchar" || name == "char") - { - name += "(" + length + ")"; - } - return name; - } - /***********************************************************************/ - public int getColumnPosition() - { - return columnPosition; - } - /***********************************************************************/ - public String getName() - { - return name; - } - /***********************************************************************/ - public boolean isNullable() - { - return nullable; - } - /***********************************************************************/ - public Class getType() - { - return type; - } - /***********************************************************************/ - public int getDecimalDigits() - { - return decimalDigits; - } - /***********************************************************************/ - public String getComments() - { - return comments; - } - /***********************************************************************/ - public String getForeignTable() - { - return foreignTable; - } - /***********************************************************************/ - public ColumnMetadata getForeignColumn() - { - return foreignColumn; - } - /***********************************************************************/ - public String getNameWithPrefix(String alias) - { - return alias + "." + getName(); - } - /***********************************************************************/ - public String getSequenceName(int databaseType) - { - if (databaseType == DatabaseUtils.POSTGRESQL) { return String.format("%s_%s_seq", tableMetadata.getTableName(), this.getName()); } - return null; - } - /************************************************************************/ - /** - * A convenience function to turn a vector of com.spun.util.database.ColumnMetadata objects - * into an Array of the com.spun.util.database.ColumnMetadata objects. - * @param vectorOf a Vector of com.spun.util.database.ColumnMetadata objects - * @return the array of com.spun.util.database.ColumnMetadata. - * @throws Error if an element of vectorOf is not a com.spun.util.database.ColumnMetadata object. - **/ - public static com.spun.util.database.ColumnMetadata[] toArray(java.util.Collection vectorOf) - { - if (vectorOf == null) { return new com.spun.util.database.ColumnMetadata[0]; } - com.spun.util.database.ColumnMetadata array[] = new com.spun.util.database.ColumnMetadata[vectorOf.size()]; - java.util.Iterator iterator = vectorOf.iterator(); - int i = 0; - while (iterator.hasNext()) - { - java.lang.Object rowObject = iterator.next(); - if (rowObject instanceof com.spun.util.database.ColumnMetadata) - { - array[i++] = (com.spun.util.database.ColumnMetadata) rowObject; - } - else - { - throw new Error("toArray[" + i + "] is not an instance of com.spun.util.database.ColumnMetadata but a " + rowObject.getClass().getName()); - } - } - return array; - } - /***********************************************************************/ -} \ No newline at end of file +//package com.spun.util.database; +// +//import com.spun.util.DatabaseUtils; +// +//public class ColumnMetadata +//{ +// private Metadata tableMetadata; +// private String name; +// private Class type; +// private int length; +// private boolean nullable; +// private int sqlType; +// private int decimalDigits; +// private String comments; +// private int columnPosition; +// private String foreignTable; +// private ColumnMetadata foreignColumn; +// /**************************************************************************/ +// public ColumnMetadata(Metadata tableMetadata, String name, Class type, int length, int columnPosition, boolean nullable, int sqlType, +// int decimalDigits, String comments) +// { +// this(tableMetadata, name, type, length, columnPosition, nullable, sqlType, decimalDigits, comments, null, null); +// } +// /**************************************************************************/ +// public ColumnMetadata(Metadata tableMetadata, String name, Class type, int length, int columnPosition, boolean nullable, int sqlType, +// int decimalDigits, String comments, String foreignTable, ColumnMetadata foreignColumn) +// { +// this.columnPosition = columnPosition; +// this.tableMetadata = tableMetadata; +// this.name = name; +// this.type = type; +// this.length = length; +// this.nullable = nullable; +// this.sqlType = sqlType; +// this.decimalDigits = decimalDigits; +// this.comments = comments; +// this.foreignTable = foreignTable; +// this.foreignColumn = foreignColumn; +// } +// /***********************************************************************/ +// public int getLength() +// { +// return length; +// } +// /***********************************************************************/ +// public int getSqlType() +// { +// return sqlType; +// } +// /***********************************************************************/ +// public String getSqlTypeName() +// { +// String name = DatabaseUtils.findDatabaseName(sqlType); +// if (name == null) +// name = "unknown: " + getType(); +// else if (name == "decimal" || name.startsWith("numeric")) +// { +// name += "(" + length + ", " + decimalDigits + ")"; +// } +// else if (name == "varchar" || name == "char") +// { +// name += "(" + length + ")"; +// } +// return name; +// } +// /***********************************************************************/ +// public int getColumnPosition() +// { +// return columnPosition; +// } +// /***********************************************************************/ +// public String getName() +// { +// return name; +// } +// /***********************************************************************/ +// public boolean isNullable() +// { +// return nullable; +// } +// /***********************************************************************/ +// public Class getType() +// { +// return type; +// } +// /***********************************************************************/ +// public int getDecimalDigits() +// { +// return decimalDigits; +// } +// /***********************************************************************/ +// public String getComments() +// { +// return comments; +// } +// /***********************************************************************/ +// public String getForeignTable() +// { +// return foreignTable; +// } +// /***********************************************************************/ +// public ColumnMetadata getForeignColumn() +// { +// return foreignColumn; +// } +// /***********************************************************************/ +// public String getNameWithPrefix(String alias) +// { +// return alias + "." + getName(); +// } +// /***********************************************************************/ +// public String getSequenceName(int databaseType) +// { +// if (databaseType == DatabaseUtils.POSTGRESQL) { return String.format("%s_%s_seq", tableMetadata.getTableName(), this.getName()); } +// return null; +// } +// /************************************************************************/ +// /** +// * A convenience function to turn a vector of com.spun.util.database.ColumnMetadata objects +// * into an Array of the com.spun.util.database.ColumnMetadata objects. +// * @param vectorOf a Vector of com.spun.util.database.ColumnMetadata objects +// * @return the array of com.spun.util.database.ColumnMetadata. +// * @throws Error if an element of vectorOf is not a com.spun.util.database.ColumnMetadata object. +// **/ +// public static com.spun.util.database.ColumnMetadata[] toArray(java.util.Collection vectorOf) +// { +// if (vectorOf == null) { return new com.spun.util.database.ColumnMetadata[0]; } +// com.spun.util.database.ColumnMetadata array[] = new com.spun.util.database.ColumnMetadata[vectorOf.size()]; +// java.util.Iterator iterator = vectorOf.iterator(); +// int i = 0; +// while (iterator.hasNext()) +// { +// java.lang.Object rowObject = iterator.next(); +// if (rowObject instanceof com.spun.util.database.ColumnMetadata) +// { +// array[i++] = (com.spun.util.database.ColumnMetadata) rowObject; +// } +// else +// { +// throw new Error("toArray[" + i + "] is not an instance of com.spun.util.database.ColumnMetadata but a " + rowObject.getClass().getName()); +// } +// } +// return array; +// } +// /***********************************************************************/ +//} \ No newline at end of file diff --git a/src/main/java/com/spun/util/database/DatabaseCache.java b/src/main/java/com/spun/util/database/DatabaseCache.java index 47cf7fd..7c30f76 100644 --- a/src/main/java/com/spun/util/database/DatabaseCache.java +++ b/src/main/java/com/spun/util/database/DatabaseCache.java @@ -1,40 +1,40 @@ -package com.spun.util.database; - -import java.sql.SQLException; -import java.sql.Statement; - -public interface DatabaseCache -{ - /**************************************************************************/ - /** - * The type of object this cache holds. Caches should only hold 1 type of - * DatabaseObject - **/ - public Class getObjectType(); - - /**************************************************************************/ - /** - * The default LinkBack setting - **/ - public boolean isLinkBackOn(); - - /**************************************************************************/ - /** - * loads the cache from the database - **/ - public void load(Statement stmt) throws SQLException; - - /**************************************************************************/ - /** - * clears the cache and reloads it from the database - **/ - public void reset(Statement stmt) throws SQLException; - - /**************************************************************************/ - /** - * @return the object from the cache with the corresponding pkey - **/ - public T get(int pkey); - /**************************************************************************/ - /**************************************************************************/ -} \ No newline at end of file +//package com.spun.util.database; +// +//import java.sql.SQLException; +//import java.sql.Statement; +// +//public interface DatabaseCache +//{ +// /**************************************************************************/ +// /** +// * The type of object this cache holds. Caches should only hold 1 type of +// * DatabaseObject +// **/ +// public Class getObjectType(); +// +// /**************************************************************************/ +// /** +// * The default LinkBack setting +// **/ +// public boolean isLinkBackOn(); +// +// /**************************************************************************/ +// /** +// * loads the cache from the database +// **/ +// public void load(Statement stmt) throws SQLException; +// +// /**************************************************************************/ +// /** +// * clears the cache and reloads it from the database +// **/ +// public void reset(Statement stmt) throws SQLException; +// +// /**************************************************************************/ +// /** +// * @return the object from the cache with the corresponding pkey +// **/ +// public T get(int pkey); +// /**************************************************************************/ +// /**************************************************************************/ +//} \ No newline at end of file diff --git a/src/main/java/com/spun/util/database/DatabaseLifeCycleUtils.java b/src/main/java/com/spun/util/database/DatabaseLifeCycleUtils.java index 899efa6..6e21611 100644 --- a/src/main/java/com/spun/util/database/DatabaseLifeCycleUtils.java +++ b/src/main/java/com/spun/util/database/DatabaseLifeCycleUtils.java @@ -1,298 +1,298 @@ -package com.spun.util.database; - -import java.io.BufferedReader; -import java.io.BufferedWriter; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.OutputStreamWriter; -import java.sql.SQLException; -import java.sql.Statement; - -import com.spun.util.DatabaseConfiguration; -import com.spun.util.DatabaseUtils; -import com.spun.util.MySystem; - -public class DatabaseLifeCycleUtils -{ - /***********************************************************************/ - public static void backupDatabase(Statement stmt, String databaseName, DatabaseConfiguration config, - String fileName) throws Exception - { - switch (config.type) - { - case DatabaseUtils.SQLSERVER2005 : - case DatabaseUtils.SQLSERVER2000 : - case DatabaseUtils.SQLSERVER : - backupSQLServer(stmt, databaseName, fileName); - break; - case DatabaseUtils.POSTGRESQL : - backupPostgreSQL(databaseName, config, fileName); - break; - case DatabaseUtils.MY_SQL : - backupMySQL(databaseName, fileName); - break; - default : - throw new Error("Unhandled database type: " + DatabaseUtils.getDatabaseType(config.type)); - } - } - /***********************************************************************/ - private static void backupMySQL(String databaseName, String fileName) throws Exception - { - File file = new File(fileName); - if (!file.getParentFile().exists()) - { - file.getParentFile().createNewFile(); - } - String commandLine = "mysqldump -r " + fileName + " " + databaseName; - Process process = Runtime.getRuntime().exec(commandLine); - process.waitFor(); - if (process.exitValue() != 0) { throw new Error(extractError(commandLine, process.getErrorStream())); } - } - /***********************************************************************/ - private static void backupPostgreSQL(String databaseName, DatabaseConfiguration config, String fileName) - throws Exception - { - String commandLine = null; - try - { - File file = new File(fileName); - if (!file.getParentFile().exists()) - { - file.getParentFile().createNewFile(); - } - if (System.getProperty("os.name").indexOf("Windows") >= 0) - { - commandLine = "pg_dump --clean --username=" + config.getUserName() + " --file=\"" - + file.getCanonicalPath() + "\" " + databaseName; - } - else - { - commandLine = "pg_dump --clean --file=" + file.getCanonicalPath() + " " + databaseName; - } - Process process = Runtime.getRuntime().exec(commandLine); - // check for a password prompt - if (getPasswordPrompt(process)) - { - // send the password - sendPassword(process, config.getPassword()); - } - process.waitFor(); - if (process.exitValue() != 0) { throw new Error(extractError(commandLine, process.getErrorStream())); } - } - catch (IOException e) - { - MySystem.variable("CommandLine", commandLine); - throw e; - } - } - private static boolean getPasswordPrompt(Process process) throws Exception - { - InputStream error = process.getErrorStream(); - InputStream in = process.getInputStream(); - int TIMEOUT = 3; - long timeOut = System.currentTimeMillis() + (TIMEOUT * 1000); - StringBuffer prompt = new StringBuffer(); - while (System.currentTimeMillis() < timeOut) - { - if (in.available() == 0 && error.available() == 0) - { - Thread.sleep(500); - } - else - { - if (in.available() != 0) - { - prompt.append((char) in.read()); - } - if (error.available() != 0) - { - prompt.append((char) error.read()); - } - timeOut = System.currentTimeMillis() + (TIMEOUT * 1000); - } - } - MySystem.variable("prompt", prompt.toString()); - return prompt.toString().startsWith("Password"); - } - private static void sendPassword(Process process, String password) throws Exception - { - BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(process.getOutputStream())); - writer.write(password); - writer.newLine(); - writer.flush(); - writer.close(); - } - /***********************************************************************/ - private static void backupSQLServer(Statement stmt, String databaseName, String fileName) throws SQLException - { - String sql = "BACKUP DATABASE " + databaseName + " TO DISK = '" + fileName + "'"; - MySystem.query("BACKUP", sql); - stmt.execute(sql); - } - /***********************************************************************/ - public static void restoreDatabase(Statement stmt, String databaseName, DatabaseConfiguration config, - String fileName) throws Exception - { - switch (config.type) - { - case DatabaseUtils.SQLSERVER2005 : - case DatabaseUtils.SQLSERVER2000 : - case DatabaseUtils.SQLSERVER : - restoreSQLServer(stmt, databaseName, fileName); - break; - case DatabaseUtils.POSTGRESQL : - restorePostgreSQL(databaseName, config, fileName); - break; - case DatabaseUtils.MY_SQL : - restoreMySQL(stmt, databaseName, fileName); - break; - default : - throw new Error("Unhandled database type: " + DatabaseUtils.getDatabaseType(config.type)); - } - } - /***********************************************************************/ - private static void restoreMySQL(Statement stmt, String databaseName, String fileName) throws SQLException - { - String restoreCommand = "LOAD DATA INFILE '" + fileName + "' REPLACE ..."; - MySystem.query(restoreCommand); - stmt.execute(restoreCommand); - } - /***********************************************************************/ - private static void restorePostgreSQL(String databaseName, DatabaseConfiguration config, String fileName) - throws Error, Exception - { - String commandLine; - if (System.getProperty("os.name").indexOf("Windows") >= 0) - { - commandLine = "psql -f " + fileName + " -U " + config.userName + " " + databaseName; - } - else - { - commandLine = "psql -f " + fileName + " " + databaseName; - } - MySystem.event("RUNNING : " + commandLine); - Process process = Runtime.getRuntime().exec(commandLine); - if (getPasswordPrompt(process)) - { - sendPassword(process, config.getPassword()); - } - Thread.sleep(2000); - String string = null; - BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); - if (reader.ready()) - { - while ((string = reader.readLine()) != null) - { - MySystem.variable(string); - } - } - reader.close(); - reader = new BufferedReader(new InputStreamReader(process.getErrorStream())); - if (reader.ready()) - { - while ((string = reader.readLine()) != null) - { - MySystem.variable(string); - } - } - process.waitFor(); - reader.close(); - if (process.exitValue() != 0) { throw new Error(extractError(commandLine, process.getErrorStream())); } - } - /***********************************************************************/ - private static void restoreSQLServer(Statement stmt, String databaseName, String fileName) throws SQLException - { - stmt.execute("USE master"); - String restoreCommand = "RESTORE DATABASE " + databaseName + " FROM DISK = '" + fileName + "'"; - MySystem.query(restoreCommand); - stmt.execute(restoreCommand); - stmt.execute("USE " + databaseName); - } - /***********************************************************************/ - private static String extractError(String commandLine, InputStream error) throws Exception - { - /* - Process whoami = Runtime.getRuntime().exec("whoami"); - whoami.waitFor(); - String userName = extractText(whoami.getInputStream());*/ - String errorText = extractText(error); - return "Error Executing '" + commandLine + /*"' AS USER '" + userName + */"'- " + errorText; - } - /***********************************************************************/ - public static String extractText(InputStream inStream) throws IOException - { - StringBuffer errorBuffer = new StringBuffer(); - BufferedReader in = new BufferedReader(new InputStreamReader(inStream)); - while (in.ready()) - { - errorBuffer.append(in.readLine()); - } - return errorBuffer.toString(); - } - /***********************************************************************/ - public static void deleteTable(String tableName, int databaseType, Statement stmt) throws SQLException - { - switch (databaseType) - { - case DatabaseUtils.SQLSERVER2005 : - case DatabaseUtils.SQLSERVER2000 : - case DatabaseUtils.SQLSERVER : - deleteSQLServerTable(tableName, stmt); - break; - case DatabaseUtils.POSTGRESQL : - deletePostgreSQLTable(tableName, stmt); - break; - case DatabaseUtils.MY_SQL : - deleteMySqlTable(tableName, stmt); - break; - default : - throw new Error("Unhandled database type: " + DatabaseUtils.getDatabaseType(databaseType)); - } - } - /***********************************************************************/ - private static void deleteMySqlTable(String tableName, Statement stmt) throws SQLException - { - stmt.executeUpdate("TRUNCATE " + tableName); - } - /***********************************************************************/ - private static void deletePostgreSQLTable(String tableName, Statement stmt) throws SQLException - { - stmt.executeUpdate("DELETE FROM " + tableName); - stmt.executeQuery("select setval('" + tableName + "_pkey_seq',1)"); - } - /***********************************************************************/ - public static void resetTableIndex(String tableName, int databaseType, Statement stmt) throws SQLException - { - switch (databaseType) - { - case DatabaseUtils.SQLSERVER2005 : - case DatabaseUtils.SQLSERVER2000 : - case DatabaseUtils.SQLSERVER : - break; - case DatabaseUtils.POSTGRESQL : - resetPostgreIndex(tableName, stmt); - break; - case DatabaseUtils.MY_SQL : - break; - default : - throw new Error("Unhandled database type: " + DatabaseUtils.getDatabaseType(databaseType)); - } - } - /***********************************************************************/ - private static void resetPostgreIndex(String tableName, Statement stmt) throws SQLException - { - String sql = "select setval('" + tableName + "_pkey_seq',(select max(pkey) + 1 from " + tableName + "))"; - MySystem.query("reset index", sql); - stmt.executeQuery(sql); - } - /***********************************************************************/ - private static void deleteSQLServerTable(String tableName, Statement stmt) throws SQLException - { - stmt.executeUpdate("DELETE FROM " + tableName); - stmt.executeUpdate("DBCC CHECKIDENT('" + tableName + "', RESEED, 1)"); - } - /***********************************************************************/ - /***********************************************************************/ -} \ No newline at end of file +//package com.spun.util.database; +// +//import java.io.BufferedReader; +//import java.io.BufferedWriter; +//import java.io.File; +//import java.io.IOException; +//import java.io.InputStream; +//import java.io.InputStreamReader; +//import java.io.OutputStreamWriter; +//import java.sql.SQLException; +//import java.sql.Statement; +// +//import com.spun.util.DatabaseConfiguration; +//import com.spun.util.DatabaseUtils; +//import com.spun.util.MySystem; +// +//public class DatabaseLifeCycleUtils +//{ +// /***********************************************************************/ +// public static void backupDatabase(Statement stmt, String databaseName, DatabaseConfiguration config, +// String fileName) throws Exception +// { +// switch (config.type) +// { +// case DatabaseUtils.SQLSERVER2005 : +// case DatabaseUtils.SQLSERVER2000 : +// case DatabaseUtils.SQLSERVER : +// backupSQLServer(stmt, databaseName, fileName); +// break; +// case DatabaseUtils.POSTGRESQL : +// backupPostgreSQL(databaseName, config, fileName); +// break; +// case DatabaseUtils.MY_SQL : +// backupMySQL(databaseName, fileName); +// break; +// default : +// throw new Error("Unhandled database type: " + DatabaseUtils.getDatabaseType(config.type)); +// } +// } +// /***********************************************************************/ +// private static void backupMySQL(String databaseName, String fileName) throws Exception +// { +// File file = new File(fileName); +// if (!file.getParentFile().exists()) +// { +// file.getParentFile().createNewFile(); +// } +// String commandLine = "mysqldump -r " + fileName + " " + databaseName; +// Process process = Runtime.getRuntime().exec(commandLine); +// process.waitFor(); +// if (process.exitValue() != 0) { throw new Error(extractError(commandLine, process.getErrorStream())); } +// } +// /***********************************************************************/ +// private static void backupPostgreSQL(String databaseName, DatabaseConfiguration config, String fileName) +// throws Exception +// { +// String commandLine = null; +// try +// { +// File file = new File(fileName); +// if (!file.getParentFile().exists()) +// { +// file.getParentFile().createNewFile(); +// } +// if (System.getProperty("os.name").indexOf("Windows") >= 0) +// { +// commandLine = "pg_dump --clean --username=" + config.getUserName() + " --file=\"" +// + file.getCanonicalPath() + "\" " + databaseName; +// } +// else +// { +// commandLine = "pg_dump --clean --file=" + file.getCanonicalPath() + " " + databaseName; +// } +// Process process = Runtime.getRuntime().exec(commandLine); +// // check for a password prompt +// if (getPasswordPrompt(process)) +// { +// // send the password +// sendPassword(process, config.getPassword()); +// } +// process.waitFor(); +// if (process.exitValue() != 0) { throw new Error(extractError(commandLine, process.getErrorStream())); } +// } +// catch (IOException e) +// { +// MySystem.variable("CommandLine", commandLine); +// throw e; +// } +// } +// private static boolean getPasswordPrompt(Process process) throws Exception +// { +// InputStream error = process.getErrorStream(); +// InputStream in = process.getInputStream(); +// int TIMEOUT = 3; +// long timeOut = System.currentTimeMillis() + (TIMEOUT * 1000); +// StringBuffer prompt = new StringBuffer(); +// while (System.currentTimeMillis() < timeOut) +// { +// if (in.available() == 0 && error.available() == 0) +// { +// Thread.sleep(500); +// } +// else +// { +// if (in.available() != 0) +// { +// prompt.append((char) in.read()); +// } +// if (error.available() != 0) +// { +// prompt.append((char) error.read()); +// } +// timeOut = System.currentTimeMillis() + (TIMEOUT * 1000); +// } +// } +// MySystem.variable("prompt", prompt.toString()); +// return prompt.toString().startsWith("Password"); +// } +// private static void sendPassword(Process process, String password) throws Exception +// { +// BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(process.getOutputStream())); +// writer.write(password); +// writer.newLine(); +// writer.flush(); +// writer.close(); +// } +// /***********************************************************************/ +// private static void backupSQLServer(Statement stmt, String databaseName, String fileName) throws SQLException +// { +// String sql = "BACKUP DATABASE " + databaseName + " TO DISK = '" + fileName + "'"; +// MySystem.query("BACKUP", sql); +// stmt.execute(sql); +// } +// /***********************************************************************/ +// public static void restoreDatabase(Statement stmt, String databaseName, DatabaseConfiguration config, +// String fileName) throws Exception +// { +// switch (config.type) +// { +// case DatabaseUtils.SQLSERVER2005 : +// case DatabaseUtils.SQLSERVER2000 : +// case DatabaseUtils.SQLSERVER : +// restoreSQLServer(stmt, databaseName, fileName); +// break; +// case DatabaseUtils.POSTGRESQL : +// restorePostgreSQL(databaseName, config, fileName); +// break; +// case DatabaseUtils.MY_SQL : +// restoreMySQL(stmt, databaseName, fileName); +// break; +// default : +// throw new Error("Unhandled database type: " + DatabaseUtils.getDatabaseType(config.type)); +// } +// } +// /***********************************************************************/ +// private static void restoreMySQL(Statement stmt, String databaseName, String fileName) throws SQLException +// { +// String restoreCommand = "LOAD DATA INFILE '" + fileName + "' REPLACE ..."; +// MySystem.query(restoreCommand); +// stmt.execute(restoreCommand); +// } +// /***********************************************************************/ +// private static void restorePostgreSQL(String databaseName, DatabaseConfiguration config, String fileName) +// throws Error, Exception +// { +// String commandLine; +// if (System.getProperty("os.name").indexOf("Windows") >= 0) +// { +// commandLine = "psql -f " + fileName + " -U " + config.userName + " " + databaseName; +// } +// else +// { +// commandLine = "psql -f " + fileName + " " + databaseName; +// } +// MySystem.event("RUNNING : " + commandLine); +// Process process = Runtime.getRuntime().exec(commandLine); +// if (getPasswordPrompt(process)) +// { +// sendPassword(process, config.getPassword()); +// } +// Thread.sleep(2000); +// String string = null; +// BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); +// if (reader.ready()) +// { +// while ((string = reader.readLine()) != null) +// { +// MySystem.variable(string); +// } +// } +// reader.close(); +// reader = new BufferedReader(new InputStreamReader(process.getErrorStream())); +// if (reader.ready()) +// { +// while ((string = reader.readLine()) != null) +// { +// MySystem.variable(string); +// } +// } +// process.waitFor(); +// reader.close(); +// if (process.exitValue() != 0) { throw new Error(extractError(commandLine, process.getErrorStream())); } +// } +// /***********************************************************************/ +// private static void restoreSQLServer(Statement stmt, String databaseName, String fileName) throws SQLException +// { +// stmt.execute("USE master"); +// String restoreCommand = "RESTORE DATABASE " + databaseName + " FROM DISK = '" + fileName + "'"; +// MySystem.query(restoreCommand); +// stmt.execute(restoreCommand); +// stmt.execute("USE " + databaseName); +// } +// /***********************************************************************/ +// private static String extractError(String commandLine, InputStream error) throws Exception +// { +// /* +// Process whoami = Runtime.getRuntime().exec("whoami"); +// whoami.waitFor(); +// String userName = extractText(whoami.getInputStream());*/ +// String errorText = extractText(error); +// return "Error Executing '" + commandLine + /*"' AS USER '" + userName + */"'- " + errorText; +// } +// /***********************************************************************/ +// public static String extractText(InputStream inStream) throws IOException +// { +// StringBuffer errorBuffer = new StringBuffer(); +// BufferedReader in = new BufferedReader(new InputStreamReader(inStream)); +// while (in.ready()) +// { +// errorBuffer.append(in.readLine()); +// } +// return errorBuffer.toString(); +// } +// /***********************************************************************/ +// public static void deleteTable(String tableName, int databaseType, Statement stmt) throws SQLException +// { +// switch (databaseType) +// { +// case DatabaseUtils.SQLSERVER2005 : +// case DatabaseUtils.SQLSERVER2000 : +// case DatabaseUtils.SQLSERVER : +// deleteSQLServerTable(tableName, stmt); +// break; +// case DatabaseUtils.POSTGRESQL : +// deletePostgreSQLTable(tableName, stmt); +// break; +// case DatabaseUtils.MY_SQL : +// deleteMySqlTable(tableName, stmt); +// break; +// default : +// throw new Error("Unhandled database type: " + DatabaseUtils.getDatabaseType(databaseType)); +// } +// } +// /***********************************************************************/ +// private static void deleteMySqlTable(String tableName, Statement stmt) throws SQLException +// { +// stmt.executeUpdate("TRUNCATE " + tableName); +// } +// /***********************************************************************/ +// private static void deletePostgreSQLTable(String tableName, Statement stmt) throws SQLException +// { +// stmt.executeUpdate("DELETE FROM " + tableName); +// stmt.executeQuery("select setval('" + tableName + "_pkey_seq',1)"); +// } +// /***********************************************************************/ +// public static void resetTableIndex(String tableName, int databaseType, Statement stmt) throws SQLException +// { +// switch (databaseType) +// { +// case DatabaseUtils.SQLSERVER2005 : +// case DatabaseUtils.SQLSERVER2000 : +// case DatabaseUtils.SQLSERVER : +// break; +// case DatabaseUtils.POSTGRESQL : +// resetPostgreIndex(tableName, stmt); +// break; +// case DatabaseUtils.MY_SQL : +// break; +// default : +// throw new Error("Unhandled database type: " + DatabaseUtils.getDatabaseType(databaseType)); +// } +// } +// /***********************************************************************/ +// private static void resetPostgreIndex(String tableName, Statement stmt) throws SQLException +// { +// String sql = "select setval('" + tableName + "_pkey_seq',(select max(pkey) + 1 from " + tableName + "))"; +// MySystem.query("reset index", sql); +// stmt.executeQuery(sql); +// } +// /***********************************************************************/ +// private static void deleteSQLServerTable(String tableName, Statement stmt) throws SQLException +// { +// stmt.executeUpdate("DELETE FROM " + tableName); +// stmt.executeUpdate("DBCC CHECKIDENT('" + tableName + "', RESEED, 1)"); +// } +// /***********************************************************************/ +// /***********************************************************************/ +//} \ No newline at end of file diff --git a/src/main/java/com/spun/util/database/DatabaseLoader.java b/src/main/java/com/spun/util/database/DatabaseLoader.java index 8a5c42a..23475ec 100644 --- a/src/main/java/com/spun/util/database/DatabaseLoader.java +++ b/src/main/java/com/spun/util/database/DatabaseLoader.java @@ -1,38 +1,38 @@ -package com.spun.util.database; - -import java.sql.Statement; -import java.sql.SQLException; - -public final class DatabaseLoader - implements DatabaseCache -{ - private static final String ERROR_TEXT = "DatabaseLoad is a Marker to Load from the Database"; - public static DatabaseCache INSTANCE = new DatabaseLoader(); - - /**************************************************************************/ - private DatabaseLoader() {} - /**************************************************************************/ - public static boolean isDatabaseLoader(DatabaseCache cache) - { - return (cache instanceof DatabaseLoader); - } - /**************************************************************************/ - public static boolean isNormalCache(DatabaseCache cache) - { - return !((cache == null) || (cache instanceof DatabaseLoader)); - } - /**************************************************************************/ - public boolean equals(Object object) - { - return (object instanceof DatabaseLoader); - } - /**************************************************************************/ - /* UNSUPPORTED METHODS */ - /**************************************************************************/ - public Class getObjectType() {throw new UnsupportedOperationException(ERROR_TEXT);} - public boolean isLinkBackOn() {throw new UnsupportedOperationException(ERROR_TEXT);} - public void load(Statement stmt) throws SQLException {throw new UnsupportedOperationException(ERROR_TEXT);} - public void reset(Statement stmt) throws SQLException {throw new UnsupportedOperationException(ERROR_TEXT);} - public DatabaseObject get(int pkey) {throw new UnsupportedOperationException(ERROR_TEXT);} - /**************************************************************************/ -} \ No newline at end of file +//package com.spun.util.database; +// +//import java.sql.Statement; +//import java.sql.SQLException; +// +//public final class DatabaseLoader +// implements DatabaseCache +//{ +// private static final String ERROR_TEXT = "DatabaseLoad is a Marker to Load from the Database"; +// public static DatabaseCache INSTANCE = new DatabaseLoader(); +// +// /**************************************************************************/ +// private DatabaseLoader() {} +// /**************************************************************************/ +// public static boolean isDatabaseLoader(DatabaseCache cache) +// { +// return (cache instanceof DatabaseLoader); +// } +// /**************************************************************************/ +// public static boolean isNormalCache(DatabaseCache cache) +// { +// return !((cache == null) || (cache instanceof DatabaseLoader)); +// } +// /**************************************************************************/ +// public boolean equals(Object object) +// { +// return (object instanceof DatabaseLoader); +// } +// /**************************************************************************/ +// /* UNSUPPORTED METHODS */ +// /**************************************************************************/ +// public Class getObjectType() {throw new UnsupportedOperationException(ERROR_TEXT);} +// public boolean isLinkBackOn() {throw new UnsupportedOperationException(ERROR_TEXT);} +// public void load(Statement stmt) throws SQLException {throw new UnsupportedOperationException(ERROR_TEXT);} +// public void reset(Statement stmt) throws SQLException {throw new UnsupportedOperationException(ERROR_TEXT);} +// public DatabaseObject get(int pkey) {throw new UnsupportedOperationException(ERROR_TEXT);} +// /**************************************************************************/ +//} \ No newline at end of file diff --git a/src/main/java/com/spun/util/database/DatabaseLoadingTracker.java b/src/main/java/com/spun/util/database/DatabaseLoadingTracker.java index d73396a..2be6527 100644 --- a/src/main/java/com/spun/util/database/DatabaseLoadingTracker.java +++ b/src/main/java/com/spun/util/database/DatabaseLoadingTracker.java @@ -1,40 +1,40 @@ -package com.spun.util.database; - -import java.util.HashMap; - -public class DatabaseLoadingTracker -{ - private HashMap loaded = null; - /**************************************************************************/ - public DatabaseLoadingTracker() - { - loaded = new HashMap(); - } - /**************************************************************************/ - private String getHashKey(DatabaseObject object) - { - return object.getClass().getName() + object.getPkey(); - } - /**************************************************************************/ - /** - * loads the chache from the database - **/ - public DatabaseObject load(DatabaseObject newObject) - { - if (newObject == null) {return null;} - String hashKey = getHashKey(newObject); - DatabaseObject oldObject = (DatabaseObject)loaded.get(hashKey); - if (oldObject == null) - { - oldObject = newObject; - loaded.put(hashKey, newObject); - } - else - { - //My_System.event("found duplicate of " + hashKey); - } - return oldObject; - } - /**************************************************************************/ - /**************************************************************************/ -} \ No newline at end of file +//package com.spun.util.database; +// +//import java.util.HashMap; +// +//public class DatabaseLoadingTracker +//{ +// private HashMap loaded = null; +// /**************************************************************************/ +// public DatabaseLoadingTracker() +// { +// loaded = new HashMap(); +// } +// /**************************************************************************/ +// private String getHashKey(DatabaseObject object) +// { +// return object.getClass().getName() + object.getPkey(); +// } +// /**************************************************************************/ +// /** +// * loads the chache from the database +// **/ +// public DatabaseObject load(DatabaseObject newObject) +// { +// if (newObject == null) {return null;} +// String hashKey = getHashKey(newObject); +// DatabaseObject oldObject = (DatabaseObject)loaded.get(hashKey); +// if (oldObject == null) +// { +// oldObject = newObject; +// loaded.put(hashKey, newObject); +// } +// else +// { +// //My_System.event("found duplicate of " + hashKey); +// } +// return oldObject; +// } +// /**************************************************************************/ +// /**************************************************************************/ +//} \ No newline at end of file diff --git a/src/main/java/com/spun/util/database/DatabaseObject.java b/src/main/java/com/spun/util/database/DatabaseObject.java index aec7753..430fb9d 100644 --- a/src/main/java/com/spun/util/database/DatabaseObject.java +++ b/src/main/java/com/spun/util/database/DatabaseObject.java @@ -1,104 +1,104 @@ -package com.spun.util.database; - -import java.sql.SQLException; -import java.sql.Statement; -import java.util.Collection; - -import com.spun.util.filters.Filter; - -public interface DatabaseObject -{ - public static DatabaseObject Null = new NullDatabaseObject(); - /***********************************************************************/ - public boolean isNew(); - public void setNew(boolean b); - /***********************************************************************/ - public int getPkey(); - /***********************************************************************/ - public boolean setPkey(int i); - /***********************************************************************/ - public Metadata getMetadata(); - /***********************************************************************/ - public boolean save(Statement stmt) throws java.sql.SQLException; - /***********************************************************************/ - public boolean deleteFromDatabase(java.sql.Statement stmt) throws java.sql.SQLException; - /***********************************************************************/ - /** Inner Classes **/ - /***********************************************************************/ - public static class FilterNew implements com.spun.util.filters.Filter - { - public static Filter INSTANCE = new FilterNew(); - public boolean isExtracted(Object object) throws IllegalArgumentException - { - if (!(object instanceof DatabaseObject)) { throw new IllegalArgumentException( - "Expected Object of Type DatabaseObject but got " + object.getClass().getName()); } - DatabaseObject o = (DatabaseObject) object; - return o.isNew(); - } - } - /**************************************************************************/ - public static class Utils - { - public static void saveAll(DatabaseObject[] objects, Statement stmt) throws SQLException - { - java.util.HashSet set = new java.util.HashSet(); - for (int i = 0; i < objects.length; i++) - { - DatabaseRelationshipPersistent object = (DatabaseRelationshipPersistent) objects[i]; - object.save(stmt, set, false); - } - } - /***********************************************************************/ - public static T get(int pkey, T[] from) - { - if (from == null) { return null; } - for (int i = 0; i < from.length; i++) - { - if (pkey == from[i].getPkey()) { return from[i]; } - } - return null; - } - /**************************************************************************/ - public static T get(int pkey, Collection from) - { - for (T object : from) - { - if (pkey == object.getPkey()) { return object; } - } - return null; - } - /**************************************************************************/ - /** - * A convenience function to turn a vector of com.spun.util.database.DatabaseObject objects - * into an Array of the com.spun.util.database.DatabaseObject objects. - * @param vectorOf a Vector of com.spun.util.database.DatabaseObject objects - * @return the array of com.spun.util.database.DatabaseObject. - * @throws Error if an element of vectorOf is not a com.spun.util.database.DatabaseObject object. - **/ - public static com.spun.util.database.DatabaseObject[] toArray(java.util.Collection vectorOf) - { - if (vectorOf == null) { return new com.spun.util.database.DatabaseObject[0]; } - com.spun.util.database.DatabaseObject array[] = new com.spun.util.database.DatabaseObject[vectorOf.size()]; - java.util.Iterator iterator = vectorOf.iterator(); - int i = 0; - while (iterator.hasNext()) - { - java.lang.Object rowObject = iterator.next(); - if (rowObject instanceof com.spun.util.database.DatabaseObject) - { - array[i++] = (com.spun.util.database.DatabaseObject) rowObject; - } - else - { - throw new Error("toArray[" + i + "] is not an instance of com.spun.util.database.DatabaseObject but a " - + rowObject.getClass().getName()); - } - } - return array; - } - /************************************************************************/ - /************************************************************************/ - } - /***********************************************************************/ - /***********************************************************************/ -} \ No newline at end of file +//package com.spun.util.database; +// +//import java.sql.SQLException; +//import java.sql.Statement; +//import java.util.Collection; +// +//import com.spun.util.filters.Filter; +// +//public interface DatabaseObject +//{ +// public static DatabaseObject Null = new NullDatabaseObject(); +// /***********************************************************************/ +// public boolean isNew(); +// public void setNew(boolean b); +// /***********************************************************************/ +// public int getPkey(); +// /***********************************************************************/ +// public boolean setPkey(int i); +// /***********************************************************************/ +// public Metadata getMetadata(); +// /***********************************************************************/ +// public boolean save(Statement stmt) throws java.sql.SQLException; +// /***********************************************************************/ +// public boolean deleteFromDatabase(java.sql.Statement stmt) throws java.sql.SQLException; +// /***********************************************************************/ +// /** Inner Classes **/ +// /***********************************************************************/ +// public static class FilterNew implements com.spun.util.filters.Filter +// { +// public static Filter INSTANCE = new FilterNew(); +// public boolean isExtracted(Object object) throws IllegalArgumentException +// { +// if (!(object instanceof DatabaseObject)) { throw new IllegalArgumentException( +// "Expected Object of Type DatabaseObject but got " + object.getClass().getName()); } +// DatabaseObject o = (DatabaseObject) object; +// return o.isNew(); +// } +// } +// /**************************************************************************/ +// public static class Utils +// { +// public static void saveAll(DatabaseObject[] objects, Statement stmt) throws SQLException +// { +// java.util.HashSet set = new java.util.HashSet(); +// for (int i = 0; i < objects.length; i++) +// { +// DatabaseRelationshipPersistent object = (DatabaseRelationshipPersistent) objects[i]; +// object.save(stmt, set, false); +// } +// } +// /***********************************************************************/ +// public static T get(int pkey, T[] from) +// { +// if (from == null) { return null; } +// for (int i = 0; i < from.length; i++) +// { +// if (pkey == from[i].getPkey()) { return from[i]; } +// } +// return null; +// } +// /**************************************************************************/ +// public static T get(int pkey, Collection from) +// { +// for (T object : from) +// { +// if (pkey == object.getPkey()) { return object; } +// } +// return null; +// } +// /**************************************************************************/ +// /** +// * A convenience function to turn a vector of com.spun.util.database.DatabaseObject objects +// * into an Array of the com.spun.util.database.DatabaseObject objects. +// * @param vectorOf a Vector of com.spun.util.database.DatabaseObject objects +// * @return the array of com.spun.util.database.DatabaseObject. +// * @throws Error if an element of vectorOf is not a com.spun.util.database.DatabaseObject object. +// **/ +// public static com.spun.util.database.DatabaseObject[] toArray(java.util.Collection vectorOf) +// { +// if (vectorOf == null) { return new com.spun.util.database.DatabaseObject[0]; } +// com.spun.util.database.DatabaseObject array[] = new com.spun.util.database.DatabaseObject[vectorOf.size()]; +// java.util.Iterator iterator = vectorOf.iterator(); +// int i = 0; +// while (iterator.hasNext()) +// { +// java.lang.Object rowObject = iterator.next(); +// if (rowObject instanceof com.spun.util.database.DatabaseObject) +// { +// array[i++] = (com.spun.util.database.DatabaseObject) rowObject; +// } +// else +// { +// throw new Error("toArray[" + i + "] is not an instance of com.spun.util.database.DatabaseObject but a " +// + rowObject.getClass().getName()); +// } +// } +// return array; +// } +// /************************************************************************/ +// /************************************************************************/ +// } +// /***********************************************************************/ +// /***********************************************************************/ +//} \ No newline at end of file diff --git a/src/main/java/com/spun/util/database/DatabaseRelationshipPersistent.java b/src/main/java/com/spun/util/database/DatabaseRelationshipPersistent.java index 99a77c4..a0d2376 100644 --- a/src/main/java/com/spun/util/database/DatabaseRelationshipPersistent.java +++ b/src/main/java/com/spun/util/database/DatabaseRelationshipPersistent.java @@ -1,9 +1,9 @@ -package com.spun.util.database; - -import java.sql.Statement; - -public interface DatabaseRelationshipPersistent -{ - public boolean save(Statement stmt, java.util.HashSet set, boolean shallowOnly) - throws java.sql.SQLException; -} +//package com.spun.util.database; +// +//import java.sql.Statement; +// +//public interface DatabaseRelationshipPersistent +//{ +// public boolean save(Statement stmt, java.util.HashSet set, boolean shallowOnly) +// throws java.sql.SQLException; +//} diff --git a/src/main/java/com/spun/util/database/DatabaseTransactionInfo.java b/src/main/java/com/spun/util/database/DatabaseTransactionInfo.java index 01e9e28..fe1c2a4 100644 --- a/src/main/java/com/spun/util/database/DatabaseTransactionInfo.java +++ b/src/main/java/com/spun/util/database/DatabaseTransactionInfo.java @@ -1,57 +1,57 @@ -package com.spun.util.database; - -import java.lang.ref.WeakReference; -import java.sql.Connection; -import java.sql.SQLException; - -public class DatabaseTransactionInfo -{ - private WeakReference connectionReference; - private String originator; - private boolean automaticCommit; - /**************************************************************************/ - /** - * @return the object from the cache with the corosponding pkey - **/ - public DatabaseTransactionInfo(Connection con, int levelsOfRemoval) throws SQLException - { - this.automaticCommit = con.getAutoCommit(); - this.connectionReference = new WeakReference(con); - this.originator = getOriginatorText(levelsOfRemoval + 1); - //My_System.variable("getOriginatorText for creation", originator + con.toString()); - } - /***********************************************************************/ - public static String getOriginatorText(int offset) - { - StackTraceElement trace[] = new Error().getStackTrace(); - offset = offset + 1; - StackTraceElement element = trace[offset]; - int size = trace.length - offset; - String text = "[" + size + "]" + element.getClassName() + "." + element.getMethodName(); - return text; - } - /**************************************************************************/ - public boolean isFinalizeable() - { - return getConnection() == null; - } - /**************************************************************************/ - public boolean isOriginator(Connection con, int levelsOfRemoval) - { - String originatorText = getOriginatorText(levelsOfRemoval + 1); - return con.equals(getConnection()) && this.originator.equals(originatorText); - } - /***********************************************************************/ - public Connection getConnection() - { - return this.connectionReference.get(); - } - /***********************************************************************/ - public void cleanConnection() throws SQLException - { - Connection con = getConnection(); - con.setAutoCommit(automaticCommit); - } - /**************************************************************************/ - /**************************************************************************/ -} \ No newline at end of file +//package com.spun.util.database; +// +//import java.lang.ref.WeakReference; +//import java.sql.Connection; +//import java.sql.SQLException; +// +//public class DatabaseTransactionInfo +//{ +// private WeakReference connectionReference; +// private String originator; +// private boolean automaticCommit; +// /**************************************************************************/ +// /** +// * @return the object from the cache with the corresponding pkey +// **/ +// public DatabaseTransactionInfo(Connection con, int levelsOfRemoval) throws SQLException +// { +// this.automaticCommit = con.getAutoCommit(); +// this.connectionReference = new WeakReference(con); +// this.originator = getOriginatorText(levelsOfRemoval + 1); +// //My_System.variable("getOriginatorText for creation", originator + con.toString()); +// } +// /***********************************************************************/ +// public static String getOriginatorText(int offset) +// { +// StackTraceElement trace[] = new Error().getStackTrace(); +// offset = offset + 1; +// StackTraceElement element = trace[offset]; +// int size = trace.length - offset; +// String text = "[" + size + "]" + element.getClassName() + "." + element.getMethodName(); +// return text; +// } +// /**************************************************************************/ +// public boolean isFinalizeable() +// { +// return getConnection() == null; +// } +// /**************************************************************************/ +// public boolean isOriginator(Connection con, int levelsOfRemoval) +// { +// String originatorText = getOriginatorText(levelsOfRemoval + 1); +// return con.equals(getConnection()) && this.originator.equals(originatorText); +// } +// /***********************************************************************/ +// public Connection getConnection() +// { +// return this.connectionReference.get(); +// } +// /***********************************************************************/ +// public void cleanConnection() throws SQLException +// { +// Connection con = getConnection(); +// con.setAutoCommit(automaticCommit); +// } +// /**************************************************************************/ +// /**************************************************************************/ +//} \ No newline at end of file diff --git a/src/main/java/com/spun/util/database/Metadata.java b/src/main/java/com/spun/util/database/Metadata.java index 4dd76fd..a7fc7ee 100644 --- a/src/main/java/com/spun/util/database/Metadata.java +++ b/src/main/java/com/spun/util/database/Metadata.java @@ -1,18 +1,18 @@ -package com.spun.util.database; - - -public interface Metadata -{ - - /************************************************************************/ - public ColumnMetadata getColumnByName(String columnName); - /************************************************************************/ - public String getTableName(); - /************************************************************************/ - public ColumnMetadata[] getColumns(); - /************************************************************************/ - public String[] getColumnNames(); - /************************************************************************/ - /***********************************************************************/ - -} +//package com.spun.util.database; +// +// +//public interface Metadata +//{ +// +// /************************************************************************/ +// public ColumnMetadata getColumnByName(String columnName); +// /************************************************************************/ +// public String getTableName(); +// /************************************************************************/ +// public ColumnMetadata[] getColumns(); +// /************************************************************************/ +// public String[] getColumnNames(); +// /************************************************************************/ +// /***********************************************************************/ +// +//} diff --git a/src/main/java/com/spun/util/database/NullDatabaseObject.java b/src/main/java/com/spun/util/database/NullDatabaseObject.java index c16a834..b113322 100644 --- a/src/main/java/com/spun/util/database/NullDatabaseObject.java +++ b/src/main/java/com/spun/util/database/NullDatabaseObject.java @@ -1,42 +1,42 @@ -package com.spun.util.database; - -import java.sql.SQLException; -import java.sql.Statement; - -public class NullDatabaseObject implements DatabaseObject -{ - @Override - public boolean isNew() - { - return false; - } - @Override - public void setNew(boolean b) - { - } - @Override - public int getPkey() - { - return 0; - } - @Override - public boolean setPkey(int i) - { - return false; - } - @Override - public Metadata getMetadata() - { - return null; - } - @Override - public boolean save(Statement stmt) throws SQLException - { - return false; - } - @Override - public boolean deleteFromDatabase(Statement stmt) throws SQLException - { - return false; - } -} +//package com.spun.util.database; +// +//import java.sql.SQLException; +//import java.sql.Statement; +// +//public class NullDatabaseObject implements DatabaseObject +//{ +// @Override +// public boolean isNew() +// { +// return false; +// } +// @Override +// public void setNew(boolean b) +// { +// } +// @Override +// public int getPkey() +// { +// return 0; +// } +// @Override +// public boolean setPkey(int i) +// { +// return false; +// } +// @Override +// public Metadata getMetadata() +// { +// return null; +// } +// @Override +// public boolean save(Statement stmt) throws SQLException +// { +// return false; +// } +// @Override +// public boolean deleteFromDatabase(Statement stmt) throws SQLException +// { +// return false; +// } +//} diff --git a/src/main/java/com/spun/util/database/Syncable.java b/src/main/java/com/spun/util/database/Syncable.java index 01a1264..0be82ad 100644 --- a/src/main/java/com/spun/util/database/Syncable.java +++ b/src/main/java/com/spun/util/database/Syncable.java @@ -1,6 +1,6 @@ -package com.spun.util.database; - -public interface Syncable -{ - public void sync(DatabaseCache cache); -} +//package com.spun.util.database; +// +//public interface Syncable +//{ +// public void sync(DatabaseCache cache); +//} diff --git a/src/main/java/com/spun/util/io/FileUtils.java b/src/main/java/com/spun/util/io/FileUtils.java index f29fa29..a1e2008 100644 --- a/src/main/java/com/spun/util/io/FileUtils.java +++ b/src/main/java/com/spun/util/io/FileUtils.java @@ -28,17 +28,17 @@ **/ public class FileUtils { - /***********************************************************************/ - /** - * @see java.io.File.createTempFile(String,String) - **/ - public static File createTempDirectory() throws IOException - { - File tempFile = File.createTempFile("TEMP", null); - tempFile.delete(); - tempFile.mkdirs(); - return tempFile; - } +// /***********************************************************************/ +// /** +// * @see java.io.File.createTempFile(String,String) +// **/ +// public static File createTempDirectory() throws IOException +// { +// File tempFile = File.createTempFile("TEMP", null); +// tempFile.delete(); +// tempFile.mkdirs(); +// return tempFile; +// } /***********************************************************************/ public static void deleteDirectory(File directory) throws IOException { diff --git a/src/main/java/com/spun/util/io/xml/XMLSerializable.java b/src/main/java/com/spun/util/io/xml/XMLSerializable.java deleted file mode 100644 index aa7dd51..0000000 --- a/src/main/java/com/spun/util/io/xml/XMLSerializable.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.spun.util.io.xml; - -import com.spun.util.database.DatabaseObject; - -public interface XMLSerializable -{ - /************************************************************************/ - /** - * Serializes this object , plus dependencies to xml. - * @return the xml - **/ - public String serializeXML(); - /************************************************************************/ - /** - * Serializes this object , plus dependencies to xml via the writer. - * @return writer that was used - **/ - public java.io.Writer serializeXML(java.io.Writer writer); - /************************************************************************/ - /** - * Serializes this object , plus dependencies to xml via the writer. - **/ - public void serializeXML(java.util.HashMap saved, java.io.Writer writer) throws java.io.IOException; -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/persistence/DatabaseObjectDeletor.java b/src/main/java/com/spun/util/persistence/DatabaseObjectDeletor.java deleted file mode 100644 index b7201ac..0000000 --- a/src/main/java/com/spun/util/persistence/DatabaseObjectDeletor.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.spun.util.persistence; - -import java.sql.SQLException; -import java.sql.Statement; - -import com.spun.util.database.DatabaseObject; - -public class DatabaseObjectDeletor implements Deletor -{ - private Statement stmt; - public DatabaseObjectDeletor(Statement stmt) - { - this.stmt = stmt; - } - public void delete(T delete) throws SavingException - { - try - { - delete.deleteFromDatabase(stmt); - } - catch (SQLException e) - { - throw new SavingException(e); - } - } -} From 7ca58a9d5b12f4f074c1b095a749169c9d282dbd Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Thu, 5 Mar 2015 11:32:17 -0800 Subject: [PATCH 012/111] Removed additional classes --- .../com/spun/util/DatabaseConfiguration.java | 186 ----- .../util/DatabaseConfigurationWrapper.java | 12 - .../java/com/spun/util/DatabaseUtils.java | 681 ------------------ src/main/java/com/spun/util/DateUtils.java | 8 +- src/main/java/com/spun/util/MySystem.java | 25 +- .../database/AutomaticVariableSetter.java | 18 - .../database/CircularRedundancyError.java | 36 - .../spun/util/database/ColumnMetadata.java | 146 ---- .../com/spun/util/database/DatabaseCache.java | 40 - .../util/database/DatabaseLifeCycleUtils.java | 298 -------- .../spun/util/database/DatabaseLoader.java | 38 - .../util/database/DatabaseLoadingTracker.java | 40 - .../spun/util/database/DatabaseObject.java | 104 --- .../DatabaseRelationshipPersistent.java | 9 - .../database/DatabaseTransactionInfo.java | 57 -- .../java/com/spun/util/database/Metadata.java | 18 - .../util/database/NullDatabaseObject.java | 42 -- .../util/database/SshDatabaseWrapper.java | 53 -- .../java/com/spun/util/database/Syncable.java | 6 - src/main/java/com/spun/util/io/FileUtils.java | 11 - 20 files changed, 17 insertions(+), 1811 deletions(-) delete mode 100644 src/main/java/com/spun/util/DatabaseConfiguration.java delete mode 100644 src/main/java/com/spun/util/DatabaseConfigurationWrapper.java delete mode 100644 src/main/java/com/spun/util/DatabaseUtils.java delete mode 100644 src/main/java/com/spun/util/database/AutomaticVariableSetter.java delete mode 100644 src/main/java/com/spun/util/database/CircularRedundancyError.java delete mode 100644 src/main/java/com/spun/util/database/ColumnMetadata.java delete mode 100644 src/main/java/com/spun/util/database/DatabaseCache.java delete mode 100644 src/main/java/com/spun/util/database/DatabaseLifeCycleUtils.java delete mode 100644 src/main/java/com/spun/util/database/DatabaseLoader.java delete mode 100644 src/main/java/com/spun/util/database/DatabaseLoadingTracker.java delete mode 100644 src/main/java/com/spun/util/database/DatabaseObject.java delete mode 100644 src/main/java/com/spun/util/database/DatabaseRelationshipPersistent.java delete mode 100644 src/main/java/com/spun/util/database/DatabaseTransactionInfo.java delete mode 100644 src/main/java/com/spun/util/database/Metadata.java delete mode 100644 src/main/java/com/spun/util/database/NullDatabaseObject.java delete mode 100644 src/main/java/com/spun/util/database/SshDatabaseWrapper.java delete mode 100644 src/main/java/com/spun/util/database/Syncable.java diff --git a/src/main/java/com/spun/util/DatabaseConfiguration.java b/src/main/java/com/spun/util/DatabaseConfiguration.java deleted file mode 100644 index ea24820..0000000 --- a/src/main/java/com/spun/util/DatabaseConfiguration.java +++ /dev/null @@ -1,186 +0,0 @@ -package com.spun.util; - -import java.sql.Connection; -import java.sql.SQLException; -import java.util.HashMap; -import java.util.Properties; -import com.spun.util.timers.Counter; - -/** - * A static class of convence functions for database access - **/ -public class DatabaseConfiguration -{ - private boolean inRollbackOnlyMode = false; - public String dataSourceName = null; - public String driver = null; - public String protocol = null; - public String server = null; - public String port = null; - public String database = null; - public String userName = null; - public String password = null; - public int type = 0; - public String wrapper = null; - private Counter connectionCounter = new Counter(); - private static HashMap wrappers = new HashMap(); - public static void registerWrapper(String name, DatabaseConfigurationWrapper wrapper) - { - wrappers.put(name, wrapper); - } - /************************************************************************/ - public DatabaseConfiguration(DatabaseConfiguration config) - { - this.dataSourceName = config.dataSourceName; - this.driver = config.driver; - this.protocol = config.protocol; - this.server = config.server; - this.port = config.port; - this.database = config.database; - this.userName = config.userName; - this.password = config.password; - this.type = config.type; - this.wrapper = config.wrapper; - } - /************************************************************************/ - public DatabaseConfiguration(String dataSourceName, String driver, String protocol, String server, String port, - String database, String userName, String password, int type) - { - this.dataSourceName = dataSourceName; - this.driver = driver; - this.protocol = protocol; - if (protocol != null && protocol.endsWith("://")) { throw new Error("protocol's shouldn't end with '://'"); } - this.server = server; - if (server != null && server.endsWith("/")) { throw new Error("server's shouldn't end with '/'"); } - this.port = port; - this.database = database; - this.userName = userName; - this.password = password; - this.type = type; - } - /************************************************************************/ - public boolean isDataSource() - { - return StringUtils.isNonZero(dataSourceName); - } - /************************************************************************/ - /** - * Convenience function. - **/ - public Properties getProperties() - { - Properties props = new Properties(); - props.setProperty("connection", "direct"); - props.setProperty("jdbcDriver", this.driver); - props.setProperty("jdbcURL", DatabaseUtils.makeURL(protocol, server, port, database, type)); - props.setProperty("user", this.userName); - props.setProperty("password", this.password); - return props; - } - /************************************************************************/ - public Connection makeConnection() - { - return makeConnection(database); - } - /************************************************************************/ - public Connection makeConnection(String databaseName) - { - connectionCounter.inc(); - Connection con = null; - if (wrapper == null) - { - con = DatabaseUtils.makeConnection(driver, protocol, server, port, databaseName, userName, password, type); - } - else - { - DatabaseConfigurationWrapper w = (DatabaseConfigurationWrapper) wrappers.get(wrapper); - if (w == null) { throw new Error("No wrapper found for '" + wrapper + "' in " + wrappers.keySet()); } - con = w.makeConnection(databaseName, this); - - } - if(this.inRollbackOnlyMode) - { - try - { - DatabaseUtils.beginTransaction(con); - } - catch (SQLException e) - { - throw ObjectUtils.throwAsError(e); - } - } - return con; - } - /************************************************************************/ - public Counter getConnectionCounter() - { - return connectionCounter; - } - /************************************************************************/ - public String toString() - { - String value = "com.spun.util.DatabaseConfiguration["; - value += " dataSourceName = '" + dataSourceName + "'" + ",\n" + " database = '" + database + "'" + ",\n" - + " driver = '" + driver + "'" + ",\n" + " password = '" + password + "'" + ",\n" + " port = '" + port - + "'" + ",\n" + " protocol = '" + protocol + "'" + ",\n" + " server = '" + server + "'" + ",\n" - + " type = " + type + ",\n" + " userName = '" + userName + "'" + "]"; - return value; - } - /************************************************************************/ - public String getDataSourceName() - { - return dataSourceName; - } - /************************************************************************/ - public String getDatabase() - { - return database; - } - /************************************************************************/ - public String getDriver() - { - return driver; - } - /************************************************************************/ - public String getPassword() - { - return password; - } - /************************************************************************/ - public String getProtocol() - { - return protocol; - } - /************************************************************************/ - public String getServer() - { - return server; - } - /************************************************************************/ - public int getType() - { - return type; - } - /************************************************************************/ - public String getUserName() - { - return userName; - } - /***********************************************************************/ - public int getPort() - { - return NumberUtils.load(port, 0); - } - /************************************************************************/ - public void setWrapper(String wrapper) - { - this.wrapper = wrapper; - } - /************************************************************************/ - public void setRollbackOnlyMode() - { - this.inRollbackOnlyMode = true; - } - /************************************************************************/ - /************************************************************************/ -} diff --git a/src/main/java/com/spun/util/DatabaseConfigurationWrapper.java b/src/main/java/com/spun/util/DatabaseConfigurationWrapper.java deleted file mode 100644 index 46f8aa1..0000000 --- a/src/main/java/com/spun/util/DatabaseConfigurationWrapper.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.spun.util; - -import java.sql.Connection; - -/***********************************************************************/ -public interface DatabaseConfigurationWrapper -{ - /***********************************************************************/ - public Connection makeConnection(String databaseName, DatabaseConfiguration configuration); - /***********************************************************************/ - /***********************************************************************/ -} diff --git a/src/main/java/com/spun/util/DatabaseUtils.java b/src/main/java/com/spun/util/DatabaseUtils.java deleted file mode 100644 index 8e6820b..0000000 --- a/src/main/java/com/spun/util/DatabaseUtils.java +++ /dev/null @@ -1,681 +0,0 @@ -//package com.spun.util; -// -//import java.sql.Connection; -//import java.sql.DriverManager; -//import java.sql.ResultSet; -//import java.sql.SQLException; -//import java.sql.Statement; -//import java.util.ArrayList; -//import java.util.Iterator; -//import com.spun.util.database.DatabaseObject; -//import com.spun.util.database.DatabaseTransactionInfo; -//import com.spun.util.database.SqlConnectionException; -// -///** -// * A static class of convenience functions for database access -// */ -//public class DatabaseUtils -//{ -// private static ArrayList connections = new ArrayList(); -// public static final int NEW = 1; -// public static final int NEW_MODIFIED = 2; -// public static final int OLD = 3; -// public static final int OLD_MODIFIED = 4; -// public static final int ACCESS = 0; -// public static final int POSTGRESQL = 1; -// public static final int SYBASE = 2; -// public static final int ORACLE = 3; -// public static final int SQLSERVER = 4; -// public static final int SQLSERVER2000 = 5; -// public static final int MY_SQL = 6; -// public static final int SQLSERVER2005 = 7; -// public static final String DATABASE_TYPES[] = {"Access", -// "PostgreSQL", -// "Sybase", -// "Oracle", -// "Microsoft SQL Server 7.00", -// "Microsoft SQL Server 2000", -// "MySQL", -// "Microsoft SQL Server" }; -// /***********************************************************************/ -// public static String getDatabaseType(int type) -// { -// return DATABASE_TYPES[type]; -// } -// /***********************************************************************/ -// public static int getDatabaseType(Statement stmt) throws SQLException -// { -// return getDatabaseType(stmt.getConnection()); -// } -// /***********************************************************************/ -// public static int getDatabaseType(Connection con) throws SQLException -// { -// String dbName = con.getMetaData().getDatabaseProductName(); -// for (int i = 0; i < DATABASE_TYPES.length; i++) -// { -// if (DATABASE_TYPES[i].equalsIgnoreCase(dbName.trim())) { return i; } -// } -// throw new Error("Unrecognized database product name: " + dbName); -// } -// /***********************************************************************/ -// /** -// * Finds the database type name for a jdbc sql type -// */ -// public static String findDatabaseName(int i) -// { -// String name = null; -// switch (i) -// { -// case java.sql.Types.BIT : -// name = "boolean"; -// break; -// case java.sql.Types.CHAR : -// name = "char"; -// break; -// case java.sql.Types.DECIMAL : -// name = "decimal"; -// break; -// case java.sql.Types.DOUBLE : -// name = "numeric"; -// break; -// case java.sql.Types.FLOAT : -// name = "numeric"; -// break; -// case java.sql.Types.INTEGER : -// name = "integer"; -// break; -// case java.sql.Types.NUMERIC : -// name = "numeric"; -// break; -// case java.sql.Types.TIMESTAMP : -// name = "timestamp"; -// break; -// case java.sql.Types.VARCHAR : -// name = "varchar"; -// break; -// default : -// MySystem.warning("The Type not found(" + i + ")"); -// break; -// } -// return name; -// } -// /***********************************************************************/ -// /** -// * Finds the java object or primative for a sql type -// */ -// public static String findSQLName(int i) -// { -// String name = null; -// switch (i) -// { -// case java.sql.Types.ARRAY : -// name = "unknown"; -// break; -// case java.sql.Types.BIGINT : -// name = "long"; -// break; -// case java.sql.Types.BINARY : -// name = "byte[]"; -// break; -// case java.sql.Types.BIT : -// name = "boolean"; -// break; -// case java.sql.Types.BLOB : -// name = "BLOB"; -// break; -// case java.sql.Types.CHAR : -// name = "java.lang.String"; -// break; -// case java.sql.Types.CLOB : -// name = "CLOB"; -// break; -// case java.sql.Types.DATE : -// name = "java.sql.Date"; -// break; -// case java.sql.Types.DECIMAL : -// name = "java.math.BigDecimal"; -// break; -// case java.sql.Types.DISTINCT : -// name = "DISTINCT"; -// break; -// case java.sql.Types.DOUBLE : -// name = "double"; -// break; -// case java.sql.Types.FLOAT : -// name = "double"; -// break; -// case java.sql.Types.INTEGER : -// name = "int"; -// break; -// case java.sql.Types.JAVA_OBJECT : -// name = "unknown"; -// break; -// case java.sql.Types.LONGVARBINARY : -// name = "byte[]"; -// break; -// case java.sql.Types.LONGVARCHAR : -// name = "String"; -// break; -// case java.sql.Types.NULL : -// name = "NULL"; -// break; -// case java.sql.Types.NUMERIC : -// name = "java.math.BigDecimal"; -// break; -// case java.sql.Types.OTHER : -// name = "OTHER"; -// break; -// case java.sql.Types.REAL : -// name = "float"; -// break; -// case java.sql.Types.REF : -// name = "REF"; -// break; -// case java.sql.Types.SMALLINT : -// name = "short"; -// break; -// case java.sql.Types.STRUCT : -// name = "STRUCT"; -// break; -// case java.sql.Types.TIME : -// name = "java.sql.Time"; -// break; -// case java.sql.Types.TIMESTAMP : -// name = "java.sql.Timestamp"; -// break; -// case java.sql.Types.TINYINT : -// name = "byte"; -// break; -// case java.sql.Types.VARBINARY : -// name = "byte[]"; -// break; -// case java.sql.Types.VARCHAR : -// name = "java.lang.String"; -// break; -// case 11 : -// name = "java.sql.Date"; -// break; -// case -9 : -// name = "java.lang.String"; -// break; -// default : -// MySystem.warning("The Type not found(" + i + ")"); -// printSQLValues(); -// break; -// } -// return name; -// } -// public static boolean isSqlServer(int databaseType) -// { -// switch (databaseType) -// { -// case SQLSERVER2000 : -// case DatabaseUtils.SQLSERVER2005 : -// case DatabaseUtils.SQLSERVER : -// return true; -// default : -// return false; -// } -// } -// /***********************************************************************/ -// public static String makeSQL2000URL(String protocol, String server, String port, String database) -// { -// String theURL = ""; -// protocol = (StringUtils.isNonZero(protocol)) ? (protocol) + "://" : ""; -// server = (StringUtils.isNonZero(server)) ? (server) : ""; -// port = (StringUtils.isNonZero(port)) ? (":" + port) : ""; -// database = (StringUtils.isNonZero(database)) ? (";DatabaseName=" + database) : ""; -// theURL = protocol + server + port + database + ";SelectMethod=cursor"; -// return theURL; -// } -// /***********************************************************************/ -// /** -// * Creates a connection to the Database. -// */ -// public static String makeMySqlURL(String protocol, String server, String port, String database) -// { -// String theURL = ""; -// protocol = (StringUtils.isNonZero(protocol)) ? (protocol) + "://" : ""; -// server = (StringUtils.isNonZero(server)) ? (server) : ""; -// port = (StringUtils.isNonZero(port)) ? (":" + port) : ""; -// database = (StringUtils.isNonZero(database)) ? ("/" + database) : ""; -// theURL = protocol + server + port + database; -// return theURL; -// } -// /***********************************************************************/ -// /** -// * Creates a connection to the Database, and stores it in the cookies table. -// */ -// public static String makeURL(String protocol, String server, String port, String database, int type) -// { -// switch (type) -// { -// case ACCESS : -// return makeJDBCAccessURL(protocol, server, port, database); -// case SQLSERVER2000 : -// case DatabaseUtils.SQLSERVER2005 : -// return makeSQL2000URL(protocol, server, port, database); -// case ORACLE : -// case SQLSERVER : -// case POSTGRESQL : -// case SYBASE : -// return makeMySqlURL(protocol, server, port, database); -// case MY_SQL : -// return makeMySqlURL(protocol, server, port, database) + "?useUnicode=true&characterEncoding=UTF-8"; -// } -// throw new Error("Database Type '" + type + "' not supported"); -// } -// /***********************************************************************/ -// /** -// * Creates a connection to the Database. This is for Access, which is crap! -// */ -// public static String makeJDBCAccessURL(String protocol, String server, String port, String database) -// { -// String theURL = ""; -// // port = (StringUtils.isNonZero(port)) ? (":" + port) : ""; -// // server = (StringUtils.isNonZero(server)) ? (server) : ""; -// database = (StringUtils.isNonZero(database)) ? ("" + database) : ""; -// theURL = protocol + database; -// return theURL; -// } -// /***********************************************************************/ -// /** -// * Creates a connection to the Database. -// */ -// public static Connection makeConnection(String driver, String protocol, String server, String port, -// String database, String userName, String password, int type) -// { -// Connection con = null; -// String theURL = null; -// try -// { -// driver = (StringUtils.isNonZero(driver)) ? (driver) : "sun.jdbc.odbc.JdbcOdbcDriver"; -// theURL = makeURL(protocol, server, port, database, type); -// MySystem.variable("URL = " + theURL); -// // My_System.variable(driver); -// Class.forName(driver).newInstance(); -// con = DriverManager.getConnection(theURL, userName, password); -// } -// catch (SQLException e) -// { -// throw new SqlConnectionException(driver, theURL, protocol, server, port, database, userName, password, type, -// e); -// } -// catch (Exception e) -// { -// MySystem.warning("URL : " + theURL); -// ObjectUtils.throwAsError(e); -// } -// return con; -// } -// /***********************************************************************/ -// public static void printSQLValues() -// { -// MySystem.variable("java.sql.Types.BIT = " + java.sql.Types.BIT); -// MySystem.variable("java.sql.Types.TINYINT = " + java.sql.Types.TINYINT); -// MySystem.variable("java.sql.Types.BIGINT = " + java.sql.Types.BIGINT); -// MySystem.variable("java.sql.Types.LONGVARBINARY = " + java.sql.Types.LONGVARBINARY); -// MySystem.variable("java.sql.Types.VARBINARY = " + java.sql.Types.VARBINARY); -// MySystem.variable("java.sql.Types.BINARY = " + java.sql.Types.BINARY); -// MySystem.variable("java.sql.Types.LONGVARCHAR = " + java.sql.Types.LONGVARCHAR); -// MySystem.variable("java.sql.Types.NULL = " + java.sql.Types.NULL); -// MySystem.variable("java.sql.Types.CHAR = " + java.sql.Types.CHAR); -// MySystem.variable("java.sql.Types.NUMERIC = " + java.sql.Types.NUMERIC); -// MySystem.variable("java.sql.Types.DECIMAL = " + java.sql.Types.DECIMAL); -// MySystem.variable("java.sql.Types.INTEGER = " + java.sql.Types.INTEGER); -// MySystem.variable("java.sql.Types.SMALLINT = " + java.sql.Types.SMALLINT); -// MySystem.variable("java.sql.Types.FLOAT = " + java.sql.Types.FLOAT); -// MySystem.variable("java.sql.Types.REAL = " + java.sql.Types.REAL); -// MySystem.variable("java.sql.Types.DOUBLE = " + java.sql.Types.DOUBLE); -// MySystem.variable("java.sql.Types.VARCHAR = " + java.sql.Types.VARCHAR); -// MySystem.variable("java.sql.Types.DATE = " + java.sql.Types.DATE); -// MySystem.variable("java.sql.Types.TIME = " + java.sql.Types.TIME); -// MySystem.variable("java.sql.Types.TIMESTAMP = " + java.sql.Types.TIMESTAMP); -// MySystem.variable("java.sql.Types.OTHER = " + java.sql.Types.OTHER); -// MySystem.variable("java.sql.Types.JAVA_OBJECT = " + java.sql.Types.JAVA_OBJECT); -// MySystem.variable("java.sql.Types.DISTINCT = " + java.sql.Types.DISTINCT); -// MySystem.variable("java.sql.Types.STRUCT = " + java.sql.Types.STRUCT); -// MySystem.variable("java.sql.Types.ARRAY = " + java.sql.Types.ARRAY); -// MySystem.variable("java.sql.Types.BLOB = " + java.sql.Types.BLOB); -// MySystem.variable("java.sql.Types.CLOB = " + java.sql.Types.CLOB); -// MySystem.variable("java.sql.Types.REF = " + java.sql.Types.REF); -// } -// /***********************************************************************/ -// public static String getMethodName(String databaseName) -// { -// return getVariableName(databaseName, true); -// } -// /***********************************************************************/ -// public static String getVariableName(String databaseName) -// { -// return getVariableName(databaseName, false); -// } -// /***********************************************************************/ -// public static String getVariableName(String databaseName, boolean capFirstLetter) -// { -// StringBuffer returning = new StringBuffer(databaseName.length()); -// String upper = databaseName.toUpperCase(); -// int place = 0; -// while (place < databaseName.length()) -// { -// char letter = databaseName.charAt(place); -// if (letter == '_') -// { -// returning.append(upper.charAt(++place)); -// } -// else if ((place == 0) && (capFirstLetter)) -// { -// returning.append(upper.charAt(0)); -// } -// else -// { -// returning.append(letter); -// } -// place++; -// } -// return returning.toString(); -// } -// /***********************************************************************/ -// public static String formatNullableObject(Object o) -// { -// return formatNullableObject(o, POSTGRESQL); -// } -// /***********************************************************************/ -// public static String formatNullableObject(Object o, int type) -// { -// if (o == null) -// { -// return "null"; -// } -// else -// { -// if (o instanceof Integer) -// { -// return o.toString(); -// } -// else -// { -// String text = null; -// switch (type) -// { -// case DatabaseUtils.SQLSERVER2005 : -// case SQLSERVER2000 : -// case SQLSERVER : -// text = "'" + toEscapeMSSQL(o.toString()) + "'"; -// break; -// case ACCESS : -// text = "'" + toEscapeACCESS_SQL(o.toString()) + "'"; -// break; -// case ORACLE : -// case POSTGRESQL : -// case SYBASE : -// text = "'" + toEscapeSQL(o.toString()) + "'"; -// break; -// } -// return text; -// } -// } -// } -// /***********************************************************************/ -// public static String toEscapeMSSQL(String unformattedString) -// { -// if (unformattedString.indexOf('\'') == -1) { return unformattedString; } -// StringBuffer b = new StringBuffer(unformattedString); -// for (int i = 0; i < b.length(); i++) -// { -// char c = b.charAt(i); -// switch (c) -// { -// case '\'' : -// b.insert(i, '\''); -// i++; -// break; -// } -// } -// return b.toString(); -// } -// /***********************************************************************/ -// public static String toEscapeACCESS_SQL(String unformattedString) -// { -// if ((unformattedString.indexOf('\'') == -1) && (unformattedString.indexOf('\"') == -1) -// && (unformattedString.indexOf('\\') == -1)) { return unformattedString; } -// StringBuffer b = new StringBuffer(unformattedString); -// for (int i = 0; i < b.length(); i++) -// { -// char c = b.charAt(i); -// switch (c) -// { -// case '\"' : -// case '\\' : -// b.insert(i, '\\'); -// i++; -// break; -// case '\'' : -// b.insert(i, '\''); -// i++; -// break; -// } -// } -// return b.toString(); -// } -// /***********************************************************************/ -// public static String toEscapeSQL(String unformattedString) -// { -// if ((unformattedString == null) -// || ((unformattedString.indexOf('\'') == -1) && (unformattedString.indexOf('\"') == -1) && (unformattedString -// .indexOf('\\') == -1))) { return unformattedString; } -// StringBuffer b = new StringBuffer(unformattedString); -// for (int i = 0; i < b.length(); i++) -// { -// char c = b.charAt(i); -// switch (c) -// { -// case '\"' : -// case '\\' : -// case '\'' : -// b.insert(i, '\\'); -// i++; -// break; -// } -// } -// return b.toString(); -// } -// /***********************************************************************/ -// public static void beginTransaction(Statement stmt) throws SQLException -// { -// beginTransaction(stmt.getConnection(), 1); -// } -// /***********************************************************************/ -// public static void beginTransaction(Connection con) throws SQLException -// { -// beginTransaction(con, 1); -// } -// /***********************************************************************/ -// private static void beginTransaction(Connection con, int offset) throws SQLException -// { -// if (getConnection(connections, con) == null) -// { -// synchronized (connections) -// { -// //My_System.event("Starting transaction " + DatabaseTransactionInfo.getOriginatorText(offset + 1)); -// connections.add(new DatabaseTransactionInfo(con, 1 + offset)); -// } -// con.setAutoCommit(false); -// } -// else -// { -// //My_System.event("already exist"); -// } -// } -// /***********************************************************************/ -// private static DatabaseTransactionInfo getConnection(ArrayList connections2, -// Connection con) -// { -// for (DatabaseTransactionInfo info : connections2) -// { -// if (con.equals(info.getConnection())) { return info; } -// } -// return null; -// } -// /***********************************************************************/ -// public static void commit(Statement stmt) throws SQLException -// { -// commit(stmt.getConnection(), 1); -// } -// /***********************************************************************/ -// public static void commit(Connection con) throws SQLException -// { -// commit(con, 1); -// } -// /***********************************************************************/ -// private static void commit(Connection con, int offset) throws SQLException -// { -// DatabaseTransactionInfo commit = null; -// synchronized (connections) -// { -// Iterator i = connections.iterator(); -// while (i.hasNext()) -// { -// DatabaseTransactionInfo held = (DatabaseTransactionInfo) i.next(); -// if (held.isFinalizeable()) -// { -// i.remove(); -// } -// else if (held.isOriginator(con, 1 + offset)) -// { -// commit = held; -// i.remove(); -// } -// } -// } -// if (commit != null) -// { -// con.commit(); -// commit.cleanConnection(); -// } -// } -// /***********************************************************************/ -// public static void rollback(Statement stmt) throws SQLException -// { -// rollback(stmt.getConnection()); -// } -// /***********************************************************************/ -// public static void rollback(Connection con) throws SQLException -// { -// if (con != null) -// { -// con.rollback(); -// } -// } -// /***********************************************************************/ -// public static String formatBoolean(boolean b) -// { -// return (b) ? "'1'" : "'0'"; // added quotes for postgres -// } -// /***********************************************************************/ -// /** -// * This is for none space single words, such as email, name, handle -// */ -// public static boolean isAcceptableDatabaseString(String string) -// { -// if (string == null) { return true; } -// for (int i = 0; i < string.length(); i++) -// { -// char c = string.charAt(i); -// boolean bad = false; -// bad = (c == ' ') || (c == '\n') || (c == '\t') || (c == '\'') || (c == '"'); -// if (bad) { return false; } -// } -// return true; -// } -// /***********************************************************************/ -// public static String getLike(int databaseType) -// { -// return databaseType == POSTGRESQL ? "ILIKE" : "LIKE"; -// } -// /***********************************************************************/ -// /** -// * A convenience function to turn the int's into readable text for debuging. -// * -// * @param status -// * The status to be translated -// * @return The Text representation of static variable. -// * @see com.spun.utilDatabaseUtils#NEW -// * @see com.spun.utilDatabaseUtils#NEW_MODIFIED -// * @see com.spun.utilDatabaseUtils#OLD -// * @see com.spun.utilDatabaseUtils#OLD_MODIFIED -// */ -// public static final String getDatabaseStatusString(int status) -// { -// String value = "UNKNOWN DATABASE STATUS"; -// switch (status) -// { -// case DatabaseUtils.NEW : -// value = "DatabaseUtils.NEW"; -// break; -// case DatabaseUtils.OLD : -// value = "DatabaseUtils.OLD"; -// break; -// case DatabaseUtils.NEW_MODIFIED : -// value = "DatabaseUtils.NEWMODIFIED"; -// break; -// case DatabaseUtils.OLD_MODIFIED : -// value = "DatabaseUtils.OLDMODIFIED"; -// break; -// } -// return value; -// } -// /***********************************************************************/ -// public static void saveAll(DatabaseObject[] databaseObjects, Statement stmt) throws SQLException -// { -// for (int i = 0; i < databaseObjects.length; i++) -// { -// databaseObjects[i].save(stmt); -// } -// } -// /***********************************************************************/ -// public static void close(ResultSet rs) -// { -// if (rs != null) -// { -// try -// { -// rs.close(); -// } -// catch (SQLException e) -// { -// throw ObjectUtils.throwAsError(e); -// } -// } -// } -// /***********************************************************************/ -// public static void close(Statement stmt) -// { -// if (stmt != null) -// { -// try -// { -// stmt.close(); -// } -// catch (SQLException e) -// { -// throw ObjectUtils.throwAsError(e); -// } -// } -// } -// /***********************************************************************/ -// public static void close(Connection con) -// { -// if (con != null) -// { -// try -// { -// con.close(); -// } -// catch (SQLException e) -// { -// throw ObjectUtils.throwAsError(e); -// } -// } -// } -//} \ No newline at end of file diff --git a/src/main/java/com/spun/util/DateUtils.java b/src/main/java/com/spun/util/DateUtils.java index b66e36c..0bebbdc 100644 --- a/src/main/java/com/spun/util/DateUtils.java +++ b/src/main/java/com/spun/util/DateUtils.java @@ -1,17 +1,15 @@ package com.spun.util; -import static org.mockito.Mockito.times; - import java.sql.Timestamp; import java.text.ParseException; import java.text.SimpleDateFormat; -import java.util.Date; import java.util.Calendar; +import java.util.Date; import java.util.GregorianCalendar; import java.util.TimeZone; /** - * A static class of convence functions for database access + * A static class of convenience functions for database access **/ public class DateUtils { @@ -174,7 +172,7 @@ public static boolean areSame(Date date1, Date date2, long accuracy) /************************************************************************/ /** * - * @return 1 if date1 > date2, 0 if date1 = date2, -1 if date1 < date2 + * @return 1 if date1 > date2, 0 if date1 = date2, -1 if date1 < date2 **/ public static int compareDates(Date date1, Date date2) { diff --git a/src/main/java/com/spun/util/MySystem.java b/src/main/java/com/spun/util/MySystem.java index b35c954..e5e209c 100644 --- a/src/main/java/com/spun/util/MySystem.java +++ b/src/main/java/com/spun/util/MySystem.java @@ -160,8 +160,7 @@ public synchronized static void markerIn() /***********************************************************************/ /** * Prints to screen the marker specifying function entered. - * @param Statement The statement to print - * @param int IN/OUT + * @param statement The statement to print **/ public synchronized static void markerIn(String statement) { @@ -264,7 +263,7 @@ public synchronized static void markerOut(String Statement) /***********************************************************************/ /** * Prints to screen any variable information to be viewed. - * @param Statement The statement to print + * @param sqlQuery The SQL query to print **/ public synchronized static void query(String sqlQuery) { @@ -274,7 +273,8 @@ public synchronized static void query(String sqlQuery) /***********************************************************************/ /** * Prints to screen any variable information to be viewed. - * @param Statement The statement to print + * @param queryName The name of the query + * @param sqlQuery The query to print **/ public synchronized static void query(String queryName, Object sqlQuery) { @@ -284,7 +284,7 @@ public synchronized static void query(String queryName, Object sqlQuery) /***********************************************************************/ /** * Prints to screen any variable information to be viewed. - * @param Statement The statement to print + * @param statement The statement to print **/ public synchronized static void variable(String statement) { @@ -304,7 +304,8 @@ public synchronized static void variable(String statement, PrintWriter out) /***********************************************************************/ /** * Prints to screen any variable information to be viewed. - * @param Statement The statement to print + * @param name The value's name + * @param value The value to print **/ public synchronized static void variable(String name, Object value) { @@ -314,7 +315,8 @@ public synchronized static void variable(String name, Object value) /***********************************************************************/ /** * Prints to screen any variable information to be viewed. - * @param Statement The statement to print + * @param name The name of the array + * @param array The collection of objects to print **/ public synchronized static void variable(String name, Object array[]) { @@ -336,7 +338,7 @@ public synchronized static void variable(String name, Object array[]) /***********************************************************************/ /** * Prints to screen any variable information to be viewed. - * @param Statement The statement to print + * @param array A collection of objects to print **/ public synchronized static void variable(Object array[]) { @@ -364,7 +366,7 @@ public static void event(String Statement) /***********************************************************************/ /** * Prints to screen any warnings to be viewed. - * @param Statement The statement to print + * @param statement The statement to print **/ public synchronized static void warning(String statement) { @@ -373,7 +375,7 @@ public synchronized static void warning(String statement) /***********************************************************************/ /** * Prints to screen any warnings to be viewed. - * @param Statement The statement to print + * @param throwable The throwable to print **/ public synchronized static void warning(Throwable throwable) { @@ -382,7 +384,8 @@ public synchronized static void warning(Throwable throwable) /***********************************************************************/ /** * Prints to screen any warnings to be viewed. - * @param Statement The statement to print + * @param statement The statement to print + * @param throwable A throwable instance with error information **/ public synchronized static void warning(String statement, Throwable throwable) { diff --git a/src/main/java/com/spun/util/database/AutomaticVariableSetter.java b/src/main/java/com/spun/util/database/AutomaticVariableSetter.java deleted file mode 100644 index fe72427..0000000 --- a/src/main/java/com/spun/util/database/AutomaticVariableSetter.java +++ /dev/null @@ -1,18 +0,0 @@ -//package com.spun.util.database; -// -//import java.sql.SQLException; -//import java.sql.Statement; -// -//public interface AutomaticVariableSetter -//{ -// public static final int INSERT = 0; -// public static final int INSERT_COMPLETED = 1; -// public static final int UPDATE = 2; -// public static final int UPDATE_COMPLETED = 3; -// public static final int LOAD = 4; -// public static final String STAGES[] = {"insert", "insertCompleted", "update", "updateCompleted", "load"}; -// /***********************************************************************/ -// public void setFor(DatabaseObject forObject, int atStage, Statement stmt) throws SQLException; -// /***********************************************************************/ -// /***********************************************************************/ -//} \ No newline at end of file diff --git a/src/main/java/com/spun/util/database/CircularRedundancyError.java b/src/main/java/com/spun/util/database/CircularRedundancyError.java deleted file mode 100644 index 3c0f712..0000000 --- a/src/main/java/com/spun/util/database/CircularRedundancyError.java +++ /dev/null @@ -1,36 +0,0 @@ -//package com.spun.util.database; -// -//import com.spun.util.ObjectUtils; -// -//public class CircularRedundancyError extends Error -//{ -// private DatabaseObject source; -// private String causedBy; -// private String xmlState; -// public CircularRedundancyError(DatabaseObject source, String causedBy, String xmlState) -// { -// this.source = source; -// this.causedBy = causedBy; -// this.xmlState = xmlState; -// } -// public String getMessage() -// { -// return "Circular Redundancy occurred while saving :" + ObjectUtils.getClassName(source) + "\n" -// + "cause by :" + causedBy + "\n" -// + "state : " + xmlState; -// } -// public String getCausedBy() -// { -// return causedBy; -// } -// public DatabaseObject getSource() -// { -// return source; -// } -// public String getXmlState() -// { -// return xmlState; -// } -// -// -//} diff --git a/src/main/java/com/spun/util/database/ColumnMetadata.java b/src/main/java/com/spun/util/database/ColumnMetadata.java deleted file mode 100644 index 1a855bd..0000000 --- a/src/main/java/com/spun/util/database/ColumnMetadata.java +++ /dev/null @@ -1,146 +0,0 @@ -//package com.spun.util.database; -// -//import com.spun.util.DatabaseUtils; -// -//public class ColumnMetadata -//{ -// private Metadata tableMetadata; -// private String name; -// private Class type; -// private int length; -// private boolean nullable; -// private int sqlType; -// private int decimalDigits; -// private String comments; -// private int columnPosition; -// private String foreignTable; -// private ColumnMetadata foreignColumn; -// /**************************************************************************/ -// public ColumnMetadata(Metadata tableMetadata, String name, Class type, int length, int columnPosition, boolean nullable, int sqlType, -// int decimalDigits, String comments) -// { -// this(tableMetadata, name, type, length, columnPosition, nullable, sqlType, decimalDigits, comments, null, null); -// } -// /**************************************************************************/ -// public ColumnMetadata(Metadata tableMetadata, String name, Class type, int length, int columnPosition, boolean nullable, int sqlType, -// int decimalDigits, String comments, String foreignTable, ColumnMetadata foreignColumn) -// { -// this.columnPosition = columnPosition; -// this.tableMetadata = tableMetadata; -// this.name = name; -// this.type = type; -// this.length = length; -// this.nullable = nullable; -// this.sqlType = sqlType; -// this.decimalDigits = decimalDigits; -// this.comments = comments; -// this.foreignTable = foreignTable; -// this.foreignColumn = foreignColumn; -// } -// /***********************************************************************/ -// public int getLength() -// { -// return length; -// } -// /***********************************************************************/ -// public int getSqlType() -// { -// return sqlType; -// } -// /***********************************************************************/ -// public String getSqlTypeName() -// { -// String name = DatabaseUtils.findDatabaseName(sqlType); -// if (name == null) -// name = "unknown: " + getType(); -// else if (name == "decimal" || name.startsWith("numeric")) -// { -// name += "(" + length + ", " + decimalDigits + ")"; -// } -// else if (name == "varchar" || name == "char") -// { -// name += "(" + length + ")"; -// } -// return name; -// } -// /***********************************************************************/ -// public int getColumnPosition() -// { -// return columnPosition; -// } -// /***********************************************************************/ -// public String getName() -// { -// return name; -// } -// /***********************************************************************/ -// public boolean isNullable() -// { -// return nullable; -// } -// /***********************************************************************/ -// public Class getType() -// { -// return type; -// } -// /***********************************************************************/ -// public int getDecimalDigits() -// { -// return decimalDigits; -// } -// /***********************************************************************/ -// public String getComments() -// { -// return comments; -// } -// /***********************************************************************/ -// public String getForeignTable() -// { -// return foreignTable; -// } -// /***********************************************************************/ -// public ColumnMetadata getForeignColumn() -// { -// return foreignColumn; -// } -// /***********************************************************************/ -// public String getNameWithPrefix(String alias) -// { -// return alias + "." + getName(); -// } -// /***********************************************************************/ -// public String getSequenceName(int databaseType) -// { -// if (databaseType == DatabaseUtils.POSTGRESQL) { return String.format("%s_%s_seq", tableMetadata.getTableName(), this.getName()); } -// return null; -// } -// /************************************************************************/ -// /** -// * A convenience function to turn a vector of com.spun.util.database.ColumnMetadata objects -// * into an Array of the com.spun.util.database.ColumnMetadata objects. -// * @param vectorOf a Vector of com.spun.util.database.ColumnMetadata objects -// * @return the array of com.spun.util.database.ColumnMetadata. -// * @throws Error if an element of vectorOf is not a com.spun.util.database.ColumnMetadata object. -// **/ -// public static com.spun.util.database.ColumnMetadata[] toArray(java.util.Collection vectorOf) -// { -// if (vectorOf == null) { return new com.spun.util.database.ColumnMetadata[0]; } -// com.spun.util.database.ColumnMetadata array[] = new com.spun.util.database.ColumnMetadata[vectorOf.size()]; -// java.util.Iterator iterator = vectorOf.iterator(); -// int i = 0; -// while (iterator.hasNext()) -// { -// java.lang.Object rowObject = iterator.next(); -// if (rowObject instanceof com.spun.util.database.ColumnMetadata) -// { -// array[i++] = (com.spun.util.database.ColumnMetadata) rowObject; -// } -// else -// { -// throw new Error("toArray[" + i + "] is not an instance of com.spun.util.database.ColumnMetadata but a " + rowObject.getClass().getName()); -// } -// } -// return array; -// } -// /***********************************************************************/ -//} \ No newline at end of file diff --git a/src/main/java/com/spun/util/database/DatabaseCache.java b/src/main/java/com/spun/util/database/DatabaseCache.java deleted file mode 100644 index 7c30f76..0000000 --- a/src/main/java/com/spun/util/database/DatabaseCache.java +++ /dev/null @@ -1,40 +0,0 @@ -//package com.spun.util.database; -// -//import java.sql.SQLException; -//import java.sql.Statement; -// -//public interface DatabaseCache -//{ -// /**************************************************************************/ -// /** -// * The type of object this cache holds. Caches should only hold 1 type of -// * DatabaseObject -// **/ -// public Class getObjectType(); -// -// /**************************************************************************/ -// /** -// * The default LinkBack setting -// **/ -// public boolean isLinkBackOn(); -// -// /**************************************************************************/ -// /** -// * loads the cache from the database -// **/ -// public void load(Statement stmt) throws SQLException; -// -// /**************************************************************************/ -// /** -// * clears the cache and reloads it from the database -// **/ -// public void reset(Statement stmt) throws SQLException; -// -// /**************************************************************************/ -// /** -// * @return the object from the cache with the corresponding pkey -// **/ -// public T get(int pkey); -// /**************************************************************************/ -// /**************************************************************************/ -//} \ No newline at end of file diff --git a/src/main/java/com/spun/util/database/DatabaseLifeCycleUtils.java b/src/main/java/com/spun/util/database/DatabaseLifeCycleUtils.java deleted file mode 100644 index 6e21611..0000000 --- a/src/main/java/com/spun/util/database/DatabaseLifeCycleUtils.java +++ /dev/null @@ -1,298 +0,0 @@ -//package com.spun.util.database; -// -//import java.io.BufferedReader; -//import java.io.BufferedWriter; -//import java.io.File; -//import java.io.IOException; -//import java.io.InputStream; -//import java.io.InputStreamReader; -//import java.io.OutputStreamWriter; -//import java.sql.SQLException; -//import java.sql.Statement; -// -//import com.spun.util.DatabaseConfiguration; -//import com.spun.util.DatabaseUtils; -//import com.spun.util.MySystem; -// -//public class DatabaseLifeCycleUtils -//{ -// /***********************************************************************/ -// public static void backupDatabase(Statement stmt, String databaseName, DatabaseConfiguration config, -// String fileName) throws Exception -// { -// switch (config.type) -// { -// case DatabaseUtils.SQLSERVER2005 : -// case DatabaseUtils.SQLSERVER2000 : -// case DatabaseUtils.SQLSERVER : -// backupSQLServer(stmt, databaseName, fileName); -// break; -// case DatabaseUtils.POSTGRESQL : -// backupPostgreSQL(databaseName, config, fileName); -// break; -// case DatabaseUtils.MY_SQL : -// backupMySQL(databaseName, fileName); -// break; -// default : -// throw new Error("Unhandled database type: " + DatabaseUtils.getDatabaseType(config.type)); -// } -// } -// /***********************************************************************/ -// private static void backupMySQL(String databaseName, String fileName) throws Exception -// { -// File file = new File(fileName); -// if (!file.getParentFile().exists()) -// { -// file.getParentFile().createNewFile(); -// } -// String commandLine = "mysqldump -r " + fileName + " " + databaseName; -// Process process = Runtime.getRuntime().exec(commandLine); -// process.waitFor(); -// if (process.exitValue() != 0) { throw new Error(extractError(commandLine, process.getErrorStream())); } -// } -// /***********************************************************************/ -// private static void backupPostgreSQL(String databaseName, DatabaseConfiguration config, String fileName) -// throws Exception -// { -// String commandLine = null; -// try -// { -// File file = new File(fileName); -// if (!file.getParentFile().exists()) -// { -// file.getParentFile().createNewFile(); -// } -// if (System.getProperty("os.name").indexOf("Windows") >= 0) -// { -// commandLine = "pg_dump --clean --username=" + config.getUserName() + " --file=\"" -// + file.getCanonicalPath() + "\" " + databaseName; -// } -// else -// { -// commandLine = "pg_dump --clean --file=" + file.getCanonicalPath() + " " + databaseName; -// } -// Process process = Runtime.getRuntime().exec(commandLine); -// // check for a password prompt -// if (getPasswordPrompt(process)) -// { -// // send the password -// sendPassword(process, config.getPassword()); -// } -// process.waitFor(); -// if (process.exitValue() != 0) { throw new Error(extractError(commandLine, process.getErrorStream())); } -// } -// catch (IOException e) -// { -// MySystem.variable("CommandLine", commandLine); -// throw e; -// } -// } -// private static boolean getPasswordPrompt(Process process) throws Exception -// { -// InputStream error = process.getErrorStream(); -// InputStream in = process.getInputStream(); -// int TIMEOUT = 3; -// long timeOut = System.currentTimeMillis() + (TIMEOUT * 1000); -// StringBuffer prompt = new StringBuffer(); -// while (System.currentTimeMillis() < timeOut) -// { -// if (in.available() == 0 && error.available() == 0) -// { -// Thread.sleep(500); -// } -// else -// { -// if (in.available() != 0) -// { -// prompt.append((char) in.read()); -// } -// if (error.available() != 0) -// { -// prompt.append((char) error.read()); -// } -// timeOut = System.currentTimeMillis() + (TIMEOUT * 1000); -// } -// } -// MySystem.variable("prompt", prompt.toString()); -// return prompt.toString().startsWith("Password"); -// } -// private static void sendPassword(Process process, String password) throws Exception -// { -// BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(process.getOutputStream())); -// writer.write(password); -// writer.newLine(); -// writer.flush(); -// writer.close(); -// } -// /***********************************************************************/ -// private static void backupSQLServer(Statement stmt, String databaseName, String fileName) throws SQLException -// { -// String sql = "BACKUP DATABASE " + databaseName + " TO DISK = '" + fileName + "'"; -// MySystem.query("BACKUP", sql); -// stmt.execute(sql); -// } -// /***********************************************************************/ -// public static void restoreDatabase(Statement stmt, String databaseName, DatabaseConfiguration config, -// String fileName) throws Exception -// { -// switch (config.type) -// { -// case DatabaseUtils.SQLSERVER2005 : -// case DatabaseUtils.SQLSERVER2000 : -// case DatabaseUtils.SQLSERVER : -// restoreSQLServer(stmt, databaseName, fileName); -// break; -// case DatabaseUtils.POSTGRESQL : -// restorePostgreSQL(databaseName, config, fileName); -// break; -// case DatabaseUtils.MY_SQL : -// restoreMySQL(stmt, databaseName, fileName); -// break; -// default : -// throw new Error("Unhandled database type: " + DatabaseUtils.getDatabaseType(config.type)); -// } -// } -// /***********************************************************************/ -// private static void restoreMySQL(Statement stmt, String databaseName, String fileName) throws SQLException -// { -// String restoreCommand = "LOAD DATA INFILE '" + fileName + "' REPLACE ..."; -// MySystem.query(restoreCommand); -// stmt.execute(restoreCommand); -// } -// /***********************************************************************/ -// private static void restorePostgreSQL(String databaseName, DatabaseConfiguration config, String fileName) -// throws Error, Exception -// { -// String commandLine; -// if (System.getProperty("os.name").indexOf("Windows") >= 0) -// { -// commandLine = "psql -f " + fileName + " -U " + config.userName + " " + databaseName; -// } -// else -// { -// commandLine = "psql -f " + fileName + " " + databaseName; -// } -// MySystem.event("RUNNING : " + commandLine); -// Process process = Runtime.getRuntime().exec(commandLine); -// if (getPasswordPrompt(process)) -// { -// sendPassword(process, config.getPassword()); -// } -// Thread.sleep(2000); -// String string = null; -// BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); -// if (reader.ready()) -// { -// while ((string = reader.readLine()) != null) -// { -// MySystem.variable(string); -// } -// } -// reader.close(); -// reader = new BufferedReader(new InputStreamReader(process.getErrorStream())); -// if (reader.ready()) -// { -// while ((string = reader.readLine()) != null) -// { -// MySystem.variable(string); -// } -// } -// process.waitFor(); -// reader.close(); -// if (process.exitValue() != 0) { throw new Error(extractError(commandLine, process.getErrorStream())); } -// } -// /***********************************************************************/ -// private static void restoreSQLServer(Statement stmt, String databaseName, String fileName) throws SQLException -// { -// stmt.execute("USE master"); -// String restoreCommand = "RESTORE DATABASE " + databaseName + " FROM DISK = '" + fileName + "'"; -// MySystem.query(restoreCommand); -// stmt.execute(restoreCommand); -// stmt.execute("USE " + databaseName); -// } -// /***********************************************************************/ -// private static String extractError(String commandLine, InputStream error) throws Exception -// { -// /* -// Process whoami = Runtime.getRuntime().exec("whoami"); -// whoami.waitFor(); -// String userName = extractText(whoami.getInputStream());*/ -// String errorText = extractText(error); -// return "Error Executing '" + commandLine + /*"' AS USER '" + userName + */"'- " + errorText; -// } -// /***********************************************************************/ -// public static String extractText(InputStream inStream) throws IOException -// { -// StringBuffer errorBuffer = new StringBuffer(); -// BufferedReader in = new BufferedReader(new InputStreamReader(inStream)); -// while (in.ready()) -// { -// errorBuffer.append(in.readLine()); -// } -// return errorBuffer.toString(); -// } -// /***********************************************************************/ -// public static void deleteTable(String tableName, int databaseType, Statement stmt) throws SQLException -// { -// switch (databaseType) -// { -// case DatabaseUtils.SQLSERVER2005 : -// case DatabaseUtils.SQLSERVER2000 : -// case DatabaseUtils.SQLSERVER : -// deleteSQLServerTable(tableName, stmt); -// break; -// case DatabaseUtils.POSTGRESQL : -// deletePostgreSQLTable(tableName, stmt); -// break; -// case DatabaseUtils.MY_SQL : -// deleteMySqlTable(tableName, stmt); -// break; -// default : -// throw new Error("Unhandled database type: " + DatabaseUtils.getDatabaseType(databaseType)); -// } -// } -// /***********************************************************************/ -// private static void deleteMySqlTable(String tableName, Statement stmt) throws SQLException -// { -// stmt.executeUpdate("TRUNCATE " + tableName); -// } -// /***********************************************************************/ -// private static void deletePostgreSQLTable(String tableName, Statement stmt) throws SQLException -// { -// stmt.executeUpdate("DELETE FROM " + tableName); -// stmt.executeQuery("select setval('" + tableName + "_pkey_seq',1)"); -// } -// /***********************************************************************/ -// public static void resetTableIndex(String tableName, int databaseType, Statement stmt) throws SQLException -// { -// switch (databaseType) -// { -// case DatabaseUtils.SQLSERVER2005 : -// case DatabaseUtils.SQLSERVER2000 : -// case DatabaseUtils.SQLSERVER : -// break; -// case DatabaseUtils.POSTGRESQL : -// resetPostgreIndex(tableName, stmt); -// break; -// case DatabaseUtils.MY_SQL : -// break; -// default : -// throw new Error("Unhandled database type: " + DatabaseUtils.getDatabaseType(databaseType)); -// } -// } -// /***********************************************************************/ -// private static void resetPostgreIndex(String tableName, Statement stmt) throws SQLException -// { -// String sql = "select setval('" + tableName + "_pkey_seq',(select max(pkey) + 1 from " + tableName + "))"; -// MySystem.query("reset index", sql); -// stmt.executeQuery(sql); -// } -// /***********************************************************************/ -// private static void deleteSQLServerTable(String tableName, Statement stmt) throws SQLException -// { -// stmt.executeUpdate("DELETE FROM " + tableName); -// stmt.executeUpdate("DBCC CHECKIDENT('" + tableName + "', RESEED, 1)"); -// } -// /***********************************************************************/ -// /***********************************************************************/ -//} \ No newline at end of file diff --git a/src/main/java/com/spun/util/database/DatabaseLoader.java b/src/main/java/com/spun/util/database/DatabaseLoader.java deleted file mode 100644 index 23475ec..0000000 --- a/src/main/java/com/spun/util/database/DatabaseLoader.java +++ /dev/null @@ -1,38 +0,0 @@ -//package com.spun.util.database; -// -//import java.sql.Statement; -//import java.sql.SQLException; -// -//public final class DatabaseLoader -// implements DatabaseCache -//{ -// private static final String ERROR_TEXT = "DatabaseLoad is a Marker to Load from the Database"; -// public static DatabaseCache INSTANCE = new DatabaseLoader(); -// -// /**************************************************************************/ -// private DatabaseLoader() {} -// /**************************************************************************/ -// public static boolean isDatabaseLoader(DatabaseCache cache) -// { -// return (cache instanceof DatabaseLoader); -// } -// /**************************************************************************/ -// public static boolean isNormalCache(DatabaseCache cache) -// { -// return !((cache == null) || (cache instanceof DatabaseLoader)); -// } -// /**************************************************************************/ -// public boolean equals(Object object) -// { -// return (object instanceof DatabaseLoader); -// } -// /**************************************************************************/ -// /* UNSUPPORTED METHODS */ -// /**************************************************************************/ -// public Class getObjectType() {throw new UnsupportedOperationException(ERROR_TEXT);} -// public boolean isLinkBackOn() {throw new UnsupportedOperationException(ERROR_TEXT);} -// public void load(Statement stmt) throws SQLException {throw new UnsupportedOperationException(ERROR_TEXT);} -// public void reset(Statement stmt) throws SQLException {throw new UnsupportedOperationException(ERROR_TEXT);} -// public DatabaseObject get(int pkey) {throw new UnsupportedOperationException(ERROR_TEXT);} -// /**************************************************************************/ -//} \ No newline at end of file diff --git a/src/main/java/com/spun/util/database/DatabaseLoadingTracker.java b/src/main/java/com/spun/util/database/DatabaseLoadingTracker.java deleted file mode 100644 index 2be6527..0000000 --- a/src/main/java/com/spun/util/database/DatabaseLoadingTracker.java +++ /dev/null @@ -1,40 +0,0 @@ -//package com.spun.util.database; -// -//import java.util.HashMap; -// -//public class DatabaseLoadingTracker -//{ -// private HashMap loaded = null; -// /**************************************************************************/ -// public DatabaseLoadingTracker() -// { -// loaded = new HashMap(); -// } -// /**************************************************************************/ -// private String getHashKey(DatabaseObject object) -// { -// return object.getClass().getName() + object.getPkey(); -// } -// /**************************************************************************/ -// /** -// * loads the chache from the database -// **/ -// public DatabaseObject load(DatabaseObject newObject) -// { -// if (newObject == null) {return null;} -// String hashKey = getHashKey(newObject); -// DatabaseObject oldObject = (DatabaseObject)loaded.get(hashKey); -// if (oldObject == null) -// { -// oldObject = newObject; -// loaded.put(hashKey, newObject); -// } -// else -// { -// //My_System.event("found duplicate of " + hashKey); -// } -// return oldObject; -// } -// /**************************************************************************/ -// /**************************************************************************/ -//} \ No newline at end of file diff --git a/src/main/java/com/spun/util/database/DatabaseObject.java b/src/main/java/com/spun/util/database/DatabaseObject.java deleted file mode 100644 index 430fb9d..0000000 --- a/src/main/java/com/spun/util/database/DatabaseObject.java +++ /dev/null @@ -1,104 +0,0 @@ -//package com.spun.util.database; -// -//import java.sql.SQLException; -//import java.sql.Statement; -//import java.util.Collection; -// -//import com.spun.util.filters.Filter; -// -//public interface DatabaseObject -//{ -// public static DatabaseObject Null = new NullDatabaseObject(); -// /***********************************************************************/ -// public boolean isNew(); -// public void setNew(boolean b); -// /***********************************************************************/ -// public int getPkey(); -// /***********************************************************************/ -// public boolean setPkey(int i); -// /***********************************************************************/ -// public Metadata getMetadata(); -// /***********************************************************************/ -// public boolean save(Statement stmt) throws java.sql.SQLException; -// /***********************************************************************/ -// public boolean deleteFromDatabase(java.sql.Statement stmt) throws java.sql.SQLException; -// /***********************************************************************/ -// /** Inner Classes **/ -// /***********************************************************************/ -// public static class FilterNew implements com.spun.util.filters.Filter -// { -// public static Filter INSTANCE = new FilterNew(); -// public boolean isExtracted(Object object) throws IllegalArgumentException -// { -// if (!(object instanceof DatabaseObject)) { throw new IllegalArgumentException( -// "Expected Object of Type DatabaseObject but got " + object.getClass().getName()); } -// DatabaseObject o = (DatabaseObject) object; -// return o.isNew(); -// } -// } -// /**************************************************************************/ -// public static class Utils -// { -// public static void saveAll(DatabaseObject[] objects, Statement stmt) throws SQLException -// { -// java.util.HashSet set = new java.util.HashSet(); -// for (int i = 0; i < objects.length; i++) -// { -// DatabaseRelationshipPersistent object = (DatabaseRelationshipPersistent) objects[i]; -// object.save(stmt, set, false); -// } -// } -// /***********************************************************************/ -// public static T get(int pkey, T[] from) -// { -// if (from == null) { return null; } -// for (int i = 0; i < from.length; i++) -// { -// if (pkey == from[i].getPkey()) { return from[i]; } -// } -// return null; -// } -// /**************************************************************************/ -// public static T get(int pkey, Collection from) -// { -// for (T object : from) -// { -// if (pkey == object.getPkey()) { return object; } -// } -// return null; -// } -// /**************************************************************************/ -// /** -// * A convenience function to turn a vector of com.spun.util.database.DatabaseObject objects -// * into an Array of the com.spun.util.database.DatabaseObject objects. -// * @param vectorOf a Vector of com.spun.util.database.DatabaseObject objects -// * @return the array of com.spun.util.database.DatabaseObject. -// * @throws Error if an element of vectorOf is not a com.spun.util.database.DatabaseObject object. -// **/ -// public static com.spun.util.database.DatabaseObject[] toArray(java.util.Collection vectorOf) -// { -// if (vectorOf == null) { return new com.spun.util.database.DatabaseObject[0]; } -// com.spun.util.database.DatabaseObject array[] = new com.spun.util.database.DatabaseObject[vectorOf.size()]; -// java.util.Iterator iterator = vectorOf.iterator(); -// int i = 0; -// while (iterator.hasNext()) -// { -// java.lang.Object rowObject = iterator.next(); -// if (rowObject instanceof com.spun.util.database.DatabaseObject) -// { -// array[i++] = (com.spun.util.database.DatabaseObject) rowObject; -// } -// else -// { -// throw new Error("toArray[" + i + "] is not an instance of com.spun.util.database.DatabaseObject but a " -// + rowObject.getClass().getName()); -// } -// } -// return array; -// } -// /************************************************************************/ -// /************************************************************************/ -// } -// /***********************************************************************/ -// /***********************************************************************/ -//} \ No newline at end of file diff --git a/src/main/java/com/spun/util/database/DatabaseRelationshipPersistent.java b/src/main/java/com/spun/util/database/DatabaseRelationshipPersistent.java deleted file mode 100644 index a0d2376..0000000 --- a/src/main/java/com/spun/util/database/DatabaseRelationshipPersistent.java +++ /dev/null @@ -1,9 +0,0 @@ -//package com.spun.util.database; -// -//import java.sql.Statement; -// -//public interface DatabaseRelationshipPersistent -//{ -// public boolean save(Statement stmt, java.util.HashSet set, boolean shallowOnly) -// throws java.sql.SQLException; -//} diff --git a/src/main/java/com/spun/util/database/DatabaseTransactionInfo.java b/src/main/java/com/spun/util/database/DatabaseTransactionInfo.java deleted file mode 100644 index fe1c2a4..0000000 --- a/src/main/java/com/spun/util/database/DatabaseTransactionInfo.java +++ /dev/null @@ -1,57 +0,0 @@ -//package com.spun.util.database; -// -//import java.lang.ref.WeakReference; -//import java.sql.Connection; -//import java.sql.SQLException; -// -//public class DatabaseTransactionInfo -//{ -// private WeakReference connectionReference; -// private String originator; -// private boolean automaticCommit; -// /**************************************************************************/ -// /** -// * @return the object from the cache with the corresponding pkey -// **/ -// public DatabaseTransactionInfo(Connection con, int levelsOfRemoval) throws SQLException -// { -// this.automaticCommit = con.getAutoCommit(); -// this.connectionReference = new WeakReference(con); -// this.originator = getOriginatorText(levelsOfRemoval + 1); -// //My_System.variable("getOriginatorText for creation", originator + con.toString()); -// } -// /***********************************************************************/ -// public static String getOriginatorText(int offset) -// { -// StackTraceElement trace[] = new Error().getStackTrace(); -// offset = offset + 1; -// StackTraceElement element = trace[offset]; -// int size = trace.length - offset; -// String text = "[" + size + "]" + element.getClassName() + "." + element.getMethodName(); -// return text; -// } -// /**************************************************************************/ -// public boolean isFinalizeable() -// { -// return getConnection() == null; -// } -// /**************************************************************************/ -// public boolean isOriginator(Connection con, int levelsOfRemoval) -// { -// String originatorText = getOriginatorText(levelsOfRemoval + 1); -// return con.equals(getConnection()) && this.originator.equals(originatorText); -// } -// /***********************************************************************/ -// public Connection getConnection() -// { -// return this.connectionReference.get(); -// } -// /***********************************************************************/ -// public void cleanConnection() throws SQLException -// { -// Connection con = getConnection(); -// con.setAutoCommit(automaticCommit); -// } -// /**************************************************************************/ -// /**************************************************************************/ -//} \ No newline at end of file diff --git a/src/main/java/com/spun/util/database/Metadata.java b/src/main/java/com/spun/util/database/Metadata.java deleted file mode 100644 index a7fc7ee..0000000 --- a/src/main/java/com/spun/util/database/Metadata.java +++ /dev/null @@ -1,18 +0,0 @@ -//package com.spun.util.database; -// -// -//public interface Metadata -//{ -// -// /************************************************************************/ -// public ColumnMetadata getColumnByName(String columnName); -// /************************************************************************/ -// public String getTableName(); -// /************************************************************************/ -// public ColumnMetadata[] getColumns(); -// /************************************************************************/ -// public String[] getColumnNames(); -// /************************************************************************/ -// /***********************************************************************/ -// -//} diff --git a/src/main/java/com/spun/util/database/NullDatabaseObject.java b/src/main/java/com/spun/util/database/NullDatabaseObject.java deleted file mode 100644 index b113322..0000000 --- a/src/main/java/com/spun/util/database/NullDatabaseObject.java +++ /dev/null @@ -1,42 +0,0 @@ -//package com.spun.util.database; -// -//import java.sql.SQLException; -//import java.sql.Statement; -// -//public class NullDatabaseObject implements DatabaseObject -//{ -// @Override -// public boolean isNew() -// { -// return false; -// } -// @Override -// public void setNew(boolean b) -// { -// } -// @Override -// public int getPkey() -// { -// return 0; -// } -// @Override -// public boolean setPkey(int i) -// { -// return false; -// } -// @Override -// public Metadata getMetadata() -// { -// return null; -// } -// @Override -// public boolean save(Statement stmt) throws SQLException -// { -// return false; -// } -// @Override -// public boolean deleteFromDatabase(Statement stmt) throws SQLException -// { -// return false; -// } -//} diff --git a/src/main/java/com/spun/util/database/SshDatabaseWrapper.java b/src/main/java/com/spun/util/database/SshDatabaseWrapper.java deleted file mode 100644 index 04b8a4a..0000000 --- a/src/main/java/com/spun/util/database/SshDatabaseWrapper.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.spun.util.database; - -import java.io.IOException; -import java.sql.Connection; -import org.apache.commons.logging.LogFactory; -import com.spun.util.DatabaseConfiguration; -import com.spun.util.DatabaseConfigurationWrapper; -import com.spun.util.ObjectUtils; -import com.sshtools.j2ssh.SshClient; -import com.sshtools.j2ssh.authentication.PasswordAuthenticationClient; -import com.sshtools.j2ssh.forwarding.ForwardingClient; -import com.sshtools.j2ssh.transport.IgnoreHostKeyVerification; - -/***********************************************************************/ -public class SshDatabaseWrapper implements DatabaseConfigurationWrapper -{ - - public static String SSH = "Ssh"; - private static int counter = 32001; - /***********************************************************************/ - static - { - DatabaseConfiguration.registerWrapper(SSH, new SshDatabaseWrapper()); - } - /***********************************************************************/ - public synchronized Connection makeConnection(String database, DatabaseConfiguration originalConfiguration) - { - int port = counter++; - DatabaseConfiguration config = new DatabaseConfiguration(originalConfiguration.getDataSourceName(), originalConfiguration.getDriver(), originalConfiguration.getProtocol(), "localhost", "" + port, database, originalConfiguration.getUserName(), originalConfiguration.getPassword(), originalConfiguration.getType()); - try - { - LogFactory.getFactory().setAttribute("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.NoOpLog"); - SshClient ssh = new SshClient(); - ssh.setSocketTimeout(60000); - ssh.connect(originalConfiguration.getServer(), new IgnoreHostKeyVerification()); - PasswordAuthenticationClient pwd = new PasswordAuthenticationClient(); - pwd.setUsername(originalConfiguration.getUserName()); - pwd.setPassword(originalConfiguration.getPassword()); - ssh.authenticate(pwd); - ForwardingClient client = ssh.getForwardingClient(); - client.addLocalForwarding(config.getProtocol(), "0.0.0.0", config.getPort(), "localhost", originalConfiguration.getPort()); - client.startLocalForwarding(config.getProtocol()); - return new SshConnection(ssh, config.makeConnection()); - } - catch (IOException ie) - { - throw ObjectUtils.throwAsError(ie); - } - } - /***********************************************************************/ - /***********************************************************************/ - -} diff --git a/src/main/java/com/spun/util/database/Syncable.java b/src/main/java/com/spun/util/database/Syncable.java deleted file mode 100644 index 0be82ad..0000000 --- a/src/main/java/com/spun/util/database/Syncable.java +++ /dev/null @@ -1,6 +0,0 @@ -//package com.spun.util.database; -// -//public interface Syncable -//{ -// public void sync(DatabaseCache cache); -//} diff --git a/src/main/java/com/spun/util/io/FileUtils.java b/src/main/java/com/spun/util/io/FileUtils.java index a1e2008..57144e4 100644 --- a/src/main/java/com/spun/util/io/FileUtils.java +++ b/src/main/java/com/spun/util/io/FileUtils.java @@ -28,17 +28,6 @@ **/ public class FileUtils { -// /***********************************************************************/ -// /** -// * @see java.io.File.createTempFile(String,String) -// **/ -// public static File createTempDirectory() throws IOException -// { -// File tempFile = File.createTempFile("TEMP", null); -// tempFile.delete(); -// tempFile.mkdirs(); -// return tempFile; -// } /***********************************************************************/ public static void deleteDirectory(File directory) throws IOException { From 805486da2f66a25cf129322d2fa65f5ff5b9fc59 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Thu, 5 Mar 2015 15:21:25 -0800 Subject: [PATCH 013/111] Double check pom --- .gitignore | 2 ++ pom.xml | 54 ++++++++++++++++++++++++------------------------------ 2 files changed, 26 insertions(+), 30 deletions(-) diff --git a/.gitignore b/.gitignore index 0b3e10e..345472d 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,5 @@ *.war *.ear /target/ + +settings.xml diff --git a/pom.xml b/pom.xml index 70a1edc..12759ec 100644 --- a/pom.xml +++ b/pom.xml @@ -1,55 +1,38 @@ 4.0.0 - - - org.sonatype.oss - oss-parent - 9 - - org.teachingkidsprogramming TeachingKidsProgramming 0.0.1-SNAPSHOT jar - - TeachingKidsProgramming - This is the Source Code for Tortoise and many other utils that are used for the TKP Java Library. - https://github.com/TeachingKidsProgramming/TeachingKidsProgramming.Source.Java - - - - scm:git:git@github.com:TeachingKidsProgramming/TeachingKidsProgramming.Source.Java.git - scm:git:git@github.com:TeachingKidsProgramming/TeachingKidsProgramming.Source.Java.git - https://github.com/TeachingKidsProgramming/TeachingKidsProgramming.Source.Java.git - - + ${project.groupId}:${project.artifactId} + A proven library of high-quality programming courseware for kids. TKP is a designated project of the US non-profit (501c3) the MONA Foundation. The mission of the MONA Foundation is to "support grassroots educational initiatives that educate everyone—including girls." + http://teachingkidsprogramming.org/ The Apache License, Version 2.0 http://www.apache.org/licenses/LICENSE-2.0.txt - - - Bhagat Singh - bhagat.rawat@gmail.com - Jim Counts - jcounts18@gmail.com + jamesrcounts@outlook.com Teaching Kids Programming - http://teachingkidsprogramming.com/ + http://teachingkidsprogramming.org/ Lynn Langit lynn@teachingkidsprogramming.org Teaching Kids Programming - http://teachingkidsprogramming.com/ + http://teachingkidsprogramming.org/ - - + + + scm:git:git@github.com:TeachingKidsProgramming/TeachingKidsProgramming.Source.Java.git + scm:git:git@github.com:TeachingKidsProgramming/TeachingKidsProgramming.Source.Java.git + git@github.com:TeachingKidsProgramming/TeachingKidsProgramming.Source.Java.git + junit @@ -125,14 +108,25 @@ ISO-8859-1 + + org.apache.maven.plugins + maven-repository-plugin + 2.4 + - http://teachingkidsprogramming.com/ + http://teachingkidsprogramming.org/ Teaching Kids Programming ISO-8859-1 + + + sonatype + https://oss.sonatype.org/content/repositories/snapshots + + \ No newline at end of file From ce90e4dadd7aa58a6458830d9d3485a090580132 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Sun, 8 Mar 2015 21:52:14 -0700 Subject: [PATCH 014/111] Deployed first release --- pom.xml | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/pom.xml b/pom.xml index 12759ec..374f147 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 org.teachingkidsprogramming TeachingKidsProgramming - 0.0.1-SNAPSHOT + 0.0.1 jar ${project.groupId}:${project.artifactId} A proven library of high-quality programming courseware for kids. TKP is a designated project of the US non-profit (501c3) the MONA Foundation. The mission of the MONA Foundation is to "support grassroots educational initiatives that educate everyone—including girls." @@ -27,7 +27,7 @@ Teaching Kids Programming http://teachingkidsprogramming.org/ - + scm:git:git@github.com:TeachingKidsProgramming/TeachingKidsProgramming.Source.Java.git scm:git:git@github.com:TeachingKidsProgramming/TeachingKidsProgramming.Source.Java.git @@ -113,6 +113,20 @@ maven-repository-plugin 2.4 + + org.apache.maven.plugins + maven-gpg-plugin + 1.6 + + + sign-artifacts + verify + + sign + + + + @@ -124,9 +138,10 @@ ISO-8859-1 - - sonatype - https://oss.sonatype.org/content/repositories/snapshots - - + + sonatype + + https://oss.sonatype.org/service/local/staging/deploy/maven2 + + \ No newline at end of file From 4c0d270f2820ef9b9c69516942461dfc68449082 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Thu, 12 Mar 2015 09:39:07 -0700 Subject: [PATCH 015/111] Version bump --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 374f147..0d5dcf4 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 org.teachingkidsprogramming TeachingKidsProgramming - 0.0.1 + 0.0.2-SNAPSHOT jar ${project.groupId}:${project.artifactId} A proven library of high-quality programming courseware for kids. TKP is a designated project of the US non-profit (501c3) the MONA Foundation. The mission of the MONA Foundation is to "support grassroots educational initiatives that educate everyone—including girls." From 09fe0f65aa9cdc1628de18cf493d2c2afbd7dcbc Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Fri, 13 Mar 2015 12:33:02 -0700 Subject: [PATCH 016/111] ant script --- build.xml | 133 ++++++++++++++++++ .../teaching_kids_programming.properties | 9 ++ build/properties/tkplauncher.properties | 9 ++ .../teaching_kids_programming/build.xml | 14 ++ .../teachingextensions/logo/TurtlePanel.java | 6 +- 5 files changed, 169 insertions(+), 2 deletions(-) create mode 100755 build.xml create mode 100755 build/properties/teaching_kids_programming.properties create mode 100755 build/properties/tkplauncher.properties create mode 100755 build/resources/teaching_kids_programming/build.xml diff --git a/build.xml b/build.xml new file mode 100755 index 0000000..991a64c --- /dev/null +++ b/build.xml @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build/properties/teaching_kids_programming.properties b/build/properties/teaching_kids_programming.properties new file mode 100755 index 0000000..c069fd0 --- /dev/null +++ b/build/properties/teaching_kids_programming.properties @@ -0,0 +1,9 @@ + + + +additonal_java_sources=${home}/../ApprovalTests.Java/java +jars=${src}/jars + + + + diff --git a/build/properties/tkplauncher.properties b/build/properties/tkplauncher.properties new file mode 100755 index 0000000..4b18e50 --- /dev/null +++ b/build/properties/tkplauncher.properties @@ -0,0 +1,9 @@ +home=C:/Users/Llewellyn/Documents/GitHub/ApprovalTests.Java +src=${home}/java +build_home=/temp/builds +tkp_workspace=/Users/Llewellyn/workspace/ApprovalTestsKoans/TeachingKidsProgramming.Java +build=${build_home}/build +targetJavaClass=org/teachingextensions/setup/** +jars=${src}/jars +jar=${tkp_workspace} +excludeTests=true diff --git a/build/resources/teaching_kids_programming/build.xml b/build/resources/teaching_kids_programming/build.xml new file mode 100755 index 0000000..1e6d749 --- /dev/null +++ b/build/resources/teaching_kids_programming/build.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/org/teachingextensions/logo/TurtlePanel.java b/src/main/java/org/teachingextensions/logo/TurtlePanel.java index f689372..313e1db 100644 --- a/src/main/java/org/teachingextensions/logo/TurtlePanel.java +++ b/src/main/java/org/teachingextensions/logo/TurtlePanel.java @@ -8,6 +8,7 @@ import java.awt.RenderingHints; import java.awt.geom.AffineTransform; import java.awt.geom.Line2D; +import java.net.URL; import javax.swing.ImageIcon; @@ -84,8 +85,9 @@ public synchronized Animals getAnimal() public synchronized void setAnimal(Animals animal) { this.animal = animal; - image = new ImageIcon(this.getClass().getClassLoader() - .getResource("images/" + animal + ".png")).getImage(); + URL resource = this.getClass().getClassLoader() + .getResource("images/" + animal + ".png"); + image = new ImageIcon(resource).getImage(); } public void setCursor(int cursor) { From d94c45eeb7232894f7f7b3db1f5803a6c704149e Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Mon, 16 Mar 2015 20:50:31 -0700 Subject: [PATCH 017/111] Test compilation fixed --- src/main/java/com/spun/util/Country.java | 48 ++ .../com/spun/util/MethodExecutionPath.java | 199 +++++ src/main/java/com/spun/util/NumberUtils.java | 206 ----- src/main/java/com/spun/util/ObjectUtils.java | 138 +++- src/main/java/com/spun/util/PhoneNumber.java | 259 +++++++ .../com/spun/util/filters/FilterUtils.java | 78 ++ src/main/java/com/spun/util/io/FileUtils.java | 1 + .../com/spun/util/parser/ParserCommons.java | 277 +++++++ .../spun/util/parser/PercentageAmount.java | 61 ++ .../spun/util/parser/TemplateNumberUtils.java | 105 +++ .../spun/util/parser/TemplateStringUtils.java | 177 +++++ .../util/velocity/StringResourceLoader.java | 55 ++ .../spun/util/velocity/VelocityParser.java | 189 +++++ src/main/java/org/lambda/query/Query.java | 79 -- ...orGeneration.testHtmlDisplay.received.html | 702 ++++++++++++++++++ .../logo/tests/VirtualProctorTest.java | 2 +- ...QuizTest.testCorrect.Mac_OS_X.received.png | Bin 0 -> 16768 bytes ...izTest.testIncorrect.Mac_OS_X.received.png | Bin 0 -> 12662 bytes ...QuizTest.testCorrect.Mac_OS_X.received.png | Bin 0 -> 13009 bytes ...izTest.testIncorrect.Mac_OS_X.received.png | Bin 0 -> 18538 bytes ...BuzzTest.testCorrect.Mac_OS_X.received.png | Bin 0 -> 14935 bytes ...zzTest.testIncorrect.Mac_OS_X.received.png | Bin 0 -> 12662 bytes ...QuizTest.testCorrect.Mac_OS_X.received.png | Bin 0 -> 16768 bytes ...izTest.testIncorrect.Mac_OS_X.received.png | Bin 0 -> 12662 bytes ...QuizTest.testCorrect.Mac_OS_X.received.png | Bin 13255 -> 0 bytes ...QuizTest.testCorrect.Mac_OS_X.received.png | Bin 0 -> 13284 bytes ...izTest.testIncorrect.Mac_OS_X.received.png | Bin 0 -> 14619 bytes ...olorGeneration.testGeneration.approved.txt | 0 ...orGeneration.testHtmlDisplay.approved.html | 0 .../ParserTest.testSimpleParse.approved.txt | 0 .../TurtleTest.testDelta.approved.txt | 0 .../TurtleTest.testSpeed.approved.txt | 0 .../WheelTest.testWheel.approved.txt | 0 .../resources/{documents => }/colors.html | 0 .../{documents => }/colors.java.template | 0 .../{documents => }/colors.sorted.txt | 0 src/test/resources/{documents => }/colors.txt | 0 37 files changed, 2284 insertions(+), 292 deletions(-) create mode 100644 src/main/java/com/spun/util/Country.java create mode 100644 src/main/java/com/spun/util/MethodExecutionPath.java delete mode 100644 src/main/java/com/spun/util/NumberUtils.java create mode 100644 src/main/java/com/spun/util/PhoneNumber.java create mode 100644 src/main/java/com/spun/util/filters/FilterUtils.java create mode 100644 src/main/java/com/spun/util/parser/ParserCommons.java create mode 100644 src/main/java/com/spun/util/parser/PercentageAmount.java create mode 100644 src/main/java/com/spun/util/parser/TemplateNumberUtils.java create mode 100644 src/main/java/com/spun/util/parser/TemplateStringUtils.java create mode 100644 src/main/java/com/spun/util/velocity/StringResourceLoader.java create mode 100644 src/main/java/com/spun/util/velocity/VelocityParser.java delete mode 100644 src/main/java/org/lambda/query/Query.java create mode 100644 src/test/java/org/teachingextensions/logo/tests/ColorGeneration.testHtmlDisplay.received.html create mode 100644 src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/AdLibsQuizTest.testCorrect.Mac_OS_X.received.png create mode 100644 src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/AdLibsQuizTest.testIncorrect.Mac_OS_X.received.png create mode 100644 src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/HiLowQuizTest.testCorrect.Mac_OS_X.received.png create mode 100644 src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/HiLowQuizTest.testIncorrect.Mac_OS_X.received.png create mode 100644 src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/QuizBuzzTest.testCorrect.Mac_OS_X.received.png create mode 100644 src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/QuizBuzzTest.testIncorrect.Mac_OS_X.received.png create mode 100644 src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleBubbleQuizTest.testCorrect.Mac_OS_X.received.png create mode 100644 src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleBubbleQuizTest.testIncorrect.Mac_OS_X.received.png delete mode 100644 src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SpiderWebQuizTest.testCorrect.Mac_OS_X.received.png create mode 100644 src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/TreeQuizTest.testCorrect.Mac_OS_X.received.png create mode 100644 src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/TreeQuizTest.testIncorrect.Mac_OS_X.received.png rename src/test/resources/{documents => }/ColorGeneration.testGeneration.approved.txt (100%) rename src/test/resources/{documents => }/ColorGeneration.testHtmlDisplay.approved.html (100%) rename src/test/resources/{documents => }/ParserTest.testSimpleParse.approved.txt (100%) rename src/test/resources/{documents => }/TurtleTest.testDelta.approved.txt (100%) rename src/test/resources/{documents => }/TurtleTest.testSpeed.approved.txt (100%) rename src/test/resources/{documents => }/WheelTest.testWheel.approved.txt (100%) rename src/test/resources/{documents => }/colors.html (100%) rename src/test/resources/{documents => }/colors.java.template (100%) rename src/test/resources/{documents => }/colors.sorted.txt (100%) rename src/test/resources/{documents => }/colors.txt (100%) diff --git a/src/main/java/com/spun/util/Country.java b/src/main/java/com/spun/util/Country.java new file mode 100644 index 0000000..12145e2 --- /dev/null +++ b/src/main/java/com/spun/util/Country.java @@ -0,0 +1,48 @@ +package com.spun.util; + + +public enum Country { + Albania, Algeria, AmericanSamoa("American Samoa"), Andorra, Angola, Anguilla, AntiguaAndBarbuda("Antigua & Barbuda"), Argentina, Armenia, Aruba, Australia, Austria, Azerbaijan, Azores, Bahamas, Bahrain, Bangladesh, Barbados, Belarus, Belgium, Belize, Benin, Bermuda, Bolivia, Bonaire, Bosnia, Botswana, Brazil, BritishVirginIsles( + "British Virgin Isles"), Brunei, Bulgaria, BurkinaFaso("Burkina Faso"), Burundi, Cambodia, Cameroon, Canada, CanaryIslands("Canary Islands"), CapeVerde( + "Cape Verde"), CaymanIslands("Cayman Islands"), CentralAfricanRepublic("Central African Republic"), Chad, ChannelIslands("Channel Islands"), Chile, Colombia, CookIslands( + "Cook Islands"), CostaRica("Costa Rica"), CotedIvoire("Cote d' Ivoire"), Croatia, Cuba, Curacao, Cyprus, CzechRepublic("Czech Republic"), DemRepublicofCongo( + "Dem. Republic of Congo"), Denmark, Djibouti, Dominica, DominicanRepublic("Dominican Republic"), Ecuador, Egypt, ElSalvador("El Salvador"), England, EquatorialGuinea( + "Equatorial Guinea"), Eritrea, Estonia, Ethiopia, FaeroeIslands("Faeroe Islands"), Fiji, Finland, France, FrenchGuiana("French Guiana"), FrenchPolynesia( + "French Polynesia"), Gabon, Gambia, Georgia, Germany, Ghana, Gibraltar, Greece, Greenland, Grenada, Guadeloupe, Guam, Guatemala, Guinea, GuineaBissau( + "Guinea-Bissau"), Guyana, Haiti, Holland, Honduras, HongKong("Hong Kong"), Hungary, Iceland, India, Indonesia, Iran, Iraq, Israel, Italy, Jamaica, Japan, Jordan, Kazakhstan, Kenya, Kiribati, Kosrae, Kuwait, Kyrgyzstan, Laos, Latvia, Lebanon, Lesotho, Liberia, Libya, Liechtenstein, Lithuania, Luxembourg, Macau, Macedonia, Madagascar, Madeira, Malawi, Malaysia, Maldives, Mali, Malta, MarshallIslands( + "Marshall Islands"), Martinique, Mauritania, Mauritius, Mexico, Micronesia, Moldova, Monaco, Mongolia, Montserrat, Morocco, Mozambique, Myanmar, NMarianaIslands( + "N. Mariana Islands"), Namibia, Nepal, Netherlands, NetherlandsAntilles("Netherlands Antilles"), NewCaledonia("New Caledonia"), NewZealand( + "New Zealand"), Nicaragua, Niger, Nigeria, NorfolkIsland("Norfolk Island"), NorthKorea("North Korea"), NorthernIreland("Northern Ireland"), Norway, Oman, Pakistan, Palau, Panama, PapuaNewGuinea( + "Papua New Guinea"), Paraguay, PeoplesRepublicofChina("Peoples Republic of China"), Peru, Philippines, Poland, Ponape, Portugal, PuertoRico( + "Puerto Rico"), Qatar, RepublicofCongo("Republic of Congo"), RepublicofIreland("Republic of Ireland"), RepublicofYemen("Republic of Yemen"), Reunion, Romania, Rota, Russia, Rwanda, Saba, Saipan, SanMarino( + "San Marino"), SaudiArabia("Saudi Arabia"), Scotland, Senegal, Seychelles, SierraLeone("Sierra Leone"), Singapore, Slovakia, Slovenia, SolomonIslands( + "Solomon Islands"), SouthAfrica("South Africa"), SouthKorea("South Korea"), Spain, SriLanka("Sri Lanka"), StVincentGrenadine( + "St Vincent/Grenadine"), StBarthelemy("St. Barthelemy"), StChristopher("St. Christopher"), StCroix("St. Croix"), StEustatius("St. Eustatius"), StJohn( + "St. John"), StKittsAndNevis("St. Kitts & Nevis"), StLucia("St. Lucia"), StMaarten("St. Maarten"), StMartin("St. Martin"), StThomas( + "St. Thomas"), Sudan, Suriname, Swaziland, Sweden, Switzerland, Syria, Tahiti, Taiwan, Tajikistan, Tanzania, Thailand, Tinian, Togo, Tonga, Tortola, TrinidadAndTobago( + "Trinidad & Tobago"), Truk, Tunisia, Turkey, Turkmenistan, TurksAndCaicosIsles("Turks & Caicos Isles"), Tuvalu, Uganda, Ukraine, UnionIsland( + "Union Island"), UnitedArabEmirates("United Arab Emirates"), UnitedKingdom("United Kingdom"), UnitedStates("United States"), Uruguay, USVirginIslands( + "US Virgin Islands"), Uzbekistan, Vanuatu, VaticanCityState("Vatican City State"), Venezuela, Vietnam, VirginGorda("Virgin Gorda"), WakeIsland( + "Wake Island"), Wales, WallisAndFutunaIsle("Wallis & Futuna Isle"), WesternSamoa("Western Samoa"), Yap, Yugoslavia, Zambia, Zimbabwe; + String altText = null; + private Country() + { + } + private Country(String altText) + { + this.altText = altText; + } + public String toString() + { + return altText == null ? super.toString() : altText; + } + private static String[] names = null; + public synchronized static String[] getStringValues() + { + if (names == null) + { + names = (String[]) ObjectUtils.extractArray(Country.values(),"toString"); + } + return names; + } +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/MethodExecutionPath.java b/src/main/java/com/spun/util/MethodExecutionPath.java new file mode 100644 index 0000000..e979ab4 --- /dev/null +++ b/src/main/java/com/spun/util/MethodExecutionPath.java @@ -0,0 +1,199 @@ +package com.spun.util; + +import java.io.Serializable; +import java.lang.reflect.Method; +import java.util.Arrays; + +import com.spun.util.filters.Filter; +import com.spun.util.filters.FilterUtils; + +public class MethodExecutionPath implements Serializable +{ + public static final Object NULL_ENCOUNTERED_ON_PATH = new Object(); + private Class classType, returnType; + private String methodNames[]; + private Parameters[] parameters; + private Method methods[]; + /***********************************************************************/ + public MethodExecutionPath(Class clazz, String methodName) + { + this(clazz, new String[]{methodName}, null); + } + /***********************************************************************/ + public MethodExecutionPath(Class clazz, String... methodNames) + { + this(clazz, methodNames, null); + } + /***********************************************************************/ + public MethodExecutionPath(Class clazz, String methodName, Parameters parameters) + { + this(clazz, new String[]{methodName}, new Parameters[]{parameters}); + } + /***********************************************************************/ + public MethodExecutionPath(Class clazz, String[] methodNames, Parameters[] parameters) + { + this.classType = clazz; + this.methodNames = methodNames; + this.parameters = parameters; + this.methods = getRecursiveMethods(clazz, methodNames, parameters); + this.returnType = (this.methods != null) ? methods[methods.length - 1].getReturnType() : null; + } + /************************************************************************/ + public static MethodExecutionPath method(Class class1, String method, Object... paramaters) + { + return new MethodExecutionPath(class1, new String[]{method}, new Parameters[]{new Parameters(paramaters)}); + } + public static Method[] getRecursiveMethods(Class clazz, String[] methodNames, Parameters[] parameters) + { + if (clazz == null) { return null; } + Method methods[] = new Method[methodNames.length]; + String currentMethodName = null; + Parameters parameter = null; + try + { + for (int i = 0; i < methods.length; i++) + { + currentMethodName = methodNames[i]; + parameter = Parameters.getParametersFor(parameters, i); + methods[i] = parameter.getBestFitMethod(clazz, currentMethodName); + clazz = methods[i].getReturnType(); + } + return methods; + } + catch (Exception e) + { + throw new Error("Unable to get method for " + clazz.getName() + "." + currentMethodName + "(" + parameter + + ")", e); + } + } + /***********************************************************************/ + public Object extractValue(Object object) + { + if (object == null) { return NULL_ENCOUNTERED_ON_PATH; } + Method[] methods = this.methods == null ? getRecursiveMethods(object.getClass(), this.methodNames, + this.parameters) : this.methods; + for (int i = 0; i < methods.length; i++) + { + if (object == null) { return NULL_ENCOUNTERED_ON_PATH; } + object = extractValue(object, methods[i], Parameters.getParametersFor(parameters, i).values); + } + return object; + } + /************************************************************************/ + private static Object extractValue(Object object, Method method, Object values[]) + { + try + { + return method.invoke(object, values); + } + catch (Exception e) + { + throw new Error("Problems extracting values from " + object.getClass().getName() + "." + method.getName(), e); + } + } + /************************************************************************/ + public Class getClassType() + { + return classType; + } + /***********************************************************************/ + public Class getReturnType() + { + return returnType; + } + /***********************************************************************/ + /***********************************************************************/ + public static class Parameters + { + public static final Parameters EMPTY = new Parameters(null, null); + public Class[] definitions; + public Object[] values; + /***********************************************************************/ + public Parameters(Object... values) + { + if (!ArrayUtils.isEmpty(values)) + { + this.values = values; + this.definitions = (Class[]) ObjectUtils.extractArray(values, "getClass"); + } + } + /***********************************************************************/ + public Parameters(Class[] definitions, Object[] values) + { + this.definitions = definitions; + this.values = values; + } + /***********************************************************************/ + public Method getBestFitMethod(Class clazz, String currentMethodName) throws NoSuchMethodException + { + return getBestFitMethod(clazz, currentMethodName, definitions); + } + /***********************************************************************/ + public static Method getBestFitMethod(Class clazz, String currentMethodName, Class[] definitions) + throws NoSuchMethodException + { + try + { + return clazz.getMethod(currentMethodName, definitions); + } + catch (NoSuchMethodException e) + { + Method[] methods = (Method[]) FilterUtils.retainExtracted(clazz.getMethods(), + new MethodParameterFilter(currentMethodName, definitions)).toArray(new Method[0]); + if (methods.length == 0) { throw e; } + if (methods.length == 1) + { + return methods[0]; + } + else + { + throw new Error("Don't know how to handle multiple available methods yet."); + } + } + } + /***********************************************************************/ + public static Parameters getParametersFor(Parameters[] parameters, int i) + { + if (parameters == null || (i >= parameters.length) || parameters[i] == null) { return EMPTY; } + return parameters[i]; + } + /***********************************************************************/ + public String toString() + { + return definitions == null ? "" : Arrays.asList(definitions).toString(); + } + } + public static class MethodParameterFilter implements Filter + { + private String methodName; + private Class[] classParameters; + /***********************************************************************/ + public MethodParameterFilter(String methodName, Class[] classParameters) + { + super(); + this.methodName = methodName; + this.classParameters = classParameters; + } + /***********************************************************************/ + public boolean isExtracted(Object object) throws IllegalArgumentException + { + ObjectUtils.assertInstance(Method.class, object); + Method m = (Method) object; + if (m.getName().equals(methodName) && m.getParameterTypes().length == classParameters.length) + { + Class[] params = m.getParameterTypes(); + for (int i = 0; i < params.length; i++) + { + if (!ObjectUtils.isThisInstanceOfThat(classParameters[i], params[i])) { return false; } + } + return true; + } + else + { + return false; + } + } + } + /***********************************************************************/ + /***********************************************************************/ +} diff --git a/src/main/java/com/spun/util/NumberUtils.java b/src/main/java/com/spun/util/NumberUtils.java deleted file mode 100644 index aff20f8..0000000 --- a/src/main/java/com/spun/util/NumberUtils.java +++ /dev/null @@ -1,206 +0,0 @@ -package com.spun.util; - -import java.io.Serializable; -import java.util.Random; - -/** - * A static class of convenience functions for Manipulating numbers - **/ -public class NumberUtils { - public static Random RANDOM = new Random(); - - /***********************************************************************/ - public static int getMax(int value1, int value2) { - return value1 > value2 ? value1 : value2; - } - - /***********************************************************************/ - /** - * Loads an int from a String. - **/ - public static int load(String i, int defaultValue) { - return load(i, defaultValue, true); - } - - /***********************************************************************/ - /** - * Loads an int from a String. - **/ - public static int load(String i, int defaultValue, boolean stripNonNumeric) { - try { - i = stripNonNumeric ? StringUtils.stripNonNumeric(i, true, true) - : i; - defaultValue = Integer.parseInt(i); - } catch (Exception e) { - } - return defaultValue; - } - - /***********************************************************************/ - /** - * Loads an int from a String. - **/ - public static long load(String i, long defaultValue) { - try { - defaultValue = Long.parseLong(i); - } catch (Exception e) { - } - return defaultValue; - } - - /***********************************************************************/ - /** - * - **/ - public static double load(String i, double defaultValue) { - try { - i = StringUtils.stripNonNumeric(i, true, true); - defaultValue = Double.parseDouble(i); - } catch (Exception e) { - } - return defaultValue; - } - - /***********************************************************************/ - public static boolean load(String i, boolean d) { - return (i == null) ? d : "true".equalsIgnoreCase(i); - } - - /***********************************************************************/ - public static int[] loadArray(String summaryString, String seperator, - int defaultWhenLoading) { - String parts[] = StringUtils.split(summaryString, seperator); - int integers[] = new int[parts.length]; - for (int i = 0; i < parts.length; i++) { - integers[i] = load(parts[i], defaultWhenLoading); - } - return integers; - } - - /************************************************************************/ - public static double setSignificantDigit(double onNumber, int digit) { - double power = Math.pow(10, digit); - onNumber = onNumber * power; - onNumber = Math.round(onNumber); - onNumber = onNumber / power; - return onNumber; - } - - /************************************************************************/ - /** - * a unit test of sorts :-) - **/ - public static void main(String args[]) { - Random r = new Random(); - for (int i = 0; i < 20; i++) { - double d = r.nextDouble(); - int s = r.nextInt(5); - MySystem.event(d + " , " + s + " -> " + setSignificantDigit(d, s)); - } - } - - /***********************************************************************/ - public static boolean doRandomPercentage(int i) { - return RANDOM.nextInt(100) < i; - } - - /***********************************************************************/ - public static boolean equals(double one, double two, double delta) { - double actualDelta = one - two; - return (-delta < actualDelta) && (actualDelta < delta); - } - - /***********************************************************************/ - public static Integer[] wrapIntegers(int[] ints) { - Integer[] integers = new Integer[ints.length]; - for (int i = 0; i < ints.length; i++) { - integers[i] = ints[i]; - } - return integers; - } - - /***********************************************************************/ - public static String createRandomStringOfNumbers(int digits) { - StringBuffer buffer = new StringBuffer(digits); - for (int i = 0; i < digits; i++) { - buffer.append(RANDOM.nextInt(10)); - } - return buffer.toString(); - } - - /***********************************************************************/ - public static boolean isIn(int check, int[] available) { - for (int i = 0; i < available.length; i++) { - if (check == available[i]) { - return true; - } - } - return false; - } - - /***********************************************************************/ - public static boolean isEven(int number) { - return ((number % 2) == 0); - } - - /***********************************************************************/ - /** - * randomly chooses a number between the minimum and maximum - *
Example: - * {@code int grade = NumberUtils.getRandomInt(1,100);}
- * - * @param minimum - * The lowest possible value (inclusive) - * @param maximum - * The highest possible value (inclusive) - * @return the random number - */ - public static int getRandomInt(int minimum, int maximum) { - int diff = maximum - minimum; - if (diff == 0) { - return maximum; - } else { - return RANDOM.nextInt(diff) + minimum; - } - } - - /***********************************************************************/ - public static int floor(double i) { - return (int) Math.floor(i); - } - - /***********************************************************************/ - public static int getNumberOfDigits(int number) { - return ("" + number).length(); - } - - /***********************************************************************/ - public static double convertDoubleToPercentage(double doub) { - return doub * 100; - } - - /***********************************************************************/ - public static double convertPercentageToDouble(double percent) { - return percent / 100; - } - - /***********************************************************************/ - /* INNER CLASS */ - /***********************************************************************/ - public static class Shuffler implements java.util.Comparator, - Serializable { - private static final long serialVersionUID = -466404450070994039L; - public int oldPosition = 0; - public int newPosition = 0; - - public Shuffler(int oldPosition) { - this.oldPosition = oldPosition; - this.newPosition = RANDOM.nextInt(); - } - - public int compare(Shuffler s1, Shuffler s2) { - return Double.compare(s1.newPosition, (s2).newPosition); - } - } - /***********************************************************************/ -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/ObjectUtils.java b/src/main/java/com/spun/util/ObjectUtils.java index e9cb60d..f6126d1 100644 --- a/src/main/java/com/spun/util/ObjectUtils.java +++ b/src/main/java/com/spun/util/ObjectUtils.java @@ -1,7 +1,10 @@ package com.spun.util; +import java.lang.reflect.Array; import java.lang.reflect.Method; import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; /** * A static class of convenience functions for Manipulating objects @@ -46,7 +49,7 @@ public static Method[] getMethodsForObject(Object o2, String[] passedMethods) th NoSuchMethodException { Method methods[] = new Method[passedMethods.length]; - Class clazz = o2.getClass(); + Class clazz = o2.getClass(); for (int i = 0; i < passedMethods.length; i++) { methods[i] = clazz.getMethod(passedMethods[i], (Class[]) null); @@ -56,8 +59,7 @@ public static Method[] getMethodsForObject(Object o2, String[] passedMethods) th /***********************************************************************/ /** * A convenience function to check if 2 strings are equal. - * @param s1 The string in question - * @param s2 The other string + * @param string The string in question * @return true if Equal. **/ public static boolean isEqual(Object s1, Object s2) @@ -84,7 +86,39 @@ public static boolean isIn(Object target, Object[] objects) } return false; } - + /***********************************************************************/ + public static T getForMethod(T[] onArray, Object forValue, String... onMethods) + { + return getForMethod(onArray, forValue, new MethodExecutionPath(null, onMethods)); + } + /***********************************************************************/ + public static T getForMethod(T[] onArray, Object forValue, String onMethod) + { + return getForMethod(onArray, forValue, new MethodExecutionPath(null, onMethod, null)); + } + /***********************************************************************/ + public static T getForMethod(T[] onArray, Object forValue, String onMethod, Object[] params) + { + return getForMethod(onArray, forValue, new MethodExecutionPath(null, onMethod, + new MethodExecutionPath.Parameters(params))); + } + /***********************************************************************/ + public static T getForMethod(T[] onArray, Object forValue, MethodExecutionPath path) + { + if (onArray == null || (onArray.length == 0)) { return null; } + try + { + for (int i = 0; i < onArray.length; i++) + { + if (isEqual(forValue, path.extractValue(onArray[i]))) { return onArray[i]; } + } + return null; + } + catch (Throwable t) + { + throw throwAsError(t); + } + } /***********************************************************************/ public static boolean isThisInstanceOfThat(Class thiz, Class that) { @@ -113,6 +147,56 @@ public static T getRandomIndex(T[] array) return array[NumberUtils.RANDOM.nextInt(array.length)]; } /***********************************************************************/ + /** + * @deprecated use Query.select() + */ + public static Object[] extractArray(Object[] from, String methodName) + { + try + { + if (from == null || from.length == 0) { return new Object[0]; } + Method method = getGreatestCommonDenominator(from, methodName); + Object[] array = null; + if (Object.class.isAssignableFrom(method.getReturnType())) + { + array = (Object[]) Array.newInstance(method.getReturnType(), from.length); + } + else + { + array = (Object[]) Array.newInstance(ClassUtils.getWrapperClass(method.getReturnType()), from.length); + } + for (int i = 0; i < from.length; i++) + { + array[i] = method.invoke(from[i], (Object[]) null); + } + return array; + } + catch (Exception e) + { + MySystem.warning(e); + throw ObjectUtils.throwAsError(e); + } + } + /***********************************************************************/ + public static Method getGreatestCommonDenominator(Object[] from, String methodName) throws SecurityException, + NoSuchMethodException + { + List classes = new ArrayList(); + ArrayUtils.addArray(classes, getAllCastableClasses(from[0])); + for (Object o : from) + { + for (int i = classes.size() - 1; i >= 0; i--) + { + Class clazz = classes.get(i); + if (!isThisInstanceOfThat(o.getClass(), clazz) || !ClassUtils.hasMethod(clazz, methodName)) + { + classes.remove(i); + } + } + } + return classes.size() == 0 ? null : ArrayUtils.getLast(classes).getMethod(methodName, (Class[]) null); + } + /***********************************************************************/ private static Class[] getAllCastableClasses(Object object) { Class clazz = object.getClass(); @@ -140,12 +224,54 @@ public static Object executeMethod(Object object, String method, Class[] methodS } } /***********************************************************************/ + public static void assertInstance(Class clazz, Object object) + { + assertInstance(new Class[]{clazz}, object); + } + /***********************************************************************/ + public static void assertInstance(Class classes[], Object object) + { + if (object == null) { throw new NullPointerException("Expected Object of Type " + + Arrays.asList(extractArray(classes, "getName")) + " but was null"); } + for (int i = 0; i < classes.length; i++) + { + if (ClassUtils.getWrapperClass(classes[i]).isInstance(object)) { return; } + } + throw new IllegalArgumentException("Expected Object of Type " + + Arrays.asList(extractArray(classes, "getName")) + " but got " + object.getClass().getName()); + } + /***********************************************************************/ public static String getClassName(Object o) { return o == null ? "null" : o.getClass().getName(); } - - + /***********************************************************************/ + public static void assertInstanceOrNull(Class type, Object value) + { + if (value != null) + { + assertInstance(type, value); + } + } + /************************************************************************/ + public static void move(Object from, Object to, String[] getters) + { + try + { + for (String method : getters) + { + Method getMethod = from.getClass().getMethod("get" + method, (Class[]) null); + Object value = getMethod.invoke(from, (Object[]) null); + Method m = MethodExecutionPath.Parameters.getBestFitMethod(to.getClass(), "set" + method, + new Class[]{getBestClass(value, getMethod)}); + m.invoke(to, value); + } + } + catch (Exception e) + { + throw throwAsError(e); + } + } /************************************************************************/ private static Class getBestClass(Object value, Method method) { diff --git a/src/main/java/com/spun/util/PhoneNumber.java b/src/main/java/com/spun/util/PhoneNumber.java new file mode 100644 index 0000000..49841f9 --- /dev/null +++ b/src/main/java/com/spun/util/PhoneNumber.java @@ -0,0 +1,259 @@ +package com.spun.util; + + +/** + * Phone number validation, and formatter. + * this class is immutable. + **/ +public class PhoneNumber +{ + public static final int USA = 0; + public static final String[] COUNTRY_CODES = { + "1", "20", "212", "213", "216", "218", "220", "221", "222", "223", + "224", "225", "226", "227", "228", "229", "230", "231", "232", "233", + "234", "235", "236", "237", "238", "239", "240", "241", "242", "243", + "244", "245", "246", "247", "248", "249", "250", "251", "252", "253", + "254", "255", "256", "257", "258", "260", "261", "262", "263", "264", + "265", "266", "267", "268", "269", "27", "290", "291", "297", "298", + "299", "30", "31", "32", "33", "34", "350", "351", "352", "353", + "354", "355", "356", "357", "358", "359", "36", "370", "371", "372", + "373", "374", "375", "376", "377", "378", "380", "381", "385", "386", + "387", "389", "39", "40", "41", "420", "421", "423", "43", "44", + "45", "46", "47", "48", "49", "500", "501", "502", "503", "504", + "505", "506", "507", "508", "509", "51", "52", "53", "5399", "54", + "55", "56", "57", "58", "590", "591", "592", "593", "594", "595", + "596", "597", "598", "599", "60", "61", "618", "62", "63", "64", + "65", "66", "670", "672", "673", "674", "675", "676", "677", "678", + "679", "680", "681", "682", "683", "684", "685", "686", "687", "688", + "689", "690", "691", "692", "7", "808", "81", "82", "84", "850", + "852", "853", "855", "856", "86", "870", "871", "872", "873", "874", + "878", "880", "881", "8816", "8817", "88213", "88216", "886", "90", "91", + "92", "93", "94", "95", "960", "961", "962", "963", "964", "965", + "966", "967", "968", "970", "971", "972", "973", "974", "975", "976", + "977", "98", "992", "993", "994", "995", "996", "998"}; + + private static final String REASONS[] = {"Phone Number Too Long or Too Short", "US Number must be length 10", "Unknown Country Code"}; + + /** The original value. */ + private String originalValue = null; + private int countryCode = USA; + private String strippedValue = null; + private String invalidReason = null; + private int nonValidCountryCode = 0; + public PhoneNumber(String originalValue) + { + originalValue = StringUtils.loadNullableString(originalValue); + this.originalValue = originalValue; + if (this.originalValue == null) { return; } + this.strippedValue = stripPhoneNumber(this.originalValue); + this.countryCode = getCountryCode(strippedValue); + this.invalidReason = validate(countryCode, strippedValue); + if (invalidReason != null) + { + nonValidCountryCode = countryCode; + countryCode = -1; + } + } + /**************************************************************************/ + private static String stripPhoneNumber(String number) + { + if (number == null) {return null;} + boolean xAppended = false; + StringBuffer result = new StringBuffer(); + for(int i = 0; i< number.length(); i++) + { + char c = number.charAt(i); + switch (c) + { + case '0' : + case '1' : + case '2' : + case '3' : + case '4' : + case '5' : + case '6' : + case '7' : + case '8' : + case '9' : result.append(c); break; + case '+' : if (result.length() == 0){result.append(c);} break; + case 'X': + case 'x': { + if (! xAppended) + { + result.append('x'); + xAppended = true; + } + break; + } + default : break; + } + } + + char c = result.length() == 0 ? ' ' : result.charAt(0); + switch (c) + { + case '+': break; // do nothing + case '1': result.insert(0, "+"); break; // insert a 1 + default: result.insert(0, "+1"); // if neither insert a +1 + } + + return result.toString(); + } + /**************************************************************************/ + private static int getCountryCode(String strippedNumber) + { + String alt = strippedNumber.substring(1); + for (int i = 0; i < COUNTRY_CODES.length; i++) + { + String code = COUNTRY_CODES[i]; + if (alt.startsWith(code)) { return i; } + } + return -1; + } + /**************************************************************************/ + private static String validate(int countryCode, String stripedNumber) + { + return (countryCode == USA) ? validateNorthAmerican(countryCode, stripedNumber) : validateInternational(countryCode, stripedNumber); + } + /**************************************************************************/ + private static String validateInternational(int countryCode, String strippedNumber) + { + if (countryCode == -1) + return "Invalid country code"; + String body = extractPhoneBody(countryCode, strippedNumber); + String prefix = COUNTRY_CODES[countryCode]; + int nl = prefix.length() + body.length(); + return (nl > 15) || (nl < 9) ? REASONS[0] : null; + } + /**************************************************************************/ + private static String validateNorthAmerican(int countryCode, String strippedNumber) + { + if (countryCode != USA) + return "Invalid country code"; + String body = extractPhoneBody(countryCode, strippedNumber); + return (body.length() != 10) ? REASONS[0] : null; + } + /**************************************************************************/ + private static String extractPhoneBody(int countryCode, String strippedNumber) + { + if (countryCode == -1) + throw new IllegalArgumentException("Invalid country code"); + String prefix = "+" + COUNTRY_CODES[countryCode]; + String body = strippedNumber.substring(prefix.length()); + int indexOfExt = body.indexOf('x'); + if (indexOfExt > -1) + { + body = body.substring(0, indexOfExt); + } + return body; + } + /**************************************************************************/ + public String getValue() + { + if (isValid() && strippedValue != null) + { + return (isNorthAmericanNumber()) ? getValueAsNorthAmerican() : getValueAsInternational(); + } + else + { + return originalValue; + } + } + /**************************************************************************/ + public String getValueAsUps() + { + return getValueAsUps(countryCode, this.strippedValue); + } + /**************************************************************************/ + private static String getValueAsUps(int countryCode, String strippedNumber) + { + if (strippedNumber == null) { return null; } + if (countryCode < 0) { throw new IllegalArgumentException("# '" + strippedNumber + "' is not an international number"); } + String body = extractPhoneBody(countryCode, strippedNumber); + String prefix = COUNTRY_CODES[countryCode]; + if (countryCode == USA) + { + return body; + } + else + { + return prefix + body; + } + } + /**************************************************************************/ + private static String getValueAsNorthAmerican(int countryCode, String stripped) + { + if (countryCode != USA) + throw new IllegalArgumentException("# '" + stripped + "' is not a NorthAmerican number"); + StringBuffer number = new StringBuffer(stripped.substring(2)); + number.insert(6, "-"); + number.insert(3, ")"); + number.insert(0, "("); + return number.toString(); + } + /**************************************************************************/ + private static String getValueAsInternational(int countryCode, String stripped) + { + if (stripped == null) { return null; } + if (countryCode < USA) { throw new IllegalArgumentException("# '" + stripped + "' is not an international number"); } + StringBuffer number = new StringBuffer(stripped); + int intlLength = COUNTRY_CODES[countryCode].length() + 1; + int bodyLength = extractPhoneBody(countryCode, stripped).length(); + if (bodyLength > 6) + { + number.insert(intlLength + 6, "."); + } + if (bodyLength > 3) + { + number.insert(intlLength + 3, "."); + } + number.insert(intlLength, "."); + return number.toString(); + } + /**************************************************************************/ + public String getValueAsNorthAmerican() + { + return getValueAsNorthAmerican(this.countryCode, this.strippedValue); + } + /**************************************************************************/ + public String getValueAsInternational() + { + return getValueAsInternational(this.countryCode, this.strippedValue); + } + /**************************************************************************/ + public String getPartiallyFormattedAsInternational() + { + return getValueAsInternational(this.nonValidCountryCode, this.strippedValue); + } + /**************************************************************************/ + public boolean isValid() + { + return (this.invalidReason == null); + } + /**************************************************************************/ + public String getInvalidReason() + { + return this.invalidReason; + } + /**************************************************************************/ + public boolean isNorthAmericanNumber() + { + return this.countryCode == USA; + } + /**************************************************************************/ + public String getOriginalText() + { + return originalValue; + } + /**************************************************************************/ + public String toString() + { + return getValue(); + } + /**************************************************************************/ + /**************************************************************************/ + public Country getCountry() + { + return Country.UnitedStates; + } +} diff --git a/src/main/java/com/spun/util/filters/FilterUtils.java b/src/main/java/com/spun/util/filters/FilterUtils.java new file mode 100644 index 0000000..b1d7909 --- /dev/null +++ b/src/main/java/com/spun/util/filters/FilterUtils.java @@ -0,0 +1,78 @@ +package com.spun.util.filters; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; + +/** + * Listens to the state of a EnabledConditions object + **/ +public class FilterUtils +{ + /***********************************************************************/ + /** + * @return a new List containing all elements of the list for which isExtracted() would return true + **/ + public static ArrayList retainExtracted(Collection fromList, Filter filter) throws IllegalArgumentException + { + return filter(fromList, filter, true); + } + /***********************************************************************/ + /** + * @return a new List containing all elements of the list for which isExtracted() would return false + **/ + public static ArrayList retainPurified(List fromList, Filter filter) throws IllegalArgumentException + { + return filter(fromList, filter, false); + } + /***********************************************************************/ + /** + * @return a new List containing all elements of the list for which isExtracted() would return true + **/ + public static ArrayList retainExtracted(T fromObjects[], Filter filter) throws IllegalArgumentException + { + return fromObjects == null ? new ArrayList() : filter(Arrays.asList(fromObjects), filter, true); + } + /***********************************************************************/ + /** + * @return a new List containing all elements of the list for which isExtracted() would return true + **/ + private static ArrayList filter(Iterable collection, Filter filter, boolean retainExtracted) throws IllegalArgumentException + { + ArrayList extracted = new ArrayList(); + if (collection != null) + { + for (T t : collection) + { + boolean ex = (filter == null || filter.isExtracted(t)); + if (ex == retainExtracted) + { + extracted.add(t); + } + } + } + return extracted; + } + /***********************************************************************/ + /** + * @return a new List containing all elements of the list for which isExtracted() would return false + **/ + public static ArrayList retainPurified(T fromObjects[], Filter filter) throws IllegalArgumentException + { + return filter(Arrays.asList(fromObjects), filter, false); + } + /***********************************************************************/ + /* INNER CLASSES */ + /***********************************************************************/ + public static class FilterNotNull implements Filter + { + /***********************************************************************/ + public boolean isExtracted(Object object) throws IllegalArgumentException + { + return object != null; + } + } + /***********************************************************************/ + /***********************************************************************/ +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/io/FileUtils.java b/src/main/java/com/spun/util/io/FileUtils.java index 57144e4..eb5dfad 100644 --- a/src/main/java/com/spun/util/io/FileUtils.java +++ b/src/main/java/com/spun/util/io/FileUtils.java @@ -15,6 +15,7 @@ import java.io.InputStreamReader; import java.io.OutputStream; import java.io.Reader; +import java.net.URL; import java.nio.channels.FileChannel; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/com/spun/util/parser/ParserCommons.java b/src/main/java/com/spun/util/parser/ParserCommons.java new file mode 100644 index 0000000..a56b683 --- /dev/null +++ b/src/main/java/com/spun/util/parser/ParserCommons.java @@ -0,0 +1,277 @@ +package com.spun.util.parser; + +import java.util.Collection; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import com.spun.util.NumberUtils; +import com.spun.util.ObjectUtils; +import com.spun.util.PhoneNumber; +import com.spun.util.velocity.ParserDateUtils; + +public class ParserCommons +{ + public static TemplateStringUtils stringUtils = TemplateStringUtils.INSTANCE; + public static TemplateNumberUtils numberUtils = TemplateNumberUtils.INSTANCE; + public static TemplateDate today = TemplateDate.INSTANCE; + public static ParserCommons INSTANCE = new ParserCommons(); + + /***********************************************************************/ + public static TemplateNumberUtils getNumberUtils() + { + return numberUtils; + } + + /***********************************************************************/ + public static Class getClass(String clazz) throws ClassNotFoundException + { + return Class.forName(clazz); + } + + public static Object createNew(String clazz) throws InstantiationException, + IllegalAccessException, ClassNotFoundException + { + return getClass(clazz).newInstance(); + } + + /***********************************************************************/ + public static Object getNull() + { + return null; + } + + /***********************************************************************/ + public static ParserDateUtils getDateUtils() + { + return ParserDateUtils.INSTANCE; + } + + /***********************************************************************/ + public static TemplateStringUtils getStringUtils() + { + return stringUtils; + } + + /***********************************************************************/ + public static String asJavascript(Object obj) + { + return TemplateStringUtils.toJavaScriptEncode(obj); + } + + /***********************************************************************/ + public static TemplateDate getToday() + { + return today; + } + + /***********************************************************************/ + public static TemplateDate asDate(Date date) + { + return new TemplateDate(date); + } + + /***********************************************************************/ + public static TemplateDouble asDouble(double number) + { + return new TemplateDouble(number); + } + + /***********************************************************************/ + public static PhoneNumber asPhoneNumber(String number) + { + return new PhoneNumber(number); + } + + /***********************************************************************/ + public static String asExcel(String text) + { + return TemplateStringUtils.formatExcelString(text); + } + + /***********************************************************************/ + public static boolean isNull(Object object) + { + return object == null; + } + + /***********************************************************************/ + public static PercentageAmount asPercentage(double d) + { + return new PercentageAmount(d); + } + + /***********************************************************************/ + public static TemplateDouble asDouble(Number number) + { + return new TemplateDouble(number.doubleValue()); + } + + /***********************************************************************/ + public static List asArray(Object[] array, int offset, int stepping) + { + return new VelocityList(array, offset, stepping).getAll(); + } + + /***********************************************************************/ + public static List asArray(Object[] array, int offset, int stepping1, + int stepping2) + { + return new VelocityList(array, offset, new int[] { stepping1, stepping2 }) + .getAll(); + } + + /***********************************************************************/ + public static List asArray(Object[] array) + { + return new VelocityList(array).getAll(); + } + + /***********************************************************************/ + public static List asArray(Object nullObject) + { + if (nullObject != null) + { + throw new Error("Improper usage"); + } + return new VelocityList(Collections.EMPTY_LIST).getAll(); + } + + /***********************************************************************/ + public static List asArray(List list) + { + return new VelocityList(list).getAll(); + } + + /***********************************************************************/ + public static TemplateDouble asDouble(int number) + { + return new TemplateDouble(number); + } + + /***********************************************************************/ + public static CurrencyAmount asCurrency(double number) + { + return new CurrencyAmount(number); + } + + /***********************************************************************/ + public static CurrencyAmount asCurrency(Number number) + { + return number == null ? new CurrencyAmount(0.00) : new CurrencyAmount( + number.doubleValue()); + } + + /***********************************************************************/ + public static CurrencyAmount asCurrency(int number) + { + return new CurrencyAmount(number); + } + + /***********************************************************************/ + public static CurrencyAmount asCurrencyAmount(double number) + { + return new CurrencyAmount(number); + } + + /***********************************************************************/ + public static CurrencyAmount asCurrencyAmount(Number number) + { + return new CurrencyAmount(number.doubleValue()); + } + + /***********************************************************************/ + public static CurrencyAmount asCurrencyAmount(int number) + { + return new CurrencyAmount(number); + } + + /***********************************************************************/ + public static TemplateDouble sum(Object[] array, String methodName) + { + return new TemplateDouble(NumberUtils.sum(array, methodName, null)); + } + + /***********************************************************************/ + public static TemplateDouble sum(Object[] array, String methodName, + Object param1) + { + return new TemplateDouble(NumberUtils.sum(array, methodName, + new Object[] { param1 })); + } + + /***********************************************************************/ + public static TemplateDouble sum(Object[] array, String methodName, + Object param1, Object param2) + { + return new TemplateDouble(NumberUtils.sum(array, methodName, new Object[] { + param1, param2 })); + } + + /***********************************************************************/ + public static int getArrayLength(Object[] array) + { + return array == null ? 0 : array.length; + } + + /***********************************************************************/ + public static int getLength(Object[] array) + { + return array == null ? 0 : array.length; + } + + /***********************************************************************/ + public static int getLength(Collection collection) + { + return collection == null ? 0 : collection.size(); + } + + /***********************************************************************/ + public static boolean isEmpty(Object[] array) + { + return getArrayLength(array) == 0; + } + + /***********************************************************************/ + public static boolean isNotEmpty(Object[] array) + { + return !isEmpty(array); + } + + /***********************************************************************/ + public static boolean isEmpty(List list) + { + return (list == null || list.size() == 0); + } + + /***********************************************************************/ + public static Object ternary(boolean test, Object ifTrue, Object ifFalse) + { + return test ? ifTrue : ifFalse; + } + + /***********************************************************************/ + public static Object get(Object[] array, int index) + { + return getArrayLength(array) > index ? array[index] : null; + } + + /***********************************************************************/ + public static Object get(List list, int index) + { + return list == null ? null : list.get(index); + } + + /***********************************************************************/ + public static void throwError(String errorString) + { + throw new Error(errorString); + } + + /***********************************************************************/ + public static void throwError(Throwable t) + { + throw ObjectUtils.throwAsError(t); + } + /***********************************************************************/ + /***********************************************************************/ +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/parser/PercentageAmount.java b/src/main/java/com/spun/util/parser/PercentageAmount.java new file mode 100644 index 0000000..9c4c89c --- /dev/null +++ b/src/main/java/com/spun/util/parser/PercentageAmount.java @@ -0,0 +1,61 @@ +package com.spun.util.parser; + +import com.spun.util.NumberUtils; + +public class PercentageAmount extends TemplateDouble +{ + /************************************************************************/ + public PercentageAmount(double amount) + { + super(amount, "", "%", 0, 2); + } + /************************************************************************/ + public static PercentageAmount createFromRatio(double a, double b) + { + return new PercentageAmount(getAmount(a, a + b)); + } + /************************************************************************/ + public static PercentageAmount createFromFraction(double a, double b) + { + return new PercentageAmount(getAmount(a, b)); + } + /************************************************************************/ + private static double getAmount(double a, double b) + { + double amount = NumberUtils.equals(b, 0, 0.00001) ? 1 : (a / b); + return amount; + } + /************************************************************************/ + public PercentageAmount getInverse() + { + return new PercentageAmount(1 - amount); + } + /***********************************************************************/ + public String inDefaultFormat() + { + return inFormat(amount * 100, "", 2, 0, "%", true); + } + /***********************************************************************/ + public String inIntegerFormat() + { + return inFormat(amount * 100, "", 0, 0, "%", true); + } + /***********************************************************************/ + public String inDefaultFormat(String prefix, int precision, int minimumPrecision, String postfix, + boolean useGrouping) + { + return inFormat(amount * 100, prefix, precision, minimumPrecision, postfix, useGrouping); + } + /************************************************************************/ + public String toString() + { + return inDefaultFormat(); + } + /************************************************************************/ + public String withoutPostfix() + { + return inFormat(amount * 100, null, 6, 0, null, false); + } + /************************************************************************/ + /************************************************************************/ +} diff --git a/src/main/java/com/spun/util/parser/TemplateNumberUtils.java b/src/main/java/com/spun/util/parser/TemplateNumberUtils.java new file mode 100644 index 0000000..7f346d0 --- /dev/null +++ b/src/main/java/com/spun/util/parser/TemplateNumberUtils.java @@ -0,0 +1,105 @@ +package com.spun.util.parser; + +import org.lambda.query.Query; + +import com.spun.util.NumberUtils; + +public class TemplateNumberUtils +{ + public static TemplateNumberUtils INSTANCE = new TemplateNumberUtils(); + /************************************************************************/ + private TemplateNumberUtils() + { + } + public static boolean isZero(double d) + { + return isZero(d, 0.005); + } + /***********************************************************************/ + public static boolean isZero(Number d) + { + return d == null || isZero(d.doubleValue(), 0.005); + } + /***********************************************************************/ + public static int asInt(Number d) + { + return d == null ? 0 : d.intValue(); + } + /***********************************************************************/ + public static boolean isZero(double d, double delta) + { + return NumberUtils.equals(0, d, delta); + } + /***********************************************************************/ + private int getScaling(double have, double max, double scale) + { + if (max == 0) + { + throw new Error("Maximum cannot be zero"); + } + else + { + return (int)((have * scale) / max); + } + } + /***********************************************************************/ + public int getScaling(Integer have, Integer max, Integer scale) + { + return getScaling(have.doubleValue(), max.doubleValue(), scale.doubleValue()); + } + /***********************************************************************/ + public static double doArithmetic(int arg1, String operation, int arg2) + { + return doArithmetic(new String[]{"" + arg1, operation, "" + arg2}); + } + /***********************************************************************/ + public static double doArithmetic(String[] params) + { + if (params == null || params.length == 0) { return 0.00; } + double totalNumber = 0; + double currentNumber = 0; + char operator = '+'; + for (int i = 0; i < params.length; i++) + { + if (i % 2 == 0) + { + currentNumber = NumberUtils.load(params[i], 0.00); + switch (operator) + { + case '+' : + totalNumber = totalNumber + currentNumber; + break; + case '-' : + totalNumber = totalNumber - currentNumber; + break; + case '*' : + totalNumber = totalNumber * currentNumber; + break; + case '/' : + totalNumber = totalNumber / currentNumber; + break; + case '%' : + totalNumber = totalNumber % currentNumber; + break; + default : + throw new Error("Unknown arithmetic operator " + operator); + } + } + else + { + operator = params[i].charAt(0); + } + } + return totalNumber; + } + /************************************************************************/ + /************************************************************************/ + public static TemplateDouble max(Number... numbers) + { + return new TemplateDouble(Query.max(numbers)); + } + public static TemplateDouble max(Number n1, Number n2, Number n3) + { + return max(new Number[]{n1,n2,n3}); + } +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/parser/TemplateStringUtils.java b/src/main/java/com/spun/util/parser/TemplateStringUtils.java new file mode 100644 index 0000000..d031884 --- /dev/null +++ b/src/main/java/com/spun/util/parser/TemplateStringUtils.java @@ -0,0 +1,177 @@ +package com.spun.util.parser; + +import java.io.File; + +import com.spun.util.StringUtils; + +public class TemplateStringUtils +{ + public static TemplateStringUtils INSTANCE = new TemplateStringUtils(); + /************************************************************************/ + private TemplateStringUtils() + { + } + /***********************************************************************/ + public String truncate(String onString, int maxLength) + { + return truncate(onString, maxLength, new String[]{}); + } + /***********************************************************************/ + public String plural(int number, String singular, String plural) + { + return String.format("%s %s", number, (number == 1 ? singular:plural)); + } + /***********************************************************************/ + public String truncate(String onString, int maxLength, String minus1, String minus2) + { + return truncate(onString, maxLength, new String[]{"", "", minus1, minus2}); + } + /***********************************************************************/ + public String truncate(String onString, int maxLength, String minus1) + { + return truncate(onString, maxLength, new String[]{"", "", minus1}); + } + /***********************************************************************/ + private String truncate(String onString, int maxLength, String minus[]) + { + if (onString == null || onString.equals("null")) { return ""; } + for (int i = 2; i < minus.length; i++) + { + maxLength -= minus[i] != null ? minus[i].length() : 0; + } + maxLength = (maxLength < 0) ? 0 : maxLength; + return StringUtils.truncate(onString, maxLength); + } + /************************************************************************/ + public static String clearNull(String value) + { + return clearNull(value, ""); + } + /************************************************************************/ + public static String clearNull(Object value, String replacingValue) + { + return (("null".equals(value) || value == null) ? replacingValue : value.toString()); + } + /************************************************************************/ + /** + * Compare if arg [0] equals any other argument starting at [1]. + * @param params + * @return + **/ + private boolean isIn(String[] params) + { + for (int i = 1; i < params.length; i++) + { + if (params[0].equals(params[i])) { return true; } + } + return false; + } + /************************************************************************/ + /** + * Compare if arg [0] equals any other argument starting at [1]. + * @param params + * @return + **/ + public static boolean isIn(String compare, String inParameter1, String inParameter2) + { + return StringUtils.isIn(compare, new String[]{inParameter1, inParameter2}); + } + /***********************************************************************/ + public static boolean isIn(String compare, String inParameter1) + { + return StringUtils.isIn(compare, new String[]{inParameter1}); + } + /***********************************************************************/ + public static String pad(String original, int length, String paddingCharacter) + { + original = original == null ? "" : original; + int paddingNeeded = length - original.length(); + StringBuffer buffer = new StringBuffer(original); + for (int i = 0; i < paddingNeeded; i++) + { + buffer.append(paddingCharacter); + } + return buffer.toString(); + } + /***********************************************************************/ + private boolean isNull(String main) + { + return !StringUtils.isNonZero(clearNull(main)); + } + /***********************************************************************/ + public String getFileName(String fileName) + { + return fileName.substring(fileName.lastIndexOf(File.separatorChar) + 1); + } + /***********************************************************************/ + public static String formatExcelString(String in) + { + if ("0".equals(in) || "null".equals(in) || in == null) // So that null's & int(0) show up empty + { + return "\"\""; + } + else if (in.indexOf('\"') == -1) + { + return '\"' + in + '\"'; + } + else + { + StringBuffer buffer = new StringBuffer(); + buffer.append('\"'); + for (int i = 0; i < in.length(); i++) + { + char c = in.charAt(i); + buffer.append((c == '\"') ? "\"\"" : "" + c); + } + buffer.append('\"'); + return buffer.toString(); + } + } + /************************************************************************/ + public static int getLength(String s) + { + return s == null ? 0 : s.length(); + } + /************************************************************************/ + public String toHTMLEncode(String string) + { + return StringUtils.toHTMLEncode(clearNull(string)); + } + /************************************************************************/ + public String toURLEncode(String string) + { + return StringUtils.toURLEncode(clearNull(string)); + } + /************************************************************************/ + public static String toJavaScriptEncode(String string) + { + return StringUtils.toJavaScriptEncode(clearNull(string, null)); + } + /************************************************************************/ + public static String toJavaScriptEncode(Number n) + { + return n == null ? "null" : n.toString(); + } + /************************************************************************/ + public static String toJavaScriptEncode(Object n) + { + if (n == null) + { + return "null"; + } + else if (n instanceof Number) + { + return toJavaScriptEncode((Number) n); + } + else + { + return toJavaScriptEncode(n.toString()); + } + } + public static String asXml(String s) + { + return StringUtils.escapeForXml(s); + } + /************************************************************************/ + /************************************************************************/ +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/velocity/StringResourceLoader.java b/src/main/java/com/spun/util/velocity/StringResourceLoader.java new file mode 100644 index 0000000..c6e6a7a --- /dev/null +++ b/src/main/java/com/spun/util/velocity/StringResourceLoader.java @@ -0,0 +1,55 @@ +package com.spun.util.velocity; + +/* + * Copyright 2001-2002,2004 The Apache Software Foundation. + * + * 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. + */ +import java.io.InputStream; + +import org.apache.commons.collections.ExtendedProperties; +import org.apache.velocity.exception.ResourceNotFoundException; +import org.apache.velocity.runtime.resource.Resource; +import org.apache.velocity.runtime.resource.loader.ResourceLoader; + +import com.spun.util.StringUtils; + +/** + * This is a simple resource loader that loads the string as a template + * + **/ +public class StringResourceLoader extends ResourceLoader +{ + /***********************************************************************/ + public boolean isSourceModified(Resource resource) + { + return true; + } + /***********************************************************************/ + public long getLastModified(Resource resource) + { + return 0; + } + /***********************************************************************/ + public synchronized InputStream getResourceStream(String name) throws ResourceNotFoundException + { + return StringUtils.convertToInputStream(name); + } + /***********************************************************************/ + public void init(ExtendedProperties arg0) + { +// My_System.event("initialize"); + } + /***********************************************************************/ + /***********************************************************************/ +} diff --git a/src/main/java/com/spun/util/velocity/VelocityParser.java b/src/main/java/com/spun/util/velocity/VelocityParser.java new file mode 100644 index 0000000..37ea0bd --- /dev/null +++ b/src/main/java/com/spun/util/velocity/VelocityParser.java @@ -0,0 +1,189 @@ +package com.spun.util.velocity; + +import java.io.File; +import java.io.StringWriter; +import java.io.Writer; +import java.util.Enumeration; +import java.util.Properties; + +import org.apache.log4j.Level; +import org.apache.log4j.LogManager; +import org.apache.log4j.Logger; +import org.apache.velocity.Template; +import org.apache.velocity.VelocityContext; +import org.apache.velocity.app.VelocityEngine; +import org.apache.velocity.context.Context; +import org.apache.velocity.runtime.RuntimeConstants; +import org.apache.velocity.runtime.log.NullLogSystem; + +import com.spun.util.Asserts; +import com.spun.util.ObjectUtils; +import com.spun.util.io.FileUtils; +import com.spun.util.parser.ParserCommons; + +public class VelocityParser +{ + private static VelocityEngine currentEngine = null; + /***********************************************************************/ + static + { + for (Enumeration e = LogManager.getCurrentLoggers(); e.hasMoreElements();) + { + ((Logger) e.nextElement()).setLevel(Level.OFF); + } + } + /***********************************************************************/ +// public static String parseFile(String template, ContextAware process) +// { +// Asserts.assertFileExists("Velocity template", template); +// Properties props = new Properties(); +// int pathBreak = template.lastIndexOf(File.separatorChar); +// pathBreak = pathBreak == -1 ? template.length() : pathBreak; +// String path = template.substring(0, pathBreak); +// String file = template.substring(pathBreak + 1); +// props.put("resource.loader", "file"); +// props.put("runtime.introspector.uberspect", TestableUberspect.class.getName()); +// props.put("file.resource.loader.path", path); +// props.put("velocimacro.context.localscope", "" + true); +// props.put("velocimacro.permissions.allow.inline.local.scope", "" + true); +// return parse(file, props, new ContextAware[]{process, Default.INSTANCE}); +// } + /***********************************************************************/ +// public static String parseJar(String template, ContextAware process) +// { +// Properties props = new Properties(); +// props.put("resource.loader", "class"); +// props.put("class.resource.loader.description", "Velocity Classpath Resource Loader"); +// props.put("class.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); +// props.put("class.resource.cache", "" + true); +// props.put("runtime.introspector.uberspect", "com.spun.util.velocity.TestableUberspect"); +// props.put("velocimacro.context.localscope", "" + true); +// props.put("velocimacro.permissions.allow.inline.local.scope", "" + true); +// return parse(template, props, new ContextAware[]{process,Default.INSTANCE}); +// } + /***********************************************************************/ + public static String parseString(String template, ContextAware process) + { + Properties props = new Properties(); + props.put("resource.loader", "class"); + props.put("class.resource.loader.class", StringResourceLoader.class.getName()); + props.put("velocimacro.context.localscope", "" + true); + props.put("runtime.introspector.uberspect", TestableUberspect.class.getName()); + props.put("velocimacro.permissions.allow.inline.local.scope", "" + true); + return parse(template, props, new ContextAware[]{process,Default.INSTANCE}); + } + /***********************************************************************/ +// public static String parse(String template, Properties props, ContextAware process) +// { +// +// return parse(template, props, new ContextAware[]{process,Default.INSTANCE}); +//} + /***********************************************************************/ + public static String parse(String template, Properties props, ContextAware[] process) + { + StringWriter out = new StringWriter(); + parse(template, props, process, out); + return out.toString(); + } + /***********************************************************************/ + public static Writer parse(String template, Properties props, ContextAware process[], Writer out) + { + try + { + props.put("directive.foreach.counter.initial.value", "0"); + props.put(RuntimeConstants.RUNTIME_LOG_LOGSYSTEM_CLASS, NullLogSystem.class.getName()); + VelocityEngine engine = initializeEngine(props); + VelocityContext context = new VelocityContext(); + Template velocityTemplate = engine.getTemplate(template); + for (int i = 0; i < process.length; i++) + { + if(process[i] != null) process[i].setupContext(context); + } + velocityTemplate.merge(context, out); + return out; + } + catch (Exception e) + { + throw ObjectUtils.throwAsError(e); + } + } + public static synchronized VelocityEngine initializeEngine(Properties props) throws Exception + { + if (currentEngine == null || isDifferentForProperties(props, currentEngine, new String[]{"resource.loader", "file.resource.loader.path"})) + { + currentEngine = new VelocityEngine(); + currentEngine.init(props); + } + return currentEngine; + } + /***********************************************************************/ + private static boolean isDifferentForProperties(Properties props, VelocityEngine velo, String[] keys) + { + for (int i = 0; i < keys.length; i++) + { + String key = keys[i]; + if (!ObjectUtils.isEqual(props.get(key), velo.getProperty(key))) { return true; } + } + return false; + } + /***********************************************************************/ + /** + * Parse a File to a File + **/ +// public static String parseFile(String templateFileName, String outputFileName, ContextAware process) +// { +// return parseFile(templateFileName, new File(outputFileName), process); +// } + /***********************************************************************/ + /** + * Parse a File to a File + **/ +// public static String parseFile(String templateFileName, File outputFile, ContextAware process) +// { +// try +// { +// String output = parseFile(templateFileName, process); +// FileUtils.writeFile(outputFile, output); +// return output; +// } +// catch (Exception e) +// { +// throw ObjectUtils.throwAsError(e); +// } +// } + /***********************************************************************/ +// public static class FileParseCall implements ParseCall +// { +// public static FileParseCall INSTANCE = new FileParseCall(); +// public String parse(String template, ContextAware process) +// { +// return parseFile(template, process); +// } +// } + /***********************************************************************/ +// public static class JarParseCall implements ParseCall +// { +// public static JarParseCall INSTANCE = new JarParseCall(); +// public String parse(String template, ContextAware process) +// { +// return parseJar(template, process); +// } +// } + /***********************************************************************/ + public static class Default implements ContextAware + { + public static ContextAware INSTANCE = new Default(); + public void setupContext(Context context) + { + context.put("commons", ParserCommons.INSTANCE); + } + } + /***********************************************************************/ + /***********************************************************************/ + public static String parseFromClassPath(Class clazz, String string, ContextAware context) + { + String resource = FileUtils.readFromClassPath(clazz, string); + return parseString(resource, context); + } + +} diff --git a/src/main/java/org/lambda/query/Query.java b/src/main/java/org/lambda/query/Query.java deleted file mode 100644 index bd887a8..0000000 --- a/src/main/java/org/lambda/query/Query.java +++ /dev/null @@ -1,79 +0,0 @@ -package org.lambda.query; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; - -import org.lambda.functions.Function1; - -public class Query -{ - public static List select(List list, Function1 function) - { - ArrayList out = new ArrayList(); - for (In i : list) - { - out.add(function.call(i)); - } - return out; - } - public static List select(In[] list, Function1 function) - { - return select(Arrays.asList(list), function); - } - public static List where(Iterable list, Function1 funct) - { - ArrayList out = new ArrayList(); - for (In i : list) - { - if (funct.call(i)) - { - out.add(i); - } - } - return out; - } - public static List where(In[] list, Function1 funct) - { - ArrayList out = new ArrayList(); - for (In i : list) - { - if (funct.call(i)) - { - out.add(i); - } - } - return out; - } - public static Double average(List list, Function1 f1) - { - double total = 0.00; - for (In in : list) - { - total += f1.call(in).doubleValue(); - } - return total / list.size(); - } - public static Double sum(In[] list, Function1 f1) - { - return sum(Arrays.asList(list), f1); - } - public static Double sum(Collection list, Function1 f1) - { - double sum = 0; - for (In in : list) - { - sum += f1.call(in).doubleValue(); - } - return sum; - } - public static Double sum(Collection list) - { - return sum(list, new Echo1()); - } - public static Double sum(Out[] list) - { - return sum(list, new Echo1()); - } -} diff --git a/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.testHtmlDisplay.received.html b/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.testHtmlDisplay.received.html new file mode 100644 index 0000000..5ccdb7b --- /dev/null +++ b/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.testHtmlDisplay.received.html @@ -0,0 +1,702 @@ +
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Blues
Navy
DarkBlue
MidnightBlue
MediumBlue
Blue
TealGreens,
DarkSlateBluePurples,
DarkCyanGreens,
SteelBlue
RoyalBlue
SlateBluePurples,
CadetBlue
DarkTurquoiseGreens,
DodgerBlue
DeepSkyBlue
MediumSlateBluePurples,
MediumTurquoiseGreens,
CornflowerBlue
TurquoiseGreens,
Aqua
Cyan
SkyBlue
LightSkyBlue
AquamarineGreens,
LightSteelBlue
LightBlue
PowderBlue
PaleTurquoiseGreens,
LightCyan
AliceBlueWhites,
AzureWhites,
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Browns
Maroon
SaddleBrown
Brown
Sienna
DarkGoldenrodYellows,
Chocolate
Peru
GoldenrodYellows,
RosyBrownPurples,
SandyBrown
Tan
BurlyWood
Wheat
NavajoWhite
Bisque
BlanchedAlmond
Cornsilk
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Grays
Black
DarkSlateGray
DimGray
Gray
SlateGray
LightSlateGray
DarkGray
Silver
LightGray
Gainsboro
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Greens
DarkGreen
Green
ForestGreen
DarkOliveGreen
Lime
Olive
TealBlues,
SeaGreen
DarkCyanBlues,
OliveDrab
LimeGreen
MediumSeaGreen
LawnGreen
LightSeaGreen
Chartreuse
SpringGreen
MediumSpringGreen
YellowGreen
DarkTurquoiseBlues,
DarkSeaGreen
GreenYellow
MediumAquamarine
MediumTurquoiseBlues,
TurquoiseBlues,
LightGreen
PaleGreen
AquamarineBlues,
PaleTurquoiseBlues,
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Oranges
OrangeRedReds,
DarkOrange
Orange
TomatoReds,
Coral
LightSalmonReds,
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Pinks
MediumVioletRedPurples, Reds,
DeepPink
PaleVioletRedPurples, Reds,
FuchsiaPurples,
HotPink
LightPink
Pink
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Purples
Indigo
Purple
DarkSlateBlueBlues,
DarkMagenta
MediumVioletRedReds, Pinks,
DarkViolet
SlateBlueBlues,
BlueViolet
DarkOrchid
MediumSlateBlueBlues,
RosyBrownBrowns,
MediumPurple
PaleVioletRedReds, Pinks,
MediumOrchid
FuchsiaPinks,
Magenta
Orchid
Plum
Violet
Thistle
Lavender
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Reds
DarkRed
FireBrick
Red
Crimson
OrangeRedOranges,
MediumVioletRedPurples, Pinks,
IndianRed
TomatoOranges,
PaleVioletRedPurples, Pinks,
Salmon
LightCoral
DarkSalmon
LightSalmonOranges,
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Whites
AntiqueWhite
MistyRose
Beige
Linen
OldLace
Honeydew
WhiteSmoke
Seashell
LavenderBlush
AliceBlueBlues,
FloralWhite
MintCream
AzureBlues,
Ivory
GhostWhite
Snow
White
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Yellows
DarkGoldenrodBrowns,
GoldenrodBrowns,
Gold
DarkKhaki
Yellow
Khaki
PaleGoldenrod
PeachPuff
Moccasin
PapayaWhip
LemonChiffon
LightGoldenrodYellow
LightYellow
diff --git a/src/test/java/org/teachingextensions/logo/tests/VirtualProctorTest.java b/src/test/java/org/teachingextensions/logo/tests/VirtualProctorTest.java index f11969f..060f043 100644 --- a/src/test/java/org/teachingextensions/logo/tests/VirtualProctorTest.java +++ b/src/test/java/org/teachingextensions/logo/tests/VirtualProctorTest.java @@ -9,7 +9,7 @@ public class VirtualProctorTest extends TestCase public void testSetName() throws Exception { VirtualProctor.internals.resetName(); - assertEquals("WIN-J2264SMJD6Q", VirtualProctor.internals.getName()); +// assertEquals("WIN-J2264SMJD6Q", VirtualProctor.internals.getName()); VirtualProctor.setName("Lynn"); assertEquals("Lynn", VirtualProctor.internals.getName()); } diff --git a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/AdLibsQuizTest.testCorrect.Mac_OS_X.received.png b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/AdLibsQuizTest.testCorrect.Mac_OS_X.received.png new file mode 100644 index 0000000000000000000000000000000000000000..39d022b06aebc920befa56f3ddd1e2da155e677a GIT binary patch literal 16768 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 H@Y#O>lFa3A literal 0 HcmV?d00001 diff --git a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/AdLibsQuizTest.testIncorrect.Mac_OS_X.received.png b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/AdLibsQuizTest.testIncorrect.Mac_OS_X.received.png new file mode 100644 index 0000000000000000000000000000000000000000..28559b92e74224d0623bb5009a8e0c55df79d426 GIT binary patch literal 12662 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 Z^5!MM7n+s^yf-3{d!_uc=*8QQ{~xFa>8k($ literal 0 HcmV?d00001 diff --git a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/QuizBuzzTest.testCorrect.Mac_OS_X.received.png b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/QuizBuzzTest.testCorrect.Mac_OS_X.received.png new file mode 100644 index 0000000000000000000000000000000000000000..84a83092395d9024fbfc6b87704e7d6905e4474d GIT binary patch literal 14935 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 literal 0 HcmV?d00001 diff --git a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/QuizBuzzTest.testIncorrect.Mac_OS_X.received.png b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/QuizBuzzTest.testIncorrect.Mac_OS_X.received.png new file mode 100644 index 0000000000000000000000000000000000000000..28559b92e74224d0623bb5009a8e0c55df79d426 GIT binary patch literal 12662 zcmc(Gc~q0v);HEFwpJ|;pfV{`Q4wfVW&(8r6@gl04xovE%*HT7pmjtdpdutPrHUpp z%S;F)4upsVB4Y?4L>UqT2>}8L5JInUW=pL3qGfBW~_ zx%0E5-G*;>eygOUwBhur6Tc`aeT7g`T18y97HD}svgM4D5(s?y#L@FH144En=6r9{ zROsU!+aBFNr*cx|d*!t%C)U_q`DyDnPo4~i{Jb@F=T_>z1Mr`|afBb+kOJL&g7V$? zo#PtNCwm=1K@T#fV>x07gV3>X#X7G9FDJ%_7k>)6{Nm_K*&F1u;vi9xw_mWLvd@QD z+Ydz-DM2>^b5j1?{5>$&Wb@C>U-nvQ{-W2) z%m3`P()`C*f4uz9vHocO!o-TjKY9VpUz+%$*Glsjz5Z0O;A7$t1gK3 zcpe$p8Dy_W+|5-odH4;_&>nBJNak1HRQQIT=w&B;2;6i@O0QoQ6(Sjl6T&&7=!IK$ z!a^}KIMXt5NO|rnak0tl3;PsU@a3G1Y#DyP+j7xxlLmrm)a9xfUn(83 z8uN>WH^H&LDL;Kf_sw5U7>pirFz~EtuMKSSqaN`eFbEtsCOhH>CFqEV{hn*@T2~yT z#XZyYx5?l)2*a4jrnLgMLAUP8$R>u6%rH%12*Fn%6c}=?CT1XVGGkeT`hxnns=E^* zFWq_&i!Wrz_gZFQzV+#bQ)Yb=zXM*+0n=5g+#Y`Q%v;i^n@-xR89%1}45`RYYZ{)b zo~W<-rOLm(3Rx$357vxnInHm+v2KMThU*e52Qd2SALP2YOH!f5q+mcsl4?_A9xl!a zwIlw6IjLnW!4%#WX?ph65sM}tD@I|RLN~rF93qaAK)_Lh#BszNJ2at|eGa_@p#cYh zbilwXJaf&NrQO!kIF4GrlVf{ZAPX{KKjNn- z-y04p=9cM&HYb@Uu)?SIz6T|!bFcWE<%61W9k7YnxZZsI4nN2oVIXqIBtB$jka2*6 z#~i1v3W>4Yh=qV$RC!&!>PPjLf1~T}!TDC%Na~i2)jxWoF{m}$7pgB2l4}y+ys zD0*-tul1xLa-3j4Uc3A==r(5ce32&nV--bvbcUiFJK9`5p;i#2iwcENxDCw^tu^tE z^R9dXr&ukLHLHHV6i2g5_N)$Zt_X*v6Wh@0h{r>gnFDc%6-HtsH=rO^ilHQe+P=~NG%`($GwJj8uy^n|!| zK%F(b?R&&a#_P8*lJnA0Lvqq=&q7W2eK(TFpc;DUZCxtAYvx08VOL8UEt50UFd+#P z!OF|s6F`gVVicd_V&v9^8423Qok8k;keE*r=LC_ny*1qp3^M1_n(yKK2TL{36NZzl zsHvlV)WelS)(#6ylfB%X;<(g1gzNOhqfPUMb&A=O^1NffE*=D-owPgLr=%gBM+fV~ z&qv5+ijd+CW)OABs@RNouy((8X`w0tq@xB`(Hm7e%6JxDK@U@=7saH_Y)_eZBusp} zCe^HL9AtV~(VcR?&cJf^xmnrvzys+o5*`|8rvekLgq6#_yQLi)tBQr;*q(QlYKMxP zuRB*cOf$K>%_dtfq#~PInjvSw)aQ`NdsXCQqWd>Q@$)T9mNzl0``w|2IzM2q-QAW4 z3Nl8@@l0WTav0nr&E9w4>piZw@+D1*q#6(!dtG(?`eCb@`UE?9<8)lb;^Aw$*lVdu zJEGr#AI-<+Xxf%c*Y8Xr)DPOq8}$aK&Z&AAkm1fz;2QT=J5a}F+ESWR=x_X&pVv1v z*k?4yzx5TVyOF(@Aae84a=MA_n;E*H?Gac?oVRbd1IR6WPdS1Mgf8`P+E`MFuFgAr z*Km3gWKoxco6)9pA2UAkE~M3%$_MHcvYxMy86NYCD_oLH5NtG{b!y;$9VL7i(clP8et zA*Ud}nh#%z+}*Pk8)`+ruLgF5Jo&*8R8>~4$9<`+6oP}Escfqy`Y{5FB{8|mXe6xJ zGeOf$u;pSO$%_oFIBKk7P;vDT?l41A@2Y2bbMr;D&ie7WDd^Wmq#dwcv8?Zhw3-2N zXfojUVVH3!&d;WeY#VBwFKPi264A0F&>`R;Nv34BJY zuqwQ@&#&(GB6|%;Iibn8yzsOgHa5(2k!XX*Tg&4={>DhmvDLD=cwMWlw9WTabkmf- z#pQR?6l7B^=dl?MZs+7JqP{PQ6-V?LoBEYY`-xanrdaNFx@cHzD8;iy zNuEVHgJBao8OiVTP5Px#I;Vn2GW0mdCD{sCxJxJU%AgyYHGV1!rVsI_Ir9DM(e|oC zzJr`1hnxr=-G@Gzt_bZb@fhza2xyq>)b^X9rV1fo@^K)pt~PL z+t}CH$WRgUr||*0KGXBRtHk5=C%qm_#*gLAewYy9)w9Y@$uvwr?WD1e*-_=BRv&R0 zmV6%^(Cl(n!7Z<7d#}PoR0nf*tAkN6ubB=!pQ|lDq8THoPT4<_fbHB8gq6vR$Ql0Z z2)ps_Bwp_=;hcRIK3*YYFyYP9rjazZcW6Ylp#b`Dl58(OH-ma`df_~xwJlPjf&ie| zRTYbceLY&R7FR11KkiKmOa%#+N%X@uG2_qHI^_DIIgAEjmd9*+ynru|NE2r~8)7~p zPaaIOkv|kzRqG9v=XIoZl8d$DbWj!R!+aicZRQd@C7qlUl?qBY@}VJ7_OXYAKo1++ zYFs&0R2X*@GQ^ zw=#Qrz>>h$i9HIBXjziIt?M0AkTP`RE`-2bZR`DR7*VLN#R?xDH5v}>!Prs;KTX^D z+t@5hL{%yc{oGOeav;tqwXFtyRqk9jNr7GmOEnoEj!YDR(AsV%JgwhlIc>8`piE?m z5U+0{ez|Sv-OXfl(8ClTOp{I-c-DqIz)bWNJ4y22l`fi>@pB2W@O+=U?pdKM{Akj+ z7FL)06Rl!lVQE3#L|q=6Sfi6Y^NCrj_%($J9jIKY0Itj2a5UBP;H7n-%0k;lRCAxN%`T6e+Nsw0S@(9|@-lCf%8!n6LpxNvdk zT7h|E5N(5Y{FMwU#EO1VFW+;w?L?m>moU9YQ52ux(Yj`jVk>ZPzDEox2X{pkM=|%D zstkNTW^`%&`pQ6(+)}OB!pM8}Lg@L(aY$~GDvwM--aeb>qk`Dth&gxSXI^N7Tchj2 zgyc^}ft`nl8fPGFh8>SkLQ&EjJ0wTu8*fC^?9SXk8T{DoRIIriFG^=_4GlrO1UaKZ zYbW~yuTvn-2EW!9Oje|~P0CKtegiNL;D1a1Y3GzvsB`tP>E&;6C#pKjdA_A)$_H^L z#eqHU&l&`8$ga&0R+JY$-e=K8AWY4~`wC1$YUT?)Z!1%SMDZIzREcY;>aV~C#x$v8V@$jj zvh&bxaY=B?W|@~S$h08j)thSuK}Ktrj8+aTh=+XdUh%;AT5-Y{FV!B~`nnK0H!-hk zUm=N-#GLR-gtGwvljE}-br#JLpQ0cr-}bF5-QJ0!sEj$6ASOL?Eu#2YLSlDVygzzv ztI@fu?ZbM-w>(1BKpt|d=?yCI(+`ZcAk+-%@k8cU2nk!SAe#qW_vlYR4Y5JXD9maA zU5TyTy;Kf@cA|Y>>#FX(Q9lVGIh?)Ua@jlAuC9R>#4K`AjRN_3$$KwMC%}D}QI^67 zsiVdb8s71e1FE)1Vmby)*v{mmME`C|&Kn-b6521?oowEmD}9BA50;=%ozKm}4F!=O z9$TybMEh;sW<<_4_uqdU%c-hDO}C8M3@=_;E!obkTGgzPybGiZB$Yrq2u*7@zm{zp zoD~$5?dIOyI{w%rb9pDis+g3IS^X336*~EMv6I#FA%;KOEPiGuR(j)&T^~#Ib~)O2 zBr%%y$TdX4d>312PmKa19Y}d%=h1jk?eV64vN~mQO$*Qa3cn{#<{jB_KUkwZKAt}a zm1Ra_!!ND$_1$~Tvo7eqwa;{3+{M0v;M={E((yOwK32ej=3zG?{iSA{Ylw}sL>I_} zp&LmdUxVfB!xJ}|PghGquE_G)7CkKMrH{-BXI7tq`k-jGRpuI!^zyCuAKkrwL<&1{ zEUyYCU0{X+xP6jFf_we@pK0v)xzjGv9TgLjZLD@{{)LsLypBuxJ&4z?8TnFc zt~Quc<`8xI{w=7XYq5#{f#}g79PG2bzC+iF@=T-OtfBU>!UV~ywy~B*hnRDc30ARv z({g^}m|%E%Q0ff-QLX$X-0Fg{DIN6rvFw=P5{?>WW?nIP4fbsq~nI_`>`*$`=pcos%m$y;lqm9{D6X3q(!svZzfrFjSjEM<) zqr5MLzH4xK*vn%uk;#*nKR8d}rS?bjDuqt_`L0p%PdFF9M}&|-44g~btSq3cIB5ui z1{M_zZ}XtQqC3F5a}2#Bv7%hlLMRp;6#IjL zY^t0&ed3ad3vHQj>Et8XPO<1}ZhmF{!~ zc(H)C@%pVxtPMMiarH*ntWY*C)Pny&ze|(el$+Hk^H8T8t5$1A7yTcU6> zpIANc{GyD1>zRI+^=*fq))D< z(+O_}RF=bLM6{c_X6bt3_GdEDgQSN`PcHpp-3ytynui1~4s((ZNKOB&TPh)zmjoXg zeDMldY|HFkPcN-kbZ3eWlQiCW8|VAvp>48fkXS@z3Fr8S*DR6u+2AiIHT zZ4lcuYBLe02ycCRV0teAFs6-D2*AhP6r(sv83{n=X-nnlWv7iJ3-sKQ5YVP&39~9m zc-avjwN1*2q}-WUM!rbYi0@c)a&)#oOqN2GV$_Xs=Rl@$OZS=dbkedcnmeDzHrC9#*JGTb<_>G@*+9Xo*m*W{dvL+oq_E9oZ+3>4}icL#Fxj=DCO zf$E_fm^1BmES-TFA$I-)r+djyzY3PzS=-VA(Yjsn<8IDgoUb@^af1dV94k=tYs8&^ z`|>8it};S(XkBE(7}bVeo2v3AtJKrQ_pt@^eAAjOu^5xB2od_=fedQ@jR#|U6zBFx zKA*G}P~G@fw`arvu^`Cvb5oVJTYN-qVap;!=fkneGwzC zu;2*VSb4>jF@1^&2$>Up_yYZ-3oLBD|GN4%1l-!^ESt+)AJ!euT3eUOGZ!>F>o;F! z59A*K!zRg^6{)~gh46O+ASOkM^VIgcpN>gOeGqnk1(=3SV^gOYx?4A5M zd1mSv1xZerWvL60?`H?XdJTzRpC&;MAKQyskXz#Il9o?LDW0LUN>Ym)^H5^?@KRm9 z=w4yBJ~Zt0H-}UB9UZKQ@|aTh`R_Zot^a2D>OMFj-7LVcmaOQF4z^4AU*TIG%n)}9 z_R%(E%TYB(eQ*&yE)o=N$A)R6+0r|oL5jZP)$*%DgX^Wf4;{^*qT#3#A9kg~*!f>_ z*Vm0FDht6ch9&KsY#pu%9H!^6U&p}qBNt54$=Td)OU_TK8P<4#QEkVcgJlLK^3woF z6*rTQPIUR&GZ(LlUZ@YHpqM(>+<)7t?*gj{&MjB7q1K`~vdfYs9=rbc?M&42a6+BS zn-cHaX_TJOk{e+DFd=X{N87&+RufdC6cR$Ce9KD6NoKm=xNpg&iTk{0?fbl@UR*#8 zpjIjDKX1df0;AGmtZCgP`3?%*h6M9(T6V-XhBqOz(6wG{$_>gOZog}#?Ul^(rA9da zu!ot;lJ@m!yDX?sD40&JO|F{3phDy3SQV0;p?>sj`tG{b&=W?gb`PB@Itan=@&0E~ zMTvN}f9 za%T$r$SdDqGU4i&Z<9;=Sb&yKIQH@N#j+@DklHR)L{2TH_HJkW(q=8-OKOhf&4fZz zj@V9Qmwvo@q~h|f*M_)|HuBDc`9>Z3tT4QH<^9H6X$8S_AIj_GwR8^_E`HqfG9#oR z1~I=BZ}*)H{51eNi@8rSHhF|T)U=2LQk&sxuX}B0uiB7BuQ$l8-4)QUixP@Je_+N} zZaWb0)cRfu1fAAvXOi!E#qqifav1Rh!}^Z$)y@5!+&lxNdxsPiFAX>ocWb^q0 zFhc-8J^k%mt=c<7oyH+{nM z+de-PyxQROm|}YJJS!kJv$y;oC=zt7sKRd@{GFwVQ>#VO$`C4Eb|t2 z_g0|kZf@fyKov>eC0Y%LHae$ht9Ai*^{QV#CnSLC@%_;u0N!pqaSy}#^mphKAKzk+ zD*r%YUesybjb=Xxqenr3Z--#n0>pO6p{FUUQv2)dT6H5O2FwP5JhFYFaVEy1>y_TTDJx3^pv?j9{z}$6d#1_zp6HWtu6lozb&BbBl|d zq=h^H9$C${C{G4~#(#SjxLC)n`3-hS5B+I`z3l)Ro1KqOqNN3VeCL*Z zkSm8&KA|B2ryN?7Exai}WCsi#{V&F41;qS!#wC?cH3Y}`Ki(3x{m2iju(!_v;(a0F z(u7H9_h~fb{$$MLSoJ8I-X)~Vbu<&Z_=O%~E_39%tst+gKKyipC^Ne2dN~;z=H8$q zMD#Zwk!4wSXJ{|&iEk$+%55dN`1U5l9C^Dh4E=Ce;jGio>03 znB%KevNn-)&&yHRk_?gz^TlxH~7HrFzEcB9H zX8)EI!mTLfeXH&duS=FHoQ;UJ?(I9e@qdjGcBP1U(70-=U;R6XrJaBTWxMd?28PsL zx8ntGst9D7Ab6FULb$4&G;#xqC0TANk;eQd!bYj@snAteX@Boh_wQ}KZ*kkJR@j>V zyNK_c1vh_KpXHr5z8S{(*k(uP~e{D}-Iq zZ9##oPzKX|l`h4@r0(*1Qa@f+i)66AO12!=lGO`HPAg!`gtPy&sI>>~ywfu9j7lKr zTT{{WHs-_2q?D?qe}(k%%1sJS6+|d2G;cDN?{@Nc%6Y%9J45w-&Y}_*+d|d^m7GuQ zErXMMmNZyCiK2qYV!OXX;oKp(&)y@~c_l81yJRuMerulqWSM{7x!MmGU#Zrpt(K!# z5;88){bl@&tgi>UC-`f(g?Dsyv~|W!XUaHZ+D`TUmQGc;s}`cdp*+zN2V{3ohY8R% z!8cs*exeK~&+P9rk2Y}BBu2DJ*nxH6Zh)dyL+>N_PiMHiIarIr98Aiezm;77Lu*3| zgtKaO75(=m^ARv4fhwIyJ!BF|3w5ci{IB@EPFvI}VhyAOwrx*sGy15qe#^0g-@dK8 zv%hP5DN6jwRSE%l@3^SuTs!7_XB%COmq}sxQ%?CDr*_r^ltV9`IIdF(jXQ!voDw;tyCeSIkh^Cov51T1t2fPYw){lu@B)8D z>X7w*#k|pW`>4xZ35n*w{M418j$nPX3OJ5+nD}U>OQ9Va z$lPecCfP=Qv`u4N-tmBi*N+Naid6yUR=Sm9)^GB*fn}r-GSYYES$mm_?5Q0@C!a@) z5`hl4S>sm>tUHD9qwqzONh`)OXmD}^3BM_yWMYsVf6QY1CAjKb9Y7@E9#K>6(>V#Q ziwS;n$RWjaZ(y5ADd~YUVm^`htc`A!P%}xo8rM6L_C2JVq|p#WTVi(Ppbzmpm@ABns?FY} z1d>Lk5vKa1>5!2WYU+Nj>ku-rSE^F%>UG3de1^T-QhFL|d3WjGRavuD6I{@6EGGy6FF5>c0A{_!Ck5^6W&d7f^ekuA$I!`7;ef z7VqLV4>nLB7*HVAL5CYPM2f#IdK@j?n3|X$Oa~W@BO03`$}p@Ou(DVO2a81-qPvT; zY!05A=B(e;C}AC$`S6YUtb3TZ{8+=pP1Ek9&S^%I6E({lDWFu#xbd~-Y1yg<-2lV7 z-zWMXxaJ?4QOlAgq;`4#9`?I1r&&(y_Xubh8#eg{U+%CR7tQ_z3u|@g<+N=Iw~Q~% z*DEt-y#F*vIvx#hn3rh|mWl^Do@H?t0<-0%guqvajkZZQuoW*iL>)|D8XplD>vhZz zM<2FbC)>o-?It<%HeA)fC&#U~@rZ3e2v~7{@G#2%nNxAe zSID4O=1j_Ord&+CsBj#;`;H2+2AsAAt>HFDn4Fg!0o8re0%7Dgb&rsjomCH_4>l@L zSHipZvKOitRkD$!k%!j+P=uS%T0ZB0`{?l?JjX6||7089&#Nvl$FX5FC4!1D!tW6! zW`!k5)c8{wj!y04a`28LP*DU0Y2Sq`Z_Ln2SYD2J)3q%S`(`hWSvUA7f9Zn}Gk9oD zY+A{)0z@)qM1XuJ@jK1?U^}8jv&(}q_)wGeAlll&R569;zl7mk&fe$B?&kk28(e{v zM<#HVzhLE-<&wiY;4gPGL4&iSh>1Pi$ubiQPqiq}87XIvV&B5a)~5+YgwZhz*-BCZ zYzK7GlIL&+od+30z~uR-t7n#i`W+e z5N<{q^NzM2Mb%l1lL*}gwJN2UkQ_6zAsI+gP@i(7{oPEVXnC|IV*0f##a$z5X@4Nq zJKD*q(bqChy&%cWX7+?COl`1nUwhK{LbafP?DtmyYF+7n<8(YC#$*oG!LCt|u|Ei% z4T)OpxVcsz(=>yx!T|2we$U}|-=PB8e?{orAw=FK^p$!(#Ud52@o6iSX52$u#g)5qs75Q8v zuSc54@75ZdaA(XKWt6& z)MIz!^v~PfE!sY}{@-ysAjS=ln&Bh(<=#{E7Z#7Id(*t5{O1Zk#+O;a^V0W}Rk;bx zfjnIev9NG)_v?~j#X3k-Xq4i3c)~pgY!-EJvOrqA6A=J0HJ=#8;rDeD?;pJXiqD}+U;;`ZE&5TMEf(w<&e37OsuADK{7DkQmI}VDT zpY0B^Qw+&qCMVTd8dqpN(411sC{H{F1xr6i7|bQAsAL)1TdAdWYrc;LG+Q_m ziCy`wOURh@#K|5@RNW#c`A17sQz|lhj%gWCDy}#$3u9p7wjpx3&rY{EX8&@+^X}{R z_=J-td$Lm#!HOV?`2~{5gChYKElQT3x=&m1OL0<(unP%XTDQ(v97q zX$ORul$$CWjri^-&S7%wYP^*CD3BWBVQ>{RS(P~?-fM=&zcXp#fer+w>8 zGPfjd4~NKg%Ql%_NWUnL|7s;;z!Vn-=I0yU>}=VI0D`zZ*2O%(zT8)22tbJme}|$) z(vXiu^mVe{3g5E@0i?3b)-EJ50HtKof?4mBBx)?8&b}MAuT-fs7TSb-h~j4i6sNz_ zOlm#_(&GZ8PEHif%pQ(m=!nNdQHrFY!Ge09P{ z+FA}BkoqiGuCx_!O!ZemT)b_~uKaOeJIwGz39|3yKGr}?05h{NoNnkKq1&z?=l*?A z!`vtu1_+O@r(Ut}()@;?yyKI%>*ygpv7cp7>fRlQ6>RM^c(o6hI{|@DwHKKj8iyVU zA7k^%yKDF>8f9AfvNmIGhc%cOc@~{-VGWL1E@T!l&|39o;3WDQeuXIiQ5g2Hfy4Hy z;Gm(#g}rn6OC-R4^B`j{w^5HA4v=9^*eN6!B*8kp^U-bG@h4`Px{KE2zDZq<= zW8%wI{vXa+fBkoT_)$)RvL0WW_z!EVt@Jk!<9}Gp zzwg|i_Up@&@+aq}cK_?Y1b_DC@1MRujY*1YRbhA?<}Fnf7WQQ$0A zi@D90nT`9^6Xp|E*WYQfcbpt3@@)OhT?|88cUY(5hUm?-7ryZgcp(+_hsRAJO8g1< zent44rL(Co0qi-8nX8~30Ny8aN@5@I55xrgF=qk(RP+4zX0ZHU?*6kT8=%5&-<`WV z&9h|S+P`mJ!|&a*=g)_Cnop4X_w3o}`!Ab2^8R`EpEY;1*%|6TDEAMl|4)_MvD3d( zu3wAik&Z@IH$GVR%bdHJYSL9&#b@N`d0uNo8o1&97sIuF!q#k^ZL#aq4-`|h zK_Hy#?z^aUfSOcqh^nt@L^M^yNcEwj+ZQal5NE?M;8Aw#6-%!nH9>hy4El@dNHP`H zGOwOOf&G}+OY@dWpe~e2WE((2G#Vu#Q?iAe_s&~%(KCe}Y>9A`1lSj=1wFgeC(gT7 zP@HNy!bf%qJZ*aZaP*m_(xf_vsD%WGgu$wrB%?E}Hja!z>Sza(2-fxh{q?6Lt4RxARc%+-2tjllTb$7c;scS#6 zLN+4C6sHw4eF<2!*JKVwFkDG}!>k?FqJQ%2&I(+X+Gi8cr@{0@#)TuKdv)Z2!k3NPRRI zl8_Q5nQ*_<#HS*qXtrb6Y$ip}B63>r2}iM?FrC6DqtdwHTaaAPtZYAO&}9Fkxo;bH zF%*sb=n%g#J}2ooA}V5c5zxm621R+3Or2^g0uo?n3g=bRlL;h?33O=5&f?qC`56)9 zVya^0Bc4QHFN|bedl6bomgPmr@KbfSns|n?wDA)MLR;-2^YUgo7Gk*O;5H2=;p?^o zgCFL8F9_$8Zx?(lwjuu68KY#OQ>7NL`B|fCia3@!g+tkjR$0eTf6EccPFtKYuh2w;EE`u^DbHo9_Oi{v_X6k>eHO z7$;mo=z+&$gNWLRk9*Uhq#R0H+6%p(FVF(d6l_{vec-#B9JzdO;G@PWr<_WmkTU(| z_~*uMStRl(dHq=ky7AZSPAPc=(VtFx`<8^%q*uL7z_n6KJnJpyfwwI)IbKa8|vi?t%8 zt>osMP^YI_78JNno+rCq)r+`ia8SIIQ%OOw@OJkF<*9pP_V!6yXU>0n=3nv9JXex- z1n}q1apvOrjvv4WGNlw&K6iEulkjss>?Zc;R{Pu@l{f_{H>%Wj24haIw}<@Zlic@H zEn~W_lhWRs!^P9ZmUB=&g_FR!0k^wecckRfE&RloY))NLK23B&dE)Q{^_wXiER*y- zGwSyot>W=eLaG+&YXB>`O^AG4;(8)fF9!96kGa595&R)jr6b0_;?>{D)w1!mD|ntq zvz;{nyBt)cjlkTtF1DSJHy|Z6nMI$5`y6l>ZO2 z-)d2XHJ6V|#rP|mv;6#R&n>NqHy;%NucecKqpc`iT?%6_nRhoX3lB6f)~o>ce&Y{2 zl_a03l2=k@GS;e<`nbndIu^^9%=f+BsrI}t!t9o&>HY!!0^RH7eD_!SCR_1kA@O8M zp^_!PPBbGh{3TTX`{uuhb#`TCE-r0_{(!L^qC1=hH7f-LRm?HRBkx)nEFjWsgIYXC z<lL;8+$m8rp@BXe`5$hJQ9l;k_Sc zZd0QRLVHy$jGm#4_jta)nk4Q$ym@ko zcFAn(vahaLemA#VKxVHv!99m|*`Bq+cxXxz?F=ibOKiM|zZizL5(b_2NLe?C=&=nR zn<)idHZnf@R{rhr_>&jbeHWWy2A2wiED(XCbB%Ew4Vhzubu=CTK6aRooE9$;6a|YC zrYe#J>jpwgatEHjLOVW(B2yy#>H6>&I&tw8)&=OB`|(FqnaiuArG4|S6Z!o2u@uCH z$=hS3+j7zzx^Csw#wnvH3U~E#qP#rwFZY-_AhxSYaIY>Ym1~-dr<=z1it1XK)#ZcY zltoQGB;3$y`zqv%ydTgd2v^XkG#orR7r8l*{xtT7-1Xy3Lb1s<`mPC5Ee1Xn7Wa^< za^d2u%7c_Wpdhy8k`m8uu1)Zqc$ml~pL}jT&%rv}uzNvxej&Yu&`21gCIv&FZVuP-I#^ z%`0VpHP7$Tz@X`41XRM%T>{d6;7bMxnSeppZ|3Zkb82$r z_Zdt~hGbNwCGRc#Jl^o$qQxhi9tX*fYaKGOkFSL(u7#mluuS*7@e?D*{2#}j1{>;| z;wP@yO@6$m!IyA3kJo&rDGGV^k~p(u(ph$r;9#PhO-&*nx}CUK>mpIPodDV6svv8nU@TW~hK`DvVH+C@-<^0qc1pq+S7Cvoy5T;&tK zQ1JW(ndT|9+wk)naqTA^#e+U{=eNVjZtGS2W-?7YTcf^97#975uh5U~+QjkEXXzJ(ZRs-6w8#0u3=Y@tJVEj6^WLJ6-)v!n&qjW-R5j%=o8SQup19vy)L7kg0s`WQa9iKtr-W^)1*$m*9Dc+ZwcR znEK;O%ZsF9yEGp9FmwsiqPKGT39urRNy&Ge;^R@|^72S}J1J(?%)Qpwq3(fi<#XSU zL>_EGc!w=sI6_NS%4DEwAhHM2y6MpJJt4_-*1xh@LHBJbfg!Hu}!IdfB406(*be@EV9}0>GI(NJ) z0M&(~OC4S0Y)S{;C`*|n=C!!ajnJ9d;AfxpMEC|De9aeDAU>4J!4Ylh* zQDxOjvU$1BIxAM$ctm!_`;VJ@fozwNay~(-z{1~O2~tUHxgv2gDaTRgJ+;8}3h^#= zoe^?DO#L?wi1~iT5xT8sF7W6Njp%T8_1a+Bv4;AkgY8oyy-nK)w0i$x5RiQV<6Y#w zZen`0)X-pPWY$Qk)dnke6nf7~dTuI;duB`mf(aD_5^!^t(xgMLLY*53r#;qQ z82GsQp{M*e8@W>4Tfo@Q{qFBhS$c`#T(+Enj0*^(CEV9hUCbd+j%`S+A9SJ zpH4H83U7z@b|*;X26Zp`E6SY%()el~XAFCx-{hAhIk^v>_Bc?6LJ^*|bnq>&RCy)J zF-iSzBbpeI`n=(ary`D=fgcs2QZeC8W6}0bjs*pQT_57 zXmzv87STP?BS5f6SK991HPF5L2i6sx9Pg22m78j6RO7W?9e5?5^o0w5%aP(5Xc4k& zMf079Ru}V>n^tCfdhFvplO>i7BubKrHrVzEiLY}wgd^q!Cb8O>Sx-(}=Uwrf&_GaF zbp(SG>aQ)FAF%loQUo=o*D~m^_ zVUtqU=0(ceA53(;um>l5S8>uVzL^mZPF6ON(Ka$NSG%t|_DzT!P zcpiToIyaGWTh4vr&8nQ@c+FGroKx$SC}j52NGZv&BL1yM&#YFqs^mzgZ{K#Ek4T9p zt^}+kD7&q>Q1awLpIM7FyNY2vN}LJ;tpw91>kB&*MkloR8yB*130JvfVc}ORHE|^+ z26f^h?@Twx6}=}4?DJ`(zo7%h)i3yMzE7;!(p^dn8l?3rk*C8Ho99t0JU9E?r6brm zPD?D6%*YTuHZi2pylzqqVno!NnbT;>jr-0N#=^15_?>NdOFBVQE-#~r?AQ|Hb972$;FP=57JuQh z^9{(TbLa$DVNd&9OYxRyWEbe!~l%( zs5`Sfp%+C;9u#`S!UWRaZ#(_~`m@h%ZpNMTLhaHtO?pGpb!moV1Ypm{BtYcAM=q(w;>u$@g zCY5f;$#0D5=5O`t3yC+tAkeys{WTMA4IC5{l4Q2NXw&Pv5s4ivUDwhQUGd7X7_c$$ zogaH|mI6)o>&k)u9MH|4u1`D(znFa`Tbdjjvxzy1A#CPAr=_bGJ^IhYiiy9ePgD=V zzlz=juak>&Vhkcd5S2yGF|Enb4#2tlv#`NG4}mCi<>*ybh&c)OZDh05-pPT35|$=v z#LqWTFi3}SNAopngf5iPe|!qc@`v04*Gd>WLUnv}lDqxE&~OZ=lL?0DBz)jt#1#lX zZ39I3boeF)QTCK$bCN~1K7UG+%xtAXseFfRnr0QsYjcpy$w~yca)a>5{ z+OD(y1q5Bq;uJu6i)#sU@m4FrkGxc0kjCD5PESfbsyx#EP~;j?(DtQ)NV#^8Y)I@f z=R_n%tlK{R<2elx{B#J1?^1JX`I_m%@F94#FaI2zv2-KQ`5Zh-goO5Ud2=le#ZE>F zW8{!o1KSYgsq#YjC$y8(&{Y)iX#O3BDk^oa*qEgVH0v)UN5_Emr71FYm=pd5v$D($ zhs&LgPm%dahV{;<0K+X&+`KxZo}4-f=5)gw5c0Mcp;So)KYOwEQWz5s)SbHeTe)NVIRnCqGNfW~YAf5O7|FU4 zVQOGOqE6%$c{)IDtxR@=f#S~QSv%O(Bau!&)WiLkUZeg0CGZSVjJnfao~$LR{Mc#s8;R(Qx!Hn}*(qP@25=#rCFISs|_9gw_ zacaxgqS#hsr^cDsyrtNC_V^l)&>~T#QfOIotKyV;Qmye~sijnVC%9iMgwD}SAoG;> zP5^tz7fA7L9W~dHkQoMi#z+l(CWYkZ^OoQPuU(lppcpr}j+tm9k=gNXBH0JyD0l)` zRN|fU;s)g4b7*vRUpE;MCL1P2K(<>=j&)05ZzR-NOdQi=76X6Ch!Ru^deF_QaPjbL z+c(>utS{3Fh?WY~hT^mgdSJYG254ga>IO5rk47XB*pGesRGzC%&$aaL+vDX0c&uGt zP;S|`)bc2jhs$aP5{GbsV*zb`K=m**!2-o(Ex zzeaqUc$<)XhJ8MF!wE(-!k0>yH};%#c-n%nww3UVv={kTd|ke*O)# zTEF}hi2Lsy0msmK^axGygN^rG%}Gx`$SwNvp=ipjw8;)9HWV`hNhW|Yx`QuCkoymB zMK~l5lwA3#Ks*&DM7BGZ^#01w(C<=vuSsmDb_dz_e**ul2c?;Q{O5V%$%xm7;?k>7 zC9cvD03K$8Uz1V0^?r#=JrRDiwB-$-*k*2;+1yF~yFoj5za_nTe~r={#?R(;=qBz$ zB}sv@iAM>XGW72Km(BZA4S55KRmP*1*3*TY@Fx$1g=eFykf^U#1w5{OA4 zn7)UBnE|N&CmP=mszdAn5HBMmV_?~9K&NvkN8?0k7)hgym0Nfvp(Jv?zWz;5?u*fT z272YB$9<{rBIUTMp*Mi7KU$EUw!y0(*!HIT#$Z|4ZP|~%b&0yvD$J7ce3cIv7HI+b zztCMP>t<{7im2{u*v)l!+rdmC4B|1^qIAKl@S7Imc10<)bWE9PP6f~gkpF$8h?o&9 zs3}%Z)M~OZEPrm8i3*$XS;1Hk7bo>02^1cA_*4G`K2H0;VYdKsMnF@Gg;PD=ooLyb zD>_;hXBwct5tcG4W9jgv z9i~2EF?G8n-8UsR=U~`ACjBUDQ=CNa(mh)|mhKW$W8AnF-FD98|3icUiSKQ#e*v^s zj3rI}EfvO~L|rEhC!BNn=){f13mg_r{EBC5Y)G=u+T{uk{cVxIuwg&oy@@(;N-kTk z*6A@40kPN&iQcKO1YCzh97UnaKemX;Ongz+l?$|beN;$N^o~G*fN+3r1zODBD%KKDc(ZA;9;qN-^o!96 zK1)qI#f@`D^U6=idz-GV@W{_vm%GpK-NUDf#Tc@^SE%Py^~ z+Fv2!(?O8hI^_^>FHwBEDdYbLpX9X&o}qsapV&UI-!qzDEyqZ|%X!@3_@ie^nYVbk zTmp$~Uz*8z&>nJ3Gw9BjG#D4GYcV5tyW~U)+M)P*MBs1Sa6KMn+EyHZCpPWGqDX~k zfg_w}k7Vq{y}eu6^StH>a}-iO1w5iFC7L^F8{Rt{gg!Mtq3i^G?+pU3Zc6#ns~ zb^N^KBchODo6Se9*a&8@ z3O-_c@fDhZcKeykdY^t$iQ!WHm!z791$A7RR-c@kLBYf@7a-RT_>Sw@RO%QN-3~`A zq^+CSWN#e(_Rw5M6#Rfj1>kecbX_-faYLySw72r^|BO@fV*%ohXm8L@#8=&NQr5c` z%g&#RiR);}s2YckX@MD2#8*LR+RYKX6xl7_XMM%03Xbvt$F@A|{Lv=pqaa@i4|X3& zO^f^~&YT$drLPg-|EK>MtCs12ACq;oGu=<9>+pZDvV2q-%9$-l=3!@%0>=0(V`CA{ z3wIe9c5HFRp7XaZyK0dHpeYIv92bT(*S_km{-E6q5?gtk=zf?r3Hjdb&Xb~0mba6w z3gC#`^18MmO=d;j{FP13%l=AWlr~OQD`NDwzVOjdA8K{*HR*geuX{nSvt7pxaP9)x z2o)5);;!4NY#G5$(X~n*vi&!KHo<8Pj_>_I<~vdqGyf=MHg%NwT zE#G}Wz~j$-!3xsn7(ejxFze}euNNlAAj=!hVZ=fTP88se<^fq5r$)?KfVf{xV+O=$ zhreL`^>bGffIDM@{{&vL%U@-UR^3M>jkyJ`AAO#7qk)#Pov{ynM`{I! z#X9LaEv~=%gwl14?kOwr*xQ=XeRI(#v`$awP$tqyDKo+tj1m5f`n*A3bYy_7wp4FZ z^_u<_IMKh@eRhrS`WIrRRRy8!DBrjmfLXlQ?KZx4cd(n#4>s3&S3N_7I>IJ>ztH?O zq=iLmU#Q~UZB5Pwc>CL@<9wI({p_Xm z%9Sb;o%NBUm&&`6Wb^IS6U}7(@5!yxU0Y!R@td9P3Bqz!Hv!uL20SONtB%9L_T$*$ zmUW>=x=pU+m2@kdX1$F4vNV=;(eK8JE$@|<+!T^HldR6$+w{J7X^xy14(E@5S6=M1 zSQ>MRqod$6&0mi5p1l6Yh&HE{G2U6E;E91emv8QpcZRhDY!d3w)@p6Jwk;<7ksWD| zapgr#b6b80KdexV8k4c77b(Q6grV}U!M)iY$V$lX(qnGS{4-Od5&y%9p4%DI_lGm zqQ>f@w2z1-z2khGoX3eVZxSyyy;|kIspwXbhJre#eY#=W8okolBo;I>tcl-u0d~hIH+{c2l{#3(6ze+qEu}C|k&>n}(MuSe1 z-5QbJug6BswzOKdHu;HfbrEk`_6PR2!n}w3Ps+QE9i4zY%J(@1d)5nswi*w^k9V`qElDdXHHP>N5Xy*j@02Qs11p@>(^ zC_FJb^O9U+#cTealA@{3xo}uhwi(?a89s_nn7jG6+UZ2NLtSW*5w^1UqJ_APN%+T` zT2a$Qy&fIHEZU>EZlG{Ax#`Rcd5CaL)c6^=IA);LKj{Y38)|22E{4 zt2;>ZQSZM(nj^K&h=Onv%l6lGV>J;KQE|!`5sa?s8(L6!bY&fD*{j4T?jgQAzf;iS3GFc zp&nFXCEhFzrL@_kC-k&i!R08L*q19G9bYGGXMnQKYD$tV)n`8$Hw?VH6#rUE_>;T# z%hkPS$+PRocGi5k6w}eA@7u&N0b9d2=K$tpab$hQG>WfJx*@liUK-=C85~08HiIM+ zZ)eVocc$h6wXfwK1@qj4wTXe@CojXwR;gu9l^;%0{ki-((d*PXF-&x_^?ORULCJ)- z)rM30e=pbmON<&T1)&rBJ%=YrqvLUqh7B9Dx1~ZQbRI54oeZtys{u8eTa9s$gz@~Y zzt(Gc=2z4+DF)8Wls7PY2TL5$b>?J5;A>;o>0)G3G1Z0FAn`k-=6i~K{p`ExdC1Z zKv@TfFwfkZp}Ab56(R<2;fU+~$&n2e`p~>8#MKT?CQyjh|DqO6*!u)2NNx-U>Vi;I&VnN6?-Dt_ zqSUmDfd(Xn(!w_4@Epd(eLMyr%i=^P{)(#qkpi?qY{u#1J3~TZ{vZKiEuTyl0TyuV z8z$u)=Vyhx_iZqf>pmL=A?cKe_`2>iv#$SGt*$mU_?{@G9|Jl~1a&3P|KyvHh0f&& zx^uxBMk1TF^;exsgs8gGkOcU=bw->of6D$nASix4&-S}>%Ap_j_<>CN=U0c>%o2NU zWzPIS(HB>}Hg0kPlp6iup`?ba?_=^ycSZLU@rltxgdr{PzSy5SdHe0U7vR9@tzusAj2zxgK1_p9*Xk7fLo2eQ z0|{5XiU*!e?Me)j_rTYXC5tCqQSR+En><6QJO0HN@Q*4EUKRjX zCQGy9{Q(#agps<$G9Qlu(w=Pm*Lf*!5t@HaMwgP8zWJ=K#FypX*ny_!7-{_H3YcG4 z(v{CuU|#s-_w?*(!8^b)4+d4Z4c^P(zc5B1&%(#W+f7l^W`0@`9PC4pW)kb$3MkrK zTeo*ofOQC=xV#kRb8BkS*`e1xX!)@Vp)OJ97INM>6@3O}x}}0*?Jm9Py9@q7o+aku z5GggpD#t?~Bg7}g@w!%&#L{V3vy^_Xy48k!r?9!AZDo3uf{Vf>KI=ZCt1UJIU10@t z>i}Gw-^T_&cMASA{9$H9c&;q8|Dqwzzny1&Ol%uECc--B*KMwYnxZ%*9Q1U$J%oN? zh2s1ib+yt&2Ot!`y}pKjX^KxrkBkENc|V_lmd+8sed}vac}GjM)DYeNl=U%BSW2{M zy@4n^dLUOTC{{z$+~FGsk>0GX4AgtoD@Y7}5m=nPaTnIX-+qgb2{!GKy(z*ndA{{F zd)tTWpK{{C4_ao-PRt85bPx91#bOg^AN92P*?ulwnrapb+QeJB1isYx-JuZ8(=asC zP8ScrsO0SA8)wN`U_a?D1gmrOjGmvTb-}20sfu}uK&6Q*0N7nivE3aY3Sbm4L-Gj4(LnFx^?=Ny!q-^5vWxGk0ChL)~B|XGfTd zje;56m0GnB`8rGy$thk{^7w(U4!nT+9LE7DvWGu+hnTMB0rYuJw}3Eu@aIl5(V&2&ASPww zkONyfK$pF$`vOF%`+>pP;Co-n^9;KMdZRn*oCCd4bLYLa1yb#(1QIFZ;(e+UkR+ZZ zKVb`D6g~VaKG|yHic6NykP`bwi?&p%Fl_Mqg#o@t>h4eJyEb!n@5=ER2J&3NpVIKG zV+U*lC{)d3XO7Q|^K2GktP>XCy?{%*8x`mwK%QMB**+lXI!CLZ@84ehiX$E zj`4&Y?K`@V7;3F-gO08c`FFolk5hDRZf?$B=hL`I7X9LZQFXw?nPS zyHZe+E&z9cb!^T8d={_@pxnrmcJ?45G5MX;2n3rqk>kjNY!UwPR0yCOKiKVGl zG7iGThUNb<&)H}ToubD`+u<(`=gXJ;QbWLhXg7qs3wZIhu$S)eK*kFg!+!>xo0r$r z&pRm(eoVC%IVEfDX2g3_dEi;L*8?|QT{3j9_&HmqZ;pk1`86YKji8KEx|2pj`T;wZ z0>%lhO>E~Bp{z=X{GnGzHS#VqynU2%RFSdx13ZDLdoNO(XgGgO0+48g#Jg)@%CVzS z1+-It2y`=4{{EX70Z0<*S8l#n21M?d&Kn5Xo&EQpYK@Uq=YZoQjA>#lNWaqK@M$JM z8DNvJ{#xRGrTP5R{5#8M%~|;Pnj&KjvmM?{>R|;O&NX}ZaC^72vT-l#9~)q&NV8Lec(}bY;H?p5U@LCv>~6F_cjBI^ z9L9JLhxhEfY|l>3hw-vH5(hB+6QCT!*k{*(1A>g_&OY1m4~*@|XaVW~!tPTXo+z?kuX|0|@Js3f!XguPt1Ae)k+VI!^m1p00juu}vOC{E zYiADun(uT5rhxIl-&(sg2E!i#uLtDV9b$F?iE(=zkLTU2D)?;@D zfJYfx{F;x_I`i53aL&l6wVDet4Q=cM+Zy0NnN# zGsAG^;r`|+YjOt|R)-3G1qRv?m0uO`%Zyqe;B12r@l!(rRDf5q!-1>SyWwErx|>RA z(}kG?N@EUal@UO#>LObgJNlTcfRknUh}l~Pl4unEOy^A>PlwAB4GS^?$9Y(St|mPi ztgQT9(yww8HpN`V56~NBDfd?%+^2iG#yA+MzQ}GfzCSMqL`i_JkpXoV-Sn5ww+P&H zL)3}+pKJs8qbB=^7Af}QSs>4cRVQ%7pvMecbAL?|!S>;RylHe;v;}JNWz7Vr|zEi1fDMag}ZY4D}WyXJZ`kgt!Tu zW-B=X^;9I^L$QQCLtF-%Ywj+=&Nk#!Yenj&k8K=@RRbJZ1WGuF1Ab zBlLAFd1Wg8P=E2`kDC+eG3WTdYFcw*aTd2;3k~r&?p38?n5%T?H*BRH}^s||TYc(0*G7tW2^=SsAx{rzoMM$`_MJBZ7bTYFd`E zv5Y1Pi*6poN$5IUiM!KEzl@n9O-}FReZ8-Zot3y$ABSo8FG`+X^u0Pe}`GiMcNVXJNwuM^+lDwMi_u;Lf zsHDnR%9@N;u0aD_wlgSnX zbr+tkn!A00P7dlj0k;~la@h7TT}2_4zfoj+y-cfFnPD(FgG+a*j+!>Tk)2(v}ZRY zGR(cv%)F({LkUNLL93Iqy{5FT52@Sd(7-uen!lLi*s}&tNivW*NI4i%iN}?K0{M-+ z;ayqDr_Xp;1d8vvWPL63T&?VVIR0=+pv$ClMo;aI@BUt8{PHl*yOy zChqVRPkPZc=;EvgJ`?+L#IJbu>2+SbzmI7WWpz3?MN#^v{0jg*K*}rBVznpqbGMQb zb^;n;vu+{CfD@knh>-Z6-{N--r8VEshZW{oWrC^BeS1B`s@Me8(BE6~y;c3Skh_pg4bBOv@&S9>aa!$MobcHfXO?0t zyNWm0$2yN2$u;_osHrX6<8xDpvjq@)Yu3XJ!11L~!lvKzmt**-qyBtRzm~EZC}Y#) ziJt#*BiE7`yNnolx$R;y@s0;FParvN`KzC|`Ez-wScka|ED@sg5Py@mHRe~(8BkpO zyPqp!hpkX1vQB=wG%hQdbL3@=67f z@X4yQ?B`qI1Mg12H-o$1h#B5zs`>1ovTfhIXB!fvSe=we7AX!&~UT_o@@l9 zY9#x4v3DJ!z(+$tcUQ)=b?e31FdSRp;- zYSrwfq6#rqS-I#d$;C7c!kM-(FXZT-2Y6xs2&Uqi4~C#pp_6xl^vS*zKpI~V{T z+EV*B=G8f1cLO~^B!Z!YOsXL@tr&ovx~sFea{yX#Cit^4a=Pt605br2zySav2rwYe z$n#+Jhrbd*CUyWVEI1tkKnxpvnuAuo(=}LL;3)tRb|BE&S%Kp{qC0qJ{<cr=pFVa6Uj5%b zb_e$GfBM+{?_ts(`RFgy^hc8c$N(e!yXLNd0BmC9s=%KedH3L~ zj(~qY{HMJCpxi$+cjW!^;a%}10MP)f_P>?#p9x(wu+5}@a`^7#!NT7dqiU$>sOJ9u H@Y#O>lFa3A literal 0 HcmV?d00001 diff --git a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleBubbleQuizTest.testIncorrect.Mac_OS_X.received.png b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleBubbleQuizTest.testIncorrect.Mac_OS_X.received.png new file mode 100644 index 0000000000000000000000000000000000000000..28559b92e74224d0623bb5009a8e0c55df79d426 GIT binary patch literal 12662 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 diff --git a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/TreeQuizTest.testCorrect.Mac_OS_X.received.png b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/TreeQuizTest.testCorrect.Mac_OS_X.received.png new file mode 100644 index 0000000000000000000000000000000000000000..c26cf6ebe1a64cbd0ae90ef4c203a356bda1bba9 GIT binary patch literal 13284 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 Uz-z$m9WkrZ)~BjY-uUJJ02*-LbN~PV literal 0 HcmV?d00001 diff --git a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/TreeQuizTest.testIncorrect.Mac_OS_X.received.png b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/TreeQuizTest.testIncorrect.Mac_OS_X.received.png new file mode 100644 index 0000000000000000000000000000000000000000..46cf76b0cc5ff834e1dd5b5bd914a746b7c770c3 GIT binary patch literal 14619 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 Op^lb;X0gVt2mc2jvc?<$ literal 0 HcmV?d00001 diff --git a/src/test/resources/documents/ColorGeneration.testGeneration.approved.txt b/src/test/resources/ColorGeneration.testGeneration.approved.txt similarity index 100% rename from src/test/resources/documents/ColorGeneration.testGeneration.approved.txt rename to src/test/resources/ColorGeneration.testGeneration.approved.txt diff --git a/src/test/resources/documents/ColorGeneration.testHtmlDisplay.approved.html b/src/test/resources/ColorGeneration.testHtmlDisplay.approved.html similarity index 100% rename from src/test/resources/documents/ColorGeneration.testHtmlDisplay.approved.html rename to src/test/resources/ColorGeneration.testHtmlDisplay.approved.html diff --git a/src/test/resources/documents/ParserTest.testSimpleParse.approved.txt b/src/test/resources/ParserTest.testSimpleParse.approved.txt similarity index 100% rename from src/test/resources/documents/ParserTest.testSimpleParse.approved.txt rename to src/test/resources/ParserTest.testSimpleParse.approved.txt diff --git a/src/test/resources/documents/TurtleTest.testDelta.approved.txt b/src/test/resources/TurtleTest.testDelta.approved.txt similarity index 100% rename from src/test/resources/documents/TurtleTest.testDelta.approved.txt rename to src/test/resources/TurtleTest.testDelta.approved.txt diff --git a/src/test/resources/documents/TurtleTest.testSpeed.approved.txt b/src/test/resources/TurtleTest.testSpeed.approved.txt similarity index 100% rename from src/test/resources/documents/TurtleTest.testSpeed.approved.txt rename to src/test/resources/TurtleTest.testSpeed.approved.txt diff --git a/src/test/resources/documents/WheelTest.testWheel.approved.txt b/src/test/resources/WheelTest.testWheel.approved.txt similarity index 100% rename from src/test/resources/documents/WheelTest.testWheel.approved.txt rename to src/test/resources/WheelTest.testWheel.approved.txt diff --git a/src/test/resources/documents/colors.html b/src/test/resources/colors.html similarity index 100% rename from src/test/resources/documents/colors.html rename to src/test/resources/colors.html diff --git a/src/test/resources/documents/colors.java.template b/src/test/resources/colors.java.template similarity index 100% rename from src/test/resources/documents/colors.java.template rename to src/test/resources/colors.java.template diff --git a/src/test/resources/documents/colors.sorted.txt b/src/test/resources/colors.sorted.txt similarity index 100% rename from src/test/resources/documents/colors.sorted.txt rename to src/test/resources/colors.sorted.txt diff --git a/src/test/resources/documents/colors.txt b/src/test/resources/colors.txt similarity index 100% rename from src/test/resources/documents/colors.txt rename to src/test/resources/colors.txt From 238adc3cbeb99288857949d39d76f8ab24f88c7f Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Mon, 16 Mar 2015 20:50:38 -0700 Subject: [PATCH 018/111] . --- src/main/java/com/spun/util/NumberUtils.java | 284 +++++++++++++++++++ src/main/java/org/lambda/query/Query.java | 135 +++++++++ 2 files changed, 419 insertions(+) create mode 100644 src/main/java/com/spun/util/NumberUtils.java create mode 100644 src/main/java/org/lambda/query/Query.java diff --git a/src/main/java/com/spun/util/NumberUtils.java b/src/main/java/com/spun/util/NumberUtils.java new file mode 100644 index 0000000..a305a7d --- /dev/null +++ b/src/main/java/com/spun/util/NumberUtils.java @@ -0,0 +1,284 @@ +package com.spun.util; + +import java.io.Serializable; +import java.lang.reflect.Array; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Random; + +/** + * A static class of convenience functions for Manipulating numbers + **/ +public class NumberUtils +{ + public static Random RANDOM = new Random(); + /***********************************************************************/ + public static int getMax(int value1, int value2) + { + return value1 > value2 ? value1 : value2; + } + /***********************************************************************/ + /** + * Loads an int from a String. + **/ + public static int load(String i, int defaultValue) + { + return load(i, defaultValue, true); + } + /***********************************************************************/ + /** + * Loads an int from a String. + **/ + public static int load(String i, int defaultValue, boolean stripNonNumeric) + { + try + { + i = stripNonNumeric ? StringUtils.stripNonNumeric(i, true, true) : i; + defaultValue = Integer.parseInt(i); + } + catch (Exception e) + {} + return defaultValue; + } + /***********************************************************************/ + /** + * Loads an int from a String. + **/ + public static long load(String i, long defaultValue) + { + try + { + defaultValue = Long.parseLong(i); + } + catch (Exception e) + {} + return defaultValue; + } + /***********************************************************************/ + /** + * + **/ + public static double load(String i, double defaultValue) + { + try + { + i = StringUtils.stripNonNumeric(i, true, true); + defaultValue = Double.parseDouble(i); + } + catch (Exception e) + {} + return defaultValue; + } + /***********************************************************************/ + public static boolean load(String i, boolean d) + { + return (i == null) ? d : "true".equalsIgnoreCase(i); + } + /***********************************************************************/ + public static int[] loadArray(String summaryString, String seperator, int defaultWhenLoading) + { + String parts[] = StringUtils.split(summaryString, seperator); + int integers[] = new int[parts.length]; + for (int i = 0; i < parts.length; i++) + { + integers[i] = load(parts[i], defaultWhenLoading); + } + return integers; + } + /************************************************************************/ + public static double setSignificantDigit(double onNumber, int digit) + { + double power = Math.pow(10, digit); + onNumber = onNumber * power; + onNumber = Math.round(onNumber); + onNumber = onNumber / power; + return onNumber; + } + /************************************************************************/ + /** + * a unit test of sorts :-) + **/ + public static void main(String args[]) + { + Random r = new Random(); + for (int i = 0; i < 20; i++) + { + double d = r.nextDouble(); + int s = r.nextInt(5); + MySystem.event(d + " , " + s + " -> " + setSignificantDigit(d, s)); + } + } + /***********************************************************************/ + public static boolean doRandomPercentage(int i) + { + return RANDOM.nextInt(100) < i; + } + /***********************************************************************/ + public static boolean equals(double one, double two, double delta) + { + double actualDelta = one - two; + return (-delta < actualDelta) && (actualDelta < delta); + } + /***********************************************************************/ + public static Integer[] wrapIntegers(int[] ints) + { + Integer[] integers = new Integer[ints.length]; + for (int i = 0; i < ints.length; i++) + { + integers[i] = ints[i]; + } + return integers; + } + /***********************************************************************/ + public static String createRandomStringOfNumbers(int digits) + { + StringBuffer buffer = new StringBuffer(digits); + for (int i = 0; i < digits; i++) + { + buffer.append(RANDOM.nextInt(10)); + } + return buffer.toString(); + } + /***********************************************************************/ + public static boolean isIn(int check, int[] available) + { + for (int i = 0; i < available.length; i++) + { + if (check == available[i]) { return true; } + } + return false; + } + /***********************************************************************/ + /** + * @deprecated use Query.sum() + */ + public static double sum(Object[] attribs, String methodName, Object[] params) + { + try + { + if (attribs == null || attribs.length == 0) { return 0.00; } + Method method = MethodExecutionPath.Parameters.getBestFitMethod(attribs[0].getClass(), methodName, + params == null ? null : (Class[]) ObjectUtils.extractArray(params, "getClass")); + double sum = 0; + for (int i = 0; i < attribs.length; i++) + { + sum += ((Number) method.invoke(attribs[i], params)).doubleValue(); + } + return sum; + } + catch (Throwable t) + { + throw ObjectUtils.throwAsError(t); + } + } + /***********************************************************************/ + public static boolean isEven(int number) + { + return ((number % 2) == 0); + } + /***********************************************************************/ + /** + * @deprecated use Query.sum() + */ + public static double sum(Object[] onArray, String forMethodName) + { + return sum(onArray, forMethodName, null); + } + /***********************************************************************/ + /** + * @deprecated use Query.sum() + */ + public static double sum(Collection onCollection, String forMethodName) + { + return sum(onCollection.toArray(), forMethodName, null); + } + /***********************************************************************/ + public static T[] getShuffled(T[] objects, int numberToReturn) + { + Shuffler[] shuffles = new Shuffler[objects.length]; + for (int i = 0; i < objects.length; i++) + { + shuffles[i] = new Shuffler(i); + } + Arrays.sort(shuffles, new Shuffler(0)); + ArrayList list = new ArrayList(numberToReturn); + for (int i = 0; i < numberToReturn; i++) + { + list.add(objects[shuffles[i].oldPosition]); + } + Object[] objects2 = null; + try + { + objects2 = (Object[]) Array.newInstance(objects.getClass().getComponentType(), numberToReturn); + } + catch (Exception e) + { + MySystem.warning(e); + objects2 = new Object[numberToReturn]; + } + return (T[]) list.toArray(objects2); + } + /***********************************************************************/ + /** + * randomly chooses a number between the minimum and maximum + *
Example: {@code int grade = NumberUtils.getRandomInt(1,100);}
+ * + * @param minimum + * The lowest possible value (inclusive) + * @param maximum + * The highest possible value (inclusive) + * @return the random number + */ + public static int getRandomInt(int minimum, int maximum) + { + int diff = maximum - minimum; + if (diff == 0) + { + return maximum; + } + else + { + return RANDOM.nextInt(diff) + minimum; + } + } + /***********************************************************************/ + public static int floor(double i) + { + return (int) Math.floor(i); + } + /***********************************************************************/ + public static int getNumberOfDigits(int number) + { + return ("" + number).length(); + } + /***********************************************************************/ + public static double convertDoubleToPercentage(double doub) + { + return doub * 100; + } + /***********************************************************************/ + public static double convertPercentageToDouble(double percent) + { + return percent / 100; + } + /***********************************************************************/ + /* INNER CLASS */ + /***********************************************************************/ + public static class Shuffler implements java.util.Comparator, Serializable + { + public int oldPosition = 0; + public int newPosition = 0; + public Shuffler(int oldPosition) + { + this.oldPosition = oldPosition; + this.newPosition = RANDOM.nextInt(); + } + public int compare(Shuffler s1, Shuffler s2) + { + return Double.compare(s1.newPosition, (s2).newPosition); + } + } + /***********************************************************************/ +} \ No newline at end of file diff --git a/src/main/java/org/lambda/query/Query.java b/src/main/java/org/lambda/query/Query.java new file mode 100644 index 0000000..bbbcfdf --- /dev/null +++ b/src/main/java/org/lambda/query/Query.java @@ -0,0 +1,135 @@ +package org.lambda.query; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +import org.lambda.functions.Function1; +import com.spun.util.ArrayUtils; + +public class Query +{ + public static List select(List list, Function1 function) + { + ArrayList out = new ArrayList(); + for (In i : list) + { + out.add(function.call(i)); + } + return out; + } + public static List select(In[] list, Function1 function) + { + return select(Arrays.asList(list), function); + } + public static List where(Iterable list, Function1 funct) + { + ArrayList out = new ArrayList(); + for (In i : list) + { + if (funct.call(i)) + { + out.add(i); + } + } + return out; + } + public static List where(In[] list, Function1 funct) + { + ArrayList out = new ArrayList(); + for (In i : list) + { + if (funct.call(i)) + { + out.add(i); + } + } + return out; + } + public static In max(List list, Function1 f1) + { + return getTop(list, f1, 1); + } + public static In min(List list, Function1 f1) + { + return getTop(list, f1, -1); + } + public static Double average(List list, Function1 f1) + { + double total = 0.00; + for (In in : list) + { + total += f1.call(in).doubleValue(); + } + return total / list.size(); + } + private static In getTop(List list, Function1 f1, int modifier) + { + if (ArrayUtils.isEmpty(list)) { return null; } + In found = list.get(0); + Comparable max = f1.call(found); + for (In in : list) + { + Comparable current = f1.call(in); + if (max.compareTo(current) * modifier < 0) + { + max = current; + found = in; + } + } + return found; + } +// public static T[] orderBy(T[] list, Function1 f1) +// { +// return orderBy(list, Order.Ascending, f1); +// } +// public static T[] orderBy(T[] list, Order order, Function1 f1) +// { +// Arrays.sort(list, new OrderBy(order, f1)); +// return list; +// } +// public static List orderBy(List list, Function1 f1) +// { +// return orderBy(list, Order.Ascending, f1); +// } +// public static List orderBy(List list, Order order, Function1 f1) +// { +// Collections.sort(list, new OrderBy(order, f1)); +// return list; +// } + public static Double sum(In[] list, Function1 f1) + { + return sum(Arrays.asList(list), f1); + } + public static Double sum(Collection list, Function1 f1) + { + double sum = 0; + for (In in : list) + { + sum += f1.call(in).doubleValue(); + } + return sum; + } + public static Double sum(Collection list) + { + return sum(list, new Echo1()); + } + public static Double sum(Out[] list) + { + return sum(list, new Echo1()); + } + public static T max(List numbers) + { + return (T) max((List) numbers, new Echo1()); + } + public static T max(T[] numbers) + { + return max(Arrays.asList(numbers)); + } + public static T min(List numbers) + { + return (T) min((List) numbers, new Echo1()); + } +} From 15d75cebcabccd8f83ea2f33856b5b330a15ccea Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Mon, 16 Mar 2015 21:16:51 -0700 Subject: [PATCH 019/111] Tests passing --- ...sQuizTest.testCorrect.Mac_OS_X.approved.png} | Bin ...uizTest.testIncorrect.Mac_OS_X.approved.png} | Bin ...wQuizTest.testCorrect.Mac_OS_X.approved.png} | Bin ...uizTest.testIncorrect.Mac_OS_X.approved.png} | Bin ...zBuzzTest.testCorrect.Mac_OS_X.approved.png} | Bin ...uzzTest.testIncorrect.Mac_OS_X.approved.png} | Bin ...eQuizTest.testCorrect.Mac_OS_X.approved.png} | Bin ...uizTest.testIncorrect.Mac_OS_X.approved.png} | Bin ...eQuizTest.testCorrect.Mac_OS_X.approved.png} | Bin ...uizTest.testIncorrect.Mac_OS_X.approved.png} | Bin ...sQuizTest.testCorrect.Mac_OS_X.approved.png} | Bin ...sQuizTest.testCorrect.Windows_7.approved.png | Bin 0 -> 12506 bytes ...uizTest.testIncorrect.Mac_OS_X.approved.png} | Bin ...uizTest.testIncorrect.Windows_7.approved.png | Bin 0 -> 8830 bytes ...wQuizTest.testCorrect.Windows_7.approved.png | Bin ...uizTest.testIncorrect.Windows_7.approved.png | Bin ...esQuizTest.testCorrect.Mac_OS_X.approved.png | Bin ...sQuizTest.testCorrect.Windows_7.approved.png | Bin ...QuizTest.testIncorrect.Mac_OS_X.approved.png | Bin ...uizTest.testIncorrect.Windows_7.approved.png | Bin ...zyQuizTest.testCorrect.Mac_OS_X.approved.png | Bin ...yQuizTest.testCorrect.Windows_7.approved.png | Bin ...QuizTest.testIncorrect.Mac_OS_X.approved.png | Bin ...uizTest.testIncorrect.Windows_7.approved.png | Bin .../RecipeTests.testCircle.approved.png | Bin ...RecipeTests.testDigiGirlzFlower.approved.png | Bin .../RecipeTests.testFourSquare.approved.png | Bin .../RecipeTests.testKnottedRing.approved.png | Bin .../RecipeTests.testSimpleSquare.approved.png | Bin .../RecipeTests.testSpiral.approved.png | Bin .../RecipeTests.testTriangleShell.approved.png | Bin .../RecipeTests.testTurtleTree.approved.png | Bin ...reQuizTest.testCorrect.Mac_OS_X.approved.png | Bin ...eQuizTest.testCorrect.Windows_7.approved.png | Bin ...QuizTest.testIncorrect.Mac_OS_X.approved.png | Bin ...uizTest.testIncorrect.Windows_7.approved.png | Bin ...WebQuizTest.testCircle.Mac_OS_X.approved.png | Bin ...ebQuizTest.testCircle.Windows_7.approved.png | Bin ...ebQuizTest.testCorrect.Mac_OS_X.approved.png | Bin ...ebQuizTest.testCorrect.Mac_OS_X.received.png | Bin ...bQuizTest.testCorrect.Windows_7.approved.png | Bin ...QuizTest.testIncorrect.Mac_OS_X.approved.png | Bin ...uizTest.testIncorrect.Windows_7.approved.png | Bin .../TortoiseTest.testBigWidth.approved.png | Bin .../TortoiseTest.testSimpleSquare.approved.png | Bin ...eQuizTest.testCorrect.Windows_7.approved.png | Bin ...uizTest.testIncorrect.Windows_7.approved.png | Bin ...anelTest.testImageForBackground.approved.png | Bin .../TurtleTest.testHide.approved.png | Bin .../TurtleTest.testMove.approved.png | Bin ...urtleTest.testMove45DegreesLeft.approved.png | Bin .../TurtleTest.testPenDown.approved.png | Bin .../TurtleTest.testPentagonCrazy.approved.png | Bin .../TurtleTest.testRotate.approved.png | Bin .../TurtleTest.testRotate45.approved.png | Bin ...st.testRotate45CounterClockwise.approved.png | Bin .../TurtleTest.testShow.approved.png | Bin 57 files changed, 0 insertions(+), 0 deletions(-) rename src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/{AdLibsQuizTest.testCorrect.Mac_OS_X.received.png => AdLibsQuizTest.testCorrect.Mac_OS_X.approved.png} (100%) rename src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/{AdLibsQuizTest.testIncorrect.Mac_OS_X.received.png => AdLibsQuizTest.testIncorrect.Mac_OS_X.approved.png} (100%) rename src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/{HiLowQuizTest.testCorrect.Mac_OS_X.received.png => HiLowQuizTest.testCorrect.Mac_OS_X.approved.png} (100%) rename src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/{HiLowQuizTest.testIncorrect.Mac_OS_X.received.png => HiLowQuizTest.testIncorrect.Mac_OS_X.approved.png} (100%) rename src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/{QuizBuzzTest.testCorrect.Mac_OS_X.received.png => QuizBuzzTest.testCorrect.Mac_OS_X.approved.png} (100%) rename src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/{QuizBuzzTest.testIncorrect.Mac_OS_X.received.png => QuizBuzzTest.testIncorrect.Mac_OS_X.approved.png} (100%) rename src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/{SimpleBubbleQuizTest.testCorrect.Mac_OS_X.received.png => SimpleBubbleQuizTest.testCorrect.Mac_OS_X.approved.png} (100%) rename src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/{SimpleBubbleQuizTest.testIncorrect.Mac_OS_X.received.png => SimpleBubbleQuizTest.testIncorrect.Mac_OS_X.approved.png} (100%) rename src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/{TreeQuizTest.testCorrect.Mac_OS_X.received.png => TreeQuizTest.testCorrect.Mac_OS_X.approved.png} (100%) rename src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/{TreeQuizTest.testIncorrect.Mac_OS_X.received.png => TreeQuizTest.testIncorrect.Mac_OS_X.approved.png} (100%) rename src/test/resources/{images/AdLibsQuizTest.testCorrect.Windows_7.approved.png => AdLibsQuizTest.testCorrect.Mac_OS_X.approved.png} (100%) create mode 100644 src/test/resources/AdLibsQuizTest.testCorrect.Windows_7.approved.png rename src/test/resources/{images/AdLibsQuizTest.testIncorrect.Windows_7.approved.png => AdLibsQuizTest.testIncorrect.Mac_OS_X.approved.png} (100%) create mode 100644 src/test/resources/AdLibsQuizTest.testIncorrect.Windows_7.approved.png rename src/test/resources/{images => }/HiLowQuizTest.testCorrect.Windows_7.approved.png (100%) rename src/test/resources/{images => }/HiLowQuizTest.testIncorrect.Windows_7.approved.png (100%) rename src/test/resources/{images => }/HousesQuizTest.testCorrect.Mac_OS_X.approved.png (100%) rename src/test/resources/{images => }/HousesQuizTest.testCorrect.Windows_7.approved.png (100%) rename src/test/resources/{images => }/HousesQuizTest.testIncorrect.Mac_OS_X.approved.png (100%) rename src/test/resources/{images => }/HousesQuizTest.testIncorrect.Windows_7.approved.png (100%) rename src/test/resources/{images => }/PentagonCrazyQuizTest.testCorrect.Mac_OS_X.approved.png (100%) rename src/test/resources/{images => }/PentagonCrazyQuizTest.testCorrect.Windows_7.approved.png (100%) rename src/test/resources/{images => }/PentagonCrazyQuizTest.testIncorrect.Mac_OS_X.approved.png (100%) rename src/test/resources/{images => }/PentagonCrazyQuizTest.testIncorrect.Windows_7.approved.png (100%) rename src/test/resources/{images => }/RecipeTests.testCircle.approved.png (100%) rename src/test/resources/{images => }/RecipeTests.testDigiGirlzFlower.approved.png (100%) rename src/test/resources/{images => }/RecipeTests.testFourSquare.approved.png (100%) rename src/test/resources/{images => }/RecipeTests.testKnottedRing.approved.png (100%) rename src/test/resources/{images => }/RecipeTests.testSimpleSquare.approved.png (100%) rename src/test/resources/{images => }/RecipeTests.testSpiral.approved.png (100%) rename src/test/resources/{images => }/RecipeTests.testTriangleShell.approved.png (100%) rename src/test/resources/{images => }/RecipeTests.testTurtleTree.approved.png (100%) rename src/test/resources/{images => }/SimpleSquareQuizTest.testCorrect.Mac_OS_X.approved.png (100%) rename src/test/resources/{images => }/SimpleSquareQuizTest.testCorrect.Windows_7.approved.png (100%) rename src/test/resources/{images => }/SimpleSquareQuizTest.testIncorrect.Mac_OS_X.approved.png (100%) rename src/test/resources/{images => }/SimpleSquareQuizTest.testIncorrect.Windows_7.approved.png (100%) rename src/test/resources/{images => }/SpiderWebQuizTest.testCircle.Mac_OS_X.approved.png (100%) rename src/test/resources/{images => }/SpiderWebQuizTest.testCircle.Windows_7.approved.png (100%) rename src/test/resources/{images => }/SpiderWebQuizTest.testCorrect.Mac_OS_X.approved.png (100%) rename src/test/resources/{images => }/SpiderWebQuizTest.testCorrect.Mac_OS_X.received.png (100%) rename src/test/resources/{images => }/SpiderWebQuizTest.testCorrect.Windows_7.approved.png (100%) rename src/test/resources/{images => }/SpiderWebQuizTest.testIncorrect.Mac_OS_X.approved.png (100%) rename src/test/resources/{images => }/SpiderWebQuizTest.testIncorrect.Windows_7.approved.png (100%) rename src/test/resources/{images => }/TortoiseTest.testBigWidth.approved.png (100%) rename src/test/resources/{images => }/TortoiseTest.testSimpleSquare.approved.png (100%) rename src/test/resources/{images => }/TreeQuizTest.testCorrect.Windows_7.approved.png (100%) rename src/test/resources/{images => }/TreeQuizTest.testIncorrect.Windows_7.approved.png (100%) rename src/test/resources/{images => }/TurtlePanelTest.testImageForBackground.approved.png (100%) rename src/test/resources/{images => }/TurtleTest.testHide.approved.png (100%) rename src/test/resources/{images => }/TurtleTest.testMove.approved.png (100%) rename src/test/resources/{images => }/TurtleTest.testMove45DegreesLeft.approved.png (100%) rename src/test/resources/{images => }/TurtleTest.testPenDown.approved.png (100%) rename src/test/resources/{images => }/TurtleTest.testPentagonCrazy.approved.png (100%) rename src/test/resources/{images => }/TurtleTest.testRotate.approved.png (100%) rename src/test/resources/{images => }/TurtleTest.testRotate45.approved.png (100%) rename src/test/resources/{images => }/TurtleTest.testRotate45CounterClockwise.approved.png (100%) rename src/test/resources/{images => }/TurtleTest.testShow.approved.png (100%) diff --git a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/AdLibsQuizTest.testCorrect.Mac_OS_X.received.png b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/AdLibsQuizTest.testCorrect.Mac_OS_X.approved.png similarity index 100% rename from src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/AdLibsQuizTest.testCorrect.Mac_OS_X.received.png rename to src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/AdLibsQuizTest.testCorrect.Mac_OS_X.approved.png diff --git a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/AdLibsQuizTest.testIncorrect.Mac_OS_X.received.png b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/AdLibsQuizTest.testIncorrect.Mac_OS_X.approved.png similarity index 100% rename from src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/AdLibsQuizTest.testIncorrect.Mac_OS_X.received.png rename to src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/AdLibsQuizTest.testIncorrect.Mac_OS_X.approved.png diff --git a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/HiLowQuizTest.testCorrect.Mac_OS_X.received.png b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/HiLowQuizTest.testCorrect.Mac_OS_X.approved.png similarity index 100% rename from src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/HiLowQuizTest.testCorrect.Mac_OS_X.received.png rename to src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/HiLowQuizTest.testCorrect.Mac_OS_X.approved.png diff --git a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/HiLowQuizTest.testIncorrect.Mac_OS_X.received.png b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/HiLowQuizTest.testIncorrect.Mac_OS_X.approved.png similarity index 100% rename from src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/HiLowQuizTest.testIncorrect.Mac_OS_X.received.png rename to src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/HiLowQuizTest.testIncorrect.Mac_OS_X.approved.png diff --git a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/QuizBuzzTest.testCorrect.Mac_OS_X.received.png b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/QuizBuzzTest.testCorrect.Mac_OS_X.approved.png similarity index 100% rename from src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/QuizBuzzTest.testCorrect.Mac_OS_X.received.png rename to src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/QuizBuzzTest.testCorrect.Mac_OS_X.approved.png diff --git a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/QuizBuzzTest.testIncorrect.Mac_OS_X.received.png b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/QuizBuzzTest.testIncorrect.Mac_OS_X.approved.png similarity index 100% rename from src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/QuizBuzzTest.testIncorrect.Mac_OS_X.received.png rename to src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/QuizBuzzTest.testIncorrect.Mac_OS_X.approved.png diff --git a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleBubbleQuizTest.testCorrect.Mac_OS_X.received.png b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleBubbleQuizTest.testCorrect.Mac_OS_X.approved.png similarity index 100% rename from src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleBubbleQuizTest.testCorrect.Mac_OS_X.received.png rename to src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleBubbleQuizTest.testCorrect.Mac_OS_X.approved.png diff --git a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleBubbleQuizTest.testIncorrect.Mac_OS_X.received.png b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleBubbleQuizTest.testIncorrect.Mac_OS_X.approved.png similarity index 100% rename from src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleBubbleQuizTest.testIncorrect.Mac_OS_X.received.png rename to src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleBubbleQuizTest.testIncorrect.Mac_OS_X.approved.png diff --git a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/TreeQuizTest.testCorrect.Mac_OS_X.received.png b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/TreeQuizTest.testCorrect.Mac_OS_X.approved.png similarity index 100% rename from src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/TreeQuizTest.testCorrect.Mac_OS_X.received.png rename to src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/TreeQuizTest.testCorrect.Mac_OS_X.approved.png diff --git a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/TreeQuizTest.testIncorrect.Mac_OS_X.received.png b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/TreeQuizTest.testIncorrect.Mac_OS_X.approved.png similarity index 100% rename from src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/TreeQuizTest.testIncorrect.Mac_OS_X.received.png rename to src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/TreeQuizTest.testIncorrect.Mac_OS_X.approved.png diff --git a/src/test/resources/images/AdLibsQuizTest.testCorrect.Windows_7.approved.png b/src/test/resources/AdLibsQuizTest.testCorrect.Mac_OS_X.approved.png similarity index 100% rename from src/test/resources/images/AdLibsQuizTest.testCorrect.Windows_7.approved.png rename to src/test/resources/AdLibsQuizTest.testCorrect.Mac_OS_X.approved.png diff --git a/src/test/resources/AdLibsQuizTest.testCorrect.Windows_7.approved.png b/src/test/resources/AdLibsQuizTest.testCorrect.Windows_7.approved.png new file mode 100644 index 0000000000000000000000000000000000000000..95019d9b375e3b8aa685f5306581ba590f392c39 GIT binary patch literal 12506 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 U=r!=41&K@NubwOZ@y5OX0#j}BiU0rr literal 0 HcmV?d00001 diff --git a/src/test/resources/images/AdLibsQuizTest.testIncorrect.Windows_7.approved.png b/src/test/resources/AdLibsQuizTest.testIncorrect.Mac_OS_X.approved.png similarity index 100% rename from src/test/resources/images/AdLibsQuizTest.testIncorrect.Windows_7.approved.png rename to src/test/resources/AdLibsQuizTest.testIncorrect.Mac_OS_X.approved.png diff --git a/src/test/resources/AdLibsQuizTest.testIncorrect.Windows_7.approved.png b/src/test/resources/AdLibsQuizTest.testIncorrect.Windows_7.approved.png new file mode 100644 index 0000000000000000000000000000000000000000..e40bbf6b9e942da60405dc551d17e2250c108e71 GIT binary patch literal 8830 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 literal 0 HcmV?d00001 diff --git a/src/test/resources/images/HiLowQuizTest.testCorrect.Windows_7.approved.png b/src/test/resources/HiLowQuizTest.testCorrect.Windows_7.approved.png similarity index 100% rename from src/test/resources/images/HiLowQuizTest.testCorrect.Windows_7.approved.png rename to src/test/resources/HiLowQuizTest.testCorrect.Windows_7.approved.png diff --git a/src/test/resources/images/HiLowQuizTest.testIncorrect.Windows_7.approved.png b/src/test/resources/HiLowQuizTest.testIncorrect.Windows_7.approved.png similarity index 100% rename from src/test/resources/images/HiLowQuizTest.testIncorrect.Windows_7.approved.png rename to src/test/resources/HiLowQuizTest.testIncorrect.Windows_7.approved.png diff --git a/src/test/resources/images/HousesQuizTest.testCorrect.Mac_OS_X.approved.png b/src/test/resources/HousesQuizTest.testCorrect.Mac_OS_X.approved.png similarity index 100% rename from src/test/resources/images/HousesQuizTest.testCorrect.Mac_OS_X.approved.png rename to src/test/resources/HousesQuizTest.testCorrect.Mac_OS_X.approved.png diff --git a/src/test/resources/images/HousesQuizTest.testCorrect.Windows_7.approved.png b/src/test/resources/HousesQuizTest.testCorrect.Windows_7.approved.png similarity index 100% rename from src/test/resources/images/HousesQuizTest.testCorrect.Windows_7.approved.png rename to src/test/resources/HousesQuizTest.testCorrect.Windows_7.approved.png diff --git a/src/test/resources/images/HousesQuizTest.testIncorrect.Mac_OS_X.approved.png b/src/test/resources/HousesQuizTest.testIncorrect.Mac_OS_X.approved.png similarity index 100% rename from src/test/resources/images/HousesQuizTest.testIncorrect.Mac_OS_X.approved.png rename to src/test/resources/HousesQuizTest.testIncorrect.Mac_OS_X.approved.png diff --git a/src/test/resources/images/HousesQuizTest.testIncorrect.Windows_7.approved.png b/src/test/resources/HousesQuizTest.testIncorrect.Windows_7.approved.png similarity index 100% rename from src/test/resources/images/HousesQuizTest.testIncorrect.Windows_7.approved.png rename to src/test/resources/HousesQuizTest.testIncorrect.Windows_7.approved.png diff --git a/src/test/resources/images/PentagonCrazyQuizTest.testCorrect.Mac_OS_X.approved.png b/src/test/resources/PentagonCrazyQuizTest.testCorrect.Mac_OS_X.approved.png similarity index 100% rename from src/test/resources/images/PentagonCrazyQuizTest.testCorrect.Mac_OS_X.approved.png rename to src/test/resources/PentagonCrazyQuizTest.testCorrect.Mac_OS_X.approved.png diff --git a/src/test/resources/images/PentagonCrazyQuizTest.testCorrect.Windows_7.approved.png b/src/test/resources/PentagonCrazyQuizTest.testCorrect.Windows_7.approved.png similarity index 100% rename from src/test/resources/images/PentagonCrazyQuizTest.testCorrect.Windows_7.approved.png rename to src/test/resources/PentagonCrazyQuizTest.testCorrect.Windows_7.approved.png diff --git a/src/test/resources/images/PentagonCrazyQuizTest.testIncorrect.Mac_OS_X.approved.png b/src/test/resources/PentagonCrazyQuizTest.testIncorrect.Mac_OS_X.approved.png similarity index 100% rename from src/test/resources/images/PentagonCrazyQuizTest.testIncorrect.Mac_OS_X.approved.png rename to src/test/resources/PentagonCrazyQuizTest.testIncorrect.Mac_OS_X.approved.png diff --git a/src/test/resources/images/PentagonCrazyQuizTest.testIncorrect.Windows_7.approved.png b/src/test/resources/PentagonCrazyQuizTest.testIncorrect.Windows_7.approved.png similarity index 100% rename from src/test/resources/images/PentagonCrazyQuizTest.testIncorrect.Windows_7.approved.png rename to src/test/resources/PentagonCrazyQuizTest.testIncorrect.Windows_7.approved.png diff --git a/src/test/resources/images/RecipeTests.testCircle.approved.png b/src/test/resources/RecipeTests.testCircle.approved.png similarity index 100% rename from src/test/resources/images/RecipeTests.testCircle.approved.png rename to src/test/resources/RecipeTests.testCircle.approved.png diff --git a/src/test/resources/images/RecipeTests.testDigiGirlzFlower.approved.png b/src/test/resources/RecipeTests.testDigiGirlzFlower.approved.png similarity index 100% rename from src/test/resources/images/RecipeTests.testDigiGirlzFlower.approved.png rename to src/test/resources/RecipeTests.testDigiGirlzFlower.approved.png diff --git a/src/test/resources/images/RecipeTests.testFourSquare.approved.png b/src/test/resources/RecipeTests.testFourSquare.approved.png similarity index 100% rename from src/test/resources/images/RecipeTests.testFourSquare.approved.png rename to src/test/resources/RecipeTests.testFourSquare.approved.png diff --git a/src/test/resources/images/RecipeTests.testKnottedRing.approved.png b/src/test/resources/RecipeTests.testKnottedRing.approved.png similarity index 100% rename from src/test/resources/images/RecipeTests.testKnottedRing.approved.png rename to src/test/resources/RecipeTests.testKnottedRing.approved.png diff --git a/src/test/resources/images/RecipeTests.testSimpleSquare.approved.png b/src/test/resources/RecipeTests.testSimpleSquare.approved.png similarity index 100% rename from src/test/resources/images/RecipeTests.testSimpleSquare.approved.png rename to src/test/resources/RecipeTests.testSimpleSquare.approved.png diff --git a/src/test/resources/images/RecipeTests.testSpiral.approved.png b/src/test/resources/RecipeTests.testSpiral.approved.png similarity index 100% rename from src/test/resources/images/RecipeTests.testSpiral.approved.png rename to src/test/resources/RecipeTests.testSpiral.approved.png diff --git a/src/test/resources/images/RecipeTests.testTriangleShell.approved.png b/src/test/resources/RecipeTests.testTriangleShell.approved.png similarity index 100% rename from src/test/resources/images/RecipeTests.testTriangleShell.approved.png rename to src/test/resources/RecipeTests.testTriangleShell.approved.png diff --git a/src/test/resources/images/RecipeTests.testTurtleTree.approved.png b/src/test/resources/RecipeTests.testTurtleTree.approved.png similarity index 100% rename from src/test/resources/images/RecipeTests.testTurtleTree.approved.png rename to src/test/resources/RecipeTests.testTurtleTree.approved.png diff --git a/src/test/resources/images/SimpleSquareQuizTest.testCorrect.Mac_OS_X.approved.png b/src/test/resources/SimpleSquareQuizTest.testCorrect.Mac_OS_X.approved.png similarity index 100% rename from src/test/resources/images/SimpleSquareQuizTest.testCorrect.Mac_OS_X.approved.png rename to src/test/resources/SimpleSquareQuizTest.testCorrect.Mac_OS_X.approved.png diff --git a/src/test/resources/images/SimpleSquareQuizTest.testCorrect.Windows_7.approved.png b/src/test/resources/SimpleSquareQuizTest.testCorrect.Windows_7.approved.png similarity index 100% rename from src/test/resources/images/SimpleSquareQuizTest.testCorrect.Windows_7.approved.png rename to src/test/resources/SimpleSquareQuizTest.testCorrect.Windows_7.approved.png diff --git a/src/test/resources/images/SimpleSquareQuizTest.testIncorrect.Mac_OS_X.approved.png b/src/test/resources/SimpleSquareQuizTest.testIncorrect.Mac_OS_X.approved.png similarity index 100% rename from src/test/resources/images/SimpleSquareQuizTest.testIncorrect.Mac_OS_X.approved.png rename to src/test/resources/SimpleSquareQuizTest.testIncorrect.Mac_OS_X.approved.png diff --git a/src/test/resources/images/SimpleSquareQuizTest.testIncorrect.Windows_7.approved.png b/src/test/resources/SimpleSquareQuizTest.testIncorrect.Windows_7.approved.png similarity index 100% rename from src/test/resources/images/SimpleSquareQuizTest.testIncorrect.Windows_7.approved.png rename to src/test/resources/SimpleSquareQuizTest.testIncorrect.Windows_7.approved.png diff --git a/src/test/resources/images/SpiderWebQuizTest.testCircle.Mac_OS_X.approved.png b/src/test/resources/SpiderWebQuizTest.testCircle.Mac_OS_X.approved.png similarity index 100% rename from src/test/resources/images/SpiderWebQuizTest.testCircle.Mac_OS_X.approved.png rename to src/test/resources/SpiderWebQuizTest.testCircle.Mac_OS_X.approved.png diff --git a/src/test/resources/images/SpiderWebQuizTest.testCircle.Windows_7.approved.png b/src/test/resources/SpiderWebQuizTest.testCircle.Windows_7.approved.png similarity index 100% rename from src/test/resources/images/SpiderWebQuizTest.testCircle.Windows_7.approved.png rename to src/test/resources/SpiderWebQuizTest.testCircle.Windows_7.approved.png diff --git a/src/test/resources/images/SpiderWebQuizTest.testCorrect.Mac_OS_X.approved.png b/src/test/resources/SpiderWebQuizTest.testCorrect.Mac_OS_X.approved.png similarity index 100% rename from src/test/resources/images/SpiderWebQuizTest.testCorrect.Mac_OS_X.approved.png rename to src/test/resources/SpiderWebQuizTest.testCorrect.Mac_OS_X.approved.png diff --git a/src/test/resources/images/SpiderWebQuizTest.testCorrect.Mac_OS_X.received.png b/src/test/resources/SpiderWebQuizTest.testCorrect.Mac_OS_X.received.png similarity index 100% rename from src/test/resources/images/SpiderWebQuizTest.testCorrect.Mac_OS_X.received.png rename to src/test/resources/SpiderWebQuizTest.testCorrect.Mac_OS_X.received.png diff --git a/src/test/resources/images/SpiderWebQuizTest.testCorrect.Windows_7.approved.png b/src/test/resources/SpiderWebQuizTest.testCorrect.Windows_7.approved.png similarity index 100% rename from src/test/resources/images/SpiderWebQuizTest.testCorrect.Windows_7.approved.png rename to src/test/resources/SpiderWebQuizTest.testCorrect.Windows_7.approved.png diff --git a/src/test/resources/images/SpiderWebQuizTest.testIncorrect.Mac_OS_X.approved.png b/src/test/resources/SpiderWebQuizTest.testIncorrect.Mac_OS_X.approved.png similarity index 100% rename from src/test/resources/images/SpiderWebQuizTest.testIncorrect.Mac_OS_X.approved.png rename to src/test/resources/SpiderWebQuizTest.testIncorrect.Mac_OS_X.approved.png diff --git a/src/test/resources/images/SpiderWebQuizTest.testIncorrect.Windows_7.approved.png b/src/test/resources/SpiderWebQuizTest.testIncorrect.Windows_7.approved.png similarity index 100% rename from src/test/resources/images/SpiderWebQuizTest.testIncorrect.Windows_7.approved.png rename to src/test/resources/SpiderWebQuizTest.testIncorrect.Windows_7.approved.png diff --git a/src/test/resources/images/TortoiseTest.testBigWidth.approved.png b/src/test/resources/TortoiseTest.testBigWidth.approved.png similarity index 100% rename from src/test/resources/images/TortoiseTest.testBigWidth.approved.png rename to src/test/resources/TortoiseTest.testBigWidth.approved.png diff --git a/src/test/resources/images/TortoiseTest.testSimpleSquare.approved.png b/src/test/resources/TortoiseTest.testSimpleSquare.approved.png similarity index 100% rename from src/test/resources/images/TortoiseTest.testSimpleSquare.approved.png rename to src/test/resources/TortoiseTest.testSimpleSquare.approved.png diff --git a/src/test/resources/images/TreeQuizTest.testCorrect.Windows_7.approved.png b/src/test/resources/TreeQuizTest.testCorrect.Windows_7.approved.png similarity index 100% rename from src/test/resources/images/TreeQuizTest.testCorrect.Windows_7.approved.png rename to src/test/resources/TreeQuizTest.testCorrect.Windows_7.approved.png diff --git a/src/test/resources/images/TreeQuizTest.testIncorrect.Windows_7.approved.png b/src/test/resources/TreeQuizTest.testIncorrect.Windows_7.approved.png similarity index 100% rename from src/test/resources/images/TreeQuizTest.testIncorrect.Windows_7.approved.png rename to src/test/resources/TreeQuizTest.testIncorrect.Windows_7.approved.png diff --git a/src/test/resources/images/TurtlePanelTest.testImageForBackground.approved.png b/src/test/resources/TurtlePanelTest.testImageForBackground.approved.png similarity index 100% rename from src/test/resources/images/TurtlePanelTest.testImageForBackground.approved.png rename to src/test/resources/TurtlePanelTest.testImageForBackground.approved.png diff --git a/src/test/resources/images/TurtleTest.testHide.approved.png b/src/test/resources/TurtleTest.testHide.approved.png similarity index 100% rename from src/test/resources/images/TurtleTest.testHide.approved.png rename to src/test/resources/TurtleTest.testHide.approved.png diff --git a/src/test/resources/images/TurtleTest.testMove.approved.png b/src/test/resources/TurtleTest.testMove.approved.png similarity index 100% rename from src/test/resources/images/TurtleTest.testMove.approved.png rename to src/test/resources/TurtleTest.testMove.approved.png diff --git a/src/test/resources/images/TurtleTest.testMove45DegreesLeft.approved.png b/src/test/resources/TurtleTest.testMove45DegreesLeft.approved.png similarity index 100% rename from src/test/resources/images/TurtleTest.testMove45DegreesLeft.approved.png rename to src/test/resources/TurtleTest.testMove45DegreesLeft.approved.png diff --git a/src/test/resources/images/TurtleTest.testPenDown.approved.png b/src/test/resources/TurtleTest.testPenDown.approved.png similarity index 100% rename from src/test/resources/images/TurtleTest.testPenDown.approved.png rename to src/test/resources/TurtleTest.testPenDown.approved.png diff --git a/src/test/resources/images/TurtleTest.testPentagonCrazy.approved.png b/src/test/resources/TurtleTest.testPentagonCrazy.approved.png similarity index 100% rename from src/test/resources/images/TurtleTest.testPentagonCrazy.approved.png rename to src/test/resources/TurtleTest.testPentagonCrazy.approved.png diff --git a/src/test/resources/images/TurtleTest.testRotate.approved.png b/src/test/resources/TurtleTest.testRotate.approved.png similarity index 100% rename from src/test/resources/images/TurtleTest.testRotate.approved.png rename to src/test/resources/TurtleTest.testRotate.approved.png diff --git a/src/test/resources/images/TurtleTest.testRotate45.approved.png b/src/test/resources/TurtleTest.testRotate45.approved.png similarity index 100% rename from src/test/resources/images/TurtleTest.testRotate45.approved.png rename to src/test/resources/TurtleTest.testRotate45.approved.png diff --git a/src/test/resources/images/TurtleTest.testRotate45CounterClockwise.approved.png b/src/test/resources/TurtleTest.testRotate45CounterClockwise.approved.png similarity index 100% rename from src/test/resources/images/TurtleTest.testRotate45CounterClockwise.approved.png rename to src/test/resources/TurtleTest.testRotate45CounterClockwise.approved.png diff --git a/src/test/resources/images/TurtleTest.testShow.approved.png b/src/test/resources/TurtleTest.testShow.approved.png similarity index 100% rename from src/test/resources/images/TurtleTest.testShow.approved.png rename to src/test/resources/TurtleTest.testShow.approved.png From bc6e04b4d352b16a2a7dd47e95537e438852e213 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Mon, 16 Mar 2015 23:14:05 -0700 Subject: [PATCH 020/111] Removed unused methods --- src/main/java/com/spun/util/ObjectUtils.java | 404 ++++------ .../spun/util/parser/TemplateStringUtils.java | 215 ++---- ...orGeneration.testHtmlDisplay.approved.html | 8 +- ...orGeneration.testHtmlDisplay.received.html | 702 ------------------ 4 files changed, 181 insertions(+), 1148 deletions(-) delete mode 100644 src/test/java/org/teachingextensions/logo/tests/ColorGeneration.testHtmlDisplay.received.html diff --git a/src/main/java/com/spun/util/ObjectUtils.java b/src/main/java/com/spun/util/ObjectUtils.java index f6126d1..dbe9936 100644 --- a/src/main/java/com/spun/util/ObjectUtils.java +++ b/src/main/java/com/spun/util/ObjectUtils.java @@ -9,274 +9,138 @@ /** * A static class of convenience functions for Manipulating objects **/ -public class ObjectUtils -{ - public static int generateHashCode(Object... relevantMembers) - { - final int PRIME = 31; - int result = 1; - for (Object member : relevantMembers) - { - result = PRIME * result + ((member == null) ? 0 : member.hashCode()); - } - return result; - } - /***********************************************************************/ - /** - * tests if two objects are equal for all functions passed. - **/ - public static boolean isEqualForMethods(Object o1, Object o2, String[] methods) - { - try - { - Method[] m1 = getMethodsForObject(o1, methods); - Method[] m2 = getMethodsForObject(o2, methods); - for (int i = 0; i < m1.length; i++) - { - Object v1 = m1[i].invoke(o1, (Object[]) null); - Object v2 = m2[i].invoke(o2, (Object[]) null); - if (!isEqual(v1, v2)) { return false; } - } - return true; - } - catch (Throwable t) - { - throw new Error(t); - } - } - /***********************************************************************/ - public static Method[] getMethodsForObject(Object o2, String[] passedMethods) throws SecurityException, - NoSuchMethodException - { - Method methods[] = new Method[passedMethods.length]; - Class clazz = o2.getClass(); - for (int i = 0; i < passedMethods.length; i++) - { - methods[i] = clazz.getMethod(passedMethods[i], (Class[]) null); - } - return methods; - } - /***********************************************************************/ - /** - * A convenience function to check if 2 strings are equal. - * @param string The string in question - * @return true if Equal. - **/ - public static boolean isEqual(Object s1, Object s2) - { - if (s1 == s2) - { - return true; - } - else if ((s1 != null) && s1.equals(s2)) - { - return true; - } - else - { - return false; - } - } - /***********************************************************************/ - public static boolean isIn(Object target, Object[] objects) - { - for (int i = 0; i < objects.length; i++) - { - if (ObjectUtils.isEqual(objects[i], target)) { return true; } - } - return false; - } - /***********************************************************************/ - public static T getForMethod(T[] onArray, Object forValue, String... onMethods) - { - return getForMethod(onArray, forValue, new MethodExecutionPath(null, onMethods)); - } - /***********************************************************************/ - public static T getForMethod(T[] onArray, Object forValue, String onMethod) - { - return getForMethod(onArray, forValue, new MethodExecutionPath(null, onMethod, null)); - } - /***********************************************************************/ - public static T getForMethod(T[] onArray, Object forValue, String onMethod, Object[] params) - { - return getForMethod(onArray, forValue, new MethodExecutionPath(null, onMethod, - new MethodExecutionPath.Parameters(params))); - } - /***********************************************************************/ - public static T getForMethod(T[] onArray, Object forValue, MethodExecutionPath path) - { - if (onArray == null || (onArray.length == 0)) { return null; } - try - { - for (int i = 0; i < onArray.length; i++) - { - if (isEqual(forValue, path.extractValue(onArray[i]))) { return onArray[i]; } - } - return null; - } - catch (Throwable t) - { - throw throwAsError(t); - } - } - /***********************************************************************/ - public static boolean isThisInstanceOfThat(Class thiz, Class that) - { - return that.isAssignableFrom(thiz); - } - /***********************************************************************/ - public static Error throwAsError(Throwable t) throws Error - { - if (t instanceof RuntimeException) - { - throw (RuntimeException) t; - } - else if (t instanceof Error) - { - throw (Error) t; - } - else - { - throw new Error(t); - } - } - /***********************************************************************/ - public static T getRandomIndex(T[] array) - { - if ((array == null) || (array.length == 0)) { return null; } - return array[NumberUtils.RANDOM.nextInt(array.length)]; - } - /***********************************************************************/ - /** - * @deprecated use Query.select() - */ - public static Object[] extractArray(Object[] from, String methodName) - { - try - { - if (from == null || from.length == 0) { return new Object[0]; } - Method method = getGreatestCommonDenominator(from, methodName); - Object[] array = null; - if (Object.class.isAssignableFrom(method.getReturnType())) - { - array = (Object[]) Array.newInstance(method.getReturnType(), from.length); - } - else - { - array = (Object[]) Array.newInstance(ClassUtils.getWrapperClass(method.getReturnType()), from.length); - } - for (int i = 0; i < from.length; i++) - { - array[i] = method.invoke(from[i], (Object[]) null); - } - return array; - } - catch (Exception e) - { - MySystem.warning(e); - throw ObjectUtils.throwAsError(e); - } - } - /***********************************************************************/ - public static Method getGreatestCommonDenominator(Object[] from, String methodName) throws SecurityException, - NoSuchMethodException - { - List classes = new ArrayList(); - ArrayUtils.addArray(classes, getAllCastableClasses(from[0])); - for (Object o : from) - { - for (int i = classes.size() - 1; i >= 0; i--) - { - Class clazz = classes.get(i); - if (!isThisInstanceOfThat(o.getClass(), clazz) || !ClassUtils.hasMethod(clazz, methodName)) - { - classes.remove(i); - } - } - } - return classes.size() == 0 ? null : ArrayUtils.getLast(classes).getMethod(methodName, (Class[]) null); - } - /***********************************************************************/ - private static Class[] getAllCastableClasses(Object object) - { - Class clazz = object.getClass(); - ArrayList list = new ArrayList(); - while (clazz != null) - { - list.add(clazz); - ArrayUtils.addArray(list, clazz.getInterfaces()); - clazz = clazz.getSuperclass(); - } - Class[] found = (Class[]) list.toArray(new Class[list.size()]); - ArrayUtils.toReverseArray(found); - return found; - } - /***********************************************************************/ - public static Object executeMethod(Object object, String method, Class[] methodSignature, Object[] parameters) - { - try - { - return object.getClass().getMethod(method, methodSignature).invoke(object, parameters); - } - catch (Throwable t) - { - throw throwAsError(t); - } - } - /***********************************************************************/ - public static void assertInstance(Class clazz, Object object) - { - assertInstance(new Class[]{clazz}, object); - } - /***********************************************************************/ - public static void assertInstance(Class classes[], Object object) - { - if (object == null) { throw new NullPointerException("Expected Object of Type " - + Arrays.asList(extractArray(classes, "getName")) + " but was null"); } - for (int i = 0; i < classes.length; i++) - { - if (ClassUtils.getWrapperClass(classes[i]).isInstance(object)) { return; } - } - throw new IllegalArgumentException("Expected Object of Type " - + Arrays.asList(extractArray(classes, "getName")) + " but got " + object.getClass().getName()); - } - /***********************************************************************/ - public static String getClassName(Object o) - { - return o == null ? "null" : o.getClass().getName(); - } - /***********************************************************************/ - public static void assertInstanceOrNull(Class type, Object value) - { - if (value != null) - { - assertInstance(type, value); - } - } - /************************************************************************/ - public static void move(Object from, Object to, String[] getters) - { - try - { - for (String method : getters) - { - Method getMethod = from.getClass().getMethod("get" + method, (Class[]) null); - Object value = getMethod.invoke(from, (Object[]) null); - Method m = MethodExecutionPath.Parameters.getBestFitMethod(to.getClass(), "set" + method, - new Class[]{getBestClass(value, getMethod)}); - m.invoke(to, value); - } - } - catch (Exception e) - { - throw throwAsError(e); - } - } - /************************************************************************/ - private static Class getBestClass(Object value, Method method) - { - return value == null ? method.getReturnType() : value.getClass(); - } - /************************************************************************/ - /************************************************************************/ +public class ObjectUtils { + public static Method[] getMethodsForObject(Object o2, String[] passedMethods) + throws SecurityException, NoSuchMethodException { + Method methods[] = new Method[passedMethods.length]; + Class clazz = o2.getClass(); + for (int i = 0; i < passedMethods.length; i++) { + methods[i] = clazz.getMethod(passedMethods[i], (Class[]) null); + } + return methods; + } + + /** + * A convenience function to check if two objects are equal. + * + * @param s1 + * The first object + * @param s2 + * The second object + * @return true if Equal. + **/ + public static boolean isEqual(Object s1, Object s2) { + if (s1 == s2) { + return true; + } else if ((s1 != null) && s1.equals(s2)) { + return true; + } else { + return false; + } + } + + public static boolean isIn(Object target, Object[] objects) { + for (int i = 0; i < objects.length; i++) { + if (ObjectUtils.isEqual(objects[i], target)) { + return true; + } + } + return false; + } + + public static boolean isThisInstanceOfThat(Class thiz, Class that) { + return that.isAssignableFrom(thiz); + } + + public static Error throwAsError(Throwable t) throws Error { + if (t instanceof RuntimeException) { + throw (RuntimeException) t; + } else if (t instanceof Error) { + throw (Error) t; + } else { + throw new Error(t); + } + } + + /** + * @deprecated use Query.select() + */ + public static Object[] extractArray(Object[] from, String methodName) { + try { + if (from == null || from.length == 0) { + return new Object[0]; + } + Method method = getGreatestCommonDenominator(from, methodName); + Object[] array = null; + if (Object.class.isAssignableFrom(method.getReturnType())) { + array = (Object[]) Array.newInstance(method.getReturnType(), + from.length); + } else { + array = (Object[]) Array.newInstance( + ClassUtils.getWrapperClass(method.getReturnType()), + from.length); + } + for (int i = 0; i < from.length; i++) { + array[i] = method.invoke(from[i], (Object[]) null); + } + return array; + } catch (Exception e) { + MySystem.warning(e); + throw ObjectUtils.throwAsError(e); + } + } + + public static Method getGreatestCommonDenominator(Object[] from, + String methodName) throws SecurityException, NoSuchMethodException { + List classes = new ArrayList(); + ArrayUtils.addArray(classes, getAllCastableClasses(from[0])); + for (Object o : from) { + for (int i = classes.size() - 1; i >= 0; i--) { + Class clazz = classes.get(i); + if (!isThisInstanceOfThat(o.getClass(), clazz) + || !ClassUtils.hasMethod(clazz, methodName)) { + classes.remove(i); + } + } + } + return classes.size() == 0 ? null : ArrayUtils.getLast(classes) + .getMethod(methodName, (Class[]) null); + } + + private static Class[] getAllCastableClasses(Object object) { + Class clazz = object.getClass(); + ArrayList list = new ArrayList(); + while (clazz != null) { + list.add(clazz); + ArrayUtils.addArray(list, clazz.getInterfaces()); + clazz = clazz.getSuperclass(); + } + Class[] found = (Class[]) list.toArray(new Class[list.size()]); + ArrayUtils.toReverseArray(found); + return found; + } + + public static void assertInstance(Class clazz, Object object) { + assertInstance(new Class[] { clazz }, object); + } + + public static void assertInstance(Class classes[], Object object) { + if (object == null) { + throw new NullPointerException("Expected Object of Type " + + Arrays.asList(extractArray(classes, "getName")) + + " but was null"); + } + for (int i = 0; i < classes.length; i++) { + if (ClassUtils.getWrapperClass(classes[i]).isInstance(object)) { + return; + } + } + throw new IllegalArgumentException("Expected Object of Type " + + Arrays.asList(extractArray(classes, "getName")) + " but got " + + object.getClass().getName()); + } + + public static String getClassName(Object o) { + return o == null ? "null" : o.getClass().getName(); + } } \ No newline at end of file diff --git a/src/main/java/com/spun/util/parser/TemplateStringUtils.java b/src/main/java/com/spun/util/parser/TemplateStringUtils.java index d031884..2712382 100644 --- a/src/main/java/com/spun/util/parser/TemplateStringUtils.java +++ b/src/main/java/com/spun/util/parser/TemplateStringUtils.java @@ -1,177 +1,48 @@ package com.spun.util.parser; -import java.io.File; -import com.spun.util.StringUtils; +public class TemplateStringUtils { + public static TemplateStringUtils INSTANCE = new TemplateStringUtils(); -public class TemplateStringUtils -{ - public static TemplateStringUtils INSTANCE = new TemplateStringUtils(); - /************************************************************************/ - private TemplateStringUtils() - { - } - /***********************************************************************/ - public String truncate(String onString, int maxLength) - { - return truncate(onString, maxLength, new String[]{}); - } - /***********************************************************************/ - public String plural(int number, String singular, String plural) - { - return String.format("%s %s", number, (number == 1 ? singular:plural)); - } - /***********************************************************************/ - public String truncate(String onString, int maxLength, String minus1, String minus2) - { - return truncate(onString, maxLength, new String[]{"", "", minus1, minus2}); - } - /***********************************************************************/ - public String truncate(String onString, int maxLength, String minus1) - { - return truncate(onString, maxLength, new String[]{"", "", minus1}); - } - /***********************************************************************/ - private String truncate(String onString, int maxLength, String minus[]) - { - if (onString == null || onString.equals("null")) { return ""; } - for (int i = 2; i < minus.length; i++) - { - maxLength -= minus[i] != null ? minus[i].length() : 0; - } - maxLength = (maxLength < 0) ? 0 : maxLength; - return StringUtils.truncate(onString, maxLength); - } - /************************************************************************/ - public static String clearNull(String value) - { - return clearNull(value, ""); - } - /************************************************************************/ - public static String clearNull(Object value, String replacingValue) - { - return (("null".equals(value) || value == null) ? replacingValue : value.toString()); - } - /************************************************************************/ - /** - * Compare if arg [0] equals any other argument starting at [1]. - * @param params - * @return - **/ - private boolean isIn(String[] params) - { - for (int i = 1; i < params.length; i++) - { - if (params[0].equals(params[i])) { return true; } - } - return false; - } - /************************************************************************/ - /** - * Compare if arg [0] equals any other argument starting at [1]. - * @param params - * @return - **/ - public static boolean isIn(String compare, String inParameter1, String inParameter2) - { - return StringUtils.isIn(compare, new String[]{inParameter1, inParameter2}); - } - /***********************************************************************/ - public static boolean isIn(String compare, String inParameter1) - { - return StringUtils.isIn(compare, new String[]{inParameter1}); - } - /***********************************************************************/ - public static String pad(String original, int length, String paddingCharacter) - { - original = original == null ? "" : original; - int paddingNeeded = length - original.length(); - StringBuffer buffer = new StringBuffer(original); - for (int i = 0; i < paddingNeeded; i++) - { - buffer.append(paddingCharacter); - } - return buffer.toString(); - } - /***********************************************************************/ - private boolean isNull(String main) - { - return !StringUtils.isNonZero(clearNull(main)); - } - /***********************************************************************/ - public String getFileName(String fileName) - { - return fileName.substring(fileName.lastIndexOf(File.separatorChar) + 1); - } - /***********************************************************************/ - public static String formatExcelString(String in) - { - if ("0".equals(in) || "null".equals(in) || in == null) // So that null's & int(0) show up empty - { - return "\"\""; - } - else if (in.indexOf('\"') == -1) - { - return '\"' + in + '\"'; - } - else - { - StringBuffer buffer = new StringBuffer(); - buffer.append('\"'); - for (int i = 0; i < in.length(); i++) - { - char c = in.charAt(i); - buffer.append((c == '\"') ? "\"\"" : "" + c); - } - buffer.append('\"'); - return buffer.toString(); - } - } - /************************************************************************/ - public static int getLength(String s) - { - return s == null ? 0 : s.length(); - } - /************************************************************************/ - public String toHTMLEncode(String string) - { - return StringUtils.toHTMLEncode(clearNull(string)); - } - /************************************************************************/ - public String toURLEncode(String string) - { - return StringUtils.toURLEncode(clearNull(string)); - } - /************************************************************************/ - public static String toJavaScriptEncode(String string) - { - return StringUtils.toJavaScriptEncode(clearNull(string, null)); - } - /************************************************************************/ - public static String toJavaScriptEncode(Number n) - { - return n == null ? "null" : n.toString(); - } - /************************************************************************/ - public static String toJavaScriptEncode(Object n) - { - if (n == null) - { - return "null"; - } - else if (n instanceof Number) - { - return toJavaScriptEncode((Number) n); - } - else - { - return toJavaScriptEncode(n.toString()); - } - } - public static String asXml(String s) - { - return StringUtils.escapeForXml(s); - } - /************************************************************************/ - /************************************************************************/ + private TemplateStringUtils() { + } + + public static String clearNull(String value) { + return clearNull(value, ""); + } + + public static String clearNull(Object value, String replacingValue) { + return (("null".equals(value) || value == null) ? replacingValue + : value.toString()); + } + + public static String formatExcelString(String in) { + if ("0".equals(in) || "null".equals(in) || in == null) // So that null's + // & int(0) show + // up empty + { + return "\"\""; + } else if (in.indexOf('\"') == -1) { + return '\"' + in + '\"'; + } else { + StringBuffer buffer = new StringBuffer(); + buffer.append('\"'); + for (int i = 0; i < in.length(); i++) { + char c = in.charAt(i); + buffer.append((c == '\"') ? "\"\"" : "" + c); + } + buffer.append('\"'); + return buffer.toString(); + } + } + + public static String toJavaScriptEncode(Object n) { + if (n == null) { + return "null"; + } else if (n instanceof Number) { + return toJavaScriptEncode((Number) n); + } else { + return toJavaScriptEncode(n.toString()); + } + } } \ No newline at end of file diff --git a/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.testHtmlDisplay.approved.html b/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.testHtmlDisplay.approved.html index e54090a..5ccdb7b 100644 --- a/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.testHtmlDisplay.approved.html +++ b/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.testHtmlDisplay.approved.html @@ -397,7 +397,7 @@ MediumVioletRed - Reds, Purples, + Purples, Reds, DeepPink @@ -405,7 +405,7 @@ PaleVioletRed - Reds, Purples, + Purples, Reds, Fuchsia @@ -539,7 +539,7 @@ MediumVioletRed - Pinks, Purples, + Purples, Pinks, IndianRed @@ -551,7 +551,7 @@ PaleVioletRed - Pinks, Purples, + Purples, Pinks, Salmon diff --git a/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.testHtmlDisplay.received.html b/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.testHtmlDisplay.received.html deleted file mode 100644 index 5ccdb7b..0000000 --- a/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.testHtmlDisplay.received.html +++ /dev/null @@ -1,702 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Blues
Navy
DarkBlue
MidnightBlue
MediumBlue
Blue
TealGreens,
DarkSlateBluePurples,
DarkCyanGreens,
SteelBlue
RoyalBlue
SlateBluePurples,
CadetBlue
DarkTurquoiseGreens,
DodgerBlue
DeepSkyBlue
MediumSlateBluePurples,
MediumTurquoiseGreens,
CornflowerBlue
TurquoiseGreens,
Aqua
Cyan
SkyBlue
LightSkyBlue
AquamarineGreens,
LightSteelBlue
LightBlue
PowderBlue
PaleTurquoiseGreens,
LightCyan
AliceBlueWhites,
AzureWhites,
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Browns
Maroon
SaddleBrown
Brown
Sienna
DarkGoldenrodYellows,
Chocolate
Peru
GoldenrodYellows,
RosyBrownPurples,
SandyBrown
Tan
BurlyWood
Wheat
NavajoWhite
Bisque
BlanchedAlmond
Cornsilk
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Grays
Black
DarkSlateGray
DimGray
Gray
SlateGray
LightSlateGray
DarkGray
Silver
LightGray
Gainsboro
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Greens
DarkGreen
Green
ForestGreen
DarkOliveGreen
Lime
Olive
TealBlues,
SeaGreen
DarkCyanBlues,
OliveDrab
LimeGreen
MediumSeaGreen
LawnGreen
LightSeaGreen
Chartreuse
SpringGreen
MediumSpringGreen
YellowGreen
DarkTurquoiseBlues,
DarkSeaGreen
GreenYellow
MediumAquamarine
MediumTurquoiseBlues,
TurquoiseBlues,
LightGreen
PaleGreen
AquamarineBlues,
PaleTurquoiseBlues,
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Oranges
OrangeRedReds,
DarkOrange
Orange
TomatoReds,
Coral
LightSalmonReds,
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Pinks
MediumVioletRedPurples, Reds,
DeepPink
PaleVioletRedPurples, Reds,
FuchsiaPurples,
HotPink
LightPink
Pink
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Purples
Indigo
Purple
DarkSlateBlueBlues,
DarkMagenta
MediumVioletRedReds, Pinks,
DarkViolet
SlateBlueBlues,
BlueViolet
DarkOrchid
MediumSlateBlueBlues,
RosyBrownBrowns,
MediumPurple
PaleVioletRedReds, Pinks,
MediumOrchid
FuchsiaPinks,
Magenta
Orchid
Plum
Violet
Thistle
Lavender
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Reds
DarkRed
FireBrick
Red
Crimson
OrangeRedOranges,
MediumVioletRedPurples, Pinks,
IndianRed
TomatoOranges,
PaleVioletRedPurples, Pinks,
Salmon
LightCoral
DarkSalmon
LightSalmonOranges,
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Whites
AntiqueWhite
MistyRose
Beige
Linen
OldLace
Honeydew
WhiteSmoke
Seashell
LavenderBlush
AliceBlueBlues,
FloralWhite
MintCream
AzureBlues,
Ivory
GhostWhite
Snow
White
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Yellows
DarkGoldenrodBrowns,
GoldenrodBrowns,
Gold
DarkKhaki
Yellow
Khaki
PaleGoldenrod
PeachPuff
Moccasin
PapayaWhip
LemonChiffon
LightGoldenrodYellow
LightYellow
From 858fc0f69f223021bf4dff208198ec2d8fdb0a4a Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Mon, 16 Mar 2015 23:43:32 -0700 Subject: [PATCH 021/111] Cleanup unused methods --- .../com/spun/util/MethodExecutionPath.java | 248 ++++-------------- .../logo/tests/ColorsTest.java | 6 +- .../logo/tests/RecipeTests.java | 40 +-- .../logo/tests/TortoiseTest.java | 6 +- .../logo/tests/TurtleTest.java | 12 +- .../quizzes/tests/PentagonCrazyQuizTest.java | 10 +- .../quizzes/tests/SimpleSquareQuizTest.java | 120 ++++----- 7 files changed, 153 insertions(+), 289 deletions(-) diff --git a/src/main/java/com/spun/util/MethodExecutionPath.java b/src/main/java/com/spun/util/MethodExecutionPath.java index e979ab4..755ea1e 100644 --- a/src/main/java/com/spun/util/MethodExecutionPath.java +++ b/src/main/java/com/spun/util/MethodExecutionPath.java @@ -2,198 +2,66 @@ import java.io.Serializable; import java.lang.reflect.Method; -import java.util.Arrays; import com.spun.util.filters.Filter; import com.spun.util.filters.FilterUtils; -public class MethodExecutionPath implements Serializable -{ - public static final Object NULL_ENCOUNTERED_ON_PATH = new Object(); - private Class classType, returnType; - private String methodNames[]; - private Parameters[] parameters; - private Method methods[]; - /***********************************************************************/ - public MethodExecutionPath(Class clazz, String methodName) - { - this(clazz, new String[]{methodName}, null); - } - /***********************************************************************/ - public MethodExecutionPath(Class clazz, String... methodNames) - { - this(clazz, methodNames, null); - } - /***********************************************************************/ - public MethodExecutionPath(Class clazz, String methodName, Parameters parameters) - { - this(clazz, new String[]{methodName}, new Parameters[]{parameters}); - } - /***********************************************************************/ - public MethodExecutionPath(Class clazz, String[] methodNames, Parameters[] parameters) - { - this.classType = clazz; - this.methodNames = methodNames; - this.parameters = parameters; - this.methods = getRecursiveMethods(clazz, methodNames, parameters); - this.returnType = (this.methods != null) ? methods[methods.length - 1].getReturnType() : null; - } - /************************************************************************/ - public static MethodExecutionPath method(Class class1, String method, Object... paramaters) - { - return new MethodExecutionPath(class1, new String[]{method}, new Parameters[]{new Parameters(paramaters)}); - } - public static Method[] getRecursiveMethods(Class clazz, String[] methodNames, Parameters[] parameters) - { - if (clazz == null) { return null; } - Method methods[] = new Method[methodNames.length]; - String currentMethodName = null; - Parameters parameter = null; - try - { - for (int i = 0; i < methods.length; i++) - { - currentMethodName = methodNames[i]; - parameter = Parameters.getParametersFor(parameters, i); - methods[i] = parameter.getBestFitMethod(clazz, currentMethodName); - clazz = methods[i].getReturnType(); - } - return methods; - } - catch (Exception e) - { - throw new Error("Unable to get method for " + clazz.getName() + "." + currentMethodName + "(" + parameter - + ")", e); - } - } - /***********************************************************************/ - public Object extractValue(Object object) - { - if (object == null) { return NULL_ENCOUNTERED_ON_PATH; } - Method[] methods = this.methods == null ? getRecursiveMethods(object.getClass(), this.methodNames, - this.parameters) : this.methods; - for (int i = 0; i < methods.length; i++) - { - if (object == null) { return NULL_ENCOUNTERED_ON_PATH; } - object = extractValue(object, methods[i], Parameters.getParametersFor(parameters, i).values); - } - return object; - } - /************************************************************************/ - private static Object extractValue(Object object, Method method, Object values[]) - { - try - { - return method.invoke(object, values); - } - catch (Exception e) - { - throw new Error("Problems extracting values from " + object.getClass().getName() + "." + method.getName(), e); - } - } - /************************************************************************/ - public Class getClassType() - { - return classType; - } - /***********************************************************************/ - public Class getReturnType() - { - return returnType; - } - /***********************************************************************/ - /***********************************************************************/ - public static class Parameters - { - public static final Parameters EMPTY = new Parameters(null, null); - public Class[] definitions; - public Object[] values; - /***********************************************************************/ - public Parameters(Object... values) - { - if (!ArrayUtils.isEmpty(values)) - { - this.values = values; - this.definitions = (Class[]) ObjectUtils.extractArray(values, "getClass"); - } - } - /***********************************************************************/ - public Parameters(Class[] definitions, Object[] values) - { - this.definitions = definitions; - this.values = values; - } - /***********************************************************************/ - public Method getBestFitMethod(Class clazz, String currentMethodName) throws NoSuchMethodException - { - return getBestFitMethod(clazz, currentMethodName, definitions); - } - /***********************************************************************/ - public static Method getBestFitMethod(Class clazz, String currentMethodName, Class[] definitions) - throws NoSuchMethodException - { - try - { - return clazz.getMethod(currentMethodName, definitions); - } - catch (NoSuchMethodException e) - { - Method[] methods = (Method[]) FilterUtils.retainExtracted(clazz.getMethods(), - new MethodParameterFilter(currentMethodName, definitions)).toArray(new Method[0]); - if (methods.length == 0) { throw e; } - if (methods.length == 1) - { - return methods[0]; - } - else - { - throw new Error("Don't know how to handle multiple available methods yet."); - } - } - } - /***********************************************************************/ - public static Parameters getParametersFor(Parameters[] parameters, int i) - { - if (parameters == null || (i >= parameters.length) || parameters[i] == null) { return EMPTY; } - return parameters[i]; - } - /***********************************************************************/ - public String toString() - { - return definitions == null ? "" : Arrays.asList(definitions).toString(); - } - } - public static class MethodParameterFilter implements Filter - { - private String methodName; - private Class[] classParameters; - /***********************************************************************/ - public MethodParameterFilter(String methodName, Class[] classParameters) - { - super(); - this.methodName = methodName; - this.classParameters = classParameters; - } - /***********************************************************************/ - public boolean isExtracted(Object object) throws IllegalArgumentException - { - ObjectUtils.assertInstance(Method.class, object); - Method m = (Method) object; - if (m.getName().equals(methodName) && m.getParameterTypes().length == classParameters.length) - { - Class[] params = m.getParameterTypes(); - for (int i = 0; i < params.length; i++) - { - if (!ObjectUtils.isThisInstanceOfThat(classParameters[i], params[i])) { return false; } - } - return true; - } - else - { - return false; - } - } - } - /***********************************************************************/ - /***********************************************************************/ +public class MethodExecutionPath implements Serializable { + private static final long serialVersionUID = 880073980003375984L; + + public static class Parameters { + public static Method getBestFitMethod(Class clazz, + String currentMethodName, Class[] definitions) + throws NoSuchMethodException { + try { + return clazz.getMethod(currentMethodName, definitions); + } catch (NoSuchMethodException e) { + Method[] methods = (Method[]) FilterUtils.retainExtracted( + clazz.getMethods(), + new MethodParameterFilter(currentMethodName, + definitions)).toArray(new Method[0]); + if (methods.length == 0) { + throw e; + } + if (methods.length == 1) { + return methods[0]; + } else { + throw new Error( + "Don't know how to handle multiple available methods yet."); + } + } + } + } + + public static class MethodParameterFilter implements Filter { + + private String methodName; + private Class[] classParameters; + + public MethodParameterFilter(String methodName, Class[] classParameters) { + super(); + this.methodName = methodName; + this.classParameters = classParameters; + } + + @Override + public boolean isExtracted(Object object) + throws IllegalArgumentException { + ObjectUtils.assertInstance(Method.class, object); + Method m = (Method) object; + if (m.getName().equals(methodName) + && m.getParameterTypes().length == classParameters.length) { + Class[] params = m.getParameterTypes(); + for (int i = 0; i < params.length; i++) { + if (!ObjectUtils.isThisInstanceOfThat(classParameters[i], + params[i])) { + return false; + } + } + return true; + } else { + return false; + } + } + } } diff --git a/src/test/java/org/teachingextensions/logo/tests/ColorsTest.java b/src/test/java/org/teachingextensions/logo/tests/ColorsTest.java index 82b5b35..5f2389b 100644 --- a/src/test/java/org/teachingextensions/logo/tests/ColorsTest.java +++ b/src/test/java/org/teachingextensions/logo/tests/ColorsTest.java @@ -2,13 +2,13 @@ import junit.framework.TestCase; -import org.teachingextensions.logo.Colors; +import org.teachingextensions.logo.PenColors; public class ColorsTest extends TestCase { public void testTransparency() throws Exception { - assertEquals(0, Colors.calculateTransparency(100)); - assertEquals(255, Colors.calculateTransparency(0)); + assertEquals(0, PenColors.calculateTransparency(100)); + assertEquals(255, PenColors.calculateTransparency(0)); } } diff --git a/src/test/java/org/teachingextensions/logo/tests/RecipeTests.java b/src/test/java/org/teachingextensions/logo/tests/RecipeTests.java index 9756957..6212cd5 100644 --- a/src/test/java/org/teachingextensions/logo/tests/RecipeTests.java +++ b/src/test/java/org/teachingextensions/logo/tests/RecipeTests.java @@ -9,7 +9,7 @@ import org.approvaltests.reporters.DelayedClipboardReporter; import org.approvaltests.reporters.FileLauncherReporter; import org.approvaltests.reporters.UseReporter; -import org.teachingextensions.logo.Colors; +import org.teachingextensions.logo.PenColors; import org.teachingextensions.logo.Turtle; import org.teachingextensions.logo.Wheel; @@ -23,7 +23,7 @@ public void testSimpleSquare() throws Exception turtle.show(); for (int i = 0; i < 4; i++) { - turtle.setPenColor(Colors.Blues.SteelBlue); + turtle.setPenColor(PenColors.Blues.SteelBlue); turtle.move(50); turtle.turn(90); } @@ -37,7 +37,7 @@ public void testCircle() throws Exception int sides = 35; for (int i = 0; i < sides; i++) { - turtle.setPenColor(Colors.Reds.OrangeRed); + turtle.setPenColor(PenColors.Reds.OrangeRed); turtle.move(18); turtle.turn(360.0 / sides); } @@ -45,7 +45,7 @@ public void testCircle() throws Exception } public void testSpiral() throws Exception { - Color color = Colors.Purples.Violet; + Color color = PenColors.Purples.Violet; Turtle turtle = new Turtle(); turtle.setSpeed(Turtle.TEST_SPEED); for (int i = 0; i < 25; i++) @@ -53,14 +53,14 @@ public void testSpiral() throws Exception turtle.setPenColor(color); turtle.move(3 * i); turtle.turn(90); - color = Colors.darken(color); + color = PenColors.darken(color); } Approvals.verify(turtle.getImage()); } public void testFourSquare() throws Exception { Turtle turtle = new Turtle(); - Colors.mockRandom(); + PenColors.mockRandom(); turtle.setSpeed(Turtle.TEST_SPEED); for (int i = 0; i < 4; i++) { @@ -73,7 +73,7 @@ private void drawSquare(Turtle turtle) { for (int i = 0; i < 4; i++) { - turtle.setPenColor(Colors.getRandomColor()); + turtle.setPenColor(PenColors.getRandomColor()); turtle.move(50); turtle.turn(90); } @@ -83,7 +83,7 @@ public void testDigiGirlzFlower() throws Exception Turtle turtle = new Turtle(); turtle.setSpeed(Turtle.TEST_SPEED); turtle.show(); - turtle.getBackgroundWindow().setColor(Colors.Grays.Silver); + turtle.getBackgroundWindow().setColor(PenColors.Grays.Silver); Wheel palette = setupColors(); turtle.setPenWidth(3); for (int i = 0; i < 15; i++) @@ -104,7 +104,7 @@ private void drawOctogon(Turtle turtle, Wheel palette) } private Wheel setupColors() { - Color[] colors = {Colors.Reds.Red, Colors.Oranges.DarkOrange, Colors.Yellows.Gold, Colors.Yellows.Yellow}; + Color[] colors = {PenColors.Reds.Red, PenColors.Oranges.DarkOrange, PenColors.Yellows.Gold, PenColors.Yellows.Yellow}; Wheel wheel = new Wheel(); wheel.add(colors[0]); wheel.add(colors[1]); @@ -125,7 +125,7 @@ public void testTriangleShell() throws Exception int length = 0; for (int i = 0; i < number; i++) { - turtle.setPenColor(Colors.getRandomColor()); + turtle.setPenColor(PenColors.getRandomColor()); length += 4; drawTriangle(turtle, length); turtle.turn(360 / number); @@ -145,9 +145,9 @@ public void testKnottedRing() throws Exception { Turtle turtle = new Turtle(); turtle.setSpeed(Turtle.TEST_SPEED); - Wheel wheel = new Wheel(Colors.Pinks.HotPink, Colors.Reds.Red, Colors.Purples.Fuchsia, - Colors.Oranges.OrangeRed, Colors.Pinks.DeepPink, Colors.Pinks.MediumVioletRed, Colors.Reds.Crimson, - Colors.Oranges.Tomato); + Wheel wheel = new Wheel(PenColors.Pinks.HotPink, PenColors.Reds.Red, PenColors.Purples.Fuchsia, + PenColors.Oranges.OrangeRed, PenColors.Pinks.DeepPink, PenColors.Pinks.MediumVioletRed, PenColors.Reds.Crimson, + PenColors.Oranges.Tomato); for (int i = 0; i < 30; i++) { turtle.setPenColor(wheel.next()); @@ -170,7 +170,7 @@ public void testTurtleTree() throws Exception Turtle turtle = new Turtle(); turtle.setSpeed(Turtle.TEST_SPEED); turtle.show(); - turtle.getBackgroundWindow().setColor(Colors.Grays.Black); + turtle.getBackgroundWindow().setColor(PenColors.Grays.Black); drawBranch(turtle, 60); Approvals.verify(turtle.getImage()); } @@ -196,12 +196,12 @@ private void drawLowerBranch(Turtle turtle, int length) private void pickColorForBranchLenth(Turtle turtle, int length) { HashMap map = new HashMap(); - map.put(10, Colors.Greens.LimeGreen); - map.put(20, Colors.Greens.ForestGreen); - map.put(30, Colors.Greens.DarkGreen); - map.put(40, Colors.Greens.Olive); - map.put(50, Colors.Browns.Sienna); - map.put(60, Colors.Browns.SaddleBrown); + map.put(10, PenColors.Greens.LimeGreen); + map.put(20, PenColors.Greens.ForestGreen); + map.put(30, PenColors.Greens.DarkGreen); + map.put(40, PenColors.Greens.Olive); + map.put(50, PenColors.Browns.Sienna); + map.put(60, PenColors.Browns.SaddleBrown); turtle.setPenColor(map.get(length)); } } diff --git a/src/test/java/org/teachingextensions/logo/tests/TortoiseTest.java b/src/test/java/org/teachingextensions/logo/tests/TortoiseTest.java index 706e282..af6f10a 100644 --- a/src/test/java/org/teachingextensions/logo/tests/TortoiseTest.java +++ b/src/test/java/org/teachingextensions/logo/tests/TortoiseTest.java @@ -5,7 +5,7 @@ import org.approvaltests.reporters.ClipboardReporter; import org.approvaltests.reporters.DiffReporter; import org.approvaltests.reporters.UseReporter; -import org.teachingextensions.logo.Colors; +import org.teachingextensions.logo.PenColors; import org.teachingextensions.logo.Tortoise; import org.teachingextensions.logo.Turtle; import org.teachingextensions.logo.utils.TortoiseUtils; @@ -20,7 +20,7 @@ public void testSimpleSquare() throws Exception int sides = 4; for (int i = 1; i <= sides; i++) { - Tortoise.setPenColor(Colors.Blues.Blue); + Tortoise.setPenColor(PenColors.Blues.Blue); Tortoise.move(50); Tortoise.turn(90); } @@ -30,7 +30,7 @@ public void testBigWidth() throws Exception { Tortoise.setSpeed(Turtle.TEST_SPEED); Tortoise.show(); - Tortoise.setPenColor(Colors.Browns.Maroon); + Tortoise.setPenColor(PenColors.Browns.Maroon); Tortoise.setPenWidth(100); Tortoise.move(10); TortoiseUtils.verify(); diff --git a/src/test/java/org/teachingextensions/logo/tests/TurtleTest.java b/src/test/java/org/teachingextensions/logo/tests/TurtleTest.java index eb5b67b..e3c7f86 100644 --- a/src/test/java/org/teachingextensions/logo/tests/TurtleTest.java +++ b/src/test/java/org/teachingextensions/logo/tests/TurtleTest.java @@ -9,7 +9,7 @@ import org.approvaltests.reporters.DiffReporter; import org.approvaltests.reporters.UseReporter; import org.lambda.functions.Function1; -import org.teachingextensions.logo.Colors; +import org.teachingextensions.logo.PenColors; import org.teachingextensions.logo.Turtle; import org.teachingextensions.logo.Wheel; @@ -73,11 +73,11 @@ public void testPentagonCrazy() throws Exception { Turtle turtle = TurtleUtils.getTurtle(); Wheel wheel = new Wheel(); - wheel.add(Colors.Blues.SteelBlue); - wheel.add(Colors.Purples.DarkMagenta); - wheel.add(Colors.Blues.DarkSlateBlue); - wheel.add(Colors.Purples.Indigo); - wheel.add(Colors.Purples.DarkOrchid); + wheel.add(PenColors.Blues.SteelBlue); + wheel.add(PenColors.Purples.DarkMagenta); + wheel.add(PenColors.Blues.DarkSlateBlue); + wheel.add(PenColors.Purples.Indigo); + wheel.add(PenColors.Purples.DarkOrchid); Wheel thickness = new Wheel(1, 2, 3); for (int i = 0; i < 200; i++) { diff --git a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/PentagonCrazyQuizTest.java b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/PentagonCrazyQuizTest.java index e861e1e..4009da1 100644 --- a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/PentagonCrazyQuizTest.java +++ b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/PentagonCrazyQuizTest.java @@ -6,7 +6,7 @@ import org.approvaltests.reporters.FileLauncherReporter; import org.approvaltests.reporters.UseReporter; import org.teachingextensions.logo.ColorWheel; -import org.teachingextensions.logo.Colors; +import org.teachingextensions.logo.PenColors; import org.teachingextensions.logo.Tortoise; import org.teachingextensions.logo.Turtle; import org.teachingextensions.logo.utils.TortoiseUtils; @@ -42,13 +42,13 @@ public void question2() public void question3() { // Add lime to the color wheel - ColorWheel.addColor(Colors.Greens.Lime); + ColorWheel.addColor(PenColors.Greens.Lime); } @Override public void question4() { // Add red to the color wheel - ColorWheel.addColor(Colors.Reds.Red); + ColorWheel.addColor(PenColors.Reds.Red); } } public void testCorrect() throws Exception @@ -76,11 +76,11 @@ public void question2() } public void question3() { - ColorWheel.addColor(Colors.Greens.LimeGreen); + ColorWheel.addColor(PenColors.Greens.LimeGreen); } public void question4() { - ColorWheel.addColor(Colors.Reds.Tomato); + ColorWheel.addColor(PenColors.Reds.Tomato); } } public void testIncorrect() throws Exception diff --git a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleSquareQuizTest.java b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleSquareQuizTest.java index f694030..3a9b79c 100644 --- a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleSquareQuizTest.java +++ b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleSquareQuizTest.java @@ -5,72 +5,68 @@ import org.approvaltests.reporters.ClipboardReporter; import org.approvaltests.reporters.DiffReporter; import org.approvaltests.reporters.UseReporter; -import org.teachingextensions.logo.Colors; +import org.teachingextensions.logo.PenColors; import org.teachingextensions.logo.Tortoise; import org.teachingextensions.logo.Turtle; import org.teachingextensions.logo.utils.TortoiseUtils; import org.teachingkidsprogramming.recipes.quizzes.graders.SimpleSquareQuizGrader; import org.teachingkidsprogramming.recipes.quizzes.graders.SquareQuiz; -@UseReporter({ClipboardReporter.class, DiffReporter.class}) -public class SimpleSquareQuizTest extends TestCase -{ - public static class SimpleSquareCorrectQuiz implements SquareQuiz - { - public void question1() - { - // Move the tortoise 110 pixels - Tortoise.move(110); - } - public void question2() - { - // Turn the tortoise 1/5 of 360 degrees to the right - Tortoise.turn(360 / 5); - } - public void question3() - { - // Change the color the tortoise draws to yellow - Tortoise.setPenColor(Colors.Yellows.Yellow); - } - public void question4() - { - // Change the width of the line the tortoise draws to 5 pixels - Tortoise.setPenWidth(5); - } - } - public void testCorrect() throws Exception - { - SimpleSquareQuizGrader.TURTLE_SPEED = Turtle.TEST_SPEED; - new SimpleSquareQuizGrader().grade(new SimpleSquareCorrectQuiz()); - TortoiseUtils.verifyForOs(); - } - public static class SimpleSquareIncorrectQuiz implements SquareQuiz - { - public void question1() - { - // Move the tortoise 110 pixels - Tortoise.move(75); - } - public void question2() - { - // Turn the tortoise 1/5 of 360 degrees to the right - Tortoise.turn(360.0 / 6); - } - public void question3() - { - // Change the color the tortoise draws to yellow - Tortoise.setPenColor(Colors.Yellows.Gold); - } - public void question4() - { - // Change the width of the line the tortoise draws to 5 pixels - Tortoise.setPenWidth(9); - } - } - public void testIncorrect() throws Exception - { - SimpleSquareQuizGrader.TURTLE_SPEED = Turtle.TEST_SPEED; - new SimpleSquareQuizGrader().grade(new SimpleSquareIncorrectQuiz()); - TortoiseUtils.verifyForOs(); - } +@UseReporter({ ClipboardReporter.class, DiffReporter.class }) +public class SimpleSquareQuizTest extends TestCase { + public static class SimpleSquareCorrectQuiz implements SquareQuiz { + public void question1() { + // Move the tortoise 110 pixels + Tortoise.move(110); + } + + public void question2() { + // Turn the tortoise 1/5 of 360 degrees to the right + Tortoise.turn(360 / 5); + } + + public void question3() { + // Change the color the tortoise draws to yellow + Tortoise.setPenColor(PenColors.Yellows.Yellow); + } + + public void question4() { + // Change the width of the line the tortoise draws to 5 pixels + Tortoise.setPenWidth(5); + } + } + + public void testCorrect() throws Exception { + SimpleSquareQuizGrader.TURTLE_SPEED = Turtle.TEST_SPEED; + new SimpleSquareQuizGrader().grade(new SimpleSquareCorrectQuiz()); + TortoiseUtils.verifyForOs(); + } + + public static class SimpleSquareIncorrectQuiz implements SquareQuiz { + public void question1() { + // Move the tortoise 110 pixels + Tortoise.move(75); + } + + public void question2() { + // Turn the tortoise 1/5 of 360 degrees to the right + Tortoise.turn(360.0 / 6); + } + + public void question3() { + // Change the color the tortoise draws to yellow + Tortoise.setPenColor(PenColors.Yellows.Gold); + } + + public void question4() { + // Change the width of the line the tortoise draws to 5 pixels + Tortoise.setPenWidth(9); + } + } + + public void testIncorrect() throws Exception { + SimpleSquareQuizGrader.TURTLE_SPEED = Turtle.TEST_SPEED; + new SimpleSquareQuizGrader().grade(new SimpleSquareIncorrectQuiz()); + TortoiseUtils.verifyForOs(); + } } From 7443101ce205eff23c33e075b19fa55ba4a8b8bb Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Mon, 16 Mar 2015 23:59:50 -0700 Subject: [PATCH 022/111] Remove unused methods --- .../com/spun/util/MethodExecutionPath.java | 4 +- src/main/java/com/spun/util/NumberUtils.java | 356 ++++-------------- 2 files changed, 83 insertions(+), 277 deletions(-) diff --git a/src/main/java/com/spun/util/MethodExecutionPath.java b/src/main/java/com/spun/util/MethodExecutionPath.java index 755ea1e..19e5006 100644 --- a/src/main/java/com/spun/util/MethodExecutionPath.java +++ b/src/main/java/com/spun/util/MethodExecutionPath.java @@ -10,13 +10,13 @@ public class MethodExecutionPath implements Serializable { private static final long serialVersionUID = 880073980003375984L; public static class Parameters { - public static Method getBestFitMethod(Class clazz, + public static Method getBestFitMethod(Class clazz, String currentMethodName, Class[] definitions) throws NoSuchMethodException { try { return clazz.getMethod(currentMethodName, definitions); } catch (NoSuchMethodException e) { - Method[] methods = (Method[]) FilterUtils.retainExtracted( + Method[] methods = FilterUtils.retainExtracted( clazz.getMethods(), new MethodParameterFilter(currentMethodName, definitions)).toArray(new Method[0]); diff --git a/src/main/java/com/spun/util/NumberUtils.java b/src/main/java/com/spun/util/NumberUtils.java index a305a7d..08d5467 100644 --- a/src/main/java/com/spun/util/NumberUtils.java +++ b/src/main/java/com/spun/util/NumberUtils.java @@ -1,284 +1,90 @@ package com.spun.util; -import java.io.Serializable; -import java.lang.reflect.Array; import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; import java.util.Random; /** * A static class of convenience functions for Manipulating numbers **/ -public class NumberUtils -{ - public static Random RANDOM = new Random(); - /***********************************************************************/ - public static int getMax(int value1, int value2) - { - return value1 > value2 ? value1 : value2; - } - /***********************************************************************/ - /** - * Loads an int from a String. - **/ - public static int load(String i, int defaultValue) - { - return load(i, defaultValue, true); - } - /***********************************************************************/ - /** - * Loads an int from a String. - **/ - public static int load(String i, int defaultValue, boolean stripNonNumeric) - { - try - { - i = stripNonNumeric ? StringUtils.stripNonNumeric(i, true, true) : i; - defaultValue = Integer.parseInt(i); - } - catch (Exception e) - {} - return defaultValue; - } - /***********************************************************************/ - /** - * Loads an int from a String. - **/ - public static long load(String i, long defaultValue) - { - try - { - defaultValue = Long.parseLong(i); - } - catch (Exception e) - {} - return defaultValue; - } - /***********************************************************************/ - /** - * - **/ - public static double load(String i, double defaultValue) - { - try - { - i = StringUtils.stripNonNumeric(i, true, true); - defaultValue = Double.parseDouble(i); - } - catch (Exception e) - {} - return defaultValue; - } - /***********************************************************************/ - public static boolean load(String i, boolean d) - { - return (i == null) ? d : "true".equalsIgnoreCase(i); - } - /***********************************************************************/ - public static int[] loadArray(String summaryString, String seperator, int defaultWhenLoading) - { - String parts[] = StringUtils.split(summaryString, seperator); - int integers[] = new int[parts.length]; - for (int i = 0; i < parts.length; i++) - { - integers[i] = load(parts[i], defaultWhenLoading); - } - return integers; - } - /************************************************************************/ - public static double setSignificantDigit(double onNumber, int digit) - { - double power = Math.pow(10, digit); - onNumber = onNumber * power; - onNumber = Math.round(onNumber); - onNumber = onNumber / power; - return onNumber; - } - /************************************************************************/ - /** - * a unit test of sorts :-) - **/ - public static void main(String args[]) - { - Random r = new Random(); - for (int i = 0; i < 20; i++) - { - double d = r.nextDouble(); - int s = r.nextInt(5); - MySystem.event(d + " , " + s + " -> " + setSignificantDigit(d, s)); - } - } - /***********************************************************************/ - public static boolean doRandomPercentage(int i) - { - return RANDOM.nextInt(100) < i; - } - /***********************************************************************/ - public static boolean equals(double one, double two, double delta) - { - double actualDelta = one - two; - return (-delta < actualDelta) && (actualDelta < delta); - } - /***********************************************************************/ - public static Integer[] wrapIntegers(int[] ints) - { - Integer[] integers = new Integer[ints.length]; - for (int i = 0; i < ints.length; i++) - { - integers[i] = ints[i]; - } - return integers; - } - /***********************************************************************/ - public static String createRandomStringOfNumbers(int digits) - { - StringBuffer buffer = new StringBuffer(digits); - for (int i = 0; i < digits; i++) - { - buffer.append(RANDOM.nextInt(10)); - } - return buffer.toString(); - } - /***********************************************************************/ - public static boolean isIn(int check, int[] available) - { - for (int i = 0; i < available.length; i++) - { - if (check == available[i]) { return true; } - } - return false; - } - /***********************************************************************/ - /** - * @deprecated use Query.sum() - */ - public static double sum(Object[] attribs, String methodName, Object[] params) - { - try - { - if (attribs == null || attribs.length == 0) { return 0.00; } - Method method = MethodExecutionPath.Parameters.getBestFitMethod(attribs[0].getClass(), methodName, - params == null ? null : (Class[]) ObjectUtils.extractArray(params, "getClass")); - double sum = 0; - for (int i = 0; i < attribs.length; i++) - { - sum += ((Number) method.invoke(attribs[i], params)).doubleValue(); - } - return sum; - } - catch (Throwable t) - { - throw ObjectUtils.throwAsError(t); - } - } - /***********************************************************************/ - public static boolean isEven(int number) - { - return ((number % 2) == 0); - } - /***********************************************************************/ - /** - * @deprecated use Query.sum() - */ - public static double sum(Object[] onArray, String forMethodName) - { - return sum(onArray, forMethodName, null); - } - /***********************************************************************/ - /** - * @deprecated use Query.sum() - */ - public static double sum(Collection onCollection, String forMethodName) - { - return sum(onCollection.toArray(), forMethodName, null); - } - /***********************************************************************/ - public static T[] getShuffled(T[] objects, int numberToReturn) - { - Shuffler[] shuffles = new Shuffler[objects.length]; - for (int i = 0; i < objects.length; i++) - { - shuffles[i] = new Shuffler(i); - } - Arrays.sort(shuffles, new Shuffler(0)); - ArrayList list = new ArrayList(numberToReturn); - for (int i = 0; i < numberToReturn; i++) - { - list.add(objects[shuffles[i].oldPosition]); - } - Object[] objects2 = null; - try - { - objects2 = (Object[]) Array.newInstance(objects.getClass().getComponentType(), numberToReturn); - } - catch (Exception e) - { - MySystem.warning(e); - objects2 = new Object[numberToReturn]; - } - return (T[]) list.toArray(objects2); - } - /***********************************************************************/ - /** - * randomly chooses a number between the minimum and maximum - *
Example: {@code int grade = NumberUtils.getRandomInt(1,100);}
- * - * @param minimum - * The lowest possible value (inclusive) - * @param maximum - * The highest possible value (inclusive) - * @return the random number - */ - public static int getRandomInt(int minimum, int maximum) - { - int diff = maximum - minimum; - if (diff == 0) - { - return maximum; - } - else - { - return RANDOM.nextInt(diff) + minimum; - } - } - /***********************************************************************/ - public static int floor(double i) - { - return (int) Math.floor(i); - } - /***********************************************************************/ - public static int getNumberOfDigits(int number) - { - return ("" + number).length(); - } - /***********************************************************************/ - public static double convertDoubleToPercentage(double doub) - { - return doub * 100; - } - /***********************************************************************/ - public static double convertPercentageToDouble(double percent) - { - return percent / 100; - } - /***********************************************************************/ - /* INNER CLASS */ - /***********************************************************************/ - public static class Shuffler implements java.util.Comparator, Serializable - { - public int oldPosition = 0; - public int newPosition = 0; - public Shuffler(int oldPosition) - { - this.oldPosition = oldPosition; - this.newPosition = RANDOM.nextInt(); - } - public int compare(Shuffler s1, Shuffler s2) - { - return Double.compare(s1.newPosition, (s2).newPosition); - } - } - /***********************************************************************/ +public class NumberUtils { + public static Random RANDOM = new Random(); + + /** + * Loads an int from a String. + **/ + public static int load(String i, int defaultValue) { + return load(i, defaultValue, true); + } + + /** + * Loads an int from a String. + **/ + public static int load(String i, int defaultValue, boolean stripNonNumeric) { + try { + i = stripNonNumeric ? StringUtils.stripNonNumeric(i, true, true) + : i; + defaultValue = Integer.parseInt(i); + } catch (Exception e) { + } + return defaultValue; + } + + public static double load(String i, double defaultValue) { + try { + i = StringUtils.stripNonNumeric(i, true, true); + defaultValue = Double.parseDouble(i); + } catch (Exception e) { + } + return defaultValue; + } + + public static boolean equals(double one, double two, double delta) { + double actualDelta = one - two; + return (-delta < actualDelta) && (actualDelta < delta); + } + + /** + * @deprecated use Query.sum() + */ + public static double sum(Object[] attribs, String methodName, + Object[] params) { + try { + if (attribs == null || attribs.length == 0) { + return 0.00; + } + Method method = MethodExecutionPath.Parameters.getBestFitMethod( + attribs[0].getClass(), + methodName, + params == null ? null : (Class[]) ObjectUtils.extractArray( + params, "getClass")); + double sum = 0; + for (int i = 0; i < attribs.length; i++) { + sum += ((Number) method.invoke(attribs[i], params)) + .doubleValue(); + } + return sum; + } catch (Throwable t) { + throw ObjectUtils.throwAsError(t); + } + } + + /** + * randomly chooses a number between the minimum and maximum + *
Example: + * {@code int grade = NumberUtils.getRandomInt(1,100);}
+ * + * @param minimum + * The lowest possible value (inclusive) + * @param maximum + * The highest possible value (inclusive) + * @return the random number + */ + public static int getRandomInt(int minimum, int maximum) { + int diff = maximum - minimum; + if (diff == 0) { + return maximum; + } else { + return RANDOM.nextInt(diff) + minimum; + } + } } \ No newline at end of file From 8db3712006fcb61cb2b94ff8306081cce27354fa Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Tue, 17 Mar 2015 09:07:13 -0700 Subject: [PATCH 023/111] Clean, move ArrayUtils --- .gitignore | 2 + src/main/java/com/spun/util/ArrayUtils.java | 284 ------------------ src/main/java/com/spun/util/DateUtils.java | 2 + src/main/java/com/spun/util/ObjectUtils.java | 2 + src/main/java/com/spun/util/TestUtils.java | 5 +- src/main/java/com/spun/util/io/FileUtils.java | 3 +- .../com/spun/util/parser/TemplateArray.java | 2 +- .../java/org/approvaltests/Approvals.java | 2 +- .../macosx/KaleidoscopeDiffReporter.java | 2 +- .../reporters/macosx/P4MergeReporter.java | 2 +- src/main/java/org/lambda/query/Query.java | 3 +- .../util/ArrayUtils.java | 98 ++++++ 12 files changed, 111 insertions(+), 296 deletions(-) delete mode 100644 src/main/java/com/spun/util/ArrayUtils.java create mode 100644 src/main/java/org/teachingkidsprogramming/util/ArrayUtils.java diff --git a/.gitignore b/.gitignore index 345472d..fd4c0a1 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,5 @@ /target/ settings.xml +/.idea +TeachingKidsProgramming.Source.Java.iml diff --git a/src/main/java/com/spun/util/ArrayUtils.java b/src/main/java/com/spun/util/ArrayUtils.java deleted file mode 100644 index 1528f8d..0000000 --- a/src/main/java/com/spun/util/ArrayUtils.java +++ /dev/null @@ -1,284 +0,0 @@ -package com.spun.util; - -import java.lang.reflect.Array; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Vector; - -import org.lambda.functions.Function1; - -/** - * A static class of convenience methods for arrays and collections. - **/ -public class ArrayUtils -{ - /************************************************************************/ - public static java.util.Collection addArray(java.util.Collection v, T array[]) - { - if ((array == null) || (v == null)) { return v; } - for (int i = 0; i < array.length; i++) - { - v.add(array[i]); - } - return v; - } - public static String toString(T[] values, Function1 formatter) - { - return toString(Arrays.asList(values), formatter); - } - public static String toString(Iterable values, Function1 formatter) - { - StringBuffer b = new StringBuffer(); - for (T t : values) - { - b.append(formatter.call(t) + "\r\n"); - } - return b.toString(); - } - /***********************************************************************/ - public static Vector toReverseVector(Vector vector) - { - Vector reverse = new Vector(vector.size()); - for (int i = vector.size() - 1; i >= 0; i--) - { - reverse.add(vector.elementAt(i)); - } - return reverse; - } - /***********************************************************************/ - public static T[] toReverseArray(T[] array) - { - for (int i = 0; i < array.length / 2; i++) - { - T o1 = array[i]; - int end = array.length - i - 1; - T o2 = array[end]; - array[i] = o2; - array[end] = o1; - } - return array; - } -// /***********************************************************************/ -// public static T[] addToArray(T[] array, T object) -// { -// Object[] newArray = null; -// if (array == null) -// { -// newArray = (Object[]) Array.newInstance(object.getClass(), 1); -// newArray[0] = object; -// } -// else -// { -// newArray = (Object[]) Array.newInstance(array.getClass().getComponentType(), array.length + 1); -// System.arraycopy(array, 0, newArray, 0, array.length); -// newArray[array.length] = object; -// } -// return (T[]) newArray; -// } -// /***********************************************************************/ -// public static T[] getSubsection(T[] array, int startInclusive, int endExclusive) -// { -// int length = endExclusive - startInclusive; -// length = length > array.length ? array.length : length; -// T[] newArray = (T[]) Array.newInstance(array.getClass().getComponentType(), length); -// System.arraycopy(array, startInclusive, newArray, 0, length); -// return newArray; -// } - /***********************************************************************/ - public static boolean isEmpty(Object[] array) - { - return ((array == null) || (array.length == 0)); - } - /************************************************************************/ - public static boolean isEmpty(Collection collection) - { - return ((collection == null) || (collection.size() == 0)); - } - /***********************************************************************/ - public static T getSingleton(T[] parts) - { - if (parts == null) { return null; } - switch (parts.length) - { - case 0 : - return null; - case 1 : - return parts[0]; - default : - throw new Error("Called with more than one object in the array " + Arrays.asList(parts)); - } - } - /***********************************************************************/ - public static T getFirst(T[] array, Comparator compartor) - { - return get(array, compartor, true); - } -// /***********************************************************************/ -// public static T getFirst(Collection array, Comparator sorter) -// { -// return get((T[]) array.toArray(), sorter, true); -// } - /***********************************************************************/ - public static T getLast(T[] array, Comparator sorter) - { - return get(array, sorter, false); - } -// /***********************************************************************/ -// public static T getLast(Collection array, Comparator sorter) -// { -// return get((T[]) array.toArray(), sorter, false); -// } - /***********************************************************************/ - private static T get(T[] array, Comparator sorter, boolean wantFirst) - { - if (isEmpty(array)) { return null; } - T last = array[0]; - for (int i = 1; i < array.length; i++) - { - int compare = sorter.compare(last, array[i]); - if ((wantFirst && compare > 0) || (!wantFirst && compare < 0)) - { - last = array[i]; - } - } - return last; - } - - /***********************************************************************/ - @SuppressWarnings("rawtypes") - public static List combineResults(Object[] array, Method method) - { - if (isEmpty(array)) { return new ArrayList(0); } - try - { - ArrayList list = new ArrayList(); - for (int i = 0; i < array.length; i++) - { - addArray(list, (Object[]) method.invoke(array[i], (Object[]) null)); - } - return list; - } - catch (Throwable e) - { - throw ObjectUtils.throwAsError(e); - } - } - /***********************************************************************/ - public static Object[] combine(Object[] a, Object[] b) - { - if (isEmpty(a) && isEmpty(b)) - { - if (a != null) - { - return (Object[]) Array.newInstance(a.getClass().getComponentType(), 0); - } - else if (b != null) - { - return (Object[]) Array.newInstance(b.getClass().getComponentType(), 0); - } - else - { - return new Object[0]; - } - } - else if (isEmpty(a)) - { - return b; - } - else if (isEmpty(b)) - { - return a; - } - else - { - Object[] newArray = null; - newArray = (Object[]) Array.newInstance(a.getClass().getComponentType(), a.length + b.length); - System.arraycopy(a, 0, newArray, 0, a.length); - System.arraycopy(b, 0, newArray, a.length, b.length); - return newArray; - } - } - /***********************************************************************/ - public static boolean contains(T[] values, T value) - { - for (int i = 0; i < values.length; i++) - { - if (value.equals(values[i])) { return true; } - } - return false; - } - /***********************************************************************/ - public static boolean contains(int[] values, int value) - { - for (int i = 0; i < values.length; i++) - { - if (value == values[i]) { return true; } - } - return false; - } - /************************************************************************/ - public static T getLast(List list) - { - return list.get(list.size() - 1); - } - /************************************************************************/ - public static T getDefault(HashMap map, K key, T defaultValue) - { - T value = map.get(key); - if (value == null) - { - map.put(key, defaultValue); - value = defaultValue; - } - return value; - } - /************************************************************************/ - public static int countValues(HashMap out, V matching) - { - return count(matching, out.values()); - } - /************************************************************************/ - public static int count(V matching, Collection values) - { - int count = 0; - for (V value : values) - { - if (matching.equals(value)) - { - count++; - } - } - return count; - } - public static List combine(List list1, List list2) - { - List all = new ArrayList(); - all.addAll(list1); - all.addAll(list2); - return all; - } - public static Iterable asIterable(Iterator iterator) - { - return new IterableWrapper(iterator); - } - public static class IterableWrapper implements Iterable - { - private final Iterator iterator; - public IterableWrapper(Iterator iterator) - { - this.iterator = iterator; - } - @Override - public Iterator iterator() - { - return iterator; - } - } -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/DateUtils.java b/src/main/java/com/spun/util/DateUtils.java index 0bebbdc..0db174d 100644 --- a/src/main/java/com/spun/util/DateUtils.java +++ b/src/main/java/com/spun/util/DateUtils.java @@ -1,5 +1,7 @@ package com.spun.util; +import org.teachingkidsprogramming.util.ArrayUtils; + import java.sql.Timestamp; import java.text.ParseException; import java.text.SimpleDateFormat; diff --git a/src/main/java/com/spun/util/ObjectUtils.java b/src/main/java/com/spun/util/ObjectUtils.java index dbe9936..1de13ee 100644 --- a/src/main/java/com/spun/util/ObjectUtils.java +++ b/src/main/java/com/spun/util/ObjectUtils.java @@ -1,5 +1,7 @@ package com.spun.util; +import org.teachingkidsprogramming.util.ArrayUtils; + import java.lang.reflect.Array; import java.lang.reflect.Method; import java.util.ArrayList; diff --git a/src/main/java/com/spun/util/TestUtils.java b/src/main/java/com/spun/util/TestUtils.java index bbe7ee3..da84689 100644 --- a/src/main/java/com/spun/util/TestUtils.java +++ b/src/main/java/com/spun/util/TestUtils.java @@ -16,10 +16,7 @@ import junit.framework.TestCase; -import com.spun.util.ClassUtils; -import com.spun.util.ObjectUtils; -import com.spun.util.ArrayUtils; -import com.spun.util.WindowUtils; +import org.teachingkidsprogramming.util.ArrayUtils; //import com.spun.util.images.ImageWriter; import com.spun.util.io.FileUtils; import com.spun.util.io.StackElementLevelSelector; diff --git a/src/main/java/com/spun/util/io/FileUtils.java b/src/main/java/com/spun/util/io/FileUtils.java index eb5dfad..1b1150f 100644 --- a/src/main/java/com/spun/util/io/FileUtils.java +++ b/src/main/java/com/spun/util/io/FileUtils.java @@ -15,12 +15,11 @@ import java.io.InputStreamReader; import java.io.OutputStream; import java.io.Reader; -import java.net.URL; import java.nio.channels.FileChannel; import java.util.ArrayList; import java.util.List; -import com.spun.util.ArrayUtils; +import org.teachingkidsprogramming.util.ArrayUtils; import com.spun.util.Asserts; import com.spun.util.ObjectUtils; diff --git a/src/main/java/com/spun/util/parser/TemplateArray.java b/src/main/java/com/spun/util/parser/TemplateArray.java index c2ceb32..266be6a 100644 --- a/src/main/java/com/spun/util/parser/TemplateArray.java +++ b/src/main/java/com/spun/util/parser/TemplateArray.java @@ -3,7 +3,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import com.spun.util.ArrayUtils; +import org.teachingkidsprogramming.util.ArrayUtils; public class TemplateArray { diff --git a/src/main/java/org/approvaltests/Approvals.java b/src/main/java/org/approvaltests/Approvals.java index f4de54a..e3920e3 100644 --- a/src/main/java/org/approvaltests/Approvals.java +++ b/src/main/java/org/approvaltests/Approvals.java @@ -21,7 +21,7 @@ import org.approvaltests.writers.ImageApprovalWriter; import org.lambda.functions.Function1; -import com.spun.util.ArrayUtils; +import org.teachingkidsprogramming.util.ArrayUtils; import com.spun.util.ObjectUtils; import com.spun.util.StringUtils; diff --git a/src/main/java/org/approvaltests/reporters/macosx/KaleidoscopeDiffReporter.java b/src/main/java/org/approvaltests/reporters/macosx/KaleidoscopeDiffReporter.java index 1f8960b..0b7d6d7 100644 --- a/src/main/java/org/approvaltests/reporters/macosx/KaleidoscopeDiffReporter.java +++ b/src/main/java/org/approvaltests/reporters/macosx/KaleidoscopeDiffReporter.java @@ -5,7 +5,7 @@ import org.approvaltests.reporters.GenericDiffReporter; -import com.spun.util.ArrayUtils; +import org.teachingkidsprogramming.util.ArrayUtils; public class KaleidoscopeDiffReporter extends GenericDiffReporter { diff --git a/src/main/java/org/approvaltests/reporters/macosx/P4MergeReporter.java b/src/main/java/org/approvaltests/reporters/macosx/P4MergeReporter.java index be3bb4a..6f8ea1d 100644 --- a/src/main/java/org/approvaltests/reporters/macosx/P4MergeReporter.java +++ b/src/main/java/org/approvaltests/reporters/macosx/P4MergeReporter.java @@ -5,7 +5,7 @@ import org.approvaltests.reporters.GenericDiffReporter; -import com.spun.util.ArrayUtils; +import org.teachingkidsprogramming.util.ArrayUtils; public class P4MergeReporter extends GenericDiffReporter { diff --git a/src/main/java/org/lambda/query/Query.java b/src/main/java/org/lambda/query/Query.java index bbbcfdf..a9d8722 100644 --- a/src/main/java/org/lambda/query/Query.java +++ b/src/main/java/org/lambda/query/Query.java @@ -3,11 +3,10 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; -import java.util.Collections; import java.util.List; import org.lambda.functions.Function1; -import com.spun.util.ArrayUtils; +import org.teachingkidsprogramming.util.ArrayUtils; public class Query { diff --git a/src/main/java/org/teachingkidsprogramming/util/ArrayUtils.java b/src/main/java/org/teachingkidsprogramming/util/ArrayUtils.java new file mode 100644 index 0000000..3c0a002 --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/util/ArrayUtils.java @@ -0,0 +1,98 @@ +package org.teachingkidsprogramming.util; + +import org.lambda.functions.Function1; + +import java.util.*; +import java.util.Comparator; + +/** + * A static class of convenience methods for arrays and collections. + */ +public class ArrayUtils { + public static java.util.Collection addArray(java.util.Collection v, T array[]) { + if ((array == null) || (v == null)) { + return v; + } + Collections.addAll(v, array); + return v; + } + + public static String toString(T[] values, Function1 formatter) { + return toString(Arrays.asList(values), formatter); + } + + public static String toString(Iterable values, Function1 formatter) { + StringBuilder b = new StringBuilder(); + for (T t : values) { + b.append(formatter.call(t)).append("\r\n"); + } + return b.toString(); + } + + public static T[] toReverseArray(T[] array) { + for (int i = 0; i < array.length / 2; i++) { + T o1 = array[i]; + int end = array.length - i - 1; + T o2 = array[end]; + array[i] = o2; + array[end] = o1; + } + return array; + } + + public static boolean isEmpty(Object[] array) { + return ((array == null) || (array.length == 0)); + } + + public static boolean isEmpty(Collection collection) { + return ((collection == null) || (collection.size() == 0)); + } + + public static T getFirst(T[] array, Comparator comparator) { + return get(array, comparator, true); + } + + private static T get(T[] array, Comparator sorter, boolean wantFirst) { + if (isEmpty(array)) { + return null; + } + T last = array[0]; + for (int i = 1; i < array.length; i++) { + int compare = sorter.compare(last, array[i]); + if ((wantFirst && compare > 0) || (!wantFirst && compare < 0)) { + last = array[i]; + } + } + return last; + } + + public static boolean contains(T[] values, T value) { + for (T value1 : values) { + if (value.equals(value1)) { + return true; + } + } + return false; + } + + public static boolean contains(int[] values, int value) { + for (int value1 : values) { + if (value == value1) { + return true; + } + } + return false; + } + + public static T getLast(List list) { + return list.get(list.size() - 1); + } + + public static List combine(List list1, List list2) { + List all = new ArrayList<>(); + all.addAll(list1); + all.addAll(list2); + return all; + } + +} \ No newline at end of file From 0786bdbc41baa433bfc4dfa4bcdf80f668c346c2 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Tue, 17 Mar 2015 09:13:04 -0700 Subject: [PATCH 024/111] clean, move Asserts --- src/main/java/com/spun/util/Asserts.java | 78 ------------------- src/main/java/com/spun/util/io/FileUtils.java | 2 +- .../spun/util/velocity/VelocityParser.java | 33 +------- .../teachingkidsprogramming/util/Asserts.java | 21 +++++ 4 files changed, 23 insertions(+), 111 deletions(-) delete mode 100644 src/main/java/com/spun/util/Asserts.java create mode 100644 src/main/java/org/teachingkidsprogramming/util/Asserts.java diff --git a/src/main/java/com/spun/util/Asserts.java b/src/main/java/com/spun/util/Asserts.java deleted file mode 100644 index 354cb97..0000000 --- a/src/main/java/com/spun/util/Asserts.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.spun.util; - -import java.io.File; - -public class Asserts -{ - public static void t() - { - // can you see it now? good. - // how about this? - // kind of slow... - } - /***********************************************************************/ - public static T assertNotNull(String label, T o) - { - if (o == null) { throw new NullPointerException(label + " was null"); } - return o; - } - /***********************************************************************/ - public static void assertEqual(String label, int expected, int actual) - { - if (expected != actual) { throw new IllegalStateException(label + " " + expected + "!=" + actual); } - } - /***********************************************************************/ - public static void assertFileDoesNotExist(String label, String fileName) - { - File file = new File(fileName); - if (file.exists()) { throw new IllegalStateException(label + " file " + file.getAbsolutePath() - + " already exists"); } - } - /***********************************************************************/ - public static void assertFileExists(String label, String fileName) - { - File file = new File(fileName); - if (!file.exists()) { throw new IllegalStateException(label + " file " + file.getAbsolutePath() - + " does not exist"); } - } - /***********************************************************************/ - public static void equals(String label, double expected, double actual, double percission) - { - if (!NumberUtils.equals(expected, actual, percission)) { throw new IllegalStateException(label + " " - + expected + "!=" + actual); } - } - /***********************************************************************/ - public static void notEquals(String label, double expected, double actual) - { - if (actual == expected) { throw new IllegalStateException(label + " " + expected + "!=" + actual); } - } - /***********************************************************************/ - public static void assertEqual(String label, Object expected, Object actual) - { - if (!ObjectUtils.isEqual(expected, actual)) { throw new IllegalStateException(label + " " + expected + "!=" - + actual); } - } - /***********************************************************************/ - public static void assertNotEqual(String label, Object expected, Object actual) - { - if (ObjectUtils.isEqual(expected, actual)) { throw new IllegalStateException(label + " can't = " + expected); } - } - /***********************************************************************/ - public static void assertEqual(String label, double expected, double actual, double precision) - { - if (!NumberUtils.equals(expected, actual, precision)) { throw new IllegalStateException(label + " " + expected - + "!=" + actual + "within delta of" + precision); } - } - /***********************************************************************/ - public static void assertStartsWith(String label, String haystack, String needle) - { - if (haystack == null || !haystack.startsWith(needle)) { throw new IllegalStateException(label + " " + haystack - + " does not start with " + needle); } - } - /***********************************************************************/ - /***********************************************************************/ - public static void assertTrue(String label, boolean b) - { - if (!b) { throw new IllegalStateException(label + " was false"); } - } -} diff --git a/src/main/java/com/spun/util/io/FileUtils.java b/src/main/java/com/spun/util/io/FileUtils.java index 1b1150f..8e24a13 100644 --- a/src/main/java/com/spun/util/io/FileUtils.java +++ b/src/main/java/com/spun/util/io/FileUtils.java @@ -20,7 +20,7 @@ import java.util.List; import org.teachingkidsprogramming.util.ArrayUtils; -import com.spun.util.Asserts; +import org.teachingkidsprogramming.util.Asserts; import com.spun.util.ObjectUtils; /** diff --git a/src/main/java/com/spun/util/velocity/VelocityParser.java b/src/main/java/com/spun/util/velocity/VelocityParser.java index 37ea0bd..50238b2 100644 --- a/src/main/java/com/spun/util/velocity/VelocityParser.java +++ b/src/main/java/com/spun/util/velocity/VelocityParser.java @@ -1,6 +1,5 @@ package com.spun.util.velocity; -import java.io.File; import java.io.StringWriter; import java.io.Writer; import java.util.Enumeration; @@ -16,7 +15,6 @@ import org.apache.velocity.runtime.RuntimeConstants; import org.apache.velocity.runtime.log.NullLogSystem; -import com.spun.util.Asserts; import com.spun.util.ObjectUtils; import com.spun.util.io.FileUtils; import com.spun.util.parser.ParserCommons; @@ -32,36 +30,7 @@ public class VelocityParser ((Logger) e.nextElement()).setLevel(Level.OFF); } } - /***********************************************************************/ -// public static String parseFile(String template, ContextAware process) -// { -// Asserts.assertFileExists("Velocity template", template); -// Properties props = new Properties(); -// int pathBreak = template.lastIndexOf(File.separatorChar); -// pathBreak = pathBreak == -1 ? template.length() : pathBreak; -// String path = template.substring(0, pathBreak); -// String file = template.substring(pathBreak + 1); -// props.put("resource.loader", "file"); -// props.put("runtime.introspector.uberspect", TestableUberspect.class.getName()); -// props.put("file.resource.loader.path", path); -// props.put("velocimacro.context.localscope", "" + true); -// props.put("velocimacro.permissions.allow.inline.local.scope", "" + true); -// return parse(file, props, new ContextAware[]{process, Default.INSTANCE}); -// } - /***********************************************************************/ -// public static String parseJar(String template, ContextAware process) -// { -// Properties props = new Properties(); -// props.put("resource.loader", "class"); -// props.put("class.resource.loader.description", "Velocity Classpath Resource Loader"); -// props.put("class.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); -// props.put("class.resource.cache", "" + true); -// props.put("runtime.introspector.uberspect", "com.spun.util.velocity.TestableUberspect"); -// props.put("velocimacro.context.localscope", "" + true); -// props.put("velocimacro.permissions.allow.inline.local.scope", "" + true); -// return parse(template, props, new ContextAware[]{process,Default.INSTANCE}); -// } - /***********************************************************************/ + public static String parseString(String template, ContextAware process) { Properties props = new Properties(); diff --git a/src/main/java/org/teachingkidsprogramming/util/Asserts.java b/src/main/java/org/teachingkidsprogramming/util/Asserts.java new file mode 100644 index 0000000..6943900 --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/util/Asserts.java @@ -0,0 +1,21 @@ +package org.teachingkidsprogramming.util; + +import com.spun.util.NumberUtils; + +public class Asserts { + + public static T assertNotNull(String label, T o) { + if (o == null) { + throw new NullPointerException(label + " was null"); + } + return o; + } + + public static void equals(String label, double expected, double actual, double precision) { + if (!NumberUtils.equals(expected, actual, precision)) { + throw new IllegalStateException(label + " " + + expected + "!=" + actual); + } + } + +} From 301110aae64f007f4917dce236f09b80c7e9d021 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Tue, 17 Mar 2015 09:16:49 -0700 Subject: [PATCH 025/111] clean, move ClassUtils --- .../com/spun/util/ByteArrayDataSource.java | 124 ------------------ src/main/java/com/spun/util/ObjectUtils.java | 1 + src/main/java/com/spun/util/TestUtils.java | 1 + .../org/approvaltests/ReporterFactory.java | 2 +- .../util/ClassUtils.java | 49 +++---- 5 files changed, 22 insertions(+), 155 deletions(-) delete mode 100644 src/main/java/com/spun/util/ByteArrayDataSource.java rename src/main/java/{com/spun => org/teachingkidsprogramming}/util/ClassUtils.java (65%) diff --git a/src/main/java/com/spun/util/ByteArrayDataSource.java b/src/main/java/com/spun/util/ByteArrayDataSource.java deleted file mode 100644 index f2a058d..0000000 --- a/src/main/java/com/spun/util/ByteArrayDataSource.java +++ /dev/null @@ -1,124 +0,0 @@ -package com.spun.util; - -/* - * @(#)ByteArrayDataSource.java 1.1 00/01/30 - * - * Copyright 1998-2000 Sun Microsystems, Inc. All Rights Reserved. - * - * This software is the proprietary information of Sun Microsystems, Inc. - * Use is subject to license terms. - * - */ -import java.io.*; -import javax.activation.*; - -/** - * Comment By LLewellyn: This is a needed class for using mail. For some reason wasn't - * made as part of the standard mail package.

- * - * A simple DataSource for demonstration purposes. - * This class implements a DataSource from: - * an InputStream - * a byte array - * a String - * - * @author John Mani - * @author Bill Shannon - * @author Max Spivak - **/ -public class ByteArrayDataSource implements DataSource -{ - private byte[] data; // data - private String type; // content-type - private String name = "dummy"; - /***********************************************************************/ - /* Create a DataSource from an input stream */ - public ByteArrayDataSource(InputStream is, String type) - { - this(is, type, null); - } - /***********************************************************************/ - /* Create a DataSource from an input stream */ - public ByteArrayDataSource(InputStream is, String type, String name) - { - this.type = type; - setName(name); - try - { - ByteArrayOutputStream os = new ByteArrayOutputStream(); - int ch; - while ((ch = is.read()) != -1) - { - // XXX - must be made more efficient by - // doing buffered reads, rather than one byte reads - os.write(ch); - } - data = os.toByteArray(); - } - catch (IOException ioex) - { - } - } - /***********************************************************************/ - /* Create a DataSource from a byte array */ - public ByteArrayDataSource(byte[] data, String type) - { - this.data = data; - this.type = type; - } - /***********************************************************************/ - public void setName(String name) - { - this.name = (name == null) ? "dummy" : name; - } - /***********************************************************************/ - /* Create a DataSource from a String */ - public ByteArrayDataSource(String data, String type) - { - this(data, type, null); - } - /***********************************************************************/ - /* Create a DataSource from a String */ - public ByteArrayDataSource(String data, String type, String name) - { - setName(name); - try - { - // Assumption that the string contains only ASCII - // characters! Otherwise just pass a charset into this - // constructor and use it in getBytes() - this.data = data.getBytes("iso-8859-1"); - } - catch (UnsupportedEncodingException uex) - { - } - this.type = type; - } - /***********************************************************************/ - /** - * Return an InputStream for the data. - * Note - a new stream must be returned each time. - */ - public InputStream getInputStream() throws IOException - { - if (data == null) { throw new IOException("no data"); } - return new ByteArrayInputStream(data); - } - /***********************************************************************/ - public OutputStream getOutputStream() throws IOException - { - throw new IOException("cannot do this"); - } - /***********************************************************************/ - public String getContentType() - { - return type; - } - /***********************************************************************/ - public String getName() - { - return name; - } - /***********************************************************************/ - /***********************************************************************/ -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/ObjectUtils.java b/src/main/java/com/spun/util/ObjectUtils.java index 1de13ee..e40ace8 100644 --- a/src/main/java/com/spun/util/ObjectUtils.java +++ b/src/main/java/com/spun/util/ObjectUtils.java @@ -1,6 +1,7 @@ package com.spun.util; import org.teachingkidsprogramming.util.ArrayUtils; +import org.teachingkidsprogramming.util.ClassUtils; import java.lang.reflect.Array; import java.lang.reflect.Method; diff --git a/src/main/java/com/spun/util/TestUtils.java b/src/main/java/com/spun/util/TestUtils.java index da84689..67cdeaf 100644 --- a/src/main/java/com/spun/util/TestUtils.java +++ b/src/main/java/com/spun/util/TestUtils.java @@ -21,6 +21,7 @@ import com.spun.util.io.FileUtils; import com.spun.util.io.StackElementLevelSelector; import com.spun.util.io.StackElementSelector; +import org.teachingkidsprogramming.util.ClassUtils; public class TestUtils { diff --git a/src/main/java/org/approvaltests/ReporterFactory.java b/src/main/java/org/approvaltests/ReporterFactory.java index c117b6f..6b2401c 100644 --- a/src/main/java/org/approvaltests/ReporterFactory.java +++ b/src/main/java/org/approvaltests/ReporterFactory.java @@ -14,7 +14,7 @@ import org.approvaltests.reporters.QuietReporter; import org.approvaltests.reporters.UseReporter; -import com.spun.util.ClassUtils; +import org.teachingkidsprogramming.util.ClassUtils; public class ReporterFactory { diff --git a/src/main/java/com/spun/util/ClassUtils.java b/src/main/java/org/teachingkidsprogramming/util/ClassUtils.java similarity index 65% rename from src/main/java/com/spun/util/ClassUtils.java rename to src/main/java/org/teachingkidsprogramming/util/ClassUtils.java index b6550da..f10db19 100644 --- a/src/main/java/com/spun/util/ClassUtils.java +++ b/src/main/java/org/teachingkidsprogramming/util/ClassUtils.java @@ -1,8 +1,10 @@ -package com.spun.util; +package org.teachingkidsprogramming.util; + +import com.spun.util.FormattedException; +import com.spun.util.ObjectUtils; +import com.spun.util.SearchingFileFilter; import java.io.File; -import java.lang.reflect.Field; -import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -16,51 +18,45 @@ public static String getClassName(Class clazz) int divider = name.lastIndexOf("."); return name.substring(divider + 1); } - /************************************************************************/ - public static String getClassPath(Class clazz) - { - String name = clazz.getName(); - int divider = name.lastIndexOf("."); - return name.substring(0, divider); - } - /************************************************************************/ - public static Class getWrapperClass(Class primativeType) + + /************************************************************************/ + public static Class getWrapperClass(Class primitiveType) { - if (boolean.class.equals(primativeType)) + if (boolean.class.equals(primitiveType)) { return Boolean.class; } - else if (float.class.equals(primativeType)) + else if (float.class.equals(primitiveType)) { return Float.class; } - else if (long.class.equals(primativeType)) + else if (long.class.equals(primitiveType)) { return Long.class; } - else if (int.class.equals(primativeType)) + else if (int.class.equals(primitiveType)) { return Integer.class; } - else if (short.class.equals(primativeType)) + else if (short.class.equals(primitiveType)) { return Short.class; } - else if (byte.class.equals(primativeType)) + else if (byte.class.equals(primitiveType)) { return Byte.class; } - else if (double.class.equals(primativeType)) + else if (double.class.equals(primitiveType)) { return Double.class; } - else if (char.class.equals(primativeType)) + else if (char.class.equals(primitiveType)) { return Character.class; } else { - return primativeType; + return primitiveType; } } /************************************************************************/ @@ -91,7 +87,7 @@ public static File getSourceDirectory(Class clazz) } public static File find(File file, List matches) { - ArrayList copy = new ArrayList(); + ArrayList copy = new ArrayList<>(); copy.addAll(matches); copy.add(0, "*"); return find2(file, copy); @@ -125,12 +121,5 @@ public static T create(Class clazz) throw ObjectUtils.throwAsError(e); } } - public static boolean IsPublicStatic(Field field) - { - return field != null && Modifier.isPublic(field.getModifiers()) && Modifier.isStatic(field.getModifiers()); - } - public static boolean isPrimitiveField(Field field) - { - return field != null && (field.getType().isArray() || field.getType().isPrimitive() || field.getType().isAssignableFrom(String.class)); - } + } From e44047c62de30a36605c72f9c58c16dcd4e0701c Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Tue, 17 Mar 2015 09:20:14 -0700 Subject: [PATCH 026/111] clean, move Country --- src/main/java/com/spun/util/Comparator.java | 7 --- .../java/com/spun/util/ConditionListener.java | 14 ------ src/main/java/com/spun/util/Country.java | 48 ------------------- .../java/com/spun/util/EnabledConditions.java | 34 ------------- src/main/java/com/spun/util/PhoneNumber.java | 2 + .../teachingkidsprogramming/util/Country.java | 39 +++++++++++++++ 6 files changed, 41 insertions(+), 103 deletions(-) delete mode 100644 src/main/java/com/spun/util/Comparator.java delete mode 100644 src/main/java/com/spun/util/ConditionListener.java delete mode 100644 src/main/java/com/spun/util/Country.java delete mode 100644 src/main/java/com/spun/util/EnabledConditions.java create mode 100644 src/main/java/org/teachingkidsprogramming/util/Country.java diff --git a/src/main/java/com/spun/util/Comparator.java b/src/main/java/com/spun/util/Comparator.java deleted file mode 100644 index 4630fc4..0000000 --- a/src/main/java/com/spun/util/Comparator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.spun.util; - -/***********************************************************************/ -public interface Comparator -{ - public boolean isEqual(Object one, Object other); -} diff --git a/src/main/java/com/spun/util/ConditionListener.java b/src/main/java/com/spun/util/ConditionListener.java deleted file mode 100644 index b26255e..0000000 --- a/src/main/java/com/spun/util/ConditionListener.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.spun.util; - -/** - * Listens to the state of a EnabledConditions object - **/ - - -public interface ConditionListener -{ - /**************************************************************************/ - public void conditionsChanged(EnabledConditions caller); - /**************************************************************************/ - /**************************************************************************/ -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/Country.java b/src/main/java/com/spun/util/Country.java deleted file mode 100644 index 12145e2..0000000 --- a/src/main/java/com/spun/util/Country.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.spun.util; - - -public enum Country { - Albania, Algeria, AmericanSamoa("American Samoa"), Andorra, Angola, Anguilla, AntiguaAndBarbuda("Antigua & Barbuda"), Argentina, Armenia, Aruba, Australia, Austria, Azerbaijan, Azores, Bahamas, Bahrain, Bangladesh, Barbados, Belarus, Belgium, Belize, Benin, Bermuda, Bolivia, Bonaire, Bosnia, Botswana, Brazil, BritishVirginIsles( - "British Virgin Isles"), Brunei, Bulgaria, BurkinaFaso("Burkina Faso"), Burundi, Cambodia, Cameroon, Canada, CanaryIslands("Canary Islands"), CapeVerde( - "Cape Verde"), CaymanIslands("Cayman Islands"), CentralAfricanRepublic("Central African Republic"), Chad, ChannelIslands("Channel Islands"), Chile, Colombia, CookIslands( - "Cook Islands"), CostaRica("Costa Rica"), CotedIvoire("Cote d' Ivoire"), Croatia, Cuba, Curacao, Cyprus, CzechRepublic("Czech Republic"), DemRepublicofCongo( - "Dem. Republic of Congo"), Denmark, Djibouti, Dominica, DominicanRepublic("Dominican Republic"), Ecuador, Egypt, ElSalvador("El Salvador"), England, EquatorialGuinea( - "Equatorial Guinea"), Eritrea, Estonia, Ethiopia, FaeroeIslands("Faeroe Islands"), Fiji, Finland, France, FrenchGuiana("French Guiana"), FrenchPolynesia( - "French Polynesia"), Gabon, Gambia, Georgia, Germany, Ghana, Gibraltar, Greece, Greenland, Grenada, Guadeloupe, Guam, Guatemala, Guinea, GuineaBissau( - "Guinea-Bissau"), Guyana, Haiti, Holland, Honduras, HongKong("Hong Kong"), Hungary, Iceland, India, Indonesia, Iran, Iraq, Israel, Italy, Jamaica, Japan, Jordan, Kazakhstan, Kenya, Kiribati, Kosrae, Kuwait, Kyrgyzstan, Laos, Latvia, Lebanon, Lesotho, Liberia, Libya, Liechtenstein, Lithuania, Luxembourg, Macau, Macedonia, Madagascar, Madeira, Malawi, Malaysia, Maldives, Mali, Malta, MarshallIslands( - "Marshall Islands"), Martinique, Mauritania, Mauritius, Mexico, Micronesia, Moldova, Monaco, Mongolia, Montserrat, Morocco, Mozambique, Myanmar, NMarianaIslands( - "N. Mariana Islands"), Namibia, Nepal, Netherlands, NetherlandsAntilles("Netherlands Antilles"), NewCaledonia("New Caledonia"), NewZealand( - "New Zealand"), Nicaragua, Niger, Nigeria, NorfolkIsland("Norfolk Island"), NorthKorea("North Korea"), NorthernIreland("Northern Ireland"), Norway, Oman, Pakistan, Palau, Panama, PapuaNewGuinea( - "Papua New Guinea"), Paraguay, PeoplesRepublicofChina("Peoples Republic of China"), Peru, Philippines, Poland, Ponape, Portugal, PuertoRico( - "Puerto Rico"), Qatar, RepublicofCongo("Republic of Congo"), RepublicofIreland("Republic of Ireland"), RepublicofYemen("Republic of Yemen"), Reunion, Romania, Rota, Russia, Rwanda, Saba, Saipan, SanMarino( - "San Marino"), SaudiArabia("Saudi Arabia"), Scotland, Senegal, Seychelles, SierraLeone("Sierra Leone"), Singapore, Slovakia, Slovenia, SolomonIslands( - "Solomon Islands"), SouthAfrica("South Africa"), SouthKorea("South Korea"), Spain, SriLanka("Sri Lanka"), StVincentGrenadine( - "St Vincent/Grenadine"), StBarthelemy("St. Barthelemy"), StChristopher("St. Christopher"), StCroix("St. Croix"), StEustatius("St. Eustatius"), StJohn( - "St. John"), StKittsAndNevis("St. Kitts & Nevis"), StLucia("St. Lucia"), StMaarten("St. Maarten"), StMartin("St. Martin"), StThomas( - "St. Thomas"), Sudan, Suriname, Swaziland, Sweden, Switzerland, Syria, Tahiti, Taiwan, Tajikistan, Tanzania, Thailand, Tinian, Togo, Tonga, Tortola, TrinidadAndTobago( - "Trinidad & Tobago"), Truk, Tunisia, Turkey, Turkmenistan, TurksAndCaicosIsles("Turks & Caicos Isles"), Tuvalu, Uganda, Ukraine, UnionIsland( - "Union Island"), UnitedArabEmirates("United Arab Emirates"), UnitedKingdom("United Kingdom"), UnitedStates("United States"), Uruguay, USVirginIslands( - "US Virgin Islands"), Uzbekistan, Vanuatu, VaticanCityState("Vatican City State"), Venezuela, Vietnam, VirginGorda("Virgin Gorda"), WakeIsland( - "Wake Island"), Wales, WallisAndFutunaIsle("Wallis & Futuna Isle"), WesternSamoa("Western Samoa"), Yap, Yugoslavia, Zambia, Zimbabwe; - String altText = null; - private Country() - { - } - private Country(String altText) - { - this.altText = altText; - } - public String toString() - { - return altText == null ? super.toString() : altText; - } - private static String[] names = null; - public synchronized static String[] getStringValues() - { - if (names == null) - { - names = (String[]) ObjectUtils.extractArray(Country.values(),"toString"); - } - return names; - } -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/EnabledConditions.java b/src/main/java/com/spun/util/EnabledConditions.java deleted file mode 100644 index b42b426..0000000 --- a/src/main/java/com/spun/util/EnabledConditions.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.spun.util; - -/** - * This is a Top Level of the configuration classes. It is a container for - * other classes. - **/ - - -public interface EnabledConditions -{ - - /**************************************************************************/ - /** - * Returns the conditions that are allowed at the current time. - **/ - public boolean isEnabled(int state); - /**************************************************************************/ - /** - * Returns ToolTipText for the item dependant on the state. - **/ - public String getToolTipText(int state); - /**************************************************************************/ - /** - * Adds the conditionListener, calls conditions changed on the current listener. - **/ - public void addConditionListener(ConditionListener listener); - /**************************************************************************/ - /** - * removes the conditionListener - **/ - public void removeConditionListener(ConditionListener listener); - /**************************************************************************/ - /**************************************************************************/ -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/PhoneNumber.java b/src/main/java/com/spun/util/PhoneNumber.java index 49841f9..4fc8530 100644 --- a/src/main/java/com/spun/util/PhoneNumber.java +++ b/src/main/java/com/spun/util/PhoneNumber.java @@ -1,6 +1,8 @@ package com.spun.util; +import org.teachingkidsprogramming.util.Country; + /** * Phone number validation, and formatter. * this class is immutable. diff --git a/src/main/java/org/teachingkidsprogramming/util/Country.java b/src/main/java/org/teachingkidsprogramming/util/Country.java new file mode 100644 index 0000000..048908c --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/util/Country.java @@ -0,0 +1,39 @@ +package org.teachingkidsprogramming.util; + + +public enum Country { + Albania, Algeria, AmericanSamoa("American Samoa"), Andorra, Angola, Anguilla, AntiguaAndBarbuda("Antigua & Barbuda"), Argentina, Armenia, Aruba, Australia, Austria, Azerbaijan, Azores, Bahamas, Bahrain, Bangladesh, Barbados, Belarus, Belgium, Belize, Benin, Bermuda, Bolivia, Bonaire, Bosnia, Botswana, Brazil, BritishVirginIsles( + "British Virgin Isles"), Brunei, Bulgaria, BurkinaFaso("Burkina Faso"), Burundi, Cambodia, Cameroon, Canada, CanaryIslands("Canary Islands"), CapeVerde( + "Cape Verde"), CaymanIslands("Cayman Islands"), CentralAfricanRepublic("Central African Republic"), Chad, ChannelIslands("Channel Islands"), Chile, Colombia, CookIslands( + "Cook Islands"), CostaRica("Costa Rica"), CotedIvoire("Cote d' Ivoire"), Croatia, Cuba, Curacao, Cyprus, CzechRepublic("Czech Republic"), DemRepublicofCongo( + "Dem. Republic of Congo"), Denmark, Djibouti, Dominica, DominicanRepublic("Dominican Republic"), Ecuador, Egypt, ElSalvador("El Salvador"), England, EquatorialGuinea( + "Equatorial Guinea"), Eritrea, Estonia, Ethiopia, FaeroeIslands("Faeroe Islands"), Fiji, Finland, France, FrenchGuiana("French Guiana"), FrenchPolynesia( + "French Polynesia"), Gabon, Gambia, Georgia, Germany, Ghana, Gibraltar, Greece, Greenland, Grenada, Guadeloupe, Guam, Guatemala, Guinea, GuineaBissau( + "Guinea-Bissau"), Guyana, Haiti, Holland, Honduras, HongKong("Hong Kong"), Hungary, Iceland, India, Indonesia, Iran, Iraq, Israel, Italy, Jamaica, Japan, Jordan, Kazakhstan, Kenya, Kiribati, Kosrae, Kuwait, Kyrgyzstan, Laos, Latvia, Lebanon, Lesotho, Liberia, Libya, Liechtenstein, Lithuania, Luxembourg, Macau, Macedonia, Madagascar, Madeira, Malawi, Malaysia, Maldives, Mali, Malta, MarshallIslands( + "Marshall Islands"), Martinique, Mauritania, Mauritius, Mexico, Micronesia, Moldova, Monaco, Mongolia, Montserrat, Morocco, Mozambique, Myanmar, NMarianaIslands( + "N. Mariana Islands"), Namibia, Nepal, Netherlands, NetherlandsAntilles("Netherlands Antilles"), NewCaledonia("New Caledonia"), NewZealand( + "New Zealand"), Nicaragua, Niger, Nigeria, NorfolkIsland("Norfolk Island"), NorthKorea("North Korea"), NorthernIreland("Northern Ireland"), Norway, Oman, Pakistan, Palau, Panama, PapuaNewGuinea( + "Papua New Guinea"), Paraguay, PeoplesRepublicofChina("Peoples Republic of China"), Peru, Philippines, Poland, Ponape, Portugal, PuertoRico( + "Puerto Rico"), Qatar, RepublicofCongo("Republic of Congo"), RepublicofIreland("Republic of Ireland"), RepublicofYemen("Republic of Yemen"), Reunion, Romania, Rota, Russia, Rwanda, Saba, Saipan, SanMarino( + "San Marino"), SaudiArabia("Saudi Arabia"), Scotland, Senegal, Seychelles, SierraLeone("Sierra Leone"), Singapore, Slovakia, Slovenia, SolomonIslands( + "Solomon Islands"), SouthAfrica("South Africa"), SouthKorea("South Korea"), Spain, SriLanka("Sri Lanka"), StVincentGrenadine( + "St Vincent/Grenadine"), StBarthelemy("St. Barthelemy"), StChristopher("St. Christopher"), StCroix("St. Croix"), StEustatius("St. Eustatius"), StJohn( + "St. John"), StKittsAndNevis("St. Kitts & Nevis"), StLucia("St. Lucia"), StMaarten("St. Maarten"), StMartin("St. Martin"), StThomas( + "St. Thomas"), Sudan, Suriname, Swaziland, Sweden, Switzerland, Syria, Tahiti, Taiwan, Tajikistan, Tanzania, Thailand, Tinian, Togo, Tonga, Tortola, TrinidadAndTobago( + "Trinidad & Tobago"), Truk, Tunisia, Turkey, Turkmenistan, TurksAndCaicosIsles("Turks & Caicos Isles"), Tuvalu, Uganda, Ukraine, UnionIsland( + "Union Island"), UnitedArabEmirates("United Arab Emirates"), UnitedKingdom("United Kingdom"), UnitedStates("United States"), Uruguay, USVirginIslands( + "US Virgin Islands"), Uzbekistan, Vanuatu, VaticanCityState("Vatican City State"), Venezuela, Vietnam, VirginGorda("Virgin Gorda"), WakeIsland( + "Wake Island"), Wales, WallisAndFutunaIsle("Wallis & Futuna Isle"), WesternSamoa("Western Samoa"), Yap, Yugoslavia, Zambia, Zimbabwe; + String altText = null; + + private Country() { + } + + private Country(String altText) { + this.altText = altText; + } + + public String toString() { + return altText == null ? super.toString() : altText; + } +} \ No newline at end of file From 2f232140d90735374eeb58536a1a3ab9dc8bebce Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Tue, 17 Mar 2015 09:25:00 -0700 Subject: [PATCH 027/111] clean, move DateDifference --- .../java/com/spun/util/DateDifference.java | 279 ------------------ src/main/java/com/spun/util/MySystem.java | 2 + src/main/java/com/spun/util/ProgessFrame.java | 3 +- .../com/spun/util/parser/TemplateDate.java | 2 +- .../java/com/spun/util/timers/Counter.java | 2 +- .../java/com/spun/util/timers/EventTime.java | 2 +- .../java/com/spun/util/timers/LapTime.java | 2 +- .../util/DateDifference.java | 132 +++++++++ 8 files changed, 140 insertions(+), 284 deletions(-) delete mode 100644 src/main/java/com/spun/util/DateDifference.java create mode 100644 src/main/java/org/teachingkidsprogramming/util/DateDifference.java diff --git a/src/main/java/com/spun/util/DateDifference.java b/src/main/java/com/spun/util/DateDifference.java deleted file mode 100644 index ccfee2b..0000000 --- a/src/main/java/com/spun/util/DateDifference.java +++ /dev/null @@ -1,279 +0,0 @@ -package com.spun.util; - -import java.util.Calendar; -import java.util.Date; - -public class DateDifference -{ - public static final String STANDARD_TIME_TEXT[] = {"Year", "Years", "Month", "Months", "Week", "Weeks", "Day", "Days", "Hour", "Hours", "Min", "Mins", "Sec", "Secs", "Milli", "Millis"}; - public static final String MILLISECONDS = "milliseconds"; - public static final String SECONDS = "seconds"; - public static final String MINUTES = "minutes"; - public static final String HOURS = "hours"; - public static final String DAYS = "days"; - public static final String WEEKS = "weeks"; - public static final String MONTHS = "months"; - public static final String YEARS = "years"; - public static String TIME_UNITS[] = {YEARS, MONTHS, WEEKS, DAYS, HOURS, MINUTES, SECONDS, MILLISECONDS}; - // assumes a 30 day month - private static int TIME_SCALE[] = {Calendar.YEAR, Calendar.MONTH, Calendar.WEEK_OF_YEAR, Calendar.DATE, Calendar.HOUR, Calendar.MINUTE, Calendar.SECOND, Calendar.MILLISECOND}; - private static long DIVIDERS[] = {1000 * 60 * 60 * 24 * 365L, 1000 * 60 * 60 * 24 * 30L, 1000 * 60 * 60 * 24 * 7L, 1000 * 60 * 60 * 24L, 1000 * 60 * 60L, 1000 * 60L, 1000L, 1L}; - /************************************************************************/ - private long milli; - /************************************************************************/ - public DateDifference(long timeDifference) - { - this.milli = timeDifference; - } - /************************************************************************/ - public DateDifference(Date date1, Date date2) - { - milli = date1.getTime() - date2.getTime(); - if (milli < 0) - { - milli = milli * -1; - } - // My_System.variable("dateDifference = " + milli); - } - /************************************************************************/ - /** - * Debugging tool. - **/ - public static void printDividers() - { - MySystem.variable("max long = " + Long.MAX_VALUE); - for (int i = 0; i < DIVIDERS.length; i++) - { - MySystem.variable("" + DIVIDERS[i]); - } - } - /************************************************************************/ - /** - * Gets the amount of [Units].
- * i.e.
- * Given a DateDifference of 2 Days 3 Hours 4 Minutes
- * getAbsoluteDifference(Calendar.DATE) = 2 - * getAbsoluteDifference(Calendar.HOUR) = 51 - **/ - public long getAbsoluteDifference(int unit) - { - return getAbsoluteDifference(unit, this.milli); - } - /************************************************************************/ - public long getAbsoluteDifference(String unit) - { - return getAbsoluteDifference(convertUnitString(unit)); - } - /************************************************************************/ - public long getRoundedDifference(String unit) - { - return getRoundedDifference(convertUnitString(unit),this.milli); - } - /************************************************************************/ - public long getRoundedDifference(int unit) - { - return getRoundedDifference(unit,this.milli); - } - /************************************************************************/ - public static long getAbsoluteDifference(int unit, long time) - { - // My_System.variable("divider = " + DIVIDERS[getIndex(unit)]); - return time / DIVIDERS[getTimeScaleIndex(unit)]; - } - /************************************************************************/ - public static long getRoundedDifference(int unit, long time) - { - return Math.round(((double)time) / DIVIDERS[getTimeScaleIndex(unit)]); - } - /************************************************************************/ - /** - * Gets the remaining amount of [Units].
- * i.e.
- * Given a DateDifference of 1 Month 2 Weeks 3 Days, - * getRemainingDifference(days, months) = 17 days
- * getRemainingDifference(days, weeks) = 3 days
- **/ - public long getRemainingDifference(int wantedUnit, int roundTo) - { - return getRemainingDifference(wantedUnit, roundTo, this.milli); - } - /************************************************************************/ - /************************************************************************/ - public static long getRemainingDifference(int wantedUnit, int roundTo, long time) - { - int wantedIndex = getTimeScaleIndex(wantedUnit); - int roundToIndex = getTimeScaleIndex(roundTo); - if (wantedIndex < roundToIndex) { throw new Error("Can't round with a smaller Unit.[" + TIME_UNITS[wantedIndex] + ", " + TIME_UNITS[roundToIndex] + "]"); } - //roundedDifference = (millis % (roundTo in millis)) / (unit in millis) - return (time % DIVIDERS[roundToIndex]) / DIVIDERS[wantedIndex]; - } - /***********************************************************************/ - /** - * @return the index in TIME_SCALE[] of the largest Unit to be > 0 - **/ - private int getMaximumTimeUnit() - { - int i = 0; - while ((i < DIVIDERS.length) && (milli < DIVIDERS[i])) - { - i++; - } - return i; - } - /***********************************************************************/ - /** - * Finds the index for a Calendar.DATE ect. - * @return the index in TIME_SCALE[] - **/ - public static int getTimeScaleIndex(int calendarTime) - { - int i = 0; - while (calendarTime != TIME_SCALE[i]) - { - i++; - } - return i; - } - /***********************************************************************/ - public static int convertUnitString(String unit) - { - int result = 0; - if (MILLISECONDS.equalsIgnoreCase(unit)) - { - result = Calendar.MILLISECOND; - } - else if (SECONDS.equalsIgnoreCase(unit)) - { - result = Calendar.SECOND; - } - else if (MINUTES.equalsIgnoreCase(unit)) - { - result = Calendar.MINUTE; - } - else if (HOURS.equalsIgnoreCase(unit)) - { - result = Calendar.HOUR; - } - else if (DAYS.equalsIgnoreCase(unit)) - { - result = Calendar.DATE; - } - else if (WEEKS.equalsIgnoreCase(unit)) - { - result = Calendar.WEEK_OF_YEAR; - } - else if (MONTHS.equalsIgnoreCase(unit)) - { - result = Calendar.MONTH; - } - else if (YEARS.equalsIgnoreCase(unit)) - { - result = Calendar.YEAR; - } - return result; - } - /***********************************************************************/ - public static long convertUnitStringToMilli(String unit) - { - int cal = convertUnitString(unit); - return DIVIDERS[getTimeScaleIndex(cal)]; - } - /***********************************************************************/ - public boolean isMoreThan(int amount, int unit) - { - return (getAbsoluteDifference(unit) >= amount); - } - /***********************************************************************/ - public boolean isMoreThan(int amount, String unitString) - { - return (getAbsoluteDifference(convertUnitString(unitString)) >= amount); - } - /***********************************************************************/ - public long getStandardRoundedTime(int unitIndex, boolean forceAbsolute) - { - return getStandardRoundedTime(unitIndex, forceAbsolute, this.milli); - } - /***********************************************************************/ - private static long getStandardRoundedTime(int unitIndex, boolean forceAbsolute, long time) - { - if (unitIndex == 0 || forceAbsolute) - { - return getAbsoluteDifference(TIME_SCALE[unitIndex], time); - } - else - { - return getRemainingDifference(TIME_SCALE[unitIndex], TIME_SCALE[unitIndex - 1], time); - } - } - /***********************************************************************/ - public String getStandardTimeText(int amount, String maxUnit, String minUnit, String nowText, String agoText) - { - return getTimeText(amount, convertUnitString(maxUnit), convertUnitString(minUnit), nowText, agoText, STANDARD_TIME_TEXT); - } - /***********************************************************************/ - public String getTimeText(int amount, int maxUnit, int minUnit, String nowText, String agoText, String units[]) - { - // My_System.variable("amount = " + amount + ", maxUnit = " + maxUnit + ", minUnit = " + minUnit + ", nowText = " + nowText); - if (amount == 0) { throw new Error("getTimeText() requires amount > 0"); } - maxUnit = getTimeScaleIndex(maxUnit); - minUnit = getTimeScaleIndex(minUnit); - int realMax = getMaximumTimeUnit(); - String timeText = nowText; - if (realMax < maxUnit) - { - realMax = maxUnit; - } - if (realMax <= minUnit) - { - timeText = ""; - long remainingTime = this.milli; - for (int i = realMax; i < (realMax + amount) && (i <= minUnit); i++) - { - long time = getStandardRoundedTime(i, i == realMax, remainingTime); - remainingTime -= time * DIVIDERS[i]; - timeText += time + " " + units[(time == 1) ? i * 2 : i * 2 + 1] + ", "; - //My_System.variable("timeText = " + timeText); - } - timeText = timeText.substring(0, timeText.length() - 2); - if ((agoText != null) && (agoText.length() > 0)) - { - timeText += " " + agoText; - } - } - return timeText; - } - /***********************************************************************/ - public String getClockTimeText() - { - int maxUnit = getTimeScaleIndex(Calendar.HOUR); - int minUnit = getTimeScaleIndex(Calendar.MILLISECOND); - int realMax = getMaximumTimeUnit(); - realMax = (realMax < maxUnit) ? maxUnit : realMax; - String timeText = ""; - if (realMax <= minUnit) - { - for (int i = realMax; i <= minUnit; i++) - { - int padding = (i == getTimeScaleIndex(Calendar.MILLISECOND)) ? 3 : 2; - long time = getStandardRoundedTime(i, i == realMax); - if (i == realMax) - { - timeText += time + ":"; - } - else - { - timeText += StringUtils.padNumber(time, padding) + ":"; - } - } - timeText = timeText.substring(0, timeText.length() - 1); - } - return timeText; - } - /***********************************************************************/ - public String getStandardTimeText(int amountShown) - { - return getTimeText(amountShown, Calendar.YEAR, Calendar.MILLISECOND, "now", "", STANDARD_TIME_TEXT); - } - /************************************************************************/ - /************************************************************************/ -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/MySystem.java b/src/main/java/com/spun/util/MySystem.java index e5e209c..1e462ec 100644 --- a/src/main/java/com/spun/util/MySystem.java +++ b/src/main/java/com/spun/util/MySystem.java @@ -1,5 +1,7 @@ package com.spun.util; +import org.teachingkidsprogramming.util.DateDifference; + import java.io.PrintWriter; import java.util.Vector; diff --git a/src/main/java/com/spun/util/ProgessFrame.java b/src/main/java/com/spun/util/ProgessFrame.java index 0c2a70e..a963cad 100644 --- a/src/main/java/com/spun/util/ProgessFrame.java +++ b/src/main/java/com/spun/util/ProgessFrame.java @@ -1,6 +1,7 @@ package com.spun.util; -import com.spun.util.WindowUtils; +import org.teachingkidsprogramming.util.DateDifference; + import javax.swing.*; import java.awt.*; diff --git a/src/main/java/com/spun/util/parser/TemplateDate.java b/src/main/java/com/spun/util/parser/TemplateDate.java index ffe7078..8e3c5c3 100644 --- a/src/main/java/com/spun/util/parser/TemplateDate.java +++ b/src/main/java/com/spun/util/parser/TemplateDate.java @@ -6,7 +6,7 @@ import java.util.Date; import java.util.GregorianCalendar; import java.util.TimeZone; -import com.spun.util.DateDifference; +import org.teachingkidsprogramming.util.DateDifference; import com.spun.util.DateUtils; import com.spun.util.StringUtils; diff --git a/src/main/java/com/spun/util/timers/Counter.java b/src/main/java/com/spun/util/timers/Counter.java index 68ff395..05605aa 100644 --- a/src/main/java/com/spun/util/timers/Counter.java +++ b/src/main/java/com/spun/util/timers/Counter.java @@ -1,6 +1,6 @@ package com.spun.util.timers; -import com.spun.util.DateDifference; +import org.teachingkidsprogramming.util.DateDifference; /** * A Utility for counting things. diff --git a/src/main/java/com/spun/util/timers/EventTime.java b/src/main/java/com/spun/util/timers/EventTime.java index 51b4156..2f35c49 100644 --- a/src/main/java/com/spun/util/timers/EventTime.java +++ b/src/main/java/com/spun/util/timers/EventTime.java @@ -1,7 +1,7 @@ package com.spun.util.timers; import java.io.Serializable; -import com.spun.util.DateDifference; +import org.teachingkidsprogramming.util.DateDifference; /** * A Utility for timing an event multiple times. diff --git a/src/main/java/com/spun/util/timers/LapTime.java b/src/main/java/com/spun/util/timers/LapTime.java index ae55afa..596c8b6 100644 --- a/src/main/java/com/spun/util/timers/LapTime.java +++ b/src/main/java/com/spun/util/timers/LapTime.java @@ -1,6 +1,6 @@ package com.spun.util.timers; -import com.spun.util.DateDifference; +import org.teachingkidsprogramming.util.DateDifference; /** * A Utility for timing things. this is multi-thread safe. diff --git a/src/main/java/org/teachingkidsprogramming/util/DateDifference.java b/src/main/java/org/teachingkidsprogramming/util/DateDifference.java new file mode 100644 index 0000000..e50fbb7 --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/util/DateDifference.java @@ -0,0 +1,132 @@ +package org.teachingkidsprogramming.util; + +import java.util.Calendar; +import java.util.Date; + +public class DateDifference { + public static final String STANDARD_TIME_TEXT[] = {"Year", "Years", "Month", "Months", "Week", "Weeks", "Day", "Days", "Hour", "Hours", "Min", "Mins", "Sec", "Secs", "Milli", "Millis"}; + public static final String MILLISECONDS = "milliseconds"; + public static final String SECONDS = "seconds"; + public static final String MINUTES = "minutes"; + public static final String HOURS = "hours"; + public static final String DAYS = "days"; + public static final String WEEKS = "weeks"; + public static final String MONTHS = "months"; + public static final String YEARS = "years"; + public static String TIME_UNITS[] = {YEARS, MONTHS, WEEKS, DAYS, HOURS, MINUTES, SECONDS, MILLISECONDS}; + // assumes a 30 day month + private static int TIME_SCALE[] = {Calendar.YEAR, Calendar.MONTH, Calendar.WEEK_OF_YEAR, Calendar.DATE, Calendar.HOUR, Calendar.MINUTE, Calendar.SECOND, Calendar.MILLISECOND}; + private static long DIVIDERS[] = {1000 * 60 * 60 * 24 * 365L, 1000 * 60 * 60 * 24 * 30L, 1000 * 60 * 60 * 24 * 7L, 1000 * 60 * 60 * 24L, 1000 * 60 * 60L, 1000 * 60L, 1000L, 1L}; + /** + * ******************************************************************** + */ + private long milli; + + /** + * ******************************************************************** + */ + public DateDifference(long timeDifference) { + this.milli = timeDifference; + } + + /** + * ******************************************************************** + */ + public DateDifference(Date date1, Date date2) { + milli = date1.getTime() - date2.getTime(); + if (milli < 0) { + milli = milli * -1; + } + } + /** + * ******************************************************************** + */ + public static long getAbsoluteDifference(int unit, long time) { + return time / DIVIDERS[getTimeScaleIndex(unit)]; + } + /** + * ******************************************************************** + */ + public static long getRemainingDifference(int wantedUnit, int roundTo, long time) { + int wantedIndex = getTimeScaleIndex(wantedUnit); + int roundToIndex = getTimeScaleIndex(roundTo); + if (wantedIndex < roundToIndex) { + throw new Error("Can't round with a smaller Unit.[" + TIME_UNITS[wantedIndex] + ", " + TIME_UNITS[roundToIndex] + "]"); + } + return (time % DIVIDERS[roundToIndex]) / DIVIDERS[wantedIndex]; + } + /***********************************************************************/ + /** + * @return the index in TIME_SCALE[] of the largest Unit to be > 0 + */ + private int getMaximumTimeUnit() { + int i = 0; + while ((i < DIVIDERS.length) && (milli < DIVIDERS[i])) { + i++; + } + return i; + } + /***********************************************************************/ + /** + * Finds the index for a Calendar.DATE ect. + * + * @return the index in TIME_SCALE[] + */ + public static int getTimeScaleIndex(int calendarTime) { + int i = 0; + while (calendarTime != TIME_SCALE[i]) { + i++; + } + return i; + } + + /** + * ******************************************************************* + */ + private static long getStandardRoundedTime(int unitIndex, boolean forceAbsolute, long time) { + if (unitIndex == 0 || forceAbsolute) { + return getAbsoluteDifference(TIME_SCALE[unitIndex], time); + } else { + return getRemainingDifference(TIME_SCALE[unitIndex], TIME_SCALE[unitIndex - 1], time); + } + } + + /** + * ******************************************************************* + */ + public String getTimeText(int amount, int maxUnit, int minUnit, String nowText, String agoText, String units[]) { + if (amount == 0) { + throw new Error("getTimeText() requires amount > 0"); + } + maxUnit = getTimeScaleIndex(maxUnit); + minUnit = getTimeScaleIndex(minUnit); + int realMax = getMaximumTimeUnit(); + String timeText = nowText; + if (realMax < maxUnit) { + realMax = maxUnit; + } + if (realMax <= minUnit) { + timeText = ""; + long remainingTime = this.milli; + for (int i = realMax; i < (realMax + amount) && (i <= minUnit); i++) { + long time = getStandardRoundedTime(i, i == realMax, remainingTime); + remainingTime -= time * DIVIDERS[i]; + timeText += time + " " + units[(time == 1) ? i * 2 : i * 2 + 1] + ", "; + } + timeText = timeText.substring(0, timeText.length() - 2); + if ((agoText != null) && (agoText.length() > 0)) { + timeText += " " + agoText; + } + } + return timeText; + } + + /** + * ******************************************************************* + */ + public String getStandardTimeText(int amountShown) { + return getTimeText(amountShown, Calendar.YEAR, Calendar.MILLISECOND, "now", "", STANDARD_TIME_TEXT); + } + /************************************************************************/ + /************************************************************************/ +} \ No newline at end of file From 1ce1a14c1efff0a433db806b09f870cae12b0220 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Tue, 17 Mar 2015 09:29:53 -0700 Subject: [PATCH 028/111] clean, move DateUtils --- src/main/java/com/spun/util/DateUtils.java | 297 ------------------ .../com/spun/util/parser/TemplateDate.java | 2 +- .../spun/util/velocity/ParserDateUtils.java | 2 +- .../util/DateUtils.java | 137 ++++++++ 4 files changed, 139 insertions(+), 299 deletions(-) delete mode 100644 src/main/java/com/spun/util/DateUtils.java create mode 100644 src/main/java/org/teachingkidsprogramming/util/DateUtils.java diff --git a/src/main/java/com/spun/util/DateUtils.java b/src/main/java/com/spun/util/DateUtils.java deleted file mode 100644 index 0db174d..0000000 --- a/src/main/java/com/spun/util/DateUtils.java +++ /dev/null @@ -1,297 +0,0 @@ -package com.spun.util; - -import org.teachingkidsprogramming.util.ArrayUtils; - -import java.sql.Timestamp; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Date; -import java.util.GregorianCalendar; -import java.util.TimeZone; - -/** - * A static class of convenience functions for database access - **/ -public class DateUtils -{ - private static int TIME_SCALE[] = {Calendar.YEAR, - Calendar.MONTH, - Calendar.DATE, - Calendar.HOUR_OF_DAY, - Calendar.HOUR, - Calendar.MINUTE, - Calendar.SECOND, - Calendar.MILLISECOND }; - /************************************************************************/ - /** - * - **/ - public static boolean isSame(Date firstDate, Date secondDate, int smallestUnits) - { - if ((firstDate == null) || (secondDate == null)) { return (firstDate == secondDate); } - return isSame(firstDate.getTime(), secondDate.getTime(), smallestUnits); - } - /************************************************************************/ - /** - * - **/ - public static boolean isSame(Calendar firstDate, Calendar secondDate, int smallestUnits) - { - if ((firstDate == null) || (secondDate == null)) { return (firstDate == secondDate); } - return isSame(firstDate.getTime().getTime(), secondDate.getTime().getTime(), smallestUnits); - } - /************************************************************************/ - /** - * - **/ - public static boolean isSame(Date firstDate, Calendar secondDate, int smallestUnits) - { - if ((firstDate == null) || (secondDate == null)) { return ((Object) firstDate == (Object) secondDate); } - return isSame(firstDate.getTime(), secondDate.getTime().getTime(), smallestUnits); - } - /************************************************************************/ - /** - * - **/ - public static boolean isSame(Calendar firstDate, Date secondDate, int smallestUnits) - { - if ((firstDate == null) || (secondDate == null)) { return ((Object) firstDate == (Object) secondDate); } - return isSame(firstDate.getTime().getTime(), secondDate.getTime(), smallestUnits); - } - /************************************************************************/ - /** - * - **/ - public static boolean isSame(long firstDate, long secondDate, int smallestUnits) - { - if (!ArrayUtils.contains(TIME_SCALE, smallestUnits)) { throw new Error("Invalid Timescale " + smallestUnits); } - GregorianCalendar first = new GregorianCalendar(); - first.setTime(new Date(firstDate)); - setSignificantDigit(first, smallestUnits); - GregorianCalendar second = new GregorianCalendar(); - second.setTime(new Date(secondDate)); - setSignificantDigit(second, smallestUnits); - // My_System.variable("Testing if " + first.getTime().getTime() + "==" + second.getTime().getTime()); - return (first.getTime().getTime() == second.getTime().getTime()); - } - /************************************************************************/ - public static Timestamp getStartOfYear() - { - GregorianCalendar gregorianCalendar = new GregorianCalendar(); - DateUtils.setSignificantDigit(gregorianCalendar, Calendar.YEAR); - return new Timestamp(gregorianCalendar.getTime().getTime()); - } - /************************************************************************/ - public static Timestamp getStartOfToday() - { - return getStartOfXDaysAgo(0); - } - /************************************************************************/ - public static Timestamp getStartOfXDaysAgo(int numberOfDays) - { - return getStartOfXDaysAgo(numberOfDays, new Date()); - } - /************************************************************************/ - public static Timestamp getStartOfXDaysAgo(int numberOfDays, Date startingFrom) - { - GregorianCalendar gregorianCalendar = new GregorianCalendar(); - gregorianCalendar.setTime(startingFrom); - DateUtils.setSignificantDigit(gregorianCalendar, Calendar.DATE); - gregorianCalendar.add(Calendar.DATE, -numberOfDays); - return new Timestamp(gregorianCalendar.getTime().getTime()); - } - /************************************************************************/ - public static Calendar getEndOfTodayAsCalendar() - { - return rollToEndOfDay(new Date()); - } - /************************************************************************/ - public static Timestamp getEndOfToday() - { - return new Timestamp(getEndOfTodayAsCalendar().getTime().getTime()); - } - /************************************************************************/ - public static Calendar setSignificantDigit(Date date, int smallestUnits) - { - GregorianCalendar calendar = new GregorianCalendar(); - calendar.setTimeInMillis(date.getTime()); - return setSignificantDigit(calendar, smallestUnits); - } - /************************************************************************/ - public static Calendar setSignificantDigit(Calendar calendar, int smallestUnits) - { - boolean removeOn = false; - for (int i = 0; i < TIME_SCALE.length; i++) - { - if (removeOn) - { - if (TIME_SCALE[i] == Calendar.DATE) - { - // Work arround since this is broke - calendar.set(TIME_SCALE[i], 1); - } - else if (TIME_SCALE[i] == Calendar.HOUR_OF_DAY) - { - // Work arround since this is broke - calendar.set(TIME_SCALE[i], 0); - } - else - { - calendar.clear(TIME_SCALE[i]); - } - } - if (TIME_SCALE[i] == smallestUnits) - { - removeOn = true; - } - } - return calendar; - } - /************************************************************************/ - public static Timestamp getStartOf(int unit, Date forDate) - { - GregorianCalendar calendar = new GregorianCalendar(); - calendar.setTime(forDate); - setSignificantDigit(calendar, unit); - return new Timestamp(calendar.getTimeInMillis()); - } - /************************************************************************/ - public static Timestamp getEndOf(int unit, Date forDate) - { - GregorianCalendar calendar = new GregorianCalendar(); - calendar.setTime(forDate); - setSignificantDigit(calendar, unit); - calendar.add(unit, 1); - calendar.add(Calendar.MILLISECOND, -1); - return new Timestamp(calendar.getTimeInMillis()); - } - /************************************************************************/ - public static boolean areSame(Date date1, Date date2, long accuracy) - { - return (compareDates(date1, date2) < accuracy); - } - /************************************************************************/ - /** - * - * @return 1 if date1 > date2, 0 if date1 = date2, -1 if date1 < date2 - **/ - public static int compareDates(Date date1, Date date2) - { - long l1 = ((date1 == null) ? 0 : date1.getTime()); - long l2 = ((date2 == null) ? 0 : date2.getTime()); - long diff = l1 - l2; - return (diff == 0) ? 0 : (int) (diff / Math.abs(diff)); - } - /************************************************************************/ - public static Date createTime(Date date) - { - Calendar time = new GregorianCalendar(); - time.setTime(date); - time.set(1970, 0, 1); - return time.getTime(); - } - /************************************************************************/ - /** - * Rolls back till that time on a 24 hour clock - **/ - public static Date rollTillHour(int hour, Date date) - { - Calendar rolled = new GregorianCalendar(); - rolled.setTime(date); - setSignificantDigit(rolled, Calendar.HOUR_OF_DAY); - while (rolled.get(Calendar.HOUR_OF_DAY) != hour) - { - rolled.add(Calendar.HOUR_OF_DAY, -1); - } - return rolled.getTime(); - } - /************************************************************************/ - public static void main(String args[]) - { - MySystem.variable("Calendar.DATE = " + Calendar.DATE); - MySystem.variable("Year", setSignificantDigit(new GregorianCalendar(), Calendar.YEAR).getTime()); - MySystem.variable("Month", setSignificantDigit(new GregorianCalendar(), Calendar.MONTH).getTime()); - MySystem.variable("Day", setSignificantDigit(new GregorianCalendar(), Calendar.DAY_OF_MONTH).getTime()); - MySystem.variable("Hour", setSignificantDigit(new GregorianCalendar(), Calendar.HOUR).getTime()); - MySystem.variable("Minute", setSignificantDigit(new GregorianCalendar(), Calendar.MINUTE).getTime()); - MySystem.variable("End Of Day", rollToEndOfDay(new Date()).getTime()); - } - /************************************************************************/ - public static GregorianCalendar rollToEndOfDay(Date date) - { - GregorianCalendar gregorianCalendar = new GregorianCalendar(); - gregorianCalendar.setTime(date); - gregorianCalendar.set(Calendar.HOUR_OF_DAY, 23); - gregorianCalendar.set(Calendar.MINUTE, 59); - gregorianCalendar.set(Calendar.SECOND, 59); - gregorianCalendar.set(Calendar.MILLISECOND, 999); - return gregorianCalendar; - } - /***********************************************************************/ - public static Timestamp asTimestamp(Date date) - { - return new Timestamp(date.getTime()); - } - /************************************************************************/ - public static boolean isToday(Date date) - { - return DateUtils.isSame(date, new Date(), Calendar.DATE); - } - /************************************************************************/ - public static Calendar asCalendar(Date date) - { - GregorianCalendar gregorianCalendar = new GregorianCalendar(); - gregorianCalendar.setTime(date); - return gregorianCalendar; - } - /************************************************************************/ - public static Timestamp getLastOrCurrent(int dayOfWeek) - { - return getDayOfWeek(dayOfWeek, false); - } - /************************************************************************/ - public static Timestamp getNextOrCurrent(int dayOfWeek) - { - return getDayOfWeek(dayOfWeek, true); - } - /************************************************************************/ - private static Timestamp getDayOfWeek(int dayOfWeek, boolean foward) throws Error - { - int multiplier = foward ? -1 : 1 ; - for (int i = 0; i < 7; i++) - { - Timestamp day = getStartOfXDaysAgo(i * multiplier); - if (asCalendar(day).get(Calendar.DAY_OF_WEEK) == dayOfWeek) { return day; } - } - throw new Error(String.format("didn't find a %s in the %s 7 days", dayOfWeek, foward ? "next":"last")); - } - /************************************************************************/ - /** - * @param date "yyyy/MM/dd" - */ - public static Timestamp parse(String date) - { - SimpleDateFormat format = new java.text.SimpleDateFormat("yyyy/MM/dd"); - try - { - return asTimestamp(format.parse(date)); - } - catch (ParseException e) - { - throw ObjectUtils.throwAsError(e); - } - } - /************************************************************************/ - /************************************************************************/ - - public static boolean doesDaylightSavingsTimeStartOn(String date) { - Timestamp day = parse(date); - TimeZone timeZone = GregorianCalendar.getInstance().getTimeZone(); - boolean inDaylightTime = timeZone.inDaylightTime(day); - Calendar tomorrow = asCalendar(day); - tomorrow.add(Calendar.DATE, 1); - Date time = tomorrow.getTime(); - return !inDaylightTime && timeZone.inDaylightTime(time); - } -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/parser/TemplateDate.java b/src/main/java/com/spun/util/parser/TemplateDate.java index 8e3c5c3..18c9013 100644 --- a/src/main/java/com/spun/util/parser/TemplateDate.java +++ b/src/main/java/com/spun/util/parser/TemplateDate.java @@ -7,7 +7,7 @@ import java.util.GregorianCalendar; import java.util.TimeZone; import org.teachingkidsprogramming.util.DateDifference; -import com.spun.util.DateUtils; +import org.teachingkidsprogramming.util.DateUtils; import com.spun.util.StringUtils; public class TemplateDate diff --git a/src/main/java/com/spun/util/velocity/ParserDateUtils.java b/src/main/java/com/spun/util/velocity/ParserDateUtils.java index 4b66e71..f2266d2 100644 --- a/src/main/java/com/spun/util/velocity/ParserDateUtils.java +++ b/src/main/java/com/spun/util/velocity/ParserDateUtils.java @@ -1,7 +1,7 @@ package com.spun.util.velocity; import java.util.Calendar; -import com.spun.util.DateUtils; +import org.teachingkidsprogramming.util.DateUtils; import com.spun.util.StringUtils; /***********************************************************************/ diff --git a/src/main/java/org/teachingkidsprogramming/util/DateUtils.java b/src/main/java/org/teachingkidsprogramming/util/DateUtils.java new file mode 100644 index 0000000..4b1665c --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/util/DateUtils.java @@ -0,0 +1,137 @@ +package org.teachingkidsprogramming.util; + +import com.spun.util.MySystem; +import com.spun.util.ObjectUtils; + +import java.sql.Timestamp; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; + +/** + * A static class of convenience functions for database access + **/ +public class DateUtils +{ + private static int TIME_SCALE[] = {Calendar.YEAR, + Calendar.MONTH, + Calendar.DATE, + Calendar.HOUR_OF_DAY, + Calendar.HOUR, + Calendar.MINUTE, + Calendar.SECOND, + Calendar.MILLISECOND }; + public static boolean isSame(Date firstDate, Date secondDate, int smallestUnits) + { + if ((firstDate == null) || (secondDate == null)) { return (firstDate == secondDate); } + return isSame(firstDate.getTime(), secondDate.getTime(), smallestUnits); + } + public static boolean isSame(long firstDate, long secondDate, int smallestUnits) + { + if (!ArrayUtils.contains(TIME_SCALE, smallestUnits)) { throw new Error("Invalid Timescale " + smallestUnits); } + GregorianCalendar first = new GregorianCalendar(); + first.setTime(new Date(firstDate)); + setSignificantDigit(first, smallestUnits); + GregorianCalendar second = new GregorianCalendar(); + second.setTime(new Date(secondDate)); + setSignificantDigit(second, smallestUnits); + return (first.getTime().getTime() == second.getTime().getTime()); + } + + /************************************************************************/ + public static Timestamp getStartOfXDaysAgo(int numberOfDays) + { + return getStartOfXDaysAgo(numberOfDays, new Date()); + } + /************************************************************************/ + public static Timestamp getStartOfXDaysAgo(int numberOfDays, Date startingFrom) + { + GregorianCalendar gregorianCalendar = new GregorianCalendar(); + gregorianCalendar.setTime(startingFrom); + DateUtils.setSignificantDigit(gregorianCalendar, Calendar.DATE); + gregorianCalendar.add(Calendar.DATE, -numberOfDays); + return new Timestamp(gregorianCalendar.getTime().getTime()); + } + + /************************************************************************/ + public static Calendar setSignificantDigit(Calendar calendar, int smallestUnits) + { + boolean removeOn = false; + for (int i : TIME_SCALE) { + if (removeOn) { + if (i == Calendar.DATE) { + // Work around since this is broke + calendar.set(i, 1); + } else if (i == Calendar.HOUR_OF_DAY) { + // Work around since this is broke + calendar.set(i, 0); + } else { + calendar.clear(i); + } + } + if (i == smallestUnits) { + removeOn = true; + } + } + return calendar; + } + + public static void main(String args[]) + { + MySystem.variable("Calendar.DATE = " + Calendar.DATE); + MySystem.variable("Year", setSignificantDigit(new GregorianCalendar(), Calendar.YEAR).getTime()); + MySystem.variable("Month", setSignificantDigit(new GregorianCalendar(), Calendar.MONTH).getTime()); + MySystem.variable("Day", setSignificantDigit(new GregorianCalendar(), Calendar.DAY_OF_MONTH).getTime()); + MySystem.variable("Hour", setSignificantDigit(new GregorianCalendar(), Calendar.HOUR).getTime()); + MySystem.variable("Minute", setSignificantDigit(new GregorianCalendar(), Calendar.MINUTE).getTime()); + MySystem.variable("End Of Day", rollToEndOfDay(new Date()).getTime()); + } + /************************************************************************/ + public static GregorianCalendar rollToEndOfDay(Date date) + { + GregorianCalendar gregorianCalendar = new GregorianCalendar(); + gregorianCalendar.setTime(date); + gregorianCalendar.set(Calendar.HOUR_OF_DAY, 23); + gregorianCalendar.set(Calendar.MINUTE, 59); + gregorianCalendar.set(Calendar.SECOND, 59); + gregorianCalendar.set(Calendar.MILLISECOND, 999); + return gregorianCalendar; + } + /***********************************************************************/ + public static Timestamp asTimestamp(Date date) + { + return new Timestamp(date.getTime()); + } + /************************************************************************/ + public static boolean isToday(Date date) + { + return DateUtils.isSame(date, new Date(), Calendar.DATE); + } + /************************************************************************/ + public static Calendar asCalendar(Date date) + { + GregorianCalendar gregorianCalendar = new GregorianCalendar(); + gregorianCalendar.setTime(date); + return gregorianCalendar; + } + + /************************************************************************/ + /** + * @param date "yyyy/MM/dd" + */ + public static Timestamp parse(String date) + { + SimpleDateFormat format = new java.text.SimpleDateFormat("yyyy/MM/dd"); + try + { + return asTimestamp(format.parse(date)); + } + catch (ParseException e) + { + throw ObjectUtils.throwAsError(e); + } + } + /************************************************************************/ +} \ No newline at end of file From 10ae8f5d9ecdbbf667151bd214d1cd265aff56ac Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Tue, 17 Mar 2015 09:31:43 -0700 Subject: [PATCH 029/111] clean move DualOutputStream --- .../java/com/spun/util/DualOutputStream.java | 98 ------------------- src/main/java/com/spun/util/MySystem.java | 1 + .../util/DualOutputStream.java | 95 ++++++++++++++++++ 3 files changed, 96 insertions(+), 98 deletions(-) delete mode 100644 src/main/java/com/spun/util/DualOutputStream.java create mode 100644 src/main/java/org/teachingkidsprogramming/util/DualOutputStream.java diff --git a/src/main/java/com/spun/util/DualOutputStream.java b/src/main/java/com/spun/util/DualOutputStream.java deleted file mode 100644 index f254e91..0000000 --- a/src/main/java/com/spun/util/DualOutputStream.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.spun.util; - -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.io.PrintStream; - -public class DualOutputStream extends OutputStream -{ - private FileOutputStream o; - private PrintStream display = System.out; - /************************************************************************/ - public DualOutputStream() - { - super(); - } - /************************************************************************/ - public void setOutputStream(String outfile) throws SecurityException, Exception - { - try - { - o = new FileOutputStream(outfile); - display.println("output being redirected to: " + outfile); - } - catch (Exception e) - { - throw ObjectUtils.throwAsError(e); - } - } - /************************************************************************/ - public void write(int b) throws IOException - { - try - { - o.write(b); - } - catch (Exception e) - { - throw ObjectUtils.throwAsError(e); - } - display.write(b); - } - /************************************************************************/ - public void write(byte b[]) throws IOException - { - try - { - o.write(b); - } - catch (Exception e) - { - throw ObjectUtils.throwAsError(e); - } - display.println(b); - flush(); - } - /************************************************************************/ - public void write(byte b[], int off, int len) throws IOException - { - try - { - o.write(b, off, len); - } - catch (Exception e) - { - throw ObjectUtils.throwAsError(e); - } - display.write(b, off, len); - } - /************************************************************************/ - public void flush() throws IOException - { - try - { - o.flush(); - } - catch (Exception e) - { - throw ObjectUtils.throwAsError(e); - } - display.flush(); - } - /************************************************************************/ - public void close() throws IOException - { - try - { - o.close(); - } - catch (Exception e) - { - throw ObjectUtils.throwAsError(e); - } - display.close(); - } - /************************************************************************/ - /************************************************************************/ -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/MySystem.java b/src/main/java/com/spun/util/MySystem.java index 1e462ec..30ac26c 100644 --- a/src/main/java/com/spun/util/MySystem.java +++ b/src/main/java/com/spun/util/MySystem.java @@ -1,6 +1,7 @@ package com.spun.util; import org.teachingkidsprogramming.util.DateDifference; +import org.teachingkidsprogramming.util.DualOutputStream; import java.io.PrintWriter; import java.util.Vector; diff --git a/src/main/java/org/teachingkidsprogramming/util/DualOutputStream.java b/src/main/java/org/teachingkidsprogramming/util/DualOutputStream.java new file mode 100644 index 0000000..0aaa267 --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/util/DualOutputStream.java @@ -0,0 +1,95 @@ +package org.teachingkidsprogramming.util; + +import com.spun.util.ObjectUtils; + +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.io.PrintStream; + +public class DualOutputStream extends OutputStream { + private FileOutputStream o; + private PrintStream display = System.out; + + /** + * ******************************************************************** + */ + public DualOutputStream() { + super(); + } + + /** + * ******************************************************************** + */ + public void setOutputStream(String outfile) throws Exception { + try { + o = new FileOutputStream(outfile); + display.println("output being redirected to: " + outfile); + } catch (Exception e) { + throw ObjectUtils.throwAsError(e); + } + } + + /** + * ******************************************************************** + */ + public void write(int b) throws IOException { + try { + o.write(b); + } catch (Exception e) { + throw ObjectUtils.throwAsError(e); + } + display.write(b); + } + + /** + * ******************************************************************** + */ + public void write(byte b[]) throws IOException { + try { + o.write(b); + } catch (Exception e) { + throw ObjectUtils.throwAsError(e); + } + display.println(b + ""); + flush(); + } + + /** + * ******************************************************************** + */ + public void write(byte b[], int off, int len) throws IOException { + try { + o.write(b, off, len); + } catch (Exception e) { + throw ObjectUtils.throwAsError(e); + } + display.write(b, off, len); + } + + /** + * ******************************************************************** + */ + public void flush() throws IOException { + try { + o.flush(); + } catch (Exception e) { + throw ObjectUtils.throwAsError(e); + } + display.flush(); + } + + /** + * ******************************************************************** + */ + public void close() throws IOException { + try { + o.close(); + } catch (Exception e) { + throw ObjectUtils.throwAsError(e); + } + display.close(); + } + /************************************************************************/ + /************************************************************************/ +} \ No newline at end of file From 234a588b5f97678c231d9951b4d43f3c0df33bd0 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Tue, 17 Mar 2015 09:32:30 -0700 Subject: [PATCH 030/111] clean, move FormattedException --- src/main/java/com/spun/util/FormattedException.java | 12 ------------ .../section09exceptions/DeepDive09exceptions.java | 2 +- .../org/teachingkidsprogramming/util/ClassUtils.java | 1 - .../util/FormattedException.java | 12 ++++++++++++ 4 files changed, 13 insertions(+), 14 deletions(-) delete mode 100644 src/main/java/com/spun/util/FormattedException.java create mode 100644 src/main/java/org/teachingkidsprogramming/util/FormattedException.java diff --git a/src/main/java/com/spun/util/FormattedException.java b/src/main/java/com/spun/util/FormattedException.java deleted file mode 100644 index 1404b56..0000000 --- a/src/main/java/com/spun/util/FormattedException.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.spun.util; - - -public class FormattedException extends RuntimeException -{ - - public FormattedException(String string, Object... params) - { - super(String.format(string, params)); - MySystem.variable(this.getMessage()); - } -} diff --git a/src/main/java/org/teachingkidsprogramming/section09exceptions/DeepDive09exceptions.java b/src/main/java/org/teachingkidsprogramming/section09exceptions/DeepDive09exceptions.java index e6c6db5..1cd09e4 100644 --- a/src/main/java/org/teachingkidsprogramming/section09exceptions/DeepDive09exceptions.java +++ b/src/main/java/org/teachingkidsprogramming/section09exceptions/DeepDive09exceptions.java @@ -4,7 +4,7 @@ import org.junit.Ignore; import org.junit.Test; -import com.spun.util.FormattedException; +import org.teachingkidsprogramming.util.FormattedException; @Ignore public class DeepDive09exceptions diff --git a/src/main/java/org/teachingkidsprogramming/util/ClassUtils.java b/src/main/java/org/teachingkidsprogramming/util/ClassUtils.java index f10db19..2f6c548 100644 --- a/src/main/java/org/teachingkidsprogramming/util/ClassUtils.java +++ b/src/main/java/org/teachingkidsprogramming/util/ClassUtils.java @@ -1,6 +1,5 @@ package org.teachingkidsprogramming.util; -import com.spun.util.FormattedException; import com.spun.util.ObjectUtils; import com.spun.util.SearchingFileFilter; diff --git a/src/main/java/org/teachingkidsprogramming/util/FormattedException.java b/src/main/java/org/teachingkidsprogramming/util/FormattedException.java new file mode 100644 index 0000000..133cff7 --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/util/FormattedException.java @@ -0,0 +1,12 @@ +package org.teachingkidsprogramming.util; + + +import com.spun.util.MySystem; + +public class FormattedException extends RuntimeException { + + public FormattedException(String string, Object... params) { + super(String.format(string, params)); + MySystem.variable(this.getMessage()); + } +} From d843810aa9aaa2afa83e9f59d75f8863b43300e0 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Tue, 17 Mar 2015 09:33:23 -0700 Subject: [PATCH 031/111] clean, move FrameCloser --- src/main/java/com/spun/util/FrameCloser.java | 16 ---------------- src/main/java/com/spun/util/WindowUtils.java | 2 ++ .../windows/ProgramWindow.java | 2 +- .../util/FrameCloser.java | 18 ++++++++++++++++++ 4 files changed, 21 insertions(+), 17 deletions(-) delete mode 100644 src/main/java/com/spun/util/FrameCloser.java create mode 100644 src/main/java/org/teachingkidsprogramming/util/FrameCloser.java diff --git a/src/main/java/com/spun/util/FrameCloser.java b/src/main/java/com/spun/util/FrameCloser.java deleted file mode 100644 index 83caed7..0000000 --- a/src/main/java/com/spun/util/FrameCloser.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.spun.util; - -public class FrameCloser extends java.awt.event.WindowAdapter -{ - /***********************************************************************/ - public void windowClosing(java.awt.event.WindowEvent e) - { - e.getWindow().dispose(); - } - /***********************************************************************/ - public void windowClosed(java.awt.event.WindowEvent e) - { - System.exit(0); - } - /***********************************************************************/ -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/WindowUtils.java b/src/main/java/com/spun/util/WindowUtils.java index 499e84e..588ab69 100644 --- a/src/main/java/com/spun/util/WindowUtils.java +++ b/src/main/java/com/spun/util/WindowUtils.java @@ -1,5 +1,7 @@ package com.spun.util; +import org.teachingkidsprogramming.util.FrameCloser; + import java.awt.Dimension; import java.awt.event.WindowAdapter; diff --git a/src/main/java/org/teachingextensions/windows/ProgramWindow.java b/src/main/java/org/teachingextensions/windows/ProgramWindow.java index 4aeb8c5..c660dab 100644 --- a/src/main/java/org/teachingextensions/windows/ProgramWindow.java +++ b/src/main/java/org/teachingextensions/windows/ProgramWindow.java @@ -14,7 +14,7 @@ import org.teachingextensions.logo.PenColors; import org.teachingextensions.logo.VirtualProctorWeb; -import com.spun.util.FrameCloser; +import org.teachingkidsprogramming.util.FrameCloser; import com.spun.util.WindowUtils; /** diff --git a/src/main/java/org/teachingkidsprogramming/util/FrameCloser.java b/src/main/java/org/teachingkidsprogramming/util/FrameCloser.java new file mode 100644 index 0000000..96a7141 --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/util/FrameCloser.java @@ -0,0 +1,18 @@ +package org.teachingkidsprogramming.util; + +public class FrameCloser extends java.awt.event.WindowAdapter { + /** + * ******************************************************************* + */ + public void windowClosing(java.awt.event.WindowEvent e) { + e.getWindow().dispose(); + } + + /** + * ******************************************************************* + */ + public void windowClosed(java.awt.event.WindowEvent e) { + System.exit(0); + } + /***********************************************************************/ +} \ No newline at end of file From de17c94348bbdeac0959d92efb110d4573924b8c Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Tue, 17 Mar 2015 09:34:22 -0700 Subject: [PATCH 032/111] clean, move LambdaThreadLauncher --- .../com/spun/util/LambdaThreadLauncher.java | 27 ------------------- .../java/com/spun/util/ThreadLauncher.java | 1 + .../util/LambdaThreadLauncher.java | 24 +++++++++++++++++ 3 files changed, 25 insertions(+), 27 deletions(-) delete mode 100644 src/main/java/com/spun/util/LambdaThreadLauncher.java create mode 100644 src/main/java/org/teachingkidsprogramming/util/LambdaThreadLauncher.java diff --git a/src/main/java/com/spun/util/LambdaThreadLauncher.java b/src/main/java/com/spun/util/LambdaThreadLauncher.java deleted file mode 100644 index 420eff0..0000000 --- a/src/main/java/com/spun/util/LambdaThreadLauncher.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.spun.util; - -import org.lambda.actions.Action0; - -public class LambdaThreadLauncher implements Runnable -{ - private final Action0 function; - private long delay = 0; - public LambdaThreadLauncher(Action0 function) - { - this.function = function; - new Thread(this).start(); - } - @Override - public void run() - { - try - { - Thread.sleep(delay); - function.call(); - } - catch (Throwable t) - { - MySystem.warning("Caught throwable exception ", t); - } - } -} diff --git a/src/main/java/com/spun/util/ThreadLauncher.java b/src/main/java/com/spun/util/ThreadLauncher.java index 2528363..3825a94 100644 --- a/src/main/java/com/spun/util/ThreadLauncher.java +++ b/src/main/java/com/spun/util/ThreadLauncher.java @@ -3,6 +3,7 @@ import java.lang.reflect.Method; import org.lambda.actions.Action0; +import org.teachingkidsprogramming.util.LambdaThreadLauncher; public class ThreadLauncher implements Runnable { diff --git a/src/main/java/org/teachingkidsprogramming/util/LambdaThreadLauncher.java b/src/main/java/org/teachingkidsprogramming/util/LambdaThreadLauncher.java new file mode 100644 index 0000000..704bf1f --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/util/LambdaThreadLauncher.java @@ -0,0 +1,24 @@ +package org.teachingkidsprogramming.util; + +import com.spun.util.MySystem; +import org.lambda.actions.Action0; + +public class LambdaThreadLauncher implements Runnable { + private final Action0 function; + private long delay = 0; + + public LambdaThreadLauncher(Action0 function) { + this.function = function; + new Thread(this).start(); + } + + @Override + public void run() { + try { + Thread.sleep(delay); + function.call(); + } catch (Throwable t) { + MySystem.warning("Caught throwable exception ", t); + } + } +} From dedff897271bf4fc6057516c6af56999bb5f90e0 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Tue, 17 Mar 2015 09:37:13 -0700 Subject: [PATCH 033/111] clean, move MethodExecutionPath --- src/main/java/com/spun/util/Memory.java | 44 ------------------- src/main/java/com/spun/util/NumberUtils.java | 2 + .../util/MethodExecutionPath.java | 3 +- 3 files changed, 4 insertions(+), 45 deletions(-) delete mode 100644 src/main/java/com/spun/util/Memory.java rename src/main/java/{com/spun => org/teachingkidsprogramming}/util/MethodExecutionPath.java (95%) diff --git a/src/main/java/com/spun/util/Memory.java b/src/main/java/com/spun/util/Memory.java deleted file mode 100644 index 863ff7a..0000000 --- a/src/main/java/com/spun/util/Memory.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.spun.util; - - -/** - * A Simple class looking at memory. - * @author Llewellyn - * @version 1.0 - **/ -public class Memory -{ - private long freeMemory = 0; - private long totalMemory = 0; - private long usedMemory = 0; - private java.text.NumberFormat format = java.text.NumberFormat.getNumberInstance(); - /************************************************************************/ - /** - * Dumps the current memory status [total, used, free]. - * This forces garbage collection to run first. - **/ - public Memory() - { - System.gc(); - freeMemory = Runtime.getRuntime().freeMemory(); - totalMemory = Runtime.getRuntime().totalMemory(); - usedMemory = totalMemory - freeMemory; - } - /************************************************************************/ - public String getUsedMemory() - { - return format.format(((double) usedMemory) / 1000000); - } - /************************************************************************/ - public String getFreeMemory() - { - return format.format(((double) freeMemory) / 1000000); - } - /************************************************************************/ - public String getTotalMemory() - { - return format.format(((double) totalMemory) / 1000000); - } - /***********************************************************************/ - /***********************************************************************/ -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/NumberUtils.java b/src/main/java/com/spun/util/NumberUtils.java index 08d5467..cfea307 100644 --- a/src/main/java/com/spun/util/NumberUtils.java +++ b/src/main/java/com/spun/util/NumberUtils.java @@ -1,5 +1,7 @@ package com.spun.util; +import org.teachingkidsprogramming.util.MethodExecutionPath; + import java.lang.reflect.Method; import java.util.Random; diff --git a/src/main/java/com/spun/util/MethodExecutionPath.java b/src/main/java/org/teachingkidsprogramming/util/MethodExecutionPath.java similarity index 95% rename from src/main/java/com/spun/util/MethodExecutionPath.java rename to src/main/java/org/teachingkidsprogramming/util/MethodExecutionPath.java index 19e5006..6652a2b 100644 --- a/src/main/java/com/spun/util/MethodExecutionPath.java +++ b/src/main/java/org/teachingkidsprogramming/util/MethodExecutionPath.java @@ -1,8 +1,9 @@ -package com.spun.util; +package org.teachingkidsprogramming.util; import java.io.Serializable; import java.lang.reflect.Method; +import com.spun.util.ObjectUtils; import com.spun.util.filters.Filter; import com.spun.util.filters.FilterUtils; From 09a07e2d2211234b4ab1455d67c1516624968a54 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Tue, 17 Mar 2015 09:47:36 -0700 Subject: [PATCH 034/111] clean, move MySystem --- src/main/java/com/spun/util/MySystem.java | 527 ------------------ src/main/java/com/spun/util/ObjectUtils.java | 1 + src/main/java/com/spun/util/PrintUtils.java | 2 + .../java/com/spun/util/ThreadLauncher.java | 1 + src/main/java/com/spun/util/TimedObject.java | 2 + .../com/spun/util/WhiteSpaceStripper.java | 67 +-- src/main/java/com/spun/util/WindowUtils.java | 1 + .../io/InternetConnectivityException.java | 2 +- src/main/java/com/spun/util/io/NetUtils.java | 2 +- .../spun/util/io/SpaceDelimitedReader.java | 2 +- .../com/spun/util/servlets/ErrorToString.java | 2 +- .../spun/util/servlets/InvokerServlet.java | 2 +- .../logo/VirtualProctorFileSystem.java | 2 +- .../logo/VirtualProctorWeb.java | 2 +- .../util/DateUtils.java | 1 - .../util/FormattedException.java | 2 - .../util/LambdaThreadLauncher.java | 1 - .../util/MySystem.java | 348 ++++++++++++ 18 files changed, 373 insertions(+), 594 deletions(-) delete mode 100644 src/main/java/com/spun/util/MySystem.java create mode 100644 src/main/java/org/teachingkidsprogramming/util/MySystem.java diff --git a/src/main/java/com/spun/util/MySystem.java b/src/main/java/com/spun/util/MySystem.java deleted file mode 100644 index 30ac26c..0000000 --- a/src/main/java/com/spun/util/MySystem.java +++ /dev/null @@ -1,527 +0,0 @@ -package com.spun.util; - -import org.teachingkidsprogramming.util.DateDifference; -import org.teachingkidsprogramming.util.DualOutputStream; - -import java.io.PrintWriter; -import java.util.Vector; - -/** - * A class for printing comments in a standardized format. - * @author Llewellyn - * @version 2.0 - **/ -public class MySystem -{ - public static boolean USE_LOG_FILE = false; - public static final String CLIENT_OUTPUT_FILE = "logs\\CCS_ClientLog.txt"; - public static final String SERVER_OUTPUT_FILE = "logs\\ServerLog.txt"; - public static final String LOGGER_OUTPUT_FILE = "logs\\Logger.txt"; - public static final String SERVLET_OUTPUT_FILE = "logs\\ServletLog.txt"; - public static String ROOT_DIR = "C:\\temp\\"; - public static final int IN = 1; - public static final int OUT = -1; - private static boolean useStackTraceInspection = true; - public static boolean marker = true; - public static boolean event = true; - public static boolean variable = true; - public static boolean query = true; - public static int hourGlass = 0; - public static int hourGlassWrap = 100; - private static int m_indent = 0; - private static long lastTime = System.currentTimeMillis(); - private static DualOutputStream cos; - private static String logFileUsed = null; - private static PrintWriter SYSTEM_OUT_WRITER = new PrintWriter(System.out, true); - /***********************************************************************/ - public static void toggleAll(boolean t) - { - marker = t; - event = t; - variable = t; - query = t; - } - /***********************************************************************/ - private static void clearHourGlass() - { - if (hourGlass > 0) - { - System.out.println(""); - hourGlass = 0; - } - } - /***********************************************************************/ - public static void setHourGlassWrap(int numberOfDots) - { - hourGlassWrap = numberOfDots; - } - /***********************************************************************/ - public static void hourGlass() - { - if (hourGlass >= hourGlassWrap) - { - clearHourGlass(); - } - hourGlass++; - if ((hourGlass % 10) == 0) - { - System.out.print(hourGlass / 10); - } - else - { - System.out.print("."); - } - } - /***********************************************************************/ - public static long startTimer() - { - return System.currentTimeMillis(); - } - /***********************************************************************/ - public static void stopTimer(long startTime, long maxTime, String function) - { - long diff = (System.currentTimeMillis() - startTime); - if (diff > maxTime) - { - MySystem.warning("Time Limit Exceeded - " + function + " [" - + new DateDifference(diff).getStandardTimeText(2) + " > " + maxTime + "]"); - } - } - /***********************************************************************/ - /** - * Sets output to a file. - * @param file The name of the file. - **/ - public synchronized static void useOutputFile(String file, boolean addDateStamp) - { - if (!USE_LOG_FILE || (logFileUsed != null) || (file == null)) { return; } - try - { - if (addDateStamp) - { - int seperator = file.lastIndexOf('.'); - if (seperator != 0) - { - file = file.substring(0, seperator) + "[" + System.currentTimeMillis() + "]" + file.substring(seperator); - } - else - { - file += System.currentTimeMillis(); - } - } - cos = new DualOutputStream(); - cos.setOutputStream(file); - java.io.PrintStream p = new java.io.PrintStream(cos); - logFileUsed = file; - System.setErr(p); - System.setOut(p); - } - catch (SecurityException e) - {} - catch (Exception e) - {} - } - /***********************************************************************/ - /** - * Sets output to a file. - * @param file The name of the file. - **/ - public synchronized static void useOutputFile(String file) - { - useOutputFile(file, false); - } - /***********************************************************************/ - /** - * Closes the Output File. - **/ - public synchronized static void closeOutputFile() - { - if (logFileUsed == null) { return; } - try - { - cos.close(); - } - catch (Exception e) - {} - } - /***********************************************************************/ - /** - * Prints to screen the marker specifying function entered. - **/ - public synchronized static void markerOut() - { - markerOut(null); - } - /***********************************************************************/ - /** - * Prints to screen the marker specifying function entered. - **/ - public synchronized static void markerIn() - { - markerIn(null); - } - /***********************************************************************/ - /** - * Prints to screen the marker specifying function entered. - * @param statement The statement to print - **/ - public synchronized static void markerIn(String statement) - { - if (!marker) { return; } - if (useStackTraceInspection) - { - System.out.println(timeStamp() + "**** " + extractMarkerText() + " - IN"); - } - else - { - System.out.println(timeStamp() + "**** " + statement + " - IN"); - } - m_indent++; - } - /***********************************************************************/ - private static String extractMarkerText() - { - try - { - StackTraceElement trace[] = new Error().getStackTrace(); - StackTraceElement element = trace[3]; - String text = element.getMethodName(); - String className = element.getClassName(); - className = className.substring(className.lastIndexOf(".") + 1); - text += "(" + className + ":" + element.getLineNumber() + ")"; - return text; - } - catch (Throwable t) - { - useStackTraceInspection = false; - return "Can't Inspect Stack Trace"; - } - } - /***********************************************************************/ - private static String getIndent() - { - String theIndention = ""; - for (int i = 0; i < m_indent; i++) - { - theIndention += " "; - } - return theIndention; - } - /***********************************************************************/ - private static String timeStamp() - { - clearHourGlass(); - String text = ""; - long current = System.currentTimeMillis(); - java.text.DateFormat df = java.text.DateFormat.getDateTimeInstance(); - text = "[" + df.format(new java.util.Date(current)) + " ~" + padNumber(current - lastTime) + "ms]" - + getIndent(); - lastTime = current; - return text; - } - /***********************************************************************/ - private static String padNumber(long number) - { - String text = "" + number; - while (text.length() < 6) - { - text = "0" + text; - } - return text; - } - /***********************************************************************/ - private static String indentMessage(String message) - { - Vector v = new Vector(); - int place = 0; - while ((place = message.indexOf('\n', place + 1)) != -1) - { - v.addElement(place); - } - if (v.size() == 0) - { - // no '\n' - return message; - } - String theIndention = getIndent(); - StringBuffer buffer = new StringBuffer(message); - for (int i = (v.size() - 1); i >= 0; i--) - { - int tempplace = ((Integer) v.elementAt(i)).intValue(); - buffer.insert(tempplace + 1, theIndention); - } - return buffer.toString(); - } - /***********************************************************************/ - /** - * Prints to screen the marker specifying function exited. - * @param Statement The statement to print - **/ - public synchronized static void markerOut(String Statement) - { - if (!marker) { return; } - m_indent--; - System.out.println(timeStamp() + "**** " + extractMarkerText() + " - OUT"); - } - /***********************************************************************/ - /** - * Prints to screen any variable information to be viewed. - * @param sqlQuery The SQL query to print - **/ - public synchronized static void query(String sqlQuery) - { - if (!query) { return; } - System.out.println(timeStamp() + "~~> SQL - " + sqlQuery); - } - /***********************************************************************/ - /** - * Prints to screen any variable information to be viewed. - * @param queryName The name of the query - * @param sqlQuery The query to print - **/ - public synchronized static void query(String queryName, Object sqlQuery) - { - if (!query) { return; } - System.out.println(timeStamp() + "~~> SQL [" + queryName + "] - " + sqlQuery); - } - /***********************************************************************/ - /** - * Prints to screen any variable information to be viewed. - * @param statement The statement to print - **/ - public synchronized static void variable(String statement) - { - variable(statement, SYSTEM_OUT_WRITER); - } - /***********************************************************************/ - public static void variableFormated(String string, Object... parameters) - { - variable(String.format(string, parameters)); - } - /***********************************************************************/ - public synchronized static void variable(String statement, PrintWriter out) - { - if (!variable) { return; } - out.println(timeStamp() + "*=>" + statement); - } - /***********************************************************************/ - /** - * Prints to screen any variable information to be viewed. - * @param name The value's name - * @param value The value to print - **/ - public synchronized static void variable(String name, Object value) - { - if (!variable) { return; } - System.out.println(timeStamp() + "*=> " + name + " = '" + (value == null ? null : value.toString()) + "'"); - } - /***********************************************************************/ - /** - * Prints to screen any variable information to be viewed. - * @param name The name of the array - * @param array The collection of objects to print - **/ - public synchronized static void variable(String name, Object array[]) - { - if (!variable) { return; } - name = (name == null ? "array" : name); - if (array == null || array.length == 0) - { - System.out.println(timeStamp() + "*=> " + name + ".length = 0"); - } - else - { - for (int i = 0; i < array.length; i++) - { - System.out.println(timeStamp() + "*=> " + name + "[" + i + "] = " - + ((array[i] == null) ? "null" : array[i].toString())); - } - } - } - /***********************************************************************/ - /** - * Prints to screen any variable information to be viewed. - * @param array A collection of objects to print - **/ - public synchronized static void variable(Object array[]) - { - variable(null, array); - } - /***********************************************************************/ - /** - * Prints to screen any messages to be viewed. - * @param Statement The statement to print - **/ - public synchronized static void message(String Statement) - { - System.out.println(timeStamp() + indentMessage(Statement)); - } - /***********************************************************************/ - /** - * Prints to screen any events to be viewed. - * @param Statement The statement to print - **/ - public static void event(String Statement) - { - if (!event) { return; } - System.out.println(timeStamp() + "*--" + Statement); - } - /***********************************************************************/ - /** - * Prints to screen any warnings to be viewed. - * @param statement The statement to print - **/ - public synchronized static void warning(String statement) - { - warning(statement, null); - } - /***********************************************************************/ - /** - * Prints to screen any warnings to be viewed. - * @param throwable The throwable to print - **/ - public synchronized static void warning(Throwable throwable) - { - warning(null, throwable); - } - /***********************************************************************/ - /** - * Prints to screen any warnings to be viewed. - * @param statement The statement to print - * @param throwable A throwable instance with error information - **/ - public synchronized static void warning(String statement, Throwable throwable) - { - warning(statement, throwable, null); - } - public synchronized static void warning(String statement, Throwable throwable, PrintWriter out) - { - clearHourGlass(); - dualPrintln("******************************************************************************************", out); - dualPrintln(timeStamp(), out); - if (statement != null) - { - dualPrintln(statement, out); - } - printFullTrace(throwable, false, out); - if (throwable instanceof OutOfMemoryError) - { - dumpMemory(out); - } - dualPrintln("******************************************************************************************", out); - if ((throwable instanceof Error) || (throwable instanceof RuntimeException)) - { - //mailLog("pschaefer@atsgroup.com;lfalco@atsgroup.com","TESTING ERROR","TESTING ERROR","TESTING ERROR","csem03"); - } - } - /***********************************************************************/ - private static void dualPrintln(String string, PrintWriter out) - { - System.out.println(string); - if (out != null) - { - out.println(string); - } - } - /***********************************************************************/ - private static void printFullTrace(Throwable throwable, boolean causedBy) - { - printFullTrace(throwable, causedBy, SYSTEM_OUT_WRITER); - } - /***********************************************************************/ - private static void printFullTrace(Throwable throwable, boolean causedBy, PrintWriter out) - { - if (throwable != null) - { - dualPrintln((causedBy ? "Caused by : " : "") + throwable.getMessage(), out); - throwable.printStackTrace(); - if (out != null) - { - throwable.printStackTrace(out); - } - if (throwable.getCause() != null) - { - printFullTrace(throwable.getCause(), true, out); - } - } - } - /***********************************************************************/ - /** - * The log file being used, null if not being used. - * @return log file being used. - **/ - public static String getLogFileUsed() - { - return logFileUsed; - } - /************************************************************************/ - /** - * Returns all the Thread output of a group as a string. - * @return A List of The thread, and if it is alive and/or interrupted. - **/ - public static String dumpAllThreadsInGroup(ThreadGroup tg) - { - Thread[] threads = new Thread[tg.activeCount()]; - tg.enumerate(threads); - StringBuffer s = new StringBuffer("Active Thread Dump\n"); - for (int x = 0; x < threads.length; x++) - { - if (threads[x] != null) - { - s.append("thread=" + threads[x] + ", isAlive=" + threads[x].isAlive() + ", isInterrupted=" - + threads[x].isInterrupted() + "\n"); - } - } - return s.toString(); - } - /************************************************************************/ - /** - * Dumps the current memory status [total, used, free]. - * This forces garbage collection to run first. - **/ - public static void dumpMemory() - { - dumpMemory(SYSTEM_OUT_WRITER); - } - /************************************************************************/ - public static void dumpMemory(PrintWriter out) - { - System.gc(); - java.text.NumberFormat format = java.text.NumberFormat.getNumberInstance(); - long freeMemory = Runtime.getRuntime().freeMemory(); - long totalMemory = Runtime.getRuntime().totalMemory(); - long usedMemory = totalMemory - freeMemory; - String statement = "Memory [total, used, free] = [" + format.format(totalMemory) + " , " - + format.format(usedMemory) + " , " + format.format(freeMemory) + "]"; - variable(statement, out); - } - /************************************************************************/ - /** - * Dumps the current thread status for ALL groups. - * @see MySystem#dumpAllThreadsInGroup(ThreadGroup) dumpAllThreadsInGroup - **/ - public static String dumpAllThreads() - { - ThreadGroup place = Thread.currentThread().getThreadGroup(); - while (place.getParent() != null) - { - place = place.getParent(); - } - //place.list(); - return dumpAllThreadsInGroup(place); - } - /***********************************************************************/ - public static String getStringArrayToString(String array[]) - { - StringBuffer buffer = new StringBuffer("["); - for (int i = 0; i < array.length; i++) - { - buffer.append("\"" + array[i] + "\"\n"); - } - buffer.delete(buffer.length() - 3, buffer.length()); - buffer.append("]"); - return buffer.toString(); - } - /***********************************************************************/ - /***********************************************************************/ -} diff --git a/src/main/java/com/spun/util/ObjectUtils.java b/src/main/java/com/spun/util/ObjectUtils.java index e40ace8..7518a1a 100644 --- a/src/main/java/com/spun/util/ObjectUtils.java +++ b/src/main/java/com/spun/util/ObjectUtils.java @@ -2,6 +2,7 @@ import org.teachingkidsprogramming.util.ArrayUtils; import org.teachingkidsprogramming.util.ClassUtils; +import org.teachingkidsprogramming.util.MySystem; import java.lang.reflect.Array; import java.lang.reflect.Method; diff --git a/src/main/java/com/spun/util/PrintUtils.java b/src/main/java/com/spun/util/PrintUtils.java index 7f4f803..9dbea15 100644 --- a/src/main/java/com/spun/util/PrintUtils.java +++ b/src/main/java/com/spun/util/PrintUtils.java @@ -1,5 +1,7 @@ package com.spun.util; +import org.teachingkidsprogramming.util.MySystem; + import java.awt.*; import javax.swing.*; import java.awt.print.*; diff --git a/src/main/java/com/spun/util/ThreadLauncher.java b/src/main/java/com/spun/util/ThreadLauncher.java index 3825a94..e7f24a2 100644 --- a/src/main/java/com/spun/util/ThreadLauncher.java +++ b/src/main/java/com/spun/util/ThreadLauncher.java @@ -4,6 +4,7 @@ import org.lambda.actions.Action0; import org.teachingkidsprogramming.util.LambdaThreadLauncher; +import org.teachingkidsprogramming.util.MySystem; public class ThreadLauncher implements Runnable { diff --git a/src/main/java/com/spun/util/TimedObject.java b/src/main/java/com/spun/util/TimedObject.java index 896bef4..a33caf0 100644 --- a/src/main/java/com/spun/util/TimedObject.java +++ b/src/main/java/com/spun/util/TimedObject.java @@ -1,6 +1,8 @@ package com.spun.util; +import org.teachingkidsprogramming.util.MySystem; + public class TimedObject { private Object object = null; diff --git a/src/main/java/com/spun/util/WhiteSpaceStripper.java b/src/main/java/com/spun/util/WhiteSpaceStripper.java index b3a8853..46ed882 100644 --- a/src/main/java/com/spun/util/WhiteSpaceStripper.java +++ b/src/main/java/com/spun/util/WhiteSpaceStripper.java @@ -1,5 +1,7 @@ package com.spun.util; +import org.teachingkidsprogramming.util.MySystem; + import java.io.BufferedReader; import java.io.File; import java.io.FileReader; @@ -35,14 +37,9 @@ public static void stripFolder(File dir, boolean recursive) stripFile(files[i]); } } -// My_System.markerOut("WhiteSpaceStripper:stripFolder"); } - /***********************************************************************/ - public static void stripFile(String file) - { - stripFile(new File(file)); - } - /***********************************************************************/ + + /***********************************************************************/ public static void stripFile(File file) { @@ -54,8 +51,7 @@ public static void stripFile(File file) if(!file.canWrite()) { MySystem.event("File '" + file.toString() + "' is readonly"); - return; - } + } else { try @@ -73,7 +69,7 @@ public static void stripFile(File file) /***********************************************************************/ public static String stripWhiteSpace(String text) { - StringBuffer newText = new StringBuffer(); + StringBuilder newText = new StringBuilder(); boolean whitespace = false; int num = text.length(); char whiteSpaceChar = ' '; @@ -97,48 +93,13 @@ public static String stripWhiteSpace(String text) } return newText.toString(); } - /***********************************************************************/ - public static String stripBlankLines(String text) - { - StringBuffer newText = new StringBuffer(); - boolean inWhiteSpace = true; - int num = text.length(); - String saving = ""; - for (int i = 0; i < num; i++) - { - char c = text.charAt(i); - switch (c) - { - case '\r' : - case '\n' : if(!inWhiteSpace) - { - newText.append(saving); - } - inWhiteSpace = true; - if (!"\r".equals(saving)) - { - saving = ""; - } - break; - case '\t' : - case ' ' : break; // donothing; - default : inWhiteSpace = false;break; - } - saving += c; - } - if (!inWhiteSpace) - { - newText.append(saving); - } - return newText.toString(); - } - - /***********************************************************************/ + + /***********************************************************************/ private static String readFile(File file) throws IOException { BufferedReader reader = new BufferedReader(new FileReader(file)); - StringBuffer output = new StringBuffer(); + StringBuilder output = new StringBuilder(); while (reader.ready()) { @@ -186,14 +147,8 @@ else if (pathname.getName().equalsIgnoreCase("email")) { return false; } - else if(pathname.isDirectory() || (pathname.getName().indexOf(".htm") != -1) || (pathname.getName().indexOf(".txt") != -1)) - { - return true; - } - else - { - return false; - } + else + return pathname.isDirectory() || (pathname.getName().indexOf(".htm") != -1) || (pathname.getName().indexOf(".txt") != -1); } /***********************************************************************/ diff --git a/src/main/java/com/spun/util/WindowUtils.java b/src/main/java/com/spun/util/WindowUtils.java index 588ab69..7f090fe 100644 --- a/src/main/java/com/spun/util/WindowUtils.java +++ b/src/main/java/com/spun/util/WindowUtils.java @@ -1,6 +1,7 @@ package com.spun.util; import org.teachingkidsprogramming.util.FrameCloser; +import org.teachingkidsprogramming.util.MySystem; import java.awt.Dimension; import java.awt.event.WindowAdapter; diff --git a/src/main/java/com/spun/util/io/InternetConnectivityException.java b/src/main/java/com/spun/util/io/InternetConnectivityException.java index 0b7266b..c5c50ff 100644 --- a/src/main/java/com/spun/util/io/InternetConnectivityException.java +++ b/src/main/java/com/spun/util/io/InternetConnectivityException.java @@ -4,7 +4,7 @@ import org.apache.commons.net.EchoTCPClient; -import com.spun.util.MySystem; +import org.teachingkidsprogramming.util.MySystem; /** * A static class of convenience functions for Files diff --git a/src/main/java/com/spun/util/io/NetUtils.java b/src/main/java/com/spun/util/io/NetUtils.java index ac8ffcc..a71045c 100644 --- a/src/main/java/com/spun/util/io/NetUtils.java +++ b/src/main/java/com/spun/util/io/NetUtils.java @@ -12,7 +12,7 @@ import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPReply; -import com.spun.util.MySystem; +import org.teachingkidsprogramming.util.MySystem; import com.sshtools.j2ssh.SftpClient; import com.sshtools.j2ssh.SshClient; import com.sshtools.j2ssh.authentication.PasswordAuthenticationClient; diff --git a/src/main/java/com/spun/util/io/SpaceDelimitedReader.java b/src/main/java/com/spun/util/io/SpaceDelimitedReader.java index 4103d2e..b6ee567 100644 --- a/src/main/java/com/spun/util/io/SpaceDelimitedReader.java +++ b/src/main/java/com/spun/util/io/SpaceDelimitedReader.java @@ -4,7 +4,7 @@ import java.io.IOException; import java.io.StringReader; -import com.spun.util.MySystem; +import org.teachingkidsprogramming.util.MySystem; /** * A static class of convence functions for Files diff --git a/src/main/java/com/spun/util/servlets/ErrorToString.java b/src/main/java/com/spun/util/servlets/ErrorToString.java index 99e2de0..44c5bd4 100644 --- a/src/main/java/com/spun/util/servlets/ErrorToString.java +++ b/src/main/java/com/spun/util/servlets/ErrorToString.java @@ -1,6 +1,6 @@ package com.spun.util.servlets; -import com.spun.util.MySystem; +import org.teachingkidsprogramming.util.MySystem; import com.spun.util.parser.TemplateError; public class ErrorToString implements SecondaryErrorProcessor diff --git a/src/main/java/com/spun/util/servlets/InvokerServlet.java b/src/main/java/com/spun/util/servlets/InvokerServlet.java index 780fccd..11500f9 100644 --- a/src/main/java/com/spun/util/servlets/InvokerServlet.java +++ b/src/main/java/com/spun/util/servlets/InvokerServlet.java @@ -22,7 +22,7 @@ import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import com.spun.util.MySystem; +import org.teachingkidsprogramming.util.MySystem; import com.spun.util.ObjectUtils; /** diff --git a/src/main/java/org/teachingextensions/logo/VirtualProctorFileSystem.java b/src/main/java/org/teachingextensions/logo/VirtualProctorFileSystem.java index f832561..17f2669 100644 --- a/src/main/java/org/teachingextensions/logo/VirtualProctorFileSystem.java +++ b/src/main/java/org/teachingextensions/logo/VirtualProctorFileSystem.java @@ -7,7 +7,7 @@ import javax.imageio.ImageIO; -import com.spun.util.MySystem; +import org.teachingkidsprogramming.util.MySystem; public class VirtualProctorFileSystem extends WindowAdapter { diff --git a/src/main/java/org/teachingextensions/logo/VirtualProctorWeb.java b/src/main/java/org/teachingextensions/logo/VirtualProctorWeb.java index 994b77f..ad0e316 100644 --- a/src/main/java/org/teachingextensions/logo/VirtualProctorWeb.java +++ b/src/main/java/org/teachingextensions/logo/VirtualProctorWeb.java @@ -17,7 +17,7 @@ import org.lambda.actions.Action0; import org.teachingextensions.utils.VirtualProctor; -import com.spun.util.MySystem; +import org.teachingkidsprogramming.util.MySystem; import com.spun.util.ThreadLauncher; import com.spun.util.ThreadUtils; import com.spun.util.io.FileUtils; diff --git a/src/main/java/org/teachingkidsprogramming/util/DateUtils.java b/src/main/java/org/teachingkidsprogramming/util/DateUtils.java index 4b1665c..baca445 100644 --- a/src/main/java/org/teachingkidsprogramming/util/DateUtils.java +++ b/src/main/java/org/teachingkidsprogramming/util/DateUtils.java @@ -1,6 +1,5 @@ package org.teachingkidsprogramming.util; -import com.spun.util.MySystem; import com.spun.util.ObjectUtils; import java.sql.Timestamp; diff --git a/src/main/java/org/teachingkidsprogramming/util/FormattedException.java b/src/main/java/org/teachingkidsprogramming/util/FormattedException.java index 133cff7..447cac0 100644 --- a/src/main/java/org/teachingkidsprogramming/util/FormattedException.java +++ b/src/main/java/org/teachingkidsprogramming/util/FormattedException.java @@ -1,8 +1,6 @@ package org.teachingkidsprogramming.util; -import com.spun.util.MySystem; - public class FormattedException extends RuntimeException { public FormattedException(String string, Object... params) { diff --git a/src/main/java/org/teachingkidsprogramming/util/LambdaThreadLauncher.java b/src/main/java/org/teachingkidsprogramming/util/LambdaThreadLauncher.java index 704bf1f..b932a0c 100644 --- a/src/main/java/org/teachingkidsprogramming/util/LambdaThreadLauncher.java +++ b/src/main/java/org/teachingkidsprogramming/util/LambdaThreadLauncher.java @@ -1,6 +1,5 @@ package org.teachingkidsprogramming.util; -import com.spun.util.MySystem; import org.lambda.actions.Action0; public class LambdaThreadLauncher implements Runnable { diff --git a/src/main/java/org/teachingkidsprogramming/util/MySystem.java b/src/main/java/org/teachingkidsprogramming/util/MySystem.java new file mode 100644 index 0000000..8dee274 --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/util/MySystem.java @@ -0,0 +1,348 @@ +package org.teachingkidsprogramming.util; + +import java.io.PrintWriter; +import java.util.Vector; + +/** + * A class for printing comments in a standardized format. + * + * @author Llewellyn + * @version 2.0 + */ +public class MySystem { + public static final int IN = 1; + private static boolean useStackTraceInspection = true; + public static boolean marker = true; + public static boolean event = true; + public static boolean variable = true; + public static boolean query = true; + public static int hourGlass = 0; + private static int m_indent = 0; + private static long lastTime = System.currentTimeMillis(); + private static PrintWriter SYSTEM_OUT_WRITER = new PrintWriter(System.out, true); + + /** + * ******************************************************************* + */ + private static void clearHourGlass() { + if (hourGlass > 0) { + System.out.println(""); + hourGlass = 0; + } + } + + /** + * Prints to screen the marker specifying function entered. + */ + public synchronized static void markerOut() { + markerOut(null); + } + /***********************************************************************/ + /** + * Prints to screen the marker specifying function entered. + */ + public synchronized static void markerIn() { + markerIn(null); + } + /***********************************************************************/ + /** + * Prints to screen the marker specifying function entered. + * + * @param statement The statement to print + */ + public synchronized static void markerIn(String statement) { + if (!marker) { + return; + } + if (useStackTraceInspection) { + System.out.println(timeStamp() + "**** " + extractMarkerText() + " - IN"); + } else { + System.out.println(timeStamp() + "**** " + statement + " - IN"); + } + m_indent++; + } + + /** + * ******************************************************************* + */ + private static String extractMarkerText() { + try { + StackTraceElement trace[] = new Error().getStackTrace(); + StackTraceElement element = trace[3]; + String text = element.getMethodName(); + String className = element.getClassName(); + className = className.substring(className.lastIndexOf(".") + 1); + text += "(" + className + ":" + element.getLineNumber() + ")"; + return text; + } catch (Throwable t) { + useStackTraceInspection = false; + return "Can't Inspect Stack Trace"; + } + } + + /** + * ******************************************************************* + */ + private static String getIndent() { + String theIndention = ""; + for (int i = 0; i < m_indent; i++) { + theIndention += " "; + } + return theIndention; + } + + /** + * ******************************************************************* + */ + private static String timeStamp() { + clearHourGlass(); + String text; + long current = System.currentTimeMillis(); + java.text.DateFormat df = java.text.DateFormat.getDateTimeInstance(); + text = "[" + df.format(new java.util.Date(current)) + " ~" + padNumber(current - lastTime) + "ms]" + + getIndent(); + lastTime = current; + return text; + } + + /** + * ******************************************************************* + */ + private static String padNumber(long number) { + String text = "" + number; + while (text.length() < 6) { + text = "0" + text; + } + return text; + } + + /** + * ******************************************************************* + */ + private static String indentMessage(String message) { + Vector v = new Vector<>(); + int place = 0; + while ((place = message.indexOf('\n', place + 1)) != -1) { + v.addElement(place); + } + if (v.size() == 0) { + // no '\n' + return message; + } + String theIndention = getIndent(); + StringBuilder buffer = new StringBuilder(message); + for (int i = (v.size() - 1); i >= 0; i--) { + int tempplace = v.elementAt(i); + buffer.insert(tempplace + 1, theIndention); + } + return buffer.toString(); + } + /***********************************************************************/ + /** + * Prints to screen the marker specifying function exited. + * + * @param Statement The statement to print + */ + public synchronized static void markerOut(String Statement) { + if (!marker) { + return; + } + m_indent--; + System.out.println(timeStamp() + "**** " + extractMarkerText() + " - OUT"); + } + /***********************************************************************/ + /** + * Prints to screen any variable information to be viewed. + * + * @param sqlQuery The SQL query to print + */ + public synchronized static void query(String sqlQuery) { + if (!query) { + return; + } + System.out.println(timeStamp() + "~~> SQL - " + sqlQuery); + } + /***********************************************************************/ + /** + * Prints to screen any variable information to be viewed. + * + * @param queryName The name of the query + * @param sqlQuery The query to print + */ + public synchronized static void query(String queryName, Object sqlQuery) { + if (!query) { + return; + } + System.out.println(timeStamp() + "~~> SQL [" + queryName + "] - " + sqlQuery); + } + /***********************************************************************/ + /** + * Prints to screen any variable information to be viewed. + * + * @param statement The statement to print + */ + public synchronized static void variable(String statement) { + variable(statement, SYSTEM_OUT_WRITER); + } + + /** + * ******************************************************************* + */ + public synchronized static void variable(String statement, PrintWriter out) { + if (!variable) { + return; + } + out.println(timeStamp() + "*=>" + statement); + } + /***********************************************************************/ + /** + * Prints to screen any variable information to be viewed. + * + * @param name The value's name + * @param value The value to print + */ + public synchronized static void variable(String name, Object value) { + if (!variable) { + return; + } + System.out.println(timeStamp() + "*=> " + name + " = '" + (value == null ? null : value.toString()) + "'"); + } + /***********************************************************************/ + /** + * Prints to screen any variable information to be viewed. + * + * @param name The name of the array + * @param array The collection of objects to print + */ + public synchronized static void variable(String name, Object array[]) { + if (!variable) { + return; + } + name = (name == null ? "array" : name); + if (array == null || array.length == 0) { + System.out.println(timeStamp() + "*=> " + name + ".length = 0"); + } else { + for (int i = 0; i < array.length; i++) { + System.out.println(timeStamp() + "*=> " + name + "[" + i + "] = " + + ((array[i] == null) ? "null" : array[i].toString())); + } + } + } + /***********************************************************************/ + /** + * Prints to screen any variable information to be viewed. + * + * @param array A collection of objects to print + */ + public synchronized static void variable(Object array[]) { + variable(null, array); + } + /***********************************************************************/ + /** + * Prints to screen any messages to be viewed. + * + * @param Statement The statement to print + */ + public synchronized static void message(String Statement) { + System.out.println(timeStamp() + indentMessage(Statement)); + } + /***********************************************************************/ + /** + * Prints to screen any events to be viewed. + * + * @param Statement The statement to print + */ + public static void event(String Statement) { + if (!event) { + return; + } + System.out.println(timeStamp() + "*--" + Statement); + } + /***********************************************************************/ + /** + * Prints to screen any warnings to be viewed. + * + * @param statement The statement to print + */ + public synchronized static void warning(String statement) { + warning(statement, null); + } + /***********************************************************************/ + /** + * Prints to screen any warnings to be viewed. + * + * @param throwable The throwable to print + */ + public synchronized static void warning(Throwable throwable) { + warning(null, throwable); + } + /***********************************************************************/ + /** + * Prints to screen any warnings to be viewed. + * + * @param statement The statement to print + * @param throwable A throwable instance with error information + */ + public synchronized static void warning(String statement, Throwable throwable) { + warning(statement, throwable, null); + } + + public synchronized static void warning(String statement, Throwable throwable, PrintWriter out) { + clearHourGlass(); + dualPrintln("******************************************************************************************", out); + dualPrintln(timeStamp(), out); + if (statement != null) { + dualPrintln(statement, out); + } + printFullTrace(throwable, false, out); + if (throwable instanceof OutOfMemoryError) { + dumpMemory(out); + } + dualPrintln("******************************************************************************************", out); + } + + /** + * ******************************************************************* + */ + private static void dualPrintln(String string, PrintWriter out) { + System.out.println(string); + if (out != null) { + out.println(string); + } + } + + /** + * ******************************************************************* + */ + private static void printFullTrace(Throwable throwable, boolean causedBy, PrintWriter out) { + if (throwable != null) { + dualPrintln((causedBy ? "Caused by : " : "") + throwable.getMessage(), out); + throwable.printStackTrace(); + if (out != null) { + throwable.printStackTrace(out); + } + if (throwable.getCause() != null) { + printFullTrace(throwable.getCause(), true, out); + } + } + } + /***********************************************************************/ + /************************************************************************/ + /************************************************************************/ + /** + * ******************************************************************** + */ + public static void dumpMemory(PrintWriter out) { + System.gc(); + java.text.NumberFormat format = java.text.NumberFormat.getNumberInstance(); + long freeMemory = Runtime.getRuntime().freeMemory(); + long totalMemory = Runtime.getRuntime().totalMemory(); + long usedMemory = totalMemory - freeMemory; + String statement = "Memory [total, used, free] = [" + format.format(totalMemory) + " , " + + format.format(usedMemory) + " , " + format.format(freeMemory) + "]"; + variable(statement, out); + } + /************************************************************************/ + /***********************************************************************/ + /***********************************************************************/ +} From eede892fde409f3830f8a558638c6c67510b2c17 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Tue, 17 Mar 2015 09:48:47 -0700 Subject: [PATCH 035/111] move NotImplementedException --- src/main/java/com/spun/util/NameUtils.java | 120 ------------------ .../spun/util/NotImplementedException.java | 10 -- .../writers/FlyingSaucerHtmlToPdfWriter.java | 2 +- .../util/NotImplementedException.java | 10 ++ 4 files changed, 11 insertions(+), 131 deletions(-) delete mode 100644 src/main/java/com/spun/util/NameUtils.java delete mode 100644 src/main/java/com/spun/util/NotImplementedException.java create mode 100644 src/main/java/org/teachingkidsprogramming/util/NotImplementedException.java diff --git a/src/main/java/com/spun/util/NameUtils.java b/src/main/java/com/spun/util/NameUtils.java deleted file mode 100644 index 7c0ac4c..0000000 --- a/src/main/java/com/spun/util/NameUtils.java +++ /dev/null @@ -1,120 +0,0 @@ -package com.spun.util; - -public class NameUtils -{ - /***********************************************************************/ - public static String getRandomFirstName() - { - String[] names = new String[]{"James", - "John", - "Robert", - "Michael", - "William", - "David", - "Richard", - "Charles", - "Joseph", - "Thomas", - "Christopher", - "Daniel", - "Paul", - "Mark", - "Donald", - "George", - "Kenneth", - "Steven", - "Edward", - "Brian", - "Ronald", - "Anthony", - "Kevin", - "Jason", - "Matthew", - "Gary", - "Timothy", - "Jose", - "Larry", - "Jeffrey", - "Frank", - "Scott", - "Eric", - "Stephen", - "Andrew", - "Raymond", - "Gregory", - "Joshua", - "Jerry", - "Dennis", - "Walter", - "Patrick", - "Peter", - "Harold", - "Douglas", - "Henry", - "Carl", - "Arthur", - "Ryan", - "Roger" }; - return names[NumberUtils.RANDOM.nextInt(names.length)]; - } - - /***********************************************************************/ - public static String getRandomLastName() - { - String[] names = new String[]{"Smith", - "Johnson", - "Williams", - "Jones", - "Brown", - "Davis", - "Miller", - "Wilson", - "Moore", - "Taylor", - "Anderson", - "Thomas", - "Jackson", - "White", - "Harris", - "Martin", - "Thompson", - "Garcia", - "Martinez", - "Robinson", - "Clark", - "Rodriguez", - "Lewis", - "Lee", - "Walker", - "Hall", - "Allen", - "Young", - "Hernandez", - "King", - "Wright", - "Lopez", - "Hill", - "Scott", - "Green", - "Adams", - "Baker", - "Gonzalez", - "Nelson", - "Carter", - "Mitchell", - "Perez", - "Roberts", - "Turner", - "Phillips", - "Campbell", - "Parker", - "Evans", - "Edwards", - "Collins" }; - return names[NumberUtils.RANDOM.nextInt(names.length)]; - } - - - /************************************************************************/ - /************************************************************************/ -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/NotImplementedException.java b/src/main/java/com/spun/util/NotImplementedException.java deleted file mode 100644 index 633c54d..0000000 --- a/src/main/java/com/spun/util/NotImplementedException.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.spun.util; - -public class NotImplementedException extends Exception { - - /** - * - */ - private static final long serialVersionUID = 5269165537235260411L; - -} diff --git a/src/main/java/org/approvaltests/writers/FlyingSaucerHtmlToPdfWriter.java b/src/main/java/org/approvaltests/writers/FlyingSaucerHtmlToPdfWriter.java index 7ebcff4..ec1693c 100644 --- a/src/main/java/org/approvaltests/writers/FlyingSaucerHtmlToPdfWriter.java +++ b/src/main/java/org/approvaltests/writers/FlyingSaucerHtmlToPdfWriter.java @@ -2,7 +2,7 @@ import org.approvaltests.core.ApprovalWriter; -import com.spun.util.NotImplementedException; +import org.teachingkidsprogramming.util.NotImplementedException; public class FlyingSaucerHtmlToPdfWriter implements ApprovalWriter diff --git a/src/main/java/org/teachingkidsprogramming/util/NotImplementedException.java b/src/main/java/org/teachingkidsprogramming/util/NotImplementedException.java new file mode 100644 index 0000000..681079b --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/util/NotImplementedException.java @@ -0,0 +1,10 @@ +package org.teachingkidsprogramming.util; + +public class NotImplementedException extends Exception { + + /** + * + */ + private static final long serialVersionUID = 5269165537235260411L; + +} From b22b02a1fe7d09e19f8d44d713084177c60858e1 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Tue, 17 Mar 2015 09:51:38 -0700 Subject: [PATCH 036/111] move NumberUtils --- .../com/spun/util/parser/ParserCommons.java | 2 +- .../com/spun/util/parser/PercentageAmount.java | 2 +- .../com/spun/util/parser/TemplateDouble.java | 2 +- .../spun/util/parser/TemplateNumberUtils.java | 2 +- .../org/teachingextensions/logo/Wheel.java | 2 +- .../teachingextensions/windows/MessageBox.java | 2 +- .../recipes/completed/HiLow.java | 2 +- .../recipes/completed/SimpleBubble.java | 2 +- .../quizzes/graders/HousesQuizGrader.java | 2 +- .../graders/PentagonCrazyQuizGrader.java | 2 +- .../graders/SimpleSquareQuizGrader.java | 2 +- .../teachingkidsprogramming/util/Asserts.java | 2 -- .../util/NumberUtils.java | 18 ++++++++++-------- ...ColorGeneration.testGeneration.approved.txt | 2 +- .../logo/tests/colors.java.template | 2 +- ...ColorGeneration.testGeneration.approved.txt | 2 +- src/test/resources/colors.java.template | 2 +- 17 files changed, 25 insertions(+), 25 deletions(-) rename src/main/java/{com/spun => org/teachingkidsprogramming}/util/NumberUtils.java (84%) diff --git a/src/main/java/com/spun/util/parser/ParserCommons.java b/src/main/java/com/spun/util/parser/ParserCommons.java index a56b683..2ab08b6 100644 --- a/src/main/java/com/spun/util/parser/ParserCommons.java +++ b/src/main/java/com/spun/util/parser/ParserCommons.java @@ -4,7 +4,7 @@ import java.util.Collections; import java.util.Date; import java.util.List; -import com.spun.util.NumberUtils; +import org.teachingkidsprogramming.util.NumberUtils; import com.spun.util.ObjectUtils; import com.spun.util.PhoneNumber; import com.spun.util.velocity.ParserDateUtils; diff --git a/src/main/java/com/spun/util/parser/PercentageAmount.java b/src/main/java/com/spun/util/parser/PercentageAmount.java index 9c4c89c..b9ba247 100644 --- a/src/main/java/com/spun/util/parser/PercentageAmount.java +++ b/src/main/java/com/spun/util/parser/PercentageAmount.java @@ -1,6 +1,6 @@ package com.spun.util.parser; -import com.spun.util.NumberUtils; +import org.teachingkidsprogramming.util.NumberUtils; public class PercentageAmount extends TemplateDouble { diff --git a/src/main/java/com/spun/util/parser/TemplateDouble.java b/src/main/java/com/spun/util/parser/TemplateDouble.java index de55b4c..6a07257 100644 --- a/src/main/java/com/spun/util/parser/TemplateDouble.java +++ b/src/main/java/com/spun/util/parser/TemplateDouble.java @@ -4,7 +4,7 @@ * **/ import java.text.NumberFormat; -import com.spun.util.NumberUtils; +import org.teachingkidsprogramming.util.NumberUtils; public class TemplateDouble { diff --git a/src/main/java/com/spun/util/parser/TemplateNumberUtils.java b/src/main/java/com/spun/util/parser/TemplateNumberUtils.java index 7f346d0..7aaecfb 100644 --- a/src/main/java/com/spun/util/parser/TemplateNumberUtils.java +++ b/src/main/java/com/spun/util/parser/TemplateNumberUtils.java @@ -2,7 +2,7 @@ import org.lambda.query.Query; -import com.spun.util.NumberUtils; +import org.teachingkidsprogramming.util.NumberUtils; public class TemplateNumberUtils { diff --git a/src/main/java/org/teachingextensions/logo/Wheel.java b/src/main/java/org/teachingextensions/logo/Wheel.java index dd7e9ee..456f7f8 100644 --- a/src/main/java/org/teachingextensions/logo/Wheel.java +++ b/src/main/java/org/teachingextensions/logo/Wheel.java @@ -3,7 +3,7 @@ import java.util.ArrayList; import java.util.List; -import com.spun.util.NumberUtils; +import org.teachingkidsprogramming.util.NumberUtils; /** * A Wheel is a List with no ending on beginning
diff --git a/src/main/java/org/teachingextensions/windows/MessageBox.java b/src/main/java/org/teachingextensions/windows/MessageBox.java index 59836d4..1c01cd1 100644 --- a/src/main/java/org/teachingextensions/windows/MessageBox.java +++ b/src/main/java/org/teachingextensions/windows/MessageBox.java @@ -2,7 +2,7 @@ import javax.swing.JOptionPane; -import com.spun.util.NumberUtils; +import org.teachingkidsprogramming.util.NumberUtils; /** * T assertNotNull(String label, T o) { diff --git a/src/main/java/com/spun/util/NumberUtils.java b/src/main/java/org/teachingkidsprogramming/util/NumberUtils.java similarity index 84% rename from src/main/java/com/spun/util/NumberUtils.java rename to src/main/java/org/teachingkidsprogramming/util/NumberUtils.java index cfea307..5ceb65c 100644 --- a/src/main/java/com/spun/util/NumberUtils.java +++ b/src/main/java/org/teachingkidsprogramming/util/NumberUtils.java @@ -1,5 +1,7 @@ -package com.spun.util; +package org.teachingkidsprogramming.util; +import com.spun.util.ObjectUtils; +import com.spun.util.StringUtils; import org.teachingkidsprogramming.util.MethodExecutionPath; import java.lang.reflect.Method; @@ -26,7 +28,7 @@ public static int load(String i, int defaultValue, boolean stripNonNumeric) { i = stripNonNumeric ? StringUtils.stripNonNumeric(i, true, true) : i; defaultValue = Integer.parseInt(i); - } catch (Exception e) { + } catch (Exception ignored) { } return defaultValue; } @@ -35,7 +37,7 @@ public static double load(String i, double defaultValue) { try { i = StringUtils.stripNonNumeric(i, true, true); defaultValue = Double.parseDouble(i); - } catch (Exception e) { + } catch (Exception ignored) { } return defaultValue; } @@ -58,12 +60,12 @@ public static double sum(Object[] attribs, String methodName, attribs[0].getClass(), methodName, params == null ? null : (Class[]) ObjectUtils.extractArray( - params, "getClass")); + params, "getClass")); double sum = 0; - for (int i = 0; i < attribs.length; i++) { - sum += ((Number) method.invoke(attribs[i], params)) - .doubleValue(); - } + for (Object attrib : attribs) { + sum += ((Number) method.invoke(attrib, params)) + .doubleValue(); + } return sum; } catch (Throwable t) { throw ObjectUtils.throwAsError(t); diff --git a/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.testGeneration.approved.txt b/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.testGeneration.approved.txt index 48019ff..e29cfe5 100644 --- a/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.testGeneration.approved.txt +++ b/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.testGeneration.approved.txt @@ -2,7 +2,7 @@ package org.teachingextensions.logo; import java.awt.Color; -import com.spun.util.NumberUtils; +import org.teachingkidsprogramming.util.NumberUtils; /** * Every color under the diff --git a/src/test/java/org/teachingextensions/logo/tests/colors.java.template b/src/test/java/org/teachingextensions/logo/tests/colors.java.template index 678cfcc..0bba9cc 100644 --- a/src/test/java/org/teachingextensions/logo/tests/colors.java.template +++ b/src/test/java/org/teachingextensions/logo/tests/colors.java.template @@ -2,7 +2,7 @@ package org.teachingextensions.logo; import java.awt.Color; -import com.spun.util.NumberUtils; +import org.teachingkidsprogramming.util.NumberUtils; /** * Every color under the diff --git a/src/test/resources/ColorGeneration.testGeneration.approved.txt b/src/test/resources/ColorGeneration.testGeneration.approved.txt index 48019ff..e29cfe5 100644 --- a/src/test/resources/ColorGeneration.testGeneration.approved.txt +++ b/src/test/resources/ColorGeneration.testGeneration.approved.txt @@ -2,7 +2,7 @@ package org.teachingextensions.logo; import java.awt.Color; -import com.spun.util.NumberUtils; +import org.teachingkidsprogramming.util.NumberUtils; /** * Every color under the diff --git a/src/test/resources/colors.java.template b/src/test/resources/colors.java.template index 678cfcc..0bba9cc 100644 --- a/src/test/resources/colors.java.template +++ b/src/test/resources/colors.java.template @@ -2,7 +2,7 @@ package org.teachingextensions.logo; import java.awt.Color; -import com.spun.util.NumberUtils; +import org.teachingkidsprogramming.util.NumberUtils; /** * Every color under the From 72aae083a7b48230c0877872a84de3a615b9e34a Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Tue, 17 Mar 2015 09:53:41 -0700 Subject: [PATCH 037/111] clean, move ObjectUtils --- src/main/java/com/spun/util/StringUtils.java | 2 ++ src/main/java/com/spun/util/TestUtils.java | 1 + .../java/com/spun/util/filters/FilterIn.java | 2 +- src/main/java/com/spun/util/io/FileUtils.java | 2 +- .../com/spun/util/parser/ParserCommons.java | 2 +- .../spun/util/servlets/InvokerServlet.java | 2 +- .../spun/util/velocity/TestableUberspect.java | 2 +- .../spun/util/velocity/VelocityParser.java | 2 +- .../java/org/approvaltests/Approvals.java | 2 +- .../approvaltests/approvers/FileApprover.java | 2 +- .../namer/JUnitStackTraceNamer.java | 2 +- .../logo/ImageBackground.java | 2 +- .../logo/utils/TortoiseUtils.java | 2 +- .../setup/CommandLineUtils.java | 2 +- .../setup/MacThumbDriveInstaller.java | 2 +- .../setup/SetupValidator.java | 2 +- .../simpleparser/Parser.java | 2 +- .../org/teachingextensions/utils/Viewer.java | 2 +- .../util/ClassUtils.java | 1 - .../util/DateUtils.java | 2 -- .../util/DualOutputStream.java | 2 -- .../util/MethodExecutionPath.java | 1 - .../util/NumberUtils.java | 2 -- .../util/ObjectUtils.java | 32 +++++++------------ 24 files changed, 31 insertions(+), 44 deletions(-) rename src/main/java/{com/spun => org/teachingkidsprogramming}/util/ObjectUtils.java (85%) diff --git a/src/main/java/com/spun/util/StringUtils.java b/src/main/java/com/spun/util/StringUtils.java index fc25cf2..b708fa2 100644 --- a/src/main/java/com/spun/util/StringUtils.java +++ b/src/main/java/com/spun/util/StringUtils.java @@ -1,5 +1,7 @@ package com.spun.util; +import org.teachingkidsprogramming.util.ObjectUtils; + import java.io.ByteArrayInputStream; import java.io.InputStream; import java.io.UnsupportedEncodingException; diff --git a/src/main/java/com/spun/util/TestUtils.java b/src/main/java/com/spun/util/TestUtils.java index 67cdeaf..abdb403 100644 --- a/src/main/java/com/spun/util/TestUtils.java +++ b/src/main/java/com/spun/util/TestUtils.java @@ -22,6 +22,7 @@ import com.spun.util.io.StackElementLevelSelector; import com.spun.util.io.StackElementSelector; import org.teachingkidsprogramming.util.ClassUtils; +import org.teachingkidsprogramming.util.ObjectUtils; public class TestUtils { diff --git a/src/main/java/com/spun/util/filters/FilterIn.java b/src/main/java/com/spun/util/filters/FilterIn.java index ed52c8b..7f989ef 100644 --- a/src/main/java/com/spun/util/filters/FilterIn.java +++ b/src/main/java/com/spun/util/filters/FilterIn.java @@ -1,6 +1,6 @@ package com.spun.util.filters; -import com.spun.util.ObjectUtils; +import org.teachingkidsprogramming.util.ObjectUtils; /** * Listens to the state of a EnabledConditions object diff --git a/src/main/java/com/spun/util/io/FileUtils.java b/src/main/java/com/spun/util/io/FileUtils.java index 8e24a13..9741158 100644 --- a/src/main/java/com/spun/util/io/FileUtils.java +++ b/src/main/java/com/spun/util/io/FileUtils.java @@ -21,7 +21,7 @@ import org.teachingkidsprogramming.util.ArrayUtils; import org.teachingkidsprogramming.util.Asserts; -import com.spun.util.ObjectUtils; +import org.teachingkidsprogramming.util.ObjectUtils; /** * A static class of convenience functions for Files diff --git a/src/main/java/com/spun/util/parser/ParserCommons.java b/src/main/java/com/spun/util/parser/ParserCommons.java index 2ab08b6..4edefcf 100644 --- a/src/main/java/com/spun/util/parser/ParserCommons.java +++ b/src/main/java/com/spun/util/parser/ParserCommons.java @@ -5,7 +5,7 @@ import java.util.Date; import java.util.List; import org.teachingkidsprogramming.util.NumberUtils; -import com.spun.util.ObjectUtils; +import org.teachingkidsprogramming.util.ObjectUtils; import com.spun.util.PhoneNumber; import com.spun.util.velocity.ParserDateUtils; diff --git a/src/main/java/com/spun/util/servlets/InvokerServlet.java b/src/main/java/com/spun/util/servlets/InvokerServlet.java index 11500f9..da64748 100644 --- a/src/main/java/com/spun/util/servlets/InvokerServlet.java +++ b/src/main/java/com/spun/util/servlets/InvokerServlet.java @@ -23,7 +23,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.teachingkidsprogramming.util.MySystem; -import com.spun.util.ObjectUtils; +import org.teachingkidsprogramming.util.ObjectUtils; /** * The default servlet-invoking servlet for most web applications, diff --git a/src/main/java/com/spun/util/velocity/TestableUberspect.java b/src/main/java/com/spun/util/velocity/TestableUberspect.java index 7caf751..828a73b 100644 --- a/src/main/java/com/spun/util/velocity/TestableUberspect.java +++ b/src/main/java/com/spun/util/velocity/TestableUberspect.java @@ -21,7 +21,7 @@ import org.apache.velocity.util.introspection.VelMethod; import org.apache.velocity.util.introspection.VelPropertyGet; import org.apache.velocity.util.introspection.VelPropertySet; -import com.spun.util.ObjectUtils; +import org.teachingkidsprogramming.util.ObjectUtils; /** * Implementation of Uberspect to provide the default introspective diff --git a/src/main/java/com/spun/util/velocity/VelocityParser.java b/src/main/java/com/spun/util/velocity/VelocityParser.java index 50238b2..8ee0c8d 100644 --- a/src/main/java/com/spun/util/velocity/VelocityParser.java +++ b/src/main/java/com/spun/util/velocity/VelocityParser.java @@ -15,7 +15,7 @@ import org.apache.velocity.runtime.RuntimeConstants; import org.apache.velocity.runtime.log.NullLogSystem; -import com.spun.util.ObjectUtils; +import org.teachingkidsprogramming.util.ObjectUtils; import com.spun.util.io.FileUtils; import com.spun.util.parser.ParserCommons; diff --git a/src/main/java/org/approvaltests/Approvals.java b/src/main/java/org/approvaltests/Approvals.java index e3920e3..5872959 100644 --- a/src/main/java/org/approvaltests/Approvals.java +++ b/src/main/java/org/approvaltests/Approvals.java @@ -22,7 +22,7 @@ import org.lambda.functions.Function1; import org.teachingkidsprogramming.util.ArrayUtils; -import com.spun.util.ObjectUtils; +import org.teachingkidsprogramming.util.ObjectUtils; import com.spun.util.StringUtils; public class Approvals { diff --git a/src/main/java/org/approvaltests/approvers/FileApprover.java b/src/main/java/org/approvaltests/approvers/FileApprover.java index 6c315d1..2a5fd87 100644 --- a/src/main/java/org/approvaltests/approvers/FileApprover.java +++ b/src/main/java/org/approvaltests/approvers/FileApprover.java @@ -12,7 +12,7 @@ import org.approvaltests.namer.ApprovalNamer; import org.approvaltests.namer.NamerFactory; -import com.spun.util.ObjectUtils; +import org.teachingkidsprogramming.util.ObjectUtils; import com.spun.util.io.FileUtils; public class FileApprover implements ApprovalApprover diff --git a/src/main/java/org/approvaltests/namer/JUnitStackTraceNamer.java b/src/main/java/org/approvaltests/namer/JUnitStackTraceNamer.java index 51569a0..a3dd5f3 100644 --- a/src/main/java/org/approvaltests/namer/JUnitStackTraceNamer.java +++ b/src/main/java/org/approvaltests/namer/JUnitStackTraceNamer.java @@ -7,7 +7,7 @@ import org.junit.Test; -import com.spun.util.ObjectUtils; +import org.teachingkidsprogramming.util.ObjectUtils; import com.spun.util.StackTraceReflectionResult; import com.spun.util.TestUtils; import com.spun.util.io.StackElementSelector; diff --git a/src/main/java/org/teachingextensions/logo/ImageBackground.java b/src/main/java/org/teachingextensions/logo/ImageBackground.java index b1ae5d6..91cdb81 100644 --- a/src/main/java/org/teachingextensions/logo/ImageBackground.java +++ b/src/main/java/org/teachingextensions/logo/ImageBackground.java @@ -9,7 +9,7 @@ import javax.imageio.ImageIO; import javax.swing.JPanel; -import com.spun.util.ObjectUtils; +import org.teachingkidsprogramming.util.ObjectUtils; public class ImageBackground implements Paintable { diff --git a/src/main/java/org/teachingextensions/logo/utils/TortoiseUtils.java b/src/main/java/org/teachingextensions/logo/utils/TortoiseUtils.java index 3e6eabb..8582d55 100644 --- a/src/main/java/org/teachingextensions/logo/utils/TortoiseUtils.java +++ b/src/main/java/org/teachingextensions/logo/utils/TortoiseUtils.java @@ -4,7 +4,7 @@ import org.approvaltests.namer.ApprovalResults; import org.teachingextensions.logo.Turtle; -import com.spun.util.ObjectUtils; +import org.teachingkidsprogramming.util.ObjectUtils; public class TortoiseUtils { diff --git a/src/main/java/org/teachingextensions/setup/CommandLineUtils.java b/src/main/java/org/teachingextensions/setup/CommandLineUtils.java index fdd7c86..f0b854f 100644 --- a/src/main/java/org/teachingextensions/setup/CommandLineUtils.java +++ b/src/main/java/org/teachingextensions/setup/CommandLineUtils.java @@ -2,7 +2,7 @@ import java.io.IOException; -import com.spun.util.ObjectUtils; +import org.teachingkidsprogramming.util.ObjectUtils; public class CommandLineUtils { diff --git a/src/main/java/org/teachingextensions/setup/MacThumbDriveInstaller.java b/src/main/java/org/teachingextensions/setup/MacThumbDriveInstaller.java index 1db9e1d..5093a30 100644 --- a/src/main/java/org/teachingextensions/setup/MacThumbDriveInstaller.java +++ b/src/main/java/org/teachingextensions/setup/MacThumbDriveInstaller.java @@ -5,7 +5,7 @@ import javax.swing.filechooser.FileSystemView; -import com.spun.util.ObjectUtils; +import org.teachingkidsprogramming.util.ObjectUtils; import com.spun.util.io.ZipUtils; public class MacThumbDriveInstaller diff --git a/src/main/java/org/teachingextensions/setup/SetupValidator.java b/src/main/java/org/teachingextensions/setup/SetupValidator.java index 96da83f..bd2c786 100644 --- a/src/main/java/org/teachingextensions/setup/SetupValidator.java +++ b/src/main/java/org/teachingextensions/setup/SetupValidator.java @@ -5,7 +5,7 @@ import org.teachingextensions.windows.MessageBox; -import com.spun.util.ObjectUtils; +import org.teachingkidsprogramming.util.ObjectUtils; import com.spun.util.io.FileUtils; import com.spun.util.io.ZipUtils; diff --git a/src/main/java/org/teachingextensions/simpleparser/Parser.java b/src/main/java/org/teachingextensions/simpleparser/Parser.java index 5c68b4d..d3692f2 100644 --- a/src/main/java/org/teachingextensions/simpleparser/Parser.java +++ b/src/main/java/org/teachingextensions/simpleparser/Parser.java @@ -6,7 +6,7 @@ import org.lambda.functions.Function1; import org.lambda.query.Query; -import com.spun.util.ObjectUtils; +import org.teachingkidsprogramming.util.ObjectUtils; import com.spun.util.io.FileUtils; public class Parser diff --git a/src/main/java/org/teachingextensions/utils/Viewer.java b/src/main/java/org/teachingextensions/utils/Viewer.java index 49b7177..0bf5c2f 100644 --- a/src/main/java/org/teachingextensions/utils/Viewer.java +++ b/src/main/java/org/teachingextensions/utils/Viewer.java @@ -4,7 +4,7 @@ import java.io.FileWriter; import java.io.IOException; -import com.spun.util.ObjectUtils; +import org.teachingkidsprogramming.util.ObjectUtils; import com.spun.util.TestUtils; public class Viewer diff --git a/src/main/java/org/teachingkidsprogramming/util/ClassUtils.java b/src/main/java/org/teachingkidsprogramming/util/ClassUtils.java index 2f6c548..28399d8 100644 --- a/src/main/java/org/teachingkidsprogramming/util/ClassUtils.java +++ b/src/main/java/org/teachingkidsprogramming/util/ClassUtils.java @@ -1,6 +1,5 @@ package org.teachingkidsprogramming.util; -import com.spun.util.ObjectUtils; import com.spun.util.SearchingFileFilter; import java.io.File; diff --git a/src/main/java/org/teachingkidsprogramming/util/DateUtils.java b/src/main/java/org/teachingkidsprogramming/util/DateUtils.java index baca445..ce1e29d 100644 --- a/src/main/java/org/teachingkidsprogramming/util/DateUtils.java +++ b/src/main/java/org/teachingkidsprogramming/util/DateUtils.java @@ -1,7 +1,5 @@ package org.teachingkidsprogramming.util; -import com.spun.util.ObjectUtils; - import java.sql.Timestamp; import java.text.ParseException; import java.text.SimpleDateFormat; diff --git a/src/main/java/org/teachingkidsprogramming/util/DualOutputStream.java b/src/main/java/org/teachingkidsprogramming/util/DualOutputStream.java index 0aaa267..c3dfa90 100644 --- a/src/main/java/org/teachingkidsprogramming/util/DualOutputStream.java +++ b/src/main/java/org/teachingkidsprogramming/util/DualOutputStream.java @@ -1,7 +1,5 @@ package org.teachingkidsprogramming.util; -import com.spun.util.ObjectUtils; - import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; diff --git a/src/main/java/org/teachingkidsprogramming/util/MethodExecutionPath.java b/src/main/java/org/teachingkidsprogramming/util/MethodExecutionPath.java index 6652a2b..dc4e654 100644 --- a/src/main/java/org/teachingkidsprogramming/util/MethodExecutionPath.java +++ b/src/main/java/org/teachingkidsprogramming/util/MethodExecutionPath.java @@ -3,7 +3,6 @@ import java.io.Serializable; import java.lang.reflect.Method; -import com.spun.util.ObjectUtils; import com.spun.util.filters.Filter; import com.spun.util.filters.FilterUtils; diff --git a/src/main/java/org/teachingkidsprogramming/util/NumberUtils.java b/src/main/java/org/teachingkidsprogramming/util/NumberUtils.java index 5ceb65c..dc39bf2 100644 --- a/src/main/java/org/teachingkidsprogramming/util/NumberUtils.java +++ b/src/main/java/org/teachingkidsprogramming/util/NumberUtils.java @@ -1,8 +1,6 @@ package org.teachingkidsprogramming.util; -import com.spun.util.ObjectUtils; import com.spun.util.StringUtils; -import org.teachingkidsprogramming.util.MethodExecutionPath; import java.lang.reflect.Method; import java.util.Random; diff --git a/src/main/java/com/spun/util/ObjectUtils.java b/src/main/java/org/teachingkidsprogramming/util/ObjectUtils.java similarity index 85% rename from src/main/java/com/spun/util/ObjectUtils.java rename to src/main/java/org/teachingkidsprogramming/util/ObjectUtils.java index 7518a1a..ea10856 100644 --- a/src/main/java/com/spun/util/ObjectUtils.java +++ b/src/main/java/org/teachingkidsprogramming/util/ObjectUtils.java @@ -1,8 +1,4 @@ -package com.spun.util; - -import org.teachingkidsprogramming.util.ArrayUtils; -import org.teachingkidsprogramming.util.ClassUtils; -import org.teachingkidsprogramming.util.MySystem; +package org.teachingkidsprogramming.util; import java.lang.reflect.Array; import java.lang.reflect.Method; @@ -36,19 +32,15 @@ public static Method[] getMethodsForObject(Object o2, String[] passedMethods) public static boolean isEqual(Object s1, Object s2) { if (s1 == s2) { return true; - } else if ((s1 != null) && s1.equals(s2)) { - return true; - } else { - return false; - } + } else return (s1 != null) && s1.equals(s2); } public static boolean isIn(Object target, Object[] objects) { - for (int i = 0; i < objects.length; i++) { - if (ObjectUtils.isEqual(objects[i], target)) { - return true; - } - } + for (Object object : objects) { + if (ObjectUtils.isEqual(object, target)) { + return true; + } + } return false; } @@ -75,7 +67,7 @@ public static Object[] extractArray(Object[] from, String methodName) { return new Object[0]; } Method method = getGreatestCommonDenominator(from, methodName); - Object[] array = null; + Object[] array; if (Object.class.isAssignableFrom(method.getReturnType())) { array = (Object[]) Array.newInstance(method.getReturnType(), from.length); @@ -96,7 +88,7 @@ public static Object[] extractArray(Object[] from, String methodName) { public static Method getGreatestCommonDenominator(Object[] from, String methodName) throws SecurityException, NoSuchMethodException { - List classes = new ArrayList(); + List classes = new ArrayList<>(); ArrayUtils.addArray(classes, getAllCastableClasses(from[0])); for (Object o : from) { for (int i = classes.size() - 1; i >= 0; i--) { @@ -112,14 +104,14 @@ public static Method getGreatestCommonDenominator(Object[] from, } private static Class[] getAllCastableClasses(Object object) { - Class clazz = object.getClass(); - ArrayList list = new ArrayList(); + Class clazz = object.getClass(); + ArrayList list = new ArrayList<>(); while (clazz != null) { list.add(clazz); ArrayUtils.addArray(list, clazz.getInterfaces()); clazz = clazz.getSuperclass(); } - Class[] found = (Class[]) list.toArray(new Class[list.size()]); + Class[] found = list.toArray(new Class[list.size()]); ArrayUtils.toReverseArray(found); return found; } From 25600b96a10548949f29bbf29210d2d349c18ea8 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Tue, 17 Mar 2015 09:55:59 -0700 Subject: [PATCH 038/111] clean, move PhoneNumber --- src/main/java/com/spun/util/PhoneNumber.java | 261 ------------------ .../com/spun/util/parser/ParserCommons.java | 2 +- .../util/PhoneNumber.java | 256 +++++++++++++++++ 3 files changed, 257 insertions(+), 262 deletions(-) delete mode 100644 src/main/java/com/spun/util/PhoneNumber.java create mode 100644 src/main/java/org/teachingkidsprogramming/util/PhoneNumber.java diff --git a/src/main/java/com/spun/util/PhoneNumber.java b/src/main/java/com/spun/util/PhoneNumber.java deleted file mode 100644 index 4fc8530..0000000 --- a/src/main/java/com/spun/util/PhoneNumber.java +++ /dev/null @@ -1,261 +0,0 @@ -package com.spun.util; - - -import org.teachingkidsprogramming.util.Country; - -/** - * Phone number validation, and formatter. - * this class is immutable. - **/ -public class PhoneNumber -{ - public static final int USA = 0; - public static final String[] COUNTRY_CODES = { - "1", "20", "212", "213", "216", "218", "220", "221", "222", "223", - "224", "225", "226", "227", "228", "229", "230", "231", "232", "233", - "234", "235", "236", "237", "238", "239", "240", "241", "242", "243", - "244", "245", "246", "247", "248", "249", "250", "251", "252", "253", - "254", "255", "256", "257", "258", "260", "261", "262", "263", "264", - "265", "266", "267", "268", "269", "27", "290", "291", "297", "298", - "299", "30", "31", "32", "33", "34", "350", "351", "352", "353", - "354", "355", "356", "357", "358", "359", "36", "370", "371", "372", - "373", "374", "375", "376", "377", "378", "380", "381", "385", "386", - "387", "389", "39", "40", "41", "420", "421", "423", "43", "44", - "45", "46", "47", "48", "49", "500", "501", "502", "503", "504", - "505", "506", "507", "508", "509", "51", "52", "53", "5399", "54", - "55", "56", "57", "58", "590", "591", "592", "593", "594", "595", - "596", "597", "598", "599", "60", "61", "618", "62", "63", "64", - "65", "66", "670", "672", "673", "674", "675", "676", "677", "678", - "679", "680", "681", "682", "683", "684", "685", "686", "687", "688", - "689", "690", "691", "692", "7", "808", "81", "82", "84", "850", - "852", "853", "855", "856", "86", "870", "871", "872", "873", "874", - "878", "880", "881", "8816", "8817", "88213", "88216", "886", "90", "91", - "92", "93", "94", "95", "960", "961", "962", "963", "964", "965", - "966", "967", "968", "970", "971", "972", "973", "974", "975", "976", - "977", "98", "992", "993", "994", "995", "996", "998"}; - - private static final String REASONS[] = {"Phone Number Too Long or Too Short", "US Number must be length 10", "Unknown Country Code"}; - - /** The original value. */ - private String originalValue = null; - private int countryCode = USA; - private String strippedValue = null; - private String invalidReason = null; - private int nonValidCountryCode = 0; - public PhoneNumber(String originalValue) - { - originalValue = StringUtils.loadNullableString(originalValue); - this.originalValue = originalValue; - if (this.originalValue == null) { return; } - this.strippedValue = stripPhoneNumber(this.originalValue); - this.countryCode = getCountryCode(strippedValue); - this.invalidReason = validate(countryCode, strippedValue); - if (invalidReason != null) - { - nonValidCountryCode = countryCode; - countryCode = -1; - } - } - /**************************************************************************/ - private static String stripPhoneNumber(String number) - { - if (number == null) {return null;} - boolean xAppended = false; - StringBuffer result = new StringBuffer(); - for(int i = 0; i< number.length(); i++) - { - char c = number.charAt(i); - switch (c) - { - case '0' : - case '1' : - case '2' : - case '3' : - case '4' : - case '5' : - case '6' : - case '7' : - case '8' : - case '9' : result.append(c); break; - case '+' : if (result.length() == 0){result.append(c);} break; - case 'X': - case 'x': { - if (! xAppended) - { - result.append('x'); - xAppended = true; - } - break; - } - default : break; - } - } - - char c = result.length() == 0 ? ' ' : result.charAt(0); - switch (c) - { - case '+': break; // do nothing - case '1': result.insert(0, "+"); break; // insert a 1 - default: result.insert(0, "+1"); // if neither insert a +1 - } - - return result.toString(); - } - /**************************************************************************/ - private static int getCountryCode(String strippedNumber) - { - String alt = strippedNumber.substring(1); - for (int i = 0; i < COUNTRY_CODES.length; i++) - { - String code = COUNTRY_CODES[i]; - if (alt.startsWith(code)) { return i; } - } - return -1; - } - /**************************************************************************/ - private static String validate(int countryCode, String stripedNumber) - { - return (countryCode == USA) ? validateNorthAmerican(countryCode, stripedNumber) : validateInternational(countryCode, stripedNumber); - } - /**************************************************************************/ - private static String validateInternational(int countryCode, String strippedNumber) - { - if (countryCode == -1) - return "Invalid country code"; - String body = extractPhoneBody(countryCode, strippedNumber); - String prefix = COUNTRY_CODES[countryCode]; - int nl = prefix.length() + body.length(); - return (nl > 15) || (nl < 9) ? REASONS[0] : null; - } - /**************************************************************************/ - private static String validateNorthAmerican(int countryCode, String strippedNumber) - { - if (countryCode != USA) - return "Invalid country code"; - String body = extractPhoneBody(countryCode, strippedNumber); - return (body.length() != 10) ? REASONS[0] : null; - } - /**************************************************************************/ - private static String extractPhoneBody(int countryCode, String strippedNumber) - { - if (countryCode == -1) - throw new IllegalArgumentException("Invalid country code"); - String prefix = "+" + COUNTRY_CODES[countryCode]; - String body = strippedNumber.substring(prefix.length()); - int indexOfExt = body.indexOf('x'); - if (indexOfExt > -1) - { - body = body.substring(0, indexOfExt); - } - return body; - } - /**************************************************************************/ - public String getValue() - { - if (isValid() && strippedValue != null) - { - return (isNorthAmericanNumber()) ? getValueAsNorthAmerican() : getValueAsInternational(); - } - else - { - return originalValue; - } - } - /**************************************************************************/ - public String getValueAsUps() - { - return getValueAsUps(countryCode, this.strippedValue); - } - /**************************************************************************/ - private static String getValueAsUps(int countryCode, String strippedNumber) - { - if (strippedNumber == null) { return null; } - if (countryCode < 0) { throw new IllegalArgumentException("# '" + strippedNumber + "' is not an international number"); } - String body = extractPhoneBody(countryCode, strippedNumber); - String prefix = COUNTRY_CODES[countryCode]; - if (countryCode == USA) - { - return body; - } - else - { - return prefix + body; - } - } - /**************************************************************************/ - private static String getValueAsNorthAmerican(int countryCode, String stripped) - { - if (countryCode != USA) - throw new IllegalArgumentException("# '" + stripped + "' is not a NorthAmerican number"); - StringBuffer number = new StringBuffer(stripped.substring(2)); - number.insert(6, "-"); - number.insert(3, ")"); - number.insert(0, "("); - return number.toString(); - } - /**************************************************************************/ - private static String getValueAsInternational(int countryCode, String stripped) - { - if (stripped == null) { return null; } - if (countryCode < USA) { throw new IllegalArgumentException("# '" + stripped + "' is not an international number"); } - StringBuffer number = new StringBuffer(stripped); - int intlLength = COUNTRY_CODES[countryCode].length() + 1; - int bodyLength = extractPhoneBody(countryCode, stripped).length(); - if (bodyLength > 6) - { - number.insert(intlLength + 6, "."); - } - if (bodyLength > 3) - { - number.insert(intlLength + 3, "."); - } - number.insert(intlLength, "."); - return number.toString(); - } - /**************************************************************************/ - public String getValueAsNorthAmerican() - { - return getValueAsNorthAmerican(this.countryCode, this.strippedValue); - } - /**************************************************************************/ - public String getValueAsInternational() - { - return getValueAsInternational(this.countryCode, this.strippedValue); - } - /**************************************************************************/ - public String getPartiallyFormattedAsInternational() - { - return getValueAsInternational(this.nonValidCountryCode, this.strippedValue); - } - /**************************************************************************/ - public boolean isValid() - { - return (this.invalidReason == null); - } - /**************************************************************************/ - public String getInvalidReason() - { - return this.invalidReason; - } - /**************************************************************************/ - public boolean isNorthAmericanNumber() - { - return this.countryCode == USA; - } - /**************************************************************************/ - public String getOriginalText() - { - return originalValue; - } - /**************************************************************************/ - public String toString() - { - return getValue(); - } - /**************************************************************************/ - /**************************************************************************/ - public Country getCountry() - { - return Country.UnitedStates; - } -} diff --git a/src/main/java/com/spun/util/parser/ParserCommons.java b/src/main/java/com/spun/util/parser/ParserCommons.java index 4edefcf..bc9d20c 100644 --- a/src/main/java/com/spun/util/parser/ParserCommons.java +++ b/src/main/java/com/spun/util/parser/ParserCommons.java @@ -6,7 +6,7 @@ import java.util.List; import org.teachingkidsprogramming.util.NumberUtils; import org.teachingkidsprogramming.util.ObjectUtils; -import com.spun.util.PhoneNumber; +import org.teachingkidsprogramming.util.PhoneNumber; import com.spun.util.velocity.ParserDateUtils; public class ParserCommons diff --git a/src/main/java/org/teachingkidsprogramming/util/PhoneNumber.java b/src/main/java/org/teachingkidsprogramming/util/PhoneNumber.java new file mode 100644 index 0000000..4ba564b --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/util/PhoneNumber.java @@ -0,0 +1,256 @@ +package org.teachingkidsprogramming.util; + + +import com.spun.util.StringUtils; + +/** + * Phone number validation, and formatter. + * this class is immutable. + */ +public class PhoneNumber { + public static final int USA = 0; + public static final String[] COUNTRY_CODES = { + "1", "20", "212", "213", "216", "218", "220", "221", "222", "223", + "224", "225", "226", "227", "228", "229", "230", "231", "232", "233", + "234", "235", "236", "237", "238", "239", "240", "241", "242", "243", + "244", "245", "246", "247", "248", "249", "250", "251", "252", "253", + "254", "255", "256", "257", "258", "260", "261", "262", "263", "264", + "265", "266", "267", "268", "269", "27", "290", "291", "297", "298", + "299", "30", "31", "32", "33", "34", "350", "351", "352", "353", + "354", "355", "356", "357", "358", "359", "36", "370", "371", "372", + "373", "374", "375", "376", "377", "378", "380", "381", "385", "386", + "387", "389", "39", "40", "41", "420", "421", "423", "43", "44", + "45", "46", "47", "48", "49", "500", "501", "502", "503", "504", + "505", "506", "507", "508", "509", "51", "52", "53", "5399", "54", + "55", "56", "57", "58", "590", "591", "592", "593", "594", "595", + "596", "597", "598", "599", "60", "61", "618", "62", "63", "64", + "65", "66", "670", "672", "673", "674", "675", "676", "677", "678", + "679", "680", "681", "682", "683", "684", "685", "686", "687", "688", + "689", "690", "691", "692", "7", "808", "81", "82", "84", "850", + "852", "853", "855", "856", "86", "870", "871", "872", "873", "874", + "878", "880", "881", "8816", "8817", "88213", "88216", "886", "90", "91", + "92", "93", "94", "95", "960", "961", "962", "963", "964", "965", + "966", "967", "968", "970", "971", "972", "973", "974", "975", "976", + "977", "98", "992", "993", "994", "995", "996", "998"}; + + private static final String REASONS[] = {"Phone Number Too Long or Too Short", "US Number must be length 10", "Unknown Country Code"}; + + /** + * The original value. + */ + private String originalValue = null; + private int countryCode = USA; + private String strippedValue = null; + private String invalidReason = null; + + public PhoneNumber(String originalValue) { + originalValue = StringUtils.loadNullableString(originalValue); + this.originalValue = originalValue; + if (this.originalValue == null) { + return; + } + this.strippedValue = stripPhoneNumber(this.originalValue); + this.countryCode = getCountryCode(strippedValue); + this.invalidReason = validate(countryCode, strippedValue); + if (invalidReason != null) { + countryCode = -1; + } + } + + /** + * ********************************************************************** + */ + private static String stripPhoneNumber(String number) { + if (number == null) { + return null; + } + boolean xAppended = false; + StringBuilder result = new StringBuilder(); + for (int i = 0; i < number.length(); i++) { + char c = number.charAt(i); + switch (c) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + result.append(c); + break; + case '+': + if (result.length() == 0) { + result.append(c); + } + break; + case 'X': + case 'x': { + if (!xAppended) { + result.append('x'); + xAppended = true; + } + break; + } + default: + break; + } + } + + char c = result.length() == 0 ? ' ' : result.charAt(0); + switch (c) { + case '+': + break; // do nothing + case '1': + result.insert(0, "+"); + break; // insert a 1 + default: + result.insert(0, "+1"); // if neither insert a +1 + } + + return result.toString(); + } + + /** + * ********************************************************************** + */ + private static int getCountryCode(String strippedNumber) { + String alt = strippedNumber.substring(1); + for (int i = 0; i < COUNTRY_CODES.length; i++) { + String code = COUNTRY_CODES[i]; + if (alt.startsWith(code)) { + return i; + } + } + return -1; + } + + /** + * ********************************************************************** + */ + private static String validate(int countryCode, String stripedNumber) { + return (countryCode == USA) ? validateNorthAmerican(countryCode, stripedNumber) : validateInternational(countryCode, stripedNumber); + } + + /** + * ********************************************************************** + */ + private static String validateInternational(int countryCode, String strippedNumber) { + if (countryCode == -1) + return "Invalid country code"; + String body = extractPhoneBody(countryCode, strippedNumber); + String prefix = COUNTRY_CODES[countryCode]; + int nl = prefix.length() + body.length(); + return (nl > 15) || (nl < 9) ? REASONS[0] : null; + } + + /** + * ********************************************************************** + */ + private static String validateNorthAmerican(int countryCode, String strippedNumber) { + if (countryCode != USA) + return "Invalid country code"; + String body = extractPhoneBody(countryCode, strippedNumber); + return (body.length() != 10) ? REASONS[0] : null; + } + + /** + * ********************************************************************** + */ + private static String extractPhoneBody(int countryCode, String strippedNumber) { + if (countryCode == -1) + throw new IllegalArgumentException("Invalid country code"); + String prefix = "+" + COUNTRY_CODES[countryCode]; + String body = strippedNumber.substring(prefix.length()); + int indexOfExt = body.indexOf('x'); + if (indexOfExt > -1) { + body = body.substring(0, indexOfExt); + } + return body; + } + + /** + * ********************************************************************** + */ + public String getValue() { + if (isValid() && strippedValue != null) { + return (isNorthAmericanNumber()) ? getValueAsNorthAmerican() : getValueAsInternational(); + } else { + return originalValue; + } + } + + /** + * ********************************************************************** + */ + private static String getValueAsNorthAmerican(int countryCode, String stripped) { + if (countryCode != USA) + throw new IllegalArgumentException("# '" + stripped + "' is not a NorthAmerican number"); + StringBuilder number = new StringBuilder(stripped.substring(2)); + number.insert(6, "-"); + number.insert(3, ")"); + number.insert(0, "("); + return number.toString(); + } + + /** + * ********************************************************************** + */ + private static String getValueAsInternational(int countryCode, String stripped) { + if (stripped == null) { + return null; + } + if (countryCode < USA) { + throw new IllegalArgumentException("# '" + stripped + "' is not an international number"); + } + StringBuilder number = new StringBuilder(stripped); + int internationalLen = COUNTRY_CODES[countryCode].length() + 1; + int bodyLength = extractPhoneBody(countryCode, stripped).length(); + if (bodyLength > 6) { + number.insert(internationalLen + 6, "."); + } + if (bodyLength > 3) { + number.insert(internationalLen + 3, "."); + } + number.insert(internationalLen, "."); + return number.toString(); + } + + /** + * ********************************************************************** + */ + public String getValueAsNorthAmerican() { + return getValueAsNorthAmerican(this.countryCode, this.strippedValue); + } + + /** + * ********************************************************************** + */ + public String getValueAsInternational() { + return getValueAsInternational(this.countryCode, this.strippedValue); + } + + /** + * ********************************************************************** + */ + public boolean isValid() { + return (this.invalidReason == null); + } + + /** + * ********************************************************************** + */ + public boolean isNorthAmericanNumber() { + return this.countryCode == USA; + } + + /** + * ********************************************************************** + */ + public String toString() { + return getValue(); + } + /**************************************************************************/ +} From b0bc9ee0a964af8911d25d3066d106221618f74d Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Tue, 17 Mar 2015 09:57:15 -0700 Subject: [PATCH 039/111] clean, move SearchingFileFilter --- src/main/java/com/spun/util/PrintUtils.java | 94 --------------- src/main/java/com/spun/util/ProgessFrame.java | 112 ------------------ .../spun/util/SearchingFileFilterTest.java | 1 + .../util/ClassUtils.java | 2 - .../util/SearchingFileFilter.java | 4 +- 5 files changed, 3 insertions(+), 210 deletions(-) delete mode 100644 src/main/java/com/spun/util/PrintUtils.java delete mode 100644 src/main/java/com/spun/util/ProgessFrame.java rename src/main/java/{com/spun => org/teachingkidsprogramming}/util/SearchingFileFilter.java (92%) diff --git a/src/main/java/com/spun/util/PrintUtils.java b/src/main/java/com/spun/util/PrintUtils.java deleted file mode 100644 index 9dbea15..0000000 --- a/src/main/java/com/spun/util/PrintUtils.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.spun.util; - -import org.teachingkidsprogramming.util.MySystem; - -import java.awt.*; -import javax.swing.*; -import java.awt.print.*; - -public class PrintUtils - implements Printable -{ - private Component componentToBePrinted; - /***********************************************************************/ - - public static void printComponent(Component c) - { - printComponent(c, true); - } - /***********************************************************************/ - - public static void printComponent(Component c, boolean prompt) - { - new PrintUtils(c).print(prompt); - } - /***********************************************************************/ - - public PrintUtils(Component componentToBePrinted) - { - this.componentToBePrinted = componentToBePrinted; - } - /***********************************************************************/ - - public void print(boolean prompt) - { - PrinterJob printJob = PrinterJob.getPrinterJob(); - PageFormat format = printJob.defaultPage(); - Paper paper = format.getPaper(); - paper.setImageableArea(18,0,180,840);// Paper format for receipt printer - format.setPaper(paper); - - - printJob.setPrintable(this,format); - - if (!prompt || printJob.printDialog()) - { - try - { - printJob.print(); - } - catch(PrinterException pe) - { - MySystem.variable("Error printing: " + pe); - } - } - } - /***********************************************************************/ - - public int print(Graphics g, PageFormat pageFormat, int pageIndex) - { - if (pageIndex > 0) - { - return(NO_SUCH_PAGE); - } - else - { - Graphics2D g2d = (Graphics2D)g; - MySystem.variable("width = " + pageFormat.getWidth()); - MySystem.variable("image width = " + pageFormat.getImageableWidth()); - MySystem.variable("getHeight() = " + pageFormat.getHeight()); - - g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY()); - disableDoubleBuffering(componentToBePrinted); - componentToBePrinted.paint(g2d); - enableDoubleBuffering(componentToBePrinted); - return(PAGE_EXISTS); - } - } - /***********************************************************************/ - - public static void disableDoubleBuffering(Component c) - { - RepaintManager currentManager = RepaintManager.currentManager(c); - currentManager.setDoubleBufferingEnabled(false); - } - - /***********************************************************************/ - public static void enableDoubleBuffering(Component c) - { - RepaintManager currentManager = RepaintManager.currentManager(c); - currentManager.setDoubleBufferingEnabled(true); - } - /***********************************************************************/ - /***********************************************************************/ -} diff --git a/src/main/java/com/spun/util/ProgessFrame.java b/src/main/java/com/spun/util/ProgessFrame.java deleted file mode 100644 index a963cad..0000000 --- a/src/main/java/com/spun/util/ProgessFrame.java +++ /dev/null @@ -1,112 +0,0 @@ -package com.spun.util; - -import org.teachingkidsprogramming.util.DateDifference; - -import javax.swing.*; -import java.awt.*; - -/** - * Copyright 1998 American Teleconferencing Services - *
Class Description - *
The is the main Res Frame object - *
- *
API History - *
- *
Revision Information - *
- * $Author:: Lfalco                                           $
- * $Archive:: /Code/com/ats/client/res/ProgessFrame.java      $
- * $Date:: 8/24/99 3:49a                                      $
- * $Revision:: 7                                              $
- * 
- * - */ -public class ProgessFrame extends JDialog -{ - private JLabel progressLabel = null; - private JProgressBar progressBar = null; - private int maxSteps = 0; - private JPanel panel = null; - private boolean forcePainting = true; - private long startTime; - /**************************************************************************/ - public ProgessFrame(Frame frame, String title, String initLabel, int maxSteps) - { - this(frame, title, initLabel, maxSteps, true); - } - /**************************************************************************/ - public ProgessFrame(Frame frame, String title, String initLabel, int maxSteps, boolean forcePainting) - { - super(frame, title, false); - this.maxSteps = maxSteps; - this.forcePainting = forcePainting; - init(initLabel); - } - /**************************************************************************/ - private void init(String initLabel) - { - panel = new JPanel(); - panel.setLayout(null); - panel.setPreferredSize(new Dimension(400, 100)); - progressLabel = new JLabel(initLabel); - progressLabel.setFont(new java.awt.Font("dialog", java.awt.Font.BOLD, 12)); - progressLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - progressLabel.setForeground(new java.awt.Color(0, 0, 156)); - progressLabel.setBounds(30, 20, 340, 20); - panel.add(progressLabel); - progressBar = new JProgressBar(0, maxSteps); - progressBar.setStringPainted(true); - progressLabel.setLabelFor(progressBar); - progressBar.setAlignmentX(CENTER_ALIGNMENT); - progressBar.getAccessibleContext().setAccessibleName("SwingSet loading progress"); - progressBar.setBounds(30, 40, 340, 20); - panel.add(progressBar); - // show the frame - this.setContentPane(panel); - this.pack(); - this.setVisible(true); - WindowUtils.centerWindow(this); - setState(initLabel, 0); - } - /**************************************************************************/ - public void setState(String label, int progress) - { - progressLabel.setText(label); - progressBar.setValue(progress); - if (forcePainting) - { - panel.paintImmediately(panel.getVisibleRect()); - } - else - { - repaint(); - } - if (progress == maxSteps) - { - this.dispose(); - } - } - /**************************************************************************/ - public void start() - { - this.startTime = System.currentTimeMillis(); - } - /**************************************************************************/ - public void setStateWithTime(int progress) - { - long time = (System.currentTimeMillis() - startTime); - double speed = (progress + 1) / (double) time; - long totalTime = (long) (this.maxSteps / speed); - long remainingTime = totalTime - time; - String label = String.format("%s / %s - %s remaining", progress, maxSteps, new DateDifference(remainingTime) - .getStandardTimeText(2)); - setState(label, progress); - } - /**************************************************************************/ - public void setFinished() - { - setState("done", maxSteps); - } - /**************************************************************************/ - /**************************************************************************/ -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/SearchingFileFilterTest.java b/src/main/java/com/spun/util/SearchingFileFilterTest.java index f13be82..e48ffca 100644 --- a/src/main/java/com/spun/util/SearchingFileFilterTest.java +++ b/src/main/java/com/spun/util/SearchingFileFilterTest.java @@ -1,6 +1,7 @@ package com.spun.util; import junit.framework.TestCase; +import org.teachingkidsprogramming.util.SearchingFileFilter; public class SearchingFileFilterTest extends TestCase { diff --git a/src/main/java/org/teachingkidsprogramming/util/ClassUtils.java b/src/main/java/org/teachingkidsprogramming/util/ClassUtils.java index 28399d8..40004ab 100644 --- a/src/main/java/org/teachingkidsprogramming/util/ClassUtils.java +++ b/src/main/java/org/teachingkidsprogramming/util/ClassUtils.java @@ -1,7 +1,5 @@ package org.teachingkidsprogramming.util; -import com.spun.util.SearchingFileFilter; - import java.io.File; import java.util.ArrayList; import java.util.Arrays; diff --git a/src/main/java/com/spun/util/SearchingFileFilter.java b/src/main/java/org/teachingkidsprogramming/util/SearchingFileFilter.java similarity index 92% rename from src/main/java/com/spun/util/SearchingFileFilter.java rename to src/main/java/org/teachingkidsprogramming/util/SearchingFileFilter.java index bef5d4c..ac602bd 100644 --- a/src/main/java/com/spun/util/SearchingFileFilter.java +++ b/src/main/java/org/teachingkidsprogramming/util/SearchingFileFilter.java @@ -1,4 +1,4 @@ -package com.spun.util; +package org.teachingkidsprogramming.util; import java.io.File; import java.io.FilenameFilter; @@ -15,7 +15,7 @@ public SearchingFileFilter(List matches) } public SearchingFileFilter(String... matches) { - ArrayList m = new ArrayList(); + ArrayList m = new ArrayList<>(); m.addAll(Arrays.asList(matches)); this.matches = m; } From 10d062371a613ab9362dd90f877d3f9a0eb2c94c Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Tue, 17 Mar 2015 10:02:11 -0700 Subject: [PATCH 040/111] moved test --- .../util/tests}/SearchingFileFilterTest.java | 2 +- .../util/tests/SearchingFileFilterTest.java | 22 +++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) rename src/main/java/{com/spun/util => org/teachingkidsprogramming/util/tests}/SearchingFileFilterTest.java (94%) create mode 100644 src/test/java/org/teachingkidsprogramming/util/tests/SearchingFileFilterTest.java diff --git a/src/main/java/com/spun/util/SearchingFileFilterTest.java b/src/main/java/org/teachingkidsprogramming/util/tests/SearchingFileFilterTest.java similarity index 94% rename from src/main/java/com/spun/util/SearchingFileFilterTest.java rename to src/main/java/org/teachingkidsprogramming/util/tests/SearchingFileFilterTest.java index e48ffca..64eee53 100644 --- a/src/main/java/com/spun/util/SearchingFileFilterTest.java +++ b/src/main/java/org/teachingkidsprogramming/util/tests/SearchingFileFilterTest.java @@ -1,4 +1,4 @@ -package com.spun.util; +package org.teachingkidsprogramming.util.tests; import junit.framework.TestCase; import org.teachingkidsprogramming.util.SearchingFileFilter; diff --git a/src/test/java/org/teachingkidsprogramming/util/tests/SearchingFileFilterTest.java b/src/test/java/org/teachingkidsprogramming/util/tests/SearchingFileFilterTest.java new file mode 100644 index 0000000..64eee53 --- /dev/null +++ b/src/test/java/org/teachingkidsprogramming/util/tests/SearchingFileFilterTest.java @@ -0,0 +1,22 @@ +package org.teachingkidsprogramming.util.tests; + +import junit.framework.TestCase; +import org.teachingkidsprogramming.util.SearchingFileFilter; + +public class SearchingFileFilterTest extends TestCase +{ + public void testStar() throws Exception + { + assertFalse(new SearchingFileFilter("*","something").accept(".anything", true)); + assertFalse(new SearchingFileFilter("*","something").accept("anythingFile", false)); + assertTrue(new SearchingFileFilter("*","something").accept("anythingDirectory", true)); + assertFalse(new SearchingFileFilter("something").accept("anything", true)); + assertTrue(new SearchingFileFilter("*","temp.htm").accept("temp.htm", false)); + } + public void testFinding() throws Exception + { + assertEquals("[*, temp.htm]", new SearchingFileFilter("*","temp.htm").getSubset("a").toString()); + assertEquals("[b]", new SearchingFileFilter("*","a","b").getSubset("a").toString()); + + } +} From 16f500ac923023f0a8189743959c0015e5114062 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Tue, 17 Mar 2015 10:02:18 -0700 Subject: [PATCH 041/111] . --- .../util/tests/SearchingFileFilterTest.java | 22 ------------------- 1 file changed, 22 deletions(-) delete mode 100644 src/main/java/org/teachingkidsprogramming/util/tests/SearchingFileFilterTest.java diff --git a/src/main/java/org/teachingkidsprogramming/util/tests/SearchingFileFilterTest.java b/src/main/java/org/teachingkidsprogramming/util/tests/SearchingFileFilterTest.java deleted file mode 100644 index 64eee53..0000000 --- a/src/main/java/org/teachingkidsprogramming/util/tests/SearchingFileFilterTest.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.teachingkidsprogramming.util.tests; - -import junit.framework.TestCase; -import org.teachingkidsprogramming.util.SearchingFileFilter; - -public class SearchingFileFilterTest extends TestCase -{ - public void testStar() throws Exception - { - assertFalse(new SearchingFileFilter("*","something").accept(".anything", true)); - assertFalse(new SearchingFileFilter("*","something").accept("anythingFile", false)); - assertTrue(new SearchingFileFilter("*","something").accept("anythingDirectory", true)); - assertFalse(new SearchingFileFilter("something").accept("anything", true)); - assertTrue(new SearchingFileFilter("*","temp.htm").accept("temp.htm", false)); - } - public void testFinding() throws Exception - { - assertEquals("[*, temp.htm]", new SearchingFileFilter("*","temp.htm").getSubset("a").toString()); - assertEquals("[b]", new SearchingFileFilter("*","a","b").getSubset("a").toString()); - - } -} From 44b8a2d0555cf9e0fd07795f135c75ef2ac4b39c Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Tue, 17 Mar 2015 10:09:24 -0700 Subject: [PATCH 042/111] clean, move StringUtils --- .../java/com/spun/util/StateToPostalCode.java | 176 ------ .../spun/util/StringIdentifierGenerator.java | 41 -- src/main/java/com/spun/util/StringUtils.java | 564 ------------------ src/main/java/com/spun/util/TestUtils.java | 1 + .../spun/util/io/TabDelimitedFileReader.java | 2 +- .../java/com/spun/util/parser/MassAmount.java | 2 +- .../com/spun/util/parser/TemplateDate.java | 2 +- .../spun/util/servlets/ValidationError.java | 2 +- .../spun/util/servlets/ValidationTracker.java | 2 +- .../spun/util/velocity/ParserDateUtils.java | 2 +- .../util/velocity/StringResourceLoader.java | 2 +- .../java/org/approvaltests/Approvals.java | 2 +- .../namer/JUnitStackTraceNamer.java | 2 +- .../reporters/DelayedClipboardReporter.java | 2 +- .../utils/VirtualProctor.java | 2 +- .../util/NumberUtils.java | 2 - .../util/PhoneNumber.java | 2 - .../util/StackTraceReflectionResult.java | 2 +- .../util/StringUtils.java | 291 +++++++++ .../logo/tests/ColorGeneration.java | 2 +- 20 files changed, 305 insertions(+), 798 deletions(-) delete mode 100644 src/main/java/com/spun/util/StateToPostalCode.java delete mode 100644 src/main/java/com/spun/util/StringIdentifierGenerator.java delete mode 100644 src/main/java/com/spun/util/StringUtils.java rename src/main/java/{com/spun => org/teachingkidsprogramming}/util/StackTraceReflectionResult.java (93%) create mode 100644 src/main/java/org/teachingkidsprogramming/util/StringUtils.java diff --git a/src/main/java/com/spun/util/StateToPostalCode.java b/src/main/java/com/spun/util/StateToPostalCode.java deleted file mode 100644 index 57d9738..0000000 --- a/src/main/java/com/spun/util/StateToPostalCode.java +++ /dev/null @@ -1,176 +0,0 @@ -package com.spun.util; - -import java.util.HashMap; - -public class StateToPostalCode -{ - /* - * Utility that maps postal code to full state names. - */ - public static final String ALABAMA = "Alabama"; - public static final String ALASKA = "Alaska"; - public static final String ARIZONA = "Arizona"; - public static final String ARKANSAS = "Arkansas"; - public static final String CALIFORNIA = "California"; - public static final String COLORADO = "Colorado"; - public static final String CONNECTICUT = "Connecticut"; - public static final String DELAWARE = "Delaware"; - public static final String DISTRICT_OF_COLUMBIA = "District Of Columbia"; - public static final String FLORIDA = "Florida"; - public static final String GEORGIA = "Georgia"; - public static final String HAWAII = "Hawaii"; - public static final String IDAHO = "Idaho"; - public static final String ILLINOIS = "Illinois"; - public static final String INDIANA = "Indiana"; - public static final String IOWA = "Iowa"; - public static final String KANSAS = "Kansas"; - public static final String KENTUCKY = "Kentucky"; - public static final String LOUISIANA = "Louisiana"; - public static final String MAINE = "Maine"; - public static final String MARYLAND = "Maryland"; - public static final String MASSACHUSETTS = "Massachusetts"; - public static final String MICHIGAN = "Michigan"; - public static final String MINNESOTA = "Minnesota"; - public static final String MISSISSIPPI = "Mississippi"; - public static final String MISSOURI = "Missouri"; - public static final String MONTANA = "Montana"; - public static final String NEBRASKA = "Nebraska"; - public static final String NEVADA = "Nevada"; - public static final String NEW_HAMPSHIRE = "New Hampshire"; - public static final String NEW_JERSEY = "New Jersey"; - public static final String NEW_MEXICO = "New Mexico"; - public static final String NEW_YORK = "New York"; - public static final String NORTH_CAROLINA = "North Carolina"; - public static final String NORTH_DAKOTA = "North Dakota"; - public static final String OHIO = "Ohio"; - public static final String OKLAHOMA = "Oklahoma"; - public static final String OREGON = "Oregon"; - public static final String PENNSYLVANIA = "Pennsylvania"; - public static final String RHODE_ISLAND = "Rhode Island"; - public static final String SOUTH_CAROLINA = "South Carolina"; - public static final String SOUTH_DAKOTA = "South Dakota"; - public static final String TENNESSEE = "Tennessee"; - public static final String TEXAS = "Texas"; - public static final String UTAH = "Utah"; - public static final String VERMONT = "Vermont"; - public static final String VIRGINIA = "Virginia"; - public static final String WASHINGTON = "Washington"; - public static final String WEST_VIRGINIA = "West Virginia"; - public static final String WISCONSIN = "Wisconsin"; - public static final String WYOMING = "Wyoming"; - private static HashMap map = new HashMap(); - private static HashMap map2 = new HashMap(); - static - { - map.put(ALABAMA, "AL"); - map.put(ALASKA, "AK"); - map.put(ARIZONA, "AZ"); - map.put(ARKANSAS, "AR"); - map.put(CALIFORNIA, "CA"); - map.put(COLORADO, "CO"); - map.put(CONNECTICUT, "CT"); - map.put(DELAWARE, "DE"); - map.put(DISTRICT_OF_COLUMBIA, "DC"); - map.put(FLORIDA, "FL"); - map.put(GEORGIA, "GA"); - map.put(HAWAII, "HI"); - map.put(IDAHO, "ID"); - map.put(ILLINOIS, "IL"); - map.put(INDIANA, "IN"); - map.put(IOWA, "IA"); - map.put(KANSAS, "KS"); - map.put(KENTUCKY, "KT"); - map.put(LOUISIANA, "LA"); - map.put(MAINE, "ME"); - map.put(MARYLAND, "MD"); - map.put(MASSACHUSETTS, "MA"); - map.put(MICHIGAN, "MI"); - map.put(MINNESOTA, "MN"); - map.put(MISSISSIPPI, "MS"); - map.put(MISSOURI, "MO"); - map.put(MONTANA, "MT"); - map.put(NEBRASKA, "NE"); - map.put(NEVADA, "NV"); - map.put(NEW_HAMPSHIRE, "NH"); - map.put(NEW_JERSEY, "NJ"); - map.put(NEW_MEXICO, "NM"); - map.put(NEW_YORK, "NY"); - map.put(NORTH_CAROLINA, "NC"); - map.put(NORTH_DAKOTA, "ND"); - map.put(OHIO, "OH"); - map.put(OKLAHOMA, "OK"); - map.put(OREGON, "OR"); - map.put(PENNSYLVANIA, "PA"); - map.put(RHODE_ISLAND, "RI"); - map.put(SOUTH_CAROLINA, "SC"); - map.put(SOUTH_DAKOTA, "SD"); - map.put(TENNESSEE, "TN"); - map.put(TEXAS, "TX"); - map.put(UTAH, "UT"); - map.put(VERMONT, "VT"); - map.put(VIRGINIA, "VA"); - map.put(WASHINGTON, "WA"); - map.put(WEST_VIRGINIA, "WV"); - map.put(WISCONSIN, "WI"); - map.put(WYOMING, "WY"); - map2.put("AL", ALABAMA); - map2.put("AK", ALASKA); - map2.put("AZ", ARIZONA); - map2.put("AR", ARKANSAS); - map2.put("CA", CALIFORNIA); - map2.put("CO", COLORADO); - map2.put("CT", CONNECTICUT); - map2.put("DE", DELAWARE); - map2.put("DC", DISTRICT_OF_COLUMBIA); - map2.put("FL", FLORIDA); - map2.put("GA", GEORGIA); - map2.put("HI", HAWAII); - map2.put("ID", IDAHO); - map2.put("IL", ILLINOIS); - map2.put("IN", INDIANA); - map2.put("IA", IOWA); - map2.put("KS", KANSAS); - map2.put("KT", KENTUCKY); - map2.put("LA", LOUISIANA); - map2.put("ME", MAINE); - map2.put("MD", MARYLAND); - map2.put("MA", MASSACHUSETTS); - map2.put("MI", MICHIGAN); - map2.put("MN", MINNESOTA); - map2.put("MS", MISSISSIPPI); - map2.put("MO", MISSOURI); - map2.put("MT", MONTANA); - map2.put("NE", NEBRASKA); - map2.put("NV", NEVADA); - map2.put("NH", NEW_HAMPSHIRE); - map2.put("NJ", NEW_JERSEY); - map2.put("NM", NEW_MEXICO); - map2.put("NY", NEW_YORK); - map2.put("NC", NORTH_CAROLINA); - map2.put("ND", NORTH_DAKOTA); - map2.put("OH", OHIO); - map2.put("OK", OKLAHOMA); - map2.put("OR", OREGON); - map2.put("PA", PENNSYLVANIA); - map2.put("RI", RHODE_ISLAND); - map2.put("SC", SOUTH_CAROLINA); - map2.put("SD", SOUTH_DAKOTA); - map2.put("TN", TENNESSEE); - map2.put("TX", TEXAS); - map2.put("UT", UTAH); - map2.put("VT", VERMONT); - map2.put("VA", VIRGINIA); - map2.put("WA", WASHINGTON); - map2.put("WV", WEST_VIRGINIA); - map2.put("WI", WISCONSIN); - map2.put("WY", WYOMING); - } - public static String getPostalCodeByStateName(String state) - { - return (String) map.get(state); - } - public static String getStateNameByPostalCode(String code) - { - return (String) map2.get(code); - } -} diff --git a/src/main/java/com/spun/util/StringIdentifierGenerator.java b/src/main/java/com/spun/util/StringIdentifierGenerator.java deleted file mode 100644 index 72ff239..0000000 --- a/src/main/java/com/spun/util/StringIdentifierGenerator.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.spun.util; - -import java.util.Random; - -public class StringIdentifierGenerator -{ - private static final long MAX_RANDOM_LEN = 2176782336L; // 36 ** 6 - private static final long MAX_TIME_SECTION_LEN = 46656L; // 36 ** 3 - private static final long TIC_DIFFERENCE = 2000; - private static final int RANDOM_LENGTH = 6; - private static final int TIME_LENGTH = 3; - private static int counter = 0; - private static long lastTimeValue = 0; - private static Random randomizer = new Random(); - public static synchronized String nextIdentifier() - { - long currentRandom = randomizer.nextLong(); - if (currentRandom < 0) - { - currentRandom = -currentRandom; - } - currentRandom %= MAX_RANDOM_LEN; - currentRandom += MAX_RANDOM_LEN; - long currentTimeValue = 0; - int currentCount = 0; - currentTimeValue = (System.currentTimeMillis() / TIC_DIFFERENCE); - currentTimeValue %= MAX_TIME_SECTION_LEN; - currentTimeValue += MAX_TIME_SECTION_LEN; - if (lastTimeValue != currentTimeValue) - { - lastTimeValue = currentTimeValue; - counter = 0; - } - currentCount = counter++; - StringBuffer id = new StringBuffer(15); - id.append(Long.toString(currentRandom, 36).substring(1)); - id.append(Long.toString(currentTimeValue, 36).substring(1)); - id.append(Long.toString(currentCount, 36)); - return id.toString(); - } -} diff --git a/src/main/java/com/spun/util/StringUtils.java b/src/main/java/com/spun/util/StringUtils.java deleted file mode 100644 index b708fa2..0000000 --- a/src/main/java/com/spun/util/StringUtils.java +++ /dev/null @@ -1,564 +0,0 @@ -package com.spun.util; - -import org.teachingkidsprogramming.util.ObjectUtils; - -import java.io.ByteArrayInputStream; -import java.io.InputStream; -import java.io.UnsupportedEncodingException; -import java.util.Arrays; -import java.util.Map; -import java.util.Properties; -import java.util.Vector; - -/** - * A static class of convenience functions for database access - **/ -public class StringUtils -{ - public static final String NEW_LINE = System.getProperty("line.separator"); - /***********************************************************************/ - public static String toURLEncode(String input) - { - try - { - return input == null ? null : java.net.URLEncoder.encode(input, "UTF-8"); - } - catch (UnsupportedEncodingException e) - { - throw ObjectUtils.throwAsError(e); - } - } - /***********************************************************************/ - public static String loadNullableString(String i) - { - return StringUtils.isNonZero(i) ? i.trim() : null; - } - /***********************************************************************/ - /** - * Decode a URLEncoded input String. - *

- * - * If input is null, URLEncode() will - * return null. - * - * @see java.net.URLDecoder - */ - public static String URLDecode(String input) - { - try - { - return input == null ? null : java.net.URLDecoder.decode(input, "UTF-8"); - } - catch (Exception e) - { - return null; - } - } - /************************************************************************/ - public static String[] split(String string, String splitOn) - { - return split(string, splitOn, true); - } - /************************************************************************/ - public static String[] split(String string, String splitOn, boolean trim) - { - if ((string == null) || (splitOn == null) || (splitOn.length() < 1)) { return null; } - Vector temp = new Vector(); - int length = splitOn.length(); - int start = 0; - int next = 0; - while (next != -1) - { - String word = null; - next = string.indexOf(splitOn, start); - if (next == -1) - { - word = string.substring(start); - } - else - { - word = string.substring(start, next); - start = next + length; - } - temp.add(trim ? word.trim() : word); - } - return toArray(temp); - } - /************************************************************************/ - public static String replace(String string, String find, String replace) - { - if ((string == null) || (find == null) || (replace == null)) { throw new NullPointerException(String.format( - "[string,find,replace] = [%s,%s,%s]", string, find, replace)); } - String parts[] = split(string, find, false); - if (parts.length == 1) { return string; } - String result = ""; - for (int i = 0; i < parts.length; i++) - { - result += parts[i] + replace; - } - return result.substring(0, result.length() - replace.length()); - } - /***********************************************************************/ - public static String stripWhiteSpace(String text) - { - return stripWhiteSpace(text, false); - } - /***********************************************************************/ - public static String padNumber(long number, int digits) - { - String text = "" + number; - while (text.length() < digits) - { - text = "0" + text; - } - return text; - } - /***********************************************************************/ - public static String padNumber(int number, int digits) - { - return padNumber((long) number, digits); - } - /***********************************************************************/ - public static String stripWhiteSpace(String text, boolean all) - { - StringBuffer newText = new StringBuffer(); - boolean whitespace = false; - int num = text.length(); - char whiteSpaceChar = ' '; - boolean atStart = true; - for (int i = 0; i < num; i++) - { - char c = text.charAt(i); - switch (c) - { - case '\r' : - case '\n' : - whiteSpaceChar = '\n'; - whitespace = true; - break; - case '\t' : - case ' ' : - whitespace = true; - break; - default : - if (whitespace && atStart) - { - whitespace = false; - } - if (whitespace) - { - whitespace = false; - newText.append(all ? '_' : whiteSpaceChar); - whiteSpaceChar = ' '; - } - atStart = false; - newText.append(c); - break; - } - } - return newText.toString(); - } - /************************************************************************/ - /** - * Turns "mr. frank m Peter" into "Mr. Frank M Peter" - **/ - public static String toNameUpperCase(String name) - { - if (name == null) { return null; } - StringBuffer returning = new StringBuffer(name.length()); - String upper = name.toUpperCase(); - int place = 0; - while (place < name.length()) - { - char letter = name.charAt(place); - if (letter == ' ') - { - returning.append(' '); - if ((place + 1) < name.length()) - { - returning.append(upper.charAt(++place)); - } - } - else if ((place == 0)) - { - returning.append(upper.charAt(0)); - } - else - { - returning.append(letter); - } - place++; - } - return returning.toString(); - } - /************************************************************************/ - public static String toConvertCamelCaseString(String varName, String insertBeforeCaps) - { - StringBuffer staticVarName = new StringBuffer(); - for (int i = 0; i < varName.length(); i++) - { - char letter = varName.charAt(i); - if ((i > 0) && (letter == Character.toUpperCase(letter)) && Character.isLetter(letter)) - { - staticVarName.append(insertBeforeCaps); - } - staticVarName.append(letter); - } - return staticVarName.toString(); - } - /************************************************************************/ - /** - * Turns "ATTRIUBE_NAME" into "AttributeName" - **/ - public static String toMethodNameCase(String name) - { - StringBuffer returning = new StringBuffer(name.length()); - String upper = name.toUpperCase(); - String lower = name.toLowerCase(); - int place = 0; - while (place < name.length()) - { - char letter = lower.charAt(place); - if (letter == ' ' || letter == '_') - { - if ((place + 1) < name.length()) - { - returning.append(upper.charAt(++place)); - } - } - else if ((place == 0)) - { - returning.append(upper.charAt(0)); - } - else - { - returning.append(letter); - } - place++; - } - return returning.toString(); - } - /************************************************************************/ - public static String stripNonNumeric(String number) - { - return stripNonNumeric(number, false, false); - } - /************************************************************************/ - public static String stripCharacters(String dirtyString, String toStrip) - { - StringBuffer cleanStringBuffer = new StringBuffer(); - for (int i = 0; i < dirtyString.length(); i++) - { - char currentChar = dirtyString.charAt(i); - if (toStrip.indexOf(currentChar) == -1) - { - cleanStringBuffer.append(currentChar); - } - } - return cleanStringBuffer.toString(); - } - public static String escapeForXml(String string) - { - return string.replaceAll("&", "&"); - } - /************************************************************************/ - public static String stripNonNumeric(String number, boolean allowDecimal, boolean allowNegative) - { - boolean allowExponential = allowDecimal; - boolean afterE = false; - if (number == null) { return ""; } - StringBuffer result = new StringBuffer(); - for (int i = 0; i < number.length(); i++) - { - char c = number.charAt(i); - switch (c) - { - case '0' : - case '1' : - case '2' : - case '3' : - case '4' : - case '5' : - case '6' : - case '7' : - case '8' : - case '9' : - result.append(c); - afterE = false; - break; - case '-' : - if (allowNegative || afterE) - { - result.append(c); - allowNegative = false; - } - break; - case '.' : - if (allowDecimal) - { - result.append(c); - allowDecimal = false; - } - afterE = false; - break; - case 'e' : - case 'E' : - if (allowExponential) - { - result.append(c); - allowExponential = false; - } - afterE = true; - break; - default : - break; - } - } - return result.toString(); - } - /***********************************************************************/ - /** - * A convenience function to check that a String has at least 1 character. - * - * @param string - * The string in question - * @return true if Non Zero. - **/ - public static boolean isNonZero(String string) - { - return ((string != null) && string.trim().length() > 0); - } - /***********************************************************************/ - public static boolean isEmpty(String string) - { - return !isNonZero(string); - } - /************************************************************************/ - /** - * A convenience function to turn a vector of String objects into an Array - * of the String objects. - * - * @param vectorOf - * a Vector of String objects - * @return the array of String. - * @throws Error - * if an element of vectorOf is not a String object. - **/ - public static String[] toArray(java.util.Collection vectorOf) - { - if (vectorOf == null) { return new String[0]; } - String array[] = new String[vectorOf.size()]; - java.util.Iterator iterator = vectorOf.iterator(); - int i = 0; - while (iterator.hasNext()) - { - java.lang.Object rowObject = iterator.next(); - if (rowObject instanceof String) - { - array[i++] = (String) rowObject; - } - else - { - throw new Error("toArray[" + i + "] is not an instance of String but a " - + ObjectUtils.getClassName(rowObject)); - } - } - return array; - } - /***********************************************************************/ - public static int resolveEnumeration(String value, String[] enumeration) - { - return resolveEnumeration(value, enumeration, false); - } - /***********************************************************************/ - public static int resolveEnumeration(String value, String[] enumeration, boolean force) - { - for (int i = 0; i < enumeration.length; i++) - { - if (enumeration[i].equals(value)) { return i; } - } - if (force) { throw new Error("Enumeration '" + value + "' not in " + Arrays.asList(enumeration).toString()); } - return -1; - } - /***********************************************************************/ - public static String truncate(String string, int maxLength) - { - if (string == null) { return null; } - return (string.length() <= maxLength) ? string : string.substring(0, maxLength); - } - /***********************************************************************/ - public static boolean hasNumeric(String teamId) - { - return isNonZero(stripNonNumeric(teamId, false, false)); - } - /***********************************************************************/ - public static String toHTMLEncode(String string) - { - if (string == null) { return null; } - string = string.replaceAll("<", "<"); - string = string.replaceAll("\n", "
"); - return string; - } - /***********************************************************************/ - public static String toJavaScriptEncode(String string) - { - if (string == null) { return "null"; } - string = string.replaceAll("\"", "\\\\\""); - string = string.replaceAll("\r", "\\\\r"); - string = string.replaceAll("\n", "\\\\n"); - return "\"" + string + "\""; - } - /***********************************************************************/ - public static boolean isIn(String target, String... fromList) - { - return Arrays.asList(fromList).contains(target); - } - /***********************************************************************/ - public static boolean isIn(String target, String[] fromList, boolean allowNulls) - { - return (target == null && allowNulls) ? true : isIn(target, fromList); - } - /************************************************************************/ - public static void assertIn(String target, String[] fromList, boolean allowNulls) - { - boolean valid = isIn(target, fromList, allowNulls); - if (!valid) { throw new IllegalArgumentException("The value '" + target + "' not in " - + Arrays.asList(fromList)); } - } - public static void assertIn(String target, boolean allowNulls, String... options) - { - assertIn(target, options, allowNulls); - } - /************************************************************************/ - /** - * 'Tom S Hardy' -> 'Tom S' - 'Hardy' - **/ - public static String[] splitName(String fullName) - { - String names[] = {null, null}; - int split = fullName.lastIndexOf(' '); - if (split != -1) - { - names[0] = fullName.substring(0, split); - names[1] = fullName.substring(split); - } - else - { - names[1] = fullName; - } - return names; - } - /***********************************************************************/ - public static Properties createProperties(String[] properties) - { - Properties props = new Properties(); - if (properties == null) { return props; } - if (properties.length % 2 != 0) { throw new Error("number of strings must be even. found [" - + properties.length + "] = " + Arrays.asList(properties)); } - for (int i = 0; i < properties.length; i += 2) - { - if (properties[i + 1] != null) - { - props.setProperty(properties[i], properties[i + 1]); - } - else - { - props.setProperty(properties[i], ""); - } - } - return props; - } - /***********************************************************************/ - public static String toString(String name, T[] array) - { - StringBuffer buffer = new StringBuffer(); - name = (name == null ? "array" : name); - if (array == null || array.length == 0) - { - buffer.append(name + ".length = 0"); - } - else - { - int maxPadding = ("" + array.length).length(); - for (int i = 0; i < array.length; i++) - { - buffer.append(name + "[" + padNumber(i, maxPadding) + "] = " + array[i] + "\r\n"); - } - } - return buffer.toString(); - } - /***********************************************************************/ - public static String toString(String name, Iterable array) - { - StringBuffer buffer = new StringBuffer(); - name = (name == null ? "array" : name); - if (array != null) - { - int count = 0; - for (T t : array) - { - buffer.append(name + "[" + count + "] = " + arrayStringHelper(t) + "\r\n"); - count++; - } - } - if (buffer.length() == 0) - { - buffer.append(name + ".length = 0"); - } - return buffer.toString(); - } - public static String arrayStringHelper(Object o) - { - if (o == null) { return "null"; } - return o.getClass().isArray() ? Arrays.toString((Object[]) o) : o.toString(); - } - /***********************************************************************/ - public static String getFirstName(String fullName) - { - return splitName(fullName)[0]; - } - /***********************************************************************/ - public static String getLastName(String fullName) - { - return splitName(fullName)[1]; - } - /************************************************************************/ - public static boolean isLengthWithin(String string, int length) - { - return string == null || string.length() <= length; - } - /************************************************************************/ - public static boolean equalsIgnoreCase(String one, String two) - { - return (one == two || (one != null && one.equalsIgnoreCase(two))); - } - /***********************************************************************/ - public static StringBuffer trim(StringBuffer buffer, int i) - { - if (buffer == null || buffer.length() < i) { return buffer; } - buffer.setLength(buffer.length() - i); - return buffer; - } - /***********************************************************************/ - public static String join(String first, String joinBy, String second) - { - return isEmpty(second) ? first : first + joinBy + second; - } - /***********************************************************************/ - /***********************************************************************/ - public static InputStream convertToInputStream(String string) - { - return new ByteArrayInputStream(string.getBytes()); - } - public static String toString(Map map) - { - StringBuffer b = new StringBuffer(); - Object keySet[] = map.keySet().toArray(); - Arrays.sort(keySet); - for (Object key : keySet) - { - b.append(String.format("%s : %s \r\n", key, map.get(key))); - } - return b.toString(); - } -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/TestUtils.java b/src/main/java/com/spun/util/TestUtils.java index abdb403..9ba41e5 100644 --- a/src/main/java/com/spun/util/TestUtils.java +++ b/src/main/java/com/spun/util/TestUtils.java @@ -23,6 +23,7 @@ import com.spun.util.io.StackElementSelector; import org.teachingkidsprogramming.util.ClassUtils; import org.teachingkidsprogramming.util.ObjectUtils; +import org.teachingkidsprogramming.util.StackTraceReflectionResult; public class TestUtils { diff --git a/src/main/java/com/spun/util/io/TabDelimitedFileReader.java b/src/main/java/com/spun/util/io/TabDelimitedFileReader.java index 8ea4b81..12c037f 100644 --- a/src/main/java/com/spun/util/io/TabDelimitedFileReader.java +++ b/src/main/java/com/spun/util/io/TabDelimitedFileReader.java @@ -5,7 +5,7 @@ import java.io.FileReader; import java.io.IOException; -import com.spun.util.StringUtils; +import org.teachingkidsprogramming.util.StringUtils; /** * A static class of convence functions for Files diff --git a/src/main/java/com/spun/util/parser/MassAmount.java b/src/main/java/com/spun/util/parser/MassAmount.java index 0a58932..56232c5 100644 --- a/src/main/java/com/spun/util/parser/MassAmount.java +++ b/src/main/java/com/spun/util/parser/MassAmount.java @@ -1,6 +1,6 @@ package com.spun.util.parser; -import com.spun.util.StringUtils; +import org.teachingkidsprogramming.util.StringUtils; public class MassAmount extends TemplateDouble { diff --git a/src/main/java/com/spun/util/parser/TemplateDate.java b/src/main/java/com/spun/util/parser/TemplateDate.java index 18c9013..26d7f4c 100644 --- a/src/main/java/com/spun/util/parser/TemplateDate.java +++ b/src/main/java/com/spun/util/parser/TemplateDate.java @@ -8,7 +8,7 @@ import java.util.TimeZone; import org.teachingkidsprogramming.util.DateDifference; import org.teachingkidsprogramming.util.DateUtils; -import com.spun.util.StringUtils; +import org.teachingkidsprogramming.util.StringUtils; public class TemplateDate { diff --git a/src/main/java/com/spun/util/servlets/ValidationError.java b/src/main/java/com/spun/util/servlets/ValidationError.java index b581521..73f0089 100644 --- a/src/main/java/com/spun/util/servlets/ValidationError.java +++ b/src/main/java/com/spun/util/servlets/ValidationError.java @@ -4,7 +4,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; -import com.spun.util.StringUtils; +import org.teachingkidsprogramming.util.StringUtils; public class ValidationError extends RuntimeException { private static final long serialVersionUID = 7940285202708976073L; diff --git a/src/main/java/com/spun/util/servlets/ValidationTracker.java b/src/main/java/com/spun/util/servlets/ValidationTracker.java index 945e25f..552ddbd 100644 --- a/src/main/java/com/spun/util/servlets/ValidationTracker.java +++ b/src/main/java/com/spun/util/servlets/ValidationTracker.java @@ -3,7 +3,7 @@ import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; -import com.spun.util.StringUtils; +import org.teachingkidsprogramming.util.StringUtils; public class ValidationTracker implements Serializable { diff --git a/src/main/java/com/spun/util/velocity/ParserDateUtils.java b/src/main/java/com/spun/util/velocity/ParserDateUtils.java index f2266d2..7c9c664 100644 --- a/src/main/java/com/spun/util/velocity/ParserDateUtils.java +++ b/src/main/java/com/spun/util/velocity/ParserDateUtils.java @@ -2,7 +2,7 @@ import java.util.Calendar; import org.teachingkidsprogramming.util.DateUtils; -import com.spun.util.StringUtils; +import org.teachingkidsprogramming.util.StringUtils; /***********************************************************************/ public class ParserDateUtils diff --git a/src/main/java/com/spun/util/velocity/StringResourceLoader.java b/src/main/java/com/spun/util/velocity/StringResourceLoader.java index c6e6a7a..db57c55 100644 --- a/src/main/java/com/spun/util/velocity/StringResourceLoader.java +++ b/src/main/java/com/spun/util/velocity/StringResourceLoader.java @@ -22,7 +22,7 @@ import org.apache.velocity.runtime.resource.Resource; import org.apache.velocity.runtime.resource.loader.ResourceLoader; -import com.spun.util.StringUtils; +import org.teachingkidsprogramming.util.StringUtils; /** * This is a simple resource loader that loads the string as a template diff --git a/src/main/java/org/approvaltests/Approvals.java b/src/main/java/org/approvaltests/Approvals.java index 5872959..3f0e4b6 100644 --- a/src/main/java/org/approvaltests/Approvals.java +++ b/src/main/java/org/approvaltests/Approvals.java @@ -23,7 +23,7 @@ import org.teachingkidsprogramming.util.ArrayUtils; import org.teachingkidsprogramming.util.ObjectUtils; -import com.spun.util.StringUtils; +import org.teachingkidsprogramming.util.StringUtils; public class Approvals { public static void verify(String response) throws Exception { diff --git a/src/main/java/org/approvaltests/namer/JUnitStackTraceNamer.java b/src/main/java/org/approvaltests/namer/JUnitStackTraceNamer.java index a3dd5f3..f88abdf 100644 --- a/src/main/java/org/approvaltests/namer/JUnitStackTraceNamer.java +++ b/src/main/java/org/approvaltests/namer/JUnitStackTraceNamer.java @@ -8,7 +8,7 @@ import org.junit.Test; import org.teachingkidsprogramming.util.ObjectUtils; -import com.spun.util.StackTraceReflectionResult; +import org.teachingkidsprogramming.util.StackTraceReflectionResult; import com.spun.util.TestUtils; import com.spun.util.io.StackElementSelector; diff --git a/src/main/java/org/approvaltests/reporters/DelayedClipboardReporter.java b/src/main/java/org/approvaltests/reporters/DelayedClipboardReporter.java index ce50c2a..6bfd056 100644 --- a/src/main/java/org/approvaltests/reporters/DelayedClipboardReporter.java +++ b/src/main/java/org/approvaltests/reporters/DelayedClipboardReporter.java @@ -2,7 +2,7 @@ import java.awt.GraphicsEnvironment; -import com.spun.util.StringUtils; +import org.teachingkidsprogramming.util.StringUtils; import com.spun.util.WindowUtils; /** diff --git a/src/main/java/org/teachingextensions/utils/VirtualProctor.java b/src/main/java/org/teachingextensions/utils/VirtualProctor.java index 39e5e7e..3ee4b87 100644 --- a/src/main/java/org/teachingextensions/utils/VirtualProctor.java +++ b/src/main/java/org/teachingextensions/utils/VirtualProctor.java @@ -2,7 +2,7 @@ import java.io.File; -import com.spun.util.StringUtils; +import org.teachingkidsprogramming.util.StringUtils; import com.spun.util.io.FileUtils; /** diff --git a/src/main/java/org/teachingkidsprogramming/util/NumberUtils.java b/src/main/java/org/teachingkidsprogramming/util/NumberUtils.java index dc39bf2..89a55db 100644 --- a/src/main/java/org/teachingkidsprogramming/util/NumberUtils.java +++ b/src/main/java/org/teachingkidsprogramming/util/NumberUtils.java @@ -1,7 +1,5 @@ package org.teachingkidsprogramming.util; -import com.spun.util.StringUtils; - import java.lang.reflect.Method; import java.util.Random; diff --git a/src/main/java/org/teachingkidsprogramming/util/PhoneNumber.java b/src/main/java/org/teachingkidsprogramming/util/PhoneNumber.java index 4ba564b..721f19f 100644 --- a/src/main/java/org/teachingkidsprogramming/util/PhoneNumber.java +++ b/src/main/java/org/teachingkidsprogramming/util/PhoneNumber.java @@ -1,8 +1,6 @@ package org.teachingkidsprogramming.util; -import com.spun.util.StringUtils; - /** * Phone number validation, and formatter. * this class is immutable. diff --git a/src/main/java/com/spun/util/StackTraceReflectionResult.java b/src/main/java/org/teachingkidsprogramming/util/StackTraceReflectionResult.java similarity index 93% rename from src/main/java/com/spun/util/StackTraceReflectionResult.java rename to src/main/java/org/teachingkidsprogramming/util/StackTraceReflectionResult.java index d4cfd63..45a888b 100644 --- a/src/main/java/com/spun/util/StackTraceReflectionResult.java +++ b/src/main/java/org/teachingkidsprogramming/util/StackTraceReflectionResult.java @@ -1,4 +1,4 @@ -package com.spun.util; +package org.teachingkidsprogramming.util; import java.io.File; diff --git a/src/main/java/org/teachingkidsprogramming/util/StringUtils.java b/src/main/java/org/teachingkidsprogramming/util/StringUtils.java new file mode 100644 index 0000000..20d3bb8 --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/util/StringUtils.java @@ -0,0 +1,291 @@ +package org.teachingkidsprogramming.util; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.util.Arrays; +import java.util.Map; +import java.util.Vector; + +/** + * A static class of convenience functions for database access + */ +public class StringUtils { + public static final String NEW_LINE = System.getProperty("line.separator"); + + /** + * ******************************************************************* + */ + public static String loadNullableString(String i) { + return StringUtils.isNonZero(i) ? i.trim() : null; + } + /***********************************************************************/ + /** + * ******************************************************************** + */ + public static String[] split(String string, String splitOn, boolean trim) { + if ((string == null) || (splitOn == null) || (splitOn.length() < 1)) { + return null; + } + Vector temp = new Vector<>(); + int length = splitOn.length(); + int start = 0; + int next = 0; + while (next != -1) { + String word; + next = string.indexOf(splitOn, start); + if (next == -1) { + word = string.substring(start); + } else { + word = string.substring(start, next); + start = next + length; + } + temp.add(trim ? word.trim() : word); + } + return toArray(temp); + } + + /** + * ******************************************************************* + */ + public static String stripWhiteSpace(String text) { + return stripWhiteSpace(text, false); + } + + /** + * ******************************************************************* + */ + public static String padNumber(long number, int digits) { + String text = "" + number; + while (text.length() < digits) { + text = "0" + text; + } + return text; + } + + /** + * ******************************************************************* + */ + public static String padNumber(int number, int digits) { + return padNumber((long) number, digits); + } + + /** + * ******************************************************************* + */ + public static String stripWhiteSpace(String text, boolean all) { + StringBuilder newText = new StringBuilder(); + boolean whitespace = false; + int num = text.length(); + char whiteSpaceChar = ' '; + boolean atStart = true; + for (int i = 0; i < num; i++) { + char c = text.charAt(i); + switch (c) { + case '\r': + case '\n': + whiteSpaceChar = '\n'; + whitespace = true; + break; + case '\t': + case ' ': + whitespace = true; + break; + default: + if (whitespace && atStart) { + whitespace = false; + } + if (whitespace) { + whitespace = false; + newText.append(all ? '_' : whiteSpaceChar); + whiteSpaceChar = ' '; + } + atStart = false; + newText.append(c); + break; + } + } + return newText.toString(); + } + /************************************************************************/ + /************************************************************************/ + /** + * ******************************************************************** + */ + public static String stripNonNumeric(String number, boolean allowDecimal, boolean allowNegative) { + boolean allowExponential = allowDecimal; + boolean afterE = false; + if (number == null) { + return ""; + } + StringBuilder result = new StringBuilder(); + for (int i = 0; i < number.length(); i++) { + char c = number.charAt(i); + switch (c) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + result.append(c); + afterE = false; + break; + case '-': + if (allowNegative || afterE) { + result.append(c); + allowNegative = false; + } + break; + case '.': + if (allowDecimal) { + result.append(c); + allowDecimal = false; + } + afterE = false; + break; + case 'e': + case 'E': + if (allowExponential) { + result.append(c); + allowExponential = false; + } + afterE = true; + break; + default: + break; + } + } + return result.toString(); + } + /***********************************************************************/ + /** + * A convenience function to check that a String has at least 1 character. + * + * @param string The string in question + * @return true if Non Zero. + */ + public static boolean isNonZero(String string) { + return ((string != null) && string.trim().length() > 0); + } + + /** + * ******************************************************************* + */ + public static boolean isEmpty(String string) { + return !isNonZero(string); + } + /************************************************************************/ + /** + * A convenience function to turn a vector of String objects into an Array + * of the String objects. + * + * @param vectorOf a Vector of String objects + * @return the array of String. + * @throws Error if an element of vectorOf is not a String object. + */ + public static String[] toArray(java.util.Collection vectorOf) { + if (vectorOf == null) { + return new String[0]; + } + String array[] = new String[vectorOf.size()]; + java.util.Iterator iterator = vectorOf.iterator(); + int i = 0; + while (iterator.hasNext()) { + String rowObject = iterator.next(); + if (rowObject != null) { + array[i++] = rowObject; + } else { + throw new Error("toArray[" + i + "] is not an instance of String but a " + + ObjectUtils.getClassName(null)); + } + } + return array; + } + + /** + * ******************************************************************* + */ + public static int resolveEnumeration(String value, String[] enumeration) { + return resolveEnumeration(value, enumeration, false); + } + + /** + * ******************************************************************* + */ + public static int resolveEnumeration(String value, String[] enumeration, boolean force) { + for (int i = 0; i < enumeration.length; i++) { + if (enumeration[i].equals(value)) { + return i; + } + } + if (force) { + throw new Error("Enumeration '" + value + "' not in " + Arrays.asList(enumeration).toString()); + } + return -1; + } + + /** + * ******************************************************************* + */ + public static String toString(String name, T[] array) { + StringBuilder buffer = new StringBuilder(); + name = (name == null ? "array" : name); + if (array == null || array.length == 0) { + buffer.append(name).append(".length = 0"); + } else { + int maxPadding = ("" + array.length).length(); + for (int i = 0; i < array.length; i++) { + buffer.append(name).append("[").append(padNumber(i, maxPadding)).append("] = ").append(array[i]).append("\r\n"); + } + } + return buffer.toString(); + } + + /** + * ******************************************************************* + */ + public static String toString(String name, Iterable array) { + StringBuilder buffer = new StringBuilder(); + name = (name == null ? "array" : name); + if (array != null) { + int count = 0; + for (T t : array) { + buffer.append(name).append("[").append(count).append("] = ").append(arrayStringHelper(t)).append("\r\n"); + count++; + } + } + if (buffer.length() == 0) { + buffer.append(name).append(".length = 0"); + } + return buffer.toString(); + } + + public static String arrayStringHelper(Object o) { + if (o == null) { + return "null"; + } + return o.getClass().isArray() ? Arrays.toString((Object[]) o) : o.toString(); + } + + /***********************************************************************/ + /** + * ******************************************************************* + */ + public static InputStream convertToInputStream(String string) { + return new ByteArrayInputStream(string.getBytes()); + } + + public static String toString(Map map) { + StringBuilder b = new StringBuilder(); + Object keySet[] = map.keySet().toArray(); + Arrays.sort(keySet); + for (Object key : keySet) { + b.append(String.format("%s : %s \r\n", key, map.get(key))); + } + return b.toString(); + } +} \ No newline at end of file diff --git a/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.java b/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.java index a4ceba7..20b7edd 100644 --- a/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.java +++ b/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.java @@ -15,7 +15,7 @@ import org.approvaltests.reporters.UseReporter; import org.approvaltests.reporters.windows.TortoiseTextDiffReporter; -import com.spun.util.StringUtils; +import org.teachingkidsprogramming.util.StringUtils; import com.spun.util.TestUtils; import com.spun.util.Tuple; import com.spun.util.io.FileUtils; From cb96200e29f6b98d46fc89c92bda3024dbf2d85a Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Tue, 17 Mar 2015 10:11:10 -0700 Subject: [PATCH 043/111] clean, move SystemUtils --- src/main/java/com/spun/util/SystemUtils.java | 30 ------------------- .../reporters/ClipboardReporter.java | 4 +-- .../teachingextensions/setup/SetupConfig.java | 4 +-- .../setup/ThumbDriveInstaller.java | 4 +-- .../util/SystemUtils.java | 12 ++++++++ 5 files changed, 18 insertions(+), 36 deletions(-) delete mode 100644 src/main/java/com/spun/util/SystemUtils.java create mode 100644 src/main/java/org/teachingkidsprogramming/util/SystemUtils.java diff --git a/src/main/java/com/spun/util/SystemUtils.java b/src/main/java/com/spun/util/SystemUtils.java deleted file mode 100644 index 400e39f..0000000 --- a/src/main/java/com/spun/util/SystemUtils.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.spun.util; - -import java.io.File; - -public class SystemUtils -{ - public static boolean isWindowsEnviroment() - { - return "\\".equals(File.separator); - } - public static String convertFileForCommandLine(String fileName) - { - return convertFileForCommandLine(fileName, SystemUtils.isWindowsEnviroment()); - } - public static String convertFileForCommandLine(String fileName, boolean windowsOs) - { - if (!fileName.contains(" ")) - { - return fileName; - } - else if (windowsOs) - { - return String.format("\"%s\"", fileName); - } - else - { - return fileName.replace(" ", "\\ "); - } - } -} diff --git a/src/main/java/org/approvaltests/reporters/ClipboardReporter.java b/src/main/java/org/approvaltests/reporters/ClipboardReporter.java index 1bcef2d..34f1714 100644 --- a/src/main/java/org/approvaltests/reporters/ClipboardReporter.java +++ b/src/main/java/org/approvaltests/reporters/ClipboardReporter.java @@ -3,7 +3,7 @@ import java.awt.GraphicsEnvironment; import java.io.File; -import com.spun.util.SystemUtils; +import org.teachingkidsprogramming.util.SystemUtils; import com.spun.util.WindowUtils; /** @@ -35,7 +35,7 @@ public boolean isWorkingInThisEnvironment(String forFile) } public static String getAcceptApprovalText(String received, String approved) { - if (SystemUtils.isWindowsEnviroment()) + if (SystemUtils.isWindowsEnvironment()) { return String.format("move /Y \"%s\" \"%s\"", received, approved); } diff --git a/src/main/java/org/teachingextensions/setup/SetupConfig.java b/src/main/java/org/teachingextensions/setup/SetupConfig.java index 71a7aac..1a75810 100644 --- a/src/main/java/org/teachingextensions/setup/SetupConfig.java +++ b/src/main/java/org/teachingextensions/setup/SetupConfig.java @@ -2,7 +2,7 @@ import org.teachingextensions.setup.SetupValidator.SetupCheckPoints; -import com.spun.util.SystemUtils; +import org.teachingkidsprogramming.util.SystemUtils; import com.spun.util.servlets.ValidationError; public class SetupConfig @@ -10,7 +10,7 @@ public class SetupConfig public ValidationError setup = new ValidationError(SetupCheckPoints.values()); public String workspacePath = "."; //"C:\\Users\\Llewellyn\\workspace\\ApprovalTestsKoans\\TeachingKidsProgramming.Java"; - public String eclipsePath = SystemUtils.isWindowsEnviroment() + public String eclipsePath = SystemUtils.isWindowsEnvironment() ? eclipsePathWindows : eclipsePathMac; public static String eclipsePathWindows = "c:\\eclipse\\eclipse.exe"; diff --git a/src/main/java/org/teachingextensions/setup/ThumbDriveInstaller.java b/src/main/java/org/teachingextensions/setup/ThumbDriveInstaller.java index c1344dd..068feb2 100644 --- a/src/main/java/org/teachingextensions/setup/ThumbDriveInstaller.java +++ b/src/main/java/org/teachingextensions/setup/ThumbDriveInstaller.java @@ -1,6 +1,6 @@ package org.teachingextensions.setup; -import com.spun.util.SystemUtils; +import org.teachingkidsprogramming.util.SystemUtils; public class ThumbDriveInstaller { @@ -10,7 +10,7 @@ public static void main(String[] args) throws Exception } private static void installForThumbDrive() throws Exception { - if (SystemUtils.isWindowsEnviroment()) + if (SystemUtils.isWindowsEnvironment()) { new WindowsThumbDriveInstaller().install(); } diff --git a/src/main/java/org/teachingkidsprogramming/util/SystemUtils.java b/src/main/java/org/teachingkidsprogramming/util/SystemUtils.java new file mode 100644 index 0000000..68e23d0 --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/util/SystemUtils.java @@ -0,0 +1,12 @@ +package org.teachingkidsprogramming.util; + +import java.io.File; + +public class SystemUtils +{ + public static boolean isWindowsEnvironment() + { + return "\\".equals(File.separator); + } + +} From 0e7d5f4b1cda2c8b1c6d7b187b5a9195ed8643d3 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Tue, 17 Mar 2015 10:14:35 -0700 Subject: [PATCH 044/111] clean, move TestUtils --- src/main/java/com/spun/util/TestUtils.java | 275 ------------------ .../namer/JUnitStackTraceNamer.java | 2 +- .../reporters/FileLauncherReporter.java | 2 +- .../reporters/ImageWebReporter.java | 2 +- .../reporters/TextWebReporter.java | 2 +- .../org/teachingextensions/utils/Viewer.java | 2 +- .../util/TestUtils.java | 91 ++++++ .../logo/tests/ColorGeneration.java | 2 +- 8 files changed, 97 insertions(+), 281 deletions(-) delete mode 100644 src/main/java/com/spun/util/TestUtils.java create mode 100644 src/main/java/org/teachingkidsprogramming/util/TestUtils.java diff --git a/src/main/java/com/spun/util/TestUtils.java b/src/main/java/com/spun/util/TestUtils.java deleted file mode 100644 index 9ba41e5..0000000 --- a/src/main/java/com/spun/util/TestUtils.java +++ /dev/null @@ -1,275 +0,0 @@ -package com.spun.util; - -import java.awt.image.BufferedImage; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.lang.reflect.Method; -import java.util.Arrays; -import java.util.List; -import java.util.Random; - -import javax.mail.Message; -import javax.swing.JFileChooser; -import javax.swing.JFrame; - -import junit.framework.TestCase; - -import org.teachingkidsprogramming.util.ArrayUtils; -//import com.spun.util.images.ImageWriter; -import com.spun.util.io.FileUtils; -import com.spun.util.io.StackElementLevelSelector; -import com.spun.util.io.StackElementSelector; -import org.teachingkidsprogramming.util.ClassUtils; -import org.teachingkidsprogramming.util.ObjectUtils; -import org.teachingkidsprogramming.util.StackTraceReflectionResult; - -public class TestUtils -{ - private static Random random; - public static final String INTERNET_EXPLORER = "\"C:\\Program Files\\Internet Explorer\\iexplore.exe\" "; - /***********************************************************************/ - public static File getFile(String startingDir) - { - JFrame frame = new JFrame(); - WindowUtils.testFrame(frame, false); - JFileChooser chooser = new JFileChooser(); - chooser.setCurrentDirectory(new File(startingDir)); - int returnVal = chooser.showOpenDialog(frame); - File returning = null; - if (returnVal == JFileChooser.APPROVE_OPTION) - { - returning = chooser.getSelectedFile(); - } - frame.dispose(); - return returning; - } - /***********************************************************************/ - public static void displayXml(String htmlOutput) - { - try - { - displayHtml(null, ".xml", htmlOutput, 3); - } - catch (Exception e) - { - throw ObjectUtils.throwAsError(e); - } - } - /***********************************************************************/ - public static String getRandomString() - { - if (random == null) - { - random = new Random(); - } - return Long.toString(Math.abs(random.nextLong()), 36); - } - /***********************************************************************/ - public static void displayHtml(String htmlOutput) throws FileNotFoundException, IOException, - InterruptedException - { - displayHtml(null, ".html", htmlOutput, 3); - } - /***********************************************************************/ - public static void displayHtmlFile(String fileName) throws IOException - { - displayFile(fileName); - } - public static void displayHtmlFile(File file) throws IOException - { - if (!file.exists()) { return; } - displayHtmlFile(file.getAbsolutePath()); - } - /***********************************************************************/ - public static void displayHtml(String outputFile, String htmlOutput) throws FileNotFoundException, IOException, - InterruptedException - { - displayHtml(outputFile, ".html", htmlOutput, 15); - } - /***********************************************************************/ - public static void displayHtml(String outputFile, String fileExtention, String htmlOutput, int secondsTimeout) - throws FileNotFoundException, IOException, InterruptedException - { - File file = (outputFile == null) ? File.createTempFile("temp", fileExtention) : new File(outputFile); - FileUtils.writeFile(file, htmlOutput); - displayHtmlFile(file); - Thread.sleep(secondsTimeout * 1000); - if (outputFile == null) - { - file.deleteOnExit(); - } - } - /***********************************************************************/ - public static void displayText(String output) throws IOException, InterruptedException - { - displayHtml(null, ".txt", output, 3); - } - /***********************************************************************/ - public static void displayExcel(String output) throws IOException, InterruptedException - { - displayHtml(null, ".csv", output, 3); - // Runtime.getRuntime().exec("notepad.exe " + outputFile); - } - /***********************************************************************/ - public static void assertForEach(String comment, Object[] objects, String method, Object expectedResult) - { - if (objects == null || objects.length == 0) { return; } - try - { - Method m = objects[0].getClass().getMethod(method, (Class[]) null); - for (int i = 0; i < objects.length; i++) - { - Object v = m.invoke(objects[i], (Object[]) null); - TestCase.assertEquals(comment + " - FOR - [" + i + "]", expectedResult, v); - } - } - catch (Throwable t) - { - throw ObjectUtils.throwAsError(t); - } - } - /***********************************************************************/ - public static void assertEqualForMethods(String title, Object expectedResult, Object testResult, - String[] matchingMethods) - { - try - { - Method[] m1 = ObjectUtils.getMethodsForObject(expectedResult, matchingMethods); - Method[] m2 = ObjectUtils.getMethodsForObject(testResult, matchingMethods); - for (int i = 0; i < m1.length; i++) - { - Object v1 = m1[i].invoke(expectedResult, (Object[]) null); - Object v2 = m2[i].invoke(testResult, (Object[]) null); - TestCase.assertEquals(title + " - FOR - " + matchingMethods[i], v1, v2); - } - } - catch (Throwable t) - { - throw ObjectUtils.throwAsError(t); - } - } - /***********************************************************************/ - public static void displayEmail(Message email) - { - if (email == null) { return; } - try - { - File f = File.createTempFile("email", ".eml"); - f.deleteOnExit(); - FileOutputStream out = new FileOutputStream(f); - email.writeTo(out); - out.close(); - displayFile(f.getAbsolutePath()); - } - catch (Exception e) - { - throw ObjectUtils.throwAsError(e); - } - } - /***********************************************************************/ - public static void displayFile(String fileName) - { - String cmd = ""; - if (File.separatorChar == '\\') - { - cmd = "cmd /C start \"Needed Title\" \"%s\" /B"; - } - else - { - cmd = "open %s"; - } - try - { - cmd = String.format(cmd, fileName); - Runtime.getRuntime().exec(cmd); - Thread.sleep(2000); - } - catch (Exception e) - { - throw ObjectUtils.throwAsError(e); - } - } - /***********************************************************************/ - public static double getTimerMultiplier() throws InterruptedException - { - long start = System.currentTimeMillis(); - Thread.sleep(500); - long end = System.currentTimeMillis(); - return (end - start) / 500.00; - } - /***********************************************************************/ - public static void assertLength(int length, Object[] array) - { - if (length != array.length) - { - TestCase.fail(String.format("Array.length %s != %s \n %s", length, array.length, Arrays.asList(array))); - } - } - /***********************************************************************/ - public static void assertLength(int length, List list) - { - if (length != list.size()) - { - TestCase.fail(String.format("Array.length %s != %s \n %s", length, list.size(), list)); - } - } - /***********************************************************************/ - public static void displayImage(BufferedImage image) throws Exception - { - File f = File.createTempFile("temp", ".gif"); - //ImageWriter.writeImage(image, new FileOutputStream(f), ImageWriter.Encoding.GIF); - Runtime.getRuntime().exec("C:\\PROGRA~1\\MOZILL~1\\FIREFOX.EXE " + f.getAbsolutePath()); - } - /***********************************************************************/ - /***********************************************************************/ - public static void assertContains(String expecting, String[] in) - { - if (!ArrayUtils.contains(in, expecting)) - { - TestCase.fail(String.format("Didn't find '%s' in %s", expecting, Arrays.asList(in))); - } - } - public static void assertEqualArray(Object[] expected, Object[] actual) - { - boolean passed = (expected.length == actual.length); - if (passed) - { - for (int i = 0; i < actual.length; i++) - { - passed &= expected[i].equals(actual[i]); - } - } - if (!passed) - { - TestCase.fail(String.format("Arrays didn't Match \n[expected] = %s\n[actual]=%s", Arrays.asList(expected), - Arrays.asList(actual))); - } - } - public static StackTraceReflectionResult getCurrentFileForMethod(int ignoreLevels) - { - return getCurrentFileForMethod(new StackElementLevelSelector(ignoreLevels + 1)); - } - public static StackTraceReflectionResult getCurrentFileForMethod(StackElementSelector stackElementSelector) - throws Error - { - try - { - StackTraceElement trace[] = new Error().getStackTrace(); - StackTraceElement element = stackElementSelector.selectElement(trace); - return getInfo(element); - } - catch (Throwable t) - { - throw ObjectUtils.throwAsError(t); - } - } - private static StackTraceReflectionResult getInfo(StackTraceElement element) throws ClassNotFoundException - { - String fullClassName = element.getClassName(); - String className = fullClassName.substring(fullClassName.lastIndexOf(".") + 1); - File dir = ClassUtils.getSourceDirectory(Class.forName(fullClassName)); - return new StackTraceReflectionResult(dir, className, element.getMethodName()); - } -} \ No newline at end of file diff --git a/src/main/java/org/approvaltests/namer/JUnitStackTraceNamer.java b/src/main/java/org/approvaltests/namer/JUnitStackTraceNamer.java index f88abdf..299480a 100644 --- a/src/main/java/org/approvaltests/namer/JUnitStackTraceNamer.java +++ b/src/main/java/org/approvaltests/namer/JUnitStackTraceNamer.java @@ -9,7 +9,7 @@ import org.teachingkidsprogramming.util.ObjectUtils; import org.teachingkidsprogramming.util.StackTraceReflectionResult; -import com.spun.util.TestUtils; +import org.teachingkidsprogramming.util.TestUtils; import com.spun.util.io.StackElementSelector; public class JUnitStackTraceNamer implements ApprovalNamer diff --git a/src/main/java/org/approvaltests/reporters/FileLauncherReporter.java b/src/main/java/org/approvaltests/reporters/FileLauncherReporter.java index ced7faa..8d6beb5 100644 --- a/src/main/java/org/approvaltests/reporters/FileLauncherReporter.java +++ b/src/main/java/org/approvaltests/reporters/FileLauncherReporter.java @@ -3,7 +3,7 @@ import org.approvaltests.core.ApprovalFailureReporter; -import com.spun.util.TestUtils; +import org.teachingkidsprogramming.util.TestUtils; import com.spun.util.io.FileUtils; public class FileLauncherReporter implements ApprovalFailureReporter diff --git a/src/main/java/org/approvaltests/reporters/ImageWebReporter.java b/src/main/java/org/approvaltests/reporters/ImageWebReporter.java index 9c9d734..a4e425f 100644 --- a/src/main/java/org/approvaltests/reporters/ImageWebReporter.java +++ b/src/main/java/org/approvaltests/reporters/ImageWebReporter.java @@ -2,7 +2,7 @@ import java.awt.GraphicsEnvironment; -import com.spun.util.TestUtils; +import org.teachingkidsprogramming.util.TestUtils; public class ImageWebReporter implements EnvironmentAwareReporter { diff --git a/src/main/java/org/approvaltests/reporters/TextWebReporter.java b/src/main/java/org/approvaltests/reporters/TextWebReporter.java index 874c95f..213facf 100644 --- a/src/main/java/org/approvaltests/reporters/TextWebReporter.java +++ b/src/main/java/org/approvaltests/reporters/TextWebReporter.java @@ -4,7 +4,7 @@ import org.approvaltests.core.ApprovalFailureReporter; -import com.spun.util.TestUtils; +import org.teachingkidsprogramming.util.TestUtils; import com.spun.util.io.FileUtils; public class TextWebReporter implements ApprovalFailureReporter diff --git a/src/main/java/org/teachingextensions/utils/Viewer.java b/src/main/java/org/teachingextensions/utils/Viewer.java index 0bf5c2f..ee1afd8 100644 --- a/src/main/java/org/teachingextensions/utils/Viewer.java +++ b/src/main/java/org/teachingextensions/utils/Viewer.java @@ -5,7 +5,7 @@ import java.io.IOException; import org.teachingkidsprogramming.util.ObjectUtils; -import com.spun.util.TestUtils; +import org.teachingkidsprogramming.util.TestUtils; public class Viewer { diff --git a/src/main/java/org/teachingkidsprogramming/util/TestUtils.java b/src/main/java/org/teachingkidsprogramming/util/TestUtils.java new file mode 100644 index 0000000..68711f0 --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/util/TestUtils.java @@ -0,0 +1,91 @@ +package org.teachingkidsprogramming.util; + +import com.spun.util.io.FileUtils; +import com.spun.util.io.StackElementSelector; + +import java.io.File; +import java.io.IOException; + + +public class TestUtils { + + /** + * ******************************************************************* + */ + public static void displayHtml(String htmlOutput) throws IOException, + InterruptedException { + displayHtml(null, ".html", htmlOutput, 3); + } + + /** + * ******************************************************************* + */ + public static void displayHtmlFile(String fileName) throws IOException { + displayFile(fileName); + } + + public static void displayHtmlFile(File file) throws IOException { + if (!file.exists()) { + return; + } + displayHtmlFile(file.getAbsolutePath()); + } + + /** + * ******************************************************************* + */ + public static void displayHtml(String outputFile, String fileExtension, String htmlOutput, int secondsTimeout) + throws IOException, InterruptedException { + File file = (outputFile == null) ? File.createTempFile("temp", fileExtension) : new File(outputFile); + FileUtils.writeFile(file, htmlOutput); + displayHtmlFile(file); + Thread.sleep(secondsTimeout * 1000); + if (outputFile == null) { + file.deleteOnExit(); + } + } + + /** + * ******************************************************************* + */ + public static void displayText(String output) throws IOException, InterruptedException { + displayHtml(null, ".txt", output, 3); + } + + /** + * ******************************************************************* + */ + public static void displayFile(String fileName) { + String cmd; + if (File.separatorChar == '\\') { + cmd = "cmd /C start \"Needed Title\" \"%s\" /B"; + } else { + cmd = "open %s"; + } + try { + cmd = String.format(cmd, fileName); + Runtime.getRuntime().exec(cmd); + Thread.sleep(2000); + } catch (Exception e) { + throw ObjectUtils.throwAsError(e); + } + } + + public static StackTraceReflectionResult getCurrentFileForMethod(StackElementSelector stackElementSelector) + throws Error { + try { + StackTraceElement trace[] = new Error().getStackTrace(); + StackTraceElement element = stackElementSelector.selectElement(trace); + return getInfo(element); + } catch (Throwable t) { + throw ObjectUtils.throwAsError(t); + } + } + + private static StackTraceReflectionResult getInfo(StackTraceElement element) throws ClassNotFoundException { + String fullClassName = element.getClassName(); + String className = fullClassName.substring(fullClassName.lastIndexOf(".") + 1); + File dir = ClassUtils.getSourceDirectory(Class.forName(fullClassName)); + return new StackTraceReflectionResult(dir, className, element.getMethodName()); + } +} \ No newline at end of file diff --git a/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.java b/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.java index 20b7edd..22320c5 100644 --- a/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.java +++ b/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.java @@ -16,7 +16,7 @@ import org.approvaltests.reporters.windows.TortoiseTextDiffReporter; import org.teachingkidsprogramming.util.StringUtils; -import com.spun.util.TestUtils; +import org.teachingkidsprogramming.util.TestUtils; import com.spun.util.Tuple; import com.spun.util.io.FileUtils; import com.spun.util.velocity.ContextAware.ContextAwareMap; From 7912d0776adfab4f1414dfc5752ce1d7809dfd30 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Tue, 17 Mar 2015 10:15:43 -0700 Subject: [PATCH 045/111] clean, move ThreadLauncher --- .../java/com/spun/util/ThreadLauncher.java | 71 ------------------- src/main/java/com/spun/util/TimedObject.java | 1 + .../org/teachingextensions/logo/Turtle.java | 2 +- .../logo/VirtualProctorWeb.java | 2 +- .../util/ThreadLauncher.java | 52 ++++++++++++++ 5 files changed, 55 insertions(+), 73 deletions(-) delete mode 100644 src/main/java/com/spun/util/ThreadLauncher.java create mode 100644 src/main/java/org/teachingkidsprogramming/util/ThreadLauncher.java diff --git a/src/main/java/com/spun/util/ThreadLauncher.java b/src/main/java/com/spun/util/ThreadLauncher.java deleted file mode 100644 index e7f24a2..0000000 --- a/src/main/java/com/spun/util/ThreadLauncher.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.spun.util; - -import java.lang.reflect.Method; - -import org.lambda.actions.Action0; -import org.teachingkidsprogramming.util.LambdaThreadLauncher; -import org.teachingkidsprogramming.util.MySystem; - -public class ThreadLauncher implements Runnable -{ - private Object object = null; - private Object[] objectParams = null; - private Method method = null; - private long delay; - /***********************************************************************/ - public ThreadLauncher(Object object, Method method, Object[] objectParams, long delay) - { - this.delay = delay; - this.object = object; - this.method = method; - this.objectParams = objectParams; - new Thread(this).start(); - } - /***********************************************************************/ - public ThreadLauncher(Object object, Method method, Object[] objectParams) - { - this(object, method, objectParams, 0); - } - /***********************************************************************/ - public ThreadLauncher(Object object, String methodName, long delay) throws SecurityException, - NoSuchMethodException - { - this(object, object.getClass().getMethod(methodName, (Class[]) null), null, delay); - } - /***********************************************************************/ - public ThreadLauncher(Object object, String methodName) throws SecurityException, NoSuchMethodException - { - this(object, object.getClass().getMethod(methodName, (Class[]) null), null, 0); - } - - /***********************************************************************/ - private static Class[] getClassArray(Object[] objectParams) - { - Class[] classes = new Class[objectParams.length]; - for (int i = 0; i < objectParams.length; i++) - { - classes[i] = objectParams[i].getClass(); - } - return classes; - } - /***********************************************************************/ - public void run() - { - try - { - Thread.sleep(delay); - //My_System.event("Running " + method.getName()); - method.invoke(object, objectParams); - } - catch (Throwable t) - { - MySystem.warning("Caught throwable exception ", t); - } - } - /***********************************************************************/ - /***********************************************************************/ - public static void launch(Action0 action) - { - new LambdaThreadLauncher(action); - } -} diff --git a/src/main/java/com/spun/util/TimedObject.java b/src/main/java/com/spun/util/TimedObject.java index a33caf0..3e54204 100644 --- a/src/main/java/com/spun/util/TimedObject.java +++ b/src/main/java/com/spun/util/TimedObject.java @@ -2,6 +2,7 @@ import org.teachingkidsprogramming.util.MySystem; +import org.teachingkidsprogramming.util.ThreadLauncher; public class TimedObject { diff --git a/src/main/java/org/teachingextensions/logo/Turtle.java b/src/main/java/org/teachingextensions/logo/Turtle.java index c4c098b..e95c65e 100644 --- a/src/main/java/org/teachingextensions/logo/Turtle.java +++ b/src/main/java/org/teachingextensions/logo/Turtle.java @@ -13,7 +13,7 @@ import org.lambda.actions.Action0; import org.teachingextensions.windows.ProgramWindow; -import com.spun.util.ThreadLauncher; +import org.teachingkidsprogramming.util.ThreadLauncher; import com.spun.util.persistence.Saver; import com.spun.util.persistence.SavingException; diff --git a/src/main/java/org/teachingextensions/logo/VirtualProctorWeb.java b/src/main/java/org/teachingextensions/logo/VirtualProctorWeb.java index ad0e316..e7946ef 100644 --- a/src/main/java/org/teachingextensions/logo/VirtualProctorWeb.java +++ b/src/main/java/org/teachingextensions/logo/VirtualProctorWeb.java @@ -18,7 +18,7 @@ import org.teachingextensions.utils.VirtualProctor; import org.teachingkidsprogramming.util.MySystem; -import com.spun.util.ThreadLauncher; +import org.teachingkidsprogramming.util.ThreadLauncher; import com.spun.util.ThreadUtils; import com.spun.util.io.FileUtils; diff --git a/src/main/java/org/teachingkidsprogramming/util/ThreadLauncher.java b/src/main/java/org/teachingkidsprogramming/util/ThreadLauncher.java new file mode 100644 index 0000000..59e0615 --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/util/ThreadLauncher.java @@ -0,0 +1,52 @@ +package org.teachingkidsprogramming.util; + +import org.lambda.actions.Action0; +import org.teachingkidsprogramming.util.LambdaThreadLauncher; +import org.teachingkidsprogramming.util.MySystem; + +import java.lang.reflect.Method; + +public class ThreadLauncher implements Runnable { + private Object object = null; + private Object[] objectParams = null; + private Method method = null; + private long delay; + + /** + * ******************************************************************* + */ + public ThreadLauncher(Object object, Method method, Object[] objectParams, long delay) { + this.delay = delay; + this.object = object; + this.method = method; + this.objectParams = objectParams; + new Thread(this).start(); + } + + /** + * ******************************************************************* + */ + public ThreadLauncher(Object object, String methodName) throws SecurityException, NoSuchMethodException { + this(object, object.getClass().getMethod(methodName, (Class[]) null), null, 0); + } + + /** + * ******************************************************************* + */ + public void run() { + try { + Thread.sleep(delay); + //My_System.event("Running " + method.getName()); + method.invoke(object, objectParams); + } catch (Throwable t) { + MySystem.warning("Caught throwable exception ", t); + } + } + /***********************************************************************/ + /** + * ******************************************************************* + */ + public static void launch(Action0 action) { + new LambdaThreadLauncher(action); + } +} From 0dcd82152f9ad5e276cee0abc1d22790b9adca9a Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Tue, 17 Mar 2015 10:16:56 -0700 Subject: [PATCH 046/111] clean, move ThreadUtils --- src/main/java/com/spun/util/Threads.java | 23 ------------------- .../reporters/GenericDiffReporter.java | 2 +- .../logo/VirtualProctorWeb.java | 2 +- .../completed/ChooseYourOwnAdventure.java | 2 +- .../util/ThreadUtils.java | 2 +- 5 files changed, 4 insertions(+), 27 deletions(-) delete mode 100644 src/main/java/com/spun/util/Threads.java rename src/main/java/{com/spun => org/teachingkidsprogramming}/util/ThreadUtils.java (80%) diff --git a/src/main/java/com/spun/util/Threads.java b/src/main/java/com/spun/util/Threads.java deleted file mode 100644 index 89b795c..0000000 --- a/src/main/java/com/spun/util/Threads.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.spun.util; - -public class Threads -{ - private int threadCount = 0; - /************************************************************************/ - public Threads() - { - ThreadGroup place = Thread.currentThread().getThreadGroup(); - while (place.getParent() != null) - { - place = place.getParent(); - } - threadCount = place.activeCount(); - } - /************************************************************************/ - public int getThreadCount() - { - return threadCount; - } - /***********************************************************************/ - /***********************************************************************/ -} \ No newline at end of file diff --git a/src/main/java/org/approvaltests/reporters/GenericDiffReporter.java b/src/main/java/org/approvaltests/reporters/GenericDiffReporter.java index f2d4b01..9049823 100644 --- a/src/main/java/org/approvaltests/reporters/GenericDiffReporter.java +++ b/src/main/java/org/approvaltests/reporters/GenericDiffReporter.java @@ -5,7 +5,7 @@ import java.util.Arrays; import java.util.List; -import com.spun.util.ThreadUtils; +import org.teachingkidsprogramming.util.ThreadUtils; import com.spun.util.io.FileUtils; public class GenericDiffReporter implements EnvironmentAwareReporter diff --git a/src/main/java/org/teachingextensions/logo/VirtualProctorWeb.java b/src/main/java/org/teachingextensions/logo/VirtualProctorWeb.java index e7946ef..078846d 100644 --- a/src/main/java/org/teachingextensions/logo/VirtualProctorWeb.java +++ b/src/main/java/org/teachingextensions/logo/VirtualProctorWeb.java @@ -19,7 +19,7 @@ import org.teachingkidsprogramming.util.MySystem; import org.teachingkidsprogramming.util.ThreadLauncher; -import com.spun.util.ThreadUtils; +import org.teachingkidsprogramming.util.ThreadUtils; import com.spun.util.io.FileUtils; public class VirtualProctorWeb extends WindowAdapter diff --git a/src/main/java/org/teachingkidsprogramming/recipes/completed/ChooseYourOwnAdventure.java b/src/main/java/org/teachingkidsprogramming/recipes/completed/ChooseYourOwnAdventure.java index dd91a0b..597e998 100644 --- a/src/main/java/org/teachingkidsprogramming/recipes/completed/ChooseYourOwnAdventure.java +++ b/src/main/java/org/teachingkidsprogramming/recipes/completed/ChooseYourOwnAdventure.java @@ -6,7 +6,7 @@ import org.teachingextensions.logo.Tortoise; import org.teachingextensions.windows.MessageBox; -import com.spun.util.ThreadUtils; +import org.teachingkidsprogramming.util.ThreadUtils; public class ChooseYourOwnAdventure { diff --git a/src/main/java/com/spun/util/ThreadUtils.java b/src/main/java/org/teachingkidsprogramming/util/ThreadUtils.java similarity index 80% rename from src/main/java/com/spun/util/ThreadUtils.java rename to src/main/java/org/teachingkidsprogramming/util/ThreadUtils.java index 1792bdb..c5e387a 100644 --- a/src/main/java/com/spun/util/ThreadUtils.java +++ b/src/main/java/org/teachingkidsprogramming/util/ThreadUtils.java @@ -1,4 +1,4 @@ -package com.spun.util; +package org.teachingkidsprogramming.util; public class ThreadUtils { From b9e83de6b900b48be1c7f67bc40191eb106af7b3 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Tue, 17 Mar 2015 10:17:56 -0700 Subject: [PATCH 047/111] clean, move Tuple --- src/main/java/com/spun/util/TimedObject.java | 74 ------------------- src/main/java/com/spun/util/Tuple.java | 25 ------- .../teachingkidsprogramming/util/Tuple.java | 24 ++++++ .../logo/tests/ColorGeneration.java | 2 +- 4 files changed, 25 insertions(+), 100 deletions(-) delete mode 100644 src/main/java/com/spun/util/TimedObject.java delete mode 100644 src/main/java/com/spun/util/Tuple.java create mode 100644 src/main/java/org/teachingkidsprogramming/util/Tuple.java diff --git a/src/main/java/com/spun/util/TimedObject.java b/src/main/java/com/spun/util/TimedObject.java deleted file mode 100644 index 3e54204..0000000 --- a/src/main/java/com/spun/util/TimedObject.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.spun.util; - - -import org.teachingkidsprogramming.util.MySystem; -import org.teachingkidsprogramming.util.ThreadLauncher; - -public class TimedObject -{ - private Object object = null; - private long timeOutInMillis = 1000; - private long lastTimeAccessed = 0; - /***********************************************************************/ - - public TimedObject(long timeOutInMillis) - { - this.timeOutInMillis = timeOutInMillis; - } - /***********************************************************************/ - - public Object get() - { - touched(); - return object; - } - /***********************************************************************/ - - private synchronized void touched() - { - try - { - boolean launch = (lastTimeAccessed == 0); - this.lastTimeAccessed = System.currentTimeMillis(); - if (launch) - { - new ThreadLauncher(this, "clean"); - } - } - catch (Throwable t) - { - MySystem.warning(t); - } - } - /***********************************************************************/ - public void clean() - { - try - { - while (System.currentTimeMillis() < (lastTimeAccessed + timeOutInMillis)) - { - long diff = (lastTimeAccessed + timeOutInMillis) - System.currentTimeMillis(); - Thread.sleep(diff); - } - } - catch (Throwable t) - { - MySystem.warning(t); - } - synchronized (this) - { - this.object = null; - this.lastTimeAccessed = 0; - } - } - /***********************************************************************/ - - public void set(Object object) - { - touched(); - this.object = object; - } - /***********************************************************************/ - /***********************************************************************/ - -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/Tuple.java b/src/main/java/com/spun/util/Tuple.java deleted file mode 100644 index 43aeef1..0000000 --- a/src/main/java/com/spun/util/Tuple.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.spun.util; - -public class Tuple -{ - private final H first; - private final K second; - public Tuple(H first, K second) - { - this.first = first; - this.second = second; - } - public H getFirst() - { - return first; - } - public K getSecond() - { - return second; - } - @Override - public String toString() - { - return String.format("<%s,%s>", first, second); - } -} diff --git a/src/main/java/org/teachingkidsprogramming/util/Tuple.java b/src/main/java/org/teachingkidsprogramming/util/Tuple.java new file mode 100644 index 0000000..89439c6 --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/util/Tuple.java @@ -0,0 +1,24 @@ +package org.teachingkidsprogramming.util; + +public class Tuple { + private final H first; + private final K second; + + public Tuple(H first, K second) { + this.first = first; + this.second = second; + } + + public H getFirst() { + return first; + } + + public K getSecond() { + return second; + } + + @Override + public String toString() { + return String.format("<%s,%s>", first, second); + } +} diff --git a/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.java b/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.java index 22320c5..172375d 100644 --- a/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.java +++ b/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.java @@ -17,7 +17,7 @@ import org.teachingkidsprogramming.util.StringUtils; import org.teachingkidsprogramming.util.TestUtils; -import com.spun.util.Tuple; +import org.teachingkidsprogramming.util.Tuple; import com.spun.util.io.FileUtils; import com.spun.util.velocity.ContextAware.ContextAwareMap; import com.spun.util.velocity.VelocityParser; From 6970a91481e19f7803b5dc7f40b1e364cf48fd9a Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Tue, 17 Mar 2015 10:50:22 -0700 Subject: [PATCH 048/111] clean, move WindowUtils --- .../com/spun/util/WhiteSpaceStripper.java | 156 ------------------ src/main/java/com/spun/util/WindowUtils.java | 78 --------- .../reporters/ClipboardReporter.java | 2 +- .../reporters/DelayedClipboardReporter.java | 2 +- .../windows/ProgramWindow.java | 2 +- .../util/WindowUtils.java | 61 +++++++ 6 files changed, 64 insertions(+), 237 deletions(-) delete mode 100644 src/main/java/com/spun/util/WhiteSpaceStripper.java delete mode 100644 src/main/java/com/spun/util/WindowUtils.java create mode 100644 src/main/java/org/teachingkidsprogramming/util/WindowUtils.java diff --git a/src/main/java/com/spun/util/WhiteSpaceStripper.java b/src/main/java/com/spun/util/WhiteSpaceStripper.java deleted file mode 100644 index 46ed882..0000000 --- a/src/main/java/com/spun/util/WhiteSpaceStripper.java +++ /dev/null @@ -1,156 +0,0 @@ -package com.spun.util; - -import org.teachingkidsprogramming.util.MySystem; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; - -public class WhiteSpaceStripper -{ - /***********************************************************************/ - public static void stripFolder(File dir) - { - stripFolder(dir, true); - } - /***********************************************************************/ - public static void stripFolder(File dir, boolean recursive) - { - if (!dir.isDirectory()) - { - MySystem.warning("File is not a Directory - " + dir.toString()); - return; - } - - File[] files = dir.listFiles(new WhiteSpaceFileFilter()); - for (int i = 0; i < files.length; i++) - { - if (files[i].isDirectory()) - { - MySystem.event("Scaning Directory -" + files[i].getName()); - if (recursive) stripFolder(files[i], recursive); - } - else - { - stripFile(files[i]); - } - } - } - - /***********************************************************************/ - public static void stripFile(File file) - { - - if (!file.isFile()) - { - MySystem.warning("File is not a File - " + file.toString()); - return; - } - if(!file.canWrite()) - { - MySystem.event("File '" + file.toString() + "' is readonly"); - } - else - { - try - { - String contents = readFile(file); - String stripped = stripWhiteSpace(contents); - writeFile(file, stripped); - } - catch (IOException e) - { - MySystem.warning(e); - } - } - } - /***********************************************************************/ - public static String stripWhiteSpace(String text) - { - StringBuilder newText = new StringBuilder(); - boolean whitespace = false; - int num = text.length(); - char whiteSpaceChar = ' '; - for (int i = 0; i < num; i++) - { - char c = text.charAt(i); - switch (c) - { - case '\n' : whiteSpaceChar = '\n';whitespace = true;break; - case '\t' : - case ' ' : whitespace = true;break; - default : - if (whitespace) - { - whitespace = false; - newText.append(whiteSpaceChar); - whiteSpaceChar = ' '; - } - newText.append(c);break; - } - } - return newText.toString(); - } - - /***********************************************************************/ - private static String readFile(File file) - throws IOException - { - BufferedReader reader = new BufferedReader(new FileReader(file)); - StringBuilder output = new StringBuilder(); - - while (reader.ready()) - { - output.append(reader.readLine()); - output.append("\n"); - } - - reader.close(); - return output.toString(); - } - /***********************************************************************/ - private static void writeFile(File file, String text) - throws IOException - { - FileWriter writer = new FileWriter(file); - - writer.write(text); - - writer.close(); - } - /***********************************************************************/ - public static void main (String [] args) - { -// stripFolder(new File("C:\\temp\\stockgazing")); - } - /***********************************************************************/ - /***********************************************************************/ -} - - -class WhiteSpaceFileFilter - implements java.io.FileFilter -{ - - /***********************************************************************/ - - public boolean accept(File pathname) - { - - if (pathname.getName().equals(".") || pathname.getName().equals(".")) - { - return false; - } - else if (pathname.getName().equalsIgnoreCase("email")) - { - return false; - } - else - return pathname.isDirectory() || (pathname.getName().indexOf(".htm") != -1) || (pathname.getName().indexOf(".txt") != -1); - } - - /***********************************************************************/ - /***********************************************************************/ -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/WindowUtils.java b/src/main/java/com/spun/util/WindowUtils.java deleted file mode 100644 index 7f090fe..0000000 --- a/src/main/java/com/spun/util/WindowUtils.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.spun.util; - -import org.teachingkidsprogramming.util.FrameCloser; -import org.teachingkidsprogramming.util.MySystem; - -import java.awt.Dimension; -import java.awt.event.WindowAdapter; - -import javax.swing.JFrame; -import javax.swing.JOptionPane; -import javax.swing.JPanel; - -public class WindowUtils -{ - /***********************************************************************/ - public static void centerWindow(java.awt.Window window) - { - Dimension d = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); - Dimension w = window.getSize(); - int dx = (int) w.getWidth(); - int dy = (int) w.getHeight(); - int x = (int) ((d.getWidth() - dx) / 2); - int y = (int) ((d.getHeight() - dy) / 2); - MySystem.variable(" size (" + x + "," + y + "," + dx + "," + dy + ")"); - window.setBounds(x, y, dx, dy + 1); - } - /***********************************************************************/ - public static void testPanel(JPanel panel) - { - JFrame test = new JFrame("Testing Frame"); - test.getContentPane().add(panel); - testFrame(test, true); - } - /***********************************************************************/ - public static void testFrame(JFrame frame) - { - testFrame(frame, true); - } - /***********************************************************************/ - public static void copyToClipBoard(String code) - { - copyToClipBoard(code, true); - } - public static void copyToClipBoard(String code, boolean displayMessage) - { - java.awt.datatransfer.StringSelection selection = new java.awt.datatransfer.StringSelection(code); - java.awt.Frame frame = new java.awt.Frame(); - frame.getToolkit().getSystemClipboard().setContents(selection, selection); - if (displayMessage) - { - JOptionPane.showMessageDialog(null, "Code copied to Clipboard", "Finished", JOptionPane.INFORMATION_MESSAGE); - } - frame.dispose(); - } - /***********************************************************************/ - public static void testFrame(JFrame frame, boolean closeOnExit) - { - if (closeOnExit) - { - testFrame(frame, new FrameCloser()); - } - else - { - testFrame(frame); - } - } - /***********************************************************************/ - public static void testFrame(JFrame frame, WindowAdapter... array) - { - frame.pack(); - for (WindowAdapter closer : array) - { - frame.addWindowListener(closer); - } - WindowUtils.centerWindow(frame); - frame.setVisible(true); - } -} \ No newline at end of file diff --git a/src/main/java/org/approvaltests/reporters/ClipboardReporter.java b/src/main/java/org/approvaltests/reporters/ClipboardReporter.java index 34f1714..0f3911e 100644 --- a/src/main/java/org/approvaltests/reporters/ClipboardReporter.java +++ b/src/main/java/org/approvaltests/reporters/ClipboardReporter.java @@ -4,7 +4,7 @@ import java.io.File; import org.teachingkidsprogramming.util.SystemUtils; -import com.spun.util.WindowUtils; +import org.teachingkidsprogramming.util.WindowUtils; /** * A reporter which creates the command to accept the received diff --git a/src/main/java/org/approvaltests/reporters/DelayedClipboardReporter.java b/src/main/java/org/approvaltests/reporters/DelayedClipboardReporter.java index 6bfd056..d333c18 100644 --- a/src/main/java/org/approvaltests/reporters/DelayedClipboardReporter.java +++ b/src/main/java/org/approvaltests/reporters/DelayedClipboardReporter.java @@ -3,7 +3,7 @@ import java.awt.GraphicsEnvironment; import org.teachingkidsprogramming.util.StringUtils; -import com.spun.util.WindowUtils; +import org.teachingkidsprogramming.util.WindowUtils; /** * A reporter which creates the command to accept the received diff --git a/src/main/java/org/teachingextensions/windows/ProgramWindow.java b/src/main/java/org/teachingextensions/windows/ProgramWindow.java index c660dab..2d9da89 100644 --- a/src/main/java/org/teachingextensions/windows/ProgramWindow.java +++ b/src/main/java/org/teachingextensions/windows/ProgramWindow.java @@ -15,7 +15,7 @@ import org.teachingextensions.logo.VirtualProctorWeb; import org.teachingkidsprogramming.util.FrameCloser; -import com.spun.util.WindowUtils; +import org.teachingkidsprogramming.util.WindowUtils; /** * A window image Program Window diff --git a/src/main/java/org/teachingkidsprogramming/util/WindowUtils.java b/src/main/java/org/teachingkidsprogramming/util/WindowUtils.java new file mode 100644 index 0000000..77783e3 --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/util/WindowUtils.java @@ -0,0 +1,61 @@ +package org.teachingkidsprogramming.util; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.WindowAdapter; + +public class WindowUtils { + /** + * ******************************************************************* + */ + public static void centerWindow(java.awt.Window window) { + Dimension d = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); + Dimension w = window.getSize(); + int dx = (int) w.getWidth(); + int dy = (int) w.getHeight(); + int x = (int) ((d.getWidth() - dx) / 2); + int y = (int) ((d.getHeight() - dy) / 2); + MySystem.variable(" size (" + x + "," + y + "," + dx + "," + dy + ")"); + window.setBounds(x, y, dx, dy + 1); + } + + /** + * ******************************************************************* + */ + public static void testFrame(JFrame frame) { + testFrame(frame, true); + } + + public static void copyToClipBoard(String code, boolean displayMessage) { + java.awt.datatransfer.StringSelection selection = new java.awt.datatransfer.StringSelection(code); + java.awt.Frame frame = new java.awt.Frame(); + frame.getToolkit().getSystemClipboard().setContents(selection, selection); + if (displayMessage) { + JOptionPane.showMessageDialog(null, "Code copied to Clipboard", "Finished", JOptionPane.INFORMATION_MESSAGE); + } + frame.dispose(); + } + + /** + * ******************************************************************* + */ + public static void testFrame(JFrame frame, boolean closeOnExit) { + if (closeOnExit) { + testFrame(frame, new FrameCloser()); + } else { + testFrame(frame); + } + } + + /** + * ******************************************************************* + */ + public static void testFrame(JFrame frame, WindowAdapter... array) { + frame.pack(); + for (WindowAdapter closer : array) { + frame.addWindowListener(closer); + } + WindowUtils.centerWindow(frame); + frame.setVisible(true); + } +} \ No newline at end of file From 5f74c9bbc5cf7b75943cb89390c6eede2e293321 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Tue, 17 Mar 2015 10:51:41 -0700 Subject: [PATCH 049/111] removed database package --- .../spun/util/database/ResultSetWriter.java | 51 --- .../database/SQLInformationException.java | 41 --- .../util/database/SqlConnectionException.java | 41 --- .../com/spun/util/database/SshConnection.java | 319 ------------------ 4 files changed, 452 deletions(-) delete mode 100644 src/main/java/com/spun/util/database/ResultSetWriter.java delete mode 100644 src/main/java/com/spun/util/database/SQLInformationException.java delete mode 100644 src/main/java/com/spun/util/database/SqlConnectionException.java delete mode 100644 src/main/java/com/spun/util/database/SshConnection.java diff --git a/src/main/java/com/spun/util/database/ResultSetWriter.java b/src/main/java/com/spun/util/database/ResultSetWriter.java deleted file mode 100644 index a3eca14..0000000 --- a/src/main/java/com/spun/util/database/ResultSetWriter.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.spun.util.database; - -import java.sql.ResultSet; -import java.sql.ResultSetMetaData; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -public class ResultSetWriter -{ - public static String toString(ResultSet rs) throws SQLException - { - List results = extractResults(rs); - List metaData = extractMetaData(rs); - StringBuffer sb = new StringBuffer(); - sb.append(metaData.toString() + "\r\n"); - for (String[] strings : results) - { - sb.append(Arrays.toString(strings) + "\r\n"); - } - return sb.toString(); - } - /***********************************************************************/ - public static List extractResults(ResultSet rs) throws SQLException - { - int columns = rs.getMetaData().getColumnCount(); - ArrayList found = new ArrayList(); - while (rs.next()) - { - String rowData[] = new String[columns]; - for (int i = 1; i <= columns; i++) - { - rowData[i - 1] = rs.getString(i); - } - found.add(rowData); - } - return found; - } - /***********************************************************************/ - public static List extractMetaData(ResultSet rs) throws SQLException - { - ResultSetMetaData meta = rs.getMetaData(); - ArrayList titles = new ArrayList(meta.getColumnCount()); - for (int i = 1; i <= meta.getColumnCount(); i++) - { - titles.add(meta.getColumnName(i)); - } - return titles; - } -} diff --git a/src/main/java/com/spun/util/database/SQLInformationException.java b/src/main/java/com/spun/util/database/SQLInformationException.java deleted file mode 100644 index b11e543..0000000 --- a/src/main/java/com/spun/util/database/SQLInformationException.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.spun.util.database; - -import java.sql.SQLException; - -public class SQLInformationException extends SQLException -{ - private static class SQL_SERVER_CODES - { - //1205 - deadlock - //170 - incorrect syntax - } - private String query; - private SQLException exception; - /***********************************************************************/ - public SQLInformationException(String query, SQLException e) - { - this.exception = e; - this.query = query; - } - /***********************************************************************/ - public SQLException getException() - { - return exception; - } - /***********************************************************************/ - public String getQuery() - { - return query; - } - /***********************************************************************/ - public String getMessage() - { - return "The SQL :'" + query + "'\n" + - "caused the exception :'" + exception.getMessage() + "'\n" + - "Vendor code :'" + exception.getErrorCode() + "'\n" + - "SQL state :'" + exception.getSQLState() + "'\n" ; - } - - /***********************************************************************/ - /***********************************************************************/ -} diff --git a/src/main/java/com/spun/util/database/SqlConnectionException.java b/src/main/java/com/spun/util/database/SqlConnectionException.java deleted file mode 100644 index 93b9ab9..0000000 --- a/src/main/java/com/spun/util/database/SqlConnectionException.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.spun.util.database; - -import java.sql.SQLException; - -public class SqlConnectionException extends RuntimeException -{ - - private String driver; - private String protocol; - private String server; - private String port; - private String database; - private String userName; - private String url; - - public SqlConnectionException(String driver, String url, String protocol, String server, String port, String database, String userName, String password, int type, SQLException e) - { - super(e); - this.driver = driver; - this.url = url; - this.protocol = protocol; - this. server = server; - this.port = port; - this.database = database; - this.userName = userName; - } - - public String getMessage() - { - return "Problems Connecting to " + url + "\n" - + "Message : " + getCause().getMessage() + "\n" - + "Driver : " + driver + "\n" - + "Server : " + server + "\n" - + "Port : " + port + "\n" - + "Database : " + database + "\n" - + "UserName : " + userName + "\n" - ; - } - - -} diff --git a/src/main/java/com/spun/util/database/SshConnection.java b/src/main/java/com/spun/util/database/SshConnection.java deleted file mode 100644 index 43aaa06..0000000 --- a/src/main/java/com/spun/util/database/SshConnection.java +++ /dev/null @@ -1,319 +0,0 @@ -package com.spun.util.database; - -import java.sql.Array; -import java.sql.Blob; -import java.sql.CallableStatement; -import java.sql.Clob; -import java.sql.Connection; -import java.sql.DatabaseMetaData; -import java.sql.NClob; -import java.sql.PreparedStatement; -import java.sql.SQLClientInfoException; -import java.sql.SQLException; -import java.sql.SQLWarning; -import java.sql.SQLXML; -import java.sql.Savepoint; -import java.sql.Statement; -import java.sql.Struct; -import java.util.Map; -import java.util.Properties; -import java.util.concurrent.Executor; - -import com.sshtools.j2ssh.SshClient; - -/***********************************************************************/ -public class SshConnection implements Connection { - private Connection con; - private SshClient ssh; - - /***********************************************************************/ - private void closeSsh() { - ssh.disconnect(); - ssh = null; - } - - /***********************************************************************/ - public SshConnection(SshClient ssh, Connection connection) { - this.ssh = ssh; - this.con = connection; - } - - /***********************************************************************/ - public int getHoldability() throws SQLException { - return con.getHoldability(); - } - - /***********************************************************************/ - public int getTransactionIsolation() throws SQLException { - return con.getTransactionIsolation(); - } - - /***********************************************************************/ - public void clearWarnings() throws SQLException { - con.clearWarnings(); - } - - /***********************************************************************/ - public void close() throws SQLException { - if (con != null) { - con.close(); - closeSsh(); - con = null; - } - } - - /***********************************************************************/ - public void commit() throws SQLException { - con.commit(); - } - - /***********************************************************************/ - public void rollback() throws SQLException { - con.rollback(); - } - - /***********************************************************************/ - public boolean getAutoCommit() throws SQLException { - return con.getAutoCommit(); - } - - /***********************************************************************/ - public boolean isClosed() throws SQLException { - return con.isClosed(); - } - - /***********************************************************************/ - public boolean isReadOnly() throws SQLException { - return con.isReadOnly(); - } - - /***********************************************************************/ - public void setHoldability(int holdability) throws SQLException { - con.setHoldability(holdability); - } - - /***********************************************************************/ - public void setTransactionIsolation(int level) throws SQLException { - con.setTransactionIsolation(level); - } - - /***********************************************************************/ - public void setAutoCommit(boolean autoCommit) throws SQLException { - con.setAutoCommit(autoCommit); - } - - /***********************************************************************/ - public void setReadOnly(boolean readOnly) throws SQLException { - con.setReadOnly(readOnly); - } - - /***********************************************************************/ - public String getCatalog() throws SQLException { - return con.getCatalog(); - } - - /***********************************************************************/ - public void setCatalog(String catalog) throws SQLException { - con.setCatalog(catalog); - } - - /***********************************************************************/ - public DatabaseMetaData getMetaData() throws SQLException { - return con.getMetaData(); - } - - /***********************************************************************/ - public SQLWarning getWarnings() throws SQLException { - return con.getWarnings(); - } - - /***********************************************************************/ - public Savepoint setSavepoint() throws SQLException { - return con.setSavepoint(); - } - - /***********************************************************************/ - public void releaseSavepoint(Savepoint savepoint) throws SQLException { - con.releaseSavepoint(savepoint); - } - - /***********************************************************************/ - public void rollback(Savepoint savepoint) throws SQLException { - con.rollback(savepoint); - } - - /***********************************************************************/ - public Statement createStatement() throws SQLException { - return con.createStatement(); - } - - /***********************************************************************/ - public Statement createStatement(int resultSetType, int resultSetConcurrency) throws SQLException { - return con.createStatement(resultSetType, resultSetConcurrency); - } - - /***********************************************************************/ - public Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { - return con.createStatement(resultSetType, resultSetConcurrency, resultSetHoldability); - } - - /***********************************************************************/ - public Map getTypeMap() throws SQLException { - return con.getTypeMap(); - } - - /***********************************************************************/ - public void setTypeMap(Map> arg0) throws SQLException { - con.setTypeMap(arg0); - } - - /***********************************************************************/ - public String nativeSQL(String sql) throws SQLException { - return con.nativeSQL(sql); - } - - /***********************************************************************/ - public CallableStatement prepareCall(String sql) throws SQLException { - return con.prepareCall(sql); - } - - /***********************************************************************/ - public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency) throws SQLException { - return con.prepareCall(sql, resultSetType, resultSetConcurrency); - } - - /***********************************************************************/ - public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { - return con.prepareCall(sql, resultSetType, resultSetConcurrency, resultSetHoldability); - } - - /***********************************************************************/ - public PreparedStatement prepareStatement(String sql) throws SQLException { - return con.prepareStatement(sql); - } - - /***********************************************************************/ - public PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) throws SQLException { - return con.prepareStatement(sql, autoGeneratedKeys); - } - - /***********************************************************************/ - public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency) throws SQLException { - return con.prepareStatement(sql, resultSetType, resultSetConcurrency); - } - - /***********************************************************************/ - public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { - return con.prepareStatement(sql, resultSetType, resultSetConcurrency, resultSetHoldability); - } - - /***********************************************************************/ - public PreparedStatement prepareStatement(String sql, int[] columnIndexes) throws SQLException { - return con.prepareStatement(sql, columnIndexes); - } - - /***********************************************************************/ - public Savepoint setSavepoint(String name) throws SQLException { - return con.setSavepoint(name); - } - - /***********************************************************************/ - public PreparedStatement prepareStatement(String sql, String[] columnNames) throws SQLException { - return con.prepareStatement(sql, columnNames); - } - - /***********************************************************************/ - protected void finalize() throws Throwable { - super.finalize(); - close(); - } - - /***********************************************************************/ - public Array createArrayOf(String arg0, Object[] arg1) throws SQLException { - return con.createArrayOf(arg0, arg1); - } - - /***********************************************************************/ - public Blob createBlob() throws SQLException { - return con.createBlob(); - } - - /***********************************************************************/ - public Clob createClob() throws SQLException { - return con.createClob(); - } - - /***********************************************************************/ - public NClob createNClob() throws SQLException { - return con.createNClob(); - } - - /***********************************************************************/ - public SQLXML createSQLXML() throws SQLException { - return con.createSQLXML(); - } - - /***********************************************************************/ - public Struct createStruct(String arg0, Object[] arg1) throws SQLException { - return con.createStruct(arg0, arg1); - } - - /***********************************************************************/ - public Properties getClientInfo() throws SQLException { - return con.getClientInfo(); - } - - /***********************************************************************/ - public String getClientInfo(String arg0) throws SQLException { - return con.getClientInfo(arg0); - } - - /***********************************************************************/ - public boolean isValid(int arg0) throws SQLException { - return con.isValid(arg0); - } - - /***********************************************************************/ - public void setClientInfo(Properties arg0) throws SQLClientInfoException { - con.setClientInfo(arg0); - } - - /***********************************************************************/ - public void setClientInfo(String arg0, String arg1) throws SQLClientInfoException { - con.setClientInfo(arg0, arg1); - } - - /***********************************************************************/ - public boolean isWrapperFor(Class arg0) throws SQLException { - return con.isWrapperFor(arg0); - } - - /***********************************************************************/ - public T unwrap(Class arg0) throws SQLException { - return con.unwrap(arg0); - } - - /***********************************************************************/ - /***********************************************************************/ - public void abort(Executor executor) throws SQLException { - // TODO Auto-generated method stub - } - - public int getNetworkTimeout() throws SQLException { - // TODO Auto-generated method stub - return 0; - } - - public String getSchema() throws SQLException { - // TODO Auto-generated method stub - return null; - } - - public void setNetworkTimeout(Executor executor, int milliseconds) throws SQLException { - // TODO Auto-generated method stub - } - - public void setSchema(String schema) throws SQLException { - // TODO Auto-generated method stub - } -} From ec62c2d64a45f656f42229af817baaf729794d60 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Tue, 17 Mar 2015 10:56:14 -0700 Subject: [PATCH 050/111] clean, move filters --- .../com/spun/util/filters/ClassFilter.java | 18 ----- .../java/com/spun/util/filters/FilterIn.java | 33 -------- .../com/spun/util/filters/FilterUtils.java | 78 ------------------- .../java/com/spun/util/filters/OrFilter.java | 33 -------- .../teachingkidsprogramming/util}/Filter.java | 2 +- .../util/FilterUtils.java | 46 +++++++++++ .../util/MethodExecutionPath.java | 3 - 7 files changed, 47 insertions(+), 166 deletions(-) delete mode 100644 src/main/java/com/spun/util/filters/ClassFilter.java delete mode 100644 src/main/java/com/spun/util/filters/FilterIn.java delete mode 100644 src/main/java/com/spun/util/filters/FilterUtils.java delete mode 100644 src/main/java/com/spun/util/filters/OrFilter.java rename src/main/java/{com/spun/util/filters => org/teachingkidsprogramming/util}/Filter.java (93%) create mode 100644 src/main/java/org/teachingkidsprogramming/util/FilterUtils.java diff --git a/src/main/java/com/spun/util/filters/ClassFilter.java b/src/main/java/com/spun/util/filters/ClassFilter.java deleted file mode 100644 index 68016a2..0000000 --- a/src/main/java/com/spun/util/filters/ClassFilter.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.spun.util.filters; - -public class ClassFilter implements Filter -{ - private Class clazz; - /***********************************************************************/ - public ClassFilter(Class clazz) - { - this.clazz = clazz; - } - /***********************************************************************/ - public boolean isExtracted(Object object) throws IllegalArgumentException - { - return clazz.isInstance(object); - } - /***********************************************************************/ - /***********************************************************************/ -} diff --git a/src/main/java/com/spun/util/filters/FilterIn.java b/src/main/java/com/spun/util/filters/FilterIn.java deleted file mode 100644 index 7f989ef..0000000 --- a/src/main/java/com/spun/util/filters/FilterIn.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.spun.util.filters; - -import org.teachingkidsprogramming.util.ObjectUtils; - -/** - * Listens to the state of a EnabledConditions object - **/ - - -public class FilterIn - implements Filter -{ - private Object[] objects; - - - /***********************************************************************/ - public FilterIn(Object[] objects) - { - this.objects = objects; - } - /***********************************************************************/ - /** - * @return true if the object would be extracted by the filter - * @throws IllegalArgumentException if the object is not supported by the filter - **/ - public boolean isExtracted(Object object) - throws IllegalArgumentException - { - return ObjectUtils.isIn(object, objects); - } - /**************************************************************************/ - /**************************************************************************/ -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/filters/FilterUtils.java b/src/main/java/com/spun/util/filters/FilterUtils.java deleted file mode 100644 index b1d7909..0000000 --- a/src/main/java/com/spun/util/filters/FilterUtils.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.spun.util.filters; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; - -/** - * Listens to the state of a EnabledConditions object - **/ -public class FilterUtils -{ - /***********************************************************************/ - /** - * @return a new List containing all elements of the list for which isExtracted() would return true - **/ - public static ArrayList retainExtracted(Collection fromList, Filter filter) throws IllegalArgumentException - { - return filter(fromList, filter, true); - } - /***********************************************************************/ - /** - * @return a new List containing all elements of the list for which isExtracted() would return false - **/ - public static ArrayList retainPurified(List fromList, Filter filter) throws IllegalArgumentException - { - return filter(fromList, filter, false); - } - /***********************************************************************/ - /** - * @return a new List containing all elements of the list for which isExtracted() would return true - **/ - public static ArrayList retainExtracted(T fromObjects[], Filter filter) throws IllegalArgumentException - { - return fromObjects == null ? new ArrayList() : filter(Arrays.asList(fromObjects), filter, true); - } - /***********************************************************************/ - /** - * @return a new List containing all elements of the list for which isExtracted() would return true - **/ - private static ArrayList filter(Iterable collection, Filter filter, boolean retainExtracted) throws IllegalArgumentException - { - ArrayList extracted = new ArrayList(); - if (collection != null) - { - for (T t : collection) - { - boolean ex = (filter == null || filter.isExtracted(t)); - if (ex == retainExtracted) - { - extracted.add(t); - } - } - } - return extracted; - } - /***********************************************************************/ - /** - * @return a new List containing all elements of the list for which isExtracted() would return false - **/ - public static ArrayList retainPurified(T fromObjects[], Filter filter) throws IllegalArgumentException - { - return filter(Arrays.asList(fromObjects), filter, false); - } - /***********************************************************************/ - /* INNER CLASSES */ - /***********************************************************************/ - public static class FilterNotNull implements Filter - { - /***********************************************************************/ - public boolean isExtracted(Object object) throws IllegalArgumentException - { - return object != null; - } - } - /***********************************************************************/ - /***********************************************************************/ -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/filters/OrFilter.java b/src/main/java/com/spun/util/filters/OrFilter.java deleted file mode 100644 index c643275..0000000 --- a/src/main/java/com/spun/util/filters/OrFilter.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.spun.util.filters; - -/** - * Listens to the state of a EnabledConditions object - **/ - - -public class OrFilter - implements Filter -{ - private Filter filter1 = null; - private Filter filter2 = null; - - - /***********************************************************************/ - public OrFilter(Filter filter1,Filter filter2) - { - this.filter1 = filter1; - this.filter2 = filter2; - } - /***********************************************************************/ - /** - * @return true if the object would be extracted by the filter - * @throws IllegalArgumentException if the object is not supported by the filter - **/ - public boolean isExtracted(Object object) - throws IllegalArgumentException - { - return filter1.isExtracted(object) || filter2.isExtracted(object); - } - /**************************************************************************/ - /**************************************************************************/ -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/filters/Filter.java b/src/main/java/org/teachingkidsprogramming/util/Filter.java similarity index 93% rename from src/main/java/com/spun/util/filters/Filter.java rename to src/main/java/org/teachingkidsprogramming/util/Filter.java index cc1430a..92e3b5f 100644 --- a/src/main/java/com/spun/util/filters/Filter.java +++ b/src/main/java/org/teachingkidsprogramming/util/Filter.java @@ -1,4 +1,4 @@ -package com.spun.util.filters; +package org.teachingkidsprogramming.util; /** * Listens to the state of a EnabledConditions object diff --git a/src/main/java/org/teachingkidsprogramming/util/FilterUtils.java b/src/main/java/org/teachingkidsprogramming/util/FilterUtils.java new file mode 100644 index 0000000..4a14519 --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/util/FilterUtils.java @@ -0,0 +1,46 @@ +package org.teachingkidsprogramming.util; + +import java.util.ArrayList; +import java.util.Arrays; + +/** + * Listens to the state of a EnabledConditions object + **/ +public class FilterUtils +{ + /***********************************************************************/ + /***********************************************************************/ + /***********************************************************************/ + /** + * @return a new List containing all elements of the list for which isExtracted() would return true + **/ + public static ArrayList retainExtracted(T fromObjects[], Filter filter) throws IllegalArgumentException + { + return fromObjects == null ? new ArrayList<>() : filter(Arrays.asList(fromObjects), filter, true); + } + /***********************************************************************/ + /** + * @return a new List containing all elements of the list for which isExtracted() would return true + **/ + private static ArrayList filter(Iterable collection, Filter filter, boolean retainExtracted) throws IllegalArgumentException + { + ArrayList extracted = new ArrayList<>(); + if (collection != null) + { + for (T t : collection) + { + boolean ex = (filter == null || filter.isExtracted(t)); + if (ex == retainExtracted) + { + extracted.add(t); + } + } + } + return extracted; + } + /***********************************************************************/ + /***********************************************************************/ + /* INNER CLASSES */ + /***********************************************************************/ + /***********************************************************************/ +} \ No newline at end of file diff --git a/src/main/java/org/teachingkidsprogramming/util/MethodExecutionPath.java b/src/main/java/org/teachingkidsprogramming/util/MethodExecutionPath.java index dc4e654..ade0785 100644 --- a/src/main/java/org/teachingkidsprogramming/util/MethodExecutionPath.java +++ b/src/main/java/org/teachingkidsprogramming/util/MethodExecutionPath.java @@ -3,9 +3,6 @@ import java.io.Serializable; import java.lang.reflect.Method; -import com.spun.util.filters.Filter; -import com.spun.util.filters.FilterUtils; - public class MethodExecutionPath implements Serializable { private static final long serialVersionUID = 880073980003375984L; From 4fda05d8cfb353a54ef2ff1cee4b51c3f13b1608 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Tue, 17 Mar 2015 10:57:36 -0700 Subject: [PATCH 051/111] removed introspection --- .../spun/util/introspection/ClassGetter.java | 31 ------------------- 1 file changed, 31 deletions(-) delete mode 100644 src/main/java/com/spun/util/introspection/ClassGetter.java diff --git a/src/main/java/com/spun/util/introspection/ClassGetter.java b/src/main/java/com/spun/util/introspection/ClassGetter.java deleted file mode 100644 index 4eb2dd4..0000000 --- a/src/main/java/com/spun/util/introspection/ClassGetter.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.spun.util.introspection; - -import java.io.File; -import java.util.ArrayList; - -import com.spun.util.io.FileUtils; -import com.spun.util.io.filefilters.JavaClassFileFilter; - -public class ClassGetter -{ - public static ArrayList getClasses(String packageName, String classSuffix) throws ClassNotFoundException - { - ArrayList classes = new ArrayList(); - File[] testFiles = FileUtils.getRecursiveFileList(new File("."), new JavaClassFileFilter(packageName, classSuffix)); - String pathHead = packageName.substring(0, packageName.indexOf('.')); - for (int i = 0; i < testFiles.length; i++) - { - Class clazz = Class.forName(getJavaName(testFiles[i], pathHead)); - classes.add(clazz); - } - return classes; - } - private static String getJavaName(File file, String pathHead) - { - String path = file.getAbsolutePath(); - String extension = ".class"; - String fullName = path.substring(path.indexOf(File.separator + pathHead + File.separator) + 1, path.length() - - extension.length()); - return fullName.replace(File.separatorChar, '.'); - } -} From 85f015bd45e8128b4224a5b2a0ede98b5e4e85aa Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Tue, 17 Mar 2015 14:26:18 -0700 Subject: [PATCH 052/111] clean, move io package --- .../spun/util/io/CharSequenceInputStream.java | 12 - src/main/java/com/spun/util/io/FTPConfig.java | 22 -- .../java/com/spun/util/io/FileMonitor.java | 69 ---- src/main/java/com/spun/util/io/FileUtils.java | 334 ------------------ .../io/InternetConnectivityException.java | 77 ---- src/main/java/com/spun/util/io/NetUtils.java | 116 ------ .../spun/util/io/SpaceDelimitedReader.java | 89 ----- .../util/io/StackElementLevelSelector.java | 17 - .../spun/util/io/TabDelimitedFileReader.java | 77 ---- .../io/filefilters/ExtenstionFileFilter.java | 22 -- .../io/filefilters/JavaClassFileFilter.java | 23 -- .../com/spun/util/io/xml/XmlExtractor.java | 18 - .../spun/util/velocity/VelocityParser.java | 2 +- .../approvaltests/approvers/FileApprover.java | 2 +- .../namer/JUnitStackTraceNamer.java | 2 +- .../reporters/ExecutableQueryFailure.java | 2 +- .../reporters/FileLauncherReporter.java | 2 +- .../reporters/GenericDiffReporter.java | 2 +- .../reporters/JunitReporter.java | 2 +- .../reporters/TextWebReporter.java | 2 +- .../writers/ApprovalBinaryFileWriter.java | 2 +- .../writers/ApprovalTextWriter.java | 2 +- .../writers/ApprovalXmlWriter.java | 2 +- .../writers/FileApprovalWriter.java | 2 +- .../logo/VirtualProctorWeb.java | 2 +- .../setup/MacThumbDriveInstaller.java | 2 +- .../setup/SetupValidator.java | 4 +- .../simpleparser/Parser.java | 2 +- .../utils/VirtualProctor.java | 2 +- .../util/TestUtils.java | 4 +- .../util/io/FileMonitor.java | 51 +++ .../util/io/FileUtils.java | 172 +++++++++ .../util/io/SimpleDirectoryFilter.java | 24 +- .../util/io/SimpleFileFilter.java | 24 +- .../util/io/StackElementSelector.java | 2 +- .../util/io/ZipUtils.java | 32 +- .../logo/tests/ColorGeneration.java | 2 +- .../setup/tests/UnzipTest.java | 2 +- .../util/io/tests}/FileMonitorTest.java | 6 +- 39 files changed, 278 insertions(+), 953 deletions(-) delete mode 100644 src/main/java/com/spun/util/io/CharSequenceInputStream.java delete mode 100644 src/main/java/com/spun/util/io/FTPConfig.java delete mode 100644 src/main/java/com/spun/util/io/FileMonitor.java delete mode 100644 src/main/java/com/spun/util/io/FileUtils.java delete mode 100644 src/main/java/com/spun/util/io/InternetConnectivityException.java delete mode 100644 src/main/java/com/spun/util/io/NetUtils.java delete mode 100644 src/main/java/com/spun/util/io/SpaceDelimitedReader.java delete mode 100644 src/main/java/com/spun/util/io/StackElementLevelSelector.java delete mode 100644 src/main/java/com/spun/util/io/TabDelimitedFileReader.java delete mode 100644 src/main/java/com/spun/util/io/filefilters/ExtenstionFileFilter.java delete mode 100644 src/main/java/com/spun/util/io/filefilters/JavaClassFileFilter.java delete mode 100644 src/main/java/com/spun/util/io/xml/XmlExtractor.java create mode 100644 src/main/java/org/teachingkidsprogramming/util/io/FileMonitor.java create mode 100644 src/main/java/org/teachingkidsprogramming/util/io/FileUtils.java rename src/main/java/{com/spun => org/teachingkidsprogramming}/util/io/SimpleDirectoryFilter.java (55%) rename src/main/java/{com/spun => org/teachingkidsprogramming}/util/io/SimpleFileFilter.java (54%) rename src/main/java/{com/spun => org/teachingkidsprogramming}/util/io/StackElementSelector.java (75%) rename src/main/java/{com/spun => org/teachingkidsprogramming}/util/io/ZipUtils.java (81%) rename src/{main/java/com/spun/util/io => test/java/org/teachingkidsprogramming/util/io/tests}/FileMonitorTest.java (86%) diff --git a/src/main/java/com/spun/util/io/CharSequenceInputStream.java b/src/main/java/com/spun/util/io/CharSequenceInputStream.java deleted file mode 100644 index 37d9338..0000000 --- a/src/main/java/com/spun/util/io/CharSequenceInputStream.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.spun.util.io; - -import java.io.IOException; -import java.io.InputStream; - -public class CharSequenceInputStream extends InputStream { - @Override - public int read() throws IOException { - // TODO Auto-generated method stub - return 0; - } -} diff --git a/src/main/java/com/spun/util/io/FTPConfig.java b/src/main/java/com/spun/util/io/FTPConfig.java deleted file mode 100644 index de0be9d..0000000 --- a/src/main/java/com/spun/util/io/FTPConfig.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.spun.util.io; - - -/** - * A static class of convence functions for Files - **/ -public class FTPConfig -{ - public static final int DEFUALT_FTP_PORT = 21; - public String host, userName, password; - public int port = 0; - /***********************************************************************/ - public FTPConfig(String host,int port, String userName,String password) - { - this.host = host; - this.port = port; - this.userName = userName; - this.password = password; - } - /************************************************************************/ - /************************************************************************/ -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/io/FileMonitor.java b/src/main/java/com/spun/util/io/FileMonitor.java deleted file mode 100644 index fdbca9d..0000000 --- a/src/main/java/com/spun/util/io/FileMonitor.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.spun.util.io; - -import java.io.File; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; -import java.util.Timer; -import java.util.TimerTask; - -public class FileMonitor -{ - private Timer timer; - private Map files; - private Set listeners; - public FileMonitor(long pollingInterval) - { - files = new HashMap(); - listeners = new HashSet(); - timer = new Timer(true); - timer.schedule(new FileMonitorNotifier(), 0, pollingInterval); - } - public void stop() - { - timer.cancel(); - } - public void addFile(File file) - { - if (!files.containsKey(file)) - { - files.put(file, (file.exists() ? file.lastModified() : -1L)); - } - } - public void removeFile(File file) - { - files.remove(file); - } - public void addListener(FileListener fileListener) - { - listeners.add(fileListener); - } - public void removeListener(FileListener fileListener) - { - listeners.remove(fileListener); - } - private class FileMonitorNotifier extends TimerTask - { - public void run() - { - for (File file : files.keySet()) - { - long lastModifiedTime = ((Long) files.get(file)).longValue(); - long newModifiedTime = file.exists() ? file.lastModified() : -1; - if (newModifiedTime != lastModifiedTime) - { - files.put(file, newModifiedTime); - for (FileListener listener : listeners) - { - listener.fileChanged(file); - } - } - } - } - } - public interface FileListener - { - void fileChanged(File file); - } -} diff --git a/src/main/java/com/spun/util/io/FileUtils.java b/src/main/java/com/spun/util/io/FileUtils.java deleted file mode 100644 index 9741158..0000000 --- a/src/main/java/com/spun/util/io/FileUtils.java +++ /dev/null @@ -1,334 +0,0 @@ -package com.spun.util.io; - -import java.io.BufferedReader; -import java.io.BufferedWriter; -import java.io.DataOutputStream; -import java.io.File; -import java.io.FileFilter; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.io.Reader; -import java.nio.channels.FileChannel; -import java.util.ArrayList; -import java.util.List; - -import org.teachingkidsprogramming.util.ArrayUtils; -import org.teachingkidsprogramming.util.Asserts; -import org.teachingkidsprogramming.util.ObjectUtils; - -/** - * A static class of convenience functions for Files - **/ -public class FileUtils -{ - /***********************************************************************/ - public static void deleteDirectory(File directory) throws IOException - { - // delete all directory - File directories[] = directory.listFiles(new SimpleDirectoryFilter()); - for (int i = 0; i < directories.length; i++) - { - deleteDirectory(directories[i]); - } - // Delete all Files. - File files[] = directory.listFiles(new SimpleFileFilter()); - for (int i = 0; i < files.length; i++) - { - files[i].delete(); - } - // delete self. - directory.delete(); - } - public static String readFromClassPath(Class clazz, String string) - { - final InputStream resourceAsStream = clazz.getClassLoader().getResourceAsStream(string); - if (resourceAsStream == null) - { - String message = String.format("Could not find %s from %s", string, clazz.getName()); - throw new RuntimeException(message); - } - String resource = FileUtils.readStream(resourceAsStream); - return resource; - } - /***********************************************************************/ - public static File[] getRecursiveFileList(File directory) - { - return getRecursiveFileList(directory, new SimpleFileFilter()); - } - /***********************************************************************/ - public static File[] getRecursiveFileList(File directory, FileFilter filter) - { - ArrayList list = new ArrayList(); - if (!directory.isDirectory()) { throw new Error("File is not a directory: " + directory.getName()); } - File directories[] = directory.listFiles(new SimpleDirectoryFilter()); - for (int i = 0; i < directories.length; i++) - { - ArrayUtils.addArray(list, getRecursiveFileList(directories[i], filter)); - } - File files[] = directory.listFiles(filter); - ArrayUtils.addArray(list, files); - return list.toArray(new File[list.size()]); - } - /***********************************************************************/ - public static void copyFile(File in, File out) - { - try - { - FileChannel inChannel = null, outChannel = null; - try - { - out.getParentFile().mkdirs(); - inChannel = new FileInputStream(in).getChannel(); - outChannel = new FileOutputStream(out).getChannel(); - outChannel.transferFrom(inChannel, 0, inChannel.size()); - } - finally - { - if (inChannel != null) - { - inChannel.close(); - } - if (outChannel != null) - { - outChannel.close(); - } - } - } - catch (Exception e) - { - ObjectUtils.throwAsError(e); - } - } - public static void copyStream(InputStream in, OutputStream out) throws IOException - { - byte[] buf = new byte[1024]; - int i = 0; - while ((i = in.read(buf)) != -1) - { - out.write(buf, 0, i); - } - in.close(); - out.close(); - } - /***********************************************************************/ - public static void redirectInputToFile(String fileName, InputStream in) throws Exception - { - FileOutputStream fos = new FileOutputStream(new File(fileName), false); - copyStream(in, fos); - } - /***********************************************************************/ - public static void copyFileToDirectory(String file, File tempDir) throws Exception - { - File in = new File(file); - File out = new File(tempDir, in.getName()); - copyFile(in, out); - } - /***********************************************************************/ - public static void writeFile(File file, String text) throws IOException - { - Asserts.assertNotNull("Writing to file: " + file, text); - file.getCanonicalFile().getParentFile().mkdirs(); - BufferedWriter out = new BufferedWriter(new FileWriter(file)); - out.write(text); - out.close(); - } - /***********************************************************************/ - public static void writeFileQuietly(File file, String text) - { - try - { - writeFile(file, text); - } - catch (IOException e) - { - ObjectUtils.throwAsError(e); - } - } - public static void writeFile(File file, CharSequence data) throws IOException - { - Asserts.assertNotNull("Writing to file: " + file, data); - file.getCanonicalFile().getParentFile().mkdirs(); - DataOutputStream writer = new DataOutputStream(new FileOutputStream(file)); - for (int i = 0; i < data.length(); i++) - { - writer.write(data.charAt(i)); - } - writer.close(); - } - public static void writeFile(File file, InputStream data) throws IOException - { - Asserts.assertNotNull("Writing to file: " + file, data); - file.getCanonicalFile().getParentFile().mkdirs(); - copyStream(data, new FileOutputStream(file)); - } - /***********************************************************************/ - public static String readFile(String absolutePath) throws IOException - { - return readFile(new File(absolutePath)); - } - /***********************************************************************/ - public static String readFile(File file) throws IOException - { - BufferedReader in = new BufferedReader(new FileReader(file)); - return readBuffer(in); - } - public static String readBuffer(BufferedReader in) throws IOException - { - StringBuffer string = new StringBuffer(); - while (in.ready()) - { - string.append(in.readLine()); - string.append("\n"); - } - in.close(); - return string.toString(); - } - /************************************************************************/ - public static String readFileWithSuppressedExceptions(File databaseFile) - { - try - { - return FileUtils.readFile(databaseFile); - } - catch (FileNotFoundException e) - { - throw new RuntimeException("Invalid file '" + databaseFile.getAbsolutePath() + "'", e); - } - catch (IOException e) - { - throw new RuntimeException(e); - } - } - /************************************************************************/ - public static File saveToFile(String prefix, Reader input) - { - File file; - BufferedWriter bw = null; - try - { - file = File.createTempFile(prefix, null); - bw = new BufferedWriter(new FileWriter(file)); - BufferedReader inputReader = new BufferedReader(input); - String thisLine; - while ((thisLine = inputReader.readLine()) != null) - { - bw.write(thisLine); - bw.newLine(); - } - inputReader.close(); - } - catch (IOException e) - { - throw new RuntimeException("Unable to store order: " + e.getMessage(), e); - } - finally - { - try - { - if (bw != null) - { - bw.close(); - } - } - catch (IOException e) - {} - } - return file; - } - /************************************************************************/ - public static String getDirectoryFriendlyName(String name) - { - if (name == null) { return ""; } - StringBuffer result = new StringBuffer(); - for (int i = 0; i < name.length(); i++) - { - char c = name.charAt(i); - switch (c) - { - case '.' : - break; - default : - result.append(c); - break; - } - } - return result.toString(); - } - /************************************************************************/ - /************************************************************************/ - public static String getExtensionWithDot(String filename) - { - int p = filename.lastIndexOf('.'); - return filename.substring(p); - } - public static String getExtensionWithoutDot(String filename) - { - return getExtensionWithDot(filename).substring(1); - } - public static void createIfNeeded(String file) throws IOException - { - File f = new File(file); - if (!f.exists()) - { - writeFile(f, ""); - } - } - public static String readStream(InputStream resourceAsStream) - { - BufferedReader reader = new BufferedReader(new InputStreamReader(resourceAsStream)); - String resource = null; - try - { - resource = FileUtils.readBuffer(reader); - } - catch (IOException e) - { - ObjectUtils.throwAsError(e); - } - return resource; - } - public static char[] loadResourceFromClasspathAsBytes(Class clazz, String name) throws IOException - { - return extractBytes(clazz.getResourceAsStream(name)); - } - public static char[] extractBytes(final InputStream resourceAsStream) throws IOException - { - ArrayList data = new ArrayList(); - int b = resourceAsStream.read(); - while (b != -1) - { - data.add(new Character((char) b)); - b = resourceAsStream.read(); - } - return FileUtils.toChars(data); - } - public static char[] toChars(List data) - { - char[] out = new char[data.size()]; - for (int i = 0; i < out.length; i++) - { - out[i] = data.get(i); - } - return out; - } - public static boolean isNonEmptyFile(String approved) - { - File file = new File(approved); - return file.exists() && file.length() > 0; - } - public static void ensureParentDirectoriesExist(File file) - { - File dir = file.getParentFile(); - if (!dir.exists()) - { - dir.mkdirs(); - } - } -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/io/InternetConnectivityException.java b/src/main/java/com/spun/util/io/InternetConnectivityException.java deleted file mode 100644 index c5c50ff..0000000 --- a/src/main/java/com/spun/util/io/InternetConnectivityException.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.spun.util.io; - -import java.net.InetAddress; - -import org.apache.commons.net.EchoTCPClient; - -import org.teachingkidsprogramming.util.MySystem; - -/** - * A static class of convenience functions for Files - **/ -public class InternetConnectivityException extends Error -{ - private String htmlText; - private Throwable cause; - - /***********************************************************************/ - public void setCause(Throwable t) - { - this.cause = t; - } - /***********************************************************************/ - - public InternetConnectivityException(String string) - { - super(string); - } - /***********************************************************************/ - public void setHTMLText(String htmlText) - { - this.htmlText = htmlText; - } - /***********************************************************************/ - public String getHTMLText() - { - return htmlText; - } - /***********************************************************************/ - public static InternetConnectivityException testInternetConnectivity() - { - String[] sites = {"www.google.com", "www.yahoo.com", "www.msn.com"}; - - for (int i = 0; i < sites.length; i++) - { - if (pingSite(sites[i])) { return null; } - } - return new InternetConnectivityException("There is no internet connection."); - } - - /***********************************************************************/ - public String toString() - { - return super.toString() + "\n" + (cause == null ? "" : "Causation: " + cause.toString()); - } - /***********************************************************************/ - - private static boolean pingSite(String site) - { - try - { - EchoTCPClient client = new EchoTCPClient(); - client.setDefaultTimeout(1000); - client.connect(InetAddress.getByName(site), 80); - client.disconnect(); - return true; - } - catch (Exception e) - { - MySystem.warning(site, e); - return false; - } - - } - /***********************************************************************/ - /************************************************************************/ - -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/io/NetUtils.java b/src/main/java/com/spun/util/io/NetUtils.java deleted file mode 100644 index a71045c..0000000 --- a/src/main/java/com/spun/util/io/NetUtils.java +++ /dev/null @@ -1,116 +0,0 @@ -package com.spun.util.io; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; - -import org.apache.commons.httpclient.HttpClient; -import org.apache.commons.httpclient.HttpException; -import org.apache.commons.httpclient.methods.GetMethod; -import org.apache.commons.net.ftp.FTP; -import org.apache.commons.net.ftp.FTPClient; -import org.apache.commons.net.ftp.FTPReply; - -import org.teachingkidsprogramming.util.MySystem; -import com.sshtools.j2ssh.SftpClient; -import com.sshtools.j2ssh.SshClient; -import com.sshtools.j2ssh.authentication.PasswordAuthenticationClient; -import com.sshtools.j2ssh.transport.IgnoreHostKeyVerification; - -/** - * A static class of convenience functions for Files - **/ -public class NetUtils -{ - /***********************************************************************/ - public static void ftpUpload(FTPConfig config, String directory, File file, String remoteFileName) - throws IOException - { - FTPClient server = new FTPClient(); - server.connect(config.host, config.port); - assertValidReplyCode(server.getReplyCode(), server); - server.login(config.userName, config.password); - assertValidReplyCode(server.getReplyCode(), server); - assertValidReplyCode(server.cwd(directory), server); - server.setFileTransferMode(FTP.IMAGE_FILE_TYPE); - server.setFileType(FTP.IMAGE_FILE_TYPE); - server.storeFile(remoteFileName, new FileInputStream(file)); - assertValidReplyCode(server.getReplyCode(), server); - server.sendNoOp(); - server.disconnect(); - } - /***********************************************************************/ - public static void ftpUpload(FTPConfig config, String directory, File file) throws IOException - { - ftpUpload(config, directory, file, file.getName()); - } - /***********************************************************************/ - public static void sftpUpload(FTPConfig config, File file, String remoteFileName) throws IOException - { - SshClient ssh = new SshClient(); - SftpClient sftp = sshLogin(config, ssh); - sftp.mkdirs(remoteFileName.substring(0, remoteFileName.lastIndexOf("/"))); - sftp.put(new FileInputStream(file), remoteFileName); - sftp.quit(); - ssh.disconnect(); - } - /************************************************************************/ - private static SftpClient sshLogin(FTPConfig config, SshClient ssh) throws IOException - { - ssh.setSocketTimeout(60000); - ssh.connect(config.host, new IgnoreHostKeyVerification()); - PasswordAuthenticationClient pwd = new PasswordAuthenticationClient(); - pwd.setUsername(config.userName); - pwd.setPassword(config.password); - ssh.authenticate(pwd); - SftpClient sftp = ssh.openSftpClient(); - return sftp; - } - /************************************************************************/ - public static File sftpDownload(FTPConfig config, File file, String remoteFileName) throws IOException - { - SshClient ssh = new SshClient(); - SftpClient sftp = sshLogin(config, ssh); - sftp.get(remoteFileName, new FileOutputStream(file)); - sftp.quit(); - ssh.disconnect(); - return file; - } - /***********************************************************************/ - private static void assertValidReplyCode(int code, FTPClient ftp) - { - if (FTPReply.isPositiveCompletion(code)) - { - //good - MySystem.variable("Good Completion code " + code); - } - else if (FTPReply.isPositiveIntermediate(code)) - { - // do nothing - MySystem.variable("Good Intermediate code " + code); - } - else if (FTPReply.isPositivePreliminary(code)) - { - // do nothing - MySystem.variable("Good Preliminary code " + code); - } - else - { - // bad - throw new Error("Problem encountered with FTP Server, returned Code " + code + ", replied '" - + ftp.getReplyString() + "'"); - } - } - /***********************************************************************/ - /************************************************************************/ - public static String loadWebPage(String url, String parameters) throws IOException, HttpException - { - HttpClient client = new HttpClient(); - GetMethod method = new GetMethod(url); - method.setQueryString(parameters); - client.executeMethod(method); - String html = method.getResponseBodyAsString(); - return html; - } -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/io/SpaceDelimitedReader.java b/src/main/java/com/spun/util/io/SpaceDelimitedReader.java deleted file mode 100644 index b6ee567..0000000 --- a/src/main/java/com/spun/util/io/SpaceDelimitedReader.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.spun.util.io; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.StringReader; - -import org.teachingkidsprogramming.util.MySystem; - -/** - * A static class of convence functions for Files - **/ -public class SpaceDelimitedReader -{ - private BufferedReader reader = null; - private String lastRead = null; - public boolean trim = false; - /************************************************************************/ - public SpaceDelimitedReader(String input, boolean trim) - { - this.reader = new BufferedReader(new StringReader(input)); - this.trim = trim; - } - /***********************************************************************/ - public boolean next() throws IOException - { - return prepNext() != null; - } - /***********************************************************************/ - public String prepNext() throws IOException - { - if (reader == null) { return null; } - lastRead = reader.readLine(); - if (lastRead == null) - { - reader.close(); - reader = null; - } - MySystem.variable(lastRead); - return lastRead; - } - /***********************************************************************/ - public String[] readLine(int i) throws IOException - { - return readLine(new int[] {i}); - } - /***********************************************************************/ - public String[] readLine(int[] breakPoints) throws IOException - { - if (lastRead == null) - { - if (prepNext() == null) - { - return null; - } - } - String[] found = splitStringAtPoints(breakPoints, lastRead, trim); - - lastRead = null; - return found; - } - /***********************************************************************/ - public static String[] splitStringAtPoints(int[] breakPoints, String line, boolean trim) - { - if (line == null) { return null; } - if (breakPoints == null) - { - breakPoints = new int[0]; - } - String[] found = new String[breakPoints.length + 1]; - int last = 0; - for (int i = 0; i < breakPoints.length; i++) - { - found[i] = readStringPart(line, last, breakPoints[i], trim); - last = breakPoints[i]; - } - found[breakPoints.length] = readStringPart(line, last, line.length(), trim); - return found; - } - /***********************************************************************/ - public static String readStringPart(String string, int start, int end, boolean trim) - { - if (start >= string.length()) { return null; } - String found = string.substring(start, end); - return trim ? found.trim() : found; - } - /***********************************************************************/ - /***********************************************************************/ - -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/io/StackElementLevelSelector.java b/src/main/java/com/spun/util/io/StackElementLevelSelector.java deleted file mode 100644 index 04ba64e..0000000 --- a/src/main/java/com/spun/util/io/StackElementLevelSelector.java +++ /dev/null @@ -1,17 +0,0 @@ -/** - * - */ -package com.spun.util.io; - -public class StackElementLevelSelector implements StackElementSelector -{ - private final int ignoreLevels; - public StackElementLevelSelector(int ignoreLevels) - { - this.ignoreLevels = ignoreLevels; - } - public StackTraceElement selectElement(StackTraceElement[] trace) - { - return trace[ignoreLevels + 1]; - } -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/io/TabDelimitedFileReader.java b/src/main/java/com/spun/util/io/TabDelimitedFileReader.java deleted file mode 100644 index 12c037f..0000000 --- a/src/main/java/com/spun/util/io/TabDelimitedFileReader.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.spun.util.io; - -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; - -import org.teachingkidsprogramming.util.StringUtils; - -/** - * A static class of convence functions for Files - **/ -public class TabDelimitedFileReader -{ - private BufferedReader reader = null; - private String lastRead = null; - private boolean trim = false; - /************************************************************************/ - public TabDelimitedFileReader(String absoluteFileName, boolean trim) throws FileNotFoundException - { - this.reader = new BufferedReader(new FileReader(absoluteFileName)); - this.trim = trim; - } - /***********************************************************************/ - public boolean next() throws IOException - { - return prepNext() != null; - } - /***********************************************************************/ - public String prepNext() throws IOException - { - if (reader == null) { return null; } - lastRead = reader.readLine(); - if (lastRead == null) - { - reader.close(); - reader = null; - } - return lastRead; - } - /***********************************************************************/ - public String[] readLine(int minimumIndexReturned) throws IOException - { - if (lastRead == null) - { - if (prepNext() == null) - { - return null; - } - } - String[] found = StringUtils.split(lastRead, "\t", trim); - clean(found); - if (found.length < minimumIndexReturned) - { - String[] temp = new String[minimumIndexReturned]; - System.arraycopy(found, 0, temp, 0, found.length); - found = temp; - } - lastRead = null; - return found; - } - /***********************************************************************/ - private void clean(String[] found) - { - for (int i = 0; i < found.length; i++) - { - if (found[i] != null && found[i].startsWith("\"") && found[i].endsWith("\"")) - { - found[i] = found[i].substring(1, found[i].length()-1); - found[i] = found[i].replaceAll("\"\"", "\""); - } - } - } - /***********************************************************************/ - /************************************************************************/ - -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/io/filefilters/ExtenstionFileFilter.java b/src/main/java/com/spun/util/io/filefilters/ExtenstionFileFilter.java deleted file mode 100644 index f844ee8..0000000 --- a/src/main/java/com/spun/util/io/filefilters/ExtenstionFileFilter.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.spun.util.io.filefilters; - -import java.io.File; -import java.io.FilenameFilter; - -public class ExtenstionFileFilter implements FilenameFilter -{ - private final String[] extenstions; - public ExtenstionFileFilter(String... extenstions) - { - this.extenstions = extenstions; - } - @Override - public boolean accept(File dir, String name) - { - for (String end : extenstions) - { - if (name.endsWith(end)) { return true; } - } - return false; - } -} diff --git a/src/main/java/com/spun/util/io/filefilters/JavaClassFileFilter.java b/src/main/java/com/spun/util/io/filefilters/JavaClassFileFilter.java deleted file mode 100644 index 6efa0e3..0000000 --- a/src/main/java/com/spun/util/io/filefilters/JavaClassFileFilter.java +++ /dev/null @@ -1,23 +0,0 @@ - -package com.spun.util.io.filefilters; - -import java.io.File; -import java.io.FileFilter; - -public class JavaClassFileFilter implements FileFilter -{ - private final String classSuffix; - private String startsWith; - private String pathHead; - public JavaClassFileFilter(String startsWith, String classSuffix) - { - this.classSuffix = classSuffix; - this.startsWith = startsWith.replace('.', File.separatorChar); - } - public boolean accept(File pathname) - { - String name = pathname.getName(); - boolean fileIsTest = name.endsWith(classSuffix + ".class") && pathname.toString().contains(startsWith); - return fileIsTest; - } -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/io/xml/XmlExtractor.java b/src/main/java/com/spun/util/io/xml/XmlExtractor.java deleted file mode 100644 index 457b0ac..0000000 --- a/src/main/java/com/spun/util/io/xml/XmlExtractor.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.spun.util.io.xml; - -import java.lang.reflect.InvocationTargetException; - -import org.w3c.dom.Node; - -/***********************************************************************/ - -public interface XmlExtractor -{ - - /***********************************************************************/ - - public Object extractObjectForNode(Node node) - throws IllegalArgumentException, IllegalAccessException, InvocationTargetException, InstantiationException; - /***********************************************************************/ - /***********************************************************************/ -} diff --git a/src/main/java/com/spun/util/velocity/VelocityParser.java b/src/main/java/com/spun/util/velocity/VelocityParser.java index 8ee0c8d..12c24a2 100644 --- a/src/main/java/com/spun/util/velocity/VelocityParser.java +++ b/src/main/java/com/spun/util/velocity/VelocityParser.java @@ -16,7 +16,7 @@ import org.apache.velocity.runtime.log.NullLogSystem; import org.teachingkidsprogramming.util.ObjectUtils; -import com.spun.util.io.FileUtils; +import org.teachingkidsprogramming.util.io.FileUtils; import com.spun.util.parser.ParserCommons; public class VelocityParser diff --git a/src/main/java/org/approvaltests/approvers/FileApprover.java b/src/main/java/org/approvaltests/approvers/FileApprover.java index 2a5fd87..5677280 100644 --- a/src/main/java/org/approvaltests/approvers/FileApprover.java +++ b/src/main/java/org/approvaltests/approvers/FileApprover.java @@ -13,7 +13,7 @@ import org.approvaltests.namer.NamerFactory; import org.teachingkidsprogramming.util.ObjectUtils; -import com.spun.util.io.FileUtils; +import org.teachingkidsprogramming.util.io.FileUtils; public class FileApprover implements ApprovalApprover { diff --git a/src/main/java/org/approvaltests/namer/JUnitStackTraceNamer.java b/src/main/java/org/approvaltests/namer/JUnitStackTraceNamer.java index 299480a..3d0ef81 100644 --- a/src/main/java/org/approvaltests/namer/JUnitStackTraceNamer.java +++ b/src/main/java/org/approvaltests/namer/JUnitStackTraceNamer.java @@ -10,7 +10,7 @@ import org.teachingkidsprogramming.util.ObjectUtils; import org.teachingkidsprogramming.util.StackTraceReflectionResult; import org.teachingkidsprogramming.util.TestUtils; -import com.spun.util.io.StackElementSelector; +import org.teachingkidsprogramming.util.io.StackElementSelector; public class JUnitStackTraceNamer implements ApprovalNamer { diff --git a/src/main/java/org/approvaltests/reporters/ExecutableQueryFailure.java b/src/main/java/org/approvaltests/reporters/ExecutableQueryFailure.java index edc4c66..7a9ee06 100644 --- a/src/main/java/org/approvaltests/reporters/ExecutableQueryFailure.java +++ b/src/main/java/org/approvaltests/reporters/ExecutableQueryFailure.java @@ -7,7 +7,7 @@ import org.approvaltests.core.ApprovalFailureReporter; import org.approvaltests.core.ApprovalReporterWithCleanUp; -import com.spun.util.io.FileUtils; +import org.teachingkidsprogramming.util.io.FileUtils; import com.spun.util.persistence.ExecutableQuery; public class ExecutableQueryFailure implements ApprovalFailureReporter, ApprovalReporterWithCleanUp diff --git a/src/main/java/org/approvaltests/reporters/FileLauncherReporter.java b/src/main/java/org/approvaltests/reporters/FileLauncherReporter.java index 8d6beb5..8ef9afc 100644 --- a/src/main/java/org/approvaltests/reporters/FileLauncherReporter.java +++ b/src/main/java/org/approvaltests/reporters/FileLauncherReporter.java @@ -4,7 +4,7 @@ import org.approvaltests.core.ApprovalFailureReporter; import org.teachingkidsprogramming.util.TestUtils; -import com.spun.util.io.FileUtils; +import org.teachingkidsprogramming.util.io.FileUtils; public class FileLauncherReporter implements ApprovalFailureReporter { diff --git a/src/main/java/org/approvaltests/reporters/GenericDiffReporter.java b/src/main/java/org/approvaltests/reporters/GenericDiffReporter.java index 9049823..b36b2e4 100644 --- a/src/main/java/org/approvaltests/reporters/GenericDiffReporter.java +++ b/src/main/java/org/approvaltests/reporters/GenericDiffReporter.java @@ -6,7 +6,7 @@ import java.util.List; import org.teachingkidsprogramming.util.ThreadUtils; -import com.spun.util.io.FileUtils; +import org.teachingkidsprogramming.util.io.FileUtils; public class GenericDiffReporter implements EnvironmentAwareReporter { diff --git a/src/main/java/org/approvaltests/reporters/JunitReporter.java b/src/main/java/org/approvaltests/reporters/JunitReporter.java index ee9ef10..c36912c 100644 --- a/src/main/java/org/approvaltests/reporters/JunitReporter.java +++ b/src/main/java/org/approvaltests/reporters/JunitReporter.java @@ -4,7 +4,7 @@ import junit.framework.TestCase; -import com.spun.util.io.FileUtils; +import org.teachingkidsprogramming.util.io.FileUtils; public class JunitReporter implements EnvironmentAwareReporter { diff --git a/src/main/java/org/approvaltests/reporters/TextWebReporter.java b/src/main/java/org/approvaltests/reporters/TextWebReporter.java index 213facf..8c6c221 100644 --- a/src/main/java/org/approvaltests/reporters/TextWebReporter.java +++ b/src/main/java/org/approvaltests/reporters/TextWebReporter.java @@ -5,7 +5,7 @@ import org.approvaltests.core.ApprovalFailureReporter; import org.teachingkidsprogramming.util.TestUtils; -import com.spun.util.io.FileUtils; +import org.teachingkidsprogramming.util.io.FileUtils; public class TextWebReporter implements ApprovalFailureReporter { diff --git a/src/main/java/org/approvaltests/writers/ApprovalBinaryFileWriter.java b/src/main/java/org/approvaltests/writers/ApprovalBinaryFileWriter.java index 6c01f9a..6e0a74e 100644 --- a/src/main/java/org/approvaltests/writers/ApprovalBinaryFileWriter.java +++ b/src/main/java/org/approvaltests/writers/ApprovalBinaryFileWriter.java @@ -7,7 +7,7 @@ import org.approvaltests.core.ApprovalWriter; -import com.spun.util.io.FileUtils; +import org.teachingkidsprogramming.util.io.FileUtils; public class ApprovalBinaryFileWriter implements ApprovalWriter { private CharSequence data; diff --git a/src/main/java/org/approvaltests/writers/ApprovalTextWriter.java b/src/main/java/org/approvaltests/writers/ApprovalTextWriter.java index 224787f..117947b 100644 --- a/src/main/java/org/approvaltests/writers/ApprovalTextWriter.java +++ b/src/main/java/org/approvaltests/writers/ApprovalTextWriter.java @@ -4,7 +4,7 @@ import org.approvaltests.core.ApprovalWriter; -import com.spun.util.io.FileUtils; +import org.teachingkidsprogramming.util.io.FileUtils; public class ApprovalTextWriter implements ApprovalWriter { diff --git a/src/main/java/org/approvaltests/writers/ApprovalXmlWriter.java b/src/main/java/org/approvaltests/writers/ApprovalXmlWriter.java index 1cdef3f..5ee8452 100644 --- a/src/main/java/org/approvaltests/writers/ApprovalXmlWriter.java +++ b/src/main/java/org/approvaltests/writers/ApprovalXmlWriter.java @@ -2,7 +2,7 @@ import java.io.InputStream; -import com.spun.util.io.FileUtils; +import org.teachingkidsprogramming.util.io.FileUtils; public class ApprovalXmlWriter extends ApprovalTextWriter { diff --git a/src/main/java/org/approvaltests/writers/FileApprovalWriter.java b/src/main/java/org/approvaltests/writers/FileApprovalWriter.java index f20da34..0103d2a 100644 --- a/src/main/java/org/approvaltests/writers/FileApprovalWriter.java +++ b/src/main/java/org/approvaltests/writers/FileApprovalWriter.java @@ -4,7 +4,7 @@ import org.approvaltests.core.ApprovalWriter; -import com.spun.util.io.FileUtils; +import org.teachingkidsprogramming.util.io.FileUtils; public class FileApprovalWriter implements ApprovalWriter { diff --git a/src/main/java/org/teachingextensions/logo/VirtualProctorWeb.java b/src/main/java/org/teachingextensions/logo/VirtualProctorWeb.java index 078846d..6541450 100644 --- a/src/main/java/org/teachingextensions/logo/VirtualProctorWeb.java +++ b/src/main/java/org/teachingextensions/logo/VirtualProctorWeb.java @@ -20,7 +20,7 @@ import org.teachingkidsprogramming.util.MySystem; import org.teachingkidsprogramming.util.ThreadLauncher; import org.teachingkidsprogramming.util.ThreadUtils; -import com.spun.util.io.FileUtils; +import org.teachingkidsprogramming.util.io.FileUtils; public class VirtualProctorWeb extends WindowAdapter { diff --git a/src/main/java/org/teachingextensions/setup/MacThumbDriveInstaller.java b/src/main/java/org/teachingextensions/setup/MacThumbDriveInstaller.java index 5093a30..535a85b 100644 --- a/src/main/java/org/teachingextensions/setup/MacThumbDriveInstaller.java +++ b/src/main/java/org/teachingextensions/setup/MacThumbDriveInstaller.java @@ -6,7 +6,7 @@ import javax.swing.filechooser.FileSystemView; import org.teachingkidsprogramming.util.ObjectUtils; -import com.spun.util.io.ZipUtils; +import org.teachingkidsprogramming.util.io.ZipUtils; public class MacThumbDriveInstaller { diff --git a/src/main/java/org/teachingextensions/setup/SetupValidator.java b/src/main/java/org/teachingextensions/setup/SetupValidator.java index bd2c786..b9cfe45 100644 --- a/src/main/java/org/teachingextensions/setup/SetupValidator.java +++ b/src/main/java/org/teachingextensions/setup/SetupValidator.java @@ -6,8 +6,8 @@ import org.teachingextensions.windows.MessageBox; import org.teachingkidsprogramming.util.ObjectUtils; -import com.spun.util.io.FileUtils; -import com.spun.util.io.ZipUtils; +import org.teachingkidsprogramming.util.io.FileUtils; +import org.teachingkidsprogramming.util.io.ZipUtils; public class SetupValidator { diff --git a/src/main/java/org/teachingextensions/simpleparser/Parser.java b/src/main/java/org/teachingextensions/simpleparser/Parser.java index d3692f2..684ac4b 100644 --- a/src/main/java/org/teachingextensions/simpleparser/Parser.java +++ b/src/main/java/org/teachingextensions/simpleparser/Parser.java @@ -7,7 +7,7 @@ import org.lambda.query.Query; import org.teachingkidsprogramming.util.ObjectUtils; -import com.spun.util.io.FileUtils; +import org.teachingkidsprogramming.util.io.FileUtils; public class Parser { diff --git a/src/main/java/org/teachingextensions/utils/VirtualProctor.java b/src/main/java/org/teachingextensions/utils/VirtualProctor.java index 3ee4b87..c577db7 100644 --- a/src/main/java/org/teachingextensions/utils/VirtualProctor.java +++ b/src/main/java/org/teachingextensions/utils/VirtualProctor.java @@ -3,7 +3,7 @@ import java.io.File; import org.teachingkidsprogramming.util.StringUtils; -import com.spun.util.io.FileUtils; +import org.teachingkidsprogramming.util.io.FileUtils; /** * files; + private Set listeners; + + public FileMonitor(long pollingInterval) { + files = new HashMap<>(); + listeners = new HashSet<>(); + timer = new Timer(true); + timer.schedule(new FileMonitorNotifier(), 0, pollingInterval); + } + + public void stop() { + timer.cancel(); + } + + public void addFile(File file) { + if (!files.containsKey(file)) { + files.put(file, (file.exists() ? file.lastModified() : -1L)); + } + } + + public void addListener(FileListener fileListener) { + listeners.add(fileListener); + } + + private class FileMonitorNotifier extends TimerTask { + public void run() { + for (File file : files.keySet()) { + long lastModifiedTime; + lastModifiedTime = files.get(file); + long newModifiedTime = file.exists() ? file.lastModified() : -1; + if (newModifiedTime != lastModifiedTime) { + files.put(file, newModifiedTime); + for (FileListener listener : listeners) { + listener.fileChanged(file); + } + } + } + } + } + + public interface FileListener { + void fileChanged(File file); + } +} diff --git a/src/main/java/org/teachingkidsprogramming/util/io/FileUtils.java b/src/main/java/org/teachingkidsprogramming/util/io/FileUtils.java new file mode 100644 index 0000000..bbda80f --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/util/io/FileUtils.java @@ -0,0 +1,172 @@ +package org.teachingkidsprogramming.util.io; + +import org.teachingkidsprogramming.util.ArrayUtils; +import org.teachingkidsprogramming.util.Asserts; +import org.teachingkidsprogramming.util.ObjectUtils; + +import java.io.*; +import java.util.ArrayList; + +/** + * A static class of convenience functions for Files + */ +public class FileUtils { + public static String readFromClassPath(Class clazz, String string) { + final InputStream resourceAsStream = clazz.getClassLoader().getResourceAsStream(string); + if (resourceAsStream == null) { + String message = String.format("Could not find %s from %s", string, clazz.getName()); + throw new RuntimeException(message); + } + return FileUtils.readStream(resourceAsStream); + } + + /** + * ******************************************************************* + */ + public static File[] getRecursiveFileList(File directory) { + return getRecursiveFileList(directory, new SimpleFileFilter()); + } + + /** + * ******************************************************************* + */ + public static File[] getRecursiveFileList(File directory, FileFilter filter) { + ArrayList list = new ArrayList<>(); + if (!directory.isDirectory()) { + throw new Error("File is not a directory: " + directory.getName()); + } + File directories[] = directory.listFiles(new SimpleDirectoryFilter()); + for (File directory1 : directories) { + ArrayUtils.addArray(list, getRecursiveFileList(directory1, filter)); + } + File files[] = directory.listFiles(filter); + ArrayUtils.addArray(list, files); + return list.toArray(new File[list.size()]); + } + + public static void copyStream(InputStream in, OutputStream out) throws IOException { + byte[] buf = new byte[1024]; + int i; + while ((i = in.read(buf)) != -1) { + out.write(buf, 0, i); + } + in.close(); + out.close(); + } + + /** + * ******************************************************************* + */ + public static void redirectInputToFile(String fileName, InputStream in) throws Exception { + FileOutputStream fos = new FileOutputStream(new File(fileName), false); + copyStream(in, fos); + } + + /** + * ******************************************************************* + */ + public static void writeFile(File file, String text) throws IOException { + Asserts.assertNotNull("Writing to file: " + file, text); + file.getCanonicalFile().getParentFile().mkdirs(); + BufferedWriter out = new BufferedWriter(new FileWriter(file)); + out.write(text); + out.close(); + } + + /** + * ******************************************************************* + */ + public static void writeFileQuietly(File file, String text) { + try { + writeFile(file, text); + } catch (IOException e) { + ObjectUtils.throwAsError(e); + } + } + + public static void writeFile(File file, CharSequence data) throws IOException { + Asserts.assertNotNull("Writing to file: " + file, data); + file.getCanonicalFile().getParentFile().mkdirs(); + DataOutputStream writer = new DataOutputStream(new FileOutputStream(file)); + for (int i = 0; i < data.length(); i++) { + writer.write(data.charAt(i)); + } + writer.close(); + } + + public static void writeFile(File file, InputStream data) throws IOException { + Asserts.assertNotNull("Writing to file: " + file, data); + file.getCanonicalFile().getParentFile().mkdirs(); + copyStream(data, new FileOutputStream(file)); + } + + /** + * ******************************************************************* + */ + public static String readFile(String absolutePath) throws IOException { + return readFile(new File(absolutePath)); + } + + /** + * ******************************************************************* + */ + public static String readFile(File file) throws IOException { + BufferedReader in = new BufferedReader(new FileReader(file)); + return readBuffer(in); + } + + public static String readBuffer(BufferedReader in) throws IOException { + StringBuilder string = new StringBuilder(); + while (in.ready()) { + string.append(in.readLine()); + string.append("\n"); + } + in.close(); + return string.toString(); + } + + /** + * ******************************************************************** + */ + public static String readFileWithSuppressedExceptions(File databaseFile) { + try { + return FileUtils.readFile(databaseFile); + } catch (FileNotFoundException e) { + throw new RuntimeException("Invalid file '" + databaseFile.getAbsolutePath() + "'", e); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + /************************************************************************/ + /** + * ******************************************************************** + */ + public static String getExtensionWithDot(String filename) { + int p = filename.lastIndexOf('.'); + return filename.substring(p); + } + + public static void createIfNeeded(String file) throws IOException { + File f = new File(file); + if (!f.exists()) { + writeFile(f, ""); + } + } + + public static String readStream(InputStream resourceAsStream) { + BufferedReader reader = new BufferedReader(new InputStreamReader(resourceAsStream)); + String resource = null; + try { + resource = FileUtils.readBuffer(reader); + } catch (IOException e) { + ObjectUtils.throwAsError(e); + } + return resource; + } + + public static boolean isNonEmptyFile(String approved) { + File file = new File(approved); + return file.exists() && file.length() > 0; + } +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/io/SimpleDirectoryFilter.java b/src/main/java/org/teachingkidsprogramming/util/io/SimpleDirectoryFilter.java similarity index 55% rename from src/main/java/com/spun/util/io/SimpleDirectoryFilter.java rename to src/main/java/org/teachingkidsprogramming/util/io/SimpleDirectoryFilter.java index 3559a2e..c3f1574 100644 --- a/src/main/java/com/spun/util/io/SimpleDirectoryFilter.java +++ b/src/main/java/org/teachingkidsprogramming/util/io/SimpleDirectoryFilter.java @@ -1,4 +1,4 @@ -package com.spun.util.io; +package org.teachingkidsprogramming.util.io; import java.io.File; @@ -12,23 +12,11 @@ public SimpleDirectoryFilter() /***********************************************************************/ - public boolean accept(File pathname) - { - String name = pathname.getName().toLowerCase(); - boolean accept = false; - if (name.equals(".") || name .equals("..")) - { - accept = false; - } - else if (pathname.isDirectory()) - { - accept = true; - } - else - { - accept = false; - } - return accept; + public boolean accept(File pathname) { + String name = pathname.getName().toLowerCase(); + boolean accept; + accept = !(name.equals(".") || name.equals("..")) && pathname.isDirectory(); + return accept; } /************************************************************************/ /************************************************************************/ diff --git a/src/main/java/com/spun/util/io/SimpleFileFilter.java b/src/main/java/org/teachingkidsprogramming/util/io/SimpleFileFilter.java similarity index 54% rename from src/main/java/com/spun/util/io/SimpleFileFilter.java rename to src/main/java/org/teachingkidsprogramming/util/io/SimpleFileFilter.java index fdd3ac4..da434d9 100644 --- a/src/main/java/com/spun/util/io/SimpleFileFilter.java +++ b/src/main/java/org/teachingkidsprogramming/util/io/SimpleFileFilter.java @@ -1,4 +1,4 @@ -package com.spun.util.io; +package org.teachingkidsprogramming.util.io; import java.io.File; @@ -9,23 +9,11 @@ public SimpleFileFilter() { } /***********************************************************************/ - public boolean accept(File pathname) - { - String name = pathname.getName().toLowerCase(); - boolean accept = false; - if (name.equals(".") || name.equals("..")) - { - accept = false; - } - else if (pathname.isDirectory()) - { - accept = false; - } - else - { - accept = true; - } - return accept; + public boolean accept(File pathname) { + String name = pathname.getName().toLowerCase(); + boolean accept; + accept = !(name.equals(".") || name.equals("..")) && !pathname.isDirectory(); + return accept; } /************************************************************************/ /************************************************************************/ diff --git a/src/main/java/com/spun/util/io/StackElementSelector.java b/src/main/java/org/teachingkidsprogramming/util/io/StackElementSelector.java similarity index 75% rename from src/main/java/com/spun/util/io/StackElementSelector.java rename to src/main/java/org/teachingkidsprogramming/util/io/StackElementSelector.java index 560160a..08c78a2 100644 --- a/src/main/java/com/spun/util/io/StackElementSelector.java +++ b/src/main/java/org/teachingkidsprogramming/util/io/StackElementSelector.java @@ -1,4 +1,4 @@ -package com.spun.util.io; +package org.teachingkidsprogramming.util.io; public interface StackElementSelector { diff --git a/src/main/java/com/spun/util/io/ZipUtils.java b/src/main/java/org/teachingkidsprogramming/util/io/ZipUtils.java similarity index 81% rename from src/main/java/com/spun/util/io/ZipUtils.java rename to src/main/java/org/teachingkidsprogramming/util/io/ZipUtils.java index 163784f..a2af96b 100644 --- a/src/main/java/com/spun/util/io/ZipUtils.java +++ b/src/main/java/org/teachingkidsprogramming/util/io/ZipUtils.java @@ -1,4 +1,6 @@ -package com.spun.util.io; +package org.teachingkidsprogramming.util.io; + +import org.teachingkidsprogramming.util.io.FileUtils; import java.io.File; import java.io.FileInputStream; @@ -10,7 +12,7 @@ import java.util.zip.ZipOutputStream; /** - * A static class of convence functions for Files + * A static class of convenience functions for Files **/ public class ZipUtils { @@ -32,20 +34,18 @@ public static File doCreateZipFile(File[] files, File zipFile) throws IOExceptio FileOutputStream fileOut = new FileOutputStream(zipFile); ZipOutputStream out = new ZipOutputStream(fileOut); // Compress the files - for (int i = 0; i < files.length; i++) - { - FileInputStream in = new FileInputStream(files[i]); - out.putNextEntry(new ZipEntry(files[i].getName())); - // Transfer bytes from the file to the ZIP file - int len; - while ((len = in.read(buf)) > 0) - { - out.write(buf, 0, len); + for (File file : files) { + FileInputStream in = new FileInputStream(file); + out.putNextEntry(new ZipEntry(file.getName())); + // Transfer bytes from the file to the ZIP file + int len; + while ((len = in.read(buf)) > 0) { + out.write(buf, 0, len); + } + // Complete the entry + out.closeEntry(); + in.close(); } - // Complete the entry - out.closeEntry(); - in.close(); - } // Complete the ZIP file out.close(); fileOut.close(); @@ -54,7 +54,7 @@ public static File doCreateZipFile(File[] files, File zipFile) throws IOExceptio /***********************************************************************/ public static File[] doUnzip(File destination, File zipFile) throws IOException { - ArrayList list = new ArrayList(); + ArrayList list = new ArrayList<>(); byte[] buf = new byte[1024]; FileInputStream fileIn = new FileInputStream(zipFile); ZipInputStream in = new ZipInputStream(fileIn); diff --git a/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.java b/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.java index 172375d..8191719 100644 --- a/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.java +++ b/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.java @@ -18,7 +18,7 @@ import org.teachingkidsprogramming.util.StringUtils; import org.teachingkidsprogramming.util.TestUtils; import org.teachingkidsprogramming.util.Tuple; -import com.spun.util.io.FileUtils; +import org.teachingkidsprogramming.util.io.FileUtils; import com.spun.util.velocity.ContextAware.ContextAwareMap; import com.spun.util.velocity.VelocityParser; diff --git a/src/test/java/org/teachingextensions/setup/tests/UnzipTest.java b/src/test/java/org/teachingextensions/setup/tests/UnzipTest.java index 19c97e9..1c7bf78 100644 --- a/src/test/java/org/teachingextensions/setup/tests/UnzipTest.java +++ b/src/test/java/org/teachingextensions/setup/tests/UnzipTest.java @@ -2,7 +2,7 @@ import java.io.File; -import com.spun.util.io.ZipUtils; +import org.teachingkidsprogramming.util.io.ZipUtils; public class UnzipTest // extends TestCase { diff --git a/src/main/java/com/spun/util/io/FileMonitorTest.java b/src/test/java/org/teachingkidsprogramming/util/io/tests/FileMonitorTest.java similarity index 86% rename from src/main/java/com/spun/util/io/FileMonitorTest.java rename to src/test/java/org/teachingkidsprogramming/util/io/tests/FileMonitorTest.java index e8f121b..58cac7d 100644 --- a/src/main/java/com/spun/util/io/FileMonitorTest.java +++ b/src/test/java/org/teachingkidsprogramming/util/io/tests/FileMonitorTest.java @@ -1,8 +1,10 @@ -package com.spun.util.io; +package org.teachingkidsprogramming.util.io.tests; import java.io.File; + +import org.teachingkidsprogramming.util.io.FileMonitor; import junit.framework.TestCase; -import com.spun.util.io.FileMonitor.FileListener; +import org.teachingkidsprogramming.util.io.FileMonitor.FileListener; public class FileMonitorTest extends TestCase { From f19e7258341c2ac15c1796fad862a6eb67cf0b3a Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Tue, 17 Mar 2015 14:41:42 -0700 Subject: [PATCH 053/111] clean, move parser package --- .../com/spun/util/parser/CurrencyAmount.java | 27 -- .../com/spun/util/parser/FileLocator.java | 63 --- .../java/com/spun/util/parser/MassAmount.java | 65 --- .../com/spun/util/parser/ParserCommons.java | 277 ----------- .../spun/util/parser/PercentageAmount.java | 61 --- .../com/spun/util/parser/ResourceLocator.java | 7 - .../spun/util/parser/SteppingIterator.java | 108 ----- .../com/spun/util/parser/TemplateArray.java | 67 --- .../com/spun/util/parser/TemplateDate.java | 193 -------- .../com/spun/util/parser/TemplateDouble.java | 136 ------ .../com/spun/util/parser/TemplateError.java | 84 ---- .../spun/util/parser/TemplateNumberUtils.java | 105 ----- .../spun/util/parser/TemplateStringUtils.java | 48 -- .../com/spun/util/parser/Templateparsing.jj | 438 ------------------ .../com/spun/util/parser/VelocityList.java | 156 ------- .../com/spun/util/servlets/ErrorToString.java | 2 +- .../servlets/SecondaryErrorProcessor.java | 2 +- .../spun/util/velocity/VelocityParser.java | 2 +- .../util/parser/ParserCommons.java | 52 +++ .../util/parser/TemplateError.java | 75 +++ 20 files changed, 130 insertions(+), 1838 deletions(-) delete mode 100644 src/main/java/com/spun/util/parser/CurrencyAmount.java delete mode 100644 src/main/java/com/spun/util/parser/FileLocator.java delete mode 100644 src/main/java/com/spun/util/parser/MassAmount.java delete mode 100644 src/main/java/com/spun/util/parser/ParserCommons.java delete mode 100644 src/main/java/com/spun/util/parser/PercentageAmount.java delete mode 100644 src/main/java/com/spun/util/parser/ResourceLocator.java delete mode 100644 src/main/java/com/spun/util/parser/SteppingIterator.java delete mode 100644 src/main/java/com/spun/util/parser/TemplateArray.java delete mode 100644 src/main/java/com/spun/util/parser/TemplateDate.java delete mode 100644 src/main/java/com/spun/util/parser/TemplateDouble.java delete mode 100644 src/main/java/com/spun/util/parser/TemplateError.java delete mode 100644 src/main/java/com/spun/util/parser/TemplateNumberUtils.java delete mode 100644 src/main/java/com/spun/util/parser/TemplateStringUtils.java delete mode 100644 src/main/java/com/spun/util/parser/Templateparsing.jj delete mode 100644 src/main/java/com/spun/util/parser/VelocityList.java create mode 100644 src/main/java/org/teachingkidsprogramming/util/parser/ParserCommons.java create mode 100644 src/main/java/org/teachingkidsprogramming/util/parser/TemplateError.java diff --git a/src/main/java/com/spun/util/parser/CurrencyAmount.java b/src/main/java/com/spun/util/parser/CurrencyAmount.java deleted file mode 100644 index fad0da8..0000000 --- a/src/main/java/com/spun/util/parser/CurrencyAmount.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.spun.util.parser; - -public class CurrencyAmount extends TemplateDouble -{ - /************************************************************************/ - public CurrencyAmount(double amount) - { - super(amount, "$", "", 2, 2); - } - /************************************************************************/ - public String toString() - { - return inFormat("$", 2, 2, null, true); - } - /************************************************************************/ - public static String inDefaultFormat(double d) - { - return inFormat(d, "$", 2, 2, null, true); - } - /************************************************************************/ - public String withoutCents() - { - return inFormat("$", 0, 0, null, true); - } - /************************************************************************/ - /************************************************************************/ -} diff --git a/src/main/java/com/spun/util/parser/FileLocator.java b/src/main/java/com/spun/util/parser/FileLocator.java deleted file mode 100644 index e3821bc..0000000 --- a/src/main/java/com/spun/util/parser/FileLocator.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.spun.util.parser; - -import java.io.File; -import java.util.Arrays; -import java.util.HashMap; - -public class FileLocator implements ResourceLocator -{ - private HashMap paths = new HashMap(); - private boolean failOnNotFound = true; - private String[] basePaths; - /***********************************************************************/ - public FileLocator(String[] basePaths) - { - this(basePaths, true); - } - /***********************************************************************/ - public FileLocator(String[] basePaths, boolean failOnNotFound) - { - this.basePaths = basePaths; - this.failOnNotFound = failOnNotFound; - } - /***********************************************************************/ - public String getLocation(String fileName) - { - String absolutePath = (String) paths.get(fileName); - if (absolutePath == null) - { - for (int i = 0; i < basePaths.length; i++) - { - File file = new File(basePaths[i] + File.separator + fileName); - if (file.exists()) - { - absolutePath = registerFile(fileName, file); - break; - } - } - } - if (absolutePath == null) - { - if (failOnNotFound) - { - throw new NullPointerException(" The file '" + fileName + "' could not be found in " + Arrays.asList(basePaths).toString() + " with base dir = " + new File(".").getAbsolutePath()); - } - else - { - File file = new File(basePaths[0] + File.separator + fileName); - absolutePath = registerFile(fileName, file); - } - } - return absolutePath; - } - /***********************************************************************/ - - private String registerFile(String fileName, File file) - { - String absolutePath = file.getAbsolutePath(); - paths.put(fileName, absolutePath); - return absolutePath; - } - /***********************************************************************/ - /***********************************************************************/ -} diff --git a/src/main/java/com/spun/util/parser/MassAmount.java b/src/main/java/com/spun/util/parser/MassAmount.java deleted file mode 100644 index 56232c5..0000000 --- a/src/main/java/com/spun/util/parser/MassAmount.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.spun.util.parser; - -import org.teachingkidsprogramming.util.StringUtils; - -public class MassAmount extends TemplateDouble -{ - public static final int GRAMS = 0; - public static final int KILOGRAMS = 1; - public static final int POUNDS = 2; - public static final String UNITS[] = {"Grams", "Kilograms", "Pounds"}; - private static final double UNIT_CONVERSIONS[] = {1, .001, 0.00220467}; - /************************************************************************/ - public MassAmount(double amount) - { - super(amount, "", "", 0, 2); - } - /************************************************************************/ - public MassAmount(double amount, int units) - { - super(convertUnits(amount, units, GRAMS), "", "", 0, 2); - } - /************************************************************************/ - public static int getUnits(String value) - { - return StringUtils.resolveEnumeration(value, UNITS); - } - /************************************************************************/ - public static double convertUnits(double amount, int fromUnits, int toUnits) - { - return (amount / UNIT_CONVERSIONS[fromUnits]) * UNIT_CONVERSIONS[toUnits]; - } - /************************************************************************/ - public double convertUnits(int toUnits) - { - return this.amount * UNIT_CONVERSIONS[toUnits]; - } - /************************************************************************/ - public double getAmountInUnits(int desiredUnits) - { - return convertUnits(desiredUnits); - } - /************************************************************************/ - public String inUnits(String desiredUnits) - { - return inFormat(getAmountInUnits(getUnits(desiredUnits)), defaultPrefix, defaultMaximumPrecision, defaultMinimumPrecision, defaultPostfix, true); - } - /************************************************************************/ - public String inUnits(String desiredUnits, int maximumPrecision, int minimumPrecision) - { - return inFormat(getAmountInUnits(getUnits(desiredUnits)), defaultPrefix, maximumPrecision, getDefaultMinimumPrecision(maximumPrecision), - defaultPostfix, true); - } - /************************************************************************/ - public int getPoundsRoundedUp() - { - return getRoundedUp(MassAmount.POUNDS); - } - /************************************************************************/ - public int getRoundedUp(int inUnits) - { - return (int) Math.ceil(convertUnits(inUnits) - 0.001); - } - /************************************************************************/ - /************************************************************************/ -} diff --git a/src/main/java/com/spun/util/parser/ParserCommons.java b/src/main/java/com/spun/util/parser/ParserCommons.java deleted file mode 100644 index bc9d20c..0000000 --- a/src/main/java/com/spun/util/parser/ParserCommons.java +++ /dev/null @@ -1,277 +0,0 @@ -package com.spun.util.parser; - -import java.util.Collection; -import java.util.Collections; -import java.util.Date; -import java.util.List; -import org.teachingkidsprogramming.util.NumberUtils; -import org.teachingkidsprogramming.util.ObjectUtils; -import org.teachingkidsprogramming.util.PhoneNumber; -import com.spun.util.velocity.ParserDateUtils; - -public class ParserCommons -{ - public static TemplateStringUtils stringUtils = TemplateStringUtils.INSTANCE; - public static TemplateNumberUtils numberUtils = TemplateNumberUtils.INSTANCE; - public static TemplateDate today = TemplateDate.INSTANCE; - public static ParserCommons INSTANCE = new ParserCommons(); - - /***********************************************************************/ - public static TemplateNumberUtils getNumberUtils() - { - return numberUtils; - } - - /***********************************************************************/ - public static Class getClass(String clazz) throws ClassNotFoundException - { - return Class.forName(clazz); - } - - public static Object createNew(String clazz) throws InstantiationException, - IllegalAccessException, ClassNotFoundException - { - return getClass(clazz).newInstance(); - } - - /***********************************************************************/ - public static Object getNull() - { - return null; - } - - /***********************************************************************/ - public static ParserDateUtils getDateUtils() - { - return ParserDateUtils.INSTANCE; - } - - /***********************************************************************/ - public static TemplateStringUtils getStringUtils() - { - return stringUtils; - } - - /***********************************************************************/ - public static String asJavascript(Object obj) - { - return TemplateStringUtils.toJavaScriptEncode(obj); - } - - /***********************************************************************/ - public static TemplateDate getToday() - { - return today; - } - - /***********************************************************************/ - public static TemplateDate asDate(Date date) - { - return new TemplateDate(date); - } - - /***********************************************************************/ - public static TemplateDouble asDouble(double number) - { - return new TemplateDouble(number); - } - - /***********************************************************************/ - public static PhoneNumber asPhoneNumber(String number) - { - return new PhoneNumber(number); - } - - /***********************************************************************/ - public static String asExcel(String text) - { - return TemplateStringUtils.formatExcelString(text); - } - - /***********************************************************************/ - public static boolean isNull(Object object) - { - return object == null; - } - - /***********************************************************************/ - public static PercentageAmount asPercentage(double d) - { - return new PercentageAmount(d); - } - - /***********************************************************************/ - public static TemplateDouble asDouble(Number number) - { - return new TemplateDouble(number.doubleValue()); - } - - /***********************************************************************/ - public static List asArray(Object[] array, int offset, int stepping) - { - return new VelocityList(array, offset, stepping).getAll(); - } - - /***********************************************************************/ - public static List asArray(Object[] array, int offset, int stepping1, - int stepping2) - { - return new VelocityList(array, offset, new int[] { stepping1, stepping2 }) - .getAll(); - } - - /***********************************************************************/ - public static List asArray(Object[] array) - { - return new VelocityList(array).getAll(); - } - - /***********************************************************************/ - public static List asArray(Object nullObject) - { - if (nullObject != null) - { - throw new Error("Improper usage"); - } - return new VelocityList(Collections.EMPTY_LIST).getAll(); - } - - /***********************************************************************/ - public static List asArray(List list) - { - return new VelocityList(list).getAll(); - } - - /***********************************************************************/ - public static TemplateDouble asDouble(int number) - { - return new TemplateDouble(number); - } - - /***********************************************************************/ - public static CurrencyAmount asCurrency(double number) - { - return new CurrencyAmount(number); - } - - /***********************************************************************/ - public static CurrencyAmount asCurrency(Number number) - { - return number == null ? new CurrencyAmount(0.00) : new CurrencyAmount( - number.doubleValue()); - } - - /***********************************************************************/ - public static CurrencyAmount asCurrency(int number) - { - return new CurrencyAmount(number); - } - - /***********************************************************************/ - public static CurrencyAmount asCurrencyAmount(double number) - { - return new CurrencyAmount(number); - } - - /***********************************************************************/ - public static CurrencyAmount asCurrencyAmount(Number number) - { - return new CurrencyAmount(number.doubleValue()); - } - - /***********************************************************************/ - public static CurrencyAmount asCurrencyAmount(int number) - { - return new CurrencyAmount(number); - } - - /***********************************************************************/ - public static TemplateDouble sum(Object[] array, String methodName) - { - return new TemplateDouble(NumberUtils.sum(array, methodName, null)); - } - - /***********************************************************************/ - public static TemplateDouble sum(Object[] array, String methodName, - Object param1) - { - return new TemplateDouble(NumberUtils.sum(array, methodName, - new Object[] { param1 })); - } - - /***********************************************************************/ - public static TemplateDouble sum(Object[] array, String methodName, - Object param1, Object param2) - { - return new TemplateDouble(NumberUtils.sum(array, methodName, new Object[] { - param1, param2 })); - } - - /***********************************************************************/ - public static int getArrayLength(Object[] array) - { - return array == null ? 0 : array.length; - } - - /***********************************************************************/ - public static int getLength(Object[] array) - { - return array == null ? 0 : array.length; - } - - /***********************************************************************/ - public static int getLength(Collection collection) - { - return collection == null ? 0 : collection.size(); - } - - /***********************************************************************/ - public static boolean isEmpty(Object[] array) - { - return getArrayLength(array) == 0; - } - - /***********************************************************************/ - public static boolean isNotEmpty(Object[] array) - { - return !isEmpty(array); - } - - /***********************************************************************/ - public static boolean isEmpty(List list) - { - return (list == null || list.size() == 0); - } - - /***********************************************************************/ - public static Object ternary(boolean test, Object ifTrue, Object ifFalse) - { - return test ? ifTrue : ifFalse; - } - - /***********************************************************************/ - public static Object get(Object[] array, int index) - { - return getArrayLength(array) > index ? array[index] : null; - } - - /***********************************************************************/ - public static Object get(List list, int index) - { - return list == null ? null : list.get(index); - } - - /***********************************************************************/ - public static void throwError(String errorString) - { - throw new Error(errorString); - } - - /***********************************************************************/ - public static void throwError(Throwable t) - { - throw ObjectUtils.throwAsError(t); - } - /***********************************************************************/ - /***********************************************************************/ -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/parser/PercentageAmount.java b/src/main/java/com/spun/util/parser/PercentageAmount.java deleted file mode 100644 index b9ba247..0000000 --- a/src/main/java/com/spun/util/parser/PercentageAmount.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.spun.util.parser; - -import org.teachingkidsprogramming.util.NumberUtils; - -public class PercentageAmount extends TemplateDouble -{ - /************************************************************************/ - public PercentageAmount(double amount) - { - super(amount, "", "%", 0, 2); - } - /************************************************************************/ - public static PercentageAmount createFromRatio(double a, double b) - { - return new PercentageAmount(getAmount(a, a + b)); - } - /************************************************************************/ - public static PercentageAmount createFromFraction(double a, double b) - { - return new PercentageAmount(getAmount(a, b)); - } - /************************************************************************/ - private static double getAmount(double a, double b) - { - double amount = NumberUtils.equals(b, 0, 0.00001) ? 1 : (a / b); - return amount; - } - /************************************************************************/ - public PercentageAmount getInverse() - { - return new PercentageAmount(1 - amount); - } - /***********************************************************************/ - public String inDefaultFormat() - { - return inFormat(amount * 100, "", 2, 0, "%", true); - } - /***********************************************************************/ - public String inIntegerFormat() - { - return inFormat(amount * 100, "", 0, 0, "%", true); - } - /***********************************************************************/ - public String inDefaultFormat(String prefix, int precision, int minimumPrecision, String postfix, - boolean useGrouping) - { - return inFormat(amount * 100, prefix, precision, minimumPrecision, postfix, useGrouping); - } - /************************************************************************/ - public String toString() - { - return inDefaultFormat(); - } - /************************************************************************/ - public String withoutPostfix() - { - return inFormat(amount * 100, null, 6, 0, null, false); - } - /************************************************************************/ - /************************************************************************/ -} diff --git a/src/main/java/com/spun/util/parser/ResourceLocator.java b/src/main/java/com/spun/util/parser/ResourceLocator.java deleted file mode 100644 index 21ca538..0000000 --- a/src/main/java/com/spun/util/parser/ResourceLocator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.spun.util.parser; - -public interface ResourceLocator -{ - /***********************************************************************/ - public abstract String getLocation(String fileName); -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/parser/SteppingIterator.java b/src/main/java/com/spun/util/parser/SteppingIterator.java deleted file mode 100644 index 89580ba..0000000 --- a/src/main/java/com/spun/util/parser/SteppingIterator.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.spun.util.parser; - -import java.util.Arrays; - -/***********************************************************************/ -public class SteppingIterator -{ - public static final int[] DEFAULT_STEPPING = {1}; - private int offset = 0; - private int[] stepping = DEFAULT_STEPPING; - private int actualSize = 0; - /***********************************************************************/ - public SteppingIterator(int offset, int[] stepping, int actualSize) - { - this.offset = offset; - this.stepping = stepping; - this.actualSize = actualSize; - assertSteppingValid(stepping); - } - /***********************************************************************/ - private void assertSteppingValid(int[] stepping) - { - if (stepping == null || stepping.length == 0 || stepping[0] == 0) { throw new NullPointerException( - "Stepping cannot be null or zero in " + Arrays.toString(stepping)); } - for (int i = stepping.length - 1; i > 0; i--) - { - if (stepping[i - 1] % stepping[i] != 0) - { - String string = String.format("Invalid stepping parameters - %s is not divisible by %s in parameters %s", - stepping[i - 1], stepping[i], Arrays.toString(stepping)); - throw new Error(string); - } - } - } - /***********************************************************************/ - public boolean isLast(int currentPlace, int forSteppingLevel) - { - if (forSteppingLevel == -1 || stepping[forSteppingLevel] == 1) - { - return (currentPlace + 1) == getSize(true, true); - } - else - { - return (((currentPlace + 1) % stepping[forSteppingLevel]) == 0); - } - } - /************************************************************************/ - public boolean isFirst(int index, int forSteppingLevel) - { - return (getStepPositionForRound(forSteppingLevel, 0, index) == 0); - } - /************************************************************************/ - public int getSize(boolean includeOffset, boolean includeStepping) - { - int size = actualSize; - size += includeOffset ? offset : 0; - if (includeStepping && (size % stepping[0]) != 0) - { - size += (stepping[0] - (size % stepping[0])); - } - return size; - } - /***********************************************************************/ - /** - * @return the index of the current Step. - **/ - public static int getStepCountForRound(int forSteppingLevel, int onIndex, int stepping[], int indexBase) - { - if (forSteppingLevel == -1 || stepping[forSteppingLevel] == 1) - { - return indexBase; - } - else - { - return ((onIndex / stepping[forSteppingLevel]) + indexBase); - } - } - /***********************************************************************/ - public int getStepCountForRound(int forSteppingLevel, int currentPlace, int indexBase) - { - return getStepCountForRound(forSteppingLevel, currentPlace, this.stepping, indexBase); - } - /***********************************************************************/ - public int getTotalStepCountForRound(int forSteppingLevel, int indexBase) - { - return getStepCountForRound(forSteppingLevel, getSize(true, true) - 1, stepping, indexBase); - } - /***********************************************************************/ - public int getStepPositionForRound(int forSteppingLevel, int indexBase, int currentIndex) - { - if (forSteppingLevel == -1 || stepping[forSteppingLevel] == 1) - { - return currentIndex + indexBase; - } - else - { - return ((currentIndex % stepping[forSteppingLevel]) + indexBase); - } - } - /***********************************************************************/ - public int getActualPosition(int position) - { - position = position - this.offset; - return (position < 0 || this.actualSize <= position) ? -1 : position; - } - /************************************************************************/ - /************************************************************************/ -} diff --git a/src/main/java/com/spun/util/parser/TemplateArray.java b/src/main/java/com/spun/util/parser/TemplateArray.java deleted file mode 100644 index 266be6a..0000000 --- a/src/main/java/com/spun/util/parser/TemplateArray.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.spun.util.parser; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import org.teachingkidsprogramming.util.ArrayUtils; - -public class TemplateArray -{ - private static String FILLER = "filler"; - /************************************************************************/ - public static Object[] join(Object part1[], Object part2[], String subsectionLabel, boolean forceIfEmpty) - { - if (part2 != null && part2.length == 0 && !forceIfEmpty) { return part1; } - ArrayList total = new ArrayList(); - ArrayUtils.addArray(total, part1); - total.add(new Subsection(subsectionLabel)); - ArrayUtils.addArray(total, part2); - return total.toArray(); - } - /***********************************************************************/ - public static List getFillers(List list, int total) - { - ArrayList newList = new ArrayList(list); - int needed = total - list.size(); - for (int i = 0; i < needed; i++) - { - newList.add(FILLER); - } - return newList; - } - /***********************************************************************/ - public static String addWhiteSpace(String text, int tabSize) - { - String whiteSpace = " "; - tabSize = tabSize - text.length(); - tabSize = (tabSize < 0) ? 0 : tabSize; - while (whiteSpace.length() < tabSize) - { - whiteSpace = whiteSpace + whiteSpace; - } - return whiteSpace.substring(0, tabSize); - } - /************************************************************************/ - public boolean isInitCall(String object, String params[]) - { - String initOn[] = {"init", "size", "isEmpty"}; - return (object.equals("") && (params.length > 0) && Arrays.asList(initOn).contains(params[0])); - } - /************************************************************************/ - /* INNER CLASSES */ - /************************************************************************/ - public static class Subsection - { - public String sectionName = null; - /************************************************************************/ - public Subsection(String sectionName) - { - super(); - this.sectionName = sectionName; - } - /************************************************************************/ - /************************************************************************/ - } - /************************************************************************/ - /************************************************************************/ -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/parser/TemplateDate.java b/src/main/java/com/spun/util/parser/TemplateDate.java deleted file mode 100644 index 26d7f4c..0000000 --- a/src/main/java/com/spun/util/parser/TemplateDate.java +++ /dev/null @@ -1,193 +0,0 @@ -package com.spun.util.parser; - -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Date; -import java.util.GregorianCalendar; -import java.util.TimeZone; -import org.teachingkidsprogramming.util.DateDifference; -import org.teachingkidsprogramming.util.DateUtils; -import org.teachingkidsprogramming.util.StringUtils; - -public class TemplateDate -{ - public static final TemplateDate INSTANCE = new TemplateDate(); - public static final class FORMATS - { - public static final DateFormat DATE_SHORT_DAY = new SimpleDateFormat("EEE MM/dd/yyyy"); - public static final DateFormat DATE_MONTH_YEAR = new SimpleDateFormat("MM/yy"); - public static final DateFormat DATE_MONTH_DAY = new SimpleDateFormat("MM/dd"); - public static final DateFormat DATE_SHORT = new SimpleDateFormat("MM/dd/yyyy"); - public static final DateFormat DATE_MEDIUM = DateFormat.getDateInstance(DateFormat.MEDIUM); - public static final DateFormat DATE_LONG = DateFormat.getDateInstance(DateFormat.LONG); - public static final DateFormat DATE_FULL = DateFormat.getDateInstance(DateFormat.FULL); - public static final DateFormat TIME_SHORT = DateFormat.getTimeInstance(DateFormat.SHORT); - public static final DateFormat TIME_FULL = new SimpleDateFormat("H:mm"); - public static final DateFormat TIME_ZONE = new SimpleDateFormat("H:mm z"); - public static final DateFormat TIME_MILLI = new SimpleDateFormat("H:mm:ss:SSS"); - } - //private static DateFormat dateTimeFormat = DateFormat.getDateTimeInstance(DateFormat.FULL ,DateFormat.SHORT); - private Date frozen = null; - private DateDifference difference = null; - /************************************************************************/ - public TemplateDate() - { - } - /************************************************************************/ - public TemplateDate(Date freezeTime) - { - this.frozen = freezeTime; - } - /************************************************************************/ - public void freezeTime() - { - frozen = new Date(); - } - /***********************************************************************/ - public String getDate(String style) - { - return getDate(style, ""); - } - /***********************************************************************/ - public String getDate(String style, String zone) - { - String value = null; - DateFormat formatter = null; - if (style.equalsIgnoreCase("FULL")) - { - formatter = FORMATS.DATE_FULL; - } - else if (style.equalsIgnoreCase("LONG")) - { - formatter = FORMATS.DATE_LONG; - } - else if (style.equalsIgnoreCase("MEDIUM")) - { - formatter = FORMATS.DATE_MEDIUM; - } - else if (style.equalsIgnoreCase("SHORTDAY")) - { - formatter = FORMATS.DATE_SHORT_DAY; - } - else if (style.equalsIgnoreCase("MonthYear")) - { - formatter = FORMATS.DATE_MONTH_YEAR; - } - else if (style.equalsIgnoreCase("MonthDay")) - { - formatter = FORMATS.DATE_MONTH_DAY; - } - else - { - formatter = FORMATS.DATE_SHORT; - } - formatter.setTimeZone((StringUtils.isNonZero(zone)) ? TimeZone.getTimeZone(zone) : TimeZone.getDefault()); - value = formatter.format(getDate(false)); - return value; - } - /***********************************************************************/ - public String getTime(String format) - { - return getTime(format, ""); - } - /***********************************************************************/ - public String getTime(String format, String zone) - { - String value = null; - DateFormat formatter = null; - if (format.equalsIgnoreCase("AM/PM")) - { - formatter = FORMATS.TIME_SHORT; - } - else if (format.equalsIgnoreCase("Milli")) - { - formatter = FORMATS.TIME_MILLI; - } - else if (format.equalsIgnoreCase("Zone")) - { - formatter = FORMATS.TIME_ZONE; - } - else - { - formatter = FORMATS.TIME_FULL; - } - formatter.setTimeZone((StringUtils.isNonZero(zone)) ? TimeZone.getTimeZone(zone) : TimeZone.getDefault()); - value = formatter.format(getDate(false)); - return value; - } - /************************************************************************/ - public Date getDate(boolean forceCurrent) - { - if ((frozen != null) && (!forceCurrent)) - { - return frozen; - } - else - { - return new Date(); - } - } - /************************************************************************/ - public Date getDate() - { - return getDate(false); - } - /***********************************************************************/ - public DateDifference getDifferenceFromToday() - { - if (difference == null) - { - difference = new DateDifference(getDate(false), new Date()); - } - return difference; - } - /***********************************************************************/ - public String getDay() - { - GregorianCalendar cal = new GregorianCalendar(); - cal.setTime(getDate(false)); - return StringUtils.padNumber(cal.get(Calendar.DAY_OF_MONTH), 2); - } - /***********************************************************************/ - public String getMonth(int offset) - { - GregorianCalendar cal = new GregorianCalendar(); - cal.setTime(getDate(false)); - return StringUtils.padNumber(cal.get(Calendar.MONTH) + offset, 2); - } - /***********************************************************************/ - public String getMonthName() - { - return new SimpleDateFormat("MMMM").format(getDate(false)); - } - /***********************************************************************/ - public String getYear() - { - GregorianCalendar cal = new GregorianCalendar(); - cal.setTime(getDate(false)); - return StringUtils.padNumber(cal.get(Calendar.YEAR), 4); - } - /***********************************************************************/ - public boolean isToday() - { - return DateUtils.isToday(getDate(false)); - } - /***********************************************************************/ - public String toString() - { - return this.getDate("", ""); - } - /***********************************************************************/ - public String getDateAndTime(String dateFormat, String timeFormat) - { - return getDate(dateFormat) + " " + getTime(timeFormat); - } - /***********************************************************************/ - public String getDateAndTime() - { - return getDateAndTime("default", "default"); - } - /************************************************************************/ - /************************************************************************/ -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/parser/TemplateDouble.java b/src/main/java/com/spun/util/parser/TemplateDouble.java deleted file mode 100644 index 6a07257..0000000 --- a/src/main/java/com/spun/util/parser/TemplateDouble.java +++ /dev/null @@ -1,136 +0,0 @@ -package com.spun.util.parser; - -/** - * - **/ -import java.text.NumberFormat; -import org.teachingkidsprogramming.util.NumberUtils; - -public class TemplateDouble -{ - protected double amount = 0; - private static NumberFormat decimalFormat = null; - protected String defaultPrefix = null; - protected String defaultPostfix = null; - protected int defaultMinimumPrecision = 2; - protected int defaultMaximumPrecision = 2; - /************************************************************************/ - static - { - decimalFormat = NumberFormat.getNumberInstance(); - decimalFormat.setMaximumFractionDigits(2); - decimalFormat.setMinimumFractionDigits(2); - } - /************************************************************************/ - public TemplateDouble(double amount) - { - this.amount = amount; - } - /************************************************************************/ - public TemplateDouble(double amount, String defaultPrefix, String defaultPostfix, int defaultMinimumPrecision, int defaultMaximumPrecision) - { - this.amount = amount; - this.defaultPostfix = defaultPostfix; - this.defaultPrefix = defaultPrefix; - this.defaultMinimumPrecision = defaultMinimumPrecision; - this.defaultMaximumPrecision = defaultMaximumPrecision; - } - /***********************************************************************/ - public TemplateDouble(Number amount) - { - this(amount.doubleValue()); - } - /***********************************************************************/ - public String inDollarFormat() - { - return inFormat(amount, "$", 2, 2, "", true); - } - /***********************************************************************/ - public CurrencyAmount asCurrency() - { - return new CurrencyAmount(amount); - } - /***********************************************************************/ - public String asInteger() - { - return inFormat(amount, null, 0, 0, null, true); - } - /***********************************************************************/ - public String inFormat(String prefix, int precision, int minimumPrecision, String postfix, boolean useGrouping) - { - return inFormat(amount, prefix, precision, minimumPrecision, postfix, useGrouping); - } - /***********************************************************************/ - public static String inFormat(double amount, String prefix, int maximumPrecision, int minimumPrecision, String postfix, boolean useGrouping) - { - String value = ""; - NumberFormat dFormat = decimalFormat; - if ((maximumPrecision != 2) || (minimumPrecision != 2) || !useGrouping) - { - dFormat = NumberFormat.getNumberInstance(); - dFormat.setMaximumFractionDigits(maximumPrecision); - dFormat.setMinimumFractionDigits(minimumPrecision); - dFormat.setGroupingUsed(useGrouping); - } - value += dFormat.format(amount); - if (prefix != null) - { - if (value.charAt(0) != '-') - { - value = prefix + value; - } - else - { - value = '-' + prefix + value.substring(1); - } - } - value += (postfix != null) ? postfix : ""; - return value; - } - /***********************************************************************/ - protected int getDefaultMinimumPrecision(int maximumPrecision) - { - return maximumPrecision < defaultMinimumPrecision ? maximumPrecision : defaultMinimumPrecision; - } - /***********************************************************************/ - public String asInt() - { - return inFormat(null, 0, 0, null, false); - } - - /************************************************************************/ - public String asDouble() - { - return inFormat(null, 2, 2, null, false); - } - /************************************************************************/ - public String asNegative() - { - return inFormat(-amount, defaultPrefix, 2, 2, defaultPostfix, false); - } - /************************************************************************/ - public TemplateDouble getAbsoluteValue() - { - return new TemplateDouble(-amount, defaultPrefix, defaultPostfix, defaultMinimumPrecision, defaultMaximumPrecision); - } - /************************************************************************/ - public boolean isZero() - { - return NumberUtils.equals(0, this.amount, 0.0005); - } - public TemplateDouble divide(int by) - { - return new TemplateDouble(amount / by); - } - /************************************************************************/ - public String toString() - { - return inFormat(defaultPrefix, defaultMaximumPrecision, getDefaultMinimumPrecision(defaultMaximumPrecision), defaultPostfix, true); - } - /************************************************************************/ - /************************************************************************/ - public double getAmount() - { - return amount; - } -} diff --git a/src/main/java/com/spun/util/parser/TemplateError.java b/src/main/java/com/spun/util/parser/TemplateError.java deleted file mode 100644 index 79bc78b..0000000 --- a/src/main/java/com/spun/util/parser/TemplateError.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.spun.util.parser; - -import java.io.ByteArrayOutputStream; -import java.io.PrintWriter; -import org.apache.velocity.context.Context; -import com.spun.util.velocity.ContextAware; - -public class TemplateError implements ContextAware -{ - private String stackTrace = null; - private String className = null; - private String message = null; - private String cause; - /***********************************************************************/ - public TemplateError(Throwable t) - { - this(t, null); - } - /***********************************************************************/ - public TemplateError(Throwable t, java.lang.Object o) - { - if (o != null) - { - className = o.getClass().getName(); - } - cause = getCause(t); - message = t.getMessage(); - if (message != null && message.startsWith(cause)) - { - message = message.substring(cause.length() + 1); - } - ByteArrayOutputStream output = new ByteArrayOutputStream(); - PrintWriter pw = new PrintWriter(output); - t.printStackTrace(pw); - pw.flush(); - - stackTrace = output.toString(); - } - /***********************************************************************/ - private String getCause(Throwable t) - { - if (t.getCause() == null) - { - return t.getClass().getName(); - } - else - { - return getCause(t.getCause()); - } - } - /***********************************************************************/ - public String getMessage() - { - return message; - } - /***********************************************************************/ - public String getClassName() - { - return className; - } - /***********************************************************************/ - public String getStackTrace() - { - return stackTrace; - } - /***********************************************************************/ - public String getErrorInfo() - { - return message + "\n" + stackTrace; - } - /***********************************************************************/ - public String getCause() - { - return cause; - } - /***********************************************************************/ - public void setupContext(Context context) - { - context.put("error", this); - } - /***********************************************************************/ - /***********************************************************************/ - -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/parser/TemplateNumberUtils.java b/src/main/java/com/spun/util/parser/TemplateNumberUtils.java deleted file mode 100644 index 7aaecfb..0000000 --- a/src/main/java/com/spun/util/parser/TemplateNumberUtils.java +++ /dev/null @@ -1,105 +0,0 @@ -package com.spun.util.parser; - -import org.lambda.query.Query; - -import org.teachingkidsprogramming.util.NumberUtils; - -public class TemplateNumberUtils -{ - public static TemplateNumberUtils INSTANCE = new TemplateNumberUtils(); - /************************************************************************/ - private TemplateNumberUtils() - { - } - public static boolean isZero(double d) - { - return isZero(d, 0.005); - } - /***********************************************************************/ - public static boolean isZero(Number d) - { - return d == null || isZero(d.doubleValue(), 0.005); - } - /***********************************************************************/ - public static int asInt(Number d) - { - return d == null ? 0 : d.intValue(); - } - /***********************************************************************/ - public static boolean isZero(double d, double delta) - { - return NumberUtils.equals(0, d, delta); - } - /***********************************************************************/ - private int getScaling(double have, double max, double scale) - { - if (max == 0) - { - throw new Error("Maximum cannot be zero"); - } - else - { - return (int)((have * scale) / max); - } - } - /***********************************************************************/ - public int getScaling(Integer have, Integer max, Integer scale) - { - return getScaling(have.doubleValue(), max.doubleValue(), scale.doubleValue()); - } - /***********************************************************************/ - public static double doArithmetic(int arg1, String operation, int arg2) - { - return doArithmetic(new String[]{"" + arg1, operation, "" + arg2}); - } - /***********************************************************************/ - public static double doArithmetic(String[] params) - { - if (params == null || params.length == 0) { return 0.00; } - double totalNumber = 0; - double currentNumber = 0; - char operator = '+'; - for (int i = 0; i < params.length; i++) - { - if (i % 2 == 0) - { - currentNumber = NumberUtils.load(params[i], 0.00); - switch (operator) - { - case '+' : - totalNumber = totalNumber + currentNumber; - break; - case '-' : - totalNumber = totalNumber - currentNumber; - break; - case '*' : - totalNumber = totalNumber * currentNumber; - break; - case '/' : - totalNumber = totalNumber / currentNumber; - break; - case '%' : - totalNumber = totalNumber % currentNumber; - break; - default : - throw new Error("Unknown arithmetic operator " + operator); - } - } - else - { - operator = params[i].charAt(0); - } - } - return totalNumber; - } - /************************************************************************/ - /************************************************************************/ - public static TemplateDouble max(Number... numbers) - { - return new TemplateDouble(Query.max(numbers)); - } - public static TemplateDouble max(Number n1, Number n2, Number n3) - { - return max(new Number[]{n1,n2,n3}); - } -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/parser/TemplateStringUtils.java b/src/main/java/com/spun/util/parser/TemplateStringUtils.java deleted file mode 100644 index 2712382..0000000 --- a/src/main/java/com/spun/util/parser/TemplateStringUtils.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.spun.util.parser; - - -public class TemplateStringUtils { - public static TemplateStringUtils INSTANCE = new TemplateStringUtils(); - - private TemplateStringUtils() { - } - - public static String clearNull(String value) { - return clearNull(value, ""); - } - - public static String clearNull(Object value, String replacingValue) { - return (("null".equals(value) || value == null) ? replacingValue - : value.toString()); - } - - public static String formatExcelString(String in) { - if ("0".equals(in) || "null".equals(in) || in == null) // So that null's - // & int(0) show - // up empty - { - return "\"\""; - } else if (in.indexOf('\"') == -1) { - return '\"' + in + '\"'; - } else { - StringBuffer buffer = new StringBuffer(); - buffer.append('\"'); - for (int i = 0; i < in.length(); i++) { - char c = in.charAt(i); - buffer.append((c == '\"') ? "\"\"" : "" + c); - } - buffer.append('\"'); - return buffer.toString(); - } - } - - public static String toJavaScriptEncode(Object n) { - if (n == null) { - return "null"; - } else if (n instanceof Number) { - return toJavaScriptEncode((Number) n); - } else { - return toJavaScriptEncode(n.toString()); - } - } -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/parser/Templateparsing.jj b/src/main/java/com/spun/util/parser/Templateparsing.jj deleted file mode 100644 index a2eb2a9..0000000 --- a/src/main/java/com/spun/util/parser/Templateparsing.jj +++ /dev/null @@ -1,438 +0,0 @@ -options -{ - LOOKAHEAD=3; - STATIC = false; - CHOICE_AMBIGUITY_CHECK = 4; -} -PARSER_BEGIN(TemplateParsing) -package com.spun.util.parser; - -import java.util.Vector; -import com.spun.util.My_System; - -public class TemplateParsing -{ - public static final String TEST_FILE ="";//com.spun.set.website.WWWConfig.TEMPLATE_DIRECTORY + "\\quiddlerscores.htm"; - /************************************************************************/ - public static void main(String args[]) - { - try - { - String file = TEST_FILE; - if (args.length == 1) - { - System.out.println("Java Parser Version 1.1: Reading from file " + args[0] + " . . ."); - file = args[0]; - } - try - { - TemplateParsing parser = new TemplateParsing(new java.io.FileInputStream(file)); - Vector v = parser.input(); - My_System.variable(v.toString()); - } - catch (java.io.FileNotFoundException e) - { - System.out.println("Java Parser Version 1.1: File " + args[0] + " not found."); - return; - } - } - catch (Exception e) - { - My_System.warning(e); - } - } - /************************************************************************/ -} -PARSER_END(TemplateParsing) - -/************************************************************************/ -TOKEN [IGNORE_CASE] : -{ - : DEFAULT | - : TEMPLATE_PARSER | - : DEFAULT -} - - - SKIP : -{ - <( " " | "\t" | "\n" | "\r" )+ > -} - TOKEN : -{ - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - " > : DEFAULT -} - - /************************************************************************/ - - Method method() : - { - Token t; - Vector v =null; - } - { - t = [v = params()] - { - Method m = new Method(t.image, v); - //My_System.variable("Method = " + m.toString()); - return m; - } - } - - /************************************************************************/ - Object param() : - { - Token t; - Object s; - } - { - (t = - { - s = t.image.substring(1,t.image.length()-1); - } - - | t = - { - s = t.image; - } - - | s = method() - ) - { - return s; - } - } - /************************************************************************/ - Vector params() : - { - Vector v = new Vector(); - Object t; - } - { - [t = param() - { - v.addElement(t); - } - ( t = param() - { - v.addElement(t); - } - )*] - { - return v; - } - } - - /************************************************************************/ - String plainText() : - { - Token t; - boolean isNull = false; - } - { - (t = |t = ) - { - return t.image; - } - } - - /************************************************************************/ - Vector text() : - { - Vector v = new Vector(); - Object o = null; - } - { - - [(o = plainText() - { - v.addElement(o); - } - | o = templateParser() - { - v.addElement(o); - } - )+] - { - return v; - } - } - /************************************************************************/ - - Object templateParser() : - { - Object o = null; - } - { - ( - o = variable() | o = ifStatement() | o = forStatement() | - o = setStatement() | o = letStatement() | o = letVarStatement() - ) - { - return o; - } - } - /************************************************************************/ - VariableStatement variable() : - { - Method m; - //My_System.markerIn("variableStatement"); - } - { - m = method() - { - //My_System.markerOut("variableStatement"); - return new VariableStatement(m); - } - } - /************************************************************************/ - IfStatement ifConditional() : - { - Method m; - Object compare = null; - } - { - m = method() [ compare = param()] - { - return new IfStatement(false, m, compare, null, null); - } - } - /************************************************************************/ - IfStatement elseIfStatement() : - { - IfStatement holder = null; - Vector thenV; - boolean ifn = false; - } - { - (|{ifn = true;}) holder = ifConditional() - thenV = text() - { - holder.setThenStatement(thenV); - holder.setIfNot(ifn); - return holder; - } - } - /************************************************************************/ - IfStatement ifStatement() : - { - Vector ifStatements = new Vector(); - Vector thenStatements = new Vector(); - IfStatement holder = null; - Vector thenV; - Vector elseV = null; - Object thenO = null; - Object elseO = null; - boolean ifn = false; -// My_System.markerIn("ifStatement"); - } - { - (|{ifn = true;}) holder = ifConditional() - ( - ( - - thenV = text() - { - holder.setThenStatement(thenV); - holder.setIfNot(ifn); - ifStatements.addElement(holder); - } - - [(holder = elseIfStatement() - { - ifStatements.addElement(holder); - } - )+] - - [elseV = elseStatement()] - - { - while (ifStatements.size() !=0 ) - { - holder = (IfStatement)ifStatements.remove(ifStatements.size() - 1); - holder.setElseStatement(elseV); - if (ifStatements.size() != 0) - { - elseV = new Vector(); - elseV.add(holder); - } - } - return holder; - } - ) - | - ( - thenO = param() - elseO = param() - - { - holder.setIfNot(ifn); - //Add Then - Vector temp = new Vector(); - if (thenO instanceof Method) - { - thenO = new VariableStatement((Method)thenO); - } - temp.add(thenO); - holder.setThenStatement(temp); - //Add Else - temp = new Vector(); - if (elseO instanceof Method) - { - elseO = new VariableStatement((Method)elseO); - } - temp.add(elseO); - holder.setElseStatement(temp); - return holder; - } - )) - } - /************************************************************************/ - Vector elseStatement() : - { - Vector v; - } - { - v = text() - { - return v; - } - } - /************************************************************************/ - ForStatement forStatement() : - { - Method init; - Method check; - Method inc; - Vector v; - //My_System.markerIn("forStatement"); - } - { - init = method() check = method() inc = method() v = text() - { - //My_System.markerOut("forStatement"); - return new ForStatement(init,check,inc, v); - } - } - /************************************************************************/ - SetStatement setStatement() : - { - Method var; - Object val; - Vector vVal; - //My_System.markerIn("setStatement"); - } - { - var = method() - ( - ( - val = param() - { - vVal = new Vector(); - vVal.add(val); - } - ) - | - ( - vVal = text() - ) - ) - { - //My_System.markerOut("setStatement"); - return new SetStatement(var, vVal); - } - } - - /************************************************************************/ - LetStatement letVarStatement() : - { - Method var; - Object val; - Vector vVal; - //My_System.markerIn("setStatement"); - } - { - var = method() - ( - ( - val = param() - { - vVal = new Vector(); - vVal.add(val); - } - ) - | - ( - vVal = text() - ) - ) - { - //My_System.markerOut("setStatement"); - return new LetStatement(var, vVal, true); - } - } - - /************************************************************************/ - LetStatement letStatement() : - { - Method var; - Object val; - Vector vVal; - } - { - var = method() val = param() - { - vVal = new Vector(); - vVal.add(val); - return new LetStatement(var, vVal, false); - } - } - - /************************************************************************/ - Vector input() : - { - Vector v; - } - { - v = text() - { - //My_System.variable(v.toString()); - return v; - } - } - /************************************************************************/ - /************************************************************************/ \ No newline at end of file diff --git a/src/main/java/com/spun/util/parser/VelocityList.java b/src/main/java/com/spun/util/parser/VelocityList.java deleted file mode 100644 index 9f82c2f..0000000 --- a/src/main/java/com/spun/util/parser/VelocityList.java +++ /dev/null @@ -1,156 +0,0 @@ -package com.spun.util.parser; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -/***********************************************************************/ -public class VelocityList -{ - private SteppingIterator iterator = null; - @SuppressWarnings("unchecked") - private List list = null; - - public VelocityList(Object[] array) - { - this(array, 0, SteppingIterator.DEFAULT_STEPPING); - } - - /***********************************************************************/ - public VelocityList(Object[] array, int offset, int stepping) - { - this(array, offset, new int[] { stepping }); - } - - /***********************************************************************/ - public VelocityList(Object[] array, int offset, int[] stepping) - { - this.list = array == null ? Collections.EMPTY_LIST : Arrays.asList(array); - this.iterator = new SteppingIterator(offset, stepping, this.list.size()); - } - - /***********************************************************************/ - @SuppressWarnings("unchecked") - public VelocityList(List list2) - { - this(list2 == null ? null : list2.toArray()); - } - - /***********************************************************************/ - public SteppingIterator getSteppingIterator() - { - return this.iterator; - } - - /***********************************************************************/ - private Object get(int index) - { - int actualPosition = iterator.getActualPosition(index); - return (actualPosition == -1) ? null : list.get(actualPosition); - } - - /***********************************************************************/ - public List getAll() - { - int size = this.iterator.getSize(true, true); - ArrayList returning = new ArrayList(size); - for (int i = 0; i < size; i++) - { - returning.add(new Item(this, i)); - } - return returning; - } - - /***********************************************************************/ - public static class Item - { - VelocityList list; - int index; - - public Item(VelocityList list, int index) - { - this.list = list; - this.index = index; - } - - public Object get() - { - return list.get(index); - } - - public int getSize() - { - return list.getSteppingIterator().getSize(true, true); - } - - public int getIndex() - { - return index; - } - - public int getIndexModulous(int m) - { - return index % m; - } - - public int getIndex(int offset) - { - return index + offset; - } - - public boolean isCurrentIndexValid() - { - return list.getSteppingIterator().getActualPosition(index) != -1; - } - - public boolean isCurrentIndexSubsection() - { - return list.get(index) instanceof TemplateArray.Subsection; - } - - public boolean isEven() - { - return ((index % 2) == 0); - } - - public boolean isLast() - { - return list.getSteppingIterator().isLast(index, -1); - } - - public boolean isFirst() - { - return list.getSteppingIterator().isFirst(index, -1); - } - - public boolean isLast(int i) - { - return list.getSteppingIterator().isLast(index, i); - } - - public boolean isFirst(int stepping) - { - return list.getSteppingIterator().isFirst(index, stepping); - } - - public int getTotalStepCountForRound(int forSteppingLevel, int indexBase) - { - return list.getSteppingIterator().getTotalStepCountForRound( - forSteppingLevel, indexBase); - } - - public int getStepCountForRound(int forSteppingLevel, int indexBase) - { - return list.getSteppingIterator().getStepCountForRound(forSteppingLevel, - index, indexBase); - } - /* - * public boolean isStep(int i, int j) { return list.isStep(index, i, j); } - * public boolean getStepPosition(int i, int j) { return - * list.getStepPosition(index, i, j); } public boolean isGreaterThan(int - * value) { return list.isGreaterThan(index, value); } public boolean - * isLessThan(int value) { return list.isLessThan(index, value); } - */ - } -} diff --git a/src/main/java/com/spun/util/servlets/ErrorToString.java b/src/main/java/com/spun/util/servlets/ErrorToString.java index 44c5bd4..c16a9aa 100644 --- a/src/main/java/com/spun/util/servlets/ErrorToString.java +++ b/src/main/java/com/spun/util/servlets/ErrorToString.java @@ -1,7 +1,7 @@ package com.spun.util.servlets; import org.teachingkidsprogramming.util.MySystem; -import com.spun.util.parser.TemplateError; +import org.teachingkidsprogramming.util.parser.TemplateError; public class ErrorToString implements SecondaryErrorProcessor { diff --git a/src/main/java/com/spun/util/servlets/SecondaryErrorProcessor.java b/src/main/java/com/spun/util/servlets/SecondaryErrorProcessor.java index 6455a06..9c7c224 100644 --- a/src/main/java/com/spun/util/servlets/SecondaryErrorProcessor.java +++ b/src/main/java/com/spun/util/servlets/SecondaryErrorProcessor.java @@ -1,6 +1,6 @@ package com.spun.util.servlets; -import com.spun.util.parser.TemplateError; +import org.teachingkidsprogramming.util.parser.TemplateError; public interface SecondaryErrorProcessor { diff --git a/src/main/java/com/spun/util/velocity/VelocityParser.java b/src/main/java/com/spun/util/velocity/VelocityParser.java index 12c24a2..775487c 100644 --- a/src/main/java/com/spun/util/velocity/VelocityParser.java +++ b/src/main/java/com/spun/util/velocity/VelocityParser.java @@ -17,7 +17,7 @@ import org.teachingkidsprogramming.util.ObjectUtils; import org.teachingkidsprogramming.util.io.FileUtils; -import com.spun.util.parser.ParserCommons; +import org.teachingkidsprogramming.util.parser.ParserCommons; public class VelocityParser { diff --git a/src/main/java/org/teachingkidsprogramming/util/parser/ParserCommons.java b/src/main/java/org/teachingkidsprogramming/util/parser/ParserCommons.java new file mode 100644 index 0000000..f5eb701 --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/util/parser/ParserCommons.java @@ -0,0 +1,52 @@ +package org.teachingkidsprogramming.util.parser; + +import java.util.List; + +public class ParserCommons { + public static ParserCommons INSTANCE = new ParserCommons(); + + /** + * ******************************************************************* + */ + public static Class getClass(String clazz) throws ClassNotFoundException { + return Class.forName(clazz); + } + + /** + * ******************************************************************* + */ + public static Object getNull() { + return null; + } + + /** + * ******************************************************************* + */ + public static boolean isNull(Object object) { + return object == null; + } + + /** + * ******************************************************************* + */ + public static int getArrayLength(Object[] array) { + return array == null ? 0 : array.length; + } + + /** + * ******************************************************************* + */ + public static Object get(Object[] array, int index) { + return getArrayLength(array) > index ? array[index] : null; + } + + /** + * ******************************************************************* + */ + public static Object get(List list, int index) { + return list == null ? null : list.get(index); + } + + /***********************************************************************/ + /***********************************************************************/ +} \ No newline at end of file diff --git a/src/main/java/org/teachingkidsprogramming/util/parser/TemplateError.java b/src/main/java/org/teachingkidsprogramming/util/parser/TemplateError.java new file mode 100644 index 0000000..ceeb14e --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/util/parser/TemplateError.java @@ -0,0 +1,75 @@ +package org.teachingkidsprogramming.util.parser; + +import com.spun.util.velocity.ContextAware; +import org.apache.velocity.context.Context; + +import java.io.ByteArrayOutputStream; +import java.io.PrintWriter; + +public class TemplateError implements ContextAware { + private String stackTrace = null; + private String className = null; + private String message = null; + + /** + * ******************************************************************* + */ + public TemplateError(Throwable t, java.lang.Object o) { + if (o != null) { + className = o.getClass().getName(); + } + String cause = getCause(t); + message = t.getMessage(); + if (message != null && message.startsWith(cause)) { + message = message.substring(cause.length() + 1); + } + ByteArrayOutputStream output = new ByteArrayOutputStream(); + PrintWriter pw = new PrintWriter(output); + t.printStackTrace(pw); + pw.flush(); + + stackTrace = output.toString(); + } + + /** + * ******************************************************************* + */ + private String getCause(Throwable t) { + if (t.getCause() == null) { + return t.getClass().getName(); + } else { + return getCause(t.getCause()); + } + } + + /** + * ******************************************************************* + */ + public String getMessage() { + return message; + } + + /** + * ******************************************************************* + */ + public String getClassName() { + return className; + } + + /** + * ******************************************************************* + */ + public String getStackTrace() { + return stackTrace; + } + + /** + * ******************************************************************* + */ + public void setupContext(Context context) { + context.put("error", this); + } + /***********************************************************************/ + /***********************************************************************/ + +} \ No newline at end of file From 480d10aa3f3b650942727a8a096d8876ba940c95 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Tue, 17 Mar 2015 14:45:45 -0700 Subject: [PATCH 054/111] clean, move persistence package --- src/main/java/com/spun/util/persistence/Deletor.java | 6 ------ .../java/com/spun/util/persistence/ExecutableQuery.java | 7 ------- src/main/java/com/spun/util/persistence/Loader.java | 7 ------- .../java/com/spun/util/persistence/SavingException.java | 7 ------- .../approvaltests/reporters/ExecutableQueryFailure.java | 2 +- src/main/java/org/teachingextensions/logo/Turtle.java | 4 ++-- .../util/persistence/ExecutableQuery.java | 6 ++++++ .../teachingkidsprogramming}/util/persistence/Saver.java | 2 +- .../util/persistence/SavingException.java | 5 +++++ 9 files changed, 15 insertions(+), 31 deletions(-) delete mode 100644 src/main/java/com/spun/util/persistence/Deletor.java delete mode 100644 src/main/java/com/spun/util/persistence/ExecutableQuery.java delete mode 100644 src/main/java/com/spun/util/persistence/Loader.java delete mode 100644 src/main/java/com/spun/util/persistence/SavingException.java create mode 100644 src/main/java/org/teachingkidsprogramming/util/persistence/ExecutableQuery.java rename src/main/java/{com/spun => org/teachingkidsprogramming}/util/persistence/Saver.java (59%) create mode 100644 src/main/java/org/teachingkidsprogramming/util/persistence/SavingException.java diff --git a/src/main/java/com/spun/util/persistence/Deletor.java b/src/main/java/com/spun/util/persistence/Deletor.java deleted file mode 100644 index 0a2d5bf..0000000 --- a/src/main/java/com/spun/util/persistence/Deletor.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.spun.util.persistence; - -public interface Deletor -{ - public void delete(T delete) throws SavingException; -} diff --git a/src/main/java/com/spun/util/persistence/ExecutableQuery.java b/src/main/java/com/spun/util/persistence/ExecutableQuery.java deleted file mode 100644 index ab6b64d..0000000 --- a/src/main/java/com/spun/util/persistence/ExecutableQuery.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.spun.util.persistence; - -public interface ExecutableQuery -{ - public abstract String getQuery() throws Exception; - public abstract String executeQuery(String query) throws Exception; -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/persistence/Loader.java b/src/main/java/com/spun/util/persistence/Loader.java deleted file mode 100644 index 83e2e5c..0000000 --- a/src/main/java/com/spun/util/persistence/Loader.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.spun.util.persistence; - - -public interface Loader -{ - public T load() throws Exception; -} diff --git a/src/main/java/com/spun/util/persistence/SavingException.java b/src/main/java/com/spun/util/persistence/SavingException.java deleted file mode 100644 index 62693fe..0000000 --- a/src/main/java/com/spun/util/persistence/SavingException.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.spun.util.persistence; - -public class SavingException extends RuntimeException -{ - public SavingException(){} - public SavingException(Throwable cause){super(cause);} -} diff --git a/src/main/java/org/approvaltests/reporters/ExecutableQueryFailure.java b/src/main/java/org/approvaltests/reporters/ExecutableQueryFailure.java index 7a9ee06..334a228 100644 --- a/src/main/java/org/approvaltests/reporters/ExecutableQueryFailure.java +++ b/src/main/java/org/approvaltests/reporters/ExecutableQueryFailure.java @@ -8,7 +8,7 @@ import org.approvaltests.core.ApprovalReporterWithCleanUp; import org.teachingkidsprogramming.util.io.FileUtils; -import com.spun.util.persistence.ExecutableQuery; +import org.teachingkidsprogramming.util.persistence.ExecutableQuery; public class ExecutableQueryFailure implements ApprovalFailureReporter, ApprovalReporterWithCleanUp { diff --git a/src/main/java/org/teachingextensions/logo/Turtle.java b/src/main/java/org/teachingextensions/logo/Turtle.java index e95c65e..0fe21b5 100644 --- a/src/main/java/org/teachingextensions/logo/Turtle.java +++ b/src/main/java/org/teachingextensions/logo/Turtle.java @@ -14,8 +14,8 @@ import org.teachingextensions.windows.ProgramWindow; import org.teachingkidsprogramming.util.ThreadLauncher; -import com.spun.util.persistence.Saver; -import com.spun.util.persistence.SavingException; +import org.teachingkidsprogramming.util.persistence.Saver; +import org.teachingkidsprogramming.util.persistence.SavingException; /** * A turtle drawing a line diff --git a/src/main/java/org/teachingkidsprogramming/util/persistence/ExecutableQuery.java b/src/main/java/org/teachingkidsprogramming/util/persistence/ExecutableQuery.java new file mode 100644 index 0000000..6852dcb --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/util/persistence/ExecutableQuery.java @@ -0,0 +1,6 @@ +package org.teachingkidsprogramming.util.persistence; + +public interface ExecutableQuery +{ + public abstract String executeQuery(String query) throws Exception; +} \ No newline at end of file diff --git a/src/main/java/com/spun/util/persistence/Saver.java b/src/main/java/org/teachingkidsprogramming/util/persistence/Saver.java similarity index 59% rename from src/main/java/com/spun/util/persistence/Saver.java rename to src/main/java/org/teachingkidsprogramming/util/persistence/Saver.java index ca2fbc6..e454263 100644 --- a/src/main/java/com/spun/util/persistence/Saver.java +++ b/src/main/java/org/teachingkidsprogramming/util/persistence/Saver.java @@ -1,4 +1,4 @@ -package com.spun.util.persistence; +package org.teachingkidsprogramming.util.persistence; public interface Saver diff --git a/src/main/java/org/teachingkidsprogramming/util/persistence/SavingException.java b/src/main/java/org/teachingkidsprogramming/util/persistence/SavingException.java new file mode 100644 index 0000000..871f375 --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/util/persistence/SavingException.java @@ -0,0 +1,5 @@ +package org.teachingkidsprogramming.util.persistence; + +public class SavingException extends RuntimeException +{ +} From cc55ed84388778a1cc1041f64dd73e24c250b7c0 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Tue, 17 Mar 2015 14:52:45 -0700 Subject: [PATCH 055/111] clean, move servlets package --- .../com/spun/util/servlets/ErrorToString.java | 17 -- .../util/servlets/ExpiredSessionError.java | 27 --- .../spun/util/servlets/InvokerServlet.java | 113 ----------- .../com/spun/util/servlets/ProgressBar.java | 12 -- .../servlets/SecondaryErrorProcessor.java | 8 - .../servlets/ServletParameterException.java | 21 -- .../com/spun/util/servlets/StageServlet.java | 14 -- .../spun/util/servlets/ValidationError.java | 185 ------------------ .../spun/util/servlets/ValidationTracker.java | 67 ------- .../teachingextensions/setup/SetupConfig.java | 2 +- .../util/servlets/InvokerServlet.java | 106 ++++++++++ .../util/servlets/ValidationError.java | 97 +++++++++ 12 files changed, 204 insertions(+), 465 deletions(-) delete mode 100644 src/main/java/com/spun/util/servlets/ErrorToString.java delete mode 100644 src/main/java/com/spun/util/servlets/ExpiredSessionError.java delete mode 100644 src/main/java/com/spun/util/servlets/InvokerServlet.java delete mode 100644 src/main/java/com/spun/util/servlets/ProgressBar.java delete mode 100644 src/main/java/com/spun/util/servlets/SecondaryErrorProcessor.java delete mode 100644 src/main/java/com/spun/util/servlets/ServletParameterException.java delete mode 100644 src/main/java/com/spun/util/servlets/StageServlet.java delete mode 100644 src/main/java/com/spun/util/servlets/ValidationError.java delete mode 100644 src/main/java/com/spun/util/servlets/ValidationTracker.java create mode 100644 src/main/java/org/teachingkidsprogramming/util/servlets/InvokerServlet.java create mode 100644 src/main/java/org/teachingkidsprogramming/util/servlets/ValidationError.java diff --git a/src/main/java/com/spun/util/servlets/ErrorToString.java b/src/main/java/com/spun/util/servlets/ErrorToString.java deleted file mode 100644 index c16a9aa..0000000 --- a/src/main/java/com/spun/util/servlets/ErrorToString.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.spun.util.servlets; - -import org.teachingkidsprogramming.util.MySystem; -import org.teachingkidsprogramming.util.parser.TemplateError; - -public class ErrorToString implements SecondaryErrorProcessor -{ - @Override - public String processError(TemplateError original, Throwable secondary) - { - MySystem.warning(secondary); - TemplateError e = new TemplateError(secondary, this); - String output = "
" + original.getMessage() + "\n" + original.getStackTrace() + "
" + "
"
-        + e.getMessage() + "\n" + e.getStackTrace() + "
"; - return output; - } -} diff --git a/src/main/java/com/spun/util/servlets/ExpiredSessionError.java b/src/main/java/com/spun/util/servlets/ExpiredSessionError.java deleted file mode 100644 index 6c395df..0000000 --- a/src/main/java/com/spun/util/servlets/ExpiredSessionError.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.spun.util.servlets; - - -public class ExpiredSessionError - extends RuntimeException -{ - - private String htmlText; - - /***********************************************************************/ - public ExpiredSessionError() - { - htmlText = "

You are trying to reload an expired page

"; - } - /***********************************************************************/ - public void setHTMLText(String htmlText) - { - this.htmlText = htmlText; - } - /***********************************************************************/ - public String getHTMLText() - { - return htmlText; - } - /***********************************************************************/ - /***********************************************************************/ -} diff --git a/src/main/java/com/spun/util/servlets/InvokerServlet.java b/src/main/java/com/spun/util/servlets/InvokerServlet.java deleted file mode 100644 index da64748..0000000 --- a/src/main/java/com/spun/util/servlets/InvokerServlet.java +++ /dev/null @@ -1,113 +0,0 @@ -package com.spun.util.servlets; - -/* - * 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. - */ -import java.io.IOException; -import java.util.HashMap; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import org.teachingkidsprogramming.util.MySystem; -import org.teachingkidsprogramming.util.ObjectUtils; - -/** - * The default servlet-invoking servlet for most web applications, - * used to serve requests to servlets that have not been registered - * in the web application deployment descriptor. - * - * @author Craig R. McClanahan - * @version $Revision$ $Date$ - */ -public final class InvokerServlet extends HttpServlet -{ - HashMap servlets = new HashMap(); - private String mask; - public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException - { - serveRequest(request, response); - } - public void doHead(HttpServletRequest request, HttpServletResponse response) throws IOException, - ServletException - { - serveRequest(request, response); - } - public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, - ServletException - { - serveRequest(request, response); - } - /** - * Initialize this servlet. - */ - public void init() throws ServletException - { - mask = getServletConfig().getInitParameter("mask"); - MySystem.variable("Mask", mask); - } - /***********************************************************************/ - public void destroy() - { - for (HttpServlet servlet : servlets.values()) - { - servlet.destroy(); - } - super.destroy(); - } - /***********************************************************************/ - public void serveRequest(HttpServletRequest request, HttpServletResponse response) throws IOException, - ServletException - { - String pathInfo = request.getPathInfo(); - String servletClass = pathInfo.substring(1); - int slash = servletClass.indexOf('/'); - if (slash >= 0) - { - // pathInfo = servletClass.substring(slash); - servletClass = servletClass.substring(0, slash); - } - else - { - // pathInfo = ""; - } - // My_System.variable("servletClass",servletClass); - if (!servletClass.startsWith(mask)) - { - response.sendError(HttpServletResponse.SC_NOT_FOUND, servletClass); - return; - } - HttpServlet servlet; - synchronized (this) - { - servlet = servlets.get(servletClass); - if (servlet == null) - { - try - { - servlet = (HttpServlet) Class.forName(servletClass).newInstance(); - servlet.init(getServletConfig()); - } - catch (Throwable e) - { - ObjectUtils.throwAsError(e); - } - servlets.put(servletClass, servlet); - } - } - servlet.service(request, response); - } -} diff --git a/src/main/java/com/spun/util/servlets/ProgressBar.java b/src/main/java/com/spun/util/servlets/ProgressBar.java deleted file mode 100644 index cb6118e..0000000 --- a/src/main/java/com/spun/util/servlets/ProgressBar.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.spun.util.servlets; - - -public interface ProgressBar -{ - /***********************************************************************/ - public void doProgressReport(double amountDone); - /***********************************************************************/ - public void doFinish(); - /***********************************************************************/ - /***********************************************************************/ -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/servlets/SecondaryErrorProcessor.java b/src/main/java/com/spun/util/servlets/SecondaryErrorProcessor.java deleted file mode 100644 index 9c7c224..0000000 --- a/src/main/java/com/spun/util/servlets/SecondaryErrorProcessor.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.spun.util.servlets; - -import org.teachingkidsprogramming.util.parser.TemplateError; - -public interface SecondaryErrorProcessor -{ - public String processError(TemplateError error, Throwable t2); -} diff --git a/src/main/java/com/spun/util/servlets/ServletParameterException.java b/src/main/java/com/spun/util/servlets/ServletParameterException.java deleted file mode 100644 index 37b7273..0000000 --- a/src/main/java/com/spun/util/servlets/ServletParameterException.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.spun.util.servlets; - -public class ServletParameterException extends RuntimeException -{ - - private String value; - private String label; - - public ServletParameterException(String label, String value) - { - this.label = label; - this.value = value; - } - - public String getMessage() - { - - return "[" + label + " = '" + value + "']"; - } - -} diff --git a/src/main/java/com/spun/util/servlets/StageServlet.java b/src/main/java/com/spun/util/servlets/StageServlet.java deleted file mode 100644 index 48f652a..0000000 --- a/src/main/java/com/spun/util/servlets/StageServlet.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.spun.util.servlets; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -public interface StageServlet -{ - /***********************************************************************/ - public String doStage(int stage, HttpServletRequest req, HttpServletResponse res) throws Throwable; - /***********************************************************************/ - public String processError(Throwable t, HttpServletRequest req); - /***********************************************************************/ - /***********************************************************************/ -} diff --git a/src/main/java/com/spun/util/servlets/ValidationError.java b/src/main/java/com/spun/util/servlets/ValidationError.java deleted file mode 100644 index 73f0089..0000000 --- a/src/main/java/com/spun/util/servlets/ValidationError.java +++ /dev/null @@ -1,185 +0,0 @@ -package com.spun.util.servlets; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import org.teachingkidsprogramming.util.StringUtils; - -public class ValidationError extends RuntimeException { - private static final long serialVersionUID = 7940285202708976073L; - public static final ValidationError EMPTY = new ValidationError(); - private HashMap errors = new HashMap(); - private HashSet assertions = null; - private ValidationTracker iterator = null; - - /***********************************************************************/ - public ValidationError(Enum enumumations[]) { - this.assertions = new HashSet(); - for (Enum e : enumumations) { - this.assertions.add(e.toString()); - } - } - - /***********************************************************************/ - public ValidationError(String assertions[]) { - this.assertions = new HashSet(); - if (assertions != null) { - this.assertions.addAll(Arrays.asList(assertions)); - } - } - - public ValidationError() { - this.assertions = new HashSet(); - } - - /***********************************************************************/ - public String getMessage() { - return toString(); - } - - /***********************************************************************/ - public String toString() { - return "Validation(s) failed " + errors.keySet().toString() + " - " - + errors.values().toString(); - } - - /***********************************************************************/ - public ValidationTracker getTracker() { - if (iterator == null) { - iterator = new ValidationTracker(this); - } - return iterator; - } - - /***********************************************************************/ - public void set(Enum assertion, boolean isOk, String errorDescription) { - setError(assertion.toString(), !isOk, errorDescription); - } - - /***********************************************************************/ - public void setError(String assertion, boolean isError, - String errorDescription) { - if (isError && !StringUtils.isNonZero(errorDescription)) { - throw new Error("You can not use empty error descriptions"); - } - assertValidAssertion(assertion); - if (isError) { - errors.put(assertion, errorDescription); - } else { - errors.remove(assertion); - } - } - - /***********************************************************************/ - public void setIfValid(String assertion, boolean isError, - String errorDescription) { - if (!isOk()) { - return; - } - setError(assertion, isError, errorDescription); - } - - /***********************************************************************/ - public ValidationError add(String prefix, int index, ValidationError error) { - return add(getPrefixForIndex(prefix, index), error); - } - - /***********************************************************************/ - public ValidationError addForRange(String prefix, int startInclusive, - int endExclusive, ValidationError error) { - for (int i = startInclusive; i < endExclusive; i++) { - add(getPrefixForIndex(prefix, i), error); - } - return this; - } - - /***********************************************************************/ - public static String getPrefixForIndex(String prefix, int index) { - return prefix + "[" + index + "]"; - } - - /***********************************************************************/ - public ValidationError add(String prefix, ValidationError error) { - prefix = StringUtils.isEmpty(prefix) ? "" : (prefix + "."); - String[] assertions = StringUtils.toArray(error.assertions); - for (int i = 0; i < assertions.length; i++) { - this.assertions.add(prefix + assertions[i]); - } - Iterator iterator = error.errors.keySet().iterator(); - while (iterator.hasNext()) { - String key = (String) iterator.next(); - errors.put(prefix + key, error.errors.get(key)); - } - return this; - } - - /***********************************************************************/ - public boolean isOk() { - return (errors.size() == 0); - } - - /***********************************************************************/ - private void assertValidAssertion(String assertion) { - if (!this.assertions.contains(assertion)) { - // My_System.warning("Assertion '" + assertion + "' not found from " - // + assertions.toString()); - throw new Error("Assertion '" + assertion + "' not found from " - + assertions.toString()); - } - } - - /***********************************************************************/ - public boolean isValid(Enum e) { - return isValid(e.toString()); - } - - /***********************************************************************/ - public boolean isValid(String assertion) { - assertValidAssertion(assertion); - return (errors.get(assertion) == null); - } - - /***********************************************************************/ - public int size() { - return errors.size(); - } - - /***********************************************************************/ - public String getErrorDescription(Enum assertion) { - return getErrorDescription(assertion.toString()); - } - - /***********************************************************************/ - /** - * This get the description of the error - * - * @return The text description of the error or "" if the assertion was - * valid - **/ - public String getErrorDescription(String assertion) { - assertValidAssertion(assertion); - String errorDescription = (String) errors.get(assertion); - return (errorDescription == null) ? "" : errorDescription; - } - - /***********************************************************************/ - public String[] getAllErrorTitles() { - return StringUtils.toArray(errors.keySet()); - } - - /***********************************************************************/ - public void assertValid() { - if (!isOk()) { - throw this; - } - } - - /***********************************************************************/ - /***********************************************************************/ - public boolean isOnlyProblem(Enum e) { - String assertion = e.toString(); - assertValidAssertion(assertion); - return (errors.get(assertion) != null) && errors.size() == 1; - } -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/servlets/ValidationTracker.java b/src/main/java/com/spun/util/servlets/ValidationTracker.java deleted file mode 100644 index 552ddbd..0000000 --- a/src/main/java/com/spun/util/servlets/ValidationTracker.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.spun.util.servlets; - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.Arrays; -import org.teachingkidsprogramming.util.StringUtils; - -public class ValidationTracker implements Serializable -{ - private static final long serialVersionUID = -5910435589128935375L; - private ArrayList errors = null; - private ValidationError validationError = null; - - /***********************************************************************/ - public ValidationTracker(ValidationError validationError) - { - this.validationError = validationError; - errors = new ArrayList(); - errors.addAll(Arrays.asList(validationError.getAllErrorTitles())); - } - - /***********************************************************************/ - public boolean isValid(Enum assertion) - { - return isValid(assertion.toString()); - } - - /***********************************************************************/ - public boolean isValid(String assertion) - { - errors.remove(assertion); - return validationError.isValid(assertion); - } - - /***********************************************************************/ - public boolean isValidForIndex(String prefix, int index, String assertion) - { - return isValid(ValidationError.getPrefixForIndex(prefix, index) + "." - + assertion); - } - - /***********************************************************************/ - public String[] getRemainingErrors() - { - return StringUtils.toArray(errors); - } - - /***********************************************************************/ - public boolean hasRemainingErrors() - { - boolean hasRemainingErrors = !errors.isEmpty(); - if (hasRemainingErrors) - { - throw new Error("HTML did not catch following errors: " - + errors.toString()); - } - return hasRemainingErrors; - } - - /***********************************************************************/ - public ValidationError getValidationError() - { - return validationError; - } - /***********************************************************************/ - /***********************************************************************/ -} \ No newline at end of file diff --git a/src/main/java/org/teachingextensions/setup/SetupConfig.java b/src/main/java/org/teachingextensions/setup/SetupConfig.java index 1a75810..4e38a70 100644 --- a/src/main/java/org/teachingextensions/setup/SetupConfig.java +++ b/src/main/java/org/teachingextensions/setup/SetupConfig.java @@ -3,7 +3,7 @@ import org.teachingextensions.setup.SetupValidator.SetupCheckPoints; import org.teachingkidsprogramming.util.SystemUtils; -import com.spun.util.servlets.ValidationError; +import org.teachingkidsprogramming.util.servlets.ValidationError; public class SetupConfig { diff --git a/src/main/java/org/teachingkidsprogramming/util/servlets/InvokerServlet.java b/src/main/java/org/teachingkidsprogramming/util/servlets/InvokerServlet.java new file mode 100644 index 0000000..25c8193 --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/util/servlets/InvokerServlet.java @@ -0,0 +1,106 @@ +package org.teachingkidsprogramming.util.servlets; + +/* + * 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. + */ + +import org.teachingkidsprogramming.util.MySystem; +import org.teachingkidsprogramming.util.ObjectUtils; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.HashMap; + +/** + * The default servlet-invoking servlet for most web applications, + * used to serve requests to servlets that have not been registered + * in the web application deployment descriptor. + * + * @author Craig R. McClanahan + * @version $Revision$ $Date$ + */ +public final class InvokerServlet extends HttpServlet { + HashMap servlets = new HashMap<>(); + private String mask; + + public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { + serveRequest(request, response); + } + + public void doHead(HttpServletRequest request, HttpServletResponse response) throws IOException, + ServletException { + serveRequest(request, response); + } + + public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, + ServletException { + serveRequest(request, response); + } + + /** + * Initialize this servlet. + */ + public void init() throws ServletException { + mask = getServletConfig().getInitParameter("mask"); + MySystem.variable("Mask", mask); + } + + /** + * ******************************************************************* + */ + public void destroy() { + for (HttpServlet servlet : servlets.values()) { + servlet.destroy(); + } + super.destroy(); + } + + /** + * ******************************************************************* + */ + public void serveRequest(HttpServletRequest request, HttpServletResponse response) throws IOException, + ServletException { + String pathInfo = request.getPathInfo(); + String servletClass = pathInfo.substring(1); + int slash = servletClass.indexOf('/'); + if (slash >= 0) { + // pathInfo = servletClass.substring(slash); + servletClass = servletClass.substring(0, slash); + } + + if (!servletClass.startsWith(mask)) { + response.sendError(HttpServletResponse.SC_NOT_FOUND, servletClass); + return; + } + HttpServlet servlet; + synchronized (this) { + servlet = servlets.get(servletClass); + if (servlet == null) { + try { + servlet = (HttpServlet) Class.forName(servletClass).newInstance(); + servlet.init(getServletConfig()); + } catch (Throwable e) { + ObjectUtils.throwAsError(e); + } + servlets.put(servletClass, servlet); + } + } + servlet.service(request, response); + } +} diff --git a/src/main/java/org/teachingkidsprogramming/util/servlets/ValidationError.java b/src/main/java/org/teachingkidsprogramming/util/servlets/ValidationError.java new file mode 100644 index 0000000..88be0a0 --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/util/servlets/ValidationError.java @@ -0,0 +1,97 @@ +package org.teachingkidsprogramming.util.servlets; + +import org.teachingkidsprogramming.util.StringUtils; + +import java.util.HashMap; +import java.util.HashSet; + +public class ValidationError extends RuntimeException { + private static final long serialVersionUID = 7940285202708976073L; + private HashMap errors = new HashMap<>(); + private HashSet assertions = null; + + /***********************************************************************/ + public ValidationError(Enum enumumations[]) { + this.assertions = new HashSet<>(); + for (Enum e : enumumations) { + this.assertions.add(e.toString()); + } + } + + /***********************************************************************/ + public String getMessage() { + return toString(); + } + + /***********************************************************************/ + public String toString() { + return "Validation(s) failed " + errors.keySet().toString() + " - " + + errors.values().toString(); + } + + /***********************************************************************/ + public void set(Enum assertion, boolean isOk, String errorDescription) { + setError(assertion.toString(), !isOk, errorDescription); + } + + /***********************************************************************/ + public void setError(String assertion, boolean isError, + String errorDescription) { + if (isError && !StringUtils.isNonZero(errorDescription)) { + throw new Error("You can not use empty error descriptions"); + } + assertValidAssertion(assertion); + if (isError) { + errors.put(assertion, errorDescription); + } else { + errors.remove(assertion); + } + } + + /***********************************************************************/ + public ValidationError add(String prefix, int index, ValidationError error) { + return add(getPrefixForIndex(prefix, index), error); + } + + /***********************************************************************/ + public static String getPrefixForIndex(String prefix, int index) { + return prefix + "[" + index + "]"; + } + + /***********************************************************************/ + public ValidationError add(String prefix, ValidationError error) { + prefix = StringUtils.isEmpty(prefix) ? "" : (prefix + "."); + String[] assertions = StringUtils.toArray(error.assertions); + for (String assertion : assertions) { + this.assertions.add(prefix + assertion); + } + for (Object key : error.errors.keySet()) { + errors.put(prefix + key, error.errors.get(key)); + } + return this; + } + + /***********************************************************************/ + public boolean isOk() { + return (errors.size() == 0); + } + + /***********************************************************************/ + private void assertValidAssertion(String assertion) { + if (!this.assertions.contains(assertion)) { + // My_System.warning("Assertion '" + assertion + "' not found from " + // + assertions.toString()); + throw new Error("Assertion '" + assertion + "' not found from " + + assertions.toString()); + } + } + + /***********************************************************************/ + public int size() { + return errors.size(); + } + + /***********************************************************************/ + + /***********************************************************************/ +} \ No newline at end of file From 6f131bf4ba49294cc5ccc2a7833b7016b8ee4bc2 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Tue, 17 Mar 2015 14:59:19 -0700 Subject: [PATCH 056/111] Removed timers package --- src/main/java/com/spun/util/timers/Clock.java | 9 - .../java/com/spun/util/timers/Counter.java | 105 --------- .../java/com/spun/util/timers/EventTime.java | 222 ------------------ .../java/com/spun/util/timers/EventTimer.java | 42 ---- .../java/com/spun/util/timers/LapTime.java | 81 ------- 5 files changed, 459 deletions(-) delete mode 100644 src/main/java/com/spun/util/timers/Clock.java delete mode 100644 src/main/java/com/spun/util/timers/Counter.java delete mode 100644 src/main/java/com/spun/util/timers/EventTime.java delete mode 100644 src/main/java/com/spun/util/timers/EventTimer.java delete mode 100644 src/main/java/com/spun/util/timers/LapTime.java diff --git a/src/main/java/com/spun/util/timers/Clock.java b/src/main/java/com/spun/util/timers/Clock.java deleted file mode 100644 index 8a3f7b5..0000000 --- a/src/main/java/com/spun/util/timers/Clock.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.spun.util.timers; - -public class Clock -{ - public long getTime() - { - return System.currentTimeMillis(); - } -} diff --git a/src/main/java/com/spun/util/timers/Counter.java b/src/main/java/com/spun/util/timers/Counter.java deleted file mode 100644 index 05605aa..0000000 --- a/src/main/java/com/spun/util/timers/Counter.java +++ /dev/null @@ -1,105 +0,0 @@ -package com.spun.util.timers; - -import org.teachingkidsprogramming.util.DateDifference; - -/** - * A Utility for counting things. - **/ -public class Counter -{ - private int count = 0; - private long lastTime = 0; - private long startTime = 0; - private String label = null; - /************************************************************************/ - public Counter() - { - this(null); - } - /************************************************************************/ - public Counter(String label) - { - this.label = label; - this.startTime = System.currentTimeMillis(); - this.lastTime = this.startTime; - } - /************************************************************************/ - public void inc() - { - count++; - lastTime = System.currentTimeMillis(); - } - /************************************************************************/ - public void reset() - { - count = 0; - lastTime = System.currentTimeMillis(); - } - /************************************************************************/ - public int getCount() - { - return count; - } - /************************************************************************/ - public long getLastTime() - { - return lastTime; - } - /************************************************************************/ - public int getAverageClicksPerTime(long timeInMilli) - { - return (int) (getCount() / ((double) getTimeSinceStart() / timeInMilli)); - } - /************************************************************************/ - public long getTimeSinceLast() - { - return System.currentTimeMillis() - lastTime; - } - /************************************************************************/ - public long getTimeSinceStart() - { - return System.currentTimeMillis() - startTime; - } - /************************************************************************/ - public DateDifference getLastTimeDifference() - { - return new DateDifference(System.currentTimeMillis() - lastTime); - } - /************************************************************************/ - public String toString() - { - return "Counter [Count, Time] = [" + count + ", " + getLastTimeDifference().getStandardTimeText(2) + "]"; - } - /************************************************************************/ - /** - * A convenience function to turn a vector of Counter objects - * into an Array of the Counter objects. - * @param vectorOf a Vector of Counter objects - * @return the array of Counter. - * @throws Error if an element of vectorOf is not a Counter object. - **/ - public static Counter[] toArray(java.util.Vector vectorOf) - { - if (vectorOf == null) { return new Counter[0]; } - Counter array[] = new Counter[vectorOf.size()]; - for (int i = 0; i < array.length; i++) - { - java.lang.Object rowObject = vectorOf.elementAt(i); - if (rowObject instanceof Counter) - { - array[i] = (Counter) rowObject; - } - else - { - throw new Error("toArray[i] is not an instance of Counter but a " + rowObject.getClass().getName()); - } - } - return array; - } - /************************************************************************/ - /************************************************************************/ - public String getLabel() - { - return label; - } -} \ No newline at end of file diff --git a/src/main/java/com/spun/util/timers/EventTime.java b/src/main/java/com/spun/util/timers/EventTime.java deleted file mode 100644 index 2f35c49..0000000 --- a/src/main/java/com/spun/util/timers/EventTime.java +++ /dev/null @@ -1,222 +0,0 @@ -package com.spun.util.timers; - -import java.io.Serializable; -import org.teachingkidsprogramming.util.DateDifference; - -/** - * A Utility for timing an event multiple times. - * Holds min, max, timeouts. ect... - **/ -public class EventTime -{ - public enum SortBy { - NAME, COUNT, TOTAL_TIME, AVERAGE_TIME, MIN_TIME, MAX_TIME, EXCEEDED_COUNT - } - private static final String enumeration[] = {"unknown", - "name", - "count", - "total time", - "average time", - "min time", - "max time", - "excceded count" }; - private int count = 0; - private long totalTime = 0; - private String label = null; - private long maxTime = 0; - private long minTime = Long.MAX_VALUE; - private long timeLimit = 0; - private Counter timeLimitExceeded = null; - /************************************************************************/ - public EventTime() - { - } - /************************************************************************/ - public EventTime(String eventName, long timeLimit) - { - this.label = eventName; - this.timeLimit = timeLimit; - this.timeLimitExceeded = (timeLimit > 0) ? new Counter() : null; - } - /************************************************************************/ - public static int convertEnumerationString(String enumm) - { - int found = 0; - for (int i = 0; i < enumeration.length; i++) - { - if (enumeration[i].equalsIgnoreCase(enumm)) - { - found = i; - break; - } - } - return found; - } - /************************************************************************/ - public void add(long time) - { - totalTime += time; - count++; - maxTime = (time > maxTime) ? time : maxTime; - minTime = (time < minTime) ? time : minTime; - if ((timeLimitExceeded != null) && (time > timeLimit)) - { - timeLimitExceeded.inc(); - } - } - /************************************************************************/ - public void reset() - { - maxTime = 0; - minTime = Long.MAX_VALUE; - count = 0; - totalTime = 0; - } - /************************************************************************/ - public int getCount() - { - return count; - } - /************************************************************************/ - public String getLabel() - { - return label; - } - /************************************************************************/ - public long getTotalTime() - { - return totalTime; - } - /************************************************************************/ - public long getMaxTime() - { - return maxTime; - } - /************************************************************************/ - public DateDifference getMaxTimeAsDateDifference() - { - return new DateDifference(maxTime); - } - /************************************************************************/ - public long getTimeLimit() - { - return timeLimit; - } - /************************************************************************/ - public DateDifference getTimeLimitAsDateDifference() - { - return new DateDifference(timeLimit); - } - /************************************************************************/ - public Counter getTimeLimitExceededCounter() - { - return timeLimitExceeded; - } - /************************************************************************/ - public long getMinTime() - { - return minTime; - } - /************************************************************************/ - public DateDifference getMinTimeAsDateDifference() - { - return new DateDifference(minTime); - } - /************************************************************************/ - public long getAverageTime() - { - return (getCount() == 0) ? 0 : getTotalTime() / getCount(); - } - /************************************************************************/ - public DateDifference getAverageTimeAsDateDifference() - { - return new DateDifference(getAverageTime()); - } - /************************************************************************/ - public String toString() - { - String value = "com.spun.util.timers.EventTime["; - value += " count = " + count + ",\n" + " label = '" + label + "'" + ",\n" + " maxTime = " + maxTime + ",\n" - + " minTime = " + minTime + ",\n" + " timeLimit = " + timeLimit + ",\n" + " totalTime = " + totalTime - + "]"; - return value; - } - /************************************************************************/ - /** - * A convenience function to turn a vector of EventTime objects - * into an Array of the EventTime objects. - * @param vectorOf a Vector of EventTime objects - * @return the array of EventTime. - * @throws Error if an element of vectorOf is not a EventTime object. - **/ - public static EventTime[] toArray(java.util.Vector vectorOf) - { - if (vectorOf == null) { return new EventTime[0]; } - EventTime array[] = new EventTime[vectorOf.size()]; - for (int i = 0; i < array.length; i++) - { - java.lang.Object rowObject = vectorOf.elementAt(i); - if (rowObject instanceof EventTime) - { - array[i] = (EventTime) rowObject; - } - else - { - throw new Error("toArray[i] is not an instance of EventTime but a " + rowObject.getClass().getName()); - } - } - return array; - } - /************************************************************************/ - /** Inner Classes **/ - /************************************************************************/ - /** - * For use with java.util.Arrays.sort(Trade[], Trade.SortAddDate). - **/ - public static class SortEventTimers implements java.util.Comparator, Serializable - { - private SortBy type = null; - private int asc = 0; - /************************************************************************/ - public SortEventTimers(SortBy type, boolean asc) - { - this.type = type; - this.asc = (asc) ? 1 : -1; - } - /************************************************************************/ - public int compare(Object o1, Object o2) throws java.lang.ClassCastException - { - if ((o1 instanceof EventTime) && (o2 instanceof EventTime)) - { - EventTime et1 = (EventTime) o1; - EventTime et2 = (EventTime) o2; - switch (type) - { - case NAME : - return asc * et1.getLabel().compareToIgnoreCase(et2.getLabel()); - case COUNT : - return asc * (et1.getCount() - et2.getCount()); - case TOTAL_TIME : - return asc * (int) (et1.getTotalTime() - et2.getTotalTime()); - case AVERAGE_TIME : - return asc * (int) (et1.getAverageTime() - et2.getAverageTime()); - case MIN_TIME : - return asc * (int) (et1.getMinTime() - et2.getMinTime()); - case MAX_TIME : - return asc * (int) (et1.getMaxTime() - et2.getMaxTime()); - case EXCEEDED_COUNT : - return asc - * (et1.getTimeLimitExceededCounter().getCount() - et2.getTimeLimitExceededCounter().getCount()); - default : - return 0;//this cannot be reached - } - } - else - { - throw new java.lang.ClassCastException("Tried to compare apples and oranges in SortAddDate"); - } - } - /************************************************************************/ - /************************************************************************/ - } -} diff --git a/src/main/java/com/spun/util/timers/EventTimer.java b/src/main/java/com/spun/util/timers/EventTimer.java deleted file mode 100644 index 85bea30..0000000 --- a/src/main/java/com/spun/util/timers/EventTimer.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.spun.util.timers; - -import java.util.Date; -import java.util.HashMap; - -/** - * A Utility for timing things. this is multi-thread safe. - **/ -public class EventTimer -{ - private EventTime time = null; - private HashMap startTimes = new HashMap(); - /************************************************************************/ - public EventTimer() - { - time = new EventTime(); - } - /************************************************************************/ - public EventTimer(String label, long timeLimit) - { - time = new EventTime(label, timeLimit); - } - /************************************************************************/ - public EventTime getEventTime() - { - return time; - } - /************************************************************************/ - public void start() - { - startTimes.put("" + Thread.currentThread().hashCode(), new Date()); - } - /************************************************************************/ - public void end() - { - Date startTime = (Date) startTimes.remove("" + Thread.currentThread().hashCode()); - if (startTime == null) { throw new Error("Tried to end when not started"); } - time.add(System.currentTimeMillis() - startTime.getTime()); - } - /************************************************************************/ - /************************************************************************/ -} diff --git a/src/main/java/com/spun/util/timers/LapTime.java b/src/main/java/com/spun/util/timers/LapTime.java deleted file mode 100644 index 596c8b6..0000000 --- a/src/main/java/com/spun/util/timers/LapTime.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.spun.util.timers; - -import org.teachingkidsprogramming.util.DateDifference; - -/** - * A Utility for timing things. this is multi-thread safe. - **/ -public class LapTime -{ - private long lapTime = 0; - private String label = null; - - /************************************************************************/ - public LapTime(long lapTime, String label) - { - this.label = label; - this.lapTime = lapTime; - } - - /************************************************************************/ - public long getLapTime() - { - return lapTime; - } - - /************************************************************************/ - public String getLabel() - { - return label; - } - - /************************************************************************/ - public DateDifference getLapTimeAsDateDifference() - { - return new DateDifference(lapTime); - } - - /************************************************************************/ - /** - * A convenience function to turn a ArrayList of LapTime objects into an Array - * of the LapTime objects. - * - * @param ArrayListOf - * a ArrayList of LapTime objects - * @return the array of LapTime. - * @throws Error - * if an element of ArrayListOf is not a LapTime object. - **/ - public static LapTime[] toArray(java.util.ArrayList ArrayListOf) - { - if (ArrayListOf == null) - { - return new LapTime[0]; - } - LapTime array[] = new LapTime[ArrayListOf.size()]; - for (int i = 0; i < array.length; i++) - { - java.lang.Object rowObject = ArrayListOf.get(i); - if (rowObject instanceof LapTime) - { - array[i] = (LapTime) rowObject; - } else - { - throw new Error("toArray[i] is not an instance of LapTime but a " - + rowObject.getClass().getName()); - } - } - return array; - } - - /************************************************************************/ - public String toString() - { - String value = "com.spun.util.timers.LapTime["; - value += " Label = '" + label + "'" + ",\n" + " Lap Time = " - + getLapTimeAsDateDifference().getStandardTimeText(1) + "]"; - return value; - } - /***********************************************************************/ - /***********************************************************************/ -} From 5cbb3393cef8e5db3c3ac74248e6b50bedae6b57 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Tue, 17 Mar 2015 15:10:29 -0700 Subject: [PATCH 057/111] clean, move velocity package --- .../com/spun/util/velocity/ContextAware.java | 41 ------- .../com/spun/util/velocity/ParseCall.java | 6 - .../spun/util/velocity/ParserDateUtils.java | 113 ------------------ .../util/velocity/ServletContextLoader.java | 95 --------------- .../util/parser/TemplateError.java | 2 +- .../util/velocity/ContextAware.java | 41 +++++++ .../util/velocity/StringResourceLoader.java | 61 +++++----- .../util/velocity/TestableUberspect.java | 48 +++----- .../util/velocity/VelocityParser.java | 24 ++-- .../util/velocity/VelocityParsingError.java | 7 +- .../logo/tests/ColorGeneration.java | 4 +- 11 files changed, 110 insertions(+), 332 deletions(-) delete mode 100644 src/main/java/com/spun/util/velocity/ContextAware.java delete mode 100644 src/main/java/com/spun/util/velocity/ParseCall.java delete mode 100644 src/main/java/com/spun/util/velocity/ParserDateUtils.java delete mode 100644 src/main/java/com/spun/util/velocity/ServletContextLoader.java create mode 100644 src/main/java/org/teachingkidsprogramming/util/velocity/ContextAware.java rename src/main/java/{com/spun => org/teachingkidsprogramming}/util/velocity/StringResourceLoader.java (51%) rename src/main/java/{com/spun => org/teachingkidsprogramming}/util/velocity/TestableUberspect.java (88%) rename src/main/java/{com/spun => org/teachingkidsprogramming}/util/velocity/VelocityParser.java (90%) rename src/main/java/{com/spun => org/teachingkidsprogramming}/util/velocity/VelocityParsingError.java (87%) diff --git a/src/main/java/com/spun/util/velocity/ContextAware.java b/src/main/java/com/spun/util/velocity/ContextAware.java deleted file mode 100644 index 1945676..0000000 --- a/src/main/java/com/spun/util/velocity/ContextAware.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.spun.util.velocity; - -import java.util.HashMap; -import java.util.Map.Entry; - -import org.apache.velocity.context.Context; - -public interface ContextAware -{ - public void setupContext(Context context); - /***********************************************************************/ - /* INNER CLASS */ - /***********************************************************************/ - public static class ContextAwareMap implements ContextAware - { - HashMap add = new HashMap(); - /***********************************************************************/ - public ContextAwareMap() - { - } - /***********************************************************************/ - public ContextAwareMap(String key, Object object) - { - put(key, object); - } - public void put(String key, Object object) - { - add.put(key, object); - } - /***********************************************************************/ - public void setupContext(Context context) - { - for (Entry entry : add.entrySet()) - { - context.put(entry.getKey(), entry.getValue()); - } - } - } - /***********************************************************************/ - /***********************************************************************/ -} diff --git a/src/main/java/com/spun/util/velocity/ParseCall.java b/src/main/java/com/spun/util/velocity/ParseCall.java deleted file mode 100644 index 0d7cee5..0000000 --- a/src/main/java/com/spun/util/velocity/ParseCall.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.spun.util.velocity; - -public interface ParseCall -{ - public String parse(String template, ContextAware process); -} diff --git a/src/main/java/com/spun/util/velocity/ParserDateUtils.java b/src/main/java/com/spun/util/velocity/ParserDateUtils.java deleted file mode 100644 index 7c9c664..0000000 --- a/src/main/java/com/spun/util/velocity/ParserDateUtils.java +++ /dev/null @@ -1,113 +0,0 @@ -package com.spun.util.velocity; - -import java.util.Calendar; -import org.teachingkidsprogramming.util.DateUtils; -import org.teachingkidsprogramming.util.StringUtils; - -/***********************************************************************/ -public class ParserDateUtils -{ - public static final ParserDateUtils INSTANCE = new ParserDateUtils(); - public static Month[] getMonths() - { - return new Month[]{new Month("00", "------"), new Month("01", "Jan (01)"), new Month("02", "Feb (02)"), new Month("03", "Mar (03)"), new Month("04", "Apr (04)"), new Month("05", "May (05)"), new Month("06", "Jun (06)"), new Month("07", "Jul (07)"), new Month("08", "Aug (08)"), - new Month("09", "Sep (09)"), new Month("10", "Oct (10)"), new Month("11", "Nov (11)"), new Month("12", "Dec (12)")}; - } - /***********************************************************************/ - public static Day[] getDaysOfMonth() - { - Day[] days = new Day[32]; - days[0] = new Day("00", "--"); - for (int i = 1; i <= 31; i++) - { - days[i] = new Day(i); - } - return days; - } - /***********************************************************************/ - public static Year[] getNextXYears(int x) - { - return getNextXYears(x, 0); - } - /***********************************************************************/ - public static Year[] getNextXYears(int x, int backDateXDays) - { - Year[] years = new Year[x + 1]; - years[0] = new Year("0000", "----"); - int startingYear = DateUtils.asCalendar(DateUtils.getStartOfXDaysAgo(backDateXDays)).get(Calendar.YEAR); - for (int i = 0; i < x; i++) - { - years[i + 1] = new Year(startingYear + i); - } - return years; - } - /***********************************************************************/ - /***********************************************************************/ - /***********************************************************************/ - public static class Year extends DateValue - { - /***********************************************************************/ - public String getTwoDigitNumber() - { - return getNumber().substring(2); - } - public Year(String number, String displayText) - { - super(number, displayText); - } - /***********************************************************************/ - public Year(int i) - { - super("" + i, "" + i); - } - - } - /***********************************************************************/ - public static class Day extends DateValue - { - public Day(int i) - { - super(StringUtils.padNumber(i, 2), "" + i); - } - public Day(String number, String displayText) - { - super(number, displayText); - } - } - /***********************************************************************/ - public static class Month extends DateValue - { - public Month(String number, String displayText) - { - super(number, displayText); - } - } - /***********************************************************************/ - public static class DateValue - { - private String number; - private String displayText; - /***********************************************************************/ - public boolean isDefault() - { - return displayText.startsWith("--"); - } - /***********************************************************************/ - public DateValue(String number, String displayText) - { - this.number= number; - this.displayText = displayText; - } - /***********************************************************************/ - public String getNumber() - { - return number; - } - /***********************************************************************/ - public String getDisplayText() - { - return displayText; - } - /***********************************************************************/ - } -} diff --git a/src/main/java/com/spun/util/velocity/ServletContextLoader.java b/src/main/java/com/spun/util/velocity/ServletContextLoader.java deleted file mode 100644 index 8dfd9c0..0000000 --- a/src/main/java/com/spun/util/velocity/ServletContextLoader.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.spun.util.velocity; - -import java.io.InputStream; -import java.util.Arrays; -import javax.servlet.ServletContext; -import org.apache.commons.collections.ExtendedProperties; -import org.apache.velocity.exception.ResourceNotFoundException; -import org.apache.velocity.runtime.resource.Resource; -import org.apache.velocity.runtime.resource.loader.ResourceLoader; - -public class ServletContextLoader extends ResourceLoader -{ - /** The root paths for templates (relative to webapp's root). */ - protected String[] paths = null; - protected static ServletContext servletContext = null; - /** - * This is abstract in the base class, so we need it. - *
- * NOTE: this expects that the ServletContext has already - * been placed in the runtime's application attributes - * under its full class name (i.e. "javax.servlet.ServletContext"). - * - * @param configuration the {@link ExtendedProperties} associated with - * this resource loader. - */ - public void init(ExtendedProperties configuration) - { - paths = configuration.getStringArray("path"); - if (paths == null || paths.length == 0) - { - paths = new String[1]; - paths[0] = "/"; - } - else - { - /* make sure the paths end with a '/' */ - for (int i = 0; i < paths.length; i++) - { - if (!paths[i].endsWith("/")) - { - paths[i] += '/'; - } - } - } - //My_System.variable("paths", paths); - } - /** - * Get an InputStream so that the Runtime can build a - * template with it. - * - * @param name name of template to get - * @return InputStream containing the template - * @throws ResourceNotFoundException if template not found - * in classpath. - */ - public synchronized InputStream getResourceStream(String name) throws ResourceNotFoundException - { - if (name == null || name.length() == 0) { return null;} - /* since the paths always ends in '/', - * make sure the name never ends in one */ - while (name.startsWith("/")) - { - name = name.substring(1); - } - for (int i = 0; i < paths.length; i++) - { - InputStream result = null; - result = servletContext.getResourceAsStream(paths[i] + name); - if (result != null) - { - /* exit the loop if we found the template */ - return result; - } - } - throw new ResourceNotFoundException(String.format("Template '%s' not found from %s", name, Arrays.asList(paths))); - } - /** - * Defaults to return false. - */ - public boolean isSourceModified(Resource resource) - { - return false; - } - /** - * Defaults to return 0 - */ - public long getLastModified(Resource resource) - { - return 0; - } - public static void registerServletContext(ServletContext servletContext) - { - ServletContextLoader.servletContext = servletContext; - } -} diff --git a/src/main/java/org/teachingkidsprogramming/util/parser/TemplateError.java b/src/main/java/org/teachingkidsprogramming/util/parser/TemplateError.java index ceeb14e..75cba73 100644 --- a/src/main/java/org/teachingkidsprogramming/util/parser/TemplateError.java +++ b/src/main/java/org/teachingkidsprogramming/util/parser/TemplateError.java @@ -1,6 +1,6 @@ package org.teachingkidsprogramming.util.parser; -import com.spun.util.velocity.ContextAware; +import org.teachingkidsprogramming.util.velocity.ContextAware; import org.apache.velocity.context.Context; import java.io.ByteArrayOutputStream; diff --git a/src/main/java/org/teachingkidsprogramming/util/velocity/ContextAware.java b/src/main/java/org/teachingkidsprogramming/util/velocity/ContextAware.java new file mode 100644 index 0000000..817f7e3 --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/util/velocity/ContextAware.java @@ -0,0 +1,41 @@ +package org.teachingkidsprogramming.util.velocity; + +import org.apache.velocity.context.Context; + +import java.util.HashMap; +import java.util.Map.Entry; + +public interface ContextAware { + public void setupContext(Context context); + /***********************************************************************/ + /* INNER CLASS */ + + /** + * ******************************************************************* + */ + public static class ContextAwareMap implements ContextAware { + HashMap add = new HashMap<>(); + + /** + * ******************************************************************* + */ + public ContextAwareMap(String key, Object object) { + put(key, object); + } + + public void put(String key, Object object) { + add.put(key, object); + } + + /** + * ******************************************************************* + */ + public void setupContext(Context context) { + for (Entry entry : add.entrySet()) { + context.put(entry.getKey(), entry.getValue()); + } + } + } + /***********************************************************************/ + /***********************************************************************/ +} diff --git a/src/main/java/com/spun/util/velocity/StringResourceLoader.java b/src/main/java/org/teachingkidsprogramming/util/velocity/StringResourceLoader.java similarity index 51% rename from src/main/java/com/spun/util/velocity/StringResourceLoader.java rename to src/main/java/org/teachingkidsprogramming/util/velocity/StringResourceLoader.java index db57c55..446d812 100644 --- a/src/main/java/com/spun/util/velocity/StringResourceLoader.java +++ b/src/main/java/org/teachingkidsprogramming/util/velocity/StringResourceLoader.java @@ -1,4 +1,4 @@ -package com.spun.util.velocity; +package org.teachingkidsprogramming.util.velocity; /* * Copyright 2001-2002,2004 The Apache Software Foundation. @@ -15,41 +15,46 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import java.io.InputStream; import org.apache.commons.collections.ExtendedProperties; import org.apache.velocity.exception.ResourceNotFoundException; import org.apache.velocity.runtime.resource.Resource; import org.apache.velocity.runtime.resource.loader.ResourceLoader; - import org.teachingkidsprogramming.util.StringUtils; +import java.io.InputStream; + /** * This is a simple resource loader that loads the string as a template - * - **/ -public class StringResourceLoader extends ResourceLoader -{ - /***********************************************************************/ - public boolean isSourceModified(Resource resource) - { - return true; - } - /***********************************************************************/ - public long getLastModified(Resource resource) - { - return 0; - } - /***********************************************************************/ - public synchronized InputStream getResourceStream(String name) throws ResourceNotFoundException - { - return StringUtils.convertToInputStream(name); - } - /***********************************************************************/ - public void init(ExtendedProperties arg0) - { + */ +public class StringResourceLoader extends ResourceLoader { + /** + * ******************************************************************* + */ + public boolean isSourceModified(Resource resource) { + return true; + } + + /** + * ******************************************************************* + */ + public long getLastModified(Resource resource) { + return 0; + } + + /** + * ******************************************************************* + */ + public synchronized InputStream getResourceStream(String name) throws ResourceNotFoundException { + return StringUtils.convertToInputStream(name); + } + + /** + * ******************************************************************* + */ + public void init(ExtendedProperties arg0) { // My_System.event("initialize"); - } - /***********************************************************************/ - /***********************************************************************/ + } + /***********************************************************************/ + /***********************************************************************/ } diff --git a/src/main/java/com/spun/util/velocity/TestableUberspect.java b/src/main/java/org/teachingkidsprogramming/util/velocity/TestableUberspect.java similarity index 88% rename from src/main/java/com/spun/util/velocity/TestableUberspect.java rename to src/main/java/org/teachingkidsprogramming/util/velocity/TestableUberspect.java index 828a73b..28a03fa 100644 --- a/src/main/java/com/spun/util/velocity/TestableUberspect.java +++ b/src/main/java/org/teachingkidsprogramming/util/velocity/TestableUberspect.java @@ -1,4 +1,4 @@ -package com.spun.util.velocity; +package org.teachingkidsprogramming.util.velocity; import java.lang.reflect.Method; import java.util.ArrayList; @@ -6,6 +6,7 @@ import java.util.Enumeration; import java.util.Iterator; import java.util.Map; + import org.apache.velocity.runtime.RuntimeLogger; import org.apache.velocity.runtime.parser.node.AbstractExecutor; import org.apache.velocity.runtime.parser.node.BooleanPropertyExecutor; @@ -38,8 +39,7 @@ public class TestableUberspect implements Uberspect, UberspectLoggable private static IntrospectorBase introspector; private static Introspector introspectorWithLog; private RuntimeLogger log; - private static boolean beKindToNulls = false; - /***********************************************************************/ + /***********************************************************************/ /** * init - does nothing - we need to have setRuntimeLogger * called before getting our introspector, as the default @@ -55,11 +55,8 @@ public void setRuntimeLogger(RuntimeLogger runtimeLogger) introspectorWithLog = new Introspector(runtimeLogger); log = runtimeLogger; } - public void setBeKindToNulls(boolean behavior) - { - beKindToNulls = behavior; - } - /***********************************************************************/ + + /***********************************************************************/ public Iterator getIterator(Object obj, Info i) throws Exception { return getStandardIterator(obj, i); @@ -90,16 +87,9 @@ else if (obj instanceof Iterator) public VelMethod getMethod(Object obj, String methodName, Object[] args, Info i) throws Exception { if (obj == null) - { - if(beKindToNulls) - { - return null; - } - else - { - throw new VelocityParsingError("tried " + getMethodText("null", methodName, args), i); - } - } + { + throw new VelocityParsingError("tried " + getMethodText("null", methodName, args), i); + } Method m = introspector.getMethod(obj.getClass(), methodName, args); if (m == null) { throw new VelocityParsingError("Method " + getMethodText(obj.getClass().getName(), methodName, args) + " does not exist.", i); } return new VelMethodImpl(m); @@ -107,7 +97,7 @@ public VelMethod getMethod(Object obj, String methodName, Object[] args, Info i) /***********************************************************************/ public static String getMethodText(String className, String methodName, Object[] args) { - StringBuffer methodSignature = new StringBuffer(); + StringBuilder methodSignature = new StringBuilder(); for (int i = 0; args != null && i < args.length; i++) { methodSignature.append(ObjectUtils.getClassName(args[i])); @@ -120,18 +110,18 @@ public VelPropertyGet getPropertyGet(Object obj, String identifier, Info i) thro { AbstractExecutor executor; if (obj == null) { throw new VelocityParsingError("tried " + getPropertyText("null", identifier), i); } - Class claz = obj.getClass(); + Class type = obj.getClass(); // trying getFoo() - executor = new PropertyExecutor(log, introspectorWithLog, claz, identifier); + executor = new PropertyExecutor(log, introspectorWithLog, type, identifier); if (!executor.isAlive()) { // trying get("foo") - executor = new GetExecutor(log, introspectorWithLog, claz, identifier); + executor = new GetExecutor(log, introspectorWithLog, type, identifier); } if (!executor.isAlive()) { // trying isFoo() - executor = new BooleanPropertyExecutor(log, introspectorWithLog, claz, identifier); + executor = new BooleanPropertyExecutor(log, introspectorWithLog, type, identifier); } if (!executor.isAlive()) { throw new VelocityParsingError("Did not find " + getPropertyText(obj.getClass().getName(), identifier), i); } return new VelGetterImpl(executor); @@ -144,7 +134,7 @@ private String getPropertyText(String className, String identifier) /***********************************************************************/ public VelPropertySet getPropertySet(Object obj, String identifier, Object arg, Info i) throws Exception { - Class claz = obj.getClass(); + Class type = obj.getClass(); VelMethod vm = null; try { @@ -157,9 +147,9 @@ public VelPropertySet getPropertySet(Object obj, String identifier, Object arg, vm = getMethod(obj, "set" + identifier, params, i); if (vm == null) { throw new NoSuchMethodException(); } } - catch (NoSuchMethodException nsme2) + catch (NoSuchMethodException e) { - StringBuffer sb = new StringBuffer("set"); + StringBuilder sb = new StringBuilder("set"); sb.append(identifier); if (Character.isLowerCase(sb.charAt(3))) { @@ -173,12 +163,12 @@ public VelPropertySet getPropertySet(Object obj, String identifier, Object arg, if (vm == null) { throw new NoSuchMethodException(); } } } - catch (NoSuchMethodException nsme) + catch (NoSuchMethodException e) { /* * right now, we only support the Map interface */ - if (Map.class.isAssignableFrom(claz)) + if (Map.class.isAssignableFrom(type)) { Object[] params = {new Object(), new Object()}; vm = getMethod(obj, "put", params, i); @@ -250,7 +240,7 @@ public VelSetterImpl(VelMethod velmethod, String key) } public Object invoke(Object o, Object value) throws Exception { - ArrayList al = new ArrayList(); + ArrayList al = new ArrayList<>(); if (putKey != null) { al.add(putKey); diff --git a/src/main/java/com/spun/util/velocity/VelocityParser.java b/src/main/java/org/teachingkidsprogramming/util/velocity/VelocityParser.java similarity index 90% rename from src/main/java/com/spun/util/velocity/VelocityParser.java rename to src/main/java/org/teachingkidsprogramming/util/velocity/VelocityParser.java index 775487c..54bda3a 100644 --- a/src/main/java/com/spun/util/velocity/VelocityParser.java +++ b/src/main/java/org/teachingkidsprogramming/util/velocity/VelocityParser.java @@ -1,4 +1,4 @@ -package com.spun.util.velocity; +package org.teachingkidsprogramming.util.velocity; import java.io.StringWriter; import java.io.Writer; @@ -18,6 +18,9 @@ import org.teachingkidsprogramming.util.ObjectUtils; import org.teachingkidsprogramming.util.io.FileUtils; import org.teachingkidsprogramming.util.parser.ParserCommons; +import org.teachingkidsprogramming.util.velocity.ContextAware; +import org.teachingkidsprogramming.util.velocity.StringResourceLoader; +import org.teachingkidsprogramming.util.velocity.TestableUberspect; public class VelocityParser { @@ -64,10 +67,9 @@ public static Writer parse(String template, Properties props, ContextAware proce VelocityEngine engine = initializeEngine(props); VelocityContext context = new VelocityContext(); Template velocityTemplate = engine.getTemplate(template); - for (int i = 0; i < process.length; i++) - { - if(process[i] != null) process[i].setupContext(context); - } + for (ContextAware p : process) { + if (p != null) p.setupContext(context); + } velocityTemplate.merge(context, out); return out; } @@ -86,13 +88,13 @@ public static synchronized VelocityEngine initializeEngine(Properties props) thr return currentEngine; } /***********************************************************************/ - private static boolean isDifferentForProperties(Properties props, VelocityEngine velo, String[] keys) + private static boolean isDifferentForProperties(Properties props, VelocityEngine engine, String[] keys) { - for (int i = 0; i < keys.length; i++) - { - String key = keys[i]; - if (!ObjectUtils.isEqual(props.get(key), velo.getProperty(key))) { return true; } - } + for (String key : keys) { + if (!ObjectUtils.isEqual(props.get(key), engine.getProperty(key))) { + return true; + } + } return false; } /***********************************************************************/ diff --git a/src/main/java/com/spun/util/velocity/VelocityParsingError.java b/src/main/java/org/teachingkidsprogramming/util/velocity/VelocityParsingError.java similarity index 87% rename from src/main/java/com/spun/util/velocity/VelocityParsingError.java rename to src/main/java/org/teachingkidsprogramming/util/velocity/VelocityParsingError.java index 1ab4b3e..24d0538 100644 --- a/src/main/java/com/spun/util/velocity/VelocityParsingError.java +++ b/src/main/java/org/teachingkidsprogramming/util/velocity/VelocityParsingError.java @@ -1,4 +1,4 @@ -package com.spun.util.velocity; +package org.teachingkidsprogramming.util.velocity; import org.apache.velocity.util.introspection.Info; @@ -24,9 +24,4 @@ public static String getInfoText(Info i) return " at [" + i.getLine() + "," + i.getColumn() + "]" + " in template " + i.getTemplateName(); } - public Info getInfo() - { - return info; - } - } diff --git a/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.java b/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.java index 8191719..964206b 100644 --- a/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.java +++ b/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.java @@ -19,8 +19,8 @@ import org.teachingkidsprogramming.util.TestUtils; import org.teachingkidsprogramming.util.Tuple; import org.teachingkidsprogramming.util.io.FileUtils; -import com.spun.util.velocity.ContextAware.ContextAwareMap; -import com.spun.util.velocity.VelocityParser; +import org.teachingkidsprogramming.util.velocity.ContextAware.ContextAwareMap; +import org.teachingkidsprogramming.util.velocity.VelocityParser; @UseReporter(TortoiseTextDiffReporter.class) public class ColorGeneration extends TestCase From 505721c8241ffef9796da6b3e7cd374601ecbef8 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Tue, 17 Mar 2015 15:27:45 -0700 Subject: [PATCH 058/111] cleaned, moved approvals --- .../java/org/approvaltests/Approvals.java | 157 ------------------ .../org/approvaltests/ReporterFactory.java | 107 ------------ .../reporters/ExecutableQueryFailure.java | 2 +- .../logo/utils/TortoiseUtils.java | 2 +- .../approvals/lite/Approvals.java | 84 ++++++++++ .../approvals/lite/ReporterFactory.java | 94 +++++++++++ .../logo/tests/ColorGeneration.java | 2 +- .../logo/tests/RecipeTests.java | 2 +- .../logo/tests/TurtlePanelTest.java | 2 +- .../logo/tests/TurtleTest.java | 2 +- .../logo/tests/WheelTest.java | 2 +- .../simpleparser/tests/ParserTest.java | 2 +- 12 files changed, 186 insertions(+), 272 deletions(-) delete mode 100644 src/main/java/org/approvaltests/Approvals.java delete mode 100644 src/main/java/org/approvaltests/ReporterFactory.java create mode 100644 src/main/java/org/teachingkidsprogramming/approvals/lite/Approvals.java create mode 100644 src/main/java/org/teachingkidsprogramming/approvals/lite/ReporterFactory.java diff --git a/src/main/java/org/approvaltests/Approvals.java b/src/main/java/org/approvaltests/Approvals.java deleted file mode 100644 index 3f0e4b6..0000000 --- a/src/main/java/org/approvaltests/Approvals.java +++ /dev/null @@ -1,157 +0,0 @@ -package org.approvaltests; - -import java.awt.Component; -import java.awt.Image; -import java.awt.image.BufferedImage; -import java.io.File; -import java.util.Arrays; -import java.util.Map; - -import org.approvaltests.ReporterFactory.FileTypes; -import org.approvaltests.approvers.FileApprover; -import org.approvaltests.core.ApprovalFailureOverrider; -import org.approvaltests.core.ApprovalFailureReporter; -import org.approvaltests.core.ApprovalWriter; -import org.approvaltests.namer.ApprovalNamer; -import org.approvaltests.namer.JUnitStackTraceNamer; -import org.approvaltests.writers.ApprovalTextWriter; -import org.approvaltests.writers.ApprovalXmlWriter; -import org.approvaltests.writers.ComponentApprovalWriter; -import org.approvaltests.writers.FileApprovalWriter; -import org.approvaltests.writers.ImageApprovalWriter; -import org.lambda.functions.Function1; - -import org.teachingkidsprogramming.util.ArrayUtils; -import org.teachingkidsprogramming.util.ObjectUtils; -import org.teachingkidsprogramming.util.StringUtils; - -public class Approvals { - public static void verify(String response) throws Exception { - verify(new ApprovalTextWriter(response, "txt"), FileTypes.Text); - } - - public static void verify(Object o) throws Exception { - verify("" + o); - } - - public static void verifyAll(String label, T[] array) throws Exception { - verify(new ApprovalTextWriter(StringUtils.toString(label, array), "txt"), - FileTypes.Text); - } - - public static void verifyAll(String header, String label, T[] array) - throws Exception { - verify(new ApprovalTextWriter(formatHeader(header) - + StringUtils.toString(label, array), "txt"), FileTypes.Text); - } - - public static void verifyAll(T[] values, Function1 f1) { - String text = ArrayUtils.toString(values, f1); - verify(new ApprovalTextWriter(text, "txt"), FileTypes.Text); - } - - public static void verifyAll(String header, T[] values, - Function1 f1) { - verifyAll(header, Arrays.asList(values), f1); - } - - public static void verifyAll(String header, Iterable array, - Function1 f1) { - String text = formatHeader(header) + ArrayUtils.toString(array, f1); - verify(new ApprovalTextWriter(text, "txt"), FileTypes.Text); - } - - private static String formatHeader(String header) { - return StringUtils.isEmpty(header) ? "" : header + "\r\n\r\n\r\n"; - } - - public static void verifyAll(String label, Iterable array) - throws Exception { - verify(new ApprovalTextWriter(StringUtils.toString(label, array), "txt"), - FileTypes.Text); - } - - public static void verifyAll(String header, String label, - Iterable array) throws Exception { - verify(new ApprovalTextWriter(formatHeader(header) - + StringUtils.toString(label, array), "txt"), FileTypes.Text); - } - - public static void verify(Component c) throws Exception { - verify(new ComponentApprovalWriter(c), FileTypes.Image); - } - - public static void verifyHtml(String response) throws Exception { - verify(new ApprovalTextWriter(response, "html"), FileTypes.Html); - } - - public static void verify(File generateFile) { - verify(new FileApprovalWriter(generateFile), FileTypes.File); - } - - public static void verify(Image image) { - // approve(ImageWriter.toBufferedImage(image), createApprovalNamer()); - } - - public static void verify(BufferedImage bufferedImage) { - verify(new ImageApprovalWriter(bufferedImage), FileTypes.Image); - } - - public static void verify(ApprovalWriter writter, ApprovalNamer namer, - ApprovalFailureReporter reporter) { - verify(new FileApprover(writter, namer), reporter); - } - - public static void verify(ApprovalWriter writter, String fileType) { - verify(writter, createApprovalNamer(), ReporterFactory.get(fileType)); - } - - public static void verifyXml(String xml) throws Exception { - verify(new ApprovalXmlWriter(xml), FileTypes.Text); - } - - public static void verify(FileApprover approver, - ApprovalFailureReporter reporter) { - try { - if (!approver.approve()) { - boolean passed = false; - if (reporter instanceof ApprovalFailureOverrider) { - passed = approver - .askToChangeReceivedToApproved((ApprovalFailureOverrider) reporter); - } - if (!passed) { - approver.reportFailure(reporter); - approver.fail(); - } else { - approver.cleanUpAfterSuccess(reporter); - } - } else { - approver.cleanUpAfterSuccess(reporter); - } - } catch (Exception e) { - throw ObjectUtils.throwAsError(e); - } - } - - public static void verify(Map map) throws Exception { - verify(new ApprovalTextWriter(StringUtils.toString(map), "txt"), - FileTypes.Text); - } - - public static ApprovalNamer createApprovalNamer() { - return new JUnitStackTraceNamer(); - } - - private static void approve(BufferedImage bufferedImage, ApprovalNamer namer) { - verify(new ImageApprovalWriter(bufferedImage), FileTypes.Image); - } - -// private static String getFileNameList(List mismatched) { -// return Query.select(mismatched, -// new F1(mismatched.get(1)) { -// { -// ret(a.getName()); -// } -// }).toString(); -// } -} \ No newline at end of file diff --git a/src/main/java/org/approvaltests/ReporterFactory.java b/src/main/java/org/approvaltests/ReporterFactory.java deleted file mode 100644 index 6b2401c..0000000 --- a/src/main/java/org/approvaltests/ReporterFactory.java +++ /dev/null @@ -1,107 +0,0 @@ -package org.approvaltests; - -import java.lang.annotation.Annotation; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -import org.approvaltests.core.ApprovalFailureReporter; -import org.approvaltests.reporters.DiffReporter; -import org.approvaltests.reporters.FileLauncherReporter; -import org.approvaltests.reporters.ImageReporter; -import org.approvaltests.reporters.MultiReporter; -import org.approvaltests.reporters.QuietReporter; -import org.approvaltests.reporters.UseReporter; - -import org.teachingkidsprogramming.util.ClassUtils; - -public class ReporterFactory -{ - private static HashMap> reporters = new HashMap>(); - public static class FileTypes - { - public static final String Text = "txt"; - public static final String Html = "html"; - public static final String Excel = "csv"; - public static final String File = "file"; - public static final String Image = "png"; - private static final String Default = "default"; - } - static - { - setupReporters(); - } - public static ApprovalFailureReporter get(String string) - { - ApprovalFailureReporter returned = getFromAnnotation(); - returned = tryFor(returned, reporters.get(string)); - returned = tryFor(returned, reporters.get(FileTypes.Default)); - return returned; - } - public static ApprovalFailureReporter getFromAnnotation() - { - UseReporter reporter = getAnnotationFromStackTrace(UseReporter.class); - return reporter == null ? null : getReporter(reporter); - } - private static ApprovalFailureReporter getReporter(UseReporter reporter) - { - Class[] classes = reporter.value(); - List reporters = new ArrayList(); - for (Class clazz : classes) - { - ApprovalFailureReporter instance = ClassUtils.create(clazz); - reporters.add(instance); - } - return reporters.size() == 1 ? reporters.get(0) : new MultiReporter(reporters); - } - private static T getAnnotationFromStackTrace(Class annotationClass) - { - StackTraceElement[] trace = Thread.currentThread().getStackTrace(); - for (StackTraceElement stack : trace) - { - Method method = null; - Class clazz = null; - try - { - String methodName = stack.getMethodName(); - clazz = Class.forName(stack.getClassName()); - method = clazz.getMethod(methodName, (Class[]) null); - } - catch (Exception e) - { - //ignore - } - T annotation = null; - if (method != null) - { - annotation = method.getAnnotation(annotationClass); - } - if (annotation != null) { return annotation; } - annotation = clazz.getAnnotation(annotationClass); - if (annotation != null) { return annotation; } - } - return null; - } - private static ApprovalFailureReporter tryFor(ApprovalFailureReporter returned, - Class trying) - { - if (returned == null && trying != null) { return ClassUtils.create(trying); } - return returned; - } - private static void setupReporters() - { - reporters.put(FileTypes.Text, DiffReporter.class); - reporters.put(FileTypes.Html, DiffReporter.class); - reporters.put(FileTypes.Excel, FileLauncherReporter.class); - reporters.put(FileTypes.File, FileLauncherReporter.class); - reporters.put(FileTypes.Image, ImageReporter.class); - reporters.put(FileTypes.Default, QuietReporter.class); - } - public static void clearAllReportersExceptDefault() - { - Class all = reporters.get(FileTypes.Default); - reporters.clear(); - reporters.put(FileTypes.Default, all); - } -} diff --git a/src/main/java/org/approvaltests/reporters/ExecutableQueryFailure.java b/src/main/java/org/approvaltests/reporters/ExecutableQueryFailure.java index 334a228..1b38c23 100644 --- a/src/main/java/org/approvaltests/reporters/ExecutableQueryFailure.java +++ b/src/main/java/org/approvaltests/reporters/ExecutableQueryFailure.java @@ -3,7 +3,7 @@ import java.io.File; import java.io.IOException; -import org.approvaltests.ReporterFactory; +import org.teachingkidsprogramming.approvals.lite.ReporterFactory; import org.approvaltests.core.ApprovalFailureReporter; import org.approvaltests.core.ApprovalReporterWithCleanUp; diff --git a/src/main/java/org/teachingextensions/logo/utils/TortoiseUtils.java b/src/main/java/org/teachingextensions/logo/utils/TortoiseUtils.java index 8582d55..22aa223 100644 --- a/src/main/java/org/teachingextensions/logo/utils/TortoiseUtils.java +++ b/src/main/java/org/teachingextensions/logo/utils/TortoiseUtils.java @@ -1,6 +1,6 @@ package org.teachingextensions.logo.utils; -import org.approvaltests.Approvals; +import org.teachingkidsprogramming.approvals.lite.Approvals; import org.approvaltests.namer.ApprovalResults; import org.teachingextensions.logo.Turtle; diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/Approvals.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/Approvals.java new file mode 100644 index 0000000..670764e --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/approvals/lite/Approvals.java @@ -0,0 +1,84 @@ +package org.teachingkidsprogramming.approvals.lite; + +import org.teachingkidsprogramming.approvals.lite.ReporterFactory.FileTypes; +import org.approvaltests.approvers.FileApprover; +import org.approvaltests.core.ApprovalFailureOverrider; +import org.approvaltests.core.ApprovalFailureReporter; +import org.approvaltests.core.ApprovalWriter; +import org.approvaltests.namer.ApprovalNamer; +import org.approvaltests.namer.JUnitStackTraceNamer; +import org.approvaltests.writers.ApprovalTextWriter; +import org.approvaltests.writers.ImageApprovalWriter; +import org.lambda.functions.Function1; +import org.teachingkidsprogramming.util.ArrayUtils; +import org.teachingkidsprogramming.util.ObjectUtils; +import org.teachingkidsprogramming.util.StringUtils; + +import java.awt.image.BufferedImage; +import java.util.Arrays; + +public class Approvals { + public static void verify(String response) throws Exception { + verify(new ApprovalTextWriter(response, "txt"), FileTypes.Text); + } + + public static void verifyAll(String header, T[] values, + Function1 f1) { + verifyAll(header, Arrays.asList(values), f1); + } + + public static void verifyAll(String header, Iterable array, + Function1 f1) { + String text = formatHeader(header) + ArrayUtils.toString(array, f1); + verify(new ApprovalTextWriter(text, "txt"), FileTypes.Text); + } + + private static String formatHeader(String header) { + return StringUtils.isEmpty(header) ? "" : header + "\r\n\r\n\r\n"; + } + + public static void verifyHtml(String response) throws Exception { + verify(new ApprovalTextWriter(response, "html"), FileTypes.Html); + } + + public static void verify(BufferedImage bufferedImage) { + verify(new ImageApprovalWriter(bufferedImage), FileTypes.Image); + } + + public static void verify(ApprovalWriter writter, ApprovalNamer namer, + ApprovalFailureReporter reporter) { + verify(new FileApprover(writter, namer), reporter); + } + + public static void verify(ApprovalWriter writter, String fileType) { + verify(writter, createApprovalNamer(), ReporterFactory.get(fileType)); + } + + public static void verify(FileApprover approver, + ApprovalFailureReporter reporter) { + try { + if (!approver.approve()) { + boolean passed = false; + if (reporter instanceof ApprovalFailureOverrider) { + passed = approver + .askToChangeReceivedToApproved((ApprovalFailureOverrider) reporter); + } + if (!passed) { + approver.reportFailure(reporter); + approver.fail(); + } else { + approver.cleanUpAfterSuccess(reporter); + } + } else { + approver.cleanUpAfterSuccess(reporter); + } + } catch (Exception e) { + throw ObjectUtils.throwAsError(e); + } + } + + public static ApprovalNamer createApprovalNamer() { + return new JUnitStackTraceNamer(); + } + +} \ No newline at end of file diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/ReporterFactory.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/ReporterFactory.java new file mode 100644 index 0000000..bdb6581 --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/approvals/lite/ReporterFactory.java @@ -0,0 +1,94 @@ +package org.teachingkidsprogramming.approvals.lite; + +import org.approvaltests.core.ApprovalFailureReporter; +import org.approvaltests.reporters.*; +import org.teachingkidsprogramming.util.ClassUtils; + +import java.lang.annotation.Annotation; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class ReporterFactory { + private static HashMap> reporters = new HashMap<>(); + + public static class FileTypes { + public static final String Text = "txt"; + public static final String Html = "html"; + public static final String Excel = "csv"; + public static final String File = "file"; + public static final String Image = "png"; + private static final String Default = "default"; + } + + static { + setupReporters(); + } + + public static ApprovalFailureReporter get(String string) { + ApprovalFailureReporter returned = getFromAnnotation(); + returned = tryFor(returned, reporters.get(string)); + returned = tryFor(returned, reporters.get(FileTypes.Default)); + return returned; + } + + public static ApprovalFailureReporter getFromAnnotation() { + UseReporter reporter = getAnnotationFromStackTrace(UseReporter.class); + return reporter == null ? null : getReporter(reporter); + } + + private static ApprovalFailureReporter getReporter(UseReporter reporter) { + Class[] classes = reporter.value(); + List reporters = new ArrayList<>(); + for (Class clazz : classes) { + ApprovalFailureReporter instance = ClassUtils.create(clazz); + reporters.add(instance); + } + return reporters.size() == 1 ? reporters.get(0) : new MultiReporter(reporters); + } + + private static T getAnnotationFromStackTrace(Class annotationClass) { + StackTraceElement[] trace = Thread.currentThread().getStackTrace(); + for (StackTraceElement stack : trace) { + Method method = null; + Class clazz = null; + try { + String methodName = stack.getMethodName(); + clazz = Class.forName(stack.getClassName()); + method = clazz.getMethod(methodName, (Class[]) null); + } catch (Exception e) { + //ignore + } + T annotation = null; + if (method != null) { + annotation = method.getAnnotation(annotationClass); + } + if (annotation != null) { + return annotation; + } + annotation = clazz.getAnnotation(annotationClass); + if (annotation != null) { + return annotation; + } + } + return null; + } + + private static ApprovalFailureReporter tryFor(ApprovalFailureReporter returned, + Class trying) { + if (returned == null && trying != null) { + return ClassUtils.create(trying); + } + return returned; + } + + private static void setupReporters() { + reporters.put(FileTypes.Text, DiffReporter.class); + reporters.put(FileTypes.Html, DiffReporter.class); + reporters.put(FileTypes.Excel, FileLauncherReporter.class); + reporters.put(FileTypes.File, FileLauncherReporter.class); + reporters.put(FileTypes.Image, ImageReporter.class); + reporters.put(FileTypes.Default, QuietReporter.class); + } +} diff --git a/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.java b/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.java index 964206b..9c4f0db 100644 --- a/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.java +++ b/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.java @@ -11,7 +11,7 @@ import junit.framework.TestCase; -import org.approvaltests.Approvals; +import org.teachingkidsprogramming.approvals.lite.Approvals; import org.approvaltests.reporters.UseReporter; import org.approvaltests.reporters.windows.TortoiseTextDiffReporter; diff --git a/src/test/java/org/teachingextensions/logo/tests/RecipeTests.java b/src/test/java/org/teachingextensions/logo/tests/RecipeTests.java index 6212cd5..4d7a96c 100644 --- a/src/test/java/org/teachingextensions/logo/tests/RecipeTests.java +++ b/src/test/java/org/teachingextensions/logo/tests/RecipeTests.java @@ -5,7 +5,7 @@ import junit.framework.TestCase; -import org.approvaltests.Approvals; +import org.teachingkidsprogramming.approvals.lite.Approvals; import org.approvaltests.reporters.DelayedClipboardReporter; import org.approvaltests.reporters.FileLauncherReporter; import org.approvaltests.reporters.UseReporter; diff --git a/src/test/java/org/teachingextensions/logo/tests/TurtlePanelTest.java b/src/test/java/org/teachingextensions/logo/tests/TurtlePanelTest.java index a6f6f13..e3ee13b 100644 --- a/src/test/java/org/teachingextensions/logo/tests/TurtlePanelTest.java +++ b/src/test/java/org/teachingextensions/logo/tests/TurtlePanelTest.java @@ -2,7 +2,7 @@ import junit.framework.TestCase; -import org.approvaltests.Approvals; +import org.teachingkidsprogramming.approvals.lite.Approvals; import org.approvaltests.reporters.ClipboardReporter; import org.approvaltests.reporters.DiffReporter; import org.approvaltests.reporters.UseReporter; diff --git a/src/test/java/org/teachingextensions/logo/tests/TurtleTest.java b/src/test/java/org/teachingextensions/logo/tests/TurtleTest.java index e3c7f86..c7b4788 100644 --- a/src/test/java/org/teachingextensions/logo/tests/TurtleTest.java +++ b/src/test/java/org/teachingextensions/logo/tests/TurtleTest.java @@ -4,7 +4,7 @@ import junit.framework.TestCase; -import org.approvaltests.Approvals; +import org.teachingkidsprogramming.approvals.lite.Approvals; import org.approvaltests.reporters.DelayedClipboardReporter; import org.approvaltests.reporters.DiffReporter; import org.approvaltests.reporters.UseReporter; diff --git a/src/test/java/org/teachingextensions/logo/tests/WheelTest.java b/src/test/java/org/teachingextensions/logo/tests/WheelTest.java index 52f95bf..80cb6ae 100644 --- a/src/test/java/org/teachingextensions/logo/tests/WheelTest.java +++ b/src/test/java/org/teachingextensions/logo/tests/WheelTest.java @@ -2,7 +2,7 @@ import junit.framework.TestCase; -import org.approvaltests.Approvals; +import org.teachingkidsprogramming.approvals.lite.Approvals; import org.approvaltests.reporters.UseReporter; import org.approvaltests.reporters.windows.TortoiseTextDiffReporter; import org.teachingextensions.logo.Wheel; diff --git a/src/test/java/org/teachingextensions/simpleparser/tests/ParserTest.java b/src/test/java/org/teachingextensions/simpleparser/tests/ParserTest.java index aa7f027..cb86324 100644 --- a/src/test/java/org/teachingextensions/simpleparser/tests/ParserTest.java +++ b/src/test/java/org/teachingextensions/simpleparser/tests/ParserTest.java @@ -2,7 +2,7 @@ import junit.framework.TestCase; -import org.approvaltests.Approvals; +import org.teachingkidsprogramming.approvals.lite.Approvals; import org.approvaltests.reporters.DiffReporter; import org.approvaltests.reporters.UseReporter; import org.teachingextensions.simpleparser.Parser; From 403fa994b866d23681a11a8a2895dce395490e9b Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Tue, 17 Mar 2015 15:29:50 -0700 Subject: [PATCH 059/111] cleaned, moved approvers package --- .../approvers/ApprovalApprover.java | 11 ---- .../approvaltests/approvers/FileApprover.java | 63 ------------------- .../approvals/lite/ApprovalApprover.java | 13 ++++ .../approvals/lite/Approvals.java | 1 - .../approvals/lite/FileApprover.java | 62 ++++++++++++++++++ 5 files changed, 75 insertions(+), 75 deletions(-) delete mode 100644 src/main/java/org/approvaltests/approvers/ApprovalApprover.java delete mode 100644 src/main/java/org/approvaltests/approvers/FileApprover.java create mode 100644 src/main/java/org/teachingkidsprogramming/approvals/lite/ApprovalApprover.java create mode 100644 src/main/java/org/teachingkidsprogramming/approvals/lite/FileApprover.java diff --git a/src/main/java/org/approvaltests/approvers/ApprovalApprover.java b/src/main/java/org/approvaltests/approvers/ApprovalApprover.java deleted file mode 100644 index a0e39f1..0000000 --- a/src/main/java/org/approvaltests/approvers/ApprovalApprover.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.approvaltests.approvers; - -import org.approvaltests.core.ApprovalFailureReporter; - -public interface ApprovalApprover -{ - boolean approve() throws Exception; - public void cleanUpAfterSuccess(ApprovalFailureReporter reporter) throws Exception; - void fail(); - void reportFailure(ApprovalFailureReporter reporter) throws Exception; -} diff --git a/src/main/java/org/approvaltests/approvers/FileApprover.java b/src/main/java/org/approvaltests/approvers/FileApprover.java deleted file mode 100644 index 5677280..0000000 --- a/src/main/java/org/approvaltests/approvers/FileApprover.java +++ /dev/null @@ -1,63 +0,0 @@ -package org.approvaltests.approvers; - -import java.io.File; -import java.io.IOException; - -import junit.framework.TestCase; - -import org.approvaltests.core.ApprovalFailureOverrider; -import org.approvaltests.core.ApprovalFailureReporter; -import org.approvaltests.core.ApprovalReporterWithCleanUp; -import org.approvaltests.core.ApprovalWriter; -import org.approvaltests.namer.ApprovalNamer; -import org.approvaltests.namer.NamerFactory; - -import org.teachingkidsprogramming.util.ObjectUtils; -import org.teachingkidsprogramming.util.io.FileUtils; - -public class FileApprover implements ApprovalApprover -{ - private File received; - private File approved; - private final ApprovalWriter writter; - public FileApprover(ApprovalWriter writter, ApprovalNamer namer) - { - this.writter = writter; - String base = String.format("%s%s%s", namer.getSourceFilePath(), namer.getApprovalName(), - NamerFactory.getAndClearAdditionalInformation()); - received = new File(writter.getReceivedFilename(base)); - approved = new File(writter.getApprovalFilename(base)); - } - public boolean approve() throws Exception - { - received = new File(writter.writeReceivedFile(received.getAbsolutePath())); - return approveTextFile(received, approved); - } - public void cleanUpAfterSuccess(ApprovalFailureReporter reporter) throws Exception - { - received.delete(); - if (reporter instanceof ApprovalReporterWithCleanUp) - { - ((ApprovalReporterWithCleanUp) reporter).cleanUp(received.getAbsolutePath(), approved.getAbsolutePath()); - } - } - public void reportFailure(ApprovalFailureReporter reporter) throws Exception - { - reporter.report(received.getAbsolutePath(), approved.getAbsolutePath()); - } - public void fail() - { - TestCase.assertEquals("Failed Approval", approved.getAbsolutePath(), received.getAbsolutePath()); - } - public static boolean approveTextFile(File expected, File actual) throws IOException - { - if (!expected.exists() || !actual.exists()) { return false; } - String t1 = FileUtils.readFile(expected); - String t2 = FileUtils.readFile(actual); - return ObjectUtils.isEqual(t1, t2); - } - public boolean askToChangeReceivedToApproved(ApprovalFailureOverrider reporter) throws Exception - { - return reporter.askToChangeReceivedToApproved(received.getAbsolutePath(), approved.getAbsolutePath()); - } -} diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/ApprovalApprover.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/ApprovalApprover.java new file mode 100644 index 0000000..f823640 --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/approvals/lite/ApprovalApprover.java @@ -0,0 +1,13 @@ +package org.teachingkidsprogramming.approvals.lite; + +import org.approvaltests.core.ApprovalFailureReporter; + +public interface ApprovalApprover { + boolean approve() throws Exception; + + public void cleanUpAfterSuccess(ApprovalFailureReporter reporter) throws Exception; + + void fail(); + + void reportFailure(ApprovalFailureReporter reporter) throws Exception; +} diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/Approvals.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/Approvals.java index 670764e..303b2dc 100644 --- a/src/main/java/org/teachingkidsprogramming/approvals/lite/Approvals.java +++ b/src/main/java/org/teachingkidsprogramming/approvals/lite/Approvals.java @@ -1,7 +1,6 @@ package org.teachingkidsprogramming.approvals.lite; import org.teachingkidsprogramming.approvals.lite.ReporterFactory.FileTypes; -import org.approvaltests.approvers.FileApprover; import org.approvaltests.core.ApprovalFailureOverrider; import org.approvaltests.core.ApprovalFailureReporter; import org.approvaltests.core.ApprovalWriter; diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/FileApprover.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/FileApprover.java new file mode 100644 index 0000000..4ba176c --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/approvals/lite/FileApprover.java @@ -0,0 +1,62 @@ +package org.teachingkidsprogramming.approvals.lite; + +import junit.framework.TestCase; +import org.approvaltests.core.ApprovalFailureOverrider; +import org.approvaltests.core.ApprovalFailureReporter; +import org.approvaltests.core.ApprovalReporterWithCleanUp; +import org.approvaltests.core.ApprovalWriter; +import org.approvaltests.namer.ApprovalNamer; +import org.approvaltests.namer.NamerFactory; +import org.teachingkidsprogramming.approvals.lite.ApprovalApprover; +import org.teachingkidsprogramming.util.ObjectUtils; +import org.teachingkidsprogramming.util.io.FileUtils; + +import java.io.File; +import java.io.IOException; + +public class FileApprover implements ApprovalApprover { + private File received; + private File approved; + private final ApprovalWriter writter; + + public FileApprover(ApprovalWriter writter, ApprovalNamer namer) { + this.writter = writter; + String base = String.format("%s%s%s", namer.getSourceFilePath(), namer.getApprovalName(), + NamerFactory.getAndClearAdditionalInformation()); + received = new File(writter.getReceivedFilename(base)); + approved = new File(writter.getApprovalFilename(base)); + } + + public boolean approve() throws Exception { + received = new File(writter.writeReceivedFile(received.getAbsolutePath())); + return approveTextFile(received, approved); + } + + public void cleanUpAfterSuccess(ApprovalFailureReporter reporter) throws Exception { + received.delete(); + if (reporter instanceof ApprovalReporterWithCleanUp) { + ((ApprovalReporterWithCleanUp) reporter).cleanUp(received.getAbsolutePath(), approved.getAbsolutePath()); + } + } + + public void reportFailure(ApprovalFailureReporter reporter) throws Exception { + reporter.report(received.getAbsolutePath(), approved.getAbsolutePath()); + } + + public void fail() { + TestCase.assertEquals("Failed Approval", approved.getAbsolutePath(), received.getAbsolutePath()); + } + + public static boolean approveTextFile(File expected, File actual) throws IOException { + if (!expected.exists() || !actual.exists()) { + return false; + } + String t1 = FileUtils.readFile(expected); + String t2 = FileUtils.readFile(actual); + return ObjectUtils.isEqual(t1, t2); + } + + public boolean askToChangeReceivedToApproved(ApprovalFailureOverrider reporter) throws Exception { + return reporter.askToChangeReceivedToApproved(received.getAbsolutePath(), approved.getAbsolutePath()); + } +} From 44e3f6b99ee9efa9e8a6bb79899a2f2acd4b5063 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Tue, 17 Mar 2015 15:32:14 -0700 Subject: [PATCH 060/111] moved approvals core --- .../approvaltests/core/ApprovalFailureOverrider.java | 7 ------- .../approvaltests/core/ApprovalFailureReporter.java | 6 ------ .../core/ApprovalReporterWithCleanUp.java | 6 ------ .../java/org/approvaltests/core/ApprovalWriter.java | 9 --------- .../reporters/EnvironmentAwareReporter.java | 2 +- .../reporters/ExecutableQueryFailure.java | 4 ++-- .../approvaltests/reporters/FileLauncherReporter.java | 2 +- .../org/approvaltests/reporters/MultiReporter.java | 2 +- .../org/approvaltests/reporters/NotePadLancher.java | 2 +- .../org/approvaltests/reporters/TextWebReporter.java | 2 +- .../java/org/approvaltests/reporters/UseReporter.java | 2 +- .../writers/ApprovalBinaryFileWriter.java | 2 +- .../org/approvaltests/writers/ApprovalTextWriter.java | 2 +- .../approvaltests/writers/ComponentApprovalWriter.java | 2 +- .../writers/DirectoryToDirectoryWriter.java | 2 +- .../org/approvaltests/writers/FileApprovalWriter.java | 2 +- .../writers/FlyingSaucerHtmlToPdfWriter.java | 2 +- .../org/approvaltests/writers/ImageApprovalWriter.java | 2 +- .../approvals/lite/ApprovalApprover.java | 2 -- .../approvals/lite/ApprovalFailureOverrider.java | 6 ++++++ .../approvals/lite/ApprovalFailureReporter.java | 5 +++++ .../approvals/lite/ApprovalReporterWithCleanUp.java | 5 +++++ .../approvals/lite/ApprovalWriter.java | 10 ++++++++++ .../approvals/lite/Approvals.java | 3 --- .../approvals/lite/FileApprover.java | 5 ----- .../approvals/lite/ReporterFactory.java | 1 - 26 files changed, 41 insertions(+), 54 deletions(-) delete mode 100644 src/main/java/org/approvaltests/core/ApprovalFailureOverrider.java delete mode 100644 src/main/java/org/approvaltests/core/ApprovalFailureReporter.java delete mode 100644 src/main/java/org/approvaltests/core/ApprovalReporterWithCleanUp.java delete mode 100644 src/main/java/org/approvaltests/core/ApprovalWriter.java create mode 100644 src/main/java/org/teachingkidsprogramming/approvals/lite/ApprovalFailureOverrider.java create mode 100644 src/main/java/org/teachingkidsprogramming/approvals/lite/ApprovalFailureReporter.java create mode 100644 src/main/java/org/teachingkidsprogramming/approvals/lite/ApprovalReporterWithCleanUp.java create mode 100644 src/main/java/org/teachingkidsprogramming/approvals/lite/ApprovalWriter.java diff --git a/src/main/java/org/approvaltests/core/ApprovalFailureOverrider.java b/src/main/java/org/approvaltests/core/ApprovalFailureOverrider.java deleted file mode 100644 index 15a2338..0000000 --- a/src/main/java/org/approvaltests/core/ApprovalFailureOverrider.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.approvaltests.core; - - -public interface ApprovalFailureOverrider extends ApprovalFailureReporter -{ - public boolean askToChangeReceivedToApproved(String received, String approved) throws Exception; -} diff --git a/src/main/java/org/approvaltests/core/ApprovalFailureReporter.java b/src/main/java/org/approvaltests/core/ApprovalFailureReporter.java deleted file mode 100644 index e2c6c37..0000000 --- a/src/main/java/org/approvaltests/core/ApprovalFailureReporter.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.approvaltests.core; - -public interface ApprovalFailureReporter -{ - public void report(String received, String approved) throws Exception; -} diff --git a/src/main/java/org/approvaltests/core/ApprovalReporterWithCleanUp.java b/src/main/java/org/approvaltests/core/ApprovalReporterWithCleanUp.java deleted file mode 100644 index aba8c6f..0000000 --- a/src/main/java/org/approvaltests/core/ApprovalReporterWithCleanUp.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.approvaltests.core; - -public interface ApprovalReporterWithCleanUp -{ - public void cleanUp(String received, String approved) throws Exception; -} diff --git a/src/main/java/org/approvaltests/core/ApprovalWriter.java b/src/main/java/org/approvaltests/core/ApprovalWriter.java deleted file mode 100644 index 213a5f3..0000000 --- a/src/main/java/org/approvaltests/core/ApprovalWriter.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.approvaltests.core; - - -public interface ApprovalWriter -{ - public String writeReceivedFile(String received) throws Exception; - public String getReceivedFilename(String base); - public String getApprovalFilename(String base); -} diff --git a/src/main/java/org/approvaltests/reporters/EnvironmentAwareReporter.java b/src/main/java/org/approvaltests/reporters/EnvironmentAwareReporter.java index ff1327b..bc49c70 100644 --- a/src/main/java/org/approvaltests/reporters/EnvironmentAwareReporter.java +++ b/src/main/java/org/approvaltests/reporters/EnvironmentAwareReporter.java @@ -1,6 +1,6 @@ package org.approvaltests.reporters; -import org.approvaltests.core.ApprovalFailureReporter; +import org.teachingkidsprogramming.approvals.lite.ApprovalFailureReporter; public interface EnvironmentAwareReporter extends ApprovalFailureReporter { diff --git a/src/main/java/org/approvaltests/reporters/ExecutableQueryFailure.java b/src/main/java/org/approvaltests/reporters/ExecutableQueryFailure.java index 1b38c23..973ce2a 100644 --- a/src/main/java/org/approvaltests/reporters/ExecutableQueryFailure.java +++ b/src/main/java/org/approvaltests/reporters/ExecutableQueryFailure.java @@ -4,8 +4,8 @@ import java.io.IOException; import org.teachingkidsprogramming.approvals.lite.ReporterFactory; -import org.approvaltests.core.ApprovalFailureReporter; -import org.approvaltests.core.ApprovalReporterWithCleanUp; +import org.teachingkidsprogramming.approvals.lite.ApprovalFailureReporter; +import org.teachingkidsprogramming.approvals.lite.ApprovalReporterWithCleanUp; import org.teachingkidsprogramming.util.io.FileUtils; import org.teachingkidsprogramming.util.persistence.ExecutableQuery; diff --git a/src/main/java/org/approvaltests/reporters/FileLauncherReporter.java b/src/main/java/org/approvaltests/reporters/FileLauncherReporter.java index 8ef9afc..f79c23a 100644 --- a/src/main/java/org/approvaltests/reporters/FileLauncherReporter.java +++ b/src/main/java/org/approvaltests/reporters/FileLauncherReporter.java @@ -1,7 +1,7 @@ package org.approvaltests.reporters; -import org.approvaltests.core.ApprovalFailureReporter; +import org.teachingkidsprogramming.approvals.lite.ApprovalFailureReporter; import org.teachingkidsprogramming.util.TestUtils; import org.teachingkidsprogramming.util.io.FileUtils; diff --git a/src/main/java/org/approvaltests/reporters/MultiReporter.java b/src/main/java/org/approvaltests/reporters/MultiReporter.java index 3fe408a..573f466 100644 --- a/src/main/java/org/approvaltests/reporters/MultiReporter.java +++ b/src/main/java/org/approvaltests/reporters/MultiReporter.java @@ -4,7 +4,7 @@ import java.util.Arrays; import java.util.Collection; -import org.approvaltests.core.ApprovalFailureReporter; +import org.teachingkidsprogramming.approvals.lite.ApprovalFailureReporter; public class MultiReporter implements ApprovalFailureReporter { diff --git a/src/main/java/org/approvaltests/reporters/NotePadLancher.java b/src/main/java/org/approvaltests/reporters/NotePadLancher.java index 88fb9bb..787d5d9 100644 --- a/src/main/java/org/approvaltests/reporters/NotePadLancher.java +++ b/src/main/java/org/approvaltests/reporters/NotePadLancher.java @@ -1,6 +1,6 @@ package org.approvaltests.reporters; -import org.approvaltests.core.ApprovalFailureReporter; +import org.teachingkidsprogramming.approvals.lite.ApprovalFailureReporter; public class NotePadLancher implements ApprovalFailureReporter { diff --git a/src/main/java/org/approvaltests/reporters/TextWebReporter.java b/src/main/java/org/approvaltests/reporters/TextWebReporter.java index 8c6c221..27e7248 100644 --- a/src/main/java/org/approvaltests/reporters/TextWebReporter.java +++ b/src/main/java/org/approvaltests/reporters/TextWebReporter.java @@ -2,7 +2,7 @@ import java.io.File; -import org.approvaltests.core.ApprovalFailureReporter; +import org.teachingkidsprogramming.approvals.lite.ApprovalFailureReporter; import org.teachingkidsprogramming.util.TestUtils; import org.teachingkidsprogramming.util.io.FileUtils; diff --git a/src/main/java/org/approvaltests/reporters/UseReporter.java b/src/main/java/org/approvaltests/reporters/UseReporter.java index 5147c26..42b72e9 100644 --- a/src/main/java/org/approvaltests/reporters/UseReporter.java +++ b/src/main/java/org/approvaltests/reporters/UseReporter.java @@ -3,7 +3,7 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; -import org.approvaltests.core.ApprovalFailureReporter; +import org.teachingkidsprogramming.approvals.lite.ApprovalFailureReporter; @Retention(RetentionPolicy.RUNTIME) public @interface UseReporter { diff --git a/src/main/java/org/approvaltests/writers/ApprovalBinaryFileWriter.java b/src/main/java/org/approvaltests/writers/ApprovalBinaryFileWriter.java index 6e0a74e..7f7f9b1 100644 --- a/src/main/java/org/approvaltests/writers/ApprovalBinaryFileWriter.java +++ b/src/main/java/org/approvaltests/writers/ApprovalBinaryFileWriter.java @@ -5,7 +5,7 @@ import java.nio.channels.Channels; import java.nio.channels.ReadableByteChannel; -import org.approvaltests.core.ApprovalWriter; +import org.teachingkidsprogramming.approvals.lite.ApprovalWriter; import org.teachingkidsprogramming.util.io.FileUtils; diff --git a/src/main/java/org/approvaltests/writers/ApprovalTextWriter.java b/src/main/java/org/approvaltests/writers/ApprovalTextWriter.java index 117947b..564d381 100644 --- a/src/main/java/org/approvaltests/writers/ApprovalTextWriter.java +++ b/src/main/java/org/approvaltests/writers/ApprovalTextWriter.java @@ -2,7 +2,7 @@ import java.io.File; -import org.approvaltests.core.ApprovalWriter; +import org.teachingkidsprogramming.approvals.lite.ApprovalWriter; import org.teachingkidsprogramming.util.io.FileUtils; diff --git a/src/main/java/org/approvaltests/writers/ComponentApprovalWriter.java b/src/main/java/org/approvaltests/writers/ComponentApprovalWriter.java index 2a91bc2..5886e21 100644 --- a/src/main/java/org/approvaltests/writers/ComponentApprovalWriter.java +++ b/src/main/java/org/approvaltests/writers/ComponentApprovalWriter.java @@ -6,7 +6,7 @@ import javax.swing.JFrame; -import org.approvaltests.core.ApprovalWriter; +import org.teachingkidsprogramming.approvals.lite.ApprovalWriter; public class ComponentApprovalWriter implements ApprovalWriter { diff --git a/src/main/java/org/approvaltests/writers/DirectoryToDirectoryWriter.java b/src/main/java/org/approvaltests/writers/DirectoryToDirectoryWriter.java index 4a2af5c..43a0b63 100644 --- a/src/main/java/org/approvaltests/writers/DirectoryToDirectoryWriter.java +++ b/src/main/java/org/approvaltests/writers/DirectoryToDirectoryWriter.java @@ -2,7 +2,7 @@ import java.io.File; -import org.approvaltests.core.ApprovalWriter; +import org.teachingkidsprogramming.approvals.lite.ApprovalWriter; public class DirectoryToDirectoryWriter implements ApprovalWriter { diff --git a/src/main/java/org/approvaltests/writers/FileApprovalWriter.java b/src/main/java/org/approvaltests/writers/FileApprovalWriter.java index 0103d2a..2d5a006 100644 --- a/src/main/java/org/approvaltests/writers/FileApprovalWriter.java +++ b/src/main/java/org/approvaltests/writers/FileApprovalWriter.java @@ -2,7 +2,7 @@ import java.io.File; -import org.approvaltests.core.ApprovalWriter; +import org.teachingkidsprogramming.approvals.lite.ApprovalWriter; import org.teachingkidsprogramming.util.io.FileUtils; diff --git a/src/main/java/org/approvaltests/writers/FlyingSaucerHtmlToPdfWriter.java b/src/main/java/org/approvaltests/writers/FlyingSaucerHtmlToPdfWriter.java index ec1693c..43eb9a8 100644 --- a/src/main/java/org/approvaltests/writers/FlyingSaucerHtmlToPdfWriter.java +++ b/src/main/java/org/approvaltests/writers/FlyingSaucerHtmlToPdfWriter.java @@ -1,6 +1,6 @@ package org.approvaltests.writers; -import org.approvaltests.core.ApprovalWriter; +import org.teachingkidsprogramming.approvals.lite.ApprovalWriter; import org.teachingkidsprogramming.util.NotImplementedException; diff --git a/src/main/java/org/approvaltests/writers/ImageApprovalWriter.java b/src/main/java/org/approvaltests/writers/ImageApprovalWriter.java index 38354e1..685f301 100644 --- a/src/main/java/org/approvaltests/writers/ImageApprovalWriter.java +++ b/src/main/java/org/approvaltests/writers/ImageApprovalWriter.java @@ -5,7 +5,7 @@ import javax.imageio.ImageIO; -import org.approvaltests.core.ApprovalWriter; +import org.teachingkidsprogramming.approvals.lite.ApprovalWriter; public class ImageApprovalWriter implements ApprovalWriter { diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/ApprovalApprover.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/ApprovalApprover.java index f823640..29f4438 100644 --- a/src/main/java/org/teachingkidsprogramming/approvals/lite/ApprovalApprover.java +++ b/src/main/java/org/teachingkidsprogramming/approvals/lite/ApprovalApprover.java @@ -1,7 +1,5 @@ package org.teachingkidsprogramming.approvals.lite; -import org.approvaltests.core.ApprovalFailureReporter; - public interface ApprovalApprover { boolean approve() throws Exception; diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/ApprovalFailureOverrider.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/ApprovalFailureOverrider.java new file mode 100644 index 0000000..1a5f6d1 --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/approvals/lite/ApprovalFailureOverrider.java @@ -0,0 +1,6 @@ +package org.teachingkidsprogramming.approvals.lite; + + +public interface ApprovalFailureOverrider extends ApprovalFailureReporter { + public boolean askToChangeReceivedToApproved(String received, String approved) throws Exception; +} diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/ApprovalFailureReporter.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/ApprovalFailureReporter.java new file mode 100644 index 0000000..a15524e --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/approvals/lite/ApprovalFailureReporter.java @@ -0,0 +1,5 @@ +package org.teachingkidsprogramming.approvals.lite; + +public interface ApprovalFailureReporter { + public void report(String received, String approved) throws Exception; +} diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/ApprovalReporterWithCleanUp.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/ApprovalReporterWithCleanUp.java new file mode 100644 index 0000000..d7842b6 --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/approvals/lite/ApprovalReporterWithCleanUp.java @@ -0,0 +1,5 @@ +package org.teachingkidsprogramming.approvals.lite; + +public interface ApprovalReporterWithCleanUp { + public void cleanUp(String received, String approved) throws Exception; +} diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/ApprovalWriter.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/ApprovalWriter.java new file mode 100644 index 0000000..1035ffa --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/approvals/lite/ApprovalWriter.java @@ -0,0 +1,10 @@ +package org.teachingkidsprogramming.approvals.lite; + + +public interface ApprovalWriter { + public String writeReceivedFile(String received) throws Exception; + + public String getReceivedFilename(String base); + + public String getApprovalFilename(String base); +} diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/Approvals.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/Approvals.java index 303b2dc..d04219f 100644 --- a/src/main/java/org/teachingkidsprogramming/approvals/lite/Approvals.java +++ b/src/main/java/org/teachingkidsprogramming/approvals/lite/Approvals.java @@ -1,9 +1,6 @@ package org.teachingkidsprogramming.approvals.lite; import org.teachingkidsprogramming.approvals.lite.ReporterFactory.FileTypes; -import org.approvaltests.core.ApprovalFailureOverrider; -import org.approvaltests.core.ApprovalFailureReporter; -import org.approvaltests.core.ApprovalWriter; import org.approvaltests.namer.ApprovalNamer; import org.approvaltests.namer.JUnitStackTraceNamer; import org.approvaltests.writers.ApprovalTextWriter; diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/FileApprover.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/FileApprover.java index 4ba176c..a6c039f 100644 --- a/src/main/java/org/teachingkidsprogramming/approvals/lite/FileApprover.java +++ b/src/main/java/org/teachingkidsprogramming/approvals/lite/FileApprover.java @@ -1,13 +1,8 @@ package org.teachingkidsprogramming.approvals.lite; import junit.framework.TestCase; -import org.approvaltests.core.ApprovalFailureOverrider; -import org.approvaltests.core.ApprovalFailureReporter; -import org.approvaltests.core.ApprovalReporterWithCleanUp; -import org.approvaltests.core.ApprovalWriter; import org.approvaltests.namer.ApprovalNamer; import org.approvaltests.namer.NamerFactory; -import org.teachingkidsprogramming.approvals.lite.ApprovalApprover; import org.teachingkidsprogramming.util.ObjectUtils; import org.teachingkidsprogramming.util.io.FileUtils; diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/ReporterFactory.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/ReporterFactory.java index bdb6581..97bcef9 100644 --- a/src/main/java/org/teachingkidsprogramming/approvals/lite/ReporterFactory.java +++ b/src/main/java/org/teachingkidsprogramming/approvals/lite/ReporterFactory.java @@ -1,6 +1,5 @@ package org.teachingkidsprogramming.approvals.lite; -import org.approvaltests.core.ApprovalFailureReporter; import org.approvaltests.reporters.*; import org.teachingkidsprogramming.util.ClassUtils; From 3d9d7096b29a9e5a719aca494763a60f6dd319a0 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Tue, 17 Mar 2015 15:51:38 -0700 Subject: [PATCH 061/111] moved namers, reporters --- .../approvaltests/namer/ApprovalNamer.java | 7 -- .../approvaltests/namer/ApprovalResults.java | 15 ---- .../org/approvaltests/namer/IdeLabeller.java | 24 ------ .../namer/JUnitStackTraceNamer.java | 77 ------------------- .../namer/MultipleFilesLabeller.java | 17 ---- .../org/approvaltests/namer/NamerFactory.java | 20 ----- .../namer/OsEnvironmentLabeller.java | 12 --- .../reporters/ClipboardReporter.java | 47 ----------- .../reporters/ExecutableQueryFailure.java | 43 ----------- .../reporters/MultiReporter.java | 41 ---------- .../reporters/MultipleExceptions.java | 43 ----------- .../reporters/NotePadLancher.java | 16 ---- .../reporters/TextWebReporter.java | 21 ----- .../reporters/macosx/DiffMergeReporter.java | 2 +- .../macosx/KaleidoscopeDiffReporter.java | 2 +- .../reporters/macosx/MacDiffReporter.java | 2 +- .../reporters/macosx/P4MergeReporter.java | 2 +- .../reporters/macosx/TkDiffReporter.java | 2 +- .../windows/BeyondCompareReporter.java | 2 +- .../windows/TortoiseDiffReporter.java | 2 +- .../windows/TortoiseImageDiffReporter.java | 2 +- .../windows/TortoiseTextDiffReporter.java | 2 +- .../reporters/windows/WinMergeReporter.java | 2 +- .../windows/WindowsDiffReporter.java | 2 +- .../logo/utils/TortoiseUtils.java | 2 +- .../approvals/lite/Approvals.java | 4 +- .../approvals/lite/FileApprover.java | 4 +- .../approvals/lite/ReporterFactory.java | 2 +- .../approvals/lite/namer/ApprovalNamer.java | 7 ++ .../approvals/lite/namer/ApprovalResults.java | 10 +++ .../lite/namer/JUnitStackTraceNamer.java | 70 +++++++++++++++++ .../approvals/lite/namer/NamerFactory.java | 20 +++++ .../lite/namer/OsEnvironmentLabeller.java | 10 +++ .../lite/reporters/ClipboardReporter.java | 41 ++++++++++ .../reporters/DelayedClipboardReporter.java | 4 +- .../lite}/reporters/DiffReporter.java | 2 +- .../reporters/EnvironmentAwareReporter.java | 2 +- .../lite}/reporters/FileLauncherReporter.java | 2 +- .../lite}/reporters/FirstWorkingReporter.java | 2 +- .../lite}/reporters/GenericDiffReporter.java | 2 +- .../lite}/reporters/ImageReporter.java | 2 +- .../lite}/reporters/ImageWebReporter.java | 2 +- .../lite}/reporters/JunitReporter.java | 2 +- .../lite/reporters/MultiReporter.java | 31 ++++++++ .../lite/reporters/MultipleExceptions.java | 31 ++++++++ .../lite}/reporters/QuietReporter.java | 2 +- .../lite}/reporters/UseReporter.java | 8 +- .../logo/tests/ColorGeneration.java | 2 +- .../logo/tests/RecipeTests.java | 6 +- .../logo/tests/TortoiseTest.java | 6 +- .../logo/tests/TurtlePanelTest.java | 6 +- .../logo/tests/TurtleTest.java | 6 +- .../logo/tests/WheelTest.java | 2 +- .../simpleparser/tests/ParserTest.java | 4 +- .../windows/tests/GraphicsWindowTest.java | 6 +- .../recipes/quizzes/tests/AdLibsQuizTest.java | 6 +- .../recipes/quizzes/tests/HiLowQuizTest.java | 6 +- .../recipes/quizzes/tests/HousesQuizTest.java | 6 +- .../quizzes/tests/PentagonCrazyQuizTest.java | 6 +- .../recipes/quizzes/tests/QuizBuzzTest.java | 6 +- .../quizzes/tests/SimpleBubbleQuizTest.java | 6 +- .../quizzes/tests/SimpleSquareQuizTest.java | 6 +- .../quizzes/tests/SpiderWebQuizTest.java | 6 +- .../recipes/quizzes/tests/TreeQuizTest.java | 6 +- 64 files changed, 298 insertions(+), 461 deletions(-) delete mode 100644 src/main/java/org/approvaltests/namer/ApprovalNamer.java delete mode 100644 src/main/java/org/approvaltests/namer/ApprovalResults.java delete mode 100644 src/main/java/org/approvaltests/namer/IdeLabeller.java delete mode 100644 src/main/java/org/approvaltests/namer/JUnitStackTraceNamer.java delete mode 100644 src/main/java/org/approvaltests/namer/MultipleFilesLabeller.java delete mode 100644 src/main/java/org/approvaltests/namer/NamerFactory.java delete mode 100644 src/main/java/org/approvaltests/namer/OsEnvironmentLabeller.java delete mode 100644 src/main/java/org/approvaltests/reporters/ClipboardReporter.java delete mode 100644 src/main/java/org/approvaltests/reporters/ExecutableQueryFailure.java delete mode 100644 src/main/java/org/approvaltests/reporters/MultiReporter.java delete mode 100644 src/main/java/org/approvaltests/reporters/MultipleExceptions.java delete mode 100644 src/main/java/org/approvaltests/reporters/NotePadLancher.java delete mode 100644 src/main/java/org/approvaltests/reporters/TextWebReporter.java create mode 100644 src/main/java/org/teachingkidsprogramming/approvals/lite/namer/ApprovalNamer.java create mode 100644 src/main/java/org/teachingkidsprogramming/approvals/lite/namer/ApprovalResults.java create mode 100644 src/main/java/org/teachingkidsprogramming/approvals/lite/namer/JUnitStackTraceNamer.java create mode 100644 src/main/java/org/teachingkidsprogramming/approvals/lite/namer/NamerFactory.java create mode 100644 src/main/java/org/teachingkidsprogramming/approvals/lite/namer/OsEnvironmentLabeller.java create mode 100644 src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/ClipboardReporter.java rename src/main/java/org/{approvaltests => teachingkidsprogramming/approvals/lite}/reporters/DelayedClipboardReporter.java (88%) rename src/main/java/org/{approvaltests => teachingkidsprogramming/approvals/lite}/reporters/DiffReporter.java (86%) rename src/main/java/org/{approvaltests => teachingkidsprogramming/approvals/lite}/reporters/EnvironmentAwareReporter.java (77%) rename src/main/java/org/{approvaltests => teachingkidsprogramming/approvals/lite}/reporters/FileLauncherReporter.java (88%) rename src/main/java/org/{approvaltests => teachingkidsprogramming/approvals/lite}/reporters/FirstWorkingReporter.java (92%) rename src/main/java/org/{approvaltests => teachingkidsprogramming/approvals/lite}/reporters/GenericDiffReporter.java (98%) rename src/main/java/org/{approvaltests => teachingkidsprogramming/approvals/lite}/reporters/ImageReporter.java (88%) rename src/main/java/org/{approvaltests => teachingkidsprogramming/approvals/lite}/reporters/ImageWebReporter.java (94%) rename src/main/java/org/{approvaltests => teachingkidsprogramming/approvals/lite}/reporters/JunitReporter.java (93%) create mode 100644 src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/MultiReporter.java create mode 100644 src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/MultipleExceptions.java rename src/main/java/org/{approvaltests => teachingkidsprogramming/approvals/lite}/reporters/QuietReporter.java (86%) rename src/main/java/org/{approvaltests => teachingkidsprogramming/approvals/lite}/reporters/UseReporter.java (66%) diff --git a/src/main/java/org/approvaltests/namer/ApprovalNamer.java b/src/main/java/org/approvaltests/namer/ApprovalNamer.java deleted file mode 100644 index 7a77667..0000000 --- a/src/main/java/org/approvaltests/namer/ApprovalNamer.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.approvaltests.namer; - -public interface ApprovalNamer -{ - String getApprovalName(); - String getSourceFilePath(); -} diff --git a/src/main/java/org/approvaltests/namer/ApprovalResults.java b/src/main/java/org/approvaltests/namer/ApprovalResults.java deleted file mode 100644 index 0fd265e..0000000 --- a/src/main/java/org/approvaltests/namer/ApprovalResults.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.approvaltests.namer; - -public class ApprovalResults -{ - public static void UniqueForOs() - { - NamerFactory.asMachineSpecificTest(new OsEnvironmentLabeller()); - } - public MultipleFilesLabeller useMultipleFiles() - { - MultipleFilesLabeller l = new MultipleFilesLabeller(); - l.next(); - return l; - } -} diff --git a/src/main/java/org/approvaltests/namer/IdeLabeller.java b/src/main/java/org/approvaltests/namer/IdeLabeller.java deleted file mode 100644 index 7e9549a..0000000 --- a/src/main/java/org/approvaltests/namer/IdeLabeller.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.approvaltests.namer; - - -import org.lambda.functions.Function0; - -public class IdeLabeller implements Function0 -{ - @Override - public String call() - { - StackTraceElement[] stackTrace = new RuntimeException().getStackTrace(); - for (StackTraceElement stackTraceElement : stackTrace) { - String className = stackTraceElement.getClassName(); - if (className.contains("intellij")) { - return "intellij"; - } else if (className.contains("eclipse")) { - return "eclipse"; - } - } - return "unknown"; - } - - -} diff --git a/src/main/java/org/approvaltests/namer/JUnitStackTraceNamer.java b/src/main/java/org/approvaltests/namer/JUnitStackTraceNamer.java deleted file mode 100644 index 3d0ef81..0000000 --- a/src/main/java/org/approvaltests/namer/JUnitStackTraceNamer.java +++ /dev/null @@ -1,77 +0,0 @@ -package org.approvaltests.namer; - -import java.io.File; -import java.lang.reflect.Method; - -import junit.framework.TestCase; - -import org.junit.Test; - -import org.teachingkidsprogramming.util.ObjectUtils; -import org.teachingkidsprogramming.util.StackTraceReflectionResult; -import org.teachingkidsprogramming.util.TestUtils; -import org.teachingkidsprogramming.util.io.StackElementSelector; - -public class JUnitStackTraceNamer implements ApprovalNamer -{ - private StackTraceReflectionResult info; - public JUnitStackTraceNamer() - { - info = TestUtils.getCurrentFileForMethod(new JUnit3StackSelector()); - } - @Override - public String getApprovalName() - { - return String.format("%s.%s", info.getClassName(), info.getMethodName()); - } - @Override - public String getSourceFilePath() - { - return info.getSourceFile().getAbsolutePath() + File.separator; - } - /**************************************************************/ - /* INNER CLASSES */ - /**************************************************************/ - public static class JUnit3StackSelector implements StackElementSelector - { - @Override - public StackTraceElement selectElement(StackTraceElement[] trace) throws Exception - { - boolean inTestCase = false; - for (int i = 0; i < trace.length; i++) - { - if (isTestCase(trace[i])) - { - inTestCase = true; - } - else if (inTestCase) { return trace[i - 1]; } - } - throw new RuntimeException("Could not find Junit TestCase you are running"); - } - private boolean isTestCase(StackTraceElement element) throws ClassNotFoundException - { - String fullClassName = element.getClassName(); - Class clazz = Class.forName(fullClassName); - boolean junit3 = ObjectUtils.isThisInstanceOfThat(clazz, TestCase.class); - if (!junit3) - { - junit3 = isTestAttribute(clazz, element.getMethodName()); - } - return junit3; - } - private boolean isTestAttribute(Class clazz, String methodName) throws ClassNotFoundException, SecurityException - { - Method method; - try - { - method = clazz.getMethod(methodName); - } - catch (Throwable e) - { - return false; - } - - return method.isAnnotationPresent(Test.class); - } - } -} diff --git a/src/main/java/org/approvaltests/namer/MultipleFilesLabeller.java b/src/main/java/org/approvaltests/namer/MultipleFilesLabeller.java deleted file mode 100644 index 4e99ffc..0000000 --- a/src/main/java/org/approvaltests/namer/MultipleFilesLabeller.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.approvaltests.namer; - -import org.lambda.functions.Function0; - -public class MultipleFilesLabeller implements Function0 -{ - private int count = 1; - @Override - public String call() - { - return "" + (count++); - } - public void next() - { - NamerFactory.asMachineSpecificTest(this); - } -} \ No newline at end of file diff --git a/src/main/java/org/approvaltests/namer/NamerFactory.java b/src/main/java/org/approvaltests/namer/NamerFactory.java deleted file mode 100644 index a296bc2..0000000 --- a/src/main/java/org/approvaltests/namer/NamerFactory.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.approvaltests.namer; - -import org.lambda.functions.Function0; - -public class NamerFactory -{ - private static String additionalInformation; - public static String getAndClearAdditionalInformation() - { - if (additionalInformation == null) { return ""; } - String out = "." + additionalInformation; - additionalInformation = null; - return out; - } - public static void asMachineSpecificTest(Function0 environmentLabeller) - { - additionalInformation = environmentLabeller.call(); - } - public static ApprovalResults ApprovalResults = new ApprovalResults(); -} diff --git a/src/main/java/org/approvaltests/namer/OsEnvironmentLabeller.java b/src/main/java/org/approvaltests/namer/OsEnvironmentLabeller.java deleted file mode 100644 index df46f80..0000000 --- a/src/main/java/org/approvaltests/namer/OsEnvironmentLabeller.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.approvaltests.namer; - -import org.lambda.functions.Function0; - -public class OsEnvironmentLabeller implements Function0 -{ - @Override - public String call() - { - return System.getProperty("os.name").replace(' ', '_'); - } -} diff --git a/src/main/java/org/approvaltests/reporters/ClipboardReporter.java b/src/main/java/org/approvaltests/reporters/ClipboardReporter.java deleted file mode 100644 index 0f3911e..0000000 --- a/src/main/java/org/approvaltests/reporters/ClipboardReporter.java +++ /dev/null @@ -1,47 +0,0 @@ -package org.approvaltests.reporters; - -import java.awt.GraphicsEnvironment; -import java.io.File; - -import org.teachingkidsprogramming.util.SystemUtils; -import org.teachingkidsprogramming.util.WindowUtils; - -/** - * A reporter which creates the command to accept the received - * file as the approve file and copies it to the clipboard:
- * move received.txt approved.txt - */ -public class ClipboardReporter implements EnvironmentAwareReporter -{ - @Override - public void report(String received, String approved) throws Exception - { - WindowUtils.copyToClipBoard(getCommandLine(received, approved), false); - } - public static String getCommandLine(String received, String approved) - { - File r = new File(received); - File a = new File(approved); - String commandLine = ClipboardReporter.getAcceptApprovalText(r.getAbsolutePath(), a.getAbsolutePath()); - return commandLine; - } - /** - * The clipboard will not be available in a headless environment. - */ - @Override - public boolean isWorkingInThisEnvironment(String forFile) - { - return !GraphicsEnvironment.isHeadless(); - } - public static String getAcceptApprovalText(String received, String approved) - { - if (SystemUtils.isWindowsEnvironment()) - { - return String.format("move /Y \"%s\" \"%s\"", received, approved); - } - else - { - return String.format("mv %s %s", received, approved); - } - } -} diff --git a/src/main/java/org/approvaltests/reporters/ExecutableQueryFailure.java b/src/main/java/org/approvaltests/reporters/ExecutableQueryFailure.java deleted file mode 100644 index 973ce2a..0000000 --- a/src/main/java/org/approvaltests/reporters/ExecutableQueryFailure.java +++ /dev/null @@ -1,43 +0,0 @@ -package org.approvaltests.reporters; - -import java.io.File; -import java.io.IOException; - -import org.teachingkidsprogramming.approvals.lite.ReporterFactory; -import org.teachingkidsprogramming.approvals.lite.ApprovalFailureReporter; -import org.teachingkidsprogramming.approvals.lite.ApprovalReporterWithCleanUp; - -import org.teachingkidsprogramming.util.io.FileUtils; -import org.teachingkidsprogramming.util.persistence.ExecutableQuery; - -public class ExecutableQueryFailure implements ApprovalFailureReporter, ApprovalReporterWithCleanUp -{ - private static final String FILE_ADDITION = ".queryresults.txt"; - private final ExecutableQuery query; - public ExecutableQueryFailure(ExecutableQuery query) - { - this.query = query; - } - public void report(String received, String approved) throws Exception - { - ApprovalFailureReporter reporter = ReporterFactory.get(ReporterFactory.FileTypes.Text); - reporter.report(runQueryAndGetPath(received), runQueryAndGetPath(approved)); - reporter.report(received, approved); - } - private String runQueryAndGetPath(String filename) throws IOException, Exception - { - if (!new File(filename).exists()) { return filename; } - String newQuery = FileUtils.readFile(filename).trim(); - String newResult = query.executeQuery(newQuery); - File newFile = new File(filename + FILE_ADDITION); - String header = "\t\tDo NOT approve\r\n\t\tThis File will be Deleted\r\n\t\tit is for feedback purposes only\r\n"; - FileUtils.writeFile(newFile, String.format("%squery:\n%s\n\nresult:\n%s", header, newQuery, newResult)); - return newFile.getAbsolutePath(); - } - @Override - public void cleanUp(String received, String approved) throws Exception - { - new File(received + FILE_ADDITION).delete(); - new File(approved + FILE_ADDITION).delete(); - } -} diff --git a/src/main/java/org/approvaltests/reporters/MultiReporter.java b/src/main/java/org/approvaltests/reporters/MultiReporter.java deleted file mode 100644 index 573f466..0000000 --- a/src/main/java/org/approvaltests/reporters/MultiReporter.java +++ /dev/null @@ -1,41 +0,0 @@ -package org.approvaltests.reporters; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; - -import org.teachingkidsprogramming.approvals.lite.ApprovalFailureReporter; - -public class MultiReporter implements ApprovalFailureReporter -{ - private final Collection reporters; - public MultiReporter(Collection reporters) - { - this.reporters = reporters; - } - public MultiReporter(ApprovalFailureReporter... reporters) - { - this.reporters = Arrays.asList(reporters); - } - @Override - public void report(String received, String approved) throws Exception - { - ArrayList exceptions = new ArrayList(); - for (ApprovalFailureReporter reporter : reporters) - { - try - { - reporter.report(received, approved); - } - catch (Throwable t) - { - exceptions.add(t); - } - } - MultipleExceptions.rethrowExceptions(exceptions); - } - public ApprovalFailureReporter[] getReporters() - { - return reporters.toArray(new ApprovalFailureReporter[0]); - } -} diff --git a/src/main/java/org/approvaltests/reporters/MultipleExceptions.java b/src/main/java/org/approvaltests/reporters/MultipleExceptions.java deleted file mode 100644 index fab8281..0000000 --- a/src/main/java/org/approvaltests/reporters/MultipleExceptions.java +++ /dev/null @@ -1,43 +0,0 @@ -package org.approvaltests.reporters; - -import java.util.ArrayList; - -public class MultipleExceptions extends RuntimeException -{ - private ArrayList exceptions; - public MultipleExceptions(ArrayList exceptions) - { - super(getText(exceptions), exceptions.get(0)); - this.exceptions = exceptions; - } - public Throwable[] getExceptions() - { - return exceptions.toArray(new Throwable[0]); - } - public static void rethrowExceptions(ArrayList exceptions) throws Exception - { - if (exceptions.size() == 0) - { - return; - } - else if (exceptions.size() == 0) - { - Throwable t = exceptions.get(0); - if (t instanceof Exception) { throw ((Exception) t); } - throw (Error) t; - } - else - { - throw new MultipleExceptions(exceptions); - } - } - private static String getText(ArrayList exceptions) - { - StringBuffer b = new StringBuffer("Multiple Exceptions Thrown:"); - for (int i = 0; i < exceptions.size(); i++) - { - b.append(String.format("\n #%s): %s", i + 1, exceptions.get(i).getMessage())); - } - return b.toString(); - } -} diff --git a/src/main/java/org/approvaltests/reporters/NotePadLancher.java b/src/main/java/org/approvaltests/reporters/NotePadLancher.java deleted file mode 100644 index 787d5d9..0000000 --- a/src/main/java/org/approvaltests/reporters/NotePadLancher.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.approvaltests.reporters; - -import org.teachingkidsprogramming.approvals.lite.ApprovalFailureReporter; - -public class NotePadLancher implements ApprovalFailureReporter -{ - @Override - public void report(String received, String approved) throws Exception - { - { - String text = "\"C:\\Program Files\\Notepad++\\notepad++.exe\" \"%s\""; - text = String.format(text, received); - Runtime.getRuntime().exec(text); - } - } -} diff --git a/src/main/java/org/approvaltests/reporters/TextWebReporter.java b/src/main/java/org/approvaltests/reporters/TextWebReporter.java deleted file mode 100644 index 27e7248..0000000 --- a/src/main/java/org/approvaltests/reporters/TextWebReporter.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.approvaltests.reporters; - -import java.io.File; - -import org.teachingkidsprogramming.approvals.lite.ApprovalFailureReporter; - -import org.teachingkidsprogramming.util.TestUtils; -import org.teachingkidsprogramming.util.io.FileUtils; - -public class TextWebReporter implements ApprovalFailureReporter -{ - @Override - public void report(String received, String approved) throws Exception - { - String text = "
%s
%s
approvedreceived
to approve : copy clipboard to command window
"; - String aText = new File(approved).exists() ? FileUtils.readFile(approved) : ""; - String rText = FileUtils.readFile(received); - text = String.format(text, aText.replace("<", "<"), rText.replace("<", "<")); - TestUtils.displayHtml(text); - } -} diff --git a/src/main/java/org/approvaltests/reporters/macosx/DiffMergeReporter.java b/src/main/java/org/approvaltests/reporters/macosx/DiffMergeReporter.java index 99b64ad..b82a0da 100644 --- a/src/main/java/org/approvaltests/reporters/macosx/DiffMergeReporter.java +++ b/src/main/java/org/approvaltests/reporters/macosx/DiffMergeReporter.java @@ -2,7 +2,7 @@ import java.text.MessageFormat; -import org.approvaltests.reporters.GenericDiffReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.GenericDiffReporter; public class DiffMergeReporter extends GenericDiffReporter { diff --git a/src/main/java/org/approvaltests/reporters/macosx/KaleidoscopeDiffReporter.java b/src/main/java/org/approvaltests/reporters/macosx/KaleidoscopeDiffReporter.java index 0b7d6d7..c180b4d 100644 --- a/src/main/java/org/approvaltests/reporters/macosx/KaleidoscopeDiffReporter.java +++ b/src/main/java/org/approvaltests/reporters/macosx/KaleidoscopeDiffReporter.java @@ -3,7 +3,7 @@ import java.text.MessageFormat; import java.util.List; -import org.approvaltests.reporters.GenericDiffReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.GenericDiffReporter; import org.teachingkidsprogramming.util.ArrayUtils; diff --git a/src/main/java/org/approvaltests/reporters/macosx/MacDiffReporter.java b/src/main/java/org/approvaltests/reporters/macosx/MacDiffReporter.java index 58894e0..aa2e994 100644 --- a/src/main/java/org/approvaltests/reporters/macosx/MacDiffReporter.java +++ b/src/main/java/org/approvaltests/reporters/macosx/MacDiffReporter.java @@ -1,6 +1,6 @@ package org.approvaltests.reporters.macosx; -import org.approvaltests.reporters.FirstWorkingReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.FirstWorkingReporter; public class MacDiffReporter extends FirstWorkingReporter { diff --git a/src/main/java/org/approvaltests/reporters/macosx/P4MergeReporter.java b/src/main/java/org/approvaltests/reporters/macosx/P4MergeReporter.java index 6f8ea1d..a449b3a 100644 --- a/src/main/java/org/approvaltests/reporters/macosx/P4MergeReporter.java +++ b/src/main/java/org/approvaltests/reporters/macosx/P4MergeReporter.java @@ -3,7 +3,7 @@ import java.text.MessageFormat; import java.util.List; -import org.approvaltests.reporters.GenericDiffReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.GenericDiffReporter; import org.teachingkidsprogramming.util.ArrayUtils; diff --git a/src/main/java/org/approvaltests/reporters/macosx/TkDiffReporter.java b/src/main/java/org/approvaltests/reporters/macosx/TkDiffReporter.java index e489346..aef0797 100644 --- a/src/main/java/org/approvaltests/reporters/macosx/TkDiffReporter.java +++ b/src/main/java/org/approvaltests/reporters/macosx/TkDiffReporter.java @@ -2,7 +2,7 @@ import java.text.MessageFormat; -import org.approvaltests.reporters.GenericDiffReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.GenericDiffReporter; public class TkDiffReporter extends GenericDiffReporter { diff --git a/src/main/java/org/approvaltests/reporters/windows/BeyondCompareReporter.java b/src/main/java/org/approvaltests/reporters/windows/BeyondCompareReporter.java index cc43003..8ec37bd 100644 --- a/src/main/java/org/approvaltests/reporters/windows/BeyondCompareReporter.java +++ b/src/main/java/org/approvaltests/reporters/windows/BeyondCompareReporter.java @@ -2,7 +2,7 @@ import java.text.MessageFormat; -import org.approvaltests.reporters.GenericDiffReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.GenericDiffReporter; public class BeyondCompareReporter extends GenericDiffReporter { diff --git a/src/main/java/org/approvaltests/reporters/windows/TortoiseDiffReporter.java b/src/main/java/org/approvaltests/reporters/windows/TortoiseDiffReporter.java index e5b38bd..6f0d8a1 100644 --- a/src/main/java/org/approvaltests/reporters/windows/TortoiseDiffReporter.java +++ b/src/main/java/org/approvaltests/reporters/windows/TortoiseDiffReporter.java @@ -1,6 +1,6 @@ package org.approvaltests.reporters.windows; -import org.approvaltests.reporters.FirstWorkingReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.FirstWorkingReporter; public class TortoiseDiffReporter extends FirstWorkingReporter { diff --git a/src/main/java/org/approvaltests/reporters/windows/TortoiseImageDiffReporter.java b/src/main/java/org/approvaltests/reporters/windows/TortoiseImageDiffReporter.java index cb35b99..2f0846b 100644 --- a/src/main/java/org/approvaltests/reporters/windows/TortoiseImageDiffReporter.java +++ b/src/main/java/org/approvaltests/reporters/windows/TortoiseImageDiffReporter.java @@ -1,6 +1,6 @@ package org.approvaltests.reporters.windows; -import org.approvaltests.reporters.GenericDiffReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.GenericDiffReporter; public class TortoiseImageDiffReporter extends GenericDiffReporter { diff --git a/src/main/java/org/approvaltests/reporters/windows/TortoiseTextDiffReporter.java b/src/main/java/org/approvaltests/reporters/windows/TortoiseTextDiffReporter.java index 99e0c65..3f2f3d7 100644 --- a/src/main/java/org/approvaltests/reporters/windows/TortoiseTextDiffReporter.java +++ b/src/main/java/org/approvaltests/reporters/windows/TortoiseTextDiffReporter.java @@ -2,7 +2,7 @@ import java.text.MessageFormat; -import org.approvaltests.reporters.GenericDiffReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.GenericDiffReporter; public class TortoiseTextDiffReporter extends GenericDiffReporter { diff --git a/src/main/java/org/approvaltests/reporters/windows/WinMergeReporter.java b/src/main/java/org/approvaltests/reporters/windows/WinMergeReporter.java index 0d01192..3eb6340 100644 --- a/src/main/java/org/approvaltests/reporters/windows/WinMergeReporter.java +++ b/src/main/java/org/approvaltests/reporters/windows/WinMergeReporter.java @@ -2,7 +2,7 @@ import java.text.MessageFormat; -import org.approvaltests.reporters.GenericDiffReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.GenericDiffReporter; public class WinMergeReporter extends GenericDiffReporter { diff --git a/src/main/java/org/approvaltests/reporters/windows/WindowsDiffReporter.java b/src/main/java/org/approvaltests/reporters/windows/WindowsDiffReporter.java index 5c9a4a6..6103ac6 100644 --- a/src/main/java/org/approvaltests/reporters/windows/WindowsDiffReporter.java +++ b/src/main/java/org/approvaltests/reporters/windows/WindowsDiffReporter.java @@ -1,6 +1,6 @@ package org.approvaltests.reporters.windows; -import org.approvaltests.reporters.FirstWorkingReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.FirstWorkingReporter; public class WindowsDiffReporter extends FirstWorkingReporter { diff --git a/src/main/java/org/teachingextensions/logo/utils/TortoiseUtils.java b/src/main/java/org/teachingextensions/logo/utils/TortoiseUtils.java index 22aa223..086d0c4 100644 --- a/src/main/java/org/teachingextensions/logo/utils/TortoiseUtils.java +++ b/src/main/java/org/teachingextensions/logo/utils/TortoiseUtils.java @@ -1,7 +1,7 @@ package org.teachingextensions.logo.utils; import org.teachingkidsprogramming.approvals.lite.Approvals; -import org.approvaltests.namer.ApprovalResults; +import org.teachingkidsprogramming.approvals.lite.namer.ApprovalResults; import org.teachingextensions.logo.Turtle; import org.teachingkidsprogramming.util.ObjectUtils; diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/Approvals.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/Approvals.java index d04219f..8185b40 100644 --- a/src/main/java/org/teachingkidsprogramming/approvals/lite/Approvals.java +++ b/src/main/java/org/teachingkidsprogramming/approvals/lite/Approvals.java @@ -1,8 +1,8 @@ package org.teachingkidsprogramming.approvals.lite; import org.teachingkidsprogramming.approvals.lite.ReporterFactory.FileTypes; -import org.approvaltests.namer.ApprovalNamer; -import org.approvaltests.namer.JUnitStackTraceNamer; +import org.teachingkidsprogramming.approvals.lite.namer.ApprovalNamer; +import org.teachingkidsprogramming.approvals.lite.namer.JUnitStackTraceNamer; import org.approvaltests.writers.ApprovalTextWriter; import org.approvaltests.writers.ImageApprovalWriter; import org.lambda.functions.Function1; diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/FileApprover.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/FileApprover.java index a6c039f..ce57ac7 100644 --- a/src/main/java/org/teachingkidsprogramming/approvals/lite/FileApprover.java +++ b/src/main/java/org/teachingkidsprogramming/approvals/lite/FileApprover.java @@ -1,8 +1,8 @@ package org.teachingkidsprogramming.approvals.lite; import junit.framework.TestCase; -import org.approvaltests.namer.ApprovalNamer; -import org.approvaltests.namer.NamerFactory; +import org.teachingkidsprogramming.approvals.lite.namer.ApprovalNamer; +import org.teachingkidsprogramming.approvals.lite.namer.NamerFactory; import org.teachingkidsprogramming.util.ObjectUtils; import org.teachingkidsprogramming.util.io.FileUtils; diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/ReporterFactory.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/ReporterFactory.java index 97bcef9..2f62120 100644 --- a/src/main/java/org/teachingkidsprogramming/approvals/lite/ReporterFactory.java +++ b/src/main/java/org/teachingkidsprogramming/approvals/lite/ReporterFactory.java @@ -1,6 +1,6 @@ package org.teachingkidsprogramming.approvals.lite; -import org.approvaltests.reporters.*; +import org.teachingkidsprogramming.approvals.lite.reporters.*; import org.teachingkidsprogramming.util.ClassUtils; import java.lang.annotation.Annotation; diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/namer/ApprovalNamer.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/namer/ApprovalNamer.java new file mode 100644 index 0000000..999a0dc --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/approvals/lite/namer/ApprovalNamer.java @@ -0,0 +1,7 @@ +package org.teachingkidsprogramming.approvals.lite.namer; + +public interface ApprovalNamer { + String getApprovalName(); + + String getSourceFilePath(); +} diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/namer/ApprovalResults.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/namer/ApprovalResults.java new file mode 100644 index 0000000..f216bc5 --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/approvals/lite/namer/ApprovalResults.java @@ -0,0 +1,10 @@ +package org.teachingkidsprogramming.approvals.lite.namer; + +import org.teachingkidsprogramming.approvals.lite.namer.NamerFactory; +import org.teachingkidsprogramming.approvals.lite.namer.OsEnvironmentLabeller; + +public class ApprovalResults { + public static void UniqueForOs() { + NamerFactory.asMachineSpecificTest(new OsEnvironmentLabeller()); + } +} diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/namer/JUnitStackTraceNamer.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/namer/JUnitStackTraceNamer.java new file mode 100644 index 0000000..77608be --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/approvals/lite/namer/JUnitStackTraceNamer.java @@ -0,0 +1,70 @@ +package org.teachingkidsprogramming.approvals.lite.namer; + +import junit.framework.TestCase; +import org.junit.Test; +import org.teachingkidsprogramming.util.ObjectUtils; +import org.teachingkidsprogramming.util.StackTraceReflectionResult; +import org.teachingkidsprogramming.util.TestUtils; +import org.teachingkidsprogramming.util.io.StackElementSelector; + +import java.io.File; +import java.lang.reflect.Method; + +public class JUnitStackTraceNamer implements ApprovalNamer { + private StackTraceReflectionResult info; + + public JUnitStackTraceNamer() { + info = TestUtils.getCurrentFileForMethod(new JUnit3StackSelector()); + } + + @Override + public String getApprovalName() { + return String.format("%s.%s", info.getClassName(), info.getMethodName()); + } + + @Override + public String getSourceFilePath() { + return info.getSourceFile().getAbsolutePath() + File.separator; + } + /**************************************************************/ + /* INNER CLASSES */ + + /** + * ********************************************************** + */ + public static class JUnit3StackSelector implements StackElementSelector { + @Override + public StackTraceElement selectElement(StackTraceElement[] trace) throws Exception { + boolean inTestCase = false; + for (int i = 0; i < trace.length; i++) { + if (isTestCase(trace[i])) { + inTestCase = true; + } else if (inTestCase) { + return trace[i - 1]; + } + } + throw new RuntimeException("Could not find Junit TestCase you are running"); + } + + private boolean isTestCase(StackTraceElement element) throws ClassNotFoundException { + String fullClassName = element.getClassName(); + Class clazz = Class.forName(fullClassName); + boolean junit3 = ObjectUtils.isThisInstanceOfThat(clazz, TestCase.class); + if (!junit3) { + junit3 = isTestAttribute(clazz, element.getMethodName()); + } + return junit3; + } + + private boolean isTestAttribute(Class clazz, String methodName) throws ClassNotFoundException, SecurityException { + Method method; + try { + method = clazz.getMethod(methodName); + } catch (Throwable e) { + return false; + } + + return method.isAnnotationPresent(Test.class); + } + } +} diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/namer/NamerFactory.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/namer/NamerFactory.java new file mode 100644 index 0000000..ae1f3aa --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/approvals/lite/namer/NamerFactory.java @@ -0,0 +1,20 @@ +package org.teachingkidsprogramming.approvals.lite.namer; + +import org.lambda.functions.Function0; + +public class NamerFactory { + private static String additionalInformation; + + public static String getAndClearAdditionalInformation() { + if (additionalInformation == null) { + return ""; + } + String out = "." + additionalInformation; + additionalInformation = null; + return out; + } + + public static void asMachineSpecificTest(Function0 environmentLabeller) { + additionalInformation = environmentLabeller.call(); + } +} diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/namer/OsEnvironmentLabeller.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/namer/OsEnvironmentLabeller.java new file mode 100644 index 0000000..bc6be58 --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/approvals/lite/namer/OsEnvironmentLabeller.java @@ -0,0 +1,10 @@ +package org.teachingkidsprogramming.approvals.lite.namer; + +import org.lambda.functions.Function0; + +public class OsEnvironmentLabeller implements Function0 { + @Override + public String call() { + return System.getProperty("os.name").replace(' ', '_'); + } +} diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/ClipboardReporter.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/ClipboardReporter.java new file mode 100644 index 0000000..e354520 --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/ClipboardReporter.java @@ -0,0 +1,41 @@ +package org.teachingkidsprogramming.approvals.lite.reporters; + +import org.teachingkidsprogramming.util.SystemUtils; +import org.teachingkidsprogramming.util.WindowUtils; + +import java.awt.*; +import java.io.File; + +/** + * A reporter which creates the command to accept the received + * file as the approve file and copies it to the clipboard:
+ * move received.txt approved.txt + */ +public class ClipboardReporter implements EnvironmentAwareReporter { + @Override + public void report(String received, String approved) throws Exception { + WindowUtils.copyToClipBoard(getCommandLine(received, approved), false); + } + + public static String getCommandLine(String received, String approved) { + File r = new File(received); + File a = new File(approved); + return ClipboardReporter.getAcceptApprovalText(r.getAbsolutePath(), a.getAbsolutePath()); + } + + /** + * The clipboard will not be available in a headless environment. + */ + @Override + public boolean isWorkingInThisEnvironment(String forFile) { + return !GraphicsEnvironment.isHeadless(); + } + + public static String getAcceptApprovalText(String received, String approved) { + if (SystemUtils.isWindowsEnvironment()) { + return String.format("move /Y \"%s\" \"%s\"", received, approved); + } else { + return String.format("mv %s %s", received, approved); + } + } +} diff --git a/src/main/java/org/approvaltests/reporters/DelayedClipboardReporter.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/DelayedClipboardReporter.java similarity index 88% rename from src/main/java/org/approvaltests/reporters/DelayedClipboardReporter.java rename to src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/DelayedClipboardReporter.java index d333c18..87d121c 100644 --- a/src/main/java/org/approvaltests/reporters/DelayedClipboardReporter.java +++ b/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/DelayedClipboardReporter.java @@ -1,4 +1,4 @@ -package org.approvaltests.reporters; +package org.teachingkidsprogramming.approvals.lite.reporters; import java.awt.GraphicsEnvironment; @@ -17,7 +17,7 @@ public class DelayedClipboardReporter implements EnvironmentAwareReporter public void report(String received, String approved) throws Exception { String commandLine = ClipboardReporter.getCommandLine(received, approved); - text.append(commandLine + StringUtils.NEW_LINE); + text.append(commandLine).append(StringUtils.NEW_LINE); WindowUtils.copyToClipBoard(text.toString(), false); } /** diff --git a/src/main/java/org/approvaltests/reporters/DiffReporter.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/DiffReporter.java similarity index 86% rename from src/main/java/org/approvaltests/reporters/DiffReporter.java rename to src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/DiffReporter.java index eaf94eb..c424c68 100644 --- a/src/main/java/org/approvaltests/reporters/DiffReporter.java +++ b/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/DiffReporter.java @@ -1,4 +1,4 @@ -package org.approvaltests.reporters; +package org.teachingkidsprogramming.approvals.lite.reporters; import org.approvaltests.reporters.macosx.MacDiffReporter; import org.approvaltests.reporters.windows.WindowsDiffReporter; diff --git a/src/main/java/org/approvaltests/reporters/EnvironmentAwareReporter.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/EnvironmentAwareReporter.java similarity index 77% rename from src/main/java/org/approvaltests/reporters/EnvironmentAwareReporter.java rename to src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/EnvironmentAwareReporter.java index bc49c70..4579d51 100644 --- a/src/main/java/org/approvaltests/reporters/EnvironmentAwareReporter.java +++ b/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/EnvironmentAwareReporter.java @@ -1,4 +1,4 @@ -package org.approvaltests.reporters; +package org.teachingkidsprogramming.approvals.lite.reporters; import org.teachingkidsprogramming.approvals.lite.ApprovalFailureReporter; diff --git a/src/main/java/org/approvaltests/reporters/FileLauncherReporter.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/FileLauncherReporter.java similarity index 88% rename from src/main/java/org/approvaltests/reporters/FileLauncherReporter.java rename to src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/FileLauncherReporter.java index f79c23a..3325852 100644 --- a/src/main/java/org/approvaltests/reporters/FileLauncherReporter.java +++ b/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/FileLauncherReporter.java @@ -1,4 +1,4 @@ -package org.approvaltests.reporters; +package org.teachingkidsprogramming.approvals.lite.reporters; import org.teachingkidsprogramming.approvals.lite.ApprovalFailureReporter; diff --git a/src/main/java/org/approvaltests/reporters/FirstWorkingReporter.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/FirstWorkingReporter.java similarity index 92% rename from src/main/java/org/approvaltests/reporters/FirstWorkingReporter.java rename to src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/FirstWorkingReporter.java index 879f526..ba1e2a9 100644 --- a/src/main/java/org/approvaltests/reporters/FirstWorkingReporter.java +++ b/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/FirstWorkingReporter.java @@ -1,4 +1,4 @@ -package org.approvaltests.reporters; +package org.teachingkidsprogramming.approvals.lite.reporters; public class FirstWorkingReporter implements EnvironmentAwareReporter { diff --git a/src/main/java/org/approvaltests/reporters/GenericDiffReporter.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/GenericDiffReporter.java similarity index 98% rename from src/main/java/org/approvaltests/reporters/GenericDiffReporter.java rename to src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/GenericDiffReporter.java index b36b2e4..9ea7b62 100644 --- a/src/main/java/org/approvaltests/reporters/GenericDiffReporter.java +++ b/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/GenericDiffReporter.java @@ -1,4 +1,4 @@ -package org.approvaltests.reporters; +package org.teachingkidsprogramming.approvals.lite.reporters; import java.io.File; import java.io.IOException; diff --git a/src/main/java/org/approvaltests/reporters/ImageReporter.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/ImageReporter.java similarity index 88% rename from src/main/java/org/approvaltests/reporters/ImageReporter.java rename to src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/ImageReporter.java index 2a5ea66..479a7ad 100644 --- a/src/main/java/org/approvaltests/reporters/ImageReporter.java +++ b/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/ImageReporter.java @@ -1,4 +1,4 @@ -package org.approvaltests.reporters; +package org.teachingkidsprogramming.approvals.lite.reporters; import org.approvaltests.reporters.macosx.KaleidoscopeDiffReporter; import org.approvaltests.reporters.windows.BeyondCompareReporter; diff --git a/src/main/java/org/approvaltests/reporters/ImageWebReporter.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/ImageWebReporter.java similarity index 94% rename from src/main/java/org/approvaltests/reporters/ImageWebReporter.java rename to src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/ImageWebReporter.java index a4e425f..e78f130 100644 --- a/src/main/java/org/approvaltests/reporters/ImageWebReporter.java +++ b/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/ImageWebReporter.java @@ -1,4 +1,4 @@ -package org.approvaltests.reporters; +package org.teachingkidsprogramming.approvals.lite.reporters; import java.awt.GraphicsEnvironment; diff --git a/src/main/java/org/approvaltests/reporters/JunitReporter.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/JunitReporter.java similarity index 93% rename from src/main/java/org/approvaltests/reporters/JunitReporter.java rename to src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/JunitReporter.java index c36912c..961eef4 100644 --- a/src/main/java/org/approvaltests/reporters/JunitReporter.java +++ b/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/JunitReporter.java @@ -1,4 +1,4 @@ -package org.approvaltests.reporters; +package org.teachingkidsprogramming.approvals.lite.reporters; import java.io.File; diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/MultiReporter.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/MultiReporter.java new file mode 100644 index 0000000..f39ee5c --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/MultiReporter.java @@ -0,0 +1,31 @@ +package org.teachingkidsprogramming.approvals.lite.reporters; + +import org.teachingkidsprogramming.approvals.lite.ApprovalFailureReporter; + +import java.util.ArrayList; +import java.util.Collection; + +public class MultiReporter implements ApprovalFailureReporter { + private final Collection reporters; + + public MultiReporter(Collection reporters) { + this.reporters = reporters; + } + + @Override + public void report(String received, String approved) throws Exception { + ArrayList exceptions = new ArrayList<>(); + for (ApprovalFailureReporter reporter : reporters) { + try { + reporter.report(received, approved); + } catch (Throwable t) { + exceptions.add(t); + } + } + MultipleExceptions.rethrowExceptions(exceptions); + } + + public ApprovalFailureReporter[] getReporters() { + return reporters.toArray(new ApprovalFailureReporter[0]); + } +} diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/MultipleExceptions.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/MultipleExceptions.java new file mode 100644 index 0000000..c279a2e --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/MultipleExceptions.java @@ -0,0 +1,31 @@ +package org.teachingkidsprogramming.approvals.lite.reporters; + +import java.util.ArrayList; + +public class MultipleExceptions extends RuntimeException { + public MultipleExceptions(ArrayList exceptions) { + super(getText(exceptions), exceptions.get(0)); + } + + public static void rethrowExceptions(ArrayList exceptions) throws Exception { + if (exceptions.size() != 0) { + if (exceptions.size() == 0) { + Throwable t = exceptions.get(0); + if (t instanceof Exception) { + throw ((Exception) t); + } + throw (Error) t; + } else { + throw new MultipleExceptions(exceptions); + } + } + } + + private static String getText(ArrayList exceptions) { + StringBuilder b = new StringBuilder("Multiple Exceptions Thrown:"); + for (int i = 0; i < exceptions.size(); i++) { + b.append(String.format("\n #%s): %s", i + 1, exceptions.get(i).getMessage())); + } + return b.toString(); + } +} diff --git a/src/main/java/org/approvaltests/reporters/QuietReporter.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/QuietReporter.java similarity index 86% rename from src/main/java/org/approvaltests/reporters/QuietReporter.java rename to src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/QuietReporter.java index 7ff61c8..bdbab8c 100644 --- a/src/main/java/org/approvaltests/reporters/QuietReporter.java +++ b/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/QuietReporter.java @@ -1,4 +1,4 @@ -package org.approvaltests.reporters; +package org.teachingkidsprogramming.approvals.lite.reporters; public class QuietReporter implements EnvironmentAwareReporter { diff --git a/src/main/java/org/approvaltests/reporters/UseReporter.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/UseReporter.java similarity index 66% rename from src/main/java/org/approvaltests/reporters/UseReporter.java rename to src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/UseReporter.java index 42b72e9..56c56b8 100644 --- a/src/main/java/org/approvaltests/reporters/UseReporter.java +++ b/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/UseReporter.java @@ -1,11 +1,11 @@ -package org.approvaltests.reporters; +package org.teachingkidsprogramming.approvals.lite.reporters; + +import org.teachingkidsprogramming.approvals.lite.ApprovalFailureReporter; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; -import org.teachingkidsprogramming.approvals.lite.ApprovalFailureReporter; - @Retention(RetentionPolicy.RUNTIME) public @interface UseReporter { - Class[] value(); + Class[] value(); } diff --git a/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.java b/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.java index 9c4f0db..685236b 100644 --- a/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.java +++ b/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.java @@ -12,7 +12,7 @@ import junit.framework.TestCase; import org.teachingkidsprogramming.approvals.lite.Approvals; -import org.approvaltests.reporters.UseReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.UseReporter; import org.approvaltests.reporters.windows.TortoiseTextDiffReporter; import org.teachingkidsprogramming.util.StringUtils; diff --git a/src/test/java/org/teachingextensions/logo/tests/RecipeTests.java b/src/test/java/org/teachingextensions/logo/tests/RecipeTests.java index 4d7a96c..5da84a0 100644 --- a/src/test/java/org/teachingextensions/logo/tests/RecipeTests.java +++ b/src/test/java/org/teachingextensions/logo/tests/RecipeTests.java @@ -6,9 +6,9 @@ import junit.framework.TestCase; import org.teachingkidsprogramming.approvals.lite.Approvals; -import org.approvaltests.reporters.DelayedClipboardReporter; -import org.approvaltests.reporters.FileLauncherReporter; -import org.approvaltests.reporters.UseReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.DelayedClipboardReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.FileLauncherReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.UseReporter; import org.teachingextensions.logo.PenColors; import org.teachingextensions.logo.Turtle; import org.teachingextensions.logo.Wheel; diff --git a/src/test/java/org/teachingextensions/logo/tests/TortoiseTest.java b/src/test/java/org/teachingextensions/logo/tests/TortoiseTest.java index af6f10a..e7c6fd0 100644 --- a/src/test/java/org/teachingextensions/logo/tests/TortoiseTest.java +++ b/src/test/java/org/teachingextensions/logo/tests/TortoiseTest.java @@ -2,9 +2,9 @@ import junit.framework.TestCase; -import org.approvaltests.reporters.ClipboardReporter; -import org.approvaltests.reporters.DiffReporter; -import org.approvaltests.reporters.UseReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.ClipboardReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.DiffReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.UseReporter; import org.teachingextensions.logo.PenColors; import org.teachingextensions.logo.Tortoise; import org.teachingextensions.logo.Turtle; diff --git a/src/test/java/org/teachingextensions/logo/tests/TurtlePanelTest.java b/src/test/java/org/teachingextensions/logo/tests/TurtlePanelTest.java index e3ee13b..cc0008e 100644 --- a/src/test/java/org/teachingextensions/logo/tests/TurtlePanelTest.java +++ b/src/test/java/org/teachingextensions/logo/tests/TurtlePanelTest.java @@ -3,9 +3,9 @@ import junit.framework.TestCase; import org.teachingkidsprogramming.approvals.lite.Approvals; -import org.approvaltests.reporters.ClipboardReporter; -import org.approvaltests.reporters.DiffReporter; -import org.approvaltests.reporters.UseReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.ClipboardReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.DiffReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.UseReporter; import org.teachingextensions.logo.Turtle; @UseReporter({ClipboardReporter.class, DiffReporter.class}) diff --git a/src/test/java/org/teachingextensions/logo/tests/TurtleTest.java b/src/test/java/org/teachingextensions/logo/tests/TurtleTest.java index c7b4788..39d14ce 100644 --- a/src/test/java/org/teachingextensions/logo/tests/TurtleTest.java +++ b/src/test/java/org/teachingextensions/logo/tests/TurtleTest.java @@ -5,9 +5,9 @@ import junit.framework.TestCase; import org.teachingkidsprogramming.approvals.lite.Approvals; -import org.approvaltests.reporters.DelayedClipboardReporter; -import org.approvaltests.reporters.DiffReporter; -import org.approvaltests.reporters.UseReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.DelayedClipboardReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.DiffReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.UseReporter; import org.lambda.functions.Function1; import org.teachingextensions.logo.PenColors; import org.teachingextensions.logo.Turtle; diff --git a/src/test/java/org/teachingextensions/logo/tests/WheelTest.java b/src/test/java/org/teachingextensions/logo/tests/WheelTest.java index 80cb6ae..8680c2c 100644 --- a/src/test/java/org/teachingextensions/logo/tests/WheelTest.java +++ b/src/test/java/org/teachingextensions/logo/tests/WheelTest.java @@ -3,7 +3,7 @@ import junit.framework.TestCase; import org.teachingkidsprogramming.approvals.lite.Approvals; -import org.approvaltests.reporters.UseReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.UseReporter; import org.approvaltests.reporters.windows.TortoiseTextDiffReporter; import org.teachingextensions.logo.Wheel; diff --git a/src/test/java/org/teachingextensions/simpleparser/tests/ParserTest.java b/src/test/java/org/teachingextensions/simpleparser/tests/ParserTest.java index cb86324..e79a5e2 100644 --- a/src/test/java/org/teachingextensions/simpleparser/tests/ParserTest.java +++ b/src/test/java/org/teachingextensions/simpleparser/tests/ParserTest.java @@ -3,8 +3,8 @@ import junit.framework.TestCase; import org.teachingkidsprogramming.approvals.lite.Approvals; -import org.approvaltests.reporters.DiffReporter; -import org.approvaltests.reporters.UseReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.DiffReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.UseReporter; import org.teachingextensions.simpleparser.Parser; @UseReporter(DiffReporter.class) diff --git a/src/test/java/org/teachingextensions/windows/tests/GraphicsWindowTest.java b/src/test/java/org/teachingextensions/windows/tests/GraphicsWindowTest.java index 7da3922..4b74e2b 100644 --- a/src/test/java/org/teachingextensions/windows/tests/GraphicsWindowTest.java +++ b/src/test/java/org/teachingextensions/windows/tests/GraphicsWindowTest.java @@ -2,9 +2,9 @@ import junit.framework.TestCase; -import org.approvaltests.reporters.DelayedClipboardReporter; -import org.approvaltests.reporters.FileLauncherReporter; -import org.approvaltests.reporters.UseReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.DelayedClipboardReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.FileLauncherReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.UseReporter; @UseReporter({FileLauncherReporter.class, DelayedClipboardReporter.class}) public class GraphicsWindowTest extends TestCase diff --git a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/AdLibsQuizTest.java b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/AdLibsQuizTest.java index f0d2e0f..805fa27 100644 --- a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/AdLibsQuizTest.java +++ b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/AdLibsQuizTest.java @@ -2,9 +2,9 @@ import junit.framework.TestCase; -import org.approvaltests.reporters.DelayedClipboardReporter; -import org.approvaltests.reporters.FileLauncherReporter; -import org.approvaltests.reporters.UseReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.DelayedClipboardReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.FileLauncherReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.UseReporter; import org.teachingextensions.logo.Turtle; import org.teachingextensions.logo.utils.TortoiseUtils; import org.teachingextensions.simpleparser.Parser; diff --git a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/HiLowQuizTest.java b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/HiLowQuizTest.java index 1d5feda..e9b5f4e 100644 --- a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/HiLowQuizTest.java +++ b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/HiLowQuizTest.java @@ -2,9 +2,9 @@ import junit.framework.TestCase; -import org.approvaltests.reporters.DelayedClipboardReporter; -import org.approvaltests.reporters.DiffReporter; -import org.approvaltests.reporters.UseReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.DelayedClipboardReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.DiffReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.UseReporter; import org.teachingextensions.logo.Tortoise; import org.teachingextensions.logo.Turtle; import org.teachingextensions.logo.utils.TortoiseUtils; diff --git a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/HousesQuizTest.java b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/HousesQuizTest.java index 8b11e5b..8bfde36 100644 --- a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/HousesQuizTest.java +++ b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/HousesQuizTest.java @@ -2,9 +2,9 @@ import junit.framework.TestCase; -import org.approvaltests.reporters.DelayedClipboardReporter; -import org.approvaltests.reporters.FileLauncherReporter; -import org.approvaltests.reporters.UseReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.DelayedClipboardReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.FileLauncherReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.UseReporter; import org.teachingextensions.logo.Tortoise; import org.teachingextensions.logo.Turtle; import org.teachingextensions.logo.utils.TortoiseUtils; diff --git a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/PentagonCrazyQuizTest.java b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/PentagonCrazyQuizTest.java index 4009da1..5b6750c 100644 --- a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/PentagonCrazyQuizTest.java +++ b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/PentagonCrazyQuizTest.java @@ -2,9 +2,9 @@ import junit.framework.TestCase; -import org.approvaltests.reporters.DelayedClipboardReporter; -import org.approvaltests.reporters.FileLauncherReporter; -import org.approvaltests.reporters.UseReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.DelayedClipboardReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.FileLauncherReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.UseReporter; import org.teachingextensions.logo.ColorWheel; import org.teachingextensions.logo.PenColors; import org.teachingextensions.logo.Tortoise; diff --git a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/QuizBuzzTest.java b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/QuizBuzzTest.java index 5fd7a60..2abdb9d 100644 --- a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/QuizBuzzTest.java +++ b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/QuizBuzzTest.java @@ -2,9 +2,9 @@ import junit.framework.TestCase; -import org.approvaltests.reporters.DelayedClipboardReporter; -import org.approvaltests.reporters.FileLauncherReporter; -import org.approvaltests.reporters.UseReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.DelayedClipboardReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.FileLauncherReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.UseReporter; import org.teachingextensions.logo.Turtle; import org.teachingextensions.logo.utils.TortoiseUtils; import org.teachingextensions.simpleparser.Parser; diff --git a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleBubbleQuizTest.java b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleBubbleQuizTest.java index 47b6696..e4f934d 100644 --- a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleBubbleQuizTest.java +++ b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleBubbleQuizTest.java @@ -2,9 +2,9 @@ import junit.framework.TestCase; -import org.approvaltests.reporters.DelayedClipboardReporter; -import org.approvaltests.reporters.FileLauncherReporter; -import org.approvaltests.reporters.UseReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.DelayedClipboardReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.FileLauncherReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.UseReporter; import org.teachingextensions.logo.Turtle; import org.teachingextensions.logo.utils.TortoiseUtils; import org.teachingextensions.simpleparser.Parser; diff --git a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleSquareQuizTest.java b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleSquareQuizTest.java index 3a9b79c..cdc4337 100644 --- a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleSquareQuizTest.java +++ b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleSquareQuizTest.java @@ -2,9 +2,9 @@ import junit.framework.TestCase; -import org.approvaltests.reporters.ClipboardReporter; -import org.approvaltests.reporters.DiffReporter; -import org.approvaltests.reporters.UseReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.ClipboardReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.DiffReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.UseReporter; import org.teachingextensions.logo.PenColors; import org.teachingextensions.logo.Tortoise; import org.teachingextensions.logo.Turtle; diff --git a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SpiderWebQuizTest.java b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SpiderWebQuizTest.java index cc6fbe4..7b0012c 100644 --- a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SpiderWebQuizTest.java +++ b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SpiderWebQuizTest.java @@ -2,9 +2,9 @@ import junit.framework.TestCase; -import org.approvaltests.reporters.DelayedClipboardReporter; -import org.approvaltests.reporters.FileLauncherReporter; -import org.approvaltests.reporters.UseReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.DelayedClipboardReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.FileLauncherReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.UseReporter; import org.teachingextensions.logo.Tortoise; import org.teachingextensions.logo.Turtle; import org.teachingextensions.logo.utils.TortoiseUtils; diff --git a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/TreeQuizTest.java b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/TreeQuizTest.java index dc5611b..fd38438 100644 --- a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/TreeQuizTest.java +++ b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/TreeQuizTest.java @@ -2,9 +2,9 @@ import junit.framework.TestCase; -import org.approvaltests.reporters.DelayedClipboardReporter; -import org.approvaltests.reporters.DiffReporter; -import org.approvaltests.reporters.UseReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.DelayedClipboardReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.DiffReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.UseReporter; import org.teachingextensions.logo.Turtle; import org.teachingextensions.logo.utils.TortoiseUtils; import org.teachingkidsprogramming.recipes.quizzes.graders.TreeQuizAdapter; From 201013fedd070984cff44431a1eeb2362035a3af Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Tue, 17 Mar 2015 15:55:21 -0700 Subject: [PATCH 062/111] moved mac reporters --- .../macosx/KaleidoscopeDiffReporter.java | 24 ------------------- .../lite/reporters/DiffReporter.java | 2 +- .../lite/reporters/ImageReporter.java | 2 +- .../reporters/macosx/DiffMergeReporter.java | 2 +- .../macosx/KaleidoscopeDiffReporter.java | 22 +++++++++++++++++ .../reporters/macosx/MacDiffReporter.java | 2 +- .../reporters/macosx/P4MergeReporter.java | 2 +- .../reporters/macosx/TkDiffReporter.java | 2 +- 8 files changed, 28 insertions(+), 30 deletions(-) delete mode 100644 src/main/java/org/approvaltests/reporters/macosx/KaleidoscopeDiffReporter.java rename src/main/java/org/{approvaltests => teachingkidsprogramming/approvals/lite}/reporters/macosx/DiffMergeReporter.java (91%) create mode 100644 src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/macosx/KaleidoscopeDiffReporter.java rename src/main/java/org/{approvaltests => teachingkidsprogramming/approvals/lite}/reporters/macosx/MacDiffReporter.java (84%) rename src/main/java/org/{approvaltests => teachingkidsprogramming/approvals/lite}/reporters/macosx/P4MergeReporter.java (94%) rename src/main/java/org/{approvaltests => teachingkidsprogramming/approvals/lite}/reporters/macosx/TkDiffReporter.java (90%) diff --git a/src/main/java/org/approvaltests/reporters/macosx/KaleidoscopeDiffReporter.java b/src/main/java/org/approvaltests/reporters/macosx/KaleidoscopeDiffReporter.java deleted file mode 100644 index c180b4d..0000000 --- a/src/main/java/org/approvaltests/reporters/macosx/KaleidoscopeDiffReporter.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.approvaltests.reporters.macosx; - -import java.text.MessageFormat; -import java.util.List; - -import org.teachingkidsprogramming.approvals.lite.reporters.GenericDiffReporter; - -import org.teachingkidsprogramming.util.ArrayUtils; - -public class KaleidoscopeDiffReporter extends GenericDiffReporter -{ - private static final String DIFF_PROGRAM = "/Applications/Kaleidoscope.app/Contents/MacOS/ksdiff"; - static final String MESSAGE = MessageFormat - .format("Unable to find Kaleidoscope at {0}", - DIFF_PROGRAM); - private static List fileTypes = ArrayUtils.combine( - GenericDiffReporter.IMAGE_FILE_EXTENSIONS, - GenericDiffReporter.TEXT_FILE_EXTENSIONS); - public static final KaleidoscopeDiffReporter INSTANCE = new KaleidoscopeDiffReporter(); - public KaleidoscopeDiffReporter() - { - super(DIFF_PROGRAM, GenericDiffReporter.STANDARD_ARGUMENTS, MESSAGE, fileTypes); - } -} diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/DiffReporter.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/DiffReporter.java index c424c68..88a7d65 100644 --- a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/DiffReporter.java +++ b/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/DiffReporter.java @@ -1,6 +1,6 @@ package org.teachingkidsprogramming.approvals.lite.reporters; -import org.approvaltests.reporters.macosx.MacDiffReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.macosx.MacDiffReporter; import org.approvaltests.reporters.windows.WindowsDiffReporter; public class DiffReporter extends FirstWorkingReporter diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/ImageReporter.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/ImageReporter.java index 479a7ad..d44deaf 100644 --- a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/ImageReporter.java +++ b/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/ImageReporter.java @@ -1,6 +1,6 @@ package org.teachingkidsprogramming.approvals.lite.reporters; -import org.approvaltests.reporters.macosx.KaleidoscopeDiffReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.macosx.KaleidoscopeDiffReporter; import org.approvaltests.reporters.windows.BeyondCompareReporter; import org.approvaltests.reporters.windows.TortoiseImageDiffReporter; diff --git a/src/main/java/org/approvaltests/reporters/macosx/DiffMergeReporter.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/macosx/DiffMergeReporter.java similarity index 91% rename from src/main/java/org/approvaltests/reporters/macosx/DiffMergeReporter.java rename to src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/macosx/DiffMergeReporter.java index b82a0da..a0b8524 100644 --- a/src/main/java/org/approvaltests/reporters/macosx/DiffMergeReporter.java +++ b/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/macosx/DiffMergeReporter.java @@ -1,4 +1,4 @@ -package org.approvaltests.reporters.macosx; +package org.teachingkidsprogramming.approvals.lite.reporters.macosx; import java.text.MessageFormat; diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/macosx/KaleidoscopeDiffReporter.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/macosx/KaleidoscopeDiffReporter.java new file mode 100644 index 0000000..d0dc34f --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/macosx/KaleidoscopeDiffReporter.java @@ -0,0 +1,22 @@ +package org.teachingkidsprogramming.approvals.lite.reporters.macosx; + +import org.teachingkidsprogramming.approvals.lite.reporters.GenericDiffReporter; +import org.teachingkidsprogramming.util.ArrayUtils; + +import java.text.MessageFormat; +import java.util.List; + +public class KaleidoscopeDiffReporter extends GenericDiffReporter { + private static final String DIFF_PROGRAM = "/Applications/Kaleidoscope.app/Contents/MacOS/ksdiff"; + static final String MESSAGE = MessageFormat + .format("Unable to find Kaleidoscope at {0}", + DIFF_PROGRAM); + private static List fileTypes = ArrayUtils.combine( + GenericDiffReporter.IMAGE_FILE_EXTENSIONS, + GenericDiffReporter.TEXT_FILE_EXTENSIONS); + public static final KaleidoscopeDiffReporter INSTANCE = new KaleidoscopeDiffReporter(); + + public KaleidoscopeDiffReporter() { + super(DIFF_PROGRAM, GenericDiffReporter.STANDARD_ARGUMENTS, MESSAGE, fileTypes); + } +} diff --git a/src/main/java/org/approvaltests/reporters/macosx/MacDiffReporter.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/macosx/MacDiffReporter.java similarity index 84% rename from src/main/java/org/approvaltests/reporters/macosx/MacDiffReporter.java rename to src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/macosx/MacDiffReporter.java index aa2e994..4748231 100644 --- a/src/main/java/org/approvaltests/reporters/macosx/MacDiffReporter.java +++ b/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/macosx/MacDiffReporter.java @@ -1,4 +1,4 @@ -package org.approvaltests.reporters.macosx; +package org.teachingkidsprogramming.approvals.lite.reporters.macosx; import org.teachingkidsprogramming.approvals.lite.reporters.FirstWorkingReporter; diff --git a/src/main/java/org/approvaltests/reporters/macosx/P4MergeReporter.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/macosx/P4MergeReporter.java similarity index 94% rename from src/main/java/org/approvaltests/reporters/macosx/P4MergeReporter.java rename to src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/macosx/P4MergeReporter.java index a449b3a..4992561 100644 --- a/src/main/java/org/approvaltests/reporters/macosx/P4MergeReporter.java +++ b/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/macosx/P4MergeReporter.java @@ -1,4 +1,4 @@ -package org.approvaltests.reporters.macosx; +package org.teachingkidsprogramming.approvals.lite.reporters.macosx; import java.text.MessageFormat; import java.util.List; diff --git a/src/main/java/org/approvaltests/reporters/macosx/TkDiffReporter.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/macosx/TkDiffReporter.java similarity index 90% rename from src/main/java/org/approvaltests/reporters/macosx/TkDiffReporter.java rename to src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/macosx/TkDiffReporter.java index aef0797..a7c8c29 100644 --- a/src/main/java/org/approvaltests/reporters/macosx/TkDiffReporter.java +++ b/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/macosx/TkDiffReporter.java @@ -1,4 +1,4 @@ -package org.approvaltests.reporters.macosx; +package org.teachingkidsprogramming.approvals.lite.reporters.macosx; import java.text.MessageFormat; From a6ef1134598c112106af2a0918d159315fb707b7 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Tue, 17 Mar 2015 16:01:42 -0700 Subject: [PATCH 063/111] moved windows reporters --- .../windows/TortoiseImageDiffReporter.java | 13 ------------ .../windows/TortoiseTextDiffReporter.java | 21 ------------------- .../reporters/windows/WinMergeReporter.java | 18 ---------------- .../lite/reporters/DiffReporter.java | 2 +- .../lite/reporters/ImageReporter.java | 4 ++-- .../windows/BeyondCompareReporter.java | 2 +- .../windows/TortoiseDiffReporter.java | 2 +- .../windows/TortoiseImageDiffReporter.java | 12 +++++++++++ .../windows/TortoiseTextDiffReporter.java | 20 ++++++++++++++++++ .../reporters/windows/WinMergeReporter.java | 18 ++++++++++++++++ .../windows/WindowsDiffReporter.java | 2 +- .../logo/tests/ColorGeneration.java | 2 +- .../logo/tests/WheelTest.java | 2 +- 13 files changed, 58 insertions(+), 60 deletions(-) delete mode 100644 src/main/java/org/approvaltests/reporters/windows/TortoiseImageDiffReporter.java delete mode 100644 src/main/java/org/approvaltests/reporters/windows/TortoiseTextDiffReporter.java delete mode 100644 src/main/java/org/approvaltests/reporters/windows/WinMergeReporter.java rename src/main/java/org/{approvaltests => teachingkidsprogramming/approvals/lite}/reporters/windows/BeyondCompareReporter.java (90%) rename src/main/java/org/{approvaltests => teachingkidsprogramming/approvals/lite}/reporters/windows/TortoiseDiffReporter.java (83%) create mode 100644 src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/windows/TortoiseImageDiffReporter.java create mode 100644 src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/windows/TortoiseTextDiffReporter.java create mode 100644 src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/windows/WinMergeReporter.java rename src/main/java/org/{approvaltests => teachingkidsprogramming/approvals/lite}/reporters/windows/WindowsDiffReporter.java (84%) diff --git a/src/main/java/org/approvaltests/reporters/windows/TortoiseImageDiffReporter.java b/src/main/java/org/approvaltests/reporters/windows/TortoiseImageDiffReporter.java deleted file mode 100644 index 2f0846b..0000000 --- a/src/main/java/org/approvaltests/reporters/windows/TortoiseImageDiffReporter.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.approvaltests.reporters.windows; - -import org.teachingkidsprogramming.approvals.lite.reporters.GenericDiffReporter; - -public class TortoiseImageDiffReporter extends GenericDiffReporter -{ - public static final TortoiseImageDiffReporter INSTANCE = new TortoiseImageDiffReporter(); - public TortoiseImageDiffReporter() - { - super("C:\\Program Files\\TortoiseSVN\\bin\\TortoiseIDiff.exe", "/left:%s /right:%s", - TortoiseTextDiffReporter.MESSAGE, GenericDiffReporter.IMAGE_FILE_EXTENSIONS); - } -} diff --git a/src/main/java/org/approvaltests/reporters/windows/TortoiseTextDiffReporter.java b/src/main/java/org/approvaltests/reporters/windows/TortoiseTextDiffReporter.java deleted file mode 100644 index 3f2f3d7..0000000 --- a/src/main/java/org/approvaltests/reporters/windows/TortoiseTextDiffReporter.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.approvaltests.reporters.windows; - -import java.text.MessageFormat; - -import org.teachingkidsprogramming.approvals.lite.reporters.GenericDiffReporter; - -public class TortoiseTextDiffReporter extends GenericDiffReporter -{ - public static final TortoiseTextDiffReporter INSTANCE = new TortoiseTextDiffReporter(); - static final String DIFF_PROGRAM = "C:\\Program Files\\TortoiseSVN\\bin\\TortoiseMerge.exe"; - static final String MESSAGE = MessageFormat - .format( - "Unable to find TortoiseMerge at {0}" - + "\nYou can install TortoiseMerge as part " - + "of TortoiseSVN at http://tortisesvn.tigris.org", - DIFF_PROGRAM); - public TortoiseTextDiffReporter() - { - super(DIFF_PROGRAM, MESSAGE); - } -} diff --git a/src/main/java/org/approvaltests/reporters/windows/WinMergeReporter.java b/src/main/java/org/approvaltests/reporters/windows/WinMergeReporter.java deleted file mode 100644 index 3eb6340..0000000 --- a/src/main/java/org/approvaltests/reporters/windows/WinMergeReporter.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.approvaltests.reporters.windows; - -import java.text.MessageFormat; - -import org.teachingkidsprogramming.approvals.lite.reporters.GenericDiffReporter; - -public class WinMergeReporter extends GenericDiffReporter -{ - public static final WinMergeReporter INSTANCE = new WinMergeReporter(); ; - static final String DIFF_PROGRAM = "C:\\Program Files\\WinMerge\\WinMergeU.exe"; - static final String MESSAGE = MessageFormat.format("Unable to find WinMerge at {0}" - + "\nYou can install it at http://winmerge.org/", - DIFF_PROGRAM); - public WinMergeReporter() - { - super(DIFF_PROGRAM, MESSAGE); - } -} diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/DiffReporter.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/DiffReporter.java index 88a7d65..b3c35a6 100644 --- a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/DiffReporter.java +++ b/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/DiffReporter.java @@ -1,7 +1,7 @@ package org.teachingkidsprogramming.approvals.lite.reporters; import org.teachingkidsprogramming.approvals.lite.reporters.macosx.MacDiffReporter; -import org.approvaltests.reporters.windows.WindowsDiffReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.windows.WindowsDiffReporter; public class DiffReporter extends FirstWorkingReporter { diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/ImageReporter.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/ImageReporter.java index d44deaf..0b4eeb7 100644 --- a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/ImageReporter.java +++ b/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/ImageReporter.java @@ -1,8 +1,8 @@ package org.teachingkidsprogramming.approvals.lite.reporters; import org.teachingkidsprogramming.approvals.lite.reporters.macosx.KaleidoscopeDiffReporter; -import org.approvaltests.reporters.windows.BeyondCompareReporter; -import org.approvaltests.reporters.windows.TortoiseImageDiffReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.windows.BeyondCompareReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.windows.TortoiseImageDiffReporter; public class ImageReporter extends FirstWorkingReporter { diff --git a/src/main/java/org/approvaltests/reporters/windows/BeyondCompareReporter.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/windows/BeyondCompareReporter.java similarity index 90% rename from src/main/java/org/approvaltests/reporters/windows/BeyondCompareReporter.java rename to src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/windows/BeyondCompareReporter.java index 8ec37bd..ebb2403 100644 --- a/src/main/java/org/approvaltests/reporters/windows/BeyondCompareReporter.java +++ b/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/windows/BeyondCompareReporter.java @@ -1,4 +1,4 @@ -package org.approvaltests.reporters.windows; +package org.teachingkidsprogramming.approvals.lite.reporters.windows; import java.text.MessageFormat; diff --git a/src/main/java/org/approvaltests/reporters/windows/TortoiseDiffReporter.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/windows/TortoiseDiffReporter.java similarity index 83% rename from src/main/java/org/approvaltests/reporters/windows/TortoiseDiffReporter.java rename to src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/windows/TortoiseDiffReporter.java index 6f0d8a1..4b86b87 100644 --- a/src/main/java/org/approvaltests/reporters/windows/TortoiseDiffReporter.java +++ b/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/windows/TortoiseDiffReporter.java @@ -1,4 +1,4 @@ -package org.approvaltests.reporters.windows; +package org.teachingkidsprogramming.approvals.lite.reporters.windows; import org.teachingkidsprogramming.approvals.lite.reporters.FirstWorkingReporter; diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/windows/TortoiseImageDiffReporter.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/windows/TortoiseImageDiffReporter.java new file mode 100644 index 0000000..7b46a3e --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/windows/TortoiseImageDiffReporter.java @@ -0,0 +1,12 @@ +package org.teachingkidsprogramming.approvals.lite.reporters.windows; + +import org.teachingkidsprogramming.approvals.lite.reporters.GenericDiffReporter; + +public class TortoiseImageDiffReporter extends GenericDiffReporter { + public static final TortoiseImageDiffReporter INSTANCE = new TortoiseImageDiffReporter(); + + public TortoiseImageDiffReporter() { + super("C:\\Program Files\\TortoiseSVN\\bin\\TortoiseIDiff.exe", "/left:%s /right:%s", + TortoiseTextDiffReporter.MESSAGE, GenericDiffReporter.IMAGE_FILE_EXTENSIONS); + } +} diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/windows/TortoiseTextDiffReporter.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/windows/TortoiseTextDiffReporter.java new file mode 100644 index 0000000..ef64134 --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/windows/TortoiseTextDiffReporter.java @@ -0,0 +1,20 @@ +package org.teachingkidsprogramming.approvals.lite.reporters.windows; + +import org.teachingkidsprogramming.approvals.lite.reporters.GenericDiffReporter; + +import java.text.MessageFormat; + +public class TortoiseTextDiffReporter extends GenericDiffReporter { + public static final TortoiseTextDiffReporter INSTANCE = new TortoiseTextDiffReporter(); + static final String DIFF_PROGRAM = "C:\\Program Files\\TortoiseSVN\\bin\\TortoiseMerge.exe"; + static final String MESSAGE = MessageFormat + .format( + "Unable to find TortoiseMerge at {0}" + + "\nYou can install TortoiseMerge as part " + + "of TortoiseSVN at http://tortisesvn.tigris.org", + DIFF_PROGRAM); + + public TortoiseTextDiffReporter() { + super(DIFF_PROGRAM, MESSAGE); + } +} diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/windows/WinMergeReporter.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/windows/WinMergeReporter.java new file mode 100644 index 0000000..b95e245 --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/windows/WinMergeReporter.java @@ -0,0 +1,18 @@ +package org.teachingkidsprogramming.approvals.lite.reporters.windows; + +import org.teachingkidsprogramming.approvals.lite.reporters.GenericDiffReporter; + +import java.text.MessageFormat; + +public class WinMergeReporter extends GenericDiffReporter { + public static final WinMergeReporter INSTANCE = new WinMergeReporter(); + ; + static final String DIFF_PROGRAM = "C:\\Program Files\\WinMerge\\WinMergeU.exe"; + static final String MESSAGE = MessageFormat.format("Unable to find WinMerge at {0}" + + "\nYou can install it at http://winmerge.org/", + DIFF_PROGRAM); + + public WinMergeReporter() { + super(DIFF_PROGRAM, MESSAGE); + } +} diff --git a/src/main/java/org/approvaltests/reporters/windows/WindowsDiffReporter.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/windows/WindowsDiffReporter.java similarity index 84% rename from src/main/java/org/approvaltests/reporters/windows/WindowsDiffReporter.java rename to src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/windows/WindowsDiffReporter.java index 6103ac6..8c46296 100644 --- a/src/main/java/org/approvaltests/reporters/windows/WindowsDiffReporter.java +++ b/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/windows/WindowsDiffReporter.java @@ -1,4 +1,4 @@ -package org.approvaltests.reporters.windows; +package org.teachingkidsprogramming.approvals.lite.reporters.windows; import org.teachingkidsprogramming.approvals.lite.reporters.FirstWorkingReporter; diff --git a/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.java b/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.java index 685236b..1970595 100644 --- a/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.java +++ b/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.java @@ -13,7 +13,7 @@ import org.teachingkidsprogramming.approvals.lite.Approvals; import org.teachingkidsprogramming.approvals.lite.reporters.UseReporter; -import org.approvaltests.reporters.windows.TortoiseTextDiffReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.windows.TortoiseTextDiffReporter; import org.teachingkidsprogramming.util.StringUtils; import org.teachingkidsprogramming.util.TestUtils; diff --git a/src/test/java/org/teachingextensions/logo/tests/WheelTest.java b/src/test/java/org/teachingextensions/logo/tests/WheelTest.java index 8680c2c..3f0b859 100644 --- a/src/test/java/org/teachingextensions/logo/tests/WheelTest.java +++ b/src/test/java/org/teachingextensions/logo/tests/WheelTest.java @@ -4,7 +4,7 @@ import org.teachingkidsprogramming.approvals.lite.Approvals; import org.teachingkidsprogramming.approvals.lite.reporters.UseReporter; -import org.approvaltests.reporters.windows.TortoiseTextDiffReporter; +import org.teachingkidsprogramming.approvals.lite.reporters.windows.TortoiseTextDiffReporter; import org.teachingextensions.logo.Wheel; public class WheelTest extends TestCase From 4ccff8fdd1a65e9c04b45ee81dee8dd140aa6a5f Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Tue, 17 Mar 2015 16:05:23 -0700 Subject: [PATCH 064/111] clean, move writers --- .../writers/ApprovalBinaryFileWriter.java | 50 ------------------ .../writers/ApprovalTextWriter.java | 34 ------------ .../writers/ApprovalXmlWriter.java | 30 ----------- .../writers/ComponentApprovalWriter.java | 52 ------------------- .../writers/DirectoryToDirectoryWriter.java | 31 ----------- .../writers/FileApprovalWriter.java | 33 ------------ .../writers/FlyingSaucerHtmlToPdfWriter.java | 42 --------------- .../writers/ImageApprovalWriter.java | 33 ------------ .../org/approvaltests/writers/Writer.java | 7 --- .../logo/ScreenCapture.java | 2 +- .../org/teachingextensions/logo/Turtle.java | 2 +- .../approvals/lite/Approvals.java | 4 +- .../lite/writers/ApprovalTextWriter.java | 32 ++++++++++++ .../lite/writers/ComponentApprovalWriter.java | 48 +++++++++++++++++ .../lite/writers/ImageApprovalWriter.java | 31 +++++++++++ .../approvals/lite/writers/Writer.java | 6 +++ 16 files changed, 121 insertions(+), 316 deletions(-) delete mode 100644 src/main/java/org/approvaltests/writers/ApprovalBinaryFileWriter.java delete mode 100644 src/main/java/org/approvaltests/writers/ApprovalTextWriter.java delete mode 100644 src/main/java/org/approvaltests/writers/ApprovalXmlWriter.java delete mode 100644 src/main/java/org/approvaltests/writers/ComponentApprovalWriter.java delete mode 100644 src/main/java/org/approvaltests/writers/DirectoryToDirectoryWriter.java delete mode 100644 src/main/java/org/approvaltests/writers/FileApprovalWriter.java delete mode 100644 src/main/java/org/approvaltests/writers/FlyingSaucerHtmlToPdfWriter.java delete mode 100644 src/main/java/org/approvaltests/writers/ImageApprovalWriter.java delete mode 100644 src/main/java/org/approvaltests/writers/Writer.java create mode 100644 src/main/java/org/teachingkidsprogramming/approvals/lite/writers/ApprovalTextWriter.java create mode 100644 src/main/java/org/teachingkidsprogramming/approvals/lite/writers/ComponentApprovalWriter.java create mode 100644 src/main/java/org/teachingkidsprogramming/approvals/lite/writers/ImageApprovalWriter.java create mode 100644 src/main/java/org/teachingkidsprogramming/approvals/lite/writers/Writer.java diff --git a/src/main/java/org/approvaltests/writers/ApprovalBinaryFileWriter.java b/src/main/java/org/approvaltests/writers/ApprovalBinaryFileWriter.java deleted file mode 100644 index 7f7f9b1..0000000 --- a/src/main/java/org/approvaltests/writers/ApprovalBinaryFileWriter.java +++ /dev/null @@ -1,50 +0,0 @@ -package org.approvaltests.writers; - -import java.io.File; -import java.io.InputStream; -import java.nio.channels.Channels; -import java.nio.channels.ReadableByteChannel; - -import org.teachingkidsprogramming.approvals.lite.ApprovalWriter; - -import org.teachingkidsprogramming.util.io.FileUtils; - -public class ApprovalBinaryFileWriter implements ApprovalWriter { - private CharSequence data; - private String fileExtension; - private InputStream dataStream; - - public ApprovalBinaryFileWriter(CharSequence charSequence, String fileExtensionWithoutDot) { - this.data = charSequence; - this.fileExtension = fileExtensionWithoutDot; - } - - public ApprovalBinaryFileWriter(InputStream stream, String fileExtensionWithoutDot) { - this.dataStream = stream; - this.fileExtension = fileExtensionWithoutDot; - } - - public ApprovalBinaryFileWriter(ReadableByteChannel stream, String fileExtensionWithoutDot) { - this(Channels.newInputStream(stream), fileExtensionWithoutDot); - } - - @Override - public String writeReceivedFile(String received) throws Exception { - if (dataStream == null) { - FileUtils.writeFile(new File(received), data); - } else { - FileUtils.writeFile(new File(received), dataStream); - } - return received; - } - - @Override - public String getApprovalFilename(String base) { - return base + Writer.approved + "." + fileExtension; - } - - @Override - public String getReceivedFilename(String base) { - return base + Writer.received + fileExtension; - } -} diff --git a/src/main/java/org/approvaltests/writers/ApprovalTextWriter.java b/src/main/java/org/approvaltests/writers/ApprovalTextWriter.java deleted file mode 100644 index 564d381..0000000 --- a/src/main/java/org/approvaltests/writers/ApprovalTextWriter.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.approvaltests.writers; - -import java.io.File; - -import org.teachingkidsprogramming.approvals.lite.ApprovalWriter; - -import org.teachingkidsprogramming.util.io.FileUtils; - -public class ApprovalTextWriter implements ApprovalWriter -{ - private final String text; - private final String fileExtensionWithoutDot; - public ApprovalTextWriter(String text, String fileExtensionWithoutDot) - { - this.text = text; - this.fileExtensionWithoutDot = fileExtensionWithoutDot; - } - @Override - public String writeReceivedFile(String received) throws Exception - { - FileUtils.writeFile(new File(received), text); - return received; - } - @Override - public String getApprovalFilename(String base) - { - return base + Writer.approved + "."+ fileExtensionWithoutDot; - } - @Override - public String getReceivedFilename(String base) - { - return base + Writer.received + "."+fileExtensionWithoutDot; - } -} diff --git a/src/main/java/org/approvaltests/writers/ApprovalXmlWriter.java b/src/main/java/org/approvaltests/writers/ApprovalXmlWriter.java deleted file mode 100644 index 5ee8452..0000000 --- a/src/main/java/org/approvaltests/writers/ApprovalXmlWriter.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.approvaltests.writers; - -import java.io.InputStream; - -import org.teachingkidsprogramming.util.io.FileUtils; - -public class ApprovalXmlWriter extends ApprovalTextWriter -{ - public ApprovalXmlWriter(String text) - { - super(text, "xml"); - } - @Override - public String writeReceivedFile(String received) throws Exception - { - received = super.writeReceivedFile(received); - format(received); - return received; - } - private void format(String fileName) throws Exception - { - String text = "\"C:\\temp\\xmlstarlet-1.0.1\\xml.exe\" format \"%s\""; - text = String.format(text, fileName); - Process exec = Runtime.getRuntime().exec(text); - InputStream stream = exec.getInputStream(); - Thread.sleep(400); - FileUtils.redirectInputToFile(fileName, stream); - - } -} diff --git a/src/main/java/org/approvaltests/writers/ComponentApprovalWriter.java b/src/main/java/org/approvaltests/writers/ComponentApprovalWriter.java deleted file mode 100644 index 5886e21..0000000 --- a/src/main/java/org/approvaltests/writers/ComponentApprovalWriter.java +++ /dev/null @@ -1,52 +0,0 @@ -package org.approvaltests.writers; - -import java.awt.Component; -import java.awt.Graphics; -import java.awt.image.BufferedImage; - -import javax.swing.JFrame; - -import org.teachingkidsprogramming.approvals.lite.ApprovalWriter; - -public class ComponentApprovalWriter implements ApprovalWriter -{ - private ImageApprovalWriter image = null; - public ComponentApprovalWriter(Component c) - { - BufferedImage image = drawComponent(c); - this.image = new ImageApprovalWriter(image); - } - public static BufferedImage drawComponent(Component c) - { - validateComponent(c); - BufferedImage image = new BufferedImage(c.getWidth(), c.getHeight(), BufferedImage.TYPE_INT_ARGB); - Graphics g = image.createGraphics(); - c.paint(g); - g.dispose(); - return image; - } - private static void validateComponent(Component c) - { - if (!c.isValid()) - { - JFrame frame = new JFrame(); - frame.getContentPane().add(c); - frame.pack(); - } - } - @Override - public String getApprovalFilename(String base) - { - return image.getApprovalFilename(base); - } - @Override - public String getReceivedFilename(String base) - { - return image.getReceivedFilename(base); - } - @Override - public String writeReceivedFile(String filename) throws Exception - { - return image.writeReceivedFile(filename); - } -} diff --git a/src/main/java/org/approvaltests/writers/DirectoryToDirectoryWriter.java b/src/main/java/org/approvaltests/writers/DirectoryToDirectoryWriter.java deleted file mode 100644 index 43a0b63..0000000 --- a/src/main/java/org/approvaltests/writers/DirectoryToDirectoryWriter.java +++ /dev/null @@ -1,31 +0,0 @@ -package org.approvaltests.writers; - -import java.io.File; - -import org.teachingkidsprogramming.approvals.lite.ApprovalWriter; - -public class DirectoryToDirectoryWriter implements ApprovalWriter -{ - private final File recieved; - private final File goldMasterDirectory; - public DirectoryToDirectoryWriter(File recieved, File goldMasterDirectory) - { - this.recieved = recieved; - this.goldMasterDirectory = goldMasterDirectory; - } - @Override - public String writeReceivedFile(String received) throws Exception - { - return this.recieved.getAbsolutePath(); - } - @Override - public String getReceivedFilename(String base) - { - return recieved.getAbsolutePath(); - } - @Override - public String getApprovalFilename(String base) - { - return goldMasterDirectory.getAbsolutePath() + File.separator + recieved.getName(); - } -} \ No newline at end of file diff --git a/src/main/java/org/approvaltests/writers/FileApprovalWriter.java b/src/main/java/org/approvaltests/writers/FileApprovalWriter.java deleted file mode 100644 index 2d5a006..0000000 --- a/src/main/java/org/approvaltests/writers/FileApprovalWriter.java +++ /dev/null @@ -1,33 +0,0 @@ -package org.approvaltests.writers; - -import java.io.File; - -import org.teachingkidsprogramming.approvals.lite.ApprovalWriter; - -import org.teachingkidsprogramming.util.io.FileUtils; - -public class FileApprovalWriter implements ApprovalWriter -{ - private final File newFile; - private String extensionWithDot; - public FileApprovalWriter(File newFile) - { - this.newFile = newFile; - extensionWithDot = FileUtils.getExtensionWithDot(newFile.getName()); - } - @Override - public String writeReceivedFile(String received) throws Exception - { - return newFile.getAbsolutePath(); - } - @Override - public String getApprovalFilename(String base) - { - return base + Writer.approved + extensionWithDot; - } - @Override - public String getReceivedFilename(String base) - { - return base + Writer.received + extensionWithDot; - } -} diff --git a/src/main/java/org/approvaltests/writers/FlyingSaucerHtmlToPdfWriter.java b/src/main/java/org/approvaltests/writers/FlyingSaucerHtmlToPdfWriter.java deleted file mode 100644 index 43eb9a8..0000000 --- a/src/main/java/org/approvaltests/writers/FlyingSaucerHtmlToPdfWriter.java +++ /dev/null @@ -1,42 +0,0 @@ -package org.approvaltests.writers; - -import org.teachingkidsprogramming.approvals.lite.ApprovalWriter; - -import org.teachingkidsprogramming.util.NotImplementedException; - - -public class FlyingSaucerHtmlToPdfWriter implements ApprovalWriter -{ - private final String html; - public FlyingSaucerHtmlToPdfWriter(String html) - { - this.html = html; - } - //@Override - public String getApprovalFilename(String base) - { - return base + Writer.approved + ".pdf"; - } - //@Override - public String getReceivedFilename(String base) - { - return base + Writer.received + ".pdf"; - } - //@Override - public String writeReceivedFile(String received) throws Exception - { - // String s = new ApprovalTextWriter(html, - // ".html").writeReceivedFile(File.createTempFile("temp", - // ".html").getAbsolutePath()); - // File f = new File(s); - // String url = f.toURI().toURL().toString(); - // OutputStream os = new FileOutputStream(received); - // ITextRenderer renderer = new ITextRenderer(); - // renderer.setDocument(url); - // renderer.layout(); - // renderer.createPDF(os); - // os.close(); - // return received; - throw new NotImplementedException(); - } -} diff --git a/src/main/java/org/approvaltests/writers/ImageApprovalWriter.java b/src/main/java/org/approvaltests/writers/ImageApprovalWriter.java deleted file mode 100644 index 685f301..0000000 --- a/src/main/java/org/approvaltests/writers/ImageApprovalWriter.java +++ /dev/null @@ -1,33 +0,0 @@ -package org.approvaltests.writers; - -import java.awt.image.BufferedImage; -import java.io.File; - -import javax.imageio.ImageIO; - -import org.teachingkidsprogramming.approvals.lite.ApprovalWriter; - -public class ImageApprovalWriter implements ApprovalWriter -{ - private final BufferedImage image; - public ImageApprovalWriter(BufferedImage image) - { - this.image = image; - } - @Override - public String writeReceivedFile(String received) throws Exception - { - ImageIO.write(image, "png", new File(received)); - return received; - } - @Override - public String getApprovalFilename(String base) - { - return base + Writer.approved + ".png"; - } - @Override - public String getReceivedFilename(String base) - { - return base + Writer.received + ".png"; - } -} diff --git a/src/main/java/org/approvaltests/writers/Writer.java b/src/main/java/org/approvaltests/writers/Writer.java deleted file mode 100644 index 8cd0fcc..0000000 --- a/src/main/java/org/approvaltests/writers/Writer.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.approvaltests.writers; - -public interface Writer -{ - final static String received = ".received"; - final static String approved = ".approved"; -} diff --git a/src/main/java/org/teachingextensions/logo/ScreenCapture.java b/src/main/java/org/teachingextensions/logo/ScreenCapture.java index 23b2640..2224217 100644 --- a/src/main/java/org/teachingextensions/logo/ScreenCapture.java +++ b/src/main/java/org/teachingextensions/logo/ScreenCapture.java @@ -5,7 +5,7 @@ import java.awt.Image; import java.awt.image.BufferedImage; -import org.approvaltests.writers.ComponentApprovalWriter; +import org.teachingkidsprogramming.approvals.lite.writers.ComponentApprovalWriter; public class ScreenCapture { diff --git a/src/main/java/org/teachingextensions/logo/Turtle.java b/src/main/java/org/teachingextensions/logo/Turtle.java index 0fe21b5..dc955cf 100644 --- a/src/main/java/org/teachingextensions/logo/Turtle.java +++ b/src/main/java/org/teachingextensions/logo/Turtle.java @@ -9,7 +9,7 @@ import javax.swing.JFrame; -import org.approvaltests.writers.ComponentApprovalWriter; +import org.teachingkidsprogramming.approvals.lite.writers.ComponentApprovalWriter; import org.lambda.actions.Action0; import org.teachingextensions.windows.ProgramWindow; diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/Approvals.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/Approvals.java index 8185b40..0eb813c 100644 --- a/src/main/java/org/teachingkidsprogramming/approvals/lite/Approvals.java +++ b/src/main/java/org/teachingkidsprogramming/approvals/lite/Approvals.java @@ -3,8 +3,8 @@ import org.teachingkidsprogramming.approvals.lite.ReporterFactory.FileTypes; import org.teachingkidsprogramming.approvals.lite.namer.ApprovalNamer; import org.teachingkidsprogramming.approvals.lite.namer.JUnitStackTraceNamer; -import org.approvaltests.writers.ApprovalTextWriter; -import org.approvaltests.writers.ImageApprovalWriter; +import org.teachingkidsprogramming.approvals.lite.writers.ApprovalTextWriter; +import org.teachingkidsprogramming.approvals.lite.writers.ImageApprovalWriter; import org.lambda.functions.Function1; import org.teachingkidsprogramming.util.ArrayUtils; import org.teachingkidsprogramming.util.ObjectUtils; diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/writers/ApprovalTextWriter.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/writers/ApprovalTextWriter.java new file mode 100644 index 0000000..f62d2f9 --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/approvals/lite/writers/ApprovalTextWriter.java @@ -0,0 +1,32 @@ +package org.teachingkidsprogramming.approvals.lite.writers; + +import org.teachingkidsprogramming.approvals.lite.ApprovalWriter; +import org.teachingkidsprogramming.util.io.FileUtils; + +import java.io.File; + +public class ApprovalTextWriter implements ApprovalWriter { + private final String text; + private final String fileExtensionWithoutDot; + + public ApprovalTextWriter(String text, String fileExtensionWithoutDot) { + this.text = text; + this.fileExtensionWithoutDot = fileExtensionWithoutDot; + } + + @Override + public String writeReceivedFile(String received) throws Exception { + FileUtils.writeFile(new File(received), text); + return received; + } + + @Override + public String getApprovalFilename(String base) { + return base + Writer.approved + "." + fileExtensionWithoutDot; + } + + @Override + public String getReceivedFilename(String base) { + return base + Writer.received + "." + fileExtensionWithoutDot; + } +} diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/writers/ComponentApprovalWriter.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/writers/ComponentApprovalWriter.java new file mode 100644 index 0000000..11ad7ac --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/approvals/lite/writers/ComponentApprovalWriter.java @@ -0,0 +1,48 @@ +package org.teachingkidsprogramming.approvals.lite.writers; + +import org.teachingkidsprogramming.approvals.lite.ApprovalWriter; + +import javax.swing.*; +import java.awt.*; +import java.awt.image.BufferedImage; + +public class ComponentApprovalWriter implements ApprovalWriter { + private ImageApprovalWriter image = null; + + public ComponentApprovalWriter(Component c) { + BufferedImage image = drawComponent(c); + this.image = new ImageApprovalWriter(image); + } + + public static BufferedImage drawComponent(Component c) { + validateComponent(c); + BufferedImage image = new BufferedImage(c.getWidth(), c.getHeight(), BufferedImage.TYPE_INT_ARGB); + Graphics g = image.createGraphics(); + c.paint(g); + g.dispose(); + return image; + } + + private static void validateComponent(Component c) { + if (!c.isValid()) { + JFrame frame = new JFrame(); + frame.getContentPane().add(c); + frame.pack(); + } + } + + @Override + public String getApprovalFilename(String base) { + return image.getApprovalFilename(base); + } + + @Override + public String getReceivedFilename(String base) { + return image.getReceivedFilename(base); + } + + @Override + public String writeReceivedFile(String filename) throws Exception { + return image.writeReceivedFile(filename); + } +} diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/writers/ImageApprovalWriter.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/writers/ImageApprovalWriter.java new file mode 100644 index 0000000..8dca7ba --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/approvals/lite/writers/ImageApprovalWriter.java @@ -0,0 +1,31 @@ +package org.teachingkidsprogramming.approvals.lite.writers; + +import org.teachingkidsprogramming.approvals.lite.ApprovalWriter; + +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.File; + +public class ImageApprovalWriter implements ApprovalWriter { + private final BufferedImage image; + + public ImageApprovalWriter(BufferedImage image) { + this.image = image; + } + + @Override + public String writeReceivedFile(String received) throws Exception { + ImageIO.write(image, "png", new File(received)); + return received; + } + + @Override + public String getApprovalFilename(String base) { + return base + Writer.approved + ".png"; + } + + @Override + public String getReceivedFilename(String base) { + return base + Writer.received + ".png"; + } +} diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/writers/Writer.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/writers/Writer.java new file mode 100644 index 0000000..b19a4d6 --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/approvals/lite/writers/Writer.java @@ -0,0 +1,6 @@ +package org.teachingkidsprogramming.approvals.lite.writers; + +public interface Writer { + final static String received = ".received"; + final static String approved = ".approved"; +} From 1b80e8ecad78e017aab533ec283de02958e7e69f Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Tue, 17 Mar 2015 16:09:05 -0700 Subject: [PATCH 065/111] moved action lambdas --- src/main/java/org/lambda/actions/Action0.java | 6 ------ src/main/java/org/lambda/actions/Action1.java | 6 ------ src/main/java/org/lambda/actions/Action2.java | 6 ------ src/main/java/org/lambda/actions/Action3.java | 6 ------ src/main/java/org/lambda/actions/Action4.java | 6 ------ src/main/java/org/lambda/actions/Action5.java | 6 ------ src/main/java/org/lambda/actions/Action6.java | 6 ------ src/main/java/org/lambda/actions/Action7.java | 6 ------ src/main/java/org/lambda/actions/Action8.java | 6 ------ src/main/java/org/lambda/actions/Action9.java | 6 ------ src/main/java/org/lambda/query/Loops.java | 2 +- src/main/java/org/teachingextensions/logo/Turtle.java | 2 +- .../java/org/teachingextensions/logo/VirtualProctorWeb.java | 2 +- .../teachingkidsprogramming/util/LambdaThreadLauncher.java | 2 +- .../org/teachingkidsprogramming/util/ThreadLauncher.java | 4 +--- .../org/teachingkidsprogramming/util/lambda/Action0.java | 5 +++++ .../org/teachingkidsprogramming/util/lambda/Action1.java | 5 +++++ 17 files changed, 15 insertions(+), 67 deletions(-) delete mode 100644 src/main/java/org/lambda/actions/Action0.java delete mode 100644 src/main/java/org/lambda/actions/Action1.java delete mode 100644 src/main/java/org/lambda/actions/Action2.java delete mode 100644 src/main/java/org/lambda/actions/Action3.java delete mode 100644 src/main/java/org/lambda/actions/Action4.java delete mode 100644 src/main/java/org/lambda/actions/Action5.java delete mode 100644 src/main/java/org/lambda/actions/Action6.java delete mode 100644 src/main/java/org/lambda/actions/Action7.java delete mode 100644 src/main/java/org/lambda/actions/Action8.java delete mode 100644 src/main/java/org/lambda/actions/Action9.java create mode 100644 src/main/java/org/teachingkidsprogramming/util/lambda/Action0.java create mode 100644 src/main/java/org/teachingkidsprogramming/util/lambda/Action1.java diff --git a/src/main/java/org/lambda/actions/Action0.java b/src/main/java/org/lambda/actions/Action0.java deleted file mode 100644 index 13373a3..0000000 --- a/src/main/java/org/lambda/actions/Action0.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.lambda.actions; - -public interface Action0 -{ - public void call(); -} diff --git a/src/main/java/org/lambda/actions/Action1.java b/src/main/java/org/lambda/actions/Action1.java deleted file mode 100644 index 9b789d5..0000000 --- a/src/main/java/org/lambda/actions/Action1.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.lambda.actions; - -public interface Action1 -{ - public void call(In1 a); -} diff --git a/src/main/java/org/lambda/actions/Action2.java b/src/main/java/org/lambda/actions/Action2.java deleted file mode 100644 index b2f4f5a..0000000 --- a/src/main/java/org/lambda/actions/Action2.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.lambda.actions; - -public interface Action2 -{ - public void call(In1 a, In2 b); -} diff --git a/src/main/java/org/lambda/actions/Action3.java b/src/main/java/org/lambda/actions/Action3.java deleted file mode 100644 index 4c51d53..0000000 --- a/src/main/java/org/lambda/actions/Action3.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.lambda.actions; - -public interface Action3 -{ - public void call(In1 a, In2 b, In3 c); -} diff --git a/src/main/java/org/lambda/actions/Action4.java b/src/main/java/org/lambda/actions/Action4.java deleted file mode 100644 index 6dd4b01..0000000 --- a/src/main/java/org/lambda/actions/Action4.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.lambda.actions; - -public interface Action4 -{ - public void call(In1 a, In2 b, In3 c, In4 d); -} diff --git a/src/main/java/org/lambda/actions/Action5.java b/src/main/java/org/lambda/actions/Action5.java deleted file mode 100644 index ae7de7f..0000000 --- a/src/main/java/org/lambda/actions/Action5.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.lambda.actions; - -public interface Action5 -{ - public void call(In1 a, In2 b, In3 c, In4 d, In5 e); -} diff --git a/src/main/java/org/lambda/actions/Action6.java b/src/main/java/org/lambda/actions/Action6.java deleted file mode 100644 index 2b4d334..0000000 --- a/src/main/java/org/lambda/actions/Action6.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.lambda.actions; - -public interface Action6 -{ - public void call(In1 a, In2 b, In3 c, In4 d, In5 e, In6 f); -} diff --git a/src/main/java/org/lambda/actions/Action7.java b/src/main/java/org/lambda/actions/Action7.java deleted file mode 100644 index 4efbb1b..0000000 --- a/src/main/java/org/lambda/actions/Action7.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.lambda.actions; - -public interface Action7 -{ - public void call(In1 a, In2 b, In3 c, In4 d, In5 e, In6 f, In7 g); -} diff --git a/src/main/java/org/lambda/actions/Action8.java b/src/main/java/org/lambda/actions/Action8.java deleted file mode 100644 index 9e128ae..0000000 --- a/src/main/java/org/lambda/actions/Action8.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.lambda.actions; - -public interface Action8 -{ - public void call(In1 a, In2 b, In3 c, In4 d, In5 e, In6 f, In7 g, In8 h); -} diff --git a/src/main/java/org/lambda/actions/Action9.java b/src/main/java/org/lambda/actions/Action9.java deleted file mode 100644 index 3727286..0000000 --- a/src/main/java/org/lambda/actions/Action9.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.lambda.actions; - -public interface Action9 -{ - public void call(In1 a, In2 b, In3 c, In4 d, In5 e, In6 f, In7 g, In8 h, In9 i); -} diff --git a/src/main/java/org/lambda/query/Loops.java b/src/main/java/org/lambda/query/Loops.java index 55260ed..1da10f7 100644 --- a/src/main/java/org/lambda/query/Loops.java +++ b/src/main/java/org/lambda/query/Loops.java @@ -1,6 +1,6 @@ package org.lambda.query; -import org.lambda.actions.Action1; +import org.teachingkidsprogramming.util.lambda.Action1; public class Loops { diff --git a/src/main/java/org/teachingextensions/logo/Turtle.java b/src/main/java/org/teachingextensions/logo/Turtle.java index dc955cf..0360629 100644 --- a/src/main/java/org/teachingextensions/logo/Turtle.java +++ b/src/main/java/org/teachingextensions/logo/Turtle.java @@ -10,7 +10,7 @@ import javax.swing.JFrame; import org.teachingkidsprogramming.approvals.lite.writers.ComponentApprovalWriter; -import org.lambda.actions.Action0; +import org.teachingkidsprogramming.util.lambda.Action0; import org.teachingextensions.windows.ProgramWindow; import org.teachingkidsprogramming.util.ThreadLauncher; diff --git a/src/main/java/org/teachingextensions/logo/VirtualProctorWeb.java b/src/main/java/org/teachingextensions/logo/VirtualProctorWeb.java index 6541450..0c41ee2 100644 --- a/src/main/java/org/teachingextensions/logo/VirtualProctorWeb.java +++ b/src/main/java/org/teachingextensions/logo/VirtualProctorWeb.java @@ -14,7 +14,7 @@ import javax.imageio.ImageIO; -import org.lambda.actions.Action0; +import org.teachingkidsprogramming.util.lambda.Action0; import org.teachingextensions.utils.VirtualProctor; import org.teachingkidsprogramming.util.MySystem; diff --git a/src/main/java/org/teachingkidsprogramming/util/LambdaThreadLauncher.java b/src/main/java/org/teachingkidsprogramming/util/LambdaThreadLauncher.java index b932a0c..725138f 100644 --- a/src/main/java/org/teachingkidsprogramming/util/LambdaThreadLauncher.java +++ b/src/main/java/org/teachingkidsprogramming/util/LambdaThreadLauncher.java @@ -1,6 +1,6 @@ package org.teachingkidsprogramming.util; -import org.lambda.actions.Action0; +import org.teachingkidsprogramming.util.lambda.Action0; public class LambdaThreadLauncher implements Runnable { private final Action0 function; diff --git a/src/main/java/org/teachingkidsprogramming/util/ThreadLauncher.java b/src/main/java/org/teachingkidsprogramming/util/ThreadLauncher.java index 59e0615..6faf0d9 100644 --- a/src/main/java/org/teachingkidsprogramming/util/ThreadLauncher.java +++ b/src/main/java/org/teachingkidsprogramming/util/ThreadLauncher.java @@ -1,8 +1,6 @@ package org.teachingkidsprogramming.util; -import org.lambda.actions.Action0; -import org.teachingkidsprogramming.util.LambdaThreadLauncher; -import org.teachingkidsprogramming.util.MySystem; +import org.teachingkidsprogramming.util.lambda.Action0; import java.lang.reflect.Method; diff --git a/src/main/java/org/teachingkidsprogramming/util/lambda/Action0.java b/src/main/java/org/teachingkidsprogramming/util/lambda/Action0.java new file mode 100644 index 0000000..c4ebc6d --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/util/lambda/Action0.java @@ -0,0 +1,5 @@ +package org.teachingkidsprogramming.util.lambda; + +public interface Action0 { + public void call(); +} diff --git a/src/main/java/org/teachingkidsprogramming/util/lambda/Action1.java b/src/main/java/org/teachingkidsprogramming/util/lambda/Action1.java new file mode 100644 index 0000000..148e101 --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/util/lambda/Action1.java @@ -0,0 +1,5 @@ +package org.teachingkidsprogramming.util.lambda; + +public interface Action1 { + public void call(In1 a); +} From b1958df6480dabd19e8fa65f39b799e5aa2c2ce5 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Tue, 17 Mar 2015 16:17:44 -0700 Subject: [PATCH 066/111] moved functions and queries --- .../java/org/lambda/functions/Function0.java | 6 - .../java/org/lambda/functions/Function1.java | 6 - .../java/org/lambda/functions/Function2.java | 6 - .../java/org/lambda/functions/Function3.java | 6 - .../java/org/lambda/functions/Function4.java | 6 - .../java/org/lambda/functions/Function5.java | 6 - .../java/org/lambda/functions/Function6.java | 6 - .../java/org/lambda/functions/Function7.java | 6 - .../java/org/lambda/functions/Function8.java | 6 - .../java/org/lambda/functions/Function9.java | 6 - src/main/java/org/lambda/query/Echo1.java | 14 -- src/main/java/org/lambda/query/Loops.java | 14 -- src/main/java/org/lambda/query/Query.java | 134 ------------------ .../simpleparser/Parser.java | 4 +- .../approvals/lite/Approvals.java | 2 +- .../approvals/lite/namer/NamerFactory.java | 2 +- .../lite/namer/OsEnvironmentLabeller.java | 2 +- .../util/ArrayUtils.java | 2 +- .../util/NumberUtils.java | 39 +---- .../util/lambda/Function0.java | 5 + .../util/lambda/Function1.java | 5 + .../util/lambda/Query.java | 32 +++++ .../logo/tests/TurtleTest.java | 2 +- 23 files changed, 51 insertions(+), 266 deletions(-) delete mode 100644 src/main/java/org/lambda/functions/Function0.java delete mode 100644 src/main/java/org/lambda/functions/Function1.java delete mode 100644 src/main/java/org/lambda/functions/Function2.java delete mode 100644 src/main/java/org/lambda/functions/Function3.java delete mode 100644 src/main/java/org/lambda/functions/Function4.java delete mode 100644 src/main/java/org/lambda/functions/Function5.java delete mode 100644 src/main/java/org/lambda/functions/Function6.java delete mode 100644 src/main/java/org/lambda/functions/Function7.java delete mode 100644 src/main/java/org/lambda/functions/Function8.java delete mode 100644 src/main/java/org/lambda/functions/Function9.java delete mode 100644 src/main/java/org/lambda/query/Echo1.java delete mode 100644 src/main/java/org/lambda/query/Loops.java delete mode 100644 src/main/java/org/lambda/query/Query.java create mode 100644 src/main/java/org/teachingkidsprogramming/util/lambda/Function0.java create mode 100644 src/main/java/org/teachingkidsprogramming/util/lambda/Function1.java create mode 100644 src/main/java/org/teachingkidsprogramming/util/lambda/Query.java diff --git a/src/main/java/org/lambda/functions/Function0.java b/src/main/java/org/lambda/functions/Function0.java deleted file mode 100644 index ac79839..0000000 --- a/src/main/java/org/lambda/functions/Function0.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.lambda.functions; - -public interface Function0 -{ - public Out call(); -} diff --git a/src/main/java/org/lambda/functions/Function1.java b/src/main/java/org/lambda/functions/Function1.java deleted file mode 100644 index b7f0ed6..0000000 --- a/src/main/java/org/lambda/functions/Function1.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.lambda.functions; - -public interface Function1 -{ - public Out call(In i); -} diff --git a/src/main/java/org/lambda/functions/Function2.java b/src/main/java/org/lambda/functions/Function2.java deleted file mode 100644 index a759df5..0000000 --- a/src/main/java/org/lambda/functions/Function2.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.lambda.functions; - -public interface Function2 -{ - public Out call(In1 a, In2 b); -} diff --git a/src/main/java/org/lambda/functions/Function3.java b/src/main/java/org/lambda/functions/Function3.java deleted file mode 100644 index 5c7e651..0000000 --- a/src/main/java/org/lambda/functions/Function3.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.lambda.functions; - -public interface Function3 -{ - public Out call(In1 a, In2 b, In3 c); -} diff --git a/src/main/java/org/lambda/functions/Function4.java b/src/main/java/org/lambda/functions/Function4.java deleted file mode 100644 index bc49095..0000000 --- a/src/main/java/org/lambda/functions/Function4.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.lambda.functions; - -public interface Function4 -{ - public Out call(In1 a, In2 b, In3 c, In4 d); -} diff --git a/src/main/java/org/lambda/functions/Function5.java b/src/main/java/org/lambda/functions/Function5.java deleted file mode 100644 index 27ef5ef..0000000 --- a/src/main/java/org/lambda/functions/Function5.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.lambda.functions; - -public interface Function5 -{ - public Out call(In1 a, In2 b, In3 c, In4 d, In5 e); -} diff --git a/src/main/java/org/lambda/functions/Function6.java b/src/main/java/org/lambda/functions/Function6.java deleted file mode 100644 index 6db124c..0000000 --- a/src/main/java/org/lambda/functions/Function6.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.lambda.functions; - -public interface Function6 -{ - public Out call(In1 a, In2 b, In3 c, In4 d, In5 e, In6 f); -} diff --git a/src/main/java/org/lambda/functions/Function7.java b/src/main/java/org/lambda/functions/Function7.java deleted file mode 100644 index 49f52f2..0000000 --- a/src/main/java/org/lambda/functions/Function7.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.lambda.functions; - -public interface Function7 -{ - public Out call(In1 a, In2 b, In3 c, In4 d, In5 e, In6 f, In7 g); -} diff --git a/src/main/java/org/lambda/functions/Function8.java b/src/main/java/org/lambda/functions/Function8.java deleted file mode 100644 index aa9747d..0000000 --- a/src/main/java/org/lambda/functions/Function8.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.lambda.functions; - -public interface Function8 -{ - public Out call(In1 a, In2 b, In3 c, In4 d, In5 e, In6 f, In7 g, In8 h); -} diff --git a/src/main/java/org/lambda/functions/Function9.java b/src/main/java/org/lambda/functions/Function9.java deleted file mode 100644 index 1dece20..0000000 --- a/src/main/java/org/lambda/functions/Function9.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.lambda.functions; - -public interface Function9 -{ - public Out call(In1 a, In2 b, In3 c, In4 d, In5 e, In6 f, In7 g, In8 h, In9 i); -} diff --git a/src/main/java/org/lambda/query/Echo1.java b/src/main/java/org/lambda/query/Echo1.java deleted file mode 100644 index aff8938..0000000 --- a/src/main/java/org/lambda/query/Echo1.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.lambda.query; - -import org.lambda.functions.Function1; - -/** - * A super fast Lambda that simply return whatever is sent - **/ -public class Echo1 implements Function1 -{ - public T call(T i) - { - return i; - } -} diff --git a/src/main/java/org/lambda/query/Loops.java b/src/main/java/org/lambda/query/Loops.java deleted file mode 100644 index 1da10f7..0000000 --- a/src/main/java/org/lambda/query/Loops.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.lambda.query; - -import org.teachingkidsprogramming.util.lambda.Action1; - -public class Loops -{ - public static void forEach(Iterable students, Action1 a1) - { - for (In in : students) - { - a1.call(in); - } - } -} diff --git a/src/main/java/org/lambda/query/Query.java b/src/main/java/org/lambda/query/Query.java deleted file mode 100644 index a9d8722..0000000 --- a/src/main/java/org/lambda/query/Query.java +++ /dev/null @@ -1,134 +0,0 @@ -package org.lambda.query; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; - -import org.lambda.functions.Function1; -import org.teachingkidsprogramming.util.ArrayUtils; - -public class Query -{ - public static List select(List list, Function1 function) - { - ArrayList out = new ArrayList(); - for (In i : list) - { - out.add(function.call(i)); - } - return out; - } - public static List select(In[] list, Function1 function) - { - return select(Arrays.asList(list), function); - } - public static List where(Iterable list, Function1 funct) - { - ArrayList out = new ArrayList(); - for (In i : list) - { - if (funct.call(i)) - { - out.add(i); - } - } - return out; - } - public static List where(In[] list, Function1 funct) - { - ArrayList out = new ArrayList(); - for (In i : list) - { - if (funct.call(i)) - { - out.add(i); - } - } - return out; - } - public static In max(List list, Function1 f1) - { - return getTop(list, f1, 1); - } - public static In min(List list, Function1 f1) - { - return getTop(list, f1, -1); - } - public static Double average(List list, Function1 f1) - { - double total = 0.00; - for (In in : list) - { - total += f1.call(in).doubleValue(); - } - return total / list.size(); - } - private static In getTop(List list, Function1 f1, int modifier) - { - if (ArrayUtils.isEmpty(list)) { return null; } - In found = list.get(0); - Comparable max = f1.call(found); - for (In in : list) - { - Comparable current = f1.call(in); - if (max.compareTo(current) * modifier < 0) - { - max = current; - found = in; - } - } - return found; - } -// public static T[] orderBy(T[] list, Function1 f1) -// { -// return orderBy(list, Order.Ascending, f1); -// } -// public static T[] orderBy(T[] list, Order order, Function1 f1) -// { -// Arrays.sort(list, new OrderBy(order, f1)); -// return list; -// } -// public static List orderBy(List list, Function1 f1) -// { -// return orderBy(list, Order.Ascending, f1); -// } -// public static List orderBy(List list, Order order, Function1 f1) -// { -// Collections.sort(list, new OrderBy(order, f1)); -// return list; -// } - public static Double sum(In[] list, Function1 f1) - { - return sum(Arrays.asList(list), f1); - } - public static Double sum(Collection list, Function1 f1) - { - double sum = 0; - for (In in : list) - { - sum += f1.call(in).doubleValue(); - } - return sum; - } - public static Double sum(Collection list) - { - return sum(list, new Echo1()); - } - public static Double sum(Out[] list) - { - return sum(list, new Echo1()); - } - public static T max(List numbers) - { - return (T) max((List) numbers, new Echo1()); - } - public static T max(T[] numbers) - { - return max(Arrays.asList(numbers)); - } - public static T min(List numbers) - { - return (T) min((List) numbers, new Echo1()); - } -} diff --git a/src/main/java/org/teachingextensions/simpleparser/Parser.java b/src/main/java/org/teachingextensions/simpleparser/Parser.java index 684ac4b..b6be3c3 100644 --- a/src/main/java/org/teachingextensions/simpleparser/Parser.java +++ b/src/main/java/org/teachingextensions/simpleparser/Parser.java @@ -3,8 +3,8 @@ import java.lang.reflect.Field; import java.util.List; -import org.lambda.functions.Function1; -import org.lambda.query.Query; +import org.teachingkidsprogramming.util.lambda.Function1; +import org.teachingkidsprogramming.util.lambda.Query; import org.teachingkidsprogramming.util.ObjectUtils; import org.teachingkidsprogramming.util.io.FileUtils; diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/Approvals.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/Approvals.java index 0eb813c..f7ddf49 100644 --- a/src/main/java/org/teachingkidsprogramming/approvals/lite/Approvals.java +++ b/src/main/java/org/teachingkidsprogramming/approvals/lite/Approvals.java @@ -5,7 +5,7 @@ import org.teachingkidsprogramming.approvals.lite.namer.JUnitStackTraceNamer; import org.teachingkidsprogramming.approvals.lite.writers.ApprovalTextWriter; import org.teachingkidsprogramming.approvals.lite.writers.ImageApprovalWriter; -import org.lambda.functions.Function1; +import org.teachingkidsprogramming.util.lambda.Function1; import org.teachingkidsprogramming.util.ArrayUtils; import org.teachingkidsprogramming.util.ObjectUtils; import org.teachingkidsprogramming.util.StringUtils; diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/namer/NamerFactory.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/namer/NamerFactory.java index ae1f3aa..eb9ef74 100644 --- a/src/main/java/org/teachingkidsprogramming/approvals/lite/namer/NamerFactory.java +++ b/src/main/java/org/teachingkidsprogramming/approvals/lite/namer/NamerFactory.java @@ -1,6 +1,6 @@ package org.teachingkidsprogramming.approvals.lite.namer; -import org.lambda.functions.Function0; +import org.teachingkidsprogramming.util.lambda.Function0; public class NamerFactory { private static String additionalInformation; diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/namer/OsEnvironmentLabeller.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/namer/OsEnvironmentLabeller.java index bc6be58..f266195 100644 --- a/src/main/java/org/teachingkidsprogramming/approvals/lite/namer/OsEnvironmentLabeller.java +++ b/src/main/java/org/teachingkidsprogramming/approvals/lite/namer/OsEnvironmentLabeller.java @@ -1,6 +1,6 @@ package org.teachingkidsprogramming.approvals.lite.namer; -import org.lambda.functions.Function0; +import org.teachingkidsprogramming.util.lambda.Function0; public class OsEnvironmentLabeller implements Function0 { @Override diff --git a/src/main/java/org/teachingkidsprogramming/util/ArrayUtils.java b/src/main/java/org/teachingkidsprogramming/util/ArrayUtils.java index 3c0a002..eedc213 100644 --- a/src/main/java/org/teachingkidsprogramming/util/ArrayUtils.java +++ b/src/main/java/org/teachingkidsprogramming/util/ArrayUtils.java @@ -1,6 +1,6 @@ package org.teachingkidsprogramming.util; -import org.lambda.functions.Function1; +import org.teachingkidsprogramming.util.lambda.Function1; import java.util.*; import java.util.Comparator; diff --git a/src/main/java/org/teachingkidsprogramming/util/NumberUtils.java b/src/main/java/org/teachingkidsprogramming/util/NumberUtils.java index 89a55db..e3adde8 100644 --- a/src/main/java/org/teachingkidsprogramming/util/NumberUtils.java +++ b/src/main/java/org/teachingkidsprogramming/util/NumberUtils.java @@ -1,6 +1,5 @@ package org.teachingkidsprogramming.util; -import java.lang.reflect.Method; import java.util.Random; /** @@ -29,46 +28,12 @@ public static int load(String i, int defaultValue, boolean stripNonNumeric) { return defaultValue; } - public static double load(String i, double defaultValue) { - try { - i = StringUtils.stripNonNumeric(i, true, true); - defaultValue = Double.parseDouble(i); - } catch (Exception ignored) { - } - return defaultValue; - } - - public static boolean equals(double one, double two, double delta) { + public static boolean equals(double one, double two, double delta) { double actualDelta = one - two; return (-delta < actualDelta) && (actualDelta < delta); } - /** - * @deprecated use Query.sum() - */ - public static double sum(Object[] attribs, String methodName, - Object[] params) { - try { - if (attribs == null || attribs.length == 0) { - return 0.00; - } - Method method = MethodExecutionPath.Parameters.getBestFitMethod( - attribs[0].getClass(), - methodName, - params == null ? null : (Class[]) ObjectUtils.extractArray( - params, "getClass")); - double sum = 0; - for (Object attrib : attribs) { - sum += ((Number) method.invoke(attrib, params)) - .doubleValue(); - } - return sum; - } catch (Throwable t) { - throw ObjectUtils.throwAsError(t); - } - } - - /** + /** * randomly chooses a number between the minimum and maximum *
Example: * {@code int grade = NumberUtils.getRandomInt(1,100);}
diff --git a/src/main/java/org/teachingkidsprogramming/util/lambda/Function0.java b/src/main/java/org/teachingkidsprogramming/util/lambda/Function0.java new file mode 100644 index 0000000..3724842 --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/util/lambda/Function0.java @@ -0,0 +1,5 @@ +package org.teachingkidsprogramming.util.lambda; + +public interface Function0 { + public Out call(); +} diff --git a/src/main/java/org/teachingkidsprogramming/util/lambda/Function1.java b/src/main/java/org/teachingkidsprogramming/util/lambda/Function1.java new file mode 100644 index 0000000..0cc9f39 --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/util/lambda/Function1.java @@ -0,0 +1,5 @@ +package org.teachingkidsprogramming.util.lambda; + +public interface Function1 { + public Out call(In i); +} diff --git a/src/main/java/org/teachingkidsprogramming/util/lambda/Query.java b/src/main/java/org/teachingkidsprogramming/util/lambda/Query.java new file mode 100644 index 0000000..150d5df --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/util/lambda/Query.java @@ -0,0 +1,32 @@ +package org.teachingkidsprogramming.util.lambda; + +import org.teachingkidsprogramming.util.lambda.Function1; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class Query { + public static List select(List list, Function1 function) { + ArrayList out = new ArrayList<>(); + for (In i : list) { + out.add(function.call(i)); + } + return out; + } + + public static List select(In[] list, Function1 function) { + return select(Arrays.asList(list), function); + } + + public static List where(In[] list, Function1 funct) { + ArrayList out = new ArrayList<>(); + for (In i : list) { + if (funct.call(i)) { + out.add(i); + } + } + return out; + } + +} diff --git a/src/test/java/org/teachingextensions/logo/tests/TurtleTest.java b/src/test/java/org/teachingextensions/logo/tests/TurtleTest.java index 39d14ce..2c52122 100644 --- a/src/test/java/org/teachingextensions/logo/tests/TurtleTest.java +++ b/src/test/java/org/teachingextensions/logo/tests/TurtleTest.java @@ -8,7 +8,7 @@ import org.teachingkidsprogramming.approvals.lite.reporters.DelayedClipboardReporter; import org.teachingkidsprogramming.approvals.lite.reporters.DiffReporter; import org.teachingkidsprogramming.approvals.lite.reporters.UseReporter; -import org.lambda.functions.Function1; +import org.teachingkidsprogramming.util.lambda.Function1; import org.teachingextensions.logo.PenColors; import org.teachingextensions.logo.Turtle; import org.teachingextensions.logo.Wheel; From 34a63a89cad7286a43ab88759b29444bd0e63807 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Tue, 17 Mar 2015 16:23:08 -0700 Subject: [PATCH 067/111] moved approvals.lite --- .../approvals/lite/ApprovalApprover.java | 2 +- .../lite/ApprovalFailureOverrider.java | 2 +- .../lite/ApprovalFailureReporter.java | 2 +- .../lite/ApprovalReporterWithCleanUp.java | 2 +- .../approvals/lite/ApprovalWriter.java | 2 +- .../approvals/lite/Approvals.java | 20 +++++++++---------- .../approvals/lite/FileApprover.java | 6 +++--- .../approvals/lite/ReporterFactory.java | 4 ++-- .../approvals/lite/namer/ApprovalNamer.java | 2 +- .../approvals/lite/namer/ApprovalResults.java | 7 +++++++ .../lite/namer/JUnitStackTraceNamer.java | 2 +- .../approvals/lite/namer/NamerFactory.java | 2 +- .../lite/namer/OsEnvironmentLabeller.java | 2 +- .../lite/reporters/ClipboardReporter.java | 2 +- .../reporters/DelayedClipboardReporter.java | 2 +- .../lite/reporters/DiffReporter.java | 6 +++--- .../reporters/EnvironmentAwareReporter.java | 8 ++++++++ .../lite/reporters/FileLauncherReporter.java | 4 ++-- .../lite/reporters/FirstWorkingReporter.java | 2 +- .../lite/reporters/GenericDiffReporter.java | 2 +- .../lite/reporters/ImageReporter.java | 14 +++++++++++++ .../lite/reporters/ImageWebReporter.java | 2 +- .../lite/reporters/JunitReporter.java | 2 +- .../lite/reporters/MultiReporter.java | 4 ++-- .../lite/reporters/MultipleExceptions.java | 2 +- .../lite/reporters/QuietReporter.java | 2 +- .../approvals/lite/reporters/UseReporter.java | 4 ++-- .../reporters/macosx/DiffMergeReporter.java | 4 ++-- .../macosx/KaleidoscopeDiffReporter.java | 4 ++-- .../reporters/macosx/MacDiffReporter.java | 4 ++-- .../reporters/macosx/P4MergeReporter.java | 4 ++-- .../lite/reporters/macosx/TkDiffReporter.java | 4 ++-- .../windows/BeyondCompareReporter.java | 4 ++-- .../windows/TortoiseDiffReporter.java | 4 ++-- .../windows/TortoiseImageDiffReporter.java | 4 ++-- .../windows/TortoiseTextDiffReporter.java | 4 ++-- .../reporters/windows/WinMergeReporter.java | 4 ++-- .../windows/WindowsDiffReporter.java | 4 ++-- .../lite/writers/ApprovalTextWriter.java | 4 ++-- .../lite/writers/ComponentApprovalWriter.java | 4 ++-- .../lite/writers/ImageApprovalWriter.java | 4 ++-- .../approvals/lite/writers/Writer.java | 2 +- .../logo/ScreenCapture.java | 2 +- .../org/teachingextensions/logo/Turtle.java | 2 +- .../logo/utils/TortoiseUtils.java | 4 ++-- .../approvals/lite/namer/ApprovalResults.java | 10 ---------- .../reporters/EnvironmentAwareReporter.java | 8 -------- .../lite/reporters/ImageReporter.java | 14 ------------- .../logo/tests/ColorGeneration.java | 6 +++--- .../logo/tests/RecipeTests.java | 8 ++++---- .../logo/tests/TortoiseTest.java | 6 +++--- .../logo/tests/TurtlePanelTest.java | 8 ++++---- .../logo/tests/TurtleTest.java | 8 ++++---- .../logo/tests/WheelTest.java | 6 +++--- .../simpleparser/tests/ParserTest.java | 6 +++--- .../windows/tests/GraphicsWindowTest.java | 6 +++--- .../recipes/quizzes/tests/AdLibsQuizTest.java | 6 +++--- .../recipes/quizzes/tests/HiLowQuizTest.java | 6 +++--- .../recipes/quizzes/tests/HousesQuizTest.java | 6 +++--- .../quizzes/tests/PentagonCrazyQuizTest.java | 6 +++--- .../recipes/quizzes/tests/QuizBuzzTest.java | 6 +++--- .../quizzes/tests/SimpleBubbleQuizTest.java | 6 +++--- .../quizzes/tests/SimpleSquareQuizTest.java | 6 +++--- .../quizzes/tests/SpiderWebQuizTest.java | 6 +++--- .../recipes/quizzes/tests/TreeQuizTest.java | 6 +++--- 65 files changed, 157 insertions(+), 160 deletions(-) rename src/main/java/org/{teachingkidsprogramming => teachingextensions}/approvals/lite/ApprovalApprover.java (83%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions}/approvals/lite/ApprovalFailureOverrider.java (77%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions}/approvals/lite/ApprovalFailureReporter.java (69%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions}/approvals/lite/ApprovalReporterWithCleanUp.java (70%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions}/approvals/lite/ApprovalWriter.java (80%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions}/approvals/lite/Approvals.java (73%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions}/approvals/lite/FileApprover.java (91%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions}/approvals/lite/ReporterFactory.java (96%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions}/approvals/lite/namer/ApprovalNamer.java (63%) create mode 100644 src/main/java/org/teachingextensions/approvals/lite/namer/ApprovalResults.java rename src/main/java/org/{teachingkidsprogramming => teachingextensions}/approvals/lite/namer/JUnitStackTraceNamer.java (97%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions}/approvals/lite/namer/NamerFactory.java (90%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions}/approvals/lite/namer/OsEnvironmentLabeller.java (80%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions}/approvals/lite/reporters/ClipboardReporter.java (95%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions}/approvals/lite/reporters/DelayedClipboardReporter.java (93%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions}/approvals/lite/reporters/DiffReporter.java (53%) create mode 100644 src/main/java/org/teachingextensions/approvals/lite/reporters/EnvironmentAwareReporter.java rename src/main/java/org/{teachingkidsprogramming => teachingextensions}/approvals/lite/reporters/FileLauncherReporter.java (74%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions}/approvals/lite/reporters/FirstWorkingReporter.java (92%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions}/approvals/lite/reporters/GenericDiffReporter.java (98%) create mode 100644 src/main/java/org/teachingextensions/approvals/lite/reporters/ImageReporter.java rename src/main/java/org/{teachingkidsprogramming => teachingextensions}/approvals/lite/reporters/ImageWebReporter.java (94%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions}/approvals/lite/reporters/JunitReporter.java (93%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions}/approvals/lite/reporters/MultiReporter.java (86%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions}/approvals/lite/reporters/MultipleExceptions.java (94%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions}/approvals/lite/reporters/QuietReporter.java (86%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions}/approvals/lite/reporters/UseReporter.java (60%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions}/approvals/lite/reporters/macosx/DiffMergeReporter.java (80%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions}/approvals/lite/reporters/macosx/KaleidoscopeDiffReporter.java (84%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions}/approvals/lite/reporters/macosx/MacDiffReporter.java (66%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions}/approvals/lite/reporters/macosx/P4MergeReporter.java (89%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions}/approvals/lite/reporters/macosx/TkDiffReporter.java (80%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions}/approvals/lite/reporters/windows/BeyondCompareReporter.java (79%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions}/approvals/lite/reporters/windows/TortoiseDiffReporter.java (64%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions}/approvals/lite/reporters/windows/TortoiseImageDiffReporter.java (72%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions}/approvals/lite/reporters/windows/TortoiseTextDiffReporter.java (82%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions}/approvals/lite/reporters/windows/WinMergeReporter.java (77%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions}/approvals/lite/reporters/windows/WindowsDiffReporter.java (65%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions}/approvals/lite/writers/ApprovalTextWriter.java (87%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions}/approvals/lite/writers/ComponentApprovalWriter.java (90%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions}/approvals/lite/writers/ImageApprovalWriter.java (84%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions}/approvals/lite/writers/Writer.java (67%) delete mode 100644 src/main/java/org/teachingkidsprogramming/approvals/lite/namer/ApprovalResults.java delete mode 100644 src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/EnvironmentAwareReporter.java delete mode 100644 src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/ImageReporter.java diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/ApprovalApprover.java b/src/main/java/org/teachingextensions/approvals/lite/ApprovalApprover.java similarity index 83% rename from src/main/java/org/teachingkidsprogramming/approvals/lite/ApprovalApprover.java rename to src/main/java/org/teachingextensions/approvals/lite/ApprovalApprover.java index 29f4438..41cf25b 100644 --- a/src/main/java/org/teachingkidsprogramming/approvals/lite/ApprovalApprover.java +++ b/src/main/java/org/teachingextensions/approvals/lite/ApprovalApprover.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.approvals.lite; +package org.teachingextensions.approvals.lite; public interface ApprovalApprover { boolean approve() throws Exception; diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/ApprovalFailureOverrider.java b/src/main/java/org/teachingextensions/approvals/lite/ApprovalFailureOverrider.java similarity index 77% rename from src/main/java/org/teachingkidsprogramming/approvals/lite/ApprovalFailureOverrider.java rename to src/main/java/org/teachingextensions/approvals/lite/ApprovalFailureOverrider.java index 1a5f6d1..02fe5d5 100644 --- a/src/main/java/org/teachingkidsprogramming/approvals/lite/ApprovalFailureOverrider.java +++ b/src/main/java/org/teachingextensions/approvals/lite/ApprovalFailureOverrider.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.approvals.lite; +package org.teachingextensions.approvals.lite; public interface ApprovalFailureOverrider extends ApprovalFailureReporter { diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/ApprovalFailureReporter.java b/src/main/java/org/teachingextensions/approvals/lite/ApprovalFailureReporter.java similarity index 69% rename from src/main/java/org/teachingkidsprogramming/approvals/lite/ApprovalFailureReporter.java rename to src/main/java/org/teachingextensions/approvals/lite/ApprovalFailureReporter.java index a15524e..7f648b7 100644 --- a/src/main/java/org/teachingkidsprogramming/approvals/lite/ApprovalFailureReporter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/ApprovalFailureReporter.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.approvals.lite; +package org.teachingextensions.approvals.lite; public interface ApprovalFailureReporter { public void report(String received, String approved) throws Exception; diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/ApprovalReporterWithCleanUp.java b/src/main/java/org/teachingextensions/approvals/lite/ApprovalReporterWithCleanUp.java similarity index 70% rename from src/main/java/org/teachingkidsprogramming/approvals/lite/ApprovalReporterWithCleanUp.java rename to src/main/java/org/teachingextensions/approvals/lite/ApprovalReporterWithCleanUp.java index d7842b6..1015490 100644 --- a/src/main/java/org/teachingkidsprogramming/approvals/lite/ApprovalReporterWithCleanUp.java +++ b/src/main/java/org/teachingextensions/approvals/lite/ApprovalReporterWithCleanUp.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.approvals.lite; +package org.teachingextensions.approvals.lite; public interface ApprovalReporterWithCleanUp { public void cleanUp(String received, String approved) throws Exception; diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/ApprovalWriter.java b/src/main/java/org/teachingextensions/approvals/lite/ApprovalWriter.java similarity index 80% rename from src/main/java/org/teachingkidsprogramming/approvals/lite/ApprovalWriter.java rename to src/main/java/org/teachingextensions/approvals/lite/ApprovalWriter.java index 1035ffa..4b94c2a 100644 --- a/src/main/java/org/teachingkidsprogramming/approvals/lite/ApprovalWriter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/ApprovalWriter.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.approvals.lite; +package org.teachingextensions.approvals.lite; public interface ApprovalWriter { diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/Approvals.java b/src/main/java/org/teachingextensions/approvals/lite/Approvals.java similarity index 73% rename from src/main/java/org/teachingkidsprogramming/approvals/lite/Approvals.java rename to src/main/java/org/teachingextensions/approvals/lite/Approvals.java index f7ddf49..97e3131 100644 --- a/src/main/java/org/teachingkidsprogramming/approvals/lite/Approvals.java +++ b/src/main/java/org/teachingextensions/approvals/lite/Approvals.java @@ -1,10 +1,10 @@ -package org.teachingkidsprogramming.approvals.lite; +package org.teachingextensions.approvals.lite; -import org.teachingkidsprogramming.approvals.lite.ReporterFactory.FileTypes; -import org.teachingkidsprogramming.approvals.lite.namer.ApprovalNamer; -import org.teachingkidsprogramming.approvals.lite.namer.JUnitStackTraceNamer; -import org.teachingkidsprogramming.approvals.lite.writers.ApprovalTextWriter; -import org.teachingkidsprogramming.approvals.lite.writers.ImageApprovalWriter; +import org.teachingextensions.approvals.lite.ReporterFactory.FileTypes; +import org.teachingextensions.approvals.lite.namer.ApprovalNamer; +import org.teachingextensions.approvals.lite.namer.JUnitStackTraceNamer; +import org.teachingextensions.approvals.lite.writers.ApprovalTextWriter; +import org.teachingextensions.approvals.lite.writers.ImageApprovalWriter; import org.teachingkidsprogramming.util.lambda.Function1; import org.teachingkidsprogramming.util.ArrayUtils; import org.teachingkidsprogramming.util.ObjectUtils; @@ -41,13 +41,13 @@ public static void verify(BufferedImage bufferedImage) { verify(new ImageApprovalWriter(bufferedImage), FileTypes.Image); } - public static void verify(ApprovalWriter writter, ApprovalNamer namer, + public static void verify(ApprovalWriter writer, ApprovalNamer namer, ApprovalFailureReporter reporter) { - verify(new FileApprover(writter, namer), reporter); + verify(new FileApprover(writer, namer), reporter); } - public static void verify(ApprovalWriter writter, String fileType) { - verify(writter, createApprovalNamer(), ReporterFactory.get(fileType)); + public static void verify(ApprovalWriter writer, String fileType) { + verify(writer, createApprovalNamer(), ReporterFactory.get(fileType)); } public static void verify(FileApprover approver, diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/FileApprover.java b/src/main/java/org/teachingextensions/approvals/lite/FileApprover.java similarity index 91% rename from src/main/java/org/teachingkidsprogramming/approvals/lite/FileApprover.java rename to src/main/java/org/teachingextensions/approvals/lite/FileApprover.java index ce57ac7..c829f3b 100644 --- a/src/main/java/org/teachingkidsprogramming/approvals/lite/FileApprover.java +++ b/src/main/java/org/teachingextensions/approvals/lite/FileApprover.java @@ -1,8 +1,8 @@ -package org.teachingkidsprogramming.approvals.lite; +package org.teachingextensions.approvals.lite; import junit.framework.TestCase; -import org.teachingkidsprogramming.approvals.lite.namer.ApprovalNamer; -import org.teachingkidsprogramming.approvals.lite.namer.NamerFactory; +import org.teachingextensions.approvals.lite.namer.ApprovalNamer; +import org.teachingextensions.approvals.lite.namer.NamerFactory; import org.teachingkidsprogramming.util.ObjectUtils; import org.teachingkidsprogramming.util.io.FileUtils; diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/ReporterFactory.java b/src/main/java/org/teachingextensions/approvals/lite/ReporterFactory.java similarity index 96% rename from src/main/java/org/teachingkidsprogramming/approvals/lite/ReporterFactory.java rename to src/main/java/org/teachingextensions/approvals/lite/ReporterFactory.java index 2f62120..070109e 100644 --- a/src/main/java/org/teachingkidsprogramming/approvals/lite/ReporterFactory.java +++ b/src/main/java/org/teachingextensions/approvals/lite/ReporterFactory.java @@ -1,6 +1,6 @@ -package org.teachingkidsprogramming.approvals.lite; +package org.teachingextensions.approvals.lite; -import org.teachingkidsprogramming.approvals.lite.reporters.*; +import org.teachingextensions.approvals.lite.reporters.*; import org.teachingkidsprogramming.util.ClassUtils; import java.lang.annotation.Annotation; diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/namer/ApprovalNamer.java b/src/main/java/org/teachingextensions/approvals/lite/namer/ApprovalNamer.java similarity index 63% rename from src/main/java/org/teachingkidsprogramming/approvals/lite/namer/ApprovalNamer.java rename to src/main/java/org/teachingextensions/approvals/lite/namer/ApprovalNamer.java index 999a0dc..22c2b77 100644 --- a/src/main/java/org/teachingkidsprogramming/approvals/lite/namer/ApprovalNamer.java +++ b/src/main/java/org/teachingextensions/approvals/lite/namer/ApprovalNamer.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.approvals.lite.namer; +package org.teachingextensions.approvals.lite.namer; public interface ApprovalNamer { String getApprovalName(); diff --git a/src/main/java/org/teachingextensions/approvals/lite/namer/ApprovalResults.java b/src/main/java/org/teachingextensions/approvals/lite/namer/ApprovalResults.java new file mode 100644 index 0000000..aadce2c --- /dev/null +++ b/src/main/java/org/teachingextensions/approvals/lite/namer/ApprovalResults.java @@ -0,0 +1,7 @@ +package org.teachingextensions.approvals.lite.namer; + +public class ApprovalResults { + public static void UniqueForOs() { + NamerFactory.asMachineSpecificTest(new OsEnvironmentLabeller()); + } +} diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/namer/JUnitStackTraceNamer.java b/src/main/java/org/teachingextensions/approvals/lite/namer/JUnitStackTraceNamer.java similarity index 97% rename from src/main/java/org/teachingkidsprogramming/approvals/lite/namer/JUnitStackTraceNamer.java rename to src/main/java/org/teachingextensions/approvals/lite/namer/JUnitStackTraceNamer.java index 77608be..1f1a3dc 100644 --- a/src/main/java/org/teachingkidsprogramming/approvals/lite/namer/JUnitStackTraceNamer.java +++ b/src/main/java/org/teachingextensions/approvals/lite/namer/JUnitStackTraceNamer.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.approvals.lite.namer; +package org.teachingextensions.approvals.lite.namer; import junit.framework.TestCase; import org.junit.Test; diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/namer/NamerFactory.java b/src/main/java/org/teachingextensions/approvals/lite/namer/NamerFactory.java similarity index 90% rename from src/main/java/org/teachingkidsprogramming/approvals/lite/namer/NamerFactory.java rename to src/main/java/org/teachingextensions/approvals/lite/namer/NamerFactory.java index eb9ef74..f8d11f0 100644 --- a/src/main/java/org/teachingkidsprogramming/approvals/lite/namer/NamerFactory.java +++ b/src/main/java/org/teachingextensions/approvals/lite/namer/NamerFactory.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.approvals.lite.namer; +package org.teachingextensions.approvals.lite.namer; import org.teachingkidsprogramming.util.lambda.Function0; diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/namer/OsEnvironmentLabeller.java b/src/main/java/org/teachingextensions/approvals/lite/namer/OsEnvironmentLabeller.java similarity index 80% rename from src/main/java/org/teachingkidsprogramming/approvals/lite/namer/OsEnvironmentLabeller.java rename to src/main/java/org/teachingextensions/approvals/lite/namer/OsEnvironmentLabeller.java index f266195..6de99b8 100644 --- a/src/main/java/org/teachingkidsprogramming/approvals/lite/namer/OsEnvironmentLabeller.java +++ b/src/main/java/org/teachingextensions/approvals/lite/namer/OsEnvironmentLabeller.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.approvals.lite.namer; +package org.teachingextensions.approvals.lite.namer; import org.teachingkidsprogramming.util.lambda.Function0; diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/ClipboardReporter.java b/src/main/java/org/teachingextensions/approvals/lite/reporters/ClipboardReporter.java similarity index 95% rename from src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/ClipboardReporter.java rename to src/main/java/org/teachingextensions/approvals/lite/reporters/ClipboardReporter.java index e354520..d9f1b67 100644 --- a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/ClipboardReporter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/reporters/ClipboardReporter.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.approvals.lite.reporters; +package org.teachingextensions.approvals.lite.reporters; import org.teachingkidsprogramming.util.SystemUtils; import org.teachingkidsprogramming.util.WindowUtils; diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/DelayedClipboardReporter.java b/src/main/java/org/teachingextensions/approvals/lite/reporters/DelayedClipboardReporter.java similarity index 93% rename from src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/DelayedClipboardReporter.java rename to src/main/java/org/teachingextensions/approvals/lite/reporters/DelayedClipboardReporter.java index 87d121c..052ee40 100644 --- a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/DelayedClipboardReporter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/reporters/DelayedClipboardReporter.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.approvals.lite.reporters; +package org.teachingextensions.approvals.lite.reporters; import java.awt.GraphicsEnvironment; diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/DiffReporter.java b/src/main/java/org/teachingextensions/approvals/lite/reporters/DiffReporter.java similarity index 53% rename from src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/DiffReporter.java rename to src/main/java/org/teachingextensions/approvals/lite/reporters/DiffReporter.java index b3c35a6..6985623 100644 --- a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/DiffReporter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/reporters/DiffReporter.java @@ -1,7 +1,7 @@ -package org.teachingkidsprogramming.approvals.lite.reporters; +package org.teachingextensions.approvals.lite.reporters; -import org.teachingkidsprogramming.approvals.lite.reporters.macosx.MacDiffReporter; -import org.teachingkidsprogramming.approvals.lite.reporters.windows.WindowsDiffReporter; +import org.teachingextensions.approvals.lite.reporters.macosx.MacDiffReporter; +import org.teachingextensions.approvals.lite.reporters.windows.WindowsDiffReporter; public class DiffReporter extends FirstWorkingReporter { diff --git a/src/main/java/org/teachingextensions/approvals/lite/reporters/EnvironmentAwareReporter.java b/src/main/java/org/teachingextensions/approvals/lite/reporters/EnvironmentAwareReporter.java new file mode 100644 index 0000000..a83c781 --- /dev/null +++ b/src/main/java/org/teachingextensions/approvals/lite/reporters/EnvironmentAwareReporter.java @@ -0,0 +1,8 @@ +package org.teachingextensions.approvals.lite.reporters; + +import org.teachingextensions.approvals.lite.ApprovalFailureReporter; + +public interface EnvironmentAwareReporter extends ApprovalFailureReporter +{ + boolean isWorkingInThisEnvironment(String forFile); +} diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/FileLauncherReporter.java b/src/main/java/org/teachingextensions/approvals/lite/reporters/FileLauncherReporter.java similarity index 74% rename from src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/FileLauncherReporter.java rename to src/main/java/org/teachingextensions/approvals/lite/reporters/FileLauncherReporter.java index 3325852..9527ca6 100644 --- a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/FileLauncherReporter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/reporters/FileLauncherReporter.java @@ -1,7 +1,7 @@ -package org.teachingkidsprogramming.approvals.lite.reporters; +package org.teachingextensions.approvals.lite.reporters; -import org.teachingkidsprogramming.approvals.lite.ApprovalFailureReporter; +import org.teachingextensions.approvals.lite.ApprovalFailureReporter; import org.teachingkidsprogramming.util.TestUtils; import org.teachingkidsprogramming.util.io.FileUtils; diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/FirstWorkingReporter.java b/src/main/java/org/teachingextensions/approvals/lite/reporters/FirstWorkingReporter.java similarity index 92% rename from src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/FirstWorkingReporter.java rename to src/main/java/org/teachingextensions/approvals/lite/reporters/FirstWorkingReporter.java index ba1e2a9..c0d5334 100644 --- a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/FirstWorkingReporter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/reporters/FirstWorkingReporter.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.approvals.lite.reporters; +package org.teachingextensions.approvals.lite.reporters; public class FirstWorkingReporter implements EnvironmentAwareReporter { diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/GenericDiffReporter.java b/src/main/java/org/teachingextensions/approvals/lite/reporters/GenericDiffReporter.java similarity index 98% rename from src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/GenericDiffReporter.java rename to src/main/java/org/teachingextensions/approvals/lite/reporters/GenericDiffReporter.java index 9ea7b62..63793c3 100644 --- a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/GenericDiffReporter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/reporters/GenericDiffReporter.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.approvals.lite.reporters; +package org.teachingextensions.approvals.lite.reporters; import java.io.File; import java.io.IOException; diff --git a/src/main/java/org/teachingextensions/approvals/lite/reporters/ImageReporter.java b/src/main/java/org/teachingextensions/approvals/lite/reporters/ImageReporter.java new file mode 100644 index 0000000..d3f0000 --- /dev/null +++ b/src/main/java/org/teachingextensions/approvals/lite/reporters/ImageReporter.java @@ -0,0 +1,14 @@ +package org.teachingextensions.approvals.lite.reporters; + +import org.teachingextensions.approvals.lite.reporters.macosx.KaleidoscopeDiffReporter; +import org.teachingextensions.approvals.lite.reporters.windows.BeyondCompareReporter; +import org.teachingextensions.approvals.lite.reporters.windows.TortoiseImageDiffReporter; + +public class ImageReporter extends FirstWorkingReporter +{ + public ImageReporter() + { + super(TortoiseImageDiffReporter.INSTANCE, BeyondCompareReporter.INSTANCE, KaleidoscopeDiffReporter.INSTANCE, + ImageWebReporter.INSTANCE, QuietReporter.INSTANCE); + } +} diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/ImageWebReporter.java b/src/main/java/org/teachingextensions/approvals/lite/reporters/ImageWebReporter.java similarity index 94% rename from src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/ImageWebReporter.java rename to src/main/java/org/teachingextensions/approvals/lite/reporters/ImageWebReporter.java index e78f130..164ae3b 100644 --- a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/ImageWebReporter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/reporters/ImageWebReporter.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.approvals.lite.reporters; +package org.teachingextensions.approvals.lite.reporters; import java.awt.GraphicsEnvironment; diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/JunitReporter.java b/src/main/java/org/teachingextensions/approvals/lite/reporters/JunitReporter.java similarity index 93% rename from src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/JunitReporter.java rename to src/main/java/org/teachingextensions/approvals/lite/reporters/JunitReporter.java index 961eef4..3e53c7d 100644 --- a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/JunitReporter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/reporters/JunitReporter.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.approvals.lite.reporters; +package org.teachingextensions.approvals.lite.reporters; import java.io.File; diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/MultiReporter.java b/src/main/java/org/teachingextensions/approvals/lite/reporters/MultiReporter.java similarity index 86% rename from src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/MultiReporter.java rename to src/main/java/org/teachingextensions/approvals/lite/reporters/MultiReporter.java index f39ee5c..6e0019c 100644 --- a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/MultiReporter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/reporters/MultiReporter.java @@ -1,6 +1,6 @@ -package org.teachingkidsprogramming.approvals.lite.reporters; +package org.teachingextensions.approvals.lite.reporters; -import org.teachingkidsprogramming.approvals.lite.ApprovalFailureReporter; +import org.teachingextensions.approvals.lite.ApprovalFailureReporter; import java.util.ArrayList; import java.util.Collection; diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/MultipleExceptions.java b/src/main/java/org/teachingextensions/approvals/lite/reporters/MultipleExceptions.java similarity index 94% rename from src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/MultipleExceptions.java rename to src/main/java/org/teachingextensions/approvals/lite/reporters/MultipleExceptions.java index c279a2e..9df58a2 100644 --- a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/MultipleExceptions.java +++ b/src/main/java/org/teachingextensions/approvals/lite/reporters/MultipleExceptions.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.approvals.lite.reporters; +package org.teachingextensions.approvals.lite.reporters; import java.util.ArrayList; diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/QuietReporter.java b/src/main/java/org/teachingextensions/approvals/lite/reporters/QuietReporter.java similarity index 86% rename from src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/QuietReporter.java rename to src/main/java/org/teachingextensions/approvals/lite/reporters/QuietReporter.java index bdbab8c..b1677d7 100644 --- a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/QuietReporter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/reporters/QuietReporter.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.approvals.lite.reporters; +package org.teachingextensions.approvals.lite.reporters; public class QuietReporter implements EnvironmentAwareReporter { diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/UseReporter.java b/src/main/java/org/teachingextensions/approvals/lite/reporters/UseReporter.java similarity index 60% rename from src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/UseReporter.java rename to src/main/java/org/teachingextensions/approvals/lite/reporters/UseReporter.java index 56c56b8..bc4901e 100644 --- a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/UseReporter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/reporters/UseReporter.java @@ -1,6 +1,6 @@ -package org.teachingkidsprogramming.approvals.lite.reporters; +package org.teachingextensions.approvals.lite.reporters; -import org.teachingkidsprogramming.approvals.lite.ApprovalFailureReporter; +import org.teachingextensions.approvals.lite.ApprovalFailureReporter; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/macosx/DiffMergeReporter.java b/src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/DiffMergeReporter.java similarity index 80% rename from src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/macosx/DiffMergeReporter.java rename to src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/DiffMergeReporter.java index a0b8524..a055511 100644 --- a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/macosx/DiffMergeReporter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/DiffMergeReporter.java @@ -1,8 +1,8 @@ -package org.teachingkidsprogramming.approvals.lite.reporters.macosx; +package org.teachingextensions.approvals.lite.reporters.macosx; import java.text.MessageFormat; -import org.teachingkidsprogramming.approvals.lite.reporters.GenericDiffReporter; +import org.teachingextensions.approvals.lite.reporters.GenericDiffReporter; public class DiffMergeReporter extends GenericDiffReporter { diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/macosx/KaleidoscopeDiffReporter.java b/src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/KaleidoscopeDiffReporter.java similarity index 84% rename from src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/macosx/KaleidoscopeDiffReporter.java rename to src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/KaleidoscopeDiffReporter.java index d0dc34f..4dcecb5 100644 --- a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/macosx/KaleidoscopeDiffReporter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/KaleidoscopeDiffReporter.java @@ -1,6 +1,6 @@ -package org.teachingkidsprogramming.approvals.lite.reporters.macosx; +package org.teachingextensions.approvals.lite.reporters.macosx; -import org.teachingkidsprogramming.approvals.lite.reporters.GenericDiffReporter; +import org.teachingextensions.approvals.lite.reporters.GenericDiffReporter; import org.teachingkidsprogramming.util.ArrayUtils; import java.text.MessageFormat; diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/macosx/MacDiffReporter.java b/src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/MacDiffReporter.java similarity index 66% rename from src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/macosx/MacDiffReporter.java rename to src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/MacDiffReporter.java index 4748231..c899b01 100644 --- a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/macosx/MacDiffReporter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/MacDiffReporter.java @@ -1,6 +1,6 @@ -package org.teachingkidsprogramming.approvals.lite.reporters.macosx; +package org.teachingextensions.approvals.lite.reporters.macosx; -import org.teachingkidsprogramming.approvals.lite.reporters.FirstWorkingReporter; +import org.teachingextensions.approvals.lite.reporters.FirstWorkingReporter; public class MacDiffReporter extends FirstWorkingReporter { diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/macosx/P4MergeReporter.java b/src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/P4MergeReporter.java similarity index 89% rename from src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/macosx/P4MergeReporter.java rename to src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/P4MergeReporter.java index 4992561..286e36c 100644 --- a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/macosx/P4MergeReporter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/P4MergeReporter.java @@ -1,9 +1,9 @@ -package org.teachingkidsprogramming.approvals.lite.reporters.macosx; +package org.teachingextensions.approvals.lite.reporters.macosx; import java.text.MessageFormat; import java.util.List; -import org.teachingkidsprogramming.approvals.lite.reporters.GenericDiffReporter; +import org.teachingextensions.approvals.lite.reporters.GenericDiffReporter; import org.teachingkidsprogramming.util.ArrayUtils; diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/macosx/TkDiffReporter.java b/src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/TkDiffReporter.java similarity index 80% rename from src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/macosx/TkDiffReporter.java rename to src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/TkDiffReporter.java index a7c8c29..6fb1d1e 100644 --- a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/macosx/TkDiffReporter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/TkDiffReporter.java @@ -1,8 +1,8 @@ -package org.teachingkidsprogramming.approvals.lite.reporters.macosx; +package org.teachingextensions.approvals.lite.reporters.macosx; import java.text.MessageFormat; -import org.teachingkidsprogramming.approvals.lite.reporters.GenericDiffReporter; +import org.teachingextensions.approvals.lite.reporters.GenericDiffReporter; public class TkDiffReporter extends GenericDiffReporter { diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/windows/BeyondCompareReporter.java b/src/main/java/org/teachingextensions/approvals/lite/reporters/windows/BeyondCompareReporter.java similarity index 79% rename from src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/windows/BeyondCompareReporter.java rename to src/main/java/org/teachingextensions/approvals/lite/reporters/windows/BeyondCompareReporter.java index ebb2403..4634397 100644 --- a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/windows/BeyondCompareReporter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/reporters/windows/BeyondCompareReporter.java @@ -1,8 +1,8 @@ -package org.teachingkidsprogramming.approvals.lite.reporters.windows; +package org.teachingextensions.approvals.lite.reporters.windows; import java.text.MessageFormat; -import org.teachingkidsprogramming.approvals.lite.reporters.GenericDiffReporter; +import org.teachingextensions.approvals.lite.reporters.GenericDiffReporter; public class BeyondCompareReporter extends GenericDiffReporter { diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/windows/TortoiseDiffReporter.java b/src/main/java/org/teachingextensions/approvals/lite/reporters/windows/TortoiseDiffReporter.java similarity index 64% rename from src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/windows/TortoiseDiffReporter.java rename to src/main/java/org/teachingextensions/approvals/lite/reporters/windows/TortoiseDiffReporter.java index 4b86b87..8b058f3 100644 --- a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/windows/TortoiseDiffReporter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/reporters/windows/TortoiseDiffReporter.java @@ -1,6 +1,6 @@ -package org.teachingkidsprogramming.approvals.lite.reporters.windows; +package org.teachingextensions.approvals.lite.reporters.windows; -import org.teachingkidsprogramming.approvals.lite.reporters.FirstWorkingReporter; +import org.teachingextensions.approvals.lite.reporters.FirstWorkingReporter; public class TortoiseDiffReporter extends FirstWorkingReporter { diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/windows/TortoiseImageDiffReporter.java b/src/main/java/org/teachingextensions/approvals/lite/reporters/windows/TortoiseImageDiffReporter.java similarity index 72% rename from src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/windows/TortoiseImageDiffReporter.java rename to src/main/java/org/teachingextensions/approvals/lite/reporters/windows/TortoiseImageDiffReporter.java index 7b46a3e..1036eb2 100644 --- a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/windows/TortoiseImageDiffReporter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/reporters/windows/TortoiseImageDiffReporter.java @@ -1,6 +1,6 @@ -package org.teachingkidsprogramming.approvals.lite.reporters.windows; +package org.teachingextensions.approvals.lite.reporters.windows; -import org.teachingkidsprogramming.approvals.lite.reporters.GenericDiffReporter; +import org.teachingextensions.approvals.lite.reporters.GenericDiffReporter; public class TortoiseImageDiffReporter extends GenericDiffReporter { public static final TortoiseImageDiffReporter INSTANCE = new TortoiseImageDiffReporter(); diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/windows/TortoiseTextDiffReporter.java b/src/main/java/org/teachingextensions/approvals/lite/reporters/windows/TortoiseTextDiffReporter.java similarity index 82% rename from src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/windows/TortoiseTextDiffReporter.java rename to src/main/java/org/teachingextensions/approvals/lite/reporters/windows/TortoiseTextDiffReporter.java index ef64134..fda4bb4 100644 --- a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/windows/TortoiseTextDiffReporter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/reporters/windows/TortoiseTextDiffReporter.java @@ -1,6 +1,6 @@ -package org.teachingkidsprogramming.approvals.lite.reporters.windows; +package org.teachingextensions.approvals.lite.reporters.windows; -import org.teachingkidsprogramming.approvals.lite.reporters.GenericDiffReporter; +import org.teachingextensions.approvals.lite.reporters.GenericDiffReporter; import java.text.MessageFormat; diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/windows/WinMergeReporter.java b/src/main/java/org/teachingextensions/approvals/lite/reporters/windows/WinMergeReporter.java similarity index 77% rename from src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/windows/WinMergeReporter.java rename to src/main/java/org/teachingextensions/approvals/lite/reporters/windows/WinMergeReporter.java index b95e245..f6f3a96 100644 --- a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/windows/WinMergeReporter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/reporters/windows/WinMergeReporter.java @@ -1,6 +1,6 @@ -package org.teachingkidsprogramming.approvals.lite.reporters.windows; +package org.teachingextensions.approvals.lite.reporters.windows; -import org.teachingkidsprogramming.approvals.lite.reporters.GenericDiffReporter; +import org.teachingextensions.approvals.lite.reporters.GenericDiffReporter; import java.text.MessageFormat; diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/windows/WindowsDiffReporter.java b/src/main/java/org/teachingextensions/approvals/lite/reporters/windows/WindowsDiffReporter.java similarity index 65% rename from src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/windows/WindowsDiffReporter.java rename to src/main/java/org/teachingextensions/approvals/lite/reporters/windows/WindowsDiffReporter.java index 8c46296..cc9ee40 100644 --- a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/windows/WindowsDiffReporter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/reporters/windows/WindowsDiffReporter.java @@ -1,6 +1,6 @@ -package org.teachingkidsprogramming.approvals.lite.reporters.windows; +package org.teachingextensions.approvals.lite.reporters.windows; -import org.teachingkidsprogramming.approvals.lite.reporters.FirstWorkingReporter; +import org.teachingextensions.approvals.lite.reporters.FirstWorkingReporter; public class WindowsDiffReporter extends FirstWorkingReporter { diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/writers/ApprovalTextWriter.java b/src/main/java/org/teachingextensions/approvals/lite/writers/ApprovalTextWriter.java similarity index 87% rename from src/main/java/org/teachingkidsprogramming/approvals/lite/writers/ApprovalTextWriter.java rename to src/main/java/org/teachingextensions/approvals/lite/writers/ApprovalTextWriter.java index f62d2f9..406b9e7 100644 --- a/src/main/java/org/teachingkidsprogramming/approvals/lite/writers/ApprovalTextWriter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/writers/ApprovalTextWriter.java @@ -1,6 +1,6 @@ -package org.teachingkidsprogramming.approvals.lite.writers; +package org.teachingextensions.approvals.lite.writers; -import org.teachingkidsprogramming.approvals.lite.ApprovalWriter; +import org.teachingextensions.approvals.lite.ApprovalWriter; import org.teachingkidsprogramming.util.io.FileUtils; import java.io.File; diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/writers/ComponentApprovalWriter.java b/src/main/java/org/teachingextensions/approvals/lite/writers/ComponentApprovalWriter.java similarity index 90% rename from src/main/java/org/teachingkidsprogramming/approvals/lite/writers/ComponentApprovalWriter.java rename to src/main/java/org/teachingextensions/approvals/lite/writers/ComponentApprovalWriter.java index 11ad7ac..df1e8a6 100644 --- a/src/main/java/org/teachingkidsprogramming/approvals/lite/writers/ComponentApprovalWriter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/writers/ComponentApprovalWriter.java @@ -1,6 +1,6 @@ -package org.teachingkidsprogramming.approvals.lite.writers; +package org.teachingextensions.approvals.lite.writers; -import org.teachingkidsprogramming.approvals.lite.ApprovalWriter; +import org.teachingextensions.approvals.lite.ApprovalWriter; import javax.swing.*; import java.awt.*; diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/writers/ImageApprovalWriter.java b/src/main/java/org/teachingextensions/approvals/lite/writers/ImageApprovalWriter.java similarity index 84% rename from src/main/java/org/teachingkidsprogramming/approvals/lite/writers/ImageApprovalWriter.java rename to src/main/java/org/teachingextensions/approvals/lite/writers/ImageApprovalWriter.java index 8dca7ba..de6764c 100644 --- a/src/main/java/org/teachingkidsprogramming/approvals/lite/writers/ImageApprovalWriter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/writers/ImageApprovalWriter.java @@ -1,6 +1,6 @@ -package org.teachingkidsprogramming.approvals.lite.writers; +package org.teachingextensions.approvals.lite.writers; -import org.teachingkidsprogramming.approvals.lite.ApprovalWriter; +import org.teachingextensions.approvals.lite.ApprovalWriter; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/writers/Writer.java b/src/main/java/org/teachingextensions/approvals/lite/writers/Writer.java similarity index 67% rename from src/main/java/org/teachingkidsprogramming/approvals/lite/writers/Writer.java rename to src/main/java/org/teachingextensions/approvals/lite/writers/Writer.java index b19a4d6..2026b4a 100644 --- a/src/main/java/org/teachingkidsprogramming/approvals/lite/writers/Writer.java +++ b/src/main/java/org/teachingextensions/approvals/lite/writers/Writer.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.approvals.lite.writers; +package org.teachingextensions.approvals.lite.writers; public interface Writer { final static String received = ".received"; diff --git a/src/main/java/org/teachingextensions/logo/ScreenCapture.java b/src/main/java/org/teachingextensions/logo/ScreenCapture.java index 2224217..a63bbb8 100644 --- a/src/main/java/org/teachingextensions/logo/ScreenCapture.java +++ b/src/main/java/org/teachingextensions/logo/ScreenCapture.java @@ -5,7 +5,7 @@ import java.awt.Image; import java.awt.image.BufferedImage; -import org.teachingkidsprogramming.approvals.lite.writers.ComponentApprovalWriter; +import org.teachingextensions.approvals.lite.writers.ComponentApprovalWriter; public class ScreenCapture { diff --git a/src/main/java/org/teachingextensions/logo/Turtle.java b/src/main/java/org/teachingextensions/logo/Turtle.java index 0360629..989827e 100644 --- a/src/main/java/org/teachingextensions/logo/Turtle.java +++ b/src/main/java/org/teachingextensions/logo/Turtle.java @@ -9,7 +9,7 @@ import javax.swing.JFrame; -import org.teachingkidsprogramming.approvals.lite.writers.ComponentApprovalWriter; +import org.teachingextensions.approvals.lite.writers.ComponentApprovalWriter; import org.teachingkidsprogramming.util.lambda.Action0; import org.teachingextensions.windows.ProgramWindow; diff --git a/src/main/java/org/teachingextensions/logo/utils/TortoiseUtils.java b/src/main/java/org/teachingextensions/logo/utils/TortoiseUtils.java index 086d0c4..f0817fe 100644 --- a/src/main/java/org/teachingextensions/logo/utils/TortoiseUtils.java +++ b/src/main/java/org/teachingextensions/logo/utils/TortoiseUtils.java @@ -1,7 +1,7 @@ package org.teachingextensions.logo.utils; -import org.teachingkidsprogramming.approvals.lite.Approvals; -import org.teachingkidsprogramming.approvals.lite.namer.ApprovalResults; +import org.teachingextensions.approvals.lite.Approvals; +import org.teachingextensions.approvals.lite.namer.ApprovalResults; import org.teachingextensions.logo.Turtle; import org.teachingkidsprogramming.util.ObjectUtils; diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/namer/ApprovalResults.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/namer/ApprovalResults.java deleted file mode 100644 index f216bc5..0000000 --- a/src/main/java/org/teachingkidsprogramming/approvals/lite/namer/ApprovalResults.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.teachingkidsprogramming.approvals.lite.namer; - -import org.teachingkidsprogramming.approvals.lite.namer.NamerFactory; -import org.teachingkidsprogramming.approvals.lite.namer.OsEnvironmentLabeller; - -public class ApprovalResults { - public static void UniqueForOs() { - NamerFactory.asMachineSpecificTest(new OsEnvironmentLabeller()); - } -} diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/EnvironmentAwareReporter.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/EnvironmentAwareReporter.java deleted file mode 100644 index 4579d51..0000000 --- a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/EnvironmentAwareReporter.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.teachingkidsprogramming.approvals.lite.reporters; - -import org.teachingkidsprogramming.approvals.lite.ApprovalFailureReporter; - -public interface EnvironmentAwareReporter extends ApprovalFailureReporter -{ - boolean isWorkingInThisEnvironment(String forFile); -} diff --git a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/ImageReporter.java b/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/ImageReporter.java deleted file mode 100644 index 0b4eeb7..0000000 --- a/src/main/java/org/teachingkidsprogramming/approvals/lite/reporters/ImageReporter.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.teachingkidsprogramming.approvals.lite.reporters; - -import org.teachingkidsprogramming.approvals.lite.reporters.macosx.KaleidoscopeDiffReporter; -import org.teachingkidsprogramming.approvals.lite.reporters.windows.BeyondCompareReporter; -import org.teachingkidsprogramming.approvals.lite.reporters.windows.TortoiseImageDiffReporter; - -public class ImageReporter extends FirstWorkingReporter -{ - public ImageReporter() - { - super(TortoiseImageDiffReporter.INSTANCE, BeyondCompareReporter.INSTANCE, KaleidoscopeDiffReporter.INSTANCE, - ImageWebReporter.INSTANCE, QuietReporter.INSTANCE); - } -} diff --git a/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.java b/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.java index 1970595..7b1e726 100644 --- a/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.java +++ b/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.java @@ -11,9 +11,9 @@ import junit.framework.TestCase; -import org.teachingkidsprogramming.approvals.lite.Approvals; -import org.teachingkidsprogramming.approvals.lite.reporters.UseReporter; -import org.teachingkidsprogramming.approvals.lite.reporters.windows.TortoiseTextDiffReporter; +import org.teachingextensions.approvals.lite.Approvals; +import org.teachingextensions.approvals.lite.reporters.UseReporter; +import org.teachingextensions.approvals.lite.reporters.windows.TortoiseTextDiffReporter; import org.teachingkidsprogramming.util.StringUtils; import org.teachingkidsprogramming.util.TestUtils; diff --git a/src/test/java/org/teachingextensions/logo/tests/RecipeTests.java b/src/test/java/org/teachingextensions/logo/tests/RecipeTests.java index 5da84a0..faee443 100644 --- a/src/test/java/org/teachingextensions/logo/tests/RecipeTests.java +++ b/src/test/java/org/teachingextensions/logo/tests/RecipeTests.java @@ -5,10 +5,10 @@ import junit.framework.TestCase; -import org.teachingkidsprogramming.approvals.lite.Approvals; -import org.teachingkidsprogramming.approvals.lite.reporters.DelayedClipboardReporter; -import org.teachingkidsprogramming.approvals.lite.reporters.FileLauncherReporter; -import org.teachingkidsprogramming.approvals.lite.reporters.UseReporter; +import org.teachingextensions.approvals.lite.Approvals; +import org.teachingextensions.approvals.lite.reporters.DelayedClipboardReporter; +import org.teachingextensions.approvals.lite.reporters.FileLauncherReporter; +import org.teachingextensions.approvals.lite.reporters.UseReporter; import org.teachingextensions.logo.PenColors; import org.teachingextensions.logo.Turtle; import org.teachingextensions.logo.Wheel; diff --git a/src/test/java/org/teachingextensions/logo/tests/TortoiseTest.java b/src/test/java/org/teachingextensions/logo/tests/TortoiseTest.java index e7c6fd0..2bd2f77 100644 --- a/src/test/java/org/teachingextensions/logo/tests/TortoiseTest.java +++ b/src/test/java/org/teachingextensions/logo/tests/TortoiseTest.java @@ -2,9 +2,9 @@ import junit.framework.TestCase; -import org.teachingkidsprogramming.approvals.lite.reporters.ClipboardReporter; -import org.teachingkidsprogramming.approvals.lite.reporters.DiffReporter; -import org.teachingkidsprogramming.approvals.lite.reporters.UseReporter; +import org.teachingextensions.approvals.lite.reporters.ClipboardReporter; +import org.teachingextensions.approvals.lite.reporters.DiffReporter; +import org.teachingextensions.approvals.lite.reporters.UseReporter; import org.teachingextensions.logo.PenColors; import org.teachingextensions.logo.Tortoise; import org.teachingextensions.logo.Turtle; diff --git a/src/test/java/org/teachingextensions/logo/tests/TurtlePanelTest.java b/src/test/java/org/teachingextensions/logo/tests/TurtlePanelTest.java index cc0008e..fb280ec 100644 --- a/src/test/java/org/teachingextensions/logo/tests/TurtlePanelTest.java +++ b/src/test/java/org/teachingextensions/logo/tests/TurtlePanelTest.java @@ -2,10 +2,10 @@ import junit.framework.TestCase; -import org.teachingkidsprogramming.approvals.lite.Approvals; -import org.teachingkidsprogramming.approvals.lite.reporters.ClipboardReporter; -import org.teachingkidsprogramming.approvals.lite.reporters.DiffReporter; -import org.teachingkidsprogramming.approvals.lite.reporters.UseReporter; +import org.teachingextensions.approvals.lite.Approvals; +import org.teachingextensions.approvals.lite.reporters.ClipboardReporter; +import org.teachingextensions.approvals.lite.reporters.DiffReporter; +import org.teachingextensions.approvals.lite.reporters.UseReporter; import org.teachingextensions.logo.Turtle; @UseReporter({ClipboardReporter.class, DiffReporter.class}) diff --git a/src/test/java/org/teachingextensions/logo/tests/TurtleTest.java b/src/test/java/org/teachingextensions/logo/tests/TurtleTest.java index 2c52122..9199f0d 100644 --- a/src/test/java/org/teachingextensions/logo/tests/TurtleTest.java +++ b/src/test/java/org/teachingextensions/logo/tests/TurtleTest.java @@ -4,10 +4,10 @@ import junit.framework.TestCase; -import org.teachingkidsprogramming.approvals.lite.Approvals; -import org.teachingkidsprogramming.approvals.lite.reporters.DelayedClipboardReporter; -import org.teachingkidsprogramming.approvals.lite.reporters.DiffReporter; -import org.teachingkidsprogramming.approvals.lite.reporters.UseReporter; +import org.teachingextensions.approvals.lite.Approvals; +import org.teachingextensions.approvals.lite.reporters.DelayedClipboardReporter; +import org.teachingextensions.approvals.lite.reporters.DiffReporter; +import org.teachingextensions.approvals.lite.reporters.UseReporter; import org.teachingkidsprogramming.util.lambda.Function1; import org.teachingextensions.logo.PenColors; import org.teachingextensions.logo.Turtle; diff --git a/src/test/java/org/teachingextensions/logo/tests/WheelTest.java b/src/test/java/org/teachingextensions/logo/tests/WheelTest.java index 3f0b859..68cad9f 100644 --- a/src/test/java/org/teachingextensions/logo/tests/WheelTest.java +++ b/src/test/java/org/teachingextensions/logo/tests/WheelTest.java @@ -2,9 +2,9 @@ import junit.framework.TestCase; -import org.teachingkidsprogramming.approvals.lite.Approvals; -import org.teachingkidsprogramming.approvals.lite.reporters.UseReporter; -import org.teachingkidsprogramming.approvals.lite.reporters.windows.TortoiseTextDiffReporter; +import org.teachingextensions.approvals.lite.Approvals; +import org.teachingextensions.approvals.lite.reporters.UseReporter; +import org.teachingextensions.approvals.lite.reporters.windows.TortoiseTextDiffReporter; import org.teachingextensions.logo.Wheel; public class WheelTest extends TestCase diff --git a/src/test/java/org/teachingextensions/simpleparser/tests/ParserTest.java b/src/test/java/org/teachingextensions/simpleparser/tests/ParserTest.java index e79a5e2..1c06210 100644 --- a/src/test/java/org/teachingextensions/simpleparser/tests/ParserTest.java +++ b/src/test/java/org/teachingextensions/simpleparser/tests/ParserTest.java @@ -2,9 +2,9 @@ import junit.framework.TestCase; -import org.teachingkidsprogramming.approvals.lite.Approvals; -import org.teachingkidsprogramming.approvals.lite.reporters.DiffReporter; -import org.teachingkidsprogramming.approvals.lite.reporters.UseReporter; +import org.teachingextensions.approvals.lite.Approvals; +import org.teachingextensions.approvals.lite.reporters.DiffReporter; +import org.teachingextensions.approvals.lite.reporters.UseReporter; import org.teachingextensions.simpleparser.Parser; @UseReporter(DiffReporter.class) diff --git a/src/test/java/org/teachingextensions/windows/tests/GraphicsWindowTest.java b/src/test/java/org/teachingextensions/windows/tests/GraphicsWindowTest.java index 4b74e2b..dfc70f9 100644 --- a/src/test/java/org/teachingextensions/windows/tests/GraphicsWindowTest.java +++ b/src/test/java/org/teachingextensions/windows/tests/GraphicsWindowTest.java @@ -2,9 +2,9 @@ import junit.framework.TestCase; -import org.teachingkidsprogramming.approvals.lite.reporters.DelayedClipboardReporter; -import org.teachingkidsprogramming.approvals.lite.reporters.FileLauncherReporter; -import org.teachingkidsprogramming.approvals.lite.reporters.UseReporter; +import org.teachingextensions.approvals.lite.reporters.DelayedClipboardReporter; +import org.teachingextensions.approvals.lite.reporters.FileLauncherReporter; +import org.teachingextensions.approvals.lite.reporters.UseReporter; @UseReporter({FileLauncherReporter.class, DelayedClipboardReporter.class}) public class GraphicsWindowTest extends TestCase diff --git a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/AdLibsQuizTest.java b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/AdLibsQuizTest.java index 805fa27..484bbf9 100644 --- a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/AdLibsQuizTest.java +++ b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/AdLibsQuizTest.java @@ -2,9 +2,9 @@ import junit.framework.TestCase; -import org.teachingkidsprogramming.approvals.lite.reporters.DelayedClipboardReporter; -import org.teachingkidsprogramming.approvals.lite.reporters.FileLauncherReporter; -import org.teachingkidsprogramming.approvals.lite.reporters.UseReporter; +import org.teachingextensions.approvals.lite.reporters.DelayedClipboardReporter; +import org.teachingextensions.approvals.lite.reporters.FileLauncherReporter; +import org.teachingextensions.approvals.lite.reporters.UseReporter; import org.teachingextensions.logo.Turtle; import org.teachingextensions.logo.utils.TortoiseUtils; import org.teachingextensions.simpleparser.Parser; diff --git a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/HiLowQuizTest.java b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/HiLowQuizTest.java index e9b5f4e..49856a5 100644 --- a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/HiLowQuizTest.java +++ b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/HiLowQuizTest.java @@ -2,9 +2,9 @@ import junit.framework.TestCase; -import org.teachingkidsprogramming.approvals.lite.reporters.DelayedClipboardReporter; -import org.teachingkidsprogramming.approvals.lite.reporters.DiffReporter; -import org.teachingkidsprogramming.approvals.lite.reporters.UseReporter; +import org.teachingextensions.approvals.lite.reporters.DelayedClipboardReporter; +import org.teachingextensions.approvals.lite.reporters.DiffReporter; +import org.teachingextensions.approvals.lite.reporters.UseReporter; import org.teachingextensions.logo.Tortoise; import org.teachingextensions.logo.Turtle; import org.teachingextensions.logo.utils.TortoiseUtils; diff --git a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/HousesQuizTest.java b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/HousesQuizTest.java index 8bfde36..530c0b1 100644 --- a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/HousesQuizTest.java +++ b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/HousesQuizTest.java @@ -2,9 +2,9 @@ import junit.framework.TestCase; -import org.teachingkidsprogramming.approvals.lite.reporters.DelayedClipboardReporter; -import org.teachingkidsprogramming.approvals.lite.reporters.FileLauncherReporter; -import org.teachingkidsprogramming.approvals.lite.reporters.UseReporter; +import org.teachingextensions.approvals.lite.reporters.DelayedClipboardReporter; +import org.teachingextensions.approvals.lite.reporters.FileLauncherReporter; +import org.teachingextensions.approvals.lite.reporters.UseReporter; import org.teachingextensions.logo.Tortoise; import org.teachingextensions.logo.Turtle; import org.teachingextensions.logo.utils.TortoiseUtils; diff --git a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/PentagonCrazyQuizTest.java b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/PentagonCrazyQuizTest.java index 5b6750c..4c781fb 100644 --- a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/PentagonCrazyQuizTest.java +++ b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/PentagonCrazyQuizTest.java @@ -2,9 +2,9 @@ import junit.framework.TestCase; -import org.teachingkidsprogramming.approvals.lite.reporters.DelayedClipboardReporter; -import org.teachingkidsprogramming.approvals.lite.reporters.FileLauncherReporter; -import org.teachingkidsprogramming.approvals.lite.reporters.UseReporter; +import org.teachingextensions.approvals.lite.reporters.DelayedClipboardReporter; +import org.teachingextensions.approvals.lite.reporters.FileLauncherReporter; +import org.teachingextensions.approvals.lite.reporters.UseReporter; import org.teachingextensions.logo.ColorWheel; import org.teachingextensions.logo.PenColors; import org.teachingextensions.logo.Tortoise; diff --git a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/QuizBuzzTest.java b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/QuizBuzzTest.java index 2abdb9d..12a252d 100644 --- a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/QuizBuzzTest.java +++ b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/QuizBuzzTest.java @@ -2,9 +2,9 @@ import junit.framework.TestCase; -import org.teachingkidsprogramming.approvals.lite.reporters.DelayedClipboardReporter; -import org.teachingkidsprogramming.approvals.lite.reporters.FileLauncherReporter; -import org.teachingkidsprogramming.approvals.lite.reporters.UseReporter; +import org.teachingextensions.approvals.lite.reporters.DelayedClipboardReporter; +import org.teachingextensions.approvals.lite.reporters.FileLauncherReporter; +import org.teachingextensions.approvals.lite.reporters.UseReporter; import org.teachingextensions.logo.Turtle; import org.teachingextensions.logo.utils.TortoiseUtils; import org.teachingextensions.simpleparser.Parser; diff --git a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleBubbleQuizTest.java b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleBubbleQuizTest.java index e4f934d..bab7ae7 100644 --- a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleBubbleQuizTest.java +++ b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleBubbleQuizTest.java @@ -2,9 +2,9 @@ import junit.framework.TestCase; -import org.teachingkidsprogramming.approvals.lite.reporters.DelayedClipboardReporter; -import org.teachingkidsprogramming.approvals.lite.reporters.FileLauncherReporter; -import org.teachingkidsprogramming.approvals.lite.reporters.UseReporter; +import org.teachingextensions.approvals.lite.reporters.DelayedClipboardReporter; +import org.teachingextensions.approvals.lite.reporters.FileLauncherReporter; +import org.teachingextensions.approvals.lite.reporters.UseReporter; import org.teachingextensions.logo.Turtle; import org.teachingextensions.logo.utils.TortoiseUtils; import org.teachingextensions.simpleparser.Parser; diff --git a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleSquareQuizTest.java b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleSquareQuizTest.java index cdc4337..ecf25c4 100644 --- a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleSquareQuizTest.java +++ b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleSquareQuizTest.java @@ -2,9 +2,9 @@ import junit.framework.TestCase; -import org.teachingkidsprogramming.approvals.lite.reporters.ClipboardReporter; -import org.teachingkidsprogramming.approvals.lite.reporters.DiffReporter; -import org.teachingkidsprogramming.approvals.lite.reporters.UseReporter; +import org.teachingextensions.approvals.lite.reporters.ClipboardReporter; +import org.teachingextensions.approvals.lite.reporters.DiffReporter; +import org.teachingextensions.approvals.lite.reporters.UseReporter; import org.teachingextensions.logo.PenColors; import org.teachingextensions.logo.Tortoise; import org.teachingextensions.logo.Turtle; diff --git a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SpiderWebQuizTest.java b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SpiderWebQuizTest.java index 7b0012c..92875ca 100644 --- a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SpiderWebQuizTest.java +++ b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SpiderWebQuizTest.java @@ -2,9 +2,9 @@ import junit.framework.TestCase; -import org.teachingkidsprogramming.approvals.lite.reporters.DelayedClipboardReporter; -import org.teachingkidsprogramming.approvals.lite.reporters.FileLauncherReporter; -import org.teachingkidsprogramming.approvals.lite.reporters.UseReporter; +import org.teachingextensions.approvals.lite.reporters.DelayedClipboardReporter; +import org.teachingextensions.approvals.lite.reporters.FileLauncherReporter; +import org.teachingextensions.approvals.lite.reporters.UseReporter; import org.teachingextensions.logo.Tortoise; import org.teachingextensions.logo.Turtle; import org.teachingextensions.logo.utils.TortoiseUtils; diff --git a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/TreeQuizTest.java b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/TreeQuizTest.java index fd38438..ad3912c 100644 --- a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/TreeQuizTest.java +++ b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/TreeQuizTest.java @@ -2,9 +2,9 @@ import junit.framework.TestCase; -import org.teachingkidsprogramming.approvals.lite.reporters.DelayedClipboardReporter; -import org.teachingkidsprogramming.approvals.lite.reporters.DiffReporter; -import org.teachingkidsprogramming.approvals.lite.reporters.UseReporter; +import org.teachingextensions.approvals.lite.reporters.DelayedClipboardReporter; +import org.teachingextensions.approvals.lite.reporters.DiffReporter; +import org.teachingextensions.approvals.lite.reporters.UseReporter; import org.teachingextensions.logo.Turtle; import org.teachingextensions.logo.utils.TortoiseUtils; import org.teachingkidsprogramming.recipes.quizzes.graders.TreeQuizAdapter; From dcd44eeba9111ab42fb0548a9f2afd50c86ba153 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Tue, 17 Mar 2015 16:23:16 -0700 Subject: [PATCH 068/111] . --- .../java/org/teachingkidsprogramming/util/lambda/Query.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/org/teachingkidsprogramming/util/lambda/Query.java b/src/main/java/org/teachingkidsprogramming/util/lambda/Query.java index 150d5df..a734fe7 100644 --- a/src/main/java/org/teachingkidsprogramming/util/lambda/Query.java +++ b/src/main/java/org/teachingkidsprogramming/util/lambda/Query.java @@ -1,7 +1,5 @@ package org.teachingkidsprogramming.util.lambda; -import org.teachingkidsprogramming.util.lambda.Function1; - import java.util.ArrayList; import java.util.Arrays; import java.util.List; From d9e191884ea1c9a732233af54867e2f17962b0c3 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Tue, 17 Mar 2015 16:37:15 -0700 Subject: [PATCH 069/111] moved utils --- .../teachingextensions/approvals/lite/Approvals.java | 8 ++++---- .../approvals/lite/FileApprover.java | 4 ++-- .../approvals/lite/ReporterFactory.java | 2 +- .../approvals/lite/namer/JUnitStackTraceNamer.java | 8 ++++---- .../approvals/lite/namer/NamerFactory.java | 2 +- .../approvals/lite/namer/OsEnvironmentLabeller.java | 2 +- .../approvals/lite/reporters/ClipboardReporter.java | 4 ++-- .../lite/reporters/DelayedClipboardReporter.java | 4 ++-- .../lite/reporters/FileLauncherReporter.java | 4 ++-- .../lite/reporters/GenericDiffReporter.java | 4 ++-- .../approvals/lite/reporters/ImageWebReporter.java | 2 +- .../approvals/lite/reporters/JunitReporter.java | 2 +- .../reporters/macosx/KaleidoscopeDiffReporter.java | 2 +- .../lite/reporters/macosx/P4MergeReporter.java | 2 +- .../approvals/lite}/util/ArrayUtils.java | 4 ++-- .../approvals/lite}/util/Asserts.java | 2 +- .../approvals/lite}/util/ClassUtils.java | 2 +- .../approvals/lite}/util/Country.java | 2 +- .../approvals/lite}/util/DateDifference.java | 2 +- .../approvals/lite}/util/DateUtils.java | 2 +- .../approvals/lite}/util/DualOutputStream.java | 2 +- .../approvals/lite}/util/Filter.java | 2 +- .../approvals/lite}/util/FilterUtils.java | 2 +- .../approvals/lite}/util/FormattedException.java | 2 +- .../approvals/lite}/util/FrameCloser.java | 2 +- .../approvals/lite}/util/LambdaThreadLauncher.java | 4 ++-- .../approvals/lite}/util/MethodExecutionPath.java | 2 +- .../approvals/lite}/util/MySystem.java | 2 +- .../lite}/util/NotImplementedException.java | 2 +- .../approvals/lite}/util/NumberUtils.java | 2 +- .../approvals/lite}/util/ObjectUtils.java | 2 +- .../approvals/lite}/util/PhoneNumber.java | 2 +- .../approvals/lite}/util/SearchingFileFilter.java | 2 +- .../lite}/util/StackTraceReflectionResult.java | 2 +- .../approvals/lite}/util/StringUtils.java | 2 +- .../approvals/lite}/util/SystemUtils.java | 2 +- .../approvals/lite}/util/TestUtils.java | 6 +++--- .../approvals/lite}/util/ThreadLauncher.java | 4 ++-- .../approvals/lite}/util/ThreadUtils.java | 2 +- .../approvals/lite}/util/Tuple.java | 2 +- .../approvals/lite}/util/WindowUtils.java | 2 +- .../approvals/lite}/util/io/FileMonitor.java | 2 +- .../approvals/lite}/util/io/FileUtils.java | 8 ++++---- .../lite}/util/io/SimpleDirectoryFilter.java | 2 +- .../approvals/lite}/util/io/SimpleFileFilter.java | 2 +- .../lite}/util/io/StackElementSelector.java | 2 +- .../approvals/lite}/util/io/ZipUtils.java | 4 +--- .../approvals/lite/util/lambda/Action0.java | 5 +++++ .../approvals/lite}/util/lambda/Action1.java | 2 +- .../approvals/lite}/util/lambda/Function0.java | 2 +- .../approvals/lite}/util/lambda/Function1.java | 2 +- .../approvals/lite}/util/lambda/Query.java | 2 +- .../approvals/lite}/util/parser/ParserCommons.java | 2 +- .../approvals/lite}/util/parser/TemplateError.java | 4 ++-- .../lite}/util/persistence/ExecutableQuery.java | 2 +- .../approvals/lite}/util/persistence/Saver.java | 2 +- .../lite/util/persistence/SavingException.java | 5 +++++ .../lite}/util/servlets/InvokerServlet.java | 6 +++--- .../lite}/util/servlets/ValidationError.java | 4 ++-- .../approvals/lite}/util/velocity/ContextAware.java | 2 +- .../lite}/util/velocity/StringResourceLoader.java | 4 ++-- .../lite}/util/velocity/TestableUberspect.java | 4 ++-- .../lite}/util/velocity/VelocityParser.java | 11 ++++------- .../lite}/util/velocity/VelocityParsingError.java | 2 +- .../approvals/lite/writers/ApprovalTextWriter.java | 2 +- .../org/teachingextensions/logo/ImageBackground.java | 2 +- .../java/org/teachingextensions/logo/Turtle.java | 8 ++++---- .../logo/VirtualProctorFileSystem.java | 2 +- .../teachingextensions/logo/VirtualProctorWeb.java | 10 +++++----- src/main/java/org/teachingextensions/logo/Wheel.java | 2 +- .../teachingextensions/logo/utils/TortoiseUtils.java | 2 +- .../teachingextensions/setup/CommandLineUtils.java | 2 +- .../setup/MacThumbDriveInstaller.java | 4 ++-- .../org/teachingextensions/setup/SetupConfig.java | 4 ++-- .../org/teachingextensions/setup/SetupValidator.java | 6 +++--- .../setup/ThumbDriveInstaller.java | 2 +- .../org/teachingextensions/simpleparser/Parser.java | 8 ++++---- .../java/org/teachingextensions/utils/Viewer.java | 4 ++-- .../org/teachingextensions/utils/VirtualProctor.java | 4 ++-- .../org/teachingextensions/windows/MessageBox.java | 2 +- .../teachingextensions/windows/ProgramWindow.java | 4 ++-- .../recipes/completed/ChooseYourOwnAdventure.java | 2 +- .../recipes/completed/HiLow.java | 2 +- .../recipes/completed/SimpleBubble.java | 2 +- .../recipes/quizzes/graders/HousesQuizGrader.java | 2 +- .../quizzes/graders/PentagonCrazyQuizGrader.java | 2 +- .../quizzes/graders/SimpleSquareQuizGrader.java | 2 +- .../section09exceptions/DeepDive09exceptions.java | 2 +- .../teachingkidsprogramming/util/lambda/Action0.java | 5 ----- .../util/persistence/SavingException.java | 5 ----- .../logo/tests/ColorGeneration.java | 12 ++++++------ .../ColorGeneration.testGeneration.approved.txt | 2 +- .../teachingextensions/logo/tests/TurtleTest.java | 2 +- .../logo/tests/colors.java.template | 2 +- .../teachingextensions/setup/tests/UnzipTest.java | 2 +- .../util/io/tests/FileMonitorTest.java | 4 ++-- .../util/tests/SearchingFileFilterTest.java | 2 +- .../ColorGeneration.testGeneration.approved.txt | 2 +- src/test/resources/colors.java.template | 2 +- 99 files changed, 156 insertions(+), 161 deletions(-) rename src/main/java/org/{teachingkidsprogramming => teachingextensions/approvals/lite}/util/ArrayUtils.java (95%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions/approvals/lite}/util/Asserts.java (90%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions/approvals/lite}/util/ClassUtils.java (98%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions/approvals/lite}/util/Country.java (98%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions/approvals/lite}/util/DateDifference.java (99%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions/approvals/lite}/util/DateUtils.java (98%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions/approvals/lite}/util/DualOutputStream.java (97%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions/approvals/lite}/util/Filter.java (91%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions/approvals/lite}/util/FilterUtils.java (97%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions/approvals/lite}/util/FormattedException.java (81%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions/approvals/lite}/util/FrameCloser.java (90%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions/approvals/lite}/util/LambdaThreadLauncher.java (80%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions/approvals/lite}/util/MethodExecutionPath.java (97%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions/approvals/lite}/util/MySystem.java (99%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions/approvals/lite}/util/NotImplementedException.java (75%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions/approvals/lite}/util/NumberUtils.java (96%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions/approvals/lite}/util/ObjectUtils.java (98%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions/approvals/lite}/util/PhoneNumber.java (99%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions/approvals/lite}/util/SearchingFileFilter.java (95%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions/approvals/lite}/util/StackTraceReflectionResult.java (91%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions/approvals/lite}/util/StringUtils.java (99%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions/approvals/lite}/util/SystemUtils.java (74%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions/approvals/lite}/util/TestUtils.java (93%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions/approvals/lite}/util/ThreadLauncher.java (92%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions/approvals/lite}/util/ThreadUtils.java (77%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions/approvals/lite}/util/Tuple.java (88%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions/approvals/lite}/util/WindowUtils.java (97%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions/approvals/lite}/util/io/FileMonitor.java (96%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions/approvals/lite}/util/io/FileUtils.java (96%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions/approvals/lite}/util/io/SimpleDirectoryFilter.java (92%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions/approvals/lite}/util/io/SimpleFileFilter.java (92%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions/approvals/lite}/util/io/StackElementSelector.java (71%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions/approvals/lite}/util/io/ZipUtils.java (96%) create mode 100644 src/main/java/org/teachingextensions/approvals/lite/util/lambda/Action0.java rename src/main/java/org/{teachingkidsprogramming => teachingextensions/approvals/lite}/util/lambda/Action1.java (52%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions/approvals/lite}/util/lambda/Function0.java (50%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions/approvals/lite}/util/lambda/Function1.java (53%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions/approvals/lite}/util/lambda/Query.java (92%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions/approvals/lite}/util/parser/ParserCommons.java (96%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions/approvals/lite}/util/parser/TemplateError.java (93%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions/approvals/lite}/util/persistence/ExecutableQuery.java (63%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions/approvals/lite}/util/persistence/Saver.java (55%) create mode 100644 src/main/java/org/teachingextensions/approvals/lite/util/persistence/SavingException.java rename src/main/java/org/{teachingkidsprogramming => teachingextensions/approvals/lite}/util/servlets/InvokerServlet.java (95%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions/approvals/lite}/util/servlets/ValidationError.java (96%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions/approvals/lite}/util/velocity/ContextAware.java (95%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions/approvals/lite}/util/velocity/StringResourceLoader.java (94%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions/approvals/lite}/util/velocity/TestableUberspect.java (98%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions/approvals/lite}/util/velocity/VelocityParser.java (92%) rename src/main/java/org/{teachingkidsprogramming => teachingextensions/approvals/lite}/util/velocity/VelocityParsingError.java (90%) delete mode 100644 src/main/java/org/teachingkidsprogramming/util/lambda/Action0.java delete mode 100644 src/main/java/org/teachingkidsprogramming/util/persistence/SavingException.java diff --git a/src/main/java/org/teachingextensions/approvals/lite/Approvals.java b/src/main/java/org/teachingextensions/approvals/lite/Approvals.java index 97e3131..4baac7f 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/Approvals.java +++ b/src/main/java/org/teachingextensions/approvals/lite/Approvals.java @@ -5,10 +5,10 @@ import org.teachingextensions.approvals.lite.namer.JUnitStackTraceNamer; import org.teachingextensions.approvals.lite.writers.ApprovalTextWriter; import org.teachingextensions.approvals.lite.writers.ImageApprovalWriter; -import org.teachingkidsprogramming.util.lambda.Function1; -import org.teachingkidsprogramming.util.ArrayUtils; -import org.teachingkidsprogramming.util.ObjectUtils; -import org.teachingkidsprogramming.util.StringUtils; +import org.teachingextensions.approvals.lite.util.lambda.Function1; +import org.teachingextensions.approvals.lite.util.ArrayUtils; +import org.teachingextensions.approvals.lite.util.ObjectUtils; +import org.teachingextensions.approvals.lite.util.StringUtils; import java.awt.image.BufferedImage; import java.util.Arrays; diff --git a/src/main/java/org/teachingextensions/approvals/lite/FileApprover.java b/src/main/java/org/teachingextensions/approvals/lite/FileApprover.java index c829f3b..97cef41 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/FileApprover.java +++ b/src/main/java/org/teachingextensions/approvals/lite/FileApprover.java @@ -3,8 +3,8 @@ import junit.framework.TestCase; import org.teachingextensions.approvals.lite.namer.ApprovalNamer; import org.teachingextensions.approvals.lite.namer.NamerFactory; -import org.teachingkidsprogramming.util.ObjectUtils; -import org.teachingkidsprogramming.util.io.FileUtils; +import org.teachingextensions.approvals.lite.util.ObjectUtils; +import org.teachingextensions.approvals.lite.util.io.FileUtils; import java.io.File; import java.io.IOException; diff --git a/src/main/java/org/teachingextensions/approvals/lite/ReporterFactory.java b/src/main/java/org/teachingextensions/approvals/lite/ReporterFactory.java index 070109e..c0a2fe8 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/ReporterFactory.java +++ b/src/main/java/org/teachingextensions/approvals/lite/ReporterFactory.java @@ -1,7 +1,7 @@ package org.teachingextensions.approvals.lite; import org.teachingextensions.approvals.lite.reporters.*; -import org.teachingkidsprogramming.util.ClassUtils; +import org.teachingextensions.approvals.lite.util.ClassUtils; import java.lang.annotation.Annotation; import java.lang.reflect.Method; diff --git a/src/main/java/org/teachingextensions/approvals/lite/namer/JUnitStackTraceNamer.java b/src/main/java/org/teachingextensions/approvals/lite/namer/JUnitStackTraceNamer.java index 1f1a3dc..7421eeb 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/namer/JUnitStackTraceNamer.java +++ b/src/main/java/org/teachingextensions/approvals/lite/namer/JUnitStackTraceNamer.java @@ -2,10 +2,10 @@ import junit.framework.TestCase; import org.junit.Test; -import org.teachingkidsprogramming.util.ObjectUtils; -import org.teachingkidsprogramming.util.StackTraceReflectionResult; -import org.teachingkidsprogramming.util.TestUtils; -import org.teachingkidsprogramming.util.io.StackElementSelector; +import org.teachingextensions.approvals.lite.util.ObjectUtils; +import org.teachingextensions.approvals.lite.util.StackTraceReflectionResult; +import org.teachingextensions.approvals.lite.util.TestUtils; +import org.teachingextensions.approvals.lite.util.io.StackElementSelector; import java.io.File; import java.lang.reflect.Method; diff --git a/src/main/java/org/teachingextensions/approvals/lite/namer/NamerFactory.java b/src/main/java/org/teachingextensions/approvals/lite/namer/NamerFactory.java index f8d11f0..3c2fd9f 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/namer/NamerFactory.java +++ b/src/main/java/org/teachingextensions/approvals/lite/namer/NamerFactory.java @@ -1,6 +1,6 @@ package org.teachingextensions.approvals.lite.namer; -import org.teachingkidsprogramming.util.lambda.Function0; +import org.teachingextensions.approvals.lite.util.lambda.Function0; public class NamerFactory { private static String additionalInformation; diff --git a/src/main/java/org/teachingextensions/approvals/lite/namer/OsEnvironmentLabeller.java b/src/main/java/org/teachingextensions/approvals/lite/namer/OsEnvironmentLabeller.java index 6de99b8..7ffbfbb 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/namer/OsEnvironmentLabeller.java +++ b/src/main/java/org/teachingextensions/approvals/lite/namer/OsEnvironmentLabeller.java @@ -1,6 +1,6 @@ package org.teachingextensions.approvals.lite.namer; -import org.teachingkidsprogramming.util.lambda.Function0; +import org.teachingextensions.approvals.lite.util.lambda.Function0; public class OsEnvironmentLabeller implements Function0 { @Override diff --git a/src/main/java/org/teachingextensions/approvals/lite/reporters/ClipboardReporter.java b/src/main/java/org/teachingextensions/approvals/lite/reporters/ClipboardReporter.java index d9f1b67..681fc0b 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/reporters/ClipboardReporter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/reporters/ClipboardReporter.java @@ -1,7 +1,7 @@ package org.teachingextensions.approvals.lite.reporters; -import org.teachingkidsprogramming.util.SystemUtils; -import org.teachingkidsprogramming.util.WindowUtils; +import org.teachingextensions.approvals.lite.util.SystemUtils; +import org.teachingextensions.approvals.lite.util.WindowUtils; import java.awt.*; import java.io.File; diff --git a/src/main/java/org/teachingextensions/approvals/lite/reporters/DelayedClipboardReporter.java b/src/main/java/org/teachingextensions/approvals/lite/reporters/DelayedClipboardReporter.java index 052ee40..e482666 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/reporters/DelayedClipboardReporter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/reporters/DelayedClipboardReporter.java @@ -2,8 +2,8 @@ import java.awt.GraphicsEnvironment; -import org.teachingkidsprogramming.util.StringUtils; -import org.teachingkidsprogramming.util.WindowUtils; +import org.teachingextensions.approvals.lite.util.StringUtils; +import org.teachingextensions.approvals.lite.util.WindowUtils; /** * A reporter which creates the command to accept the received diff --git a/src/main/java/org/teachingextensions/approvals/lite/reporters/FileLauncherReporter.java b/src/main/java/org/teachingextensions/approvals/lite/reporters/FileLauncherReporter.java index 9527ca6..f7de01c 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/reporters/FileLauncherReporter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/reporters/FileLauncherReporter.java @@ -3,8 +3,8 @@ import org.teachingextensions.approvals.lite.ApprovalFailureReporter; -import org.teachingkidsprogramming.util.TestUtils; -import org.teachingkidsprogramming.util.io.FileUtils; +import org.teachingextensions.approvals.lite.util.TestUtils; +import org.teachingextensions.approvals.lite.util.io.FileUtils; public class FileLauncherReporter implements ApprovalFailureReporter { diff --git a/src/main/java/org/teachingextensions/approvals/lite/reporters/GenericDiffReporter.java b/src/main/java/org/teachingextensions/approvals/lite/reporters/GenericDiffReporter.java index 63793c3..6efad0b 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/reporters/GenericDiffReporter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/reporters/GenericDiffReporter.java @@ -5,8 +5,8 @@ import java.util.Arrays; import java.util.List; -import org.teachingkidsprogramming.util.ThreadUtils; -import org.teachingkidsprogramming.util.io.FileUtils; +import org.teachingextensions.approvals.lite.util.ThreadUtils; +import org.teachingextensions.approvals.lite.util.io.FileUtils; public class GenericDiffReporter implements EnvironmentAwareReporter { diff --git a/src/main/java/org/teachingextensions/approvals/lite/reporters/ImageWebReporter.java b/src/main/java/org/teachingextensions/approvals/lite/reporters/ImageWebReporter.java index 164ae3b..86f9c57 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/reporters/ImageWebReporter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/reporters/ImageWebReporter.java @@ -2,7 +2,7 @@ import java.awt.GraphicsEnvironment; -import org.teachingkidsprogramming.util.TestUtils; +import org.teachingextensions.approvals.lite.util.TestUtils; public class ImageWebReporter implements EnvironmentAwareReporter { diff --git a/src/main/java/org/teachingextensions/approvals/lite/reporters/JunitReporter.java b/src/main/java/org/teachingextensions/approvals/lite/reporters/JunitReporter.java index 3e53c7d..3b79600 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/reporters/JunitReporter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/reporters/JunitReporter.java @@ -4,7 +4,7 @@ import junit.framework.TestCase; -import org.teachingkidsprogramming.util.io.FileUtils; +import org.teachingextensions.approvals.lite.util.io.FileUtils; public class JunitReporter implements EnvironmentAwareReporter { diff --git a/src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/KaleidoscopeDiffReporter.java b/src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/KaleidoscopeDiffReporter.java index 4dcecb5..3768b10 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/KaleidoscopeDiffReporter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/KaleidoscopeDiffReporter.java @@ -1,7 +1,7 @@ package org.teachingextensions.approvals.lite.reporters.macosx; import org.teachingextensions.approvals.lite.reporters.GenericDiffReporter; -import org.teachingkidsprogramming.util.ArrayUtils; +import org.teachingextensions.approvals.lite.util.ArrayUtils; import java.text.MessageFormat; import java.util.List; diff --git a/src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/P4MergeReporter.java b/src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/P4MergeReporter.java index 286e36c..d837c7b 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/P4MergeReporter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/P4MergeReporter.java @@ -5,7 +5,7 @@ import org.teachingextensions.approvals.lite.reporters.GenericDiffReporter; -import org.teachingkidsprogramming.util.ArrayUtils; +import org.teachingextensions.approvals.lite.util.ArrayUtils; public class P4MergeReporter extends GenericDiffReporter { diff --git a/src/main/java/org/teachingkidsprogramming/util/ArrayUtils.java b/src/main/java/org/teachingextensions/approvals/lite/util/ArrayUtils.java similarity index 95% rename from src/main/java/org/teachingkidsprogramming/util/ArrayUtils.java rename to src/main/java/org/teachingextensions/approvals/lite/util/ArrayUtils.java index eedc213..cef5ba7 100644 --- a/src/main/java/org/teachingkidsprogramming/util/ArrayUtils.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/ArrayUtils.java @@ -1,6 +1,6 @@ -package org.teachingkidsprogramming.util; +package org.teachingextensions.approvals.lite.util; -import org.teachingkidsprogramming.util.lambda.Function1; +import org.teachingextensions.approvals.lite.util.lambda.Function1; import java.util.*; import java.util.Comparator; diff --git a/src/main/java/org/teachingkidsprogramming/util/Asserts.java b/src/main/java/org/teachingextensions/approvals/lite/util/Asserts.java similarity index 90% rename from src/main/java/org/teachingkidsprogramming/util/Asserts.java rename to src/main/java/org/teachingextensions/approvals/lite/util/Asserts.java index 89e8316..a7aea34 100644 --- a/src/main/java/org/teachingkidsprogramming/util/Asserts.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/Asserts.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.util; +package org.teachingextensions.approvals.lite.util; public class Asserts { diff --git a/src/main/java/org/teachingkidsprogramming/util/ClassUtils.java b/src/main/java/org/teachingextensions/approvals/lite/util/ClassUtils.java similarity index 98% rename from src/main/java/org/teachingkidsprogramming/util/ClassUtils.java rename to src/main/java/org/teachingextensions/approvals/lite/util/ClassUtils.java index 40004ab..dc38a37 100644 --- a/src/main/java/org/teachingkidsprogramming/util/ClassUtils.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/ClassUtils.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.util; +package org.teachingextensions.approvals.lite.util; import java.io.File; import java.util.ArrayList; diff --git a/src/main/java/org/teachingkidsprogramming/util/Country.java b/src/main/java/org/teachingextensions/approvals/lite/util/Country.java similarity index 98% rename from src/main/java/org/teachingkidsprogramming/util/Country.java rename to src/main/java/org/teachingextensions/approvals/lite/util/Country.java index 048908c..97e5b95 100644 --- a/src/main/java/org/teachingkidsprogramming/util/Country.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/Country.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.util; +package org.teachingextensions.approvals.lite.util; public enum Country { diff --git a/src/main/java/org/teachingkidsprogramming/util/DateDifference.java b/src/main/java/org/teachingextensions/approvals/lite/util/DateDifference.java similarity index 99% rename from src/main/java/org/teachingkidsprogramming/util/DateDifference.java rename to src/main/java/org/teachingextensions/approvals/lite/util/DateDifference.java index e50fbb7..cf9af43 100644 --- a/src/main/java/org/teachingkidsprogramming/util/DateDifference.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/DateDifference.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.util; +package org.teachingextensions.approvals.lite.util; import java.util.Calendar; import java.util.Date; diff --git a/src/main/java/org/teachingkidsprogramming/util/DateUtils.java b/src/main/java/org/teachingextensions/approvals/lite/util/DateUtils.java similarity index 98% rename from src/main/java/org/teachingkidsprogramming/util/DateUtils.java rename to src/main/java/org/teachingextensions/approvals/lite/util/DateUtils.java index ce1e29d..f9f8ffa 100644 --- a/src/main/java/org/teachingkidsprogramming/util/DateUtils.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/DateUtils.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.util; +package org.teachingextensions.approvals.lite.util; import java.sql.Timestamp; import java.text.ParseException; diff --git a/src/main/java/org/teachingkidsprogramming/util/DualOutputStream.java b/src/main/java/org/teachingextensions/approvals/lite/util/DualOutputStream.java similarity index 97% rename from src/main/java/org/teachingkidsprogramming/util/DualOutputStream.java rename to src/main/java/org/teachingextensions/approvals/lite/util/DualOutputStream.java index c3dfa90..6ec76e1 100644 --- a/src/main/java/org/teachingkidsprogramming/util/DualOutputStream.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/DualOutputStream.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.util; +package org.teachingextensions.approvals.lite.util; import java.io.FileOutputStream; import java.io.IOException; diff --git a/src/main/java/org/teachingkidsprogramming/util/Filter.java b/src/main/java/org/teachingextensions/approvals/lite/util/Filter.java similarity index 91% rename from src/main/java/org/teachingkidsprogramming/util/Filter.java rename to src/main/java/org/teachingextensions/approvals/lite/util/Filter.java index 92e3b5f..8f22dfa 100644 --- a/src/main/java/org/teachingkidsprogramming/util/Filter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/Filter.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.util; +package org.teachingextensions.approvals.lite.util; /** * Listens to the state of a EnabledConditions object diff --git a/src/main/java/org/teachingkidsprogramming/util/FilterUtils.java b/src/main/java/org/teachingextensions/approvals/lite/util/FilterUtils.java similarity index 97% rename from src/main/java/org/teachingkidsprogramming/util/FilterUtils.java rename to src/main/java/org/teachingextensions/approvals/lite/util/FilterUtils.java index 4a14519..dd8c1d4 100644 --- a/src/main/java/org/teachingkidsprogramming/util/FilterUtils.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/FilterUtils.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.util; +package org.teachingextensions.approvals.lite.util; import java.util.ArrayList; import java.util.Arrays; diff --git a/src/main/java/org/teachingkidsprogramming/util/FormattedException.java b/src/main/java/org/teachingextensions/approvals/lite/util/FormattedException.java similarity index 81% rename from src/main/java/org/teachingkidsprogramming/util/FormattedException.java rename to src/main/java/org/teachingextensions/approvals/lite/util/FormattedException.java index 447cac0..38bf9c9 100644 --- a/src/main/java/org/teachingkidsprogramming/util/FormattedException.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/FormattedException.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.util; +package org.teachingextensions.approvals.lite.util; public class FormattedException extends RuntimeException { diff --git a/src/main/java/org/teachingkidsprogramming/util/FrameCloser.java b/src/main/java/org/teachingextensions/approvals/lite/util/FrameCloser.java similarity index 90% rename from src/main/java/org/teachingkidsprogramming/util/FrameCloser.java rename to src/main/java/org/teachingextensions/approvals/lite/util/FrameCloser.java index 96a7141..ed785b4 100644 --- a/src/main/java/org/teachingkidsprogramming/util/FrameCloser.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/FrameCloser.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.util; +package org.teachingextensions.approvals.lite.util; public class FrameCloser extends java.awt.event.WindowAdapter { /** diff --git a/src/main/java/org/teachingkidsprogramming/util/LambdaThreadLauncher.java b/src/main/java/org/teachingextensions/approvals/lite/util/LambdaThreadLauncher.java similarity index 80% rename from src/main/java/org/teachingkidsprogramming/util/LambdaThreadLauncher.java rename to src/main/java/org/teachingextensions/approvals/lite/util/LambdaThreadLauncher.java index 725138f..b74539c 100644 --- a/src/main/java/org/teachingkidsprogramming/util/LambdaThreadLauncher.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/LambdaThreadLauncher.java @@ -1,6 +1,6 @@ -package org.teachingkidsprogramming.util; +package org.teachingextensions.approvals.lite.util; -import org.teachingkidsprogramming.util.lambda.Action0; +import org.teachingextensions.approvals.lite.util.lambda.Action0; public class LambdaThreadLauncher implements Runnable { private final Action0 function; diff --git a/src/main/java/org/teachingkidsprogramming/util/MethodExecutionPath.java b/src/main/java/org/teachingextensions/approvals/lite/util/MethodExecutionPath.java similarity index 97% rename from src/main/java/org/teachingkidsprogramming/util/MethodExecutionPath.java rename to src/main/java/org/teachingextensions/approvals/lite/util/MethodExecutionPath.java index ade0785..18d0e1d 100644 --- a/src/main/java/org/teachingkidsprogramming/util/MethodExecutionPath.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/MethodExecutionPath.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.util; +package org.teachingextensions.approvals.lite.util; import java.io.Serializable; import java.lang.reflect.Method; diff --git a/src/main/java/org/teachingkidsprogramming/util/MySystem.java b/src/main/java/org/teachingextensions/approvals/lite/util/MySystem.java similarity index 99% rename from src/main/java/org/teachingkidsprogramming/util/MySystem.java rename to src/main/java/org/teachingextensions/approvals/lite/util/MySystem.java index 8dee274..f66a805 100644 --- a/src/main/java/org/teachingkidsprogramming/util/MySystem.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/MySystem.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.util; +package org.teachingextensions.approvals.lite.util; import java.io.PrintWriter; import java.util.Vector; diff --git a/src/main/java/org/teachingkidsprogramming/util/NotImplementedException.java b/src/main/java/org/teachingextensions/approvals/lite/util/NotImplementedException.java similarity index 75% rename from src/main/java/org/teachingkidsprogramming/util/NotImplementedException.java rename to src/main/java/org/teachingextensions/approvals/lite/util/NotImplementedException.java index 681079b..6d8ed69 100644 --- a/src/main/java/org/teachingkidsprogramming/util/NotImplementedException.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/NotImplementedException.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.util; +package org.teachingextensions.approvals.lite.util; public class NotImplementedException extends Exception { diff --git a/src/main/java/org/teachingkidsprogramming/util/NumberUtils.java b/src/main/java/org/teachingextensions/approvals/lite/util/NumberUtils.java similarity index 96% rename from src/main/java/org/teachingkidsprogramming/util/NumberUtils.java rename to src/main/java/org/teachingextensions/approvals/lite/util/NumberUtils.java index e3adde8..ade2119 100644 --- a/src/main/java/org/teachingkidsprogramming/util/NumberUtils.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/NumberUtils.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.util; +package org.teachingextensions.approvals.lite.util; import java.util.Random; diff --git a/src/main/java/org/teachingkidsprogramming/util/ObjectUtils.java b/src/main/java/org/teachingextensions/approvals/lite/util/ObjectUtils.java similarity index 98% rename from src/main/java/org/teachingkidsprogramming/util/ObjectUtils.java rename to src/main/java/org/teachingextensions/approvals/lite/util/ObjectUtils.java index ea10856..f51bcff 100644 --- a/src/main/java/org/teachingkidsprogramming/util/ObjectUtils.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/ObjectUtils.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.util; +package org.teachingextensions.approvals.lite.util; import java.lang.reflect.Array; import java.lang.reflect.Method; diff --git a/src/main/java/org/teachingkidsprogramming/util/PhoneNumber.java b/src/main/java/org/teachingextensions/approvals/lite/util/PhoneNumber.java similarity index 99% rename from src/main/java/org/teachingkidsprogramming/util/PhoneNumber.java rename to src/main/java/org/teachingextensions/approvals/lite/util/PhoneNumber.java index 721f19f..08a0cfd 100644 --- a/src/main/java/org/teachingkidsprogramming/util/PhoneNumber.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/PhoneNumber.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.util; +package org.teachingextensions.approvals.lite.util; /** diff --git a/src/main/java/org/teachingkidsprogramming/util/SearchingFileFilter.java b/src/main/java/org/teachingextensions/approvals/lite/util/SearchingFileFilter.java similarity index 95% rename from src/main/java/org/teachingkidsprogramming/util/SearchingFileFilter.java rename to src/main/java/org/teachingextensions/approvals/lite/util/SearchingFileFilter.java index ac602bd..7cb3bc9 100644 --- a/src/main/java/org/teachingkidsprogramming/util/SearchingFileFilter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/SearchingFileFilter.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.util; +package org.teachingextensions.approvals.lite.util; import java.io.File; import java.io.FilenameFilter; diff --git a/src/main/java/org/teachingkidsprogramming/util/StackTraceReflectionResult.java b/src/main/java/org/teachingextensions/approvals/lite/util/StackTraceReflectionResult.java similarity index 91% rename from src/main/java/org/teachingkidsprogramming/util/StackTraceReflectionResult.java rename to src/main/java/org/teachingextensions/approvals/lite/util/StackTraceReflectionResult.java index 45a888b..512939b 100644 --- a/src/main/java/org/teachingkidsprogramming/util/StackTraceReflectionResult.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/StackTraceReflectionResult.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.util; +package org.teachingextensions.approvals.lite.util; import java.io.File; diff --git a/src/main/java/org/teachingkidsprogramming/util/StringUtils.java b/src/main/java/org/teachingextensions/approvals/lite/util/StringUtils.java similarity index 99% rename from src/main/java/org/teachingkidsprogramming/util/StringUtils.java rename to src/main/java/org/teachingextensions/approvals/lite/util/StringUtils.java index 20d3bb8..c049e32 100644 --- a/src/main/java/org/teachingkidsprogramming/util/StringUtils.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/StringUtils.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.util; +package org.teachingextensions.approvals.lite.util; import java.io.ByteArrayInputStream; import java.io.InputStream; diff --git a/src/main/java/org/teachingkidsprogramming/util/SystemUtils.java b/src/main/java/org/teachingextensions/approvals/lite/util/SystemUtils.java similarity index 74% rename from src/main/java/org/teachingkidsprogramming/util/SystemUtils.java rename to src/main/java/org/teachingextensions/approvals/lite/util/SystemUtils.java index 68e23d0..03435ce 100644 --- a/src/main/java/org/teachingkidsprogramming/util/SystemUtils.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/SystemUtils.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.util; +package org.teachingextensions.approvals.lite.util; import java.io.File; diff --git a/src/main/java/org/teachingkidsprogramming/util/TestUtils.java b/src/main/java/org/teachingextensions/approvals/lite/util/TestUtils.java similarity index 93% rename from src/main/java/org/teachingkidsprogramming/util/TestUtils.java rename to src/main/java/org/teachingextensions/approvals/lite/util/TestUtils.java index ae467c7..007466c 100644 --- a/src/main/java/org/teachingkidsprogramming/util/TestUtils.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/TestUtils.java @@ -1,7 +1,7 @@ -package org.teachingkidsprogramming.util; +package org.teachingextensions.approvals.lite.util; -import org.teachingkidsprogramming.util.io.FileUtils; -import org.teachingkidsprogramming.util.io.StackElementSelector; +import org.teachingextensions.approvals.lite.util.io.FileUtils; +import org.teachingextensions.approvals.lite.util.io.StackElementSelector; import java.io.File; import java.io.IOException; diff --git a/src/main/java/org/teachingkidsprogramming/util/ThreadLauncher.java b/src/main/java/org/teachingextensions/approvals/lite/util/ThreadLauncher.java similarity index 92% rename from src/main/java/org/teachingkidsprogramming/util/ThreadLauncher.java rename to src/main/java/org/teachingextensions/approvals/lite/util/ThreadLauncher.java index 6faf0d9..c47d6b5 100644 --- a/src/main/java/org/teachingkidsprogramming/util/ThreadLauncher.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/ThreadLauncher.java @@ -1,6 +1,6 @@ -package org.teachingkidsprogramming.util; +package org.teachingextensions.approvals.lite.util; -import org.teachingkidsprogramming.util.lambda.Action0; +import org.teachingextensions.approvals.lite.util.lambda.Action0; import java.lang.reflect.Method; diff --git a/src/main/java/org/teachingkidsprogramming/util/ThreadUtils.java b/src/main/java/org/teachingextensions/approvals/lite/util/ThreadUtils.java similarity index 77% rename from src/main/java/org/teachingkidsprogramming/util/ThreadUtils.java rename to src/main/java/org/teachingextensions/approvals/lite/util/ThreadUtils.java index c5e387a..f2c1bc1 100644 --- a/src/main/java/org/teachingkidsprogramming/util/ThreadUtils.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/ThreadUtils.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.util; +package org.teachingextensions.approvals.lite.util; public class ThreadUtils { diff --git a/src/main/java/org/teachingkidsprogramming/util/Tuple.java b/src/main/java/org/teachingextensions/approvals/lite/util/Tuple.java similarity index 88% rename from src/main/java/org/teachingkidsprogramming/util/Tuple.java rename to src/main/java/org/teachingextensions/approvals/lite/util/Tuple.java index 89439c6..7b608bf 100644 --- a/src/main/java/org/teachingkidsprogramming/util/Tuple.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/Tuple.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.util; +package org.teachingextensions.approvals.lite.util; public class Tuple { private final H first; diff --git a/src/main/java/org/teachingkidsprogramming/util/WindowUtils.java b/src/main/java/org/teachingextensions/approvals/lite/util/WindowUtils.java similarity index 97% rename from src/main/java/org/teachingkidsprogramming/util/WindowUtils.java rename to src/main/java/org/teachingextensions/approvals/lite/util/WindowUtils.java index 77783e3..6ec9614 100644 --- a/src/main/java/org/teachingkidsprogramming/util/WindowUtils.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/WindowUtils.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.util; +package org.teachingextensions.approvals.lite.util; import javax.swing.*; import java.awt.*; diff --git a/src/main/java/org/teachingkidsprogramming/util/io/FileMonitor.java b/src/main/java/org/teachingextensions/approvals/lite/util/io/FileMonitor.java similarity index 96% rename from src/main/java/org/teachingkidsprogramming/util/io/FileMonitor.java rename to src/main/java/org/teachingextensions/approvals/lite/util/io/FileMonitor.java index 753e402..0ae3aee 100644 --- a/src/main/java/org/teachingkidsprogramming/util/io/FileMonitor.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/io/FileMonitor.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.util.io; +package org.teachingextensions.approvals.lite.util.io; import java.io.File; import java.util.*; diff --git a/src/main/java/org/teachingkidsprogramming/util/io/FileUtils.java b/src/main/java/org/teachingextensions/approvals/lite/util/io/FileUtils.java similarity index 96% rename from src/main/java/org/teachingkidsprogramming/util/io/FileUtils.java rename to src/main/java/org/teachingextensions/approvals/lite/util/io/FileUtils.java index bbda80f..82b1389 100644 --- a/src/main/java/org/teachingkidsprogramming/util/io/FileUtils.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/io/FileUtils.java @@ -1,8 +1,8 @@ -package org.teachingkidsprogramming.util.io; +package org.teachingextensions.approvals.lite.util.io; -import org.teachingkidsprogramming.util.ArrayUtils; -import org.teachingkidsprogramming.util.Asserts; -import org.teachingkidsprogramming.util.ObjectUtils; +import org.teachingextensions.approvals.lite.util.ArrayUtils; +import org.teachingextensions.approvals.lite.util.Asserts; +import org.teachingextensions.approvals.lite.util.ObjectUtils; import java.io.*; import java.util.ArrayList; diff --git a/src/main/java/org/teachingkidsprogramming/util/io/SimpleDirectoryFilter.java b/src/main/java/org/teachingextensions/approvals/lite/util/io/SimpleDirectoryFilter.java similarity index 92% rename from src/main/java/org/teachingkidsprogramming/util/io/SimpleDirectoryFilter.java rename to src/main/java/org/teachingextensions/approvals/lite/util/io/SimpleDirectoryFilter.java index c3f1574..0054ccc 100644 --- a/src/main/java/org/teachingkidsprogramming/util/io/SimpleDirectoryFilter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/io/SimpleDirectoryFilter.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.util.io; +package org.teachingextensions.approvals.lite.util.io; import java.io.File; diff --git a/src/main/java/org/teachingkidsprogramming/util/io/SimpleFileFilter.java b/src/main/java/org/teachingextensions/approvals/lite/util/io/SimpleFileFilter.java similarity index 92% rename from src/main/java/org/teachingkidsprogramming/util/io/SimpleFileFilter.java rename to src/main/java/org/teachingextensions/approvals/lite/util/io/SimpleFileFilter.java index da434d9..f8b5f14 100644 --- a/src/main/java/org/teachingkidsprogramming/util/io/SimpleFileFilter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/io/SimpleFileFilter.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.util.io; +package org.teachingextensions.approvals.lite.util.io; import java.io.File; diff --git a/src/main/java/org/teachingkidsprogramming/util/io/StackElementSelector.java b/src/main/java/org/teachingextensions/approvals/lite/util/io/StackElementSelector.java similarity index 71% rename from src/main/java/org/teachingkidsprogramming/util/io/StackElementSelector.java rename to src/main/java/org/teachingextensions/approvals/lite/util/io/StackElementSelector.java index 08c78a2..82d4c8e 100644 --- a/src/main/java/org/teachingkidsprogramming/util/io/StackElementSelector.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/io/StackElementSelector.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.util.io; +package org.teachingextensions.approvals.lite.util.io; public interface StackElementSelector { diff --git a/src/main/java/org/teachingkidsprogramming/util/io/ZipUtils.java b/src/main/java/org/teachingextensions/approvals/lite/util/io/ZipUtils.java similarity index 96% rename from src/main/java/org/teachingkidsprogramming/util/io/ZipUtils.java rename to src/main/java/org/teachingextensions/approvals/lite/util/io/ZipUtils.java index a2af96b..e33cae9 100644 --- a/src/main/java/org/teachingkidsprogramming/util/io/ZipUtils.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/io/ZipUtils.java @@ -1,6 +1,4 @@ -package org.teachingkidsprogramming.util.io; - -import org.teachingkidsprogramming.util.io.FileUtils; +package org.teachingextensions.approvals.lite.util.io; import java.io.File; import java.io.FileInputStream; diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/lambda/Action0.java b/src/main/java/org/teachingextensions/approvals/lite/util/lambda/Action0.java new file mode 100644 index 0000000..ab1c59d --- /dev/null +++ b/src/main/java/org/teachingextensions/approvals/lite/util/lambda/Action0.java @@ -0,0 +1,5 @@ +package org.teachingextensions.approvals.lite.util.lambda; + +public interface Action0 { + public void call(); +} diff --git a/src/main/java/org/teachingkidsprogramming/util/lambda/Action1.java b/src/main/java/org/teachingextensions/approvals/lite/util/lambda/Action1.java similarity index 52% rename from src/main/java/org/teachingkidsprogramming/util/lambda/Action1.java rename to src/main/java/org/teachingextensions/approvals/lite/util/lambda/Action1.java index 148e101..b4456cb 100644 --- a/src/main/java/org/teachingkidsprogramming/util/lambda/Action1.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/lambda/Action1.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.util.lambda; +package org.teachingextensions.approvals.lite.util.lambda; public interface Action1 { public void call(In1 a); diff --git a/src/main/java/org/teachingkidsprogramming/util/lambda/Function0.java b/src/main/java/org/teachingextensions/approvals/lite/util/lambda/Function0.java similarity index 50% rename from src/main/java/org/teachingkidsprogramming/util/lambda/Function0.java rename to src/main/java/org/teachingextensions/approvals/lite/util/lambda/Function0.java index 3724842..646167b 100644 --- a/src/main/java/org/teachingkidsprogramming/util/lambda/Function0.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/lambda/Function0.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.util.lambda; +package org.teachingextensions.approvals.lite.util.lambda; public interface Function0 { public Out call(); diff --git a/src/main/java/org/teachingkidsprogramming/util/lambda/Function1.java b/src/main/java/org/teachingextensions/approvals/lite/util/lambda/Function1.java similarity index 53% rename from src/main/java/org/teachingkidsprogramming/util/lambda/Function1.java rename to src/main/java/org/teachingextensions/approvals/lite/util/lambda/Function1.java index 0cc9f39..8e86cfb 100644 --- a/src/main/java/org/teachingkidsprogramming/util/lambda/Function1.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/lambda/Function1.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.util.lambda; +package org.teachingextensions.approvals.lite.util.lambda; public interface Function1 { public Out call(In i); diff --git a/src/main/java/org/teachingkidsprogramming/util/lambda/Query.java b/src/main/java/org/teachingextensions/approvals/lite/util/lambda/Query.java similarity index 92% rename from src/main/java/org/teachingkidsprogramming/util/lambda/Query.java rename to src/main/java/org/teachingextensions/approvals/lite/util/lambda/Query.java index a734fe7..6aacdcc 100644 --- a/src/main/java/org/teachingkidsprogramming/util/lambda/Query.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/lambda/Query.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.util.lambda; +package org.teachingextensions.approvals.lite.util.lambda; import java.util.ArrayList; import java.util.Arrays; diff --git a/src/main/java/org/teachingkidsprogramming/util/parser/ParserCommons.java b/src/main/java/org/teachingextensions/approvals/lite/util/parser/ParserCommons.java similarity index 96% rename from src/main/java/org/teachingkidsprogramming/util/parser/ParserCommons.java rename to src/main/java/org/teachingextensions/approvals/lite/util/parser/ParserCommons.java index f5eb701..453d9af 100644 --- a/src/main/java/org/teachingkidsprogramming/util/parser/ParserCommons.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/parser/ParserCommons.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.util.parser; +package org.teachingextensions.approvals.lite.util.parser; import java.util.List; diff --git a/src/main/java/org/teachingkidsprogramming/util/parser/TemplateError.java b/src/main/java/org/teachingextensions/approvals/lite/util/parser/TemplateError.java similarity index 93% rename from src/main/java/org/teachingkidsprogramming/util/parser/TemplateError.java rename to src/main/java/org/teachingextensions/approvals/lite/util/parser/TemplateError.java index 75cba73..af5e7f9 100644 --- a/src/main/java/org/teachingkidsprogramming/util/parser/TemplateError.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/parser/TemplateError.java @@ -1,6 +1,6 @@ -package org.teachingkidsprogramming.util.parser; +package org.teachingextensions.approvals.lite.util.parser; -import org.teachingkidsprogramming.util.velocity.ContextAware; +import org.teachingextensions.approvals.lite.util.velocity.ContextAware; import org.apache.velocity.context.Context; import java.io.ByteArrayOutputStream; diff --git a/src/main/java/org/teachingkidsprogramming/util/persistence/ExecutableQuery.java b/src/main/java/org/teachingextensions/approvals/lite/util/persistence/ExecutableQuery.java similarity index 63% rename from src/main/java/org/teachingkidsprogramming/util/persistence/ExecutableQuery.java rename to src/main/java/org/teachingextensions/approvals/lite/util/persistence/ExecutableQuery.java index 6852dcb..76f8a01 100644 --- a/src/main/java/org/teachingkidsprogramming/util/persistence/ExecutableQuery.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/persistence/ExecutableQuery.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.util.persistence; +package org.teachingextensions.approvals.lite.util.persistence; public interface ExecutableQuery { diff --git a/src/main/java/org/teachingkidsprogramming/util/persistence/Saver.java b/src/main/java/org/teachingextensions/approvals/lite/util/persistence/Saver.java similarity index 55% rename from src/main/java/org/teachingkidsprogramming/util/persistence/Saver.java rename to src/main/java/org/teachingextensions/approvals/lite/util/persistence/Saver.java index e454263..e7e6c97 100644 --- a/src/main/java/org/teachingkidsprogramming/util/persistence/Saver.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/persistence/Saver.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.util.persistence; +package org.teachingextensions.approvals.lite.util.persistence; public interface Saver diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/persistence/SavingException.java b/src/main/java/org/teachingextensions/approvals/lite/util/persistence/SavingException.java new file mode 100644 index 0000000..4527acd --- /dev/null +++ b/src/main/java/org/teachingextensions/approvals/lite/util/persistence/SavingException.java @@ -0,0 +1,5 @@ +package org.teachingextensions.approvals.lite.util.persistence; + +public class SavingException extends RuntimeException +{ +} diff --git a/src/main/java/org/teachingkidsprogramming/util/servlets/InvokerServlet.java b/src/main/java/org/teachingextensions/approvals/lite/util/servlets/InvokerServlet.java similarity index 95% rename from src/main/java/org/teachingkidsprogramming/util/servlets/InvokerServlet.java rename to src/main/java/org/teachingextensions/approvals/lite/util/servlets/InvokerServlet.java index 25c8193..e8e7386 100644 --- a/src/main/java/org/teachingkidsprogramming/util/servlets/InvokerServlet.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/servlets/InvokerServlet.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.util.servlets; +package org.teachingextensions.approvals.lite.util.servlets; /* * Licensed to the Apache Software Foundation (ASF) under one or more @@ -17,8 +17,8 @@ * limitations under the License. */ -import org.teachingkidsprogramming.util.MySystem; -import org.teachingkidsprogramming.util.ObjectUtils; +import org.teachingextensions.approvals.lite.util.MySystem; +import org.teachingextensions.approvals.lite.util.ObjectUtils; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; diff --git a/src/main/java/org/teachingkidsprogramming/util/servlets/ValidationError.java b/src/main/java/org/teachingextensions/approvals/lite/util/servlets/ValidationError.java similarity index 96% rename from src/main/java/org/teachingkidsprogramming/util/servlets/ValidationError.java rename to src/main/java/org/teachingextensions/approvals/lite/util/servlets/ValidationError.java index 88be0a0..da4547c 100644 --- a/src/main/java/org/teachingkidsprogramming/util/servlets/ValidationError.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/servlets/ValidationError.java @@ -1,6 +1,6 @@ -package org.teachingkidsprogramming.util.servlets; +package org.teachingextensions.approvals.lite.util.servlets; -import org.teachingkidsprogramming.util.StringUtils; +import org.teachingextensions.approvals.lite.util.StringUtils; import java.util.HashMap; import java.util.HashSet; diff --git a/src/main/java/org/teachingkidsprogramming/util/velocity/ContextAware.java b/src/main/java/org/teachingextensions/approvals/lite/util/velocity/ContextAware.java similarity index 95% rename from src/main/java/org/teachingkidsprogramming/util/velocity/ContextAware.java rename to src/main/java/org/teachingextensions/approvals/lite/util/velocity/ContextAware.java index 817f7e3..a041c03 100644 --- a/src/main/java/org/teachingkidsprogramming/util/velocity/ContextAware.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/velocity/ContextAware.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.util.velocity; +package org.teachingextensions.approvals.lite.util.velocity; import org.apache.velocity.context.Context; diff --git a/src/main/java/org/teachingkidsprogramming/util/velocity/StringResourceLoader.java b/src/main/java/org/teachingextensions/approvals/lite/util/velocity/StringResourceLoader.java similarity index 94% rename from src/main/java/org/teachingkidsprogramming/util/velocity/StringResourceLoader.java rename to src/main/java/org/teachingextensions/approvals/lite/util/velocity/StringResourceLoader.java index 446d812..3b4f812 100644 --- a/src/main/java/org/teachingkidsprogramming/util/velocity/StringResourceLoader.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/velocity/StringResourceLoader.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.util.velocity; +package org.teachingextensions.approvals.lite.util.velocity; /* * Copyright 2001-2002,2004 The Apache Software Foundation. @@ -20,7 +20,7 @@ import org.apache.velocity.exception.ResourceNotFoundException; import org.apache.velocity.runtime.resource.Resource; import org.apache.velocity.runtime.resource.loader.ResourceLoader; -import org.teachingkidsprogramming.util.StringUtils; +import org.teachingextensions.approvals.lite.util.StringUtils; import java.io.InputStream; diff --git a/src/main/java/org/teachingkidsprogramming/util/velocity/TestableUberspect.java b/src/main/java/org/teachingextensions/approvals/lite/util/velocity/TestableUberspect.java similarity index 98% rename from src/main/java/org/teachingkidsprogramming/util/velocity/TestableUberspect.java rename to src/main/java/org/teachingextensions/approvals/lite/util/velocity/TestableUberspect.java index 28a03fa..b52e641 100644 --- a/src/main/java/org/teachingkidsprogramming/util/velocity/TestableUberspect.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/velocity/TestableUberspect.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.util.velocity; +package org.teachingextensions.approvals.lite.util.velocity; import java.lang.reflect.Method; import java.util.ArrayList; @@ -22,7 +22,7 @@ import org.apache.velocity.util.introspection.VelMethod; import org.apache.velocity.util.introspection.VelPropertyGet; import org.apache.velocity.util.introspection.VelPropertySet; -import org.teachingkidsprogramming.util.ObjectUtils; +import org.teachingextensions.approvals.lite.util.ObjectUtils; /** * Implementation of Uberspect to provide the default introspective diff --git a/src/main/java/org/teachingkidsprogramming/util/velocity/VelocityParser.java b/src/main/java/org/teachingextensions/approvals/lite/util/velocity/VelocityParser.java similarity index 92% rename from src/main/java/org/teachingkidsprogramming/util/velocity/VelocityParser.java rename to src/main/java/org/teachingextensions/approvals/lite/util/velocity/VelocityParser.java index 54bda3a..e16d4ce 100644 --- a/src/main/java/org/teachingkidsprogramming/util/velocity/VelocityParser.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/velocity/VelocityParser.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.util.velocity; +package org.teachingextensions.approvals.lite.util.velocity; import java.io.StringWriter; import java.io.Writer; @@ -15,12 +15,9 @@ import org.apache.velocity.runtime.RuntimeConstants; import org.apache.velocity.runtime.log.NullLogSystem; -import org.teachingkidsprogramming.util.ObjectUtils; -import org.teachingkidsprogramming.util.io.FileUtils; -import org.teachingkidsprogramming.util.parser.ParserCommons; -import org.teachingkidsprogramming.util.velocity.ContextAware; -import org.teachingkidsprogramming.util.velocity.StringResourceLoader; -import org.teachingkidsprogramming.util.velocity.TestableUberspect; +import org.teachingextensions.approvals.lite.util.ObjectUtils; +import org.teachingextensions.approvals.lite.util.io.FileUtils; +import org.teachingextensions.approvals.lite.util.parser.ParserCommons; public class VelocityParser { diff --git a/src/main/java/org/teachingkidsprogramming/util/velocity/VelocityParsingError.java b/src/main/java/org/teachingextensions/approvals/lite/util/velocity/VelocityParsingError.java similarity index 90% rename from src/main/java/org/teachingkidsprogramming/util/velocity/VelocityParsingError.java rename to src/main/java/org/teachingextensions/approvals/lite/util/velocity/VelocityParsingError.java index 24d0538..5ac213a 100644 --- a/src/main/java/org/teachingkidsprogramming/util/velocity/VelocityParsingError.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/velocity/VelocityParsingError.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.util.velocity; +package org.teachingextensions.approvals.lite.util.velocity; import org.apache.velocity.util.introspection.Info; diff --git a/src/main/java/org/teachingextensions/approvals/lite/writers/ApprovalTextWriter.java b/src/main/java/org/teachingextensions/approvals/lite/writers/ApprovalTextWriter.java index 406b9e7..2933671 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/writers/ApprovalTextWriter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/writers/ApprovalTextWriter.java @@ -1,7 +1,7 @@ package org.teachingextensions.approvals.lite.writers; import org.teachingextensions.approvals.lite.ApprovalWriter; -import org.teachingkidsprogramming.util.io.FileUtils; +import org.teachingextensions.approvals.lite.util.io.FileUtils; import java.io.File; diff --git a/src/main/java/org/teachingextensions/logo/ImageBackground.java b/src/main/java/org/teachingextensions/logo/ImageBackground.java index 91cdb81..fb44a20 100644 --- a/src/main/java/org/teachingextensions/logo/ImageBackground.java +++ b/src/main/java/org/teachingextensions/logo/ImageBackground.java @@ -9,7 +9,7 @@ import javax.imageio.ImageIO; import javax.swing.JPanel; -import org.teachingkidsprogramming.util.ObjectUtils; +import org.teachingextensions.approvals.lite.util.ObjectUtils; public class ImageBackground implements Paintable { diff --git a/src/main/java/org/teachingextensions/logo/Turtle.java b/src/main/java/org/teachingextensions/logo/Turtle.java index 989827e..fb32668 100644 --- a/src/main/java/org/teachingextensions/logo/Turtle.java +++ b/src/main/java/org/teachingextensions/logo/Turtle.java @@ -10,12 +10,12 @@ import javax.swing.JFrame; import org.teachingextensions.approvals.lite.writers.ComponentApprovalWriter; -import org.teachingkidsprogramming.util.lambda.Action0; +import org.teachingextensions.approvals.lite.util.lambda.Action0; import org.teachingextensions.windows.ProgramWindow; -import org.teachingkidsprogramming.util.ThreadLauncher; -import org.teachingkidsprogramming.util.persistence.Saver; -import org.teachingkidsprogramming.util.persistence.SavingException; +import org.teachingextensions.approvals.lite.util.ThreadLauncher; +import org.teachingextensions.approvals.lite.util.persistence.Saver; +import org.teachingextensions.approvals.lite.util.persistence.SavingException; /** * A turtle drawing a line diff --git a/src/main/java/org/teachingextensions/logo/VirtualProctorFileSystem.java b/src/main/java/org/teachingextensions/logo/VirtualProctorFileSystem.java index 17f2669..4e95dff 100644 --- a/src/main/java/org/teachingextensions/logo/VirtualProctorFileSystem.java +++ b/src/main/java/org/teachingextensions/logo/VirtualProctorFileSystem.java @@ -7,7 +7,7 @@ import javax.imageio.ImageIO; -import org.teachingkidsprogramming.util.MySystem; +import org.teachingextensions.approvals.lite.util.MySystem; public class VirtualProctorFileSystem extends WindowAdapter { diff --git a/src/main/java/org/teachingextensions/logo/VirtualProctorWeb.java b/src/main/java/org/teachingextensions/logo/VirtualProctorWeb.java index 0c41ee2..f00d856 100644 --- a/src/main/java/org/teachingextensions/logo/VirtualProctorWeb.java +++ b/src/main/java/org/teachingextensions/logo/VirtualProctorWeb.java @@ -14,13 +14,13 @@ import javax.imageio.ImageIO; -import org.teachingkidsprogramming.util.lambda.Action0; +import org.teachingextensions.approvals.lite.util.lambda.Action0; import org.teachingextensions.utils.VirtualProctor; -import org.teachingkidsprogramming.util.MySystem; -import org.teachingkidsprogramming.util.ThreadLauncher; -import org.teachingkidsprogramming.util.ThreadUtils; -import org.teachingkidsprogramming.util.io.FileUtils; +import org.teachingextensions.approvals.lite.util.MySystem; +import org.teachingextensions.approvals.lite.util.ThreadLauncher; +import org.teachingextensions.approvals.lite.util.ThreadUtils; +import org.teachingextensions.approvals.lite.util.io.FileUtils; public class VirtualProctorWeb extends WindowAdapter { diff --git a/src/main/java/org/teachingextensions/logo/Wheel.java b/src/main/java/org/teachingextensions/logo/Wheel.java index 456f7f8..5aeb722 100644 --- a/src/main/java/org/teachingextensions/logo/Wheel.java +++ b/src/main/java/org/teachingextensions/logo/Wheel.java @@ -3,7 +3,7 @@ import java.util.ArrayList; import java.util.List; -import org.teachingkidsprogramming.util.NumberUtils; +import org.teachingextensions.approvals.lite.util.NumberUtils; /** * A Wheel is a List with no ending on beginning
diff --git a/src/main/java/org/teachingextensions/logo/utils/TortoiseUtils.java b/src/main/java/org/teachingextensions/logo/utils/TortoiseUtils.java index f0817fe..2eef2e6 100644 --- a/src/main/java/org/teachingextensions/logo/utils/TortoiseUtils.java +++ b/src/main/java/org/teachingextensions/logo/utils/TortoiseUtils.java @@ -4,7 +4,7 @@ import org.teachingextensions.approvals.lite.namer.ApprovalResults; import org.teachingextensions.logo.Turtle; -import org.teachingkidsprogramming.util.ObjectUtils; +import org.teachingextensions.approvals.lite.util.ObjectUtils; public class TortoiseUtils { diff --git a/src/main/java/org/teachingextensions/setup/CommandLineUtils.java b/src/main/java/org/teachingextensions/setup/CommandLineUtils.java index f0b854f..bacad17 100644 --- a/src/main/java/org/teachingextensions/setup/CommandLineUtils.java +++ b/src/main/java/org/teachingextensions/setup/CommandLineUtils.java @@ -2,7 +2,7 @@ import java.io.IOException; -import org.teachingkidsprogramming.util.ObjectUtils; +import org.teachingextensions.approvals.lite.util.ObjectUtils; public class CommandLineUtils { diff --git a/src/main/java/org/teachingextensions/setup/MacThumbDriveInstaller.java b/src/main/java/org/teachingextensions/setup/MacThumbDriveInstaller.java index 535a85b..5f9c4d3 100644 --- a/src/main/java/org/teachingextensions/setup/MacThumbDriveInstaller.java +++ b/src/main/java/org/teachingextensions/setup/MacThumbDriveInstaller.java @@ -5,8 +5,8 @@ import javax.swing.filechooser.FileSystemView; -import org.teachingkidsprogramming.util.ObjectUtils; -import org.teachingkidsprogramming.util.io.ZipUtils; +import org.teachingextensions.approvals.lite.util.ObjectUtils; +import org.teachingextensions.approvals.lite.util.io.ZipUtils; public class MacThumbDriveInstaller { diff --git a/src/main/java/org/teachingextensions/setup/SetupConfig.java b/src/main/java/org/teachingextensions/setup/SetupConfig.java index 4e38a70..aa79ec6 100644 --- a/src/main/java/org/teachingextensions/setup/SetupConfig.java +++ b/src/main/java/org/teachingextensions/setup/SetupConfig.java @@ -2,8 +2,8 @@ import org.teachingextensions.setup.SetupValidator.SetupCheckPoints; -import org.teachingkidsprogramming.util.SystemUtils; -import org.teachingkidsprogramming.util.servlets.ValidationError; +import org.teachingextensions.approvals.lite.util.SystemUtils; +import org.teachingextensions.approvals.lite.util.servlets.ValidationError; public class SetupConfig { diff --git a/src/main/java/org/teachingextensions/setup/SetupValidator.java b/src/main/java/org/teachingextensions/setup/SetupValidator.java index b9cfe45..e363b5e 100644 --- a/src/main/java/org/teachingextensions/setup/SetupValidator.java +++ b/src/main/java/org/teachingextensions/setup/SetupValidator.java @@ -5,9 +5,9 @@ import org.teachingextensions.windows.MessageBox; -import org.teachingkidsprogramming.util.ObjectUtils; -import org.teachingkidsprogramming.util.io.FileUtils; -import org.teachingkidsprogramming.util.io.ZipUtils; +import org.teachingextensions.approvals.lite.util.ObjectUtils; +import org.teachingextensions.approvals.lite.util.io.FileUtils; +import org.teachingextensions.approvals.lite.util.io.ZipUtils; public class SetupValidator { diff --git a/src/main/java/org/teachingextensions/setup/ThumbDriveInstaller.java b/src/main/java/org/teachingextensions/setup/ThumbDriveInstaller.java index 068feb2..8dfcee9 100644 --- a/src/main/java/org/teachingextensions/setup/ThumbDriveInstaller.java +++ b/src/main/java/org/teachingextensions/setup/ThumbDriveInstaller.java @@ -1,6 +1,6 @@ package org.teachingextensions.setup; -import org.teachingkidsprogramming.util.SystemUtils; +import org.teachingextensions.approvals.lite.util.SystemUtils; public class ThumbDriveInstaller { diff --git a/src/main/java/org/teachingextensions/simpleparser/Parser.java b/src/main/java/org/teachingextensions/simpleparser/Parser.java index b6be3c3..1e4f1aa 100644 --- a/src/main/java/org/teachingextensions/simpleparser/Parser.java +++ b/src/main/java/org/teachingextensions/simpleparser/Parser.java @@ -3,11 +3,11 @@ import java.lang.reflect.Field; import java.util.List; -import org.teachingkidsprogramming.util.lambda.Function1; -import org.teachingkidsprogramming.util.lambda.Query; +import org.teachingextensions.approvals.lite.util.lambda.Function1; +import org.teachingextensions.approvals.lite.util.lambda.Query; -import org.teachingkidsprogramming.util.ObjectUtils; -import org.teachingkidsprogramming.util.io.FileUtils; +import org.teachingextensions.approvals.lite.util.ObjectUtils; +import org.teachingextensions.approvals.lite.util.io.FileUtils; public class Parser { diff --git a/src/main/java/org/teachingextensions/utils/Viewer.java b/src/main/java/org/teachingextensions/utils/Viewer.java index ee1afd8..5bc970c 100644 --- a/src/main/java/org/teachingextensions/utils/Viewer.java +++ b/src/main/java/org/teachingextensions/utils/Viewer.java @@ -4,8 +4,8 @@ import java.io.FileWriter; import java.io.IOException; -import org.teachingkidsprogramming.util.ObjectUtils; -import org.teachingkidsprogramming.util.TestUtils; +import org.teachingextensions.approvals.lite.util.ObjectUtils; +import org.teachingextensions.approvals.lite.util.TestUtils; public class Viewer { diff --git a/src/main/java/org/teachingextensions/utils/VirtualProctor.java b/src/main/java/org/teachingextensions/utils/VirtualProctor.java index c577db7..fb660a4 100644 --- a/src/main/java/org/teachingextensions/utils/VirtualProctor.java +++ b/src/main/java/org/teachingextensions/utils/VirtualProctor.java @@ -2,8 +2,8 @@ import java.io.File; -import org.teachingkidsprogramming.util.StringUtils; -import org.teachingkidsprogramming.util.io.FileUtils; +import org.teachingextensions.approvals.lite.util.StringUtils; +import org.teachingextensions.approvals.lite.util.io.FileUtils; /** * A window image Program Window diff --git a/src/main/java/org/teachingkidsprogramming/recipes/completed/ChooseYourOwnAdventure.java b/src/main/java/org/teachingkidsprogramming/recipes/completed/ChooseYourOwnAdventure.java index 597e998..8774d86 100644 --- a/src/main/java/org/teachingkidsprogramming/recipes/completed/ChooseYourOwnAdventure.java +++ b/src/main/java/org/teachingkidsprogramming/recipes/completed/ChooseYourOwnAdventure.java @@ -6,7 +6,7 @@ import org.teachingextensions.logo.Tortoise; import org.teachingextensions.windows.MessageBox; -import org.teachingkidsprogramming.util.ThreadUtils; +import org.teachingextensions.approvals.lite.util.ThreadUtils; public class ChooseYourOwnAdventure { diff --git a/src/main/java/org/teachingkidsprogramming/recipes/completed/HiLow.java b/src/main/java/org/teachingkidsprogramming/recipes/completed/HiLow.java index 618315d..62a74cb 100644 --- a/src/main/java/org/teachingkidsprogramming/recipes/completed/HiLow.java +++ b/src/main/java/org/teachingkidsprogramming/recipes/completed/HiLow.java @@ -2,7 +2,7 @@ import org.teachingextensions.windows.MessageBox; -import org.teachingkidsprogramming.util.NumberUtils; +import org.teachingextensions.approvals.lite.util.NumberUtils; public class HiLow { diff --git a/src/main/java/org/teachingkidsprogramming/recipes/completed/SimpleBubble.java b/src/main/java/org/teachingkidsprogramming/recipes/completed/SimpleBubble.java index 186df19..3a7dc60 100644 --- a/src/main/java/org/teachingkidsprogramming/recipes/completed/SimpleBubble.java +++ b/src/main/java/org/teachingkidsprogramming/recipes/completed/SimpleBubble.java @@ -6,7 +6,7 @@ import org.teachingextensions.windows.MouseLeftClickListener; import org.teachingextensions.windows.ProgramWindow; -import org.teachingkidsprogramming.util.NumberUtils; +import org.teachingextensions.approvals.lite.util.NumberUtils; public class SimpleBubble implements MouseLeftClickListener { diff --git a/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/HousesQuizGrader.java b/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/HousesQuizGrader.java index bda5563..1bb82fa 100644 --- a/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/HousesQuizGrader.java +++ b/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/HousesQuizGrader.java @@ -10,7 +10,7 @@ import org.teachingextensions.logo.Turtle; import org.teachingextensions.logo.utils.TortoiseUtils; -import org.teachingkidsprogramming.util.NumberUtils; +import org.teachingextensions.approvals.lite.util.NumberUtils; public class HousesQuizGrader implements Paintable { diff --git a/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/PentagonCrazyQuizGrader.java b/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/PentagonCrazyQuizGrader.java index 88a86b2..c6e129b 100644 --- a/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/PentagonCrazyQuizGrader.java +++ b/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/PentagonCrazyQuizGrader.java @@ -13,7 +13,7 @@ import org.teachingextensions.logo.Wheel; import org.teachingextensions.logo.utils.TortoiseUtils; -import org.teachingkidsprogramming.util.NumberUtils; +import org.teachingextensions.approvals.lite.util.NumberUtils; public class PentagonCrazyQuizGrader implements Paintable { diff --git a/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/SimpleSquareQuizGrader.java b/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/SimpleSquareQuizGrader.java index 47fc8b5..7044600 100644 --- a/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/SimpleSquareQuizGrader.java +++ b/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/SimpleSquareQuizGrader.java @@ -9,7 +9,7 @@ import org.teachingextensions.logo.Turtle; import org.teachingextensions.logo.utils.TortoiseUtils; -import org.teachingkidsprogramming.util.NumberUtils; +import org.teachingextensions.approvals.lite.util.NumberUtils; public class SimpleSquareQuizGrader implements Paintable { diff --git a/src/main/java/org/teachingkidsprogramming/section09exceptions/DeepDive09exceptions.java b/src/main/java/org/teachingkidsprogramming/section09exceptions/DeepDive09exceptions.java index 1cd09e4..ccea26a 100644 --- a/src/main/java/org/teachingkidsprogramming/section09exceptions/DeepDive09exceptions.java +++ b/src/main/java/org/teachingkidsprogramming/section09exceptions/DeepDive09exceptions.java @@ -4,7 +4,7 @@ import org.junit.Ignore; import org.junit.Test; -import org.teachingkidsprogramming.util.FormattedException; +import org.teachingextensions.approvals.lite.util.FormattedException; @Ignore public class DeepDive09exceptions diff --git a/src/main/java/org/teachingkidsprogramming/util/lambda/Action0.java b/src/main/java/org/teachingkidsprogramming/util/lambda/Action0.java deleted file mode 100644 index c4ebc6d..0000000 --- a/src/main/java/org/teachingkidsprogramming/util/lambda/Action0.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.teachingkidsprogramming.util.lambda; - -public interface Action0 { - public void call(); -} diff --git a/src/main/java/org/teachingkidsprogramming/util/persistence/SavingException.java b/src/main/java/org/teachingkidsprogramming/util/persistence/SavingException.java deleted file mode 100644 index 871f375..0000000 --- a/src/main/java/org/teachingkidsprogramming/util/persistence/SavingException.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.teachingkidsprogramming.util.persistence; - -public class SavingException extends RuntimeException -{ -} diff --git a/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.java b/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.java index 7b1e726..0c0fcf1 100644 --- a/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.java +++ b/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.java @@ -15,12 +15,12 @@ import org.teachingextensions.approvals.lite.reporters.UseReporter; import org.teachingextensions.approvals.lite.reporters.windows.TortoiseTextDiffReporter; -import org.teachingkidsprogramming.util.StringUtils; -import org.teachingkidsprogramming.util.TestUtils; -import org.teachingkidsprogramming.util.Tuple; -import org.teachingkidsprogramming.util.io.FileUtils; -import org.teachingkidsprogramming.util.velocity.ContextAware.ContextAwareMap; -import org.teachingkidsprogramming.util.velocity.VelocityParser; +import org.teachingextensions.approvals.lite.util.StringUtils; +import org.teachingextensions.approvals.lite.util.TestUtils; +import org.teachingextensions.approvals.lite.util.Tuple; +import org.teachingextensions.approvals.lite.util.io.FileUtils; +import org.teachingextensions.approvals.lite.util.velocity.ContextAware.ContextAwareMap; +import org.teachingextensions.approvals.lite.util.velocity.VelocityParser; @UseReporter(TortoiseTextDiffReporter.class) public class ColorGeneration extends TestCase diff --git a/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.testGeneration.approved.txt b/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.testGeneration.approved.txt index e29cfe5..c5d9e95 100644 --- a/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.testGeneration.approved.txt +++ b/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.testGeneration.approved.txt @@ -2,7 +2,7 @@ package org.teachingextensions.logo; import java.awt.Color; -import org.teachingkidsprogramming.util.NumberUtils; +import org.teachingextensions.approvals.lite.util.NumberUtils; /** * Every color under the diff --git a/src/test/java/org/teachingextensions/logo/tests/TurtleTest.java b/src/test/java/org/teachingextensions/logo/tests/TurtleTest.java index 9199f0d..a82a84e 100644 --- a/src/test/java/org/teachingextensions/logo/tests/TurtleTest.java +++ b/src/test/java/org/teachingextensions/logo/tests/TurtleTest.java @@ -8,7 +8,7 @@ import org.teachingextensions.approvals.lite.reporters.DelayedClipboardReporter; import org.teachingextensions.approvals.lite.reporters.DiffReporter; import org.teachingextensions.approvals.lite.reporters.UseReporter; -import org.teachingkidsprogramming.util.lambda.Function1; +import org.teachingextensions.approvals.lite.util.lambda.Function1; import org.teachingextensions.logo.PenColors; import org.teachingextensions.logo.Turtle; import org.teachingextensions.logo.Wheel; diff --git a/src/test/java/org/teachingextensions/logo/tests/colors.java.template b/src/test/java/org/teachingextensions/logo/tests/colors.java.template index 0bba9cc..79a202d 100644 --- a/src/test/java/org/teachingextensions/logo/tests/colors.java.template +++ b/src/test/java/org/teachingextensions/logo/tests/colors.java.template @@ -2,7 +2,7 @@ package org.teachingextensions.logo; import java.awt.Color; -import org.teachingkidsprogramming.util.NumberUtils; +import org.teachingextensions.approvals.lite.util.NumberUtils; /** * Every color under the diff --git a/src/test/java/org/teachingextensions/setup/tests/UnzipTest.java b/src/test/java/org/teachingextensions/setup/tests/UnzipTest.java index 1c7bf78..d2c4ae6 100644 --- a/src/test/java/org/teachingextensions/setup/tests/UnzipTest.java +++ b/src/test/java/org/teachingextensions/setup/tests/UnzipTest.java @@ -2,7 +2,7 @@ import java.io.File; -import org.teachingkidsprogramming.util.io.ZipUtils; +import org.teachingextensions.approvals.lite.util.io.ZipUtils; public class UnzipTest // extends TestCase { diff --git a/src/test/java/org/teachingkidsprogramming/util/io/tests/FileMonitorTest.java b/src/test/java/org/teachingkidsprogramming/util/io/tests/FileMonitorTest.java index 58cac7d..dfd9269 100644 --- a/src/test/java/org/teachingkidsprogramming/util/io/tests/FileMonitorTest.java +++ b/src/test/java/org/teachingkidsprogramming/util/io/tests/FileMonitorTest.java @@ -2,9 +2,9 @@ import java.io.File; -import org.teachingkidsprogramming.util.io.FileMonitor; +import org.teachingextensions.approvals.lite.util.io.FileMonitor; import junit.framework.TestCase; -import org.teachingkidsprogramming.util.io.FileMonitor.FileListener; +import org.teachingextensions.approvals.lite.util.io.FileMonitor.FileListener; public class FileMonitorTest extends TestCase { diff --git a/src/test/java/org/teachingkidsprogramming/util/tests/SearchingFileFilterTest.java b/src/test/java/org/teachingkidsprogramming/util/tests/SearchingFileFilterTest.java index 64eee53..84cd96e 100644 --- a/src/test/java/org/teachingkidsprogramming/util/tests/SearchingFileFilterTest.java +++ b/src/test/java/org/teachingkidsprogramming/util/tests/SearchingFileFilterTest.java @@ -1,7 +1,7 @@ package org.teachingkidsprogramming.util.tests; import junit.framework.TestCase; -import org.teachingkidsprogramming.util.SearchingFileFilter; +import org.teachingextensions.approvals.lite.util.SearchingFileFilter; public class SearchingFileFilterTest extends TestCase { diff --git a/src/test/resources/ColorGeneration.testGeneration.approved.txt b/src/test/resources/ColorGeneration.testGeneration.approved.txt index e29cfe5..c5d9e95 100644 --- a/src/test/resources/ColorGeneration.testGeneration.approved.txt +++ b/src/test/resources/ColorGeneration.testGeneration.approved.txt @@ -2,7 +2,7 @@ package org.teachingextensions.logo; import java.awt.Color; -import org.teachingkidsprogramming.util.NumberUtils; +import org.teachingextensions.approvals.lite.util.NumberUtils; /** * Every color under the diff --git a/src/test/resources/colors.java.template b/src/test/resources/colors.java.template index 0bba9cc..79a202d 100644 --- a/src/test/resources/colors.java.template +++ b/src/test/resources/colors.java.template @@ -2,7 +2,7 @@ package org.teachingextensions.logo; import java.awt.Color; -import org.teachingkidsprogramming.util.NumberUtils; +import org.teachingextensions.approvals.lite.util.NumberUtils; /** * Every color under the From 19b81f9c84b2aaf8b66d02fd68cb6701f6cf7fce Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Tue, 17 Mar 2015 16:56:18 -0700 Subject: [PATCH 070/111] second cleanup iteration --- .../approvals/lite/Approvals.java | 102 ++-- .../reporters/DelayedClipboardReporter.java | 39 +- .../lite/reporters/DiffReporter.java | 13 +- .../reporters/EnvironmentAwareReporter.java | 5 +- .../lite/reporters/FileLauncherReporter.java | 18 +- .../lite/reporters/FirstWorkingReporter.java | 50 +- .../lite/reporters/GenericDiffReporter.java | 148 +++--- .../lite/reporters/ImageReporter.java | 12 +- .../lite/reporters/ImageWebReporter.java | 43 +- .../lite/reporters/JunitReporter.java | 47 +- .../lite/reporters/QuietReporter.java | 25 +- .../reporters/macosx/DiffMergeReporter.java | 21 +- .../reporters/macosx/MacDiffReporter.java | 13 +- .../reporters/macosx/P4MergeReporter.java | 36 +- .../lite/reporters/macosx/TkDiffReporter.java | 17 - .../windows/BeyondCompareReporter.java | 21 +- .../windows/TortoiseDiffReporter.java | 13 +- .../windows/WindowsDiffReporter.java | 13 +- .../approvals/lite/util/ArrayUtils.java | 1 - .../approvals/lite/util/ClassUtils.java | 187 ++++---- .../approvals/lite/util/DateDifference.java | 2 + .../approvals/lite/util/DateUtils.java | 242 +++++----- .../approvals/lite/util/Filter.java | 27 +- .../approvals/lite/util/FilterUtils.java | 60 ++- .../lite/util/MethodExecutionPath.java | 104 ++-- .../approvals/lite/util/NumberUtils.java | 80 ++-- .../approvals/lite/util/ObjectUtils.java | 228 +++++---- .../approvals/lite/util/PhoneNumber.java | 254 ---------- .../lite/util/SearchingFileFilter.java | 75 ++- .../lite/util/StackTraceReflectionResult.java | 53 +-- .../approvals/lite/util/StringUtils.java | 47 -- .../approvals/lite/util/SystemUtils.java | 10 +- .../approvals/lite/util/ThreadUtils.java | 19 +- .../approvals/lite/util/io/FileUtils.java | 34 -- .../lite/util/io/SimpleDirectoryFilter.java | 34 +- .../lite/util/io/SimpleFileFilter.java | 33 +- .../lite/util/io/StackElementSelector.java | 5 +- .../approvals/lite/util/io/ZipUtils.java | 161 +++---- .../lite/util/parser/ParserCommons.java | 7 - .../lite/util/parser/TemplateError.java | 75 --- .../util/persistence/ExecutableQuery.java | 6 - .../lite/util/persistence/Saver.java | 5 +- .../util/persistence/SavingException.java | 3 +- .../lite/util/servlets/ValidationError.java | 176 ++++--- .../lite/util/velocity/TestableUberspect.java | 445 +++++++++--------- .../lite/util/velocity/VelocityParser.java | 206 +++----- .../util/velocity/VelocityParsingError.java | 37 +- .../lite}/util/io/tests/FileMonitorTest.java | 2 +- .../util/tests/SearchingFileFilterTest.java | 2 +- 49 files changed, 1354 insertions(+), 1902 deletions(-) delete mode 100644 src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/TkDiffReporter.java delete mode 100644 src/main/java/org/teachingextensions/approvals/lite/util/PhoneNumber.java delete mode 100644 src/main/java/org/teachingextensions/approvals/lite/util/parser/TemplateError.java delete mode 100644 src/main/java/org/teachingextensions/approvals/lite/util/persistence/ExecutableQuery.java rename src/test/java/org/{teachingkidsprogramming => teachingextensions/approvals/lite}/util/io/tests/FileMonitorTest.java (95%) rename src/test/java/org/{teachingkidsprogramming => teachingextensions/approvals/lite}/util/tests/SearchingFileFilterTest.java (93%) diff --git a/src/main/java/org/teachingextensions/approvals/lite/Approvals.java b/src/main/java/org/teachingextensions/approvals/lite/Approvals.java index 4baac7f..8326498 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/Approvals.java +++ b/src/main/java/org/teachingextensions/approvals/lite/Approvals.java @@ -3,78 +3,78 @@ import org.teachingextensions.approvals.lite.ReporterFactory.FileTypes; import org.teachingextensions.approvals.lite.namer.ApprovalNamer; import org.teachingextensions.approvals.lite.namer.JUnitStackTraceNamer; -import org.teachingextensions.approvals.lite.writers.ApprovalTextWriter; -import org.teachingextensions.approvals.lite.writers.ImageApprovalWriter; -import org.teachingextensions.approvals.lite.util.lambda.Function1; import org.teachingextensions.approvals.lite.util.ArrayUtils; import org.teachingextensions.approvals.lite.util.ObjectUtils; import org.teachingextensions.approvals.lite.util.StringUtils; +import org.teachingextensions.approvals.lite.util.lambda.Function1; +import org.teachingextensions.approvals.lite.writers.ApprovalTextWriter; +import org.teachingextensions.approvals.lite.writers.ImageApprovalWriter; import java.awt.image.BufferedImage; import java.util.Arrays; public class Approvals { - public static void verify(String response) throws Exception { - verify(new ApprovalTextWriter(response, "txt"), FileTypes.Text); - } + public static void verify(String response) throws Exception { + verify(new ApprovalTextWriter(response, "txt"), FileTypes.Text); + } public static void verifyAll(String header, T[] values, - Function1 f1) { - verifyAll(header, Arrays.asList(values), f1); - } + Function1 f1) { + verifyAll(header, Arrays.asList(values), f1); + } - public static void verifyAll(String header, Iterable array, - Function1 f1) { - String text = formatHeader(header) + ArrayUtils.toString(array, f1); - verify(new ApprovalTextWriter(text, "txt"), FileTypes.Text); - } + public static void verifyAll(String header, Iterable array, + Function1 f1) { + String text = formatHeader(header) + ArrayUtils.toString(array, f1); + verify(new ApprovalTextWriter(text, "txt"), FileTypes.Text); + } - private static String formatHeader(String header) { - return StringUtils.isEmpty(header) ? "" : header + "\r\n\r\n\r\n"; - } + private static String formatHeader(String header) { + return StringUtils.isEmpty(header) ? "" : header + "\r\n\r\n\r\n"; + } public static void verifyHtml(String response) throws Exception { - verify(new ApprovalTextWriter(response, "html"), FileTypes.Html); - } + verify(new ApprovalTextWriter(response, "html"), FileTypes.Html); + } public static void verify(BufferedImage bufferedImage) { - verify(new ImageApprovalWriter(bufferedImage), FileTypes.Image); - } + verify(new ImageApprovalWriter(bufferedImage), FileTypes.Image); + } - public static void verify(ApprovalWriter writer, ApprovalNamer namer, - ApprovalFailureReporter reporter) { - verify(new FileApprover(writer, namer), reporter); - } + public static void verify(ApprovalWriter writer, ApprovalNamer namer, + ApprovalFailureReporter reporter) { + verify(new FileApprover(writer, namer), reporter); + } - public static void verify(ApprovalWriter writer, String fileType) { - verify(writer, createApprovalNamer(), ReporterFactory.get(fileType)); - } + public static void verify(ApprovalWriter writer, String fileType) { + verify(writer, createApprovalNamer(), ReporterFactory.get(fileType)); + } public static void verify(FileApprover approver, - ApprovalFailureReporter reporter) { - try { - if (!approver.approve()) { - boolean passed = false; - if (reporter instanceof ApprovalFailureOverrider) { - passed = approver - .askToChangeReceivedToApproved((ApprovalFailureOverrider) reporter); - } - if (!passed) { - approver.reportFailure(reporter); - approver.fail(); - } else { - approver.cleanUpAfterSuccess(reporter); - } - } else { - approver.cleanUpAfterSuccess(reporter); - } - } catch (Exception e) { - throw ObjectUtils.throwAsError(e); - } - } + ApprovalFailureReporter reporter) { + try { + if (!approver.approve()) { + boolean passed = false; + if (reporter instanceof ApprovalFailureOverrider) { + passed = approver + .askToChangeReceivedToApproved((ApprovalFailureOverrider) reporter); + } + if (!passed) { + approver.reportFailure(reporter); + approver.fail(); + } else { + approver.cleanUpAfterSuccess(reporter); + } + } else { + approver.cleanUpAfterSuccess(reporter); + } + } catch (Exception e) { + throw ObjectUtils.throwAsError(e); + } + } public static ApprovalNamer createApprovalNamer() { - return new JUnitStackTraceNamer(); - } + return new JUnitStackTraceNamer(); + } } \ No newline at end of file diff --git a/src/main/java/org/teachingextensions/approvals/lite/reporters/DelayedClipboardReporter.java b/src/main/java/org/teachingextensions/approvals/lite/reporters/DelayedClipboardReporter.java index e482666..cfea6aa 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/reporters/DelayedClipboardReporter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/reporters/DelayedClipboardReporter.java @@ -1,31 +1,30 @@ package org.teachingextensions.approvals.lite.reporters; -import java.awt.GraphicsEnvironment; - import org.teachingextensions.approvals.lite.util.StringUtils; import org.teachingextensions.approvals.lite.util.WindowUtils; +import java.awt.*; + /** * A reporter which creates the command to accept the received * file as the approve file and copies it to the clipboard:
* move received.txt approved.txt */ -public class DelayedClipboardReporter implements EnvironmentAwareReporter -{ - private static StringBuffer text = new StringBuffer(); - @Override - public void report(String received, String approved) throws Exception - { - String commandLine = ClipboardReporter.getCommandLine(received, approved); - text.append(commandLine).append(StringUtils.NEW_LINE); - WindowUtils.copyToClipBoard(text.toString(), false); - } - /** - * The clipboard will not be available in a headless environment. - */ - @Override - public boolean isWorkingInThisEnvironment(String forFile) - { - return !GraphicsEnvironment.isHeadless(); - } +public class DelayedClipboardReporter implements EnvironmentAwareReporter { + private static StringBuffer text = new StringBuffer(); + + @Override + public void report(String received, String approved) throws Exception { + String commandLine = ClipboardReporter.getCommandLine(received, approved); + text.append(commandLine).append(StringUtils.NEW_LINE); + WindowUtils.copyToClipBoard(text.toString(), false); + } + + /** + * The clipboard will not be available in a headless environment. + */ + @Override + public boolean isWorkingInThisEnvironment(String forFile) { + return !GraphicsEnvironment.isHeadless(); + } } diff --git a/src/main/java/org/teachingextensions/approvals/lite/reporters/DiffReporter.java b/src/main/java/org/teachingextensions/approvals/lite/reporters/DiffReporter.java index 6985623..77f0056 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/reporters/DiffReporter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/reporters/DiffReporter.java @@ -3,11 +3,10 @@ import org.teachingextensions.approvals.lite.reporters.macosx.MacDiffReporter; import org.teachingextensions.approvals.lite.reporters.windows.WindowsDiffReporter; -public class DiffReporter extends FirstWorkingReporter -{ - public static final DiffReporter INSTANCE = new DiffReporter(); - public DiffReporter() - { - super(WindowsDiffReporter.INSTANCE, MacDiffReporter.INSTANCE, JunitReporter.INSTANCE, QuietReporter.INSTANCE); - } +public class DiffReporter extends FirstWorkingReporter { + public static final DiffReporter INSTANCE = new DiffReporter(); + + public DiffReporter() { + super(WindowsDiffReporter.INSTANCE, MacDiffReporter.INSTANCE, JunitReporter.INSTANCE, QuietReporter.INSTANCE); + } } diff --git a/src/main/java/org/teachingextensions/approvals/lite/reporters/EnvironmentAwareReporter.java b/src/main/java/org/teachingextensions/approvals/lite/reporters/EnvironmentAwareReporter.java index a83c781..40e2a41 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/reporters/EnvironmentAwareReporter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/reporters/EnvironmentAwareReporter.java @@ -2,7 +2,6 @@ import org.teachingextensions.approvals.lite.ApprovalFailureReporter; -public interface EnvironmentAwareReporter extends ApprovalFailureReporter -{ - boolean isWorkingInThisEnvironment(String forFile); +public interface EnvironmentAwareReporter extends ApprovalFailureReporter { + boolean isWorkingInThisEnvironment(String forFile); } diff --git a/src/main/java/org/teachingextensions/approvals/lite/reporters/FileLauncherReporter.java b/src/main/java/org/teachingextensions/approvals/lite/reporters/FileLauncherReporter.java index f7de01c..cf1b50c 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/reporters/FileLauncherReporter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/reporters/FileLauncherReporter.java @@ -2,19 +2,15 @@ import org.teachingextensions.approvals.lite.ApprovalFailureReporter; - import org.teachingextensions.approvals.lite.util.TestUtils; import org.teachingextensions.approvals.lite.util.io.FileUtils; -public class FileLauncherReporter implements ApprovalFailureReporter -{ - //@Override - public void report(String received, String approved) throws Exception - { - if (FileUtils.isNonEmptyFile(approved)) - { - TestUtils.displayFile(approved); +public class FileLauncherReporter implements ApprovalFailureReporter { + @Override + public void report(String received, String approved) throws Exception { + if (FileUtils.isNonEmptyFile(approved)) { + TestUtils.displayFile(approved); + } + TestUtils.displayFile(received); } - TestUtils.displayFile(received); - } } diff --git a/src/main/java/org/teachingextensions/approvals/lite/reporters/FirstWorkingReporter.java b/src/main/java/org/teachingextensions/approvals/lite/reporters/FirstWorkingReporter.java index c0d5334..599ebf4 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/reporters/FirstWorkingReporter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/reporters/FirstWorkingReporter.java @@ -1,31 +1,29 @@ package org.teachingextensions.approvals.lite.reporters; -public class FirstWorkingReporter implements EnvironmentAwareReporter -{ - private final EnvironmentAwareReporter[] reporters; - public FirstWorkingReporter(EnvironmentAwareReporter... reporters) - { - this.reporters = reporters; - } - @Override - public void report(String received, String approved) throws Exception - { - for (EnvironmentAwareReporter reporter : reporters) - { - if (reporter.isWorkingInThisEnvironment(received)) - { - reporter.report(received, approved); - return; - } +public class FirstWorkingReporter implements EnvironmentAwareReporter { + private final EnvironmentAwareReporter[] reporters; + + public FirstWorkingReporter(EnvironmentAwareReporter... reporters) { + this.reporters = reporters; + } + + @Override + public void report(String received, String approved) throws Exception { + for (EnvironmentAwareReporter reporter : reporters) { + if (reporter.isWorkingInThisEnvironment(received)) { + reporter.report(received, approved); + return; + } + } } - } - @Override - public boolean isWorkingInThisEnvironment(String forFile) - { - for (EnvironmentAwareReporter reporter : reporters) - { - if (reporter.isWorkingInThisEnvironment(forFile)) { return true; } + + @Override + public boolean isWorkingInThisEnvironment(String forFile) { + for (EnvironmentAwareReporter reporter : reporters) { + if (reporter.isWorkingInThisEnvironment(forFile)) { + return true; + } + } + return false; } - return false; - } } diff --git a/src/main/java/org/teachingextensions/approvals/lite/reporters/GenericDiffReporter.java b/src/main/java/org/teachingextensions/approvals/lite/reporters/GenericDiffReporter.java index 6efad0b..2855c8c 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/reporters/GenericDiffReporter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/reporters/GenericDiffReporter.java @@ -1,84 +1,84 @@ package org.teachingextensions.approvals.lite.reporters; +import org.teachingextensions.approvals.lite.util.ThreadUtils; +import org.teachingextensions.approvals.lite.util.io.FileUtils; + import java.io.File; import java.io.IOException; import java.util.Arrays; import java.util.List; -import org.teachingextensions.approvals.lite.util.ThreadUtils; -import org.teachingextensions.approvals.lite.util.io.FileUtils; +public class GenericDiffReporter implements EnvironmentAwareReporter { + public static final String STANDARD_ARGUMENTS = "%s %s"; + public static boolean REPORT_MISSING_FILES = false; + protected String diffProgram; + protected String arguments; + protected String diffProgramNotFoundMessage; + private List validExtensions; + public static List TEXT_FILE_EXTENSIONS = Arrays.asList(".txt", ".csv", ".htm", ".html", ".xml", + ".eml", ".java", ".css", ".js"); + public static List IMAGE_FILE_EXTENSIONS = Arrays.asList(".png", ".gif", ".jpg", ".jpeg", ".bmp", + ".tif", ".tiff"); + + public GenericDiffReporter(String diffProgram, String diffProgramNotFoundMessage) { + this(diffProgram, STANDARD_ARGUMENTS, diffProgramNotFoundMessage); + } + + private GenericDiffReporter(String diffProgram, String argumentsFormat, String diffProgramNotFoundMessage) { + this(diffProgram, argumentsFormat, diffProgramNotFoundMessage, TEXT_FILE_EXTENSIONS); + } + + public GenericDiffReporter(String diffProgram, String argumentsFormat, String diffProgramNotFoundMessage, + List validFileExtensions) { + this.diffProgram = diffProgram; + this.arguments = argumentsFormat; + this.diffProgramNotFoundMessage = diffProgramNotFoundMessage; + validExtensions = validFileExtensions; + } + + @Override + public void report(String received, String approved) throws Exception { + if (!isWorkingInThisEnvironment(received)) { + throw new RuntimeException(diffProgramNotFoundMessage); + } + FileUtils.createIfNeeded(approved); + launch(received, approved); + } + + private void launch(String received, String approved) throws IOException { + ProcessBuilder builder = new ProcessBuilder(getCommandLine(received, approved)); + builder.start(); + ThreadUtils.sleep(500); //Give program time to start + } + + public String[] getCommandLine(String received, String approved) { + String[] p = arguments.split(" "); + String r = String.format(p[0], received); + String a = String.format(p[1], approved); + String[] commands = new String[]{diffProgram, r, a}; + System.out.println(Arrays.toString(commands)); + return commands; + } + + @Override + public boolean isWorkingInThisEnvironment(String forFile) { + return checkFileExists() && isFileExtensionHandled(forFile); + } + + public boolean checkFileExists() { + boolean exists = new File(diffProgram).exists(); + if (REPORT_MISSING_FILES && !exists) { + System.out.println(String.format("%s can't find '%s'", this.getClass().getSimpleName(), diffProgram)); + } + return exists; + } + + public boolean isFileExtensionHandled(String forFile) { + return isFileExtensionValid(forFile, validExtensions); + } -public class GenericDiffReporter implements EnvironmentAwareReporter -{ - public static final String STANDARD_ARGUMENTS = "%s %s"; - public static boolean REPORT_MISSING_FILES = false; - protected String diffProgram; - protected String arguments; - protected String diffProgramNotFoundMessage; - private List validExtensions; - public static List TEXT_FILE_EXTENSIONS = Arrays.asList(".txt", ".csv", ".htm", ".html", ".xml", - ".eml", ".java", ".css", ".js"); - public static List IMAGE_FILE_EXTENSIONS = Arrays.asList(".png", ".gif", ".jpg", ".jpeg", ".bmp", - ".tif", ".tiff"); - public GenericDiffReporter(String diffProgram, String diffProgramNotFoundMessage) - { - this(diffProgram, STANDARD_ARGUMENTS, diffProgramNotFoundMessage); - } - private GenericDiffReporter(String diffProgram, String argumentsFormat, String diffProgramNotFoundMessage) - { - this(diffProgram, argumentsFormat, diffProgramNotFoundMessage, TEXT_FILE_EXTENSIONS); - } - public GenericDiffReporter(String diffProgram, String argumentsFormat, String diffProgramNotFoundMessage, - List validFileExtensions) - { - this.diffProgram = diffProgram; - this.arguments = argumentsFormat; - this.diffProgramNotFoundMessage = diffProgramNotFoundMessage; - validExtensions = validFileExtensions; - } - @Override - public void report(String received, String approved) throws Exception - { - if (!isWorkingInThisEnvironment(received)) { throw new RuntimeException(diffProgramNotFoundMessage); } - FileUtils.createIfNeeded(approved); - launch(received, approved); - } - private void launch(String received, String approved) throws IOException - { - ProcessBuilder builder = new ProcessBuilder(getCommandLine(received, approved)); - Process process = builder.start(); - ThreadUtils.sleep(500); //Give program time to start - } - public String[] getCommandLine(String received, String approved) - { - String[] p = arguments.split(" "); - String r = String.format(p[0], received); - String a = String.format(p[1], approved); - String[] commands = new String[]{diffProgram, r, a}; - System.out.println(Arrays.toString(commands)); - return commands; - } - @Override - public boolean isWorkingInThisEnvironment(String forFile) - { - return checkFileExists() && isFileExtensionHandled(forFile); - } - public boolean checkFileExists() - { - boolean exists = new File(diffProgram).exists(); - if (REPORT_MISSING_FILES && !exists) - { - System.out.println(String.format("%s can't find '%s'", this.getClass().getSimpleName(), diffProgram)); + public static boolean isFileExtensionValid(String forFile, List validExtensionsWithDot) { + String extensionWithDot = FileUtils.getExtensionWithDot(forFile); + return validExtensionsWithDot.contains(extensionWithDot); } - return exists; - } - public boolean isFileExtensionHandled(String forFile) - { - return isFileExtensionValid(forFile, validExtensions); - } - public static boolean isFileExtensionValid(String forFile, List validExtensionsWithDot) - { - String extensionWithDot = FileUtils.getExtensionWithDot(forFile); - return validExtensionsWithDot.contains(extensionWithDot); - } } diff --git a/src/main/java/org/teachingextensions/approvals/lite/reporters/ImageReporter.java b/src/main/java/org/teachingextensions/approvals/lite/reporters/ImageReporter.java index d3f0000..2aeea3c 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/reporters/ImageReporter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/reporters/ImageReporter.java @@ -4,11 +4,9 @@ import org.teachingextensions.approvals.lite.reporters.windows.BeyondCompareReporter; import org.teachingextensions.approvals.lite.reporters.windows.TortoiseImageDiffReporter; -public class ImageReporter extends FirstWorkingReporter -{ - public ImageReporter() - { - super(TortoiseImageDiffReporter.INSTANCE, BeyondCompareReporter.INSTANCE, KaleidoscopeDiffReporter.INSTANCE, - ImageWebReporter.INSTANCE, QuietReporter.INSTANCE); - } +public class ImageReporter extends FirstWorkingReporter { + public ImageReporter() { + super(TortoiseImageDiffReporter.INSTANCE, BeyondCompareReporter.INSTANCE, KaleidoscopeDiffReporter.INSTANCE, + ImageWebReporter.INSTANCE, QuietReporter.INSTANCE); + } } diff --git a/src/main/java/org/teachingextensions/approvals/lite/reporters/ImageWebReporter.java b/src/main/java/org/teachingextensions/approvals/lite/reporters/ImageWebReporter.java index 86f9c57..e22ca92 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/reporters/ImageWebReporter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/reporters/ImageWebReporter.java @@ -1,27 +1,26 @@ package org.teachingextensions.approvals.lite.reporters; -import java.awt.GraphicsEnvironment; - import org.teachingextensions.approvals.lite.util.TestUtils; -public class ImageWebReporter implements EnvironmentAwareReporter -{ - public static final ImageWebReporter INSTANCE = new ImageWebReporter(); - @Override - public void report(String received, String approved) throws Exception - { - String text = "
approvedreceived
%s
to approve : copy clipboard to command window
%s
"; - String moveText = ClipboardReporter.getAcceptApprovalText(received, approved); - text = String.format(text, approved, received, received, moveText); - TestUtils.displayHtml(text); - } - /** - * We assume any environment that is not headless will have a web browser to display the image in a web page. - */ - @Override - public boolean isWorkingInThisEnvironment(String forFile) - { - return !GraphicsEnvironment.isHeadless() - && GenericDiffReporter.isFileExtensionValid(forFile, GenericDiffReporter.IMAGE_FILE_EXTENSIONS); - } +import java.awt.*; + +public class ImageWebReporter implements EnvironmentAwareReporter { + public static final ImageWebReporter INSTANCE = new ImageWebReporter(); + + @Override + public void report(String received, String approved) throws Exception { + String text = "
approvedreceived
%s
to approve : copy clipboard to command window
%s
"; + String moveText = ClipboardReporter.getAcceptApprovalText(received, approved); + text = String.format(text, approved, received, received, moveText); + TestUtils.displayHtml(text); + } + + /** + * We assume any environment that is not headless will have a web browser to display the image in a web page. + */ + @Override + public boolean isWorkingInThisEnvironment(String forFile) { + return !GraphicsEnvironment.isHeadless() + && GenericDiffReporter.isFileExtensionValid(forFile, GenericDiffReporter.IMAGE_FILE_EXTENSIONS); + } } diff --git a/src/main/java/org/teachingextensions/approvals/lite/reporters/JunitReporter.java b/src/main/java/org/teachingextensions/approvals/lite/reporters/JunitReporter.java index 3b79600..64c3cd6 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/reporters/JunitReporter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/reporters/JunitReporter.java @@ -1,34 +1,29 @@ package org.teachingextensions.approvals.lite.reporters; -import java.io.File; - import junit.framework.TestCase; - import org.teachingextensions.approvals.lite.util.io.FileUtils; -public class JunitReporter implements EnvironmentAwareReporter -{ - public static final JunitReporter INSTANCE = new JunitReporter(); - @Override - public void report(String received, String approved) throws Exception - { - String aText = new File(approved).exists() ? FileUtils.readFile(approved) : ""; - String rText = FileUtils.readFile(received); - String approveCommand = "To approve run : " + ClipboardReporter.getAcceptApprovalText(received, approved); - System.out.println(approveCommand); - TestCase.assertEquals(aText, rText); - } - @Override - public boolean isWorkingInThisEnvironment(String forFile) - { - try - { - TestCase.assertTrue(true); +import java.io.File; + +public class JunitReporter implements EnvironmentAwareReporter { + public static final JunitReporter INSTANCE = new JunitReporter(); + + @Override + public void report(String received, String approved) throws Exception { + String aText = new File(approved).exists() ? FileUtils.readFile(approved) : ""; + String rText = FileUtils.readFile(received); + String approveCommand = "To approve run : " + ClipboardReporter.getAcceptApprovalText(received, approved); + System.out.println(approveCommand); + TestCase.assertEquals(aText, rText); } - catch (Throwable t) - { - return false; + + @Override + public boolean isWorkingInThisEnvironment(String forFile) { + try { + TestCase.assertTrue(true); + } catch (Throwable t) { + return false; + } + return GenericDiffReporter.isFileExtensionValid(forFile, GenericDiffReporter.TEXT_FILE_EXTENSIONS); } - return GenericDiffReporter.isFileExtensionValid(forFile, GenericDiffReporter.TEXT_FILE_EXTENSIONS); - } } \ No newline at end of file diff --git a/src/main/java/org/teachingextensions/approvals/lite/reporters/QuietReporter.java b/src/main/java/org/teachingextensions/approvals/lite/reporters/QuietReporter.java index b1677d7..992d97f 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/reporters/QuietReporter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/reporters/QuietReporter.java @@ -1,16 +1,15 @@ package org.teachingextensions.approvals.lite.reporters; -public class QuietReporter implements EnvironmentAwareReporter -{ - public static final QuietReporter INSTANCE = new QuietReporter(); - @Override - public void report(String received, String approved) throws Exception - { - System.out.println(ClipboardReporter.getAcceptApprovalText(received, approved)); - } - @Override - public boolean isWorkingInThisEnvironment(String forFile) - { - return true; - } +public class QuietReporter implements EnvironmentAwareReporter { + public static final QuietReporter INSTANCE = new QuietReporter(); + + @Override + public void report(String received, String approved) throws Exception { + System.out.println(ClipboardReporter.getAcceptApprovalText(received, approved)); + } + + @Override + public boolean isWorkingInThisEnvironment(String forFile) { + return true; + } } diff --git a/src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/DiffMergeReporter.java b/src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/DiffMergeReporter.java index a055511..8f7f725 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/DiffMergeReporter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/DiffMergeReporter.java @@ -1,17 +1,16 @@ package org.teachingextensions.approvals.lite.reporters.macosx; +import org.teachingextensions.approvals.lite.reporters.GenericDiffReporter; + import java.text.MessageFormat; -import org.teachingextensions.approvals.lite.reporters.GenericDiffReporter; +public class DiffMergeReporter extends GenericDiffReporter { + private static final String DIFF_PROGRAM = "/Applications/DiffMerge.app/Contents/MacOS/DiffMerge"; + static final String MESSAGE = MessageFormat.format("Unable to find DiffMerge at {0}", + DIFF_PROGRAM); + public static final DiffMergeReporter INSTANCE = new DiffMergeReporter(); -public class DiffMergeReporter extends GenericDiffReporter -{ - private static final String DIFF_PROGRAM = "/Applications/DiffMerge.app/Contents/MacOS/DiffMerge"; - static final String MESSAGE = MessageFormat.format("Unable to find DiffMerge at {0}", - DIFF_PROGRAM); - public static final DiffMergeReporter INSTANCE = new DiffMergeReporter(); - public DiffMergeReporter() - { - super(DIFF_PROGRAM, GenericDiffReporter.STANDARD_ARGUMENTS, MESSAGE, GenericDiffReporter.TEXT_FILE_EXTENSIONS); - } + public DiffMergeReporter() { + super(DIFF_PROGRAM, GenericDiffReporter.STANDARD_ARGUMENTS, MESSAGE, GenericDiffReporter.TEXT_FILE_EXTENSIONS); + } } diff --git a/src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/MacDiffReporter.java b/src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/MacDiffReporter.java index c899b01..9ab699e 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/MacDiffReporter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/MacDiffReporter.java @@ -2,11 +2,10 @@ import org.teachingextensions.approvals.lite.reporters.FirstWorkingReporter; -public class MacDiffReporter extends FirstWorkingReporter -{ - public static final MacDiffReporter INSTANCE = new MacDiffReporter(); - public MacDiffReporter() - { - super(DiffMergeReporter.INSTANCE, KaleidoscopeDiffReporter.INSTANCE, P4MergeReporter.INSTANCE, TkDiffReporter.INSTANCE); - } +public class MacDiffReporter extends FirstWorkingReporter { + public static final MacDiffReporter INSTANCE = new MacDiffReporter(); + + public MacDiffReporter() { + super(DiffMergeReporter.INSTANCE, KaleidoscopeDiffReporter.INSTANCE, P4MergeReporter.INSTANCE, TkDiffReporter.INSTANCE); + } } diff --git a/src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/P4MergeReporter.java b/src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/P4MergeReporter.java index d837c7b..83f6386 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/P4MergeReporter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/P4MergeReporter.java @@ -1,26 +1,24 @@ package org.teachingextensions.approvals.lite.reporters.macosx; +import org.teachingextensions.approvals.lite.reporters.GenericDiffReporter; +import org.teachingextensions.approvals.lite.util.ArrayUtils; + import java.text.MessageFormat; import java.util.List; -import org.teachingextensions.approvals.lite.reporters.GenericDiffReporter; - -import org.teachingextensions.approvals.lite.util.ArrayUtils; +public class P4MergeReporter extends GenericDiffReporter { + private static final String DIFF_PROGRAM = "/Applications/p4merge.app/Contents/MacOS/p4merge"; + public static final String MESSAGE = MessageFormat + .format( + "Unable to find P4Merge at {0}" + + "\nYou can install P4Merge " + + "at http://www.perforce.com/downloads/Perforce/20-User#10", + DIFF_PROGRAM); + private static List fileTypes = ArrayUtils.combine(GenericDiffReporter.IMAGE_FILE_EXTENSIONS, + GenericDiffReporter.TEXT_FILE_EXTENSIONS); + public static final P4MergeReporter INSTANCE = new P4MergeReporter(); -public class P4MergeReporter extends GenericDiffReporter -{ - private static final String DIFF_PROGRAM = "/Applications/p4merge.app/Contents/MacOS/p4merge"; - public static final String MESSAGE = MessageFormat - .format( - "Unable to find P4Merge at {0}" - + "\nYou can install P4Merge " - + "at http://www.perforce.com/downloads/Perforce/20-User#10", - DIFF_PROGRAM); - private static List fileTypes = ArrayUtils.combine(GenericDiffReporter.IMAGE_FILE_EXTENSIONS, - GenericDiffReporter.TEXT_FILE_EXTENSIONS); - public static final P4MergeReporter INSTANCE = new P4MergeReporter(); - public P4MergeReporter() - { - super(DIFF_PROGRAM, GenericDiffReporter.STANDARD_ARGUMENTS, P4MergeReporter.MESSAGE, fileTypes); - } + public P4MergeReporter() { + super(DIFF_PROGRAM, GenericDiffReporter.STANDARD_ARGUMENTS, P4MergeReporter.MESSAGE, fileTypes); + } } diff --git a/src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/TkDiffReporter.java b/src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/TkDiffReporter.java deleted file mode 100644 index 6fb1d1e..0000000 --- a/src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/TkDiffReporter.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.teachingextensions.approvals.lite.reporters.macosx; - -import java.text.MessageFormat; - -import org.teachingextensions.approvals.lite.reporters.GenericDiffReporter; - -public class TkDiffReporter extends GenericDiffReporter -{ - private static final String DIFF_PROGRAM = "/Applications/TkDiff.app/Contents/MacOS/tkdiff"; - static final String MESSAGE = MessageFormat.format("Unable to find TkDiffMerge at {0}", - DIFF_PROGRAM); - public static final TkDiffReporter INSTANCE = new TkDiffReporter(); - public TkDiffReporter() - { - super(DIFF_PROGRAM, GenericDiffReporter.STANDARD_ARGUMENTS, MESSAGE, GenericDiffReporter.TEXT_FILE_EXTENSIONS); - } -} diff --git a/src/main/java/org/teachingextensions/approvals/lite/reporters/windows/BeyondCompareReporter.java b/src/main/java/org/teachingextensions/approvals/lite/reporters/windows/BeyondCompareReporter.java index 4634397..e5a83c8 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/reporters/windows/BeyondCompareReporter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/reporters/windows/BeyondCompareReporter.java @@ -1,17 +1,16 @@ package org.teachingextensions.approvals.lite.reporters.windows; +import org.teachingextensions.approvals.lite.reporters.GenericDiffReporter; + import java.text.MessageFormat; -import org.teachingextensions.approvals.lite.reporters.GenericDiffReporter; +public class BeyondCompareReporter extends GenericDiffReporter { + public static final BeyondCompareReporter INSTANCE = new BeyondCompareReporter(); + static final String DIFF_PROGRAM = "C:\\Program Files\\Beyond Compare 3\\BCompare.exe"; + static final String MESSAGE = MessageFormat.format( + "Unable to find Beyond Compare at {0}", DIFF_PROGRAM); -public class BeyondCompareReporter extends GenericDiffReporter -{ - public static final BeyondCompareReporter INSTANCE = new BeyondCompareReporter(); - static final String DIFF_PROGRAM = "C:\\Program Files\\Beyond Compare 3\\BCompare.exe"; - static final String MESSAGE = MessageFormat.format( - "Unable to find Beyond Compare at {0}", DIFF_PROGRAM); - public BeyondCompareReporter() - { - super(DIFF_PROGRAM, MESSAGE); - } + public BeyondCompareReporter() { + super(DIFF_PROGRAM, MESSAGE); + } } diff --git a/src/main/java/org/teachingextensions/approvals/lite/reporters/windows/TortoiseDiffReporter.java b/src/main/java/org/teachingextensions/approvals/lite/reporters/windows/TortoiseDiffReporter.java index 8b058f3..f8fe295 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/reporters/windows/TortoiseDiffReporter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/reporters/windows/TortoiseDiffReporter.java @@ -2,11 +2,10 @@ import org.teachingextensions.approvals.lite.reporters.FirstWorkingReporter; -public class TortoiseDiffReporter extends FirstWorkingReporter -{ - public static final TortoiseDiffReporter INSTANCE = new TortoiseDiffReporter(); - public TortoiseDiffReporter() - { - super(TortoiseTextDiffReporter.INSTANCE, TortoiseImageDiffReporter.INSTANCE); - } +public class TortoiseDiffReporter extends FirstWorkingReporter { + public static final TortoiseDiffReporter INSTANCE = new TortoiseDiffReporter(); + + public TortoiseDiffReporter() { + super(TortoiseTextDiffReporter.INSTANCE, TortoiseImageDiffReporter.INSTANCE); + } } diff --git a/src/main/java/org/teachingextensions/approvals/lite/reporters/windows/WindowsDiffReporter.java b/src/main/java/org/teachingextensions/approvals/lite/reporters/windows/WindowsDiffReporter.java index cc9ee40..5dbcc73 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/reporters/windows/WindowsDiffReporter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/reporters/windows/WindowsDiffReporter.java @@ -2,11 +2,10 @@ import org.teachingextensions.approvals.lite.reporters.FirstWorkingReporter; -public class WindowsDiffReporter extends FirstWorkingReporter -{ - public static final WindowsDiffReporter INSTANCE = new WindowsDiffReporter(); - public WindowsDiffReporter() - { - super(TortoiseDiffReporter.INSTANCE, BeyondCompareReporter.INSTANCE, WinMergeReporter.INSTANCE); - } +public class WindowsDiffReporter extends FirstWorkingReporter { + public static final WindowsDiffReporter INSTANCE = new WindowsDiffReporter(); + + public WindowsDiffReporter() { + super(TortoiseDiffReporter.INSTANCE, BeyondCompareReporter.INSTANCE, WinMergeReporter.INSTANCE); + } } diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/ArrayUtils.java b/src/main/java/org/teachingextensions/approvals/lite/util/ArrayUtils.java index cef5ba7..dcadfbc 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/ArrayUtils.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/ArrayUtils.java @@ -3,7 +3,6 @@ import org.teachingextensions.approvals.lite.util.lambda.Function1; import java.util.*; -import java.util.Comparator; /** * A static class of convenience methods for arrays and collections. diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/ClassUtils.java b/src/main/java/org/teachingextensions/approvals/lite/util/ClassUtils.java index dc38a37..57ab8ae 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/ClassUtils.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/ClassUtils.java @@ -5,117 +5,94 @@ import java.util.Arrays; import java.util.List; -public class ClassUtils -{ - /************************************************************************/ - public static String getClassName(Class clazz) - { - String name = clazz.getName(); - int divider = name.lastIndexOf("."); - return name.substring(divider + 1); - } - - /************************************************************************/ - public static Class getWrapperClass(Class primitiveType) - { - if (boolean.class.equals(primitiveType)) - { - return Boolean.class; - } - else if (float.class.equals(primitiveType)) - { - return Float.class; - } - else if (long.class.equals(primitiveType)) - { - return Long.class; - } - else if (int.class.equals(primitiveType)) - { - return Integer.class; - } - else if (short.class.equals(primitiveType)) - { - return Short.class; - } - else if (byte.class.equals(primitiveType)) - { - return Byte.class; - } - else if (double.class.equals(primitiveType)) - { - return Double.class; +public class ClassUtils { + /** + * ******************************************************************** + */ + public static String getClassName(Class clazz) { + String name = clazz.getName(); + int divider = name.lastIndexOf("."); + return name.substring(divider + 1); } - else if (char.class.equals(primitiveType)) - { - return Character.class; - } - else - { - return primitiveType; - } - } - /************************************************************************/ - /************************************************************************/ - public static boolean hasMethod(Class clazz, String methodName, Class... parameterTypes) - { - try - { - return clazz.getMethod(methodName, parameterTypes) != null; + + /** + * ******************************************************************** + */ + public static Class getWrapperClass(Class primitiveType) { + if (boolean.class.equals(primitiveType)) { + return Boolean.class; + } else if (float.class.equals(primitiveType)) { + return Float.class; + } else if (long.class.equals(primitiveType)) { + return Long.class; + } else if (int.class.equals(primitiveType)) { + return Integer.class; + } else if (short.class.equals(primitiveType)) { + return Short.class; + } else if (byte.class.equals(primitiveType)) { + return Byte.class; + } else if (double.class.equals(primitiveType)) { + return Double.class; + } else if (char.class.equals(primitiveType)) { + return Character.class; + } else { + return primitiveType; + } } - catch (SecurityException e) - { - throw ObjectUtils.throwAsError(e); + /************************************************************************/ + /** + * ******************************************************************** + */ + public static boolean hasMethod(Class clazz, String methodName, Class... parameterTypes) { + try { + return clazz.getMethod(methodName, parameterTypes) != null; + } catch (SecurityException e) { + throw ObjectUtils.throwAsError(e); + } catch (NoSuchMethodException e) { + return false; + } } - catch (NoSuchMethodException e) - { - return false; + + public static File getSourceDirectory(Class clazz) { + final String name = clazz.getName(); + String[] split = name.split("\\."); + split[split.length - 1] = split[split.length - 1] + ".java"; + File found = find(new File("."), Arrays.asList(split)); + if (found == null) { + throw new FormattedException("Didn't find %s under %s", name, new File(".")); + } + return found.getParentFile(); } - } - public static File getSourceDirectory(Class clazz) - { - final String name = clazz.getName(); - String[] split = name.split("\\."); - split[split.length - 1] = split[split.length - 1] + ".java"; - File found = find(new File("."), Arrays.asList(split)); - if (found == null) { throw new FormattedException("Didn't find %s under %s", name, new File(".")); } - return found.getParentFile(); - } - public static File find(File file, List matches) - { - ArrayList copy = new ArrayList<>(); - copy.addAll(matches); - copy.add(0, "*"); - return find2(file, copy); - } - public static File find2(File file, List matches) - { - SearchingFileFilter searchingFileFilter = new SearchingFileFilter(matches); - File[] listFiles = file.listFiles(searchingFileFilter); - for (File file2 : listFiles) - { - if (file2.isDirectory()) - { - File found = find2(file2, searchingFileFilter.getSubset(file2.getName())); - if (found != null) { return found; } - } - else - { - return file2; - } + + public static File find(File file, List matches) { + ArrayList copy = new ArrayList<>(); + copy.addAll(matches); + copy.add(0, "*"); + return find2(file, copy); } - return null; - } - public static T create(Class clazz) - { - try - { - return clazz.newInstance(); + + public static File find2(File file, List matches) { + SearchingFileFilter searchingFileFilter = new SearchingFileFilter(matches); + File[] listFiles = file.listFiles(searchingFileFilter); + for (File file2 : listFiles) { + if (file2.isDirectory()) { + File found = find2(file2, searchingFileFilter.getSubset(file2.getName())); + if (found != null) { + return found; + } + } else { + return file2; + } + } + return null; } - catch (Exception e) - { - throw ObjectUtils.throwAsError(e); + + public static T create(Class clazz) { + try { + return clazz.newInstance(); + } catch (Exception e) { + throw ObjectUtils.throwAsError(e); + } } - } } diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/DateDifference.java b/src/main/java/org/teachingextensions/approvals/lite/util/DateDifference.java index cf9af43..737e274 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/DateDifference.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/DateDifference.java @@ -38,12 +38,14 @@ public DateDifference(Date date1, Date date2) { milli = milli * -1; } } + /** * ******************************************************************** */ public static long getAbsoluteDifference(int unit, long time) { return time / DIVIDERS[getTimeScaleIndex(unit)]; } + /** * ******************************************************************** */ diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/DateUtils.java b/src/main/java/org/teachingextensions/approvals/lite/util/DateUtils.java index f9f8ffa..9fdaca0 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/DateUtils.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/DateUtils.java @@ -9,126 +9,136 @@ /** * A static class of convenience functions for database access - **/ -public class DateUtils -{ - private static int TIME_SCALE[] = {Calendar.YEAR, - Calendar.MONTH, - Calendar.DATE, - Calendar.HOUR_OF_DAY, - Calendar.HOUR, - Calendar.MINUTE, - Calendar.SECOND, - Calendar.MILLISECOND }; - public static boolean isSame(Date firstDate, Date secondDate, int smallestUnits) - { - if ((firstDate == null) || (secondDate == null)) { return (firstDate == secondDate); } - return isSame(firstDate.getTime(), secondDate.getTime(), smallestUnits); - } - public static boolean isSame(long firstDate, long secondDate, int smallestUnits) - { - if (!ArrayUtils.contains(TIME_SCALE, smallestUnits)) { throw new Error("Invalid Timescale " + smallestUnits); } - GregorianCalendar first = new GregorianCalendar(); - first.setTime(new Date(firstDate)); - setSignificantDigit(first, smallestUnits); - GregorianCalendar second = new GregorianCalendar(); - second.setTime(new Date(secondDate)); - setSignificantDigit(second, smallestUnits); - return (first.getTime().getTime() == second.getTime().getTime()); - } + */ +public class DateUtils { + private static int TIME_SCALE[] = {Calendar.YEAR, + Calendar.MONTH, + Calendar.DATE, + Calendar.HOUR_OF_DAY, + Calendar.HOUR, + Calendar.MINUTE, + Calendar.SECOND, + Calendar.MILLISECOND}; - /************************************************************************/ - public static Timestamp getStartOfXDaysAgo(int numberOfDays) - { - return getStartOfXDaysAgo(numberOfDays, new Date()); - } - /************************************************************************/ - public static Timestamp getStartOfXDaysAgo(int numberOfDays, Date startingFrom) - { - GregorianCalendar gregorianCalendar = new GregorianCalendar(); - gregorianCalendar.setTime(startingFrom); - DateUtils.setSignificantDigit(gregorianCalendar, Calendar.DATE); - gregorianCalendar.add(Calendar.DATE, -numberOfDays); - return new Timestamp(gregorianCalendar.getTime().getTime()); - } + public static boolean isSame(Date firstDate, Date secondDate, int smallestUnits) { + if ((firstDate == null) || (secondDate == null)) { + return (firstDate == secondDate); + } + return isSame(firstDate.getTime(), secondDate.getTime(), smallestUnits); + } - /************************************************************************/ - public static Calendar setSignificantDigit(Calendar calendar, int smallestUnits) - { - boolean removeOn = false; - for (int i : TIME_SCALE) { - if (removeOn) { - if (i == Calendar.DATE) { - // Work around since this is broke - calendar.set(i, 1); - } else if (i == Calendar.HOUR_OF_DAY) { - // Work around since this is broke - calendar.set(i, 0); - } else { - calendar.clear(i); - } - } - if (i == smallestUnits) { - removeOn = true; - } - } - return calendar; - } + public static boolean isSame(long firstDate, long secondDate, int smallestUnits) { + if (!ArrayUtils.contains(TIME_SCALE, smallestUnits)) { + throw new Error("Invalid Timescale " + smallestUnits); + } + GregorianCalendar first = new GregorianCalendar(); + first.setTime(new Date(firstDate)); + setSignificantDigit(first, smallestUnits); + GregorianCalendar second = new GregorianCalendar(); + second.setTime(new Date(secondDate)); + setSignificantDigit(second, smallestUnits); + return (first.getTime().getTime() == second.getTime().getTime()); + } - public static void main(String args[]) - { - MySystem.variable("Calendar.DATE = " + Calendar.DATE); - MySystem.variable("Year", setSignificantDigit(new GregorianCalendar(), Calendar.YEAR).getTime()); - MySystem.variable("Month", setSignificantDigit(new GregorianCalendar(), Calendar.MONTH).getTime()); - MySystem.variable("Day", setSignificantDigit(new GregorianCalendar(), Calendar.DAY_OF_MONTH).getTime()); - MySystem.variable("Hour", setSignificantDigit(new GregorianCalendar(), Calendar.HOUR).getTime()); - MySystem.variable("Minute", setSignificantDigit(new GregorianCalendar(), Calendar.MINUTE).getTime()); - MySystem.variable("End Of Day", rollToEndOfDay(new Date()).getTime()); - } - /************************************************************************/ - public static GregorianCalendar rollToEndOfDay(Date date) - { - GregorianCalendar gregorianCalendar = new GregorianCalendar(); - gregorianCalendar.setTime(date); - gregorianCalendar.set(Calendar.HOUR_OF_DAY, 23); - gregorianCalendar.set(Calendar.MINUTE, 59); - gregorianCalendar.set(Calendar.SECOND, 59); - gregorianCalendar.set(Calendar.MILLISECOND, 999); - return gregorianCalendar; - } - /***********************************************************************/ - public static Timestamp asTimestamp(Date date) - { - return new Timestamp(date.getTime()); - } - /************************************************************************/ - public static boolean isToday(Date date) - { - return DateUtils.isSame(date, new Date(), Calendar.DATE); - } - /************************************************************************/ - public static Calendar asCalendar(Date date) - { - GregorianCalendar gregorianCalendar = new GregorianCalendar(); - gregorianCalendar.setTime(date); - return gregorianCalendar; - } + /** + * ******************************************************************** + */ + public static Timestamp getStartOfXDaysAgo(int numberOfDays) { + return getStartOfXDaysAgo(numberOfDays, new Date()); + } - /************************************************************************/ - /** - * @param date "yyyy/MM/dd" - */ - public static Timestamp parse(String date) - { - SimpleDateFormat format = new java.text.SimpleDateFormat("yyyy/MM/dd"); - try - { - return asTimestamp(format.parse(date)); + /** + * ******************************************************************** + */ + public static Timestamp getStartOfXDaysAgo(int numberOfDays, Date startingFrom) { + GregorianCalendar gregorianCalendar = new GregorianCalendar(); + gregorianCalendar.setTime(startingFrom); + DateUtils.setSignificantDigit(gregorianCalendar, Calendar.DATE); + gregorianCalendar.add(Calendar.DATE, -numberOfDays); + return new Timestamp(gregorianCalendar.getTime().getTime()); } - catch (ParseException e) - { - throw ObjectUtils.throwAsError(e); + + /** + * ******************************************************************** + */ + public static Calendar setSignificantDigit(Calendar calendar, int smallestUnits) { + boolean removeOn = false; + for (int i : TIME_SCALE) { + if (removeOn) { + if (i == Calendar.DATE) { + // Work around since this is broke + calendar.set(i, 1); + } else if (i == Calendar.HOUR_OF_DAY) { + // Work around since this is broke + calendar.set(i, 0); + } else { + calendar.clear(i); + } + } + if (i == smallestUnits) { + removeOn = true; + } + } + return calendar; + } + + public static void main(String args[]) { + MySystem.variable("Calendar.DATE = " + Calendar.DATE); + MySystem.variable("Year", setSignificantDigit(new GregorianCalendar(), Calendar.YEAR).getTime()); + MySystem.variable("Month", setSignificantDigit(new GregorianCalendar(), Calendar.MONTH).getTime()); + MySystem.variable("Day", setSignificantDigit(new GregorianCalendar(), Calendar.DAY_OF_MONTH).getTime()); + MySystem.variable("Hour", setSignificantDigit(new GregorianCalendar(), Calendar.HOUR).getTime()); + MySystem.variable("Minute", setSignificantDigit(new GregorianCalendar(), Calendar.MINUTE).getTime()); + MySystem.variable("End Of Day", rollToEndOfDay(new Date()).getTime()); + } + + /** + * ******************************************************************** + */ + public static GregorianCalendar rollToEndOfDay(Date date) { + GregorianCalendar gregorianCalendar = new GregorianCalendar(); + gregorianCalendar.setTime(date); + gregorianCalendar.set(Calendar.HOUR_OF_DAY, 23); + gregorianCalendar.set(Calendar.MINUTE, 59); + gregorianCalendar.set(Calendar.SECOND, 59); + gregorianCalendar.set(Calendar.MILLISECOND, 999); + return gregorianCalendar; } - } - /************************************************************************/ + + /** + * ******************************************************************* + */ + public static Timestamp asTimestamp(Date date) { + return new Timestamp(date.getTime()); + } + + /** + * ******************************************************************** + */ + public static boolean isToday(Date date) { + return DateUtils.isSame(date, new Date(), Calendar.DATE); + } + + /** + * ******************************************************************** + */ + public static Calendar asCalendar(Date date) { + GregorianCalendar gregorianCalendar = new GregorianCalendar(); + gregorianCalendar.setTime(date); + return gregorianCalendar; + } + + /************************************************************************/ + /** + * @param date "yyyy/MM/dd" + */ + public static Timestamp parse(String date) { + SimpleDateFormat format = new java.text.SimpleDateFormat("yyyy/MM/dd"); + try { + return asTimestamp(format.parse(date)); + } catch (ParseException e) { + throw ObjectUtils.throwAsError(e); + } + } + /************************************************************************/ } \ No newline at end of file diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/Filter.java b/src/main/java/org/teachingextensions/approvals/lite/util/Filter.java index 8f22dfa..5b6c7f0 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/Filter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/Filter.java @@ -1,19 +1,18 @@ package org.teachingextensions.approvals.lite.util; /** - * Listens to the state of a EnabledConditions object - **/ - + * Listens to the state of a EnabledConditions object + */ -public interface Filter -{ - /***********************************************************************/ - /** - * @return true if the object would be extracted by the filter - * @throws IllegalArgumentException if the object is not supported by the filter - **/ - public boolean isExtracted(T object) - throws IllegalArgumentException; - /**************************************************************************/ - /**************************************************************************/ + +public interface Filter { + /***********************************************************************/ + /** + * @return true if the object would be extracted by the filter + * @throws IllegalArgumentException if the object is not supported by the filter + */ + public boolean isExtracted(T object) + throws IllegalArgumentException; + /**************************************************************************/ + /**************************************************************************/ } \ No newline at end of file diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/FilterUtils.java b/src/main/java/org/teachingextensions/approvals/lite/util/FilterUtils.java index dd8c1d4..184b7a0 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/FilterUtils.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/FilterUtils.java @@ -5,42 +5,36 @@ /** * Listens to the state of a EnabledConditions object - **/ -public class FilterUtils -{ - /***********************************************************************/ - /***********************************************************************/ - /***********************************************************************/ - /** - * @return a new List containing all elements of the list for which isExtracted() would return true - **/ - public static ArrayList retainExtracted(T fromObjects[], Filter filter) throws IllegalArgumentException - { - return fromObjects == null ? new ArrayList<>() : filter(Arrays.asList(fromObjects), filter, true); - } - /***********************************************************************/ - /** - * @return a new List containing all elements of the list for which isExtracted() would return true - **/ - private static ArrayList filter(Iterable collection, Filter filter, boolean retainExtracted) throws IllegalArgumentException - { - ArrayList extracted = new ArrayList<>(); - if (collection != null) - { - for (T t : collection) - { - boolean ex = (filter == null || filter.isExtracted(t)); - if (ex == retainExtracted) - { - extracted.add(t); + */ +public class FilterUtils { + /***********************************************************************/ + /***********************************************************************/ + /***********************************************************************/ + /** + * @return a new List containing all elements of the list for which isExtracted() would return true + */ + public static ArrayList retainExtracted(T fromObjects[], Filter filter) throws IllegalArgumentException { + return fromObjects == null ? new ArrayList<>() : filter(Arrays.asList(fromObjects), filter, true); + } + /***********************************************************************/ + /** + * @return a new List containing all elements of the list for which isExtracted() would return true + */ + private static ArrayList filter(Iterable collection, Filter filter, boolean retainExtracted) throws IllegalArgumentException { + ArrayList extracted = new ArrayList<>(); + if (collection != null) { + for (T t : collection) { + boolean ex = (filter == null || filter.isExtracted(t)); + if (ex == retainExtracted) { + extracted.add(t); + } + } } - } + return extracted; } - return extracted; - } - /***********************************************************************/ + /***********************************************************************/ /***********************************************************************/ /* INNER CLASSES */ /***********************************************************************/ - /***********************************************************************/ + /***********************************************************************/ } \ No newline at end of file diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/MethodExecutionPath.java b/src/main/java/org/teachingextensions/approvals/lite/util/MethodExecutionPath.java index 18d0e1d..9f808bb 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/MethodExecutionPath.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/MethodExecutionPath.java @@ -4,61 +4,61 @@ import java.lang.reflect.Method; public class MethodExecutionPath implements Serializable { - private static final long serialVersionUID = 880073980003375984L; + private static final long serialVersionUID = 880073980003375984L; - public static class Parameters { - public static Method getBestFitMethod(Class clazz, - String currentMethodName, Class[] definitions) - throws NoSuchMethodException { - try { - return clazz.getMethod(currentMethodName, definitions); - } catch (NoSuchMethodException e) { - Method[] methods = FilterUtils.retainExtracted( - clazz.getMethods(), - new MethodParameterFilter(currentMethodName, - definitions)).toArray(new Method[0]); - if (methods.length == 0) { - throw e; - } - if (methods.length == 1) { - return methods[0]; - } else { - throw new Error( - "Don't know how to handle multiple available methods yet."); - } - } - } - } + public static class Parameters { + public static Method getBestFitMethod(Class clazz, + String currentMethodName, Class[] definitions) + throws NoSuchMethodException { + try { + return clazz.getMethod(currentMethodName, definitions); + } catch (NoSuchMethodException e) { + Method[] methods = FilterUtils.retainExtracted( + clazz.getMethods(), + new MethodParameterFilter(currentMethodName, + definitions)).toArray(new Method[0]); + if (methods.length == 0) { + throw e; + } + if (methods.length == 1) { + return methods[0]; + } else { + throw new Error( + "Don't know how to handle multiple available methods yet."); + } + } + } + } - public static class MethodParameterFilter implements Filter { + public static class MethodParameterFilter implements Filter { - private String methodName; - private Class[] classParameters; + private String methodName; + private Class[] classParameters; - public MethodParameterFilter(String methodName, Class[] classParameters) { - super(); - this.methodName = methodName; - this.classParameters = classParameters; - } + public MethodParameterFilter(String methodName, Class[] classParameters) { + super(); + this.methodName = methodName; + this.classParameters = classParameters; + } - @Override - public boolean isExtracted(Object object) - throws IllegalArgumentException { - ObjectUtils.assertInstance(Method.class, object); - Method m = (Method) object; - if (m.getName().equals(methodName) - && m.getParameterTypes().length == classParameters.length) { - Class[] params = m.getParameterTypes(); - for (int i = 0; i < params.length; i++) { - if (!ObjectUtils.isThisInstanceOfThat(classParameters[i], - params[i])) { - return false; - } - } - return true; - } else { - return false; - } - } - } + @Override + public boolean isExtracted(Object object) + throws IllegalArgumentException { + ObjectUtils.assertInstance(Method.class, object); + Method m = (Method) object; + if (m.getName().equals(methodName) + && m.getParameterTypes().length == classParameters.length) { + Class[] params = m.getParameterTypes(); + for (int i = 0; i < params.length; i++) { + if (!ObjectUtils.isThisInstanceOfThat(classParameters[i], + params[i])) { + return false; + } + } + return true; + } else { + return false; + } + } + } } diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/NumberUtils.java b/src/main/java/org/teachingextensions/approvals/lite/util/NumberUtils.java index ade2119..aa0b4fa 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/NumberUtils.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/NumberUtils.java @@ -4,52 +4,50 @@ /** * A static class of convenience functions for Manipulating numbers - **/ + */ public class NumberUtils { - public static Random RANDOM = new Random(); + public static Random RANDOM = new Random(); - /** - * Loads an int from a String. - **/ - public static int load(String i, int defaultValue) { - return load(i, defaultValue, true); - } + /** + * Loads an int from a String. + */ + public static int load(String i, int defaultValue) { + return load(i, defaultValue, true); + } - /** - * Loads an int from a String. - **/ - public static int load(String i, int defaultValue, boolean stripNonNumeric) { - try { - i = stripNonNumeric ? StringUtils.stripNonNumeric(i, true, true) - : i; - defaultValue = Integer.parseInt(i); - } catch (Exception ignored) { - } - return defaultValue; - } + /** + * Loads an int from a String. + */ + public static int load(String i, int defaultValue, boolean stripNonNumeric) { + try { + i = stripNonNumeric ? StringUtils.stripNonNumeric(i, true, true) + : i; + defaultValue = Integer.parseInt(i); + } catch (Exception ignored) { + } + return defaultValue; + } public static boolean equals(double one, double two, double delta) { - double actualDelta = one - two; - return (-delta < actualDelta) && (actualDelta < delta); - } + double actualDelta = one - two; + return (-delta < actualDelta) && (actualDelta < delta); + } /** - * randomly chooses a number between the minimum and maximum - *
Example: - * {@code int grade = NumberUtils.getRandomInt(1,100);}
- * - * @param minimum - * The lowest possible value (inclusive) - * @param maximum - * The highest possible value (inclusive) - * @return the random number - */ - public static int getRandomInt(int minimum, int maximum) { - int diff = maximum - minimum; - if (diff == 0) { - return maximum; - } else { - return RANDOM.nextInt(diff) + minimum; - } - } + * randomly chooses a number between the minimum and maximum + *
Example: + * {@code int grade = NumberUtils.getRandomInt(1,100);}
+ * + * @param minimum The lowest possible value (inclusive) + * @param maximum The highest possible value (inclusive) + * @return the random number + */ + public static int getRandomInt(int minimum, int maximum) { + int diff = maximum - minimum; + if (diff == 0) { + return maximum; + } else { + return RANDOM.nextInt(diff) + minimum; + } + } } \ No newline at end of file diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/ObjectUtils.java b/src/main/java/org/teachingextensions/approvals/lite/util/ObjectUtils.java index f51bcff..22df2a8 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/ObjectUtils.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/ObjectUtils.java @@ -8,135 +8,133 @@ /** * A static class of convenience functions for Manipulating objects - **/ + */ public class ObjectUtils { - public static Method[] getMethodsForObject(Object o2, String[] passedMethods) - throws SecurityException, NoSuchMethodException { - Method methods[] = new Method[passedMethods.length]; - Class clazz = o2.getClass(); - for (int i = 0; i < passedMethods.length; i++) { - methods[i] = clazz.getMethod(passedMethods[i], (Class[]) null); - } - return methods; - } + public static Method[] getMethodsForObject(Object o2, String[] passedMethods) + throws SecurityException, NoSuchMethodException { + Method methods[] = new Method[passedMethods.length]; + Class clazz = o2.getClass(); + for (int i = 0; i < passedMethods.length; i++) { + methods[i] = clazz.getMethod(passedMethods[i], (Class[]) null); + } + return methods; + } - /** - * A convenience function to check if two objects are equal. - * - * @param s1 - * The first object - * @param s2 - * The second object - * @return true if Equal. - **/ - public static boolean isEqual(Object s1, Object s2) { - if (s1 == s2) { - return true; - } else return (s1 != null) && s1.equals(s2); - } + /** + * A convenience function to check if two objects are equal. + * + * @param s1 The first object + * @param s2 The second object + * @return true if Equal. + */ + public static boolean isEqual(Object s1, Object s2) { + if (s1 == s2) { + return true; + } else return (s1 != null) && s1.equals(s2); + } - public static boolean isIn(Object target, Object[] objects) { + public static boolean isIn(Object target, Object[] objects) { for (Object object : objects) { if (ObjectUtils.isEqual(object, target)) { return true; } } - return false; - } + return false; + } - public static boolean isThisInstanceOfThat(Class thiz, Class that) { - return that.isAssignableFrom(thiz); - } + public static boolean isThisInstanceOfThat(Class thiz, Class that) { + return that.isAssignableFrom(thiz); + } - public static Error throwAsError(Throwable t) throws Error { - if (t instanceof RuntimeException) { - throw (RuntimeException) t; - } else if (t instanceof Error) { - throw (Error) t; - } else { - throw new Error(t); - } - } + public static Error throwAsError(Throwable t) throws Error { + if (t instanceof RuntimeException) { + throw (RuntimeException) t; + } else if (t instanceof Error) { + throw (Error) t; + } else { + throw new Error(t); + } + } - /** - * @deprecated use Query.select() - */ - public static Object[] extractArray(Object[] from, String methodName) { - try { - if (from == null || from.length == 0) { - return new Object[0]; - } - Method method = getGreatestCommonDenominator(from, methodName); - Object[] array; - if (Object.class.isAssignableFrom(method.getReturnType())) { - array = (Object[]) Array.newInstance(method.getReturnType(), - from.length); - } else { - array = (Object[]) Array.newInstance( - ClassUtils.getWrapperClass(method.getReturnType()), - from.length); - } - for (int i = 0; i < from.length; i++) { - array[i] = method.invoke(from[i], (Object[]) null); - } - return array; - } catch (Exception e) { - MySystem.warning(e); - throw ObjectUtils.throwAsError(e); - } - } + /** + * @deprecated use Query.select() + */ + public static Object[] extractArray(Object[] from, String methodName) { + try { + if (from == null || from.length == 0) { + return new Object[0]; + } + Method method = getGreatestCommonDenominator(from, methodName); + Object[] array; + if (Object.class.isAssignableFrom(method.getReturnType())) { + array = (Object[]) Array.newInstance(method.getReturnType(), + from.length); + } else { + array = (Object[]) Array.newInstance( + ClassUtils.getWrapperClass(method.getReturnType()), + from.length); + } + for (int i = 0; i < from.length; i++) { + array[i] = method.invoke(from[i], (Object[]) null); + } + return array; + } catch (Exception e) { + MySystem.warning(e); + throw ObjectUtils.throwAsError(e); + } + } - public static Method getGreatestCommonDenominator(Object[] from, - String methodName) throws SecurityException, NoSuchMethodException { - List classes = new ArrayList<>(); - ArrayUtils.addArray(classes, getAllCastableClasses(from[0])); - for (Object o : from) { - for (int i = classes.size() - 1; i >= 0; i--) { - Class clazz = classes.get(i); - if (!isThisInstanceOfThat(o.getClass(), clazz) - || !ClassUtils.hasMethod(clazz, methodName)) { - classes.remove(i); - } - } - } - return classes.size() == 0 ? null : ArrayUtils.getLast(classes) - .getMethod(methodName, (Class[]) null); - } + public static Method getGreatestCommonDenominator(Object[] from, + String methodName) throws SecurityException, NoSuchMethodException { + List classes = new ArrayList<>(); + ArrayUtils.addArray(classes, getAllCastableClasses(from[0])); + for (Object o : from) { + for (int i = classes.size() - 1; i >= 0; i--) { + Class clazz = classes.get(i); + if (!isThisInstanceOfThat(o.getClass(), clazz) + || !ClassUtils.hasMethod(clazz, methodName)) { + classes.remove(i); + } + } + } + return classes.size() == 0 ? null : ArrayUtils.getLast(classes) + .getMethod(methodName, (Class[]) null); + } - private static Class[] getAllCastableClasses(Object object) { - Class clazz = object.getClass(); - ArrayList list = new ArrayList<>(); - while (clazz != null) { - list.add(clazz); - ArrayUtils.addArray(list, clazz.getInterfaces()); - clazz = clazz.getSuperclass(); - } - Class[] found = list.toArray(new Class[list.size()]); - ArrayUtils.toReverseArray(found); - return found; - } + private static Class[] getAllCastableClasses(Object object) { + Class clazz = object.getClass(); + ArrayList list = new ArrayList<>(); + while (clazz != null) { + list.add(clazz); + ArrayUtils.addArray(list, clazz.getInterfaces()); + clazz = clazz.getSuperclass(); + } + Class[] found = list.toArray(new Class[list.size()]); + ArrayUtils.toReverseArray(found); + return found; + } - public static void assertInstance(Class clazz, Object object) { - assertInstance(new Class[] { clazz }, object); - } + public static void assertInstance(Class clazz, Object object) { + assertInstance(new Class[]{clazz}, object); + } - public static void assertInstance(Class classes[], Object object) { - if (object == null) { - throw new NullPointerException("Expected Object of Type " - + Arrays.asList(extractArray(classes, "getName")) - + " but was null"); - } - for (int i = 0; i < classes.length; i++) { - if (ClassUtils.getWrapperClass(classes[i]).isInstance(object)) { - return; - } - } - throw new IllegalArgumentException("Expected Object of Type " - + Arrays.asList(extractArray(classes, "getName")) + " but got " - + object.getClass().getName()); - } + public static void assertInstance(Class classes[], Object object) { + if (object == null) { + throw new NullPointerException("Expected Object of Type " + + Arrays.asList(extractArray(classes, "getName")) + + " but was null"); + } + for (int i = 0; i < classes.length; i++) { + if (ClassUtils.getWrapperClass(classes[i]).isInstance(object)) { + return; + } + } + throw new IllegalArgumentException("Expected Object of Type " + + Arrays.asList(extractArray(classes, "getName")) + " but got " + + object.getClass().getName()); + } - public static String getClassName(Object o) { - return o == null ? "null" : o.getClass().getName(); - } + public static String getClassName(Object o) { + return o == null ? "null" : o.getClass().getName(); + } } \ No newline at end of file diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/PhoneNumber.java b/src/main/java/org/teachingextensions/approvals/lite/util/PhoneNumber.java deleted file mode 100644 index 08a0cfd..0000000 --- a/src/main/java/org/teachingextensions/approvals/lite/util/PhoneNumber.java +++ /dev/null @@ -1,254 +0,0 @@ -package org.teachingextensions.approvals.lite.util; - - -/** - * Phone number validation, and formatter. - * this class is immutable. - */ -public class PhoneNumber { - public static final int USA = 0; - public static final String[] COUNTRY_CODES = { - "1", "20", "212", "213", "216", "218", "220", "221", "222", "223", - "224", "225", "226", "227", "228", "229", "230", "231", "232", "233", - "234", "235", "236", "237", "238", "239", "240", "241", "242", "243", - "244", "245", "246", "247", "248", "249", "250", "251", "252", "253", - "254", "255", "256", "257", "258", "260", "261", "262", "263", "264", - "265", "266", "267", "268", "269", "27", "290", "291", "297", "298", - "299", "30", "31", "32", "33", "34", "350", "351", "352", "353", - "354", "355", "356", "357", "358", "359", "36", "370", "371", "372", - "373", "374", "375", "376", "377", "378", "380", "381", "385", "386", - "387", "389", "39", "40", "41", "420", "421", "423", "43", "44", - "45", "46", "47", "48", "49", "500", "501", "502", "503", "504", - "505", "506", "507", "508", "509", "51", "52", "53", "5399", "54", - "55", "56", "57", "58", "590", "591", "592", "593", "594", "595", - "596", "597", "598", "599", "60", "61", "618", "62", "63", "64", - "65", "66", "670", "672", "673", "674", "675", "676", "677", "678", - "679", "680", "681", "682", "683", "684", "685", "686", "687", "688", - "689", "690", "691", "692", "7", "808", "81", "82", "84", "850", - "852", "853", "855", "856", "86", "870", "871", "872", "873", "874", - "878", "880", "881", "8816", "8817", "88213", "88216", "886", "90", "91", - "92", "93", "94", "95", "960", "961", "962", "963", "964", "965", - "966", "967", "968", "970", "971", "972", "973", "974", "975", "976", - "977", "98", "992", "993", "994", "995", "996", "998"}; - - private static final String REASONS[] = {"Phone Number Too Long or Too Short", "US Number must be length 10", "Unknown Country Code"}; - - /** - * The original value. - */ - private String originalValue = null; - private int countryCode = USA; - private String strippedValue = null; - private String invalidReason = null; - - public PhoneNumber(String originalValue) { - originalValue = StringUtils.loadNullableString(originalValue); - this.originalValue = originalValue; - if (this.originalValue == null) { - return; - } - this.strippedValue = stripPhoneNumber(this.originalValue); - this.countryCode = getCountryCode(strippedValue); - this.invalidReason = validate(countryCode, strippedValue); - if (invalidReason != null) { - countryCode = -1; - } - } - - /** - * ********************************************************************** - */ - private static String stripPhoneNumber(String number) { - if (number == null) { - return null; - } - boolean xAppended = false; - StringBuilder result = new StringBuilder(); - for (int i = 0; i < number.length(); i++) { - char c = number.charAt(i); - switch (c) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - result.append(c); - break; - case '+': - if (result.length() == 0) { - result.append(c); - } - break; - case 'X': - case 'x': { - if (!xAppended) { - result.append('x'); - xAppended = true; - } - break; - } - default: - break; - } - } - - char c = result.length() == 0 ? ' ' : result.charAt(0); - switch (c) { - case '+': - break; // do nothing - case '1': - result.insert(0, "+"); - break; // insert a 1 - default: - result.insert(0, "+1"); // if neither insert a +1 - } - - return result.toString(); - } - - /** - * ********************************************************************** - */ - private static int getCountryCode(String strippedNumber) { - String alt = strippedNumber.substring(1); - for (int i = 0; i < COUNTRY_CODES.length; i++) { - String code = COUNTRY_CODES[i]; - if (alt.startsWith(code)) { - return i; - } - } - return -1; - } - - /** - * ********************************************************************** - */ - private static String validate(int countryCode, String stripedNumber) { - return (countryCode == USA) ? validateNorthAmerican(countryCode, stripedNumber) : validateInternational(countryCode, stripedNumber); - } - - /** - * ********************************************************************** - */ - private static String validateInternational(int countryCode, String strippedNumber) { - if (countryCode == -1) - return "Invalid country code"; - String body = extractPhoneBody(countryCode, strippedNumber); - String prefix = COUNTRY_CODES[countryCode]; - int nl = prefix.length() + body.length(); - return (nl > 15) || (nl < 9) ? REASONS[0] : null; - } - - /** - * ********************************************************************** - */ - private static String validateNorthAmerican(int countryCode, String strippedNumber) { - if (countryCode != USA) - return "Invalid country code"; - String body = extractPhoneBody(countryCode, strippedNumber); - return (body.length() != 10) ? REASONS[0] : null; - } - - /** - * ********************************************************************** - */ - private static String extractPhoneBody(int countryCode, String strippedNumber) { - if (countryCode == -1) - throw new IllegalArgumentException("Invalid country code"); - String prefix = "+" + COUNTRY_CODES[countryCode]; - String body = strippedNumber.substring(prefix.length()); - int indexOfExt = body.indexOf('x'); - if (indexOfExt > -1) { - body = body.substring(0, indexOfExt); - } - return body; - } - - /** - * ********************************************************************** - */ - public String getValue() { - if (isValid() && strippedValue != null) { - return (isNorthAmericanNumber()) ? getValueAsNorthAmerican() : getValueAsInternational(); - } else { - return originalValue; - } - } - - /** - * ********************************************************************** - */ - private static String getValueAsNorthAmerican(int countryCode, String stripped) { - if (countryCode != USA) - throw new IllegalArgumentException("# '" + stripped + "' is not a NorthAmerican number"); - StringBuilder number = new StringBuilder(stripped.substring(2)); - number.insert(6, "-"); - number.insert(3, ")"); - number.insert(0, "("); - return number.toString(); - } - - /** - * ********************************************************************** - */ - private static String getValueAsInternational(int countryCode, String stripped) { - if (stripped == null) { - return null; - } - if (countryCode < USA) { - throw new IllegalArgumentException("# '" + stripped + "' is not an international number"); - } - StringBuilder number = new StringBuilder(stripped); - int internationalLen = COUNTRY_CODES[countryCode].length() + 1; - int bodyLength = extractPhoneBody(countryCode, stripped).length(); - if (bodyLength > 6) { - number.insert(internationalLen + 6, "."); - } - if (bodyLength > 3) { - number.insert(internationalLen + 3, "."); - } - number.insert(internationalLen, "."); - return number.toString(); - } - - /** - * ********************************************************************** - */ - public String getValueAsNorthAmerican() { - return getValueAsNorthAmerican(this.countryCode, this.strippedValue); - } - - /** - * ********************************************************************** - */ - public String getValueAsInternational() { - return getValueAsInternational(this.countryCode, this.strippedValue); - } - - /** - * ********************************************************************** - */ - public boolean isValid() { - return (this.invalidReason == null); - } - - /** - * ********************************************************************** - */ - public boolean isNorthAmericanNumber() { - return this.countryCode == USA; - } - - /** - * ********************************************************************** - */ - public String toString() { - return getValue(); - } - /**************************************************************************/ -} diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/SearchingFileFilter.java b/src/main/java/org/teachingextensions/approvals/lite/util/SearchingFileFilter.java index 7cb3bc9..f2bbb1d 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/SearchingFileFilter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/SearchingFileFilter.java @@ -6,43 +6,42 @@ import java.util.Arrays; import java.util.List; -public class SearchingFileFilter implements FilenameFilter -{ - private final List matches; - public SearchingFileFilter(List matches) - { - this.matches = matches; - } - public SearchingFileFilter(String... matches) - { - ArrayList m = new ArrayList<>(); - m.addAll(Arrays.asList(matches)); - this.matches = m; - } - public boolean accept(File dir, String name) - { - boolean directory = new File(dir, name).isDirectory(); - return accept(name, directory); - } - public boolean accept(String name, boolean directory) - { - if (name.startsWith(".")) { return false; } - if (matches.get(0).equals("*")) { return directory || name.equals(matches.get(1)); } - return name.equals(matches.get(0)); - } - public List getSubset(String file2) - { - if (matches.get(0).equals("*")) - { - if (matches.get(1).equals(file2)) - { - return matches.subList(2, matches.size()); - } - else - { - return matches; - } +public class SearchingFileFilter implements FilenameFilter { + private final List matches; + + public SearchingFileFilter(List matches) { + this.matches = matches; + } + + public SearchingFileFilter(String... matches) { + ArrayList m = new ArrayList<>(); + m.addAll(Arrays.asList(matches)); + this.matches = m; + } + + public boolean accept(File dir, String name) { + boolean directory = new File(dir, name).isDirectory(); + return accept(name, directory); + } + + public boolean accept(String name, boolean directory) { + if (name.startsWith(".")) { + return false; + } + if (matches.get(0).equals("*")) { + return directory || name.equals(matches.get(1)); + } + return name.equals(matches.get(0)); + } + + public List getSubset(String file2) { + if (matches.get(0).equals("*")) { + if (matches.get(1).equals(file2)) { + return matches.subList(2, matches.size()); + } else { + return matches; + } + } + return matches.subList(1, matches.size()); } - return matches.subList(1, matches.size()); - } } diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/StackTraceReflectionResult.java b/src/main/java/org/teachingextensions/approvals/lite/util/StackTraceReflectionResult.java index 512939b..80aa072 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/StackTraceReflectionResult.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/StackTraceReflectionResult.java @@ -2,33 +2,28 @@ import java.io.File; -public class StackTraceReflectionResult -{ - - private final File sourceFile; - private final String className; - private final String methodName; - - public StackTraceReflectionResult(File sourceFile, String className, String methodName) - { - this.sourceFile = sourceFile; - this.className = className; - this.methodName = methodName; - } - - public File getSourceFile() - { - return sourceFile; - } - - public String getClassName() - { - return className; - } - - public String getMethodName() - { - return methodName; - } - +public class StackTraceReflectionResult { + + private final File sourceFile; + private final String className; + private final String methodName; + + public StackTraceReflectionResult(File sourceFile, String className, String methodName) { + this.sourceFile = sourceFile; + this.className = className; + this.methodName = methodName; + } + + public File getSourceFile() { + return sourceFile; + } + + public String getClassName() { + return className; + } + + public String getMethodName() { + return methodName; + } + } diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/StringUtils.java b/src/main/java/org/teachingextensions/approvals/lite/util/StringUtils.java index c049e32..276ea88 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/StringUtils.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/StringUtils.java @@ -4,7 +4,6 @@ import java.io.InputStream; import java.util.Arrays; import java.util.Map; -import java.util.Vector; /** * A static class of convenience functions for database access @@ -19,30 +18,6 @@ public static String loadNullableString(String i) { return StringUtils.isNonZero(i) ? i.trim() : null; } /***********************************************************************/ - /** - * ******************************************************************** - */ - public static String[] split(String string, String splitOn, boolean trim) { - if ((string == null) || (splitOn == null) || (splitOn.length() < 1)) { - return null; - } - Vector temp = new Vector<>(); - int length = splitOn.length(); - int start = 0; - int next = 0; - while (next != -1) { - String word; - next = string.indexOf(splitOn, start); - if (next == -1) { - word = string.substring(start); - } else { - word = string.substring(start, next); - start = next + length; - } - temp.add(trim ? word.trim() : word); - } - return toArray(temp); - } /** * ******************************************************************* @@ -206,28 +181,6 @@ public static String[] toArray(java.util.Collection vectorOf) { return array; } - /** - * ******************************************************************* - */ - public static int resolveEnumeration(String value, String[] enumeration) { - return resolveEnumeration(value, enumeration, false); - } - - /** - * ******************************************************************* - */ - public static int resolveEnumeration(String value, String[] enumeration, boolean force) { - for (int i = 0; i < enumeration.length; i++) { - if (enumeration[i].equals(value)) { - return i; - } - } - if (force) { - throw new Error("Enumeration '" + value + "' not in " + Arrays.asList(enumeration).toString()); - } - return -1; - } - /** * ******************************************************************* */ diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/SystemUtils.java b/src/main/java/org/teachingextensions/approvals/lite/util/SystemUtils.java index 03435ce..a646929 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/SystemUtils.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/SystemUtils.java @@ -2,11 +2,9 @@ import java.io.File; -public class SystemUtils -{ - public static boolean isWindowsEnvironment() - { - return "\\".equals(File.separator); - } +public class SystemUtils { + public static boolean isWindowsEnvironment() { + return "\\".equals(File.separator); + } } diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/ThreadUtils.java b/src/main/java/org/teachingextensions/approvals/lite/util/ThreadUtils.java index f2c1bc1..815e30c 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/ThreadUtils.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/ThreadUtils.java @@ -1,16 +1,11 @@ package org.teachingextensions.approvals.lite.util; -public class ThreadUtils -{ - public static void sleep(long millis) - { - try - { - Thread.sleep(millis); +public class ThreadUtils { + public static void sleep(long millis) { + try { + Thread.sleep(millis); + } catch (Exception e) { + // ignore + } } - catch (Exception e) - { - // ignore - } - } } diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/io/FileUtils.java b/src/main/java/org/teachingextensions/approvals/lite/util/io/FileUtils.java index 82b1389..bdca7bf 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/io/FileUtils.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/io/FileUtils.java @@ -44,24 +44,6 @@ public static File[] getRecursiveFileList(File directory, FileFilter filter) { return list.toArray(new File[list.size()]); } - public static void copyStream(InputStream in, OutputStream out) throws IOException { - byte[] buf = new byte[1024]; - int i; - while ((i = in.read(buf)) != -1) { - out.write(buf, 0, i); - } - in.close(); - out.close(); - } - - /** - * ******************************************************************* - */ - public static void redirectInputToFile(String fileName, InputStream in) throws Exception { - FileOutputStream fos = new FileOutputStream(new File(fileName), false); - copyStream(in, fos); - } - /** * ******************************************************************* */ @@ -84,22 +66,6 @@ public static void writeFileQuietly(File file, String text) { } } - public static void writeFile(File file, CharSequence data) throws IOException { - Asserts.assertNotNull("Writing to file: " + file, data); - file.getCanonicalFile().getParentFile().mkdirs(); - DataOutputStream writer = new DataOutputStream(new FileOutputStream(file)); - for (int i = 0; i < data.length(); i++) { - writer.write(data.charAt(i)); - } - writer.close(); - } - - public static void writeFile(File file, InputStream data) throws IOException { - Asserts.assertNotNull("Writing to file: " + file, data); - file.getCanonicalFile().getParentFile().mkdirs(); - copyStream(data, new FileOutputStream(file)); - } - /** * ******************************************************************* */ diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/io/SimpleDirectoryFilter.java b/src/main/java/org/teachingextensions/approvals/lite/util/io/SimpleDirectoryFilter.java index 0054ccc..be0e6af 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/io/SimpleDirectoryFilter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/io/SimpleDirectoryFilter.java @@ -3,21 +3,23 @@ import java.io.File; public class SimpleDirectoryFilter - implements java.io.FileFilter -{ - /************************************************************************/ - public SimpleDirectoryFilter() - { - } - - /***********************************************************************/ + implements java.io.FileFilter { + /** + * ******************************************************************** + */ + public SimpleDirectoryFilter() { + } - public boolean accept(File pathname) { - String name = pathname.getName().toLowerCase(); - boolean accept; - accept = !(name.equals(".") || name.equals("..")) && pathname.isDirectory(); - return accept; - } - /************************************************************************/ - /************************************************************************/ + /** + * ******************************************************************* + */ + + public boolean accept(File pathname) { + String name = pathname.getName().toLowerCase(); + boolean accept; + accept = !(name.equals(".") || name.equals("..")) && pathname.isDirectory(); + return accept; + } + /************************************************************************/ + /************************************************************************/ } \ No newline at end of file diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/io/SimpleFileFilter.java b/src/main/java/org/teachingextensions/approvals/lite/util/io/SimpleFileFilter.java index f8b5f14..cb6a039 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/io/SimpleFileFilter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/io/SimpleFileFilter.java @@ -2,19 +2,22 @@ import java.io.File; -public class SimpleFileFilter implements java.io.FileFilter -{ - /************************************************************************/ - public SimpleFileFilter() - { - } - /***********************************************************************/ - public boolean accept(File pathname) { - String name = pathname.getName().toLowerCase(); - boolean accept; - accept = !(name.equals(".") || name.equals("..")) && !pathname.isDirectory(); - return accept; - } - /************************************************************************/ - /************************************************************************/ +public class SimpleFileFilter implements java.io.FileFilter { + /** + * ******************************************************************** + */ + public SimpleFileFilter() { + } + + /** + * ******************************************************************* + */ + public boolean accept(File pathname) { + String name = pathname.getName().toLowerCase(); + boolean accept; + accept = !(name.equals(".") || name.equals("..")) && !pathname.isDirectory(); + return accept; + } + /************************************************************************/ + /************************************************************************/ } \ No newline at end of file diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/io/StackElementSelector.java b/src/main/java/org/teachingextensions/approvals/lite/util/io/StackElementSelector.java index 82d4c8e..08fa8ee 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/io/StackElementSelector.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/io/StackElementSelector.java @@ -1,6 +1,5 @@ package org.teachingextensions.approvals.lite.util.io; -public interface StackElementSelector -{ - public abstract StackTraceElement selectElement(StackTraceElement[] trace) throws Exception; +public interface StackElementSelector { + public abstract StackTraceElement selectElement(StackTraceElement[] trace) throws Exception; } \ No newline at end of file diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/io/ZipUtils.java b/src/main/java/org/teachingextensions/approvals/lite/util/io/ZipUtils.java index e33cae9..44d2658 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/io/ZipUtils.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/io/ZipUtils.java @@ -11,86 +11,89 @@ /** * A static class of convenience functions for Files - **/ -public class ZipUtils -{ - /***********************************************************************/ - public static File zipDirectory(String directory, String zipFileName) throws IOException - { - return zipDirectory(new File(directory), new File(zipFileName)); - } - /***********************************************************************/ - public static File zipDirectory(File directory, File zipFileName) throws IOException - { - return doCreateZipFile(FileUtils.getRecursiveFileList(directory), zipFileName); - } - /***********************************************************************/ - public static File doCreateZipFile(File[] files, File zipFile) throws IOException - { - byte[] buf = new byte[1024]; - zipFile.getParentFile().mkdirs(); - FileOutputStream fileOut = new FileOutputStream(zipFile); - ZipOutputStream out = new ZipOutputStream(fileOut); - // Compress the files - for (File file : files) { - FileInputStream in = new FileInputStream(file); - out.putNextEntry(new ZipEntry(file.getName())); - // Transfer bytes from the file to the ZIP file - int len; - while ((len = in.read(buf)) > 0) { - out.write(buf, 0, len); - } - // Complete the entry - out.closeEntry(); - in.close(); - } - // Complete the ZIP file - out.close(); - fileOut.close(); - return zipFile; - } - /***********************************************************************/ - public static File[] doUnzip(File destination, File zipFile) throws IOException - { - ArrayList list = new ArrayList<>(); - byte[] buf = new byte[1024]; - FileInputStream fileIn = new FileInputStream(zipFile); - ZipInputStream in = new ZipInputStream(fileIn); - // DeCompress the files - ZipEntry entry = in.getNextEntry(); - while (entry != null) - { - File file = new File(destination, entry.getName()); - if (entry.isDirectory()) - { - file.mkdirs(); - } - else - { - list.add(file); - FileOutputStream out = new FileOutputStream(file); - // Transfer bytes from the file to the ZIP file - int len; - while ((len = in.read(buf)) > 0) - { - out.write(buf, 0, len); + */ +public class ZipUtils { + /** + * ******************************************************************* + */ + public static File zipDirectory(String directory, String zipFileName) throws IOException { + return zipDirectory(new File(directory), new File(zipFileName)); + } + + /** + * ******************************************************************* + */ + public static File zipDirectory(File directory, File zipFileName) throws IOException { + return doCreateZipFile(FileUtils.getRecursiveFileList(directory), zipFileName); + } + + /** + * ******************************************************************* + */ + public static File doCreateZipFile(File[] files, File zipFile) throws IOException { + byte[] buf = new byte[1024]; + zipFile.getParentFile().mkdirs(); + FileOutputStream fileOut = new FileOutputStream(zipFile); + ZipOutputStream out = new ZipOutputStream(fileOut); + // Compress the files + for (File file : files) { + FileInputStream in = new FileInputStream(file); + out.putNextEntry(new ZipEntry(file.getName())); + // Transfer bytes from the file to the ZIP file + int len; + while ((len = in.read(buf)) > 0) { + out.write(buf, 0, len); + } + // Complete the entry + out.closeEntry(); + in.close(); } - // Complete the entry - in.closeEntry(); + // Complete the ZIP file out.close(); - } - entry = in.getNextEntry(); + fileOut.close(); + return zipFile; + } + + /** + * ******************************************************************* + */ + public static File[] doUnzip(File destination, File zipFile) throws IOException { + ArrayList list = new ArrayList<>(); + byte[] buf = new byte[1024]; + FileInputStream fileIn = new FileInputStream(zipFile); + ZipInputStream in = new ZipInputStream(fileIn); + // DeCompress the files + ZipEntry entry = in.getNextEntry(); + while (entry != null) { + File file = new File(destination, entry.getName()); + if (entry.isDirectory()) { + file.mkdirs(); + } else { + list.add(file); + FileOutputStream out = new FileOutputStream(file); + // Transfer bytes from the file to the ZIP file + int len; + while ((len = in.read(buf)) > 0) { + out.write(buf, 0, len); + } + // Complete the entry + in.closeEntry(); + out.close(); + } + entry = in.getNextEntry(); + } + // Complete the ZIP file + in.close(); + fileIn.close(); + return list.toArray(new File[0]); + } + + /** + * ******************************************************************* + */ + public static void main(String args[]) throws IOException { + zipDirectory("c:\\t", "c:\\t\\t.zip"); } - // Complete the ZIP file - in.close(); - fileIn.close(); - return list.toArray(new File[0]); - } - /***********************************************************************/ - public static void main(String args[]) throws IOException - { - zipDirectory("c:\\t", "c:\\t\\t.zip"); - } - /************************************************************************/ - /************************************************************************/ + /************************************************************************/ + /************************************************************************/ } \ No newline at end of file diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/parser/ParserCommons.java b/src/main/java/org/teachingextensions/approvals/lite/util/parser/ParserCommons.java index 453d9af..ec726c7 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/parser/ParserCommons.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/parser/ParserCommons.java @@ -19,13 +19,6 @@ public static Object getNull() { return null; } - /** - * ******************************************************************* - */ - public static boolean isNull(Object object) { - return object == null; - } - /** * ******************************************************************* */ diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/parser/TemplateError.java b/src/main/java/org/teachingextensions/approvals/lite/util/parser/TemplateError.java deleted file mode 100644 index af5e7f9..0000000 --- a/src/main/java/org/teachingextensions/approvals/lite/util/parser/TemplateError.java +++ /dev/null @@ -1,75 +0,0 @@ -package org.teachingextensions.approvals.lite.util.parser; - -import org.teachingextensions.approvals.lite.util.velocity.ContextAware; -import org.apache.velocity.context.Context; - -import java.io.ByteArrayOutputStream; -import java.io.PrintWriter; - -public class TemplateError implements ContextAware { - private String stackTrace = null; - private String className = null; - private String message = null; - - /** - * ******************************************************************* - */ - public TemplateError(Throwable t, java.lang.Object o) { - if (o != null) { - className = o.getClass().getName(); - } - String cause = getCause(t); - message = t.getMessage(); - if (message != null && message.startsWith(cause)) { - message = message.substring(cause.length() + 1); - } - ByteArrayOutputStream output = new ByteArrayOutputStream(); - PrintWriter pw = new PrintWriter(output); - t.printStackTrace(pw); - pw.flush(); - - stackTrace = output.toString(); - } - - /** - * ******************************************************************* - */ - private String getCause(Throwable t) { - if (t.getCause() == null) { - return t.getClass().getName(); - } else { - return getCause(t.getCause()); - } - } - - /** - * ******************************************************************* - */ - public String getMessage() { - return message; - } - - /** - * ******************************************************************* - */ - public String getClassName() { - return className; - } - - /** - * ******************************************************************* - */ - public String getStackTrace() { - return stackTrace; - } - - /** - * ******************************************************************* - */ - public void setupContext(Context context) { - context.put("error", this); - } - /***********************************************************************/ - /***********************************************************************/ - -} \ No newline at end of file diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/persistence/ExecutableQuery.java b/src/main/java/org/teachingextensions/approvals/lite/util/persistence/ExecutableQuery.java deleted file mode 100644 index 76f8a01..0000000 --- a/src/main/java/org/teachingextensions/approvals/lite/util/persistence/ExecutableQuery.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.teachingextensions.approvals.lite.util.persistence; - -public interface ExecutableQuery -{ - public abstract String executeQuery(String query) throws Exception; -} \ No newline at end of file diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/persistence/Saver.java b/src/main/java/org/teachingextensions/approvals/lite/util/persistence/Saver.java index e7e6c97..77f1ec4 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/persistence/Saver.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/persistence/Saver.java @@ -1,7 +1,6 @@ package org.teachingextensions.approvals.lite.util.persistence; -public interface Saver -{ - public T save(T save) throws SavingException; +public interface Saver { + public T save(T save) throws SavingException; } diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/persistence/SavingException.java b/src/main/java/org/teachingextensions/approvals/lite/util/persistence/SavingException.java index 4527acd..d6566c9 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/persistence/SavingException.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/persistence/SavingException.java @@ -1,5 +1,4 @@ package org.teachingextensions.approvals.lite.util.persistence; -public class SavingException extends RuntimeException -{ +public class SavingException extends RuntimeException { } diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/servlets/ValidationError.java b/src/main/java/org/teachingextensions/approvals/lite/util/servlets/ValidationError.java index da4547c..751a0e2 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/servlets/ValidationError.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/servlets/ValidationError.java @@ -6,90 +6,112 @@ import java.util.HashSet; public class ValidationError extends RuntimeException { - private static final long serialVersionUID = 7940285202708976073L; + private static final long serialVersionUID = 7940285202708976073L; private HashMap errors = new HashMap<>(); - private HashSet assertions = null; - - /***********************************************************************/ - public ValidationError(Enum enumumations[]) { - this.assertions = new HashSet<>(); - for (Enum e : enumumations) { - this.assertions.add(e.toString()); - } - } - - /***********************************************************************/ - public String getMessage() { - return toString(); - } - - /***********************************************************************/ - public String toString() { - return "Validation(s) failed " + errors.keySet().toString() + " - " - + errors.values().toString(); - } - - /***********************************************************************/ - public void set(Enum assertion, boolean isOk, String errorDescription) { - setError(assertion.toString(), !isOk, errorDescription); - } - - /***********************************************************************/ - public void setError(String assertion, boolean isError, - String errorDescription) { - if (isError && !StringUtils.isNonZero(errorDescription)) { - throw new Error("You can not use empty error descriptions"); - } - assertValidAssertion(assertion); - if (isError) { - errors.put(assertion, errorDescription); - } else { - errors.remove(assertion); - } - } - - /***********************************************************************/ - public ValidationError add(String prefix, int index, ValidationError error) { - return add(getPrefixForIndex(prefix, index), error); - } - - /***********************************************************************/ - public static String getPrefixForIndex(String prefix, int index) { - return prefix + "[" + index + "]"; - } - - /***********************************************************************/ - public ValidationError add(String prefix, ValidationError error) { - prefix = StringUtils.isEmpty(prefix) ? "" : (prefix + "."); - String[] assertions = StringUtils.toArray(error.assertions); + private HashSet assertions = null; + + /** + * ******************************************************************* + */ + public ValidationError(Enum enumumations[]) { + this.assertions = new HashSet<>(); + for (Enum e : enumumations) { + this.assertions.add(e.toString()); + } + } + + /** + * ******************************************************************* + */ + public String getMessage() { + return toString(); + } + + /** + * ******************************************************************* + */ + public String toString() { + return "Validation(s) failed " + errors.keySet().toString() + " - " + + errors.values().toString(); + } + + /** + * ******************************************************************* + */ + public void set(Enum assertion, boolean isOk, String errorDescription) { + setError(assertion.toString(), !isOk, errorDescription); + } + + /** + * ******************************************************************* + */ + public void setError(String assertion, boolean isError, + String errorDescription) { + if (isError && !StringUtils.isNonZero(errorDescription)) { + throw new Error("You can not use empty error descriptions"); + } + assertValidAssertion(assertion); + if (isError) { + errors.put(assertion, errorDescription); + } else { + errors.remove(assertion); + } + } + + /** + * ******************************************************************* + */ + public ValidationError add(String prefix, int index, ValidationError error) { + return add(getPrefixForIndex(prefix, index), error); + } + + /** + * ******************************************************************* + */ + public static String getPrefixForIndex(String prefix, int index) { + return prefix + "[" + index + "]"; + } + + /** + * ******************************************************************* + */ + public ValidationError add(String prefix, ValidationError error) { + prefix = StringUtils.isEmpty(prefix) ? "" : (prefix + "."); + String[] assertions = StringUtils.toArray(error.assertions); for (String assertion : assertions) { this.assertions.add(prefix + assertion); } for (Object key : error.errors.keySet()) { errors.put(prefix + key, error.errors.get(key)); } - return this; - } - - /***********************************************************************/ - public boolean isOk() { - return (errors.size() == 0); - } - - /***********************************************************************/ - private void assertValidAssertion(String assertion) { - if (!this.assertions.contains(assertion)) { - // My_System.warning("Assertion '" + assertion + "' not found from " - // + assertions.toString()); - throw new Error("Assertion '" + assertion + "' not found from " - + assertions.toString()); - } - } - - /***********************************************************************/ - public int size() { - return errors.size(); - } + return this; + } + + /** + * ******************************************************************* + */ + public boolean isOk() { + return (errors.size() == 0); + } + + /** + * ******************************************************************* + */ + private void assertValidAssertion(String assertion) { + if (!this.assertions.contains(assertion)) { + // My_System.warning("Assertion '" + assertion + "' not found from " + // + assertions.toString()); + throw new Error("Assertion '" + assertion + "' not found from " + + assertions.toString()); + } + } + + /** + * ******************************************************************* + */ + public int size() { + return errors.size(); + } /***********************************************************************/ diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/velocity/TestableUberspect.java b/src/main/java/org/teachingextensions/approvals/lite/util/velocity/TestableUberspect.java index b52e641..c982022 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/velocity/TestableUberspect.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/velocity/TestableUberspect.java @@ -1,12 +1,5 @@ package org.teachingextensions.approvals.lite.util.velocity; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Enumeration; -import java.util.Iterator; -import java.util.Map; - import org.apache.velocity.runtime.RuntimeLogger; import org.apache.velocity.runtime.parser.node.AbstractExecutor; import org.apache.velocity.runtime.parser.node.BooleanPropertyExecutor; @@ -14,252 +7,250 @@ import org.apache.velocity.runtime.parser.node.PropertyExecutor; import org.apache.velocity.util.ArrayIterator; import org.apache.velocity.util.EnumerationIterator; -import org.apache.velocity.util.introspection.Info; -import org.apache.velocity.util.introspection.Introspector; -import org.apache.velocity.util.introspection.IntrospectorBase; -import org.apache.velocity.util.introspection.Uberspect; -import org.apache.velocity.util.introspection.UberspectLoggable; -import org.apache.velocity.util.introspection.VelMethod; -import org.apache.velocity.util.introspection.VelPropertyGet; -import org.apache.velocity.util.introspection.VelPropertySet; +import org.apache.velocity.util.introspection.*; import org.teachingextensions.approvals.lite.util.ObjectUtils; +import java.lang.reflect.Method; +import java.util.*; + /** - * Implementation of Uberspect to provide the default introspective - * functionality of Velocity + * Implementation of Uberspect to provide the default introspective + * functionality of Velocity * * @author Geir Magnusson Jr. * @version $Id: UberspectImpl.java,v 1.2.4.1 2004/03/03 23:23:08 geirm Exp $ */ -public class TestableUberspect implements Uberspect, UberspectLoggable -{ - /** - * the default Velocity introspector - */ - private static IntrospectorBase introspector; - private static Introspector introspectorWithLog; - private RuntimeLogger log; +public class TestableUberspect implements Uberspect, UberspectLoggable { + /** + * the default Velocity introspector + */ + private static IntrospectorBase introspector; + private static Introspector introspectorWithLog; + private RuntimeLogger log; /***********************************************************************/ - /** - * init - does nothing - we need to have setRuntimeLogger - * called before getting our introspector, as the default - * vel introspector depends upon it.; - */ - public void init() throws Exception - { - } - /***********************************************************************/ - public void setRuntimeLogger(RuntimeLogger runtimeLogger) - { - introspector = new IntrospectorBase(); - introspectorWithLog = new Introspector(runtimeLogger); - log = runtimeLogger; - } - - /***********************************************************************/ - public Iterator getIterator(Object obj, Info i) throws Exception - { - return getStandardIterator(obj, i); - } - /***********************************************************************/ - public static Iterator getStandardIterator(Object obj, Info i) - { - if (obj.getClass().isArray()) - { - return new ArrayIterator(obj); + /** + * init - does nothing - we need to have setRuntimeLogger + * called before getting our introspector, as the default + * vel introspector depends upon it.; + */ + public void init() throws Exception { } - else if (obj instanceof Collection) - { - return ((Collection) obj).iterator(); + + /** + * ******************************************************************* + */ + public void setRuntimeLogger(RuntimeLogger runtimeLogger) { + introspector = new IntrospectorBase(); + introspectorWithLog = new Introspector(runtimeLogger); + log = runtimeLogger; } - else if (obj instanceof Map) - { - return ((Map) obj).values().iterator(); + + /** + * ******************************************************************* + */ + public Iterator getIterator(Object obj, Info i) throws Exception { + return getStandardIterator(obj, i); } - else if (obj instanceof Iterator) - { - return ((Iterator) obj); + + /** + * ******************************************************************* + */ + public static Iterator getStandardIterator(Object obj, Info i) { + if (obj.getClass().isArray()) { + return new ArrayIterator(obj); + } else if (obj instanceof Collection) { + return ((Collection) obj).iterator(); + } else if (obj instanceof Map) { + return ((Map) obj).values().iterator(); + } else if (obj instanceof Iterator) { + return ((Iterator) obj); + } else if (obj instanceof Enumeration) { + return new EnumerationIterator((Enumeration) obj); + } + throw new VelocityParsingError("Could not determine type of iterator in " + "#foreach loop ", i); } - else if (obj instanceof Enumeration) { return new EnumerationIterator((Enumeration) obj); } - throw new VelocityParsingError("Could not determine type of iterator in " + "#foreach loop ", i); - } - /***********************************************************************/ - public VelMethod getMethod(Object obj, String methodName, Object[] args, Info i) throws Exception - { - if (obj == null) - { - throw new VelocityParsingError("tried " + getMethodText("null", methodName, args), i); + + /** + * ******************************************************************* + */ + public VelMethod getMethod(Object obj, String methodName, Object[] args, Info i) throws Exception { + if (obj == null) { + throw new VelocityParsingError("tried " + getMethodText("null", methodName, args), i); + } + Method m = introspector.getMethod(obj.getClass(), methodName, args); + if (m == null) { + throw new VelocityParsingError("Method " + getMethodText(obj.getClass().getName(), methodName, args) + " does not exist.", i); + } + return new VelMethodImpl(m); } - Method m = introspector.getMethod(obj.getClass(), methodName, args); - if (m == null) { throw new VelocityParsingError("Method " + getMethodText(obj.getClass().getName(), methodName, args) + " does not exist.", i); } - return new VelMethodImpl(m); - } - /***********************************************************************/ - public static String getMethodText(String className, String methodName, Object[] args) - { - StringBuilder methodSignature = new StringBuilder(); - for (int i = 0; args != null && i < args.length; i++) - { - methodSignature.append(ObjectUtils.getClassName(args[i])); - methodSignature.append(i == (args.length - 1) ? "" : ", "); + + /** + * ******************************************************************* + */ + public static String getMethodText(String className, String methodName, Object[] args) { + StringBuilder methodSignature = new StringBuilder(); + for (int i = 0; args != null && i < args.length; i++) { + methodSignature.append(ObjectUtils.getClassName(args[i])); + methodSignature.append(i == (args.length - 1) ? "" : ", "); + } + return className + "." + methodName + "(" + methodSignature + ") "; } - return className + "." + methodName + "(" + methodSignature + ") "; - } - /***********************************************************************/ - public VelPropertyGet getPropertyGet(Object obj, String identifier, Info i) throws Exception - { - AbstractExecutor executor; - if (obj == null) { throw new VelocityParsingError("tried " + getPropertyText("null", identifier), i); } - Class type = obj.getClass(); - // trying getFoo() - executor = new PropertyExecutor(log, introspectorWithLog, type, identifier); - if (!executor.isAlive()) - { - // trying get("foo") - executor = new GetExecutor(log, introspectorWithLog, type, identifier); + + /** + * ******************************************************************* + */ + public VelPropertyGet getPropertyGet(Object obj, String identifier, Info i) throws Exception { + AbstractExecutor executor; + if (obj == null) { + throw new VelocityParsingError("tried " + getPropertyText("null", identifier), i); + } + Class type = obj.getClass(); + // trying getFoo() + executor = new PropertyExecutor(log, introspectorWithLog, type, identifier); + if (!executor.isAlive()) { + // trying get("foo") + executor = new GetExecutor(log, introspectorWithLog, type, identifier); + } + if (!executor.isAlive()) { + // trying isFoo() + executor = new BooleanPropertyExecutor(log, introspectorWithLog, type, identifier); + } + if (!executor.isAlive()) { + throw new VelocityParsingError("Did not find " + getPropertyText(obj.getClass().getName(), identifier), i); + } + return new VelGetterImpl(executor); } - if (!executor.isAlive()) - { - // trying isFoo() - executor = new BooleanPropertyExecutor(log, introspectorWithLog, type, identifier); + + /** + * ******************************************************************* + */ + private String getPropertyText(String className, String identifier) { + return className + "." + identifier + " "; } - if (!executor.isAlive()) { throw new VelocityParsingError("Did not find " + getPropertyText(obj.getClass().getName(), identifier), i); } - return new VelGetterImpl(executor); - } - /***********************************************************************/ - private String getPropertyText(String className, String identifier) - { - return className + "." + identifier + " "; - } - /***********************************************************************/ - public VelPropertySet getPropertySet(Object obj, String identifier, Object arg, Info i) throws Exception - { - Class type = obj.getClass(); - VelMethod vm = null; - try - { + + /** + * ******************************************************************* + */ + public VelPropertySet getPropertySet(Object obj, String identifier, Object arg, Info i) throws Exception { + Class type = obj.getClass(); + VelMethod vm = null; + try { /* * first, we introspect for the set setter method */ - Object[] params = {arg}; - try - { - vm = getMethod(obj, "set" + identifier, params, i); - if (vm == null) { throw new NoSuchMethodException(); } - } - catch (NoSuchMethodException e) - { - StringBuilder sb = new StringBuilder("set"); - sb.append(identifier); - if (Character.isLowerCase(sb.charAt(3))) - { - sb.setCharAt(3, Character.toUpperCase(sb.charAt(3))); - } - else - { - sb.setCharAt(3, Character.toLowerCase(sb.charAt(3))); - } - vm = getMethod(obj, sb.toString(), params, i); - if (vm == null) { throw new NoSuchMethodException(); } - } - } - catch (NoSuchMethodException e) - { + Object[] params = {arg}; + try { + vm = getMethod(obj, "set" + identifier, params, i); + if (vm == null) { + throw new NoSuchMethodException(); + } + } catch (NoSuchMethodException e) { + StringBuilder sb = new StringBuilder("set"); + sb.append(identifier); + if (Character.isLowerCase(sb.charAt(3))) { + sb.setCharAt(3, Character.toUpperCase(sb.charAt(3))); + } else { + sb.setCharAt(3, Character.toLowerCase(sb.charAt(3))); + } + vm = getMethod(obj, sb.toString(), params, i); + if (vm == null) { + throw new NoSuchMethodException(); + } + } + } catch (NoSuchMethodException e) { /* * right now, we only support the Map interface */ - if (Map.class.isAssignableFrom(type)) - { - Object[] params = {new Object(), new Object()}; - vm = getMethod(obj, "put", params, i); - if (vm != null) - return new VelSetterImpl(vm, identifier); - } + if (Map.class.isAssignableFrom(type)) { + Object[] params = {new Object(), new Object()}; + vm = getMethod(obj, "put", params, i); + if (vm != null) + return new VelSetterImpl(vm, identifier); + } + } + return (vm != null) ? new VelSetterImpl(vm) : null; } - return (vm != null) ? new VelSetterImpl(vm) : null; - } - /***********************************************************************/ + /***********************************************************************/ /* INNER CLASS */ - /***********************************************************************/ - public static class VelMethodImpl implements VelMethod - { - Method method = null; - public VelMethodImpl(Method m) - { - method = m; - } - public Object invoke(Object o, Object[] params) throws Exception - { - return method.invoke(o, params); - } - public boolean isCacheable() - { - return true; - } - public String getMethodName() - { - return method.getName(); - } - public Class getReturnType() - { - return method.getReturnType(); - } - } - public static class VelGetterImpl implements VelPropertyGet - { - AbstractExecutor ae = null; - public VelGetterImpl(AbstractExecutor exec) - { - ae = exec; - } - public Object invoke(Object o) throws Exception - { - return ae.execute(o); - } - public boolean isCacheable() - { - return true; - } - public String getMethodName() - { - return ae.getMethod().getName(); - } - } - public static class VelSetterImpl implements VelPropertySet - { - VelMethod vm = null; - String putKey = null; - public VelSetterImpl(VelMethod velmethod) - { - this.vm = velmethod; - } - public VelSetterImpl(VelMethod velmethod, String key) - { - this.vm = velmethod; - putKey = key; - } - public Object invoke(Object o, Object value) throws Exception - { - ArrayList al = new ArrayList<>(); - if (putKey != null) - { - al.add(putKey); - al.add(value); - } - else - { - al.add(value); - } - return vm.invoke(o, al.toArray()); + + /** + * ******************************************************************* + */ + public static class VelMethodImpl implements VelMethod { + Method method = null; + + public VelMethodImpl(Method m) { + method = m; + } + + public Object invoke(Object o, Object[] params) throws Exception { + return method.invoke(o, params); + } + + public boolean isCacheable() { + return true; + } + + public String getMethodName() { + return method.getName(); + } + + public Class getReturnType() { + return method.getReturnType(); + } } - public boolean isCacheable() - { - return true; + + public static class VelGetterImpl implements VelPropertyGet { + AbstractExecutor ae = null; + + public VelGetterImpl(AbstractExecutor exec) { + ae = exec; + } + + public Object invoke(Object o) throws Exception { + return ae.execute(o); + } + + public boolean isCacheable() { + return true; + } + + public String getMethodName() { + return ae.getMethod().getName(); + } } - public String getMethodName() - { - return vm.getMethodName(); + + public static class VelSetterImpl implements VelPropertySet { + VelMethod vm = null; + String putKey = null; + + public VelSetterImpl(VelMethod velmethod) { + this.vm = velmethod; + } + + public VelSetterImpl(VelMethod velmethod, String key) { + this.vm = velmethod; + putKey = key; + } + + public Object invoke(Object o, Object value) throws Exception { + ArrayList al = new ArrayList<>(); + if (putKey != null) { + al.add(putKey); + al.add(value); + } else { + al.add(value); + } + return vm.invoke(o, al.toArray()); + } + + public boolean isCacheable() { + return true; + } + + public String getMethodName() { + return vm.getMethodName(); + } } - } } diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/velocity/VelocityParser.java b/src/main/java/org/teachingextensions/approvals/lite/util/velocity/VelocityParser.java index e16d4ce..7c323cf 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/velocity/VelocityParser.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/velocity/VelocityParser.java @@ -1,10 +1,5 @@ package org.teachingextensions.approvals.lite.util.velocity; -import java.io.StringWriter; -import java.io.Writer; -import java.util.Enumeration; -import java.util.Properties; - import org.apache.log4j.Level; import org.apache.log4j.LogManager; import org.apache.log4j.Logger; @@ -14,144 +9,85 @@ import org.apache.velocity.context.Context; import org.apache.velocity.runtime.RuntimeConstants; import org.apache.velocity.runtime.log.NullLogSystem; - import org.teachingextensions.approvals.lite.util.ObjectUtils; import org.teachingextensions.approvals.lite.util.io.FileUtils; import org.teachingextensions.approvals.lite.util.parser.ParserCommons; -public class VelocityParser -{ - private static VelocityEngine currentEngine = null; - /***********************************************************************/ - static - { - for (Enumeration e = LogManager.getCurrentLoggers(); e.hasMoreElements();) - { - ((Logger) e.nextElement()).setLevel(Level.OFF); +import java.io.StringWriter; +import java.io.Writer; +import java.util.Enumeration; +import java.util.Properties; + +public class VelocityParser { + private static VelocityEngine currentEngine = null; + + static { + for (Enumeration e = LogManager.getCurrentLoggers(); e.hasMoreElements(); ) { + ((Logger) e.nextElement()).setLevel(Level.OFF); + } + } + + public static String parseString(String template, ContextAware process) { + Properties props = new Properties(); + props.put("resource.loader", "class"); + props.put("class.resource.loader.class", StringResourceLoader.class.getName()); + props.put("velocimacro.context.localscope", "" + true); + props.put("runtime.introspector.uberspect", TestableUberspect.class.getName()); + props.put("velocimacro.permissions.allow.inline.local.scope", "" + true); + return parse(template, props, new ContextAware[]{process, Default.INSTANCE}); + } + + public static String parse(String template, Properties props, ContextAware[] process) { + StringWriter out = new StringWriter(); + parse(template, props, process, out); + return out.toString(); + } + + public static Writer parse(String template, Properties props, ContextAware process[], Writer out) { + try { + props.put("directive.foreach.counter.initial.value", "0"); + props.put(RuntimeConstants.RUNTIME_LOG_LOGSYSTEM_CLASS, NullLogSystem.class.getName()); + VelocityEngine engine = initializeEngine(props); + VelocityContext context = new VelocityContext(); + Template velocityTemplate = engine.getTemplate(template); + for (ContextAware p : process) { + if (p != null) p.setupContext(context); + } + velocityTemplate.merge(context, out); + return out; + } catch (Exception e) { + throw ObjectUtils.throwAsError(e); + } + } + + public static synchronized VelocityEngine initializeEngine(Properties props) throws Exception { + if (currentEngine == null || isDifferentForProperties(props, currentEngine, new String[]{"resource.loader", "file.resource.loader.path"})) { + currentEngine = new VelocityEngine(); + currentEngine.init(props); } - } + return currentEngine; + } - public static String parseString(String template, ContextAware process) - { - Properties props = new Properties(); - props.put("resource.loader", "class"); - props.put("class.resource.loader.class", StringResourceLoader.class.getName()); - props.put("velocimacro.context.localscope", "" + true); - props.put("runtime.introspector.uberspect", TestableUberspect.class.getName()); - props.put("velocimacro.permissions.allow.inline.local.scope", "" + true); - return parse(template, props, new ContextAware[]{process,Default.INSTANCE}); - } - /***********************************************************************/ -// public static String parse(String template, Properties props, ContextAware process) -// { -// -// return parse(template, props, new ContextAware[]{process,Default.INSTANCE}); -//} - /***********************************************************************/ - public static String parse(String template, Properties props, ContextAware[] process) - { - StringWriter out = new StringWriter(); - parse(template, props, process, out); - return out.toString(); - } - /***********************************************************************/ - public static Writer parse(String template, Properties props, ContextAware process[], Writer out) - { - try - { - props.put("directive.foreach.counter.initial.value", "0"); - props.put(RuntimeConstants.RUNTIME_LOG_LOGSYSTEM_CLASS, NullLogSystem.class.getName()); - VelocityEngine engine = initializeEngine(props); - VelocityContext context = new VelocityContext(); - Template velocityTemplate = engine.getTemplate(template); - for (ContextAware p : process) { - if (p != null) p.setupContext(context); + private static boolean isDifferentForProperties(Properties props, VelocityEngine engine, String[] keys) { + for (String key : keys) { + if (!ObjectUtils.isEqual(props.get(key), engine.getProperty(key))) { + return true; + } } - velocityTemplate.merge(context, out); - return out; + return false; } - catch (Exception e) - { - throw ObjectUtils.throwAsError(e); + + public static class Default implements ContextAware { + public static ContextAware INSTANCE = new Default(); + + public void setupContext(Context context) { + context.put("commons", ParserCommons.INSTANCE); + } } - } - public static synchronized VelocityEngine initializeEngine(Properties props) throws Exception - { - if (currentEngine == null || isDifferentForProperties(props, currentEngine, new String[]{"resource.loader", "file.resource.loader.path"})) - { - currentEngine = new VelocityEngine(); - currentEngine.init(props); - } - return currentEngine; - } - /***********************************************************************/ - private static boolean isDifferentForProperties(Properties props, VelocityEngine engine, String[] keys) - { - for (String key : keys) { - if (!ObjectUtils.isEqual(props.get(key), engine.getProperty(key))) { - return true; - } - } - return false; - } - /***********************************************************************/ - /** - * Parse a File to a File - **/ -// public static String parseFile(String templateFileName, String outputFileName, ContextAware process) -// { -// return parseFile(templateFileName, new File(outputFileName), process); -// } - /***********************************************************************/ - /** - * Parse a File to a File - **/ -// public static String parseFile(String templateFileName, File outputFile, ContextAware process) -// { -// try -// { -// String output = parseFile(templateFileName, process); -// FileUtils.writeFile(outputFile, output); -// return output; -// } -// catch (Exception e) -// { -// throw ObjectUtils.throwAsError(e); -// } -// } - /***********************************************************************/ -// public static class FileParseCall implements ParseCall -// { -// public static FileParseCall INSTANCE = new FileParseCall(); -// public String parse(String template, ContextAware process) -// { -// return parseFile(template, process); -// } -// } - /***********************************************************************/ -// public static class JarParseCall implements ParseCall -// { -// public static JarParseCall INSTANCE = new JarParseCall(); -// public String parse(String template, ContextAware process) -// { -// return parseJar(template, process); -// } -// } - /***********************************************************************/ - public static class Default implements ContextAware - { - public static ContextAware INSTANCE = new Default(); - public void setupContext(Context context) - { - context.put("commons", ParserCommons.INSTANCE); + + public static String parseFromClassPath(Class clazz, String string, ContextAware context) { + String resource = FileUtils.readFromClassPath(clazz, string); + return parseString(resource, context); } - } - /***********************************************************************/ - /***********************************************************************/ - public static String parseFromClassPath(Class clazz, String string, ContextAware context) - { - String resource = FileUtils.readFromClassPath(clazz, string); - return parseString(resource, context); - } - + } diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/velocity/VelocityParsingError.java b/src/main/java/org/teachingextensions/approvals/lite/util/velocity/VelocityParsingError.java index 5ac213a..ae37f35 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/velocity/VelocityParsingError.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/velocity/VelocityParsingError.java @@ -2,26 +2,25 @@ import org.apache.velocity.util.introspection.Info; -public class VelocityParsingError extends Error -{ +public class VelocityParsingError extends Error { - private String message; - private transient Info info; + private String message; + private transient Info info; - public VelocityParsingError(String message, Info info) - { - this.message = message; - this.info = info; - } - - public String getMessage() - { - return message + " " + getInfoText(info); - } - /***********************************************************************/ - public static String getInfoText(Info i) - { - return " at [" + i.getLine() + "," + i.getColumn() + "]" + " in template " + i.getTemplateName(); - } + public VelocityParsingError(String message, Info info) { + this.message = message; + this.info = info; + } + + public String getMessage() { + return message + " " + getInfoText(info); + } + + /** + * ******************************************************************* + */ + public static String getInfoText(Info i) { + return " at [" + i.getLine() + "," + i.getColumn() + "]" + " in template " + i.getTemplateName(); + } } diff --git a/src/test/java/org/teachingkidsprogramming/util/io/tests/FileMonitorTest.java b/src/test/java/org/teachingextensions/approvals/lite/util/io/tests/FileMonitorTest.java similarity index 95% rename from src/test/java/org/teachingkidsprogramming/util/io/tests/FileMonitorTest.java rename to src/test/java/org/teachingextensions/approvals/lite/util/io/tests/FileMonitorTest.java index dfd9269..245c1ea 100644 --- a/src/test/java/org/teachingkidsprogramming/util/io/tests/FileMonitorTest.java +++ b/src/test/java/org/teachingextensions/approvals/lite/util/io/tests/FileMonitorTest.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.util.io.tests; +package org.teachingextensions.approvals.lite.util.io.tests; import java.io.File; diff --git a/src/test/java/org/teachingkidsprogramming/util/tests/SearchingFileFilterTest.java b/src/test/java/org/teachingextensions/approvals/lite/util/tests/SearchingFileFilterTest.java similarity index 93% rename from src/test/java/org/teachingkidsprogramming/util/tests/SearchingFileFilterTest.java rename to src/test/java/org/teachingextensions/approvals/lite/util/tests/SearchingFileFilterTest.java index 84cd96e..5612e50 100644 --- a/src/test/java/org/teachingkidsprogramming/util/tests/SearchingFileFilterTest.java +++ b/src/test/java/org/teachingextensions/approvals/lite/util/tests/SearchingFileFilterTest.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.util.tests; +package org.teachingextensions.approvals.lite.util.tests; import junit.framework.TestCase; import org.teachingextensions.approvals.lite.util.SearchingFileFilter; From 9a3b90cbaa7891910aa8e4774429d49b61032f69 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Tue, 17 Mar 2015 16:56:26 -0700 Subject: [PATCH 071/111] . --- .../lite/reporters/macosx/TkDiffReporter.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/TkDiffReporter.java diff --git a/src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/TkDiffReporter.java b/src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/TkDiffReporter.java new file mode 100644 index 0000000..d545454 --- /dev/null +++ b/src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/TkDiffReporter.java @@ -0,0 +1,16 @@ +package org.teachingextensions.approvals.lite.reporters.macosx; + +import org.teachingextensions.approvals.lite.reporters.GenericDiffReporter; + +import java.text.MessageFormat; + +public class TkDiffReporter extends GenericDiffReporter { + private static final String DIFF_PROGRAM = "/Applications/TkDiff.app/Contents/MacOS/tkdiff"; + static final String MESSAGE = MessageFormat.format("Unable to find TkDiffMerge at {0}", + DIFF_PROGRAM); + public static final TkDiffReporter INSTANCE = new TkDiffReporter(); + + public TkDiffReporter() { + super(DIFF_PROGRAM, GenericDiffReporter.STANDARD_ARGUMENTS, MESSAGE, GenericDiffReporter.TEXT_FILE_EXTENSIONS); + } +} From 1aa568355f77ee9655842bc458032cf2436c01c0 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Tue, 17 Mar 2015 17:00:14 -0700 Subject: [PATCH 072/111] cleanup --- .../approvals/lite/util/io/FileMonitor.java | 51 ------------------ .../lite/util/io/tests/FileMonitorTest.java | 54 ------------------- 2 files changed, 105 deletions(-) delete mode 100644 src/main/java/org/teachingextensions/approvals/lite/util/io/FileMonitor.java delete mode 100644 src/test/java/org/teachingextensions/approvals/lite/util/io/tests/FileMonitorTest.java diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/io/FileMonitor.java b/src/main/java/org/teachingextensions/approvals/lite/util/io/FileMonitor.java deleted file mode 100644 index 0ae3aee..0000000 --- a/src/main/java/org/teachingextensions/approvals/lite/util/io/FileMonitor.java +++ /dev/null @@ -1,51 +0,0 @@ -package org.teachingextensions.approvals.lite.util.io; - -import java.io.File; -import java.util.*; - -public class FileMonitor { - private Timer timer; - private Map files; - private Set listeners; - - public FileMonitor(long pollingInterval) { - files = new HashMap<>(); - listeners = new HashSet<>(); - timer = new Timer(true); - timer.schedule(new FileMonitorNotifier(), 0, pollingInterval); - } - - public void stop() { - timer.cancel(); - } - - public void addFile(File file) { - if (!files.containsKey(file)) { - files.put(file, (file.exists() ? file.lastModified() : -1L)); - } - } - - public void addListener(FileListener fileListener) { - listeners.add(fileListener); - } - - private class FileMonitorNotifier extends TimerTask { - public void run() { - for (File file : files.keySet()) { - long lastModifiedTime; - lastModifiedTime = files.get(file); - long newModifiedTime = file.exists() ? file.lastModified() : -1; - if (newModifiedTime != lastModifiedTime) { - files.put(file, newModifiedTime); - for (FileListener listener : listeners) { - listener.fileChanged(file); - } - } - } - } - } - - public interface FileListener { - void fileChanged(File file); - } -} diff --git a/src/test/java/org/teachingextensions/approvals/lite/util/io/tests/FileMonitorTest.java b/src/test/java/org/teachingextensions/approvals/lite/util/io/tests/FileMonitorTest.java deleted file mode 100644 index 245c1ea..0000000 --- a/src/test/java/org/teachingextensions/approvals/lite/util/io/tests/FileMonitorTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package org.teachingextensions.approvals.lite.util.io.tests; - -import java.io.File; - -import org.teachingextensions.approvals.lite.util.io.FileMonitor; -import junit.framework.TestCase; -import org.teachingextensions.approvals.lite.util.io.FileMonitor.FileListener; - -public class FileMonitorTest extends TestCase -{ - FileMonitor monitor; - File root; - boolean done; - protected void setUp() throws Exception - { - File filea = File.createTempFile("tmp", "tmp"); - root = new File(filea.getParent() + File.separator + "fileMonitorRoot"); - root.mkdir(); - filea.delete(); - monitor = new FileMonitor(100); - monitor.addFile(root); - monitor.addListener(this.new TestListener()); - Thread.sleep(1000); - } - protected void tearDown() throws Exception - { - monitor.stop(); - root.delete(); - } - public void testNewFileDetected() throws Exception - { - done = false; - File targetFile = File.createTempFile("tmp", ".dbf", root); - for (int i = 0; i < 100 && !done; i++) - { - Thread.sleep(1000); - } - try - { - assertEquals("File processed", true, done); - } - finally - { - targetFile.delete(); - } - } - private class TestListener implements FileListener - { - public void fileChanged(File file) - { - done = true; - } - } -} From 618c9f4f151294998ec306648daaadd239892b5b Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Tue, 17 Mar 2015 18:57:05 -0700 Subject: [PATCH 073/111] Imported approval tests --- .../approvals/lite/ReporterFactory.java | 2 +- .../approvals/lite/FileApproverTest.java | 35 +++++++++++++ .../approvals/lite/ReportInjectionTest.java | 31 ++++++++++++ .../approvals/lite/ReporterFactoryTest.java | 20 ++++++++ .../lite/namer/JUnit4StackTraceNamerTest.java | 23 +++++++++ .../lite/namer/JUnitStackTraceNamerTest.java | 30 ++++++++++++ .../reporters/GenericDiffReporterTest.java | 15 ++++++ ...Test.testCommandLineFileNames.approved.txt | 4 ++ ...cDiffReporterTest.testIsImage.approved.txt | 4 ++ ...cDiffReporterTest.testP4Merge.approved.txt | 1 + ...icDiffReporterTest.testTkDiff.approved.txt | 1 + ...ReporterTest.testTortoiseDiff.approved.txt | 1 + ...DiffReporterTest.testWinMerge.approved.txt | 1 + .../lite/reporters/ReporterChainingTest.java | 46 ++++++++++++++++++ ...stMultiReporterWithExceptions.approved.txt | 3 ++ .../lite/reporters/UseReporterTest.java | 20 ++++++++ .../approvals/lite/reporters/a.png | Bin 0 -> 1173 bytes .../approvals/lite/reporters/a.txt | 3 ++ .../approvals/lite/reporters/b.png | Bin 0 -> 1151 bytes .../approvals/lite/reporters/b.txt | 3 ++ 20 files changed, 242 insertions(+), 1 deletion(-) create mode 100644 src/test/java/org/teachingextensions/approvals/lite/FileApproverTest.java create mode 100644 src/test/java/org/teachingextensions/approvals/lite/ReportInjectionTest.java create mode 100644 src/test/java/org/teachingextensions/approvals/lite/ReporterFactoryTest.java create mode 100644 src/test/java/org/teachingextensions/approvals/lite/namer/JUnit4StackTraceNamerTest.java create mode 100644 src/test/java/org/teachingextensions/approvals/lite/namer/JUnitStackTraceNamerTest.java create mode 100644 src/test/java/org/teachingextensions/approvals/lite/reporters/GenericDiffReporterTest.java create mode 100644 src/test/java/org/teachingextensions/approvals/lite/reporters/GenericDiffReporterTest.testCommandLineFileNames.approved.txt create mode 100644 src/test/java/org/teachingextensions/approvals/lite/reporters/GenericDiffReporterTest.testIsImage.approved.txt create mode 100644 src/test/java/org/teachingextensions/approvals/lite/reporters/GenericDiffReporterTest.testP4Merge.approved.txt create mode 100644 src/test/java/org/teachingextensions/approvals/lite/reporters/GenericDiffReporterTest.testTkDiff.approved.txt create mode 100644 src/test/java/org/teachingextensions/approvals/lite/reporters/GenericDiffReporterTest.testTortoiseDiff.approved.txt create mode 100644 src/test/java/org/teachingextensions/approvals/lite/reporters/GenericDiffReporterTest.testWinMerge.approved.txt create mode 100644 src/test/java/org/teachingextensions/approvals/lite/reporters/ReporterChainingTest.java create mode 100644 src/test/java/org/teachingextensions/approvals/lite/reporters/ReporterChainingTest.testMultiReporterWithExceptions.approved.txt create mode 100644 src/test/java/org/teachingextensions/approvals/lite/reporters/UseReporterTest.java create mode 100644 src/test/java/org/teachingextensions/approvals/lite/reporters/a.png create mode 100644 src/test/java/org/teachingextensions/approvals/lite/reporters/a.txt create mode 100644 src/test/java/org/teachingextensions/approvals/lite/reporters/b.png create mode 100644 src/test/java/org/teachingextensions/approvals/lite/reporters/b.txt diff --git a/src/main/java/org/teachingextensions/approvals/lite/ReporterFactory.java b/src/main/java/org/teachingextensions/approvals/lite/ReporterFactory.java index c0a2fe8..01ddfba 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/ReporterFactory.java +++ b/src/main/java/org/teachingextensions/approvals/lite/ReporterFactory.java @@ -66,7 +66,7 @@ private static T getAnnotationFromStackTrace(Class ann if (annotation != null) { return annotation; } - annotation = clazz.getAnnotation(annotationClass); + annotation = clazz != null ? clazz.getAnnotation(annotationClass) : null; if (annotation != null) { return annotation; } diff --git a/src/test/java/org/teachingextensions/approvals/lite/FileApproverTest.java b/src/test/java/org/teachingextensions/approvals/lite/FileApproverTest.java new file mode 100644 index 0000000..66f2e9d --- /dev/null +++ b/src/test/java/org/teachingextensions/approvals/lite/FileApproverTest.java @@ -0,0 +1,35 @@ +package org.teachingextensions.approvals.lite; + +import junit.framework.TestCase; +import org.teachingextensions.approvals.lite.util.io.FileUtils; + +import java.io.File; +import java.io.IOException; + + +public class FileApproverTest extends TestCase +{ + public void testApproveTextFile() throws Exception + { + File f1 = createFile("1"); + File f2 = createFile("2"); + assertFalse("files are different", FileApprover.approveTextFile(f1, f2)); + f2 = createFile("1"); + assertTrue("files are the same", FileApprover.approveTextFile(f1, f2)); + } + public void testApproveTextFileWithNonExsitantFile() throws Exception + { + File f1 = createFile("1"); + File f2 = new File("no exist"); + assertTrue(f1.exists()); + assertFalse(f2.exists()); + assertFalse(FileApprover.approveTextFile(f1, f2)); + } + + private File createFile(String string) throws IOException + { + File f = File.createTempFile("avc", "t"); + FileUtils.writeFile(f, string); + return f; + } +} diff --git a/src/test/java/org/teachingextensions/approvals/lite/ReportInjectionTest.java b/src/test/java/org/teachingextensions/approvals/lite/ReportInjectionTest.java new file mode 100644 index 0000000..fc56b80 --- /dev/null +++ b/src/test/java/org/teachingextensions/approvals/lite/ReportInjectionTest.java @@ -0,0 +1,31 @@ +package org.teachingextensions.approvals.lite; + +import junit.framework.TestCase; +import org.teachingextensions.approvals.lite.reporters.QuietReporter; +import org.teachingextensions.approvals.lite.reporters.UseReporter; + + +@UseReporter(QuietReporter.class) +public class ReportInjectionTest extends TestCase +{ + public static class MyReporter implements ApprovalFailureReporter, ApprovalFailureOverrider + { + @Override + public void report(String received, String approved) throws Exception + { + } + @Override + public boolean askToChangeReceivedToApproved(String received, String approved) throws Exception + { + called = getClass(); + return true; + } + } + private static Class called = null; + @UseReporter(MyReporter.class) + public void testOverrideReporterByParameter() throws Exception + { + Approvals.verify("some text"); + assertEquals(MyReporter.class, called); + } +} diff --git a/src/test/java/org/teachingextensions/approvals/lite/ReporterFactoryTest.java b/src/test/java/org/teachingextensions/approvals/lite/ReporterFactoryTest.java new file mode 100644 index 0000000..56c5d94 --- /dev/null +++ b/src/test/java/org/teachingextensions/approvals/lite/ReporterFactoryTest.java @@ -0,0 +1,20 @@ +package org.teachingextensions.approvals.lite; + +import junit.framework.TestCase; +import org.teachingextensions.approvals.lite.reporters.DiffReporter; +import org.teachingextensions.approvals.lite.reporters.QuietReporter; + + +public class ReporterFactoryTest extends TestCase +{ + public void testReporters() throws Exception + { + assertEquals(DiffReporter.class, getClassFor("txt")); + assertEquals(DiffReporter.class, getClassFor("html")); + assertEquals(QuietReporter.class, getClassFor("other")); + } + private Class getClassFor(String type) + { + return ReporterFactory.get(type).getClass(); + } +} diff --git a/src/test/java/org/teachingextensions/approvals/lite/namer/JUnit4StackTraceNamerTest.java b/src/test/java/org/teachingextensions/approvals/lite/namer/JUnit4StackTraceNamerTest.java new file mode 100644 index 0000000..70678d7 --- /dev/null +++ b/src/test/java/org/teachingextensions/approvals/lite/namer/JUnit4StackTraceNamerTest.java @@ -0,0 +1,23 @@ +package org.teachingextensions.approvals.lite.namer; + +import java.io.File; + +import org.junit.Assert; +import org.junit.Test; + +public class JUnit4StackTraceNamerTest +{ + @Test + public void testGetApprovalName() throws Exception + { + JUnitStackTraceNamer name = new JUnitStackTraceNamer(); + Assert.assertEquals("JUnit4StackTraceNamerTest.testGetApprovalName", name.getApprovalName()); + } + @Test + public void testGetSourceFilePath() throws Exception + { + JUnitStackTraceNamer name = new JUnitStackTraceNamer(); + File file = new File(name.getSourceFilePath() + "JUnitStackTraceNamerTest.java"); + Assert.assertTrue(file.exists()); + } +} diff --git a/src/test/java/org/teachingextensions/approvals/lite/namer/JUnitStackTraceNamerTest.java b/src/test/java/org/teachingextensions/approvals/lite/namer/JUnitStackTraceNamerTest.java new file mode 100644 index 0000000..48e2dfd --- /dev/null +++ b/src/test/java/org/teachingextensions/approvals/lite/namer/JUnitStackTraceNamerTest.java @@ -0,0 +1,30 @@ +package org.teachingextensions.approvals.lite.namer; + +import java.io.File; + +import junit.framework.TestCase; + + +public class JUnitStackTraceNamerTest extends TestCase +{ + public void testGetApprovalName() throws Exception + { + JUnitStackTraceNamer name = new JUnitStackTraceNamer(); + assertEquals("JUnitStackTraceNamerTest.testGetApprovalName", name.getApprovalName()); + } + public void testGetSourceFilePath() throws Exception + { + JUnitStackTraceNamer name = new JUnitStackTraceNamer(); + File file = new File(name.getSourceFilePath() + "JUnitStackTraceNamerTest.java"); + assertTrue(file.exists()); + } + public void testEmbeddedStackName() + { + JUnitStackTraceNamer namer = createJUnitStackNamer(); + assertEquals("JUnitStackTraceNamerTest.testEmbeddedStackName", namer.getApprovalName()); + } + private JUnitStackTraceNamer createJUnitStackNamer() + { + return new JUnitStackTraceNamer(); + } +} diff --git a/src/test/java/org/teachingextensions/approvals/lite/reporters/GenericDiffReporterTest.java b/src/test/java/org/teachingextensions/approvals/lite/reporters/GenericDiffReporterTest.java new file mode 100644 index 0000000..6c2851e --- /dev/null +++ b/src/test/java/org/teachingextensions/approvals/lite/reporters/GenericDiffReporterTest.java @@ -0,0 +1,15 @@ +package org.teachingextensions.approvals.lite.reporters; + +import junit.framework.TestCase; + + +public class GenericDiffReporterTest extends TestCase { + public void testFileExtensions() throws Exception { + assertTrue(new GenericDiffReporter("", "").isFileExtensionHandled("a.txt")); + } + + public void testProgramsExist() throws Exception { + assertFalse(new GenericDiffReporter("this_should_never_exist", "").isWorkingInThisEnvironment("a.txt")); + } + +} diff --git a/src/test/java/org/teachingextensions/approvals/lite/reporters/GenericDiffReporterTest.testCommandLineFileNames.approved.txt b/src/test/java/org/teachingextensions/approvals/lite/reporters/GenericDiffReporterTest.testCommandLineFileNames.approved.txt new file mode 100644 index 0000000..21ec1e1 --- /dev/null +++ b/src/test/java/org/teachingextensions/approvals/lite/reporters/GenericDiffReporterTest.testCommandLineFileNames.approved.txt @@ -0,0 +1,4 @@ +[regular.txt, true] = regular.txt +[with spaces.txt, true] = "with spaces.txt" +[regular.txt, false] = regular.txt +[with spaces.txt, false] = with\ spaces.txt diff --git a/src/test/java/org/teachingextensions/approvals/lite/reporters/GenericDiffReporterTest.testIsImage.approved.txt b/src/test/java/org/teachingextensions/approvals/lite/reporters/GenericDiffReporterTest.testIsImage.approved.txt new file mode 100644 index 0000000..1f8c0bb --- /dev/null +++ b/src/test/java/org/teachingextensions/approvals/lite/reporters/GenericDiffReporterTest.testIsImage.approved.txt @@ -0,0 +1,4 @@ +Image: a.png = true +Image: a.viz.png = true +Image: a.bitmap = false +Image: a.txt = false diff --git a/src/test/java/org/teachingextensions/approvals/lite/reporters/GenericDiffReporterTest.testP4Merge.approved.txt b/src/test/java/org/teachingextensions/approvals/lite/reporters/GenericDiffReporterTest.testP4Merge.approved.txt new file mode 100644 index 0000000..c70c765 --- /dev/null +++ b/src/test/java/org/teachingextensions/approvals/lite/reporters/GenericDiffReporterTest.testP4Merge.approved.txt @@ -0,0 +1 @@ +/Applications/p4merge.app/Contents/MacOS/p4merge %s %s \ No newline at end of file diff --git a/src/test/java/org/teachingextensions/approvals/lite/reporters/GenericDiffReporterTest.testTkDiff.approved.txt b/src/test/java/org/teachingextensions/approvals/lite/reporters/GenericDiffReporterTest.testTkDiff.approved.txt new file mode 100644 index 0000000..c4b1300 --- /dev/null +++ b/src/test/java/org/teachingextensions/approvals/lite/reporters/GenericDiffReporterTest.testTkDiff.approved.txt @@ -0,0 +1 @@ +/Applications/TkDiff.app/Contents/MacOS/tkdiff %s %s diff --git a/src/test/java/org/teachingextensions/approvals/lite/reporters/GenericDiffReporterTest.testTortoiseDiff.approved.txt b/src/test/java/org/teachingextensions/approvals/lite/reporters/GenericDiffReporterTest.testTortoiseDiff.approved.txt new file mode 100644 index 0000000..8d4d649 --- /dev/null +++ b/src/test/java/org/teachingextensions/approvals/lite/reporters/GenericDiffReporterTest.testTortoiseDiff.approved.txt @@ -0,0 +1 @@ +C:\Program Files\TortoiseSVN\bin\TortoiseMerge.exe %s %s \ No newline at end of file diff --git a/src/test/java/org/teachingextensions/approvals/lite/reporters/GenericDiffReporterTest.testWinMerge.approved.txt b/src/test/java/org/teachingextensions/approvals/lite/reporters/GenericDiffReporterTest.testWinMerge.approved.txt new file mode 100644 index 0000000..bc14963 --- /dev/null +++ b/src/test/java/org/teachingextensions/approvals/lite/reporters/GenericDiffReporterTest.testWinMerge.approved.txt @@ -0,0 +1 @@ +C:\Program Files\WinMerge\WinMergeU.exe %s %s \ No newline at end of file diff --git a/src/test/java/org/teachingextensions/approvals/lite/reporters/ReporterChainingTest.java b/src/test/java/org/teachingextensions/approvals/lite/reporters/ReporterChainingTest.java new file mode 100644 index 0000000..8d7bc17 --- /dev/null +++ b/src/test/java/org/teachingextensions/approvals/lite/reporters/ReporterChainingTest.java @@ -0,0 +1,46 @@ +package org.teachingextensions.approvals.lite.reporters; + +import junit.framework.TestCase; + + +public class ReporterChainingTest extends TestCase +{ + public static class NonWorkingReporter implements EnvironmentAwareReporter + { + @Override + public void report(String received, String approved) throws Exception + { + } + @Override + public boolean isWorkingInThisEnvironment(String forFile) + { + return false; + } + } + public static class WorkingReporter implements EnvironmentAwareReporter + { + public String received; + @Override + public void report(String received, String approved) throws Exception + { + this.received = received; + } + @Override + public boolean isWorkingInThisEnvironment(String forFile) + { + return true; + } + } + public void testFirstWorkingReporter() throws Exception + { + WorkingReporter workingReporter = new WorkingReporter(); + WorkingReporter workingReporter2 = new WorkingReporter(); + FirstWorkingReporter reporter = new FirstWorkingReporter(new NonWorkingReporter(), workingReporter, + workingReporter2); + reporter.report("Hello", "world"); + assertEquals("Hello", workingReporter.received); + assertNull(workingReporter2.received); + assertTrue(reporter.isWorkingInThisEnvironment("")); + } + +} diff --git a/src/test/java/org/teachingextensions/approvals/lite/reporters/ReporterChainingTest.testMultiReporterWithExceptions.approved.txt b/src/test/java/org/teachingextensions/approvals/lite/reporters/ReporterChainingTest.testMultiReporterWithExceptions.approved.txt new file mode 100644 index 0000000..18893b4 --- /dev/null +++ b/src/test/java/org/teachingextensions/approvals/lite/reporters/ReporterChainingTest.testMultiReporterWithExceptions.approved.txt @@ -0,0 +1,3 @@ +Multiple Exceptions Thrown: + #1): Error + #2): Error \ No newline at end of file diff --git a/src/test/java/org/teachingextensions/approvals/lite/reporters/UseReporterTest.java b/src/test/java/org/teachingextensions/approvals/lite/reporters/UseReporterTest.java new file mode 100644 index 0000000..4eaefc8 --- /dev/null +++ b/src/test/java/org/teachingextensions/approvals/lite/reporters/UseReporterTest.java @@ -0,0 +1,20 @@ +package org.teachingextensions.approvals.lite.reporters; + +import junit.framework.TestCase; +import org.teachingextensions.approvals.lite.ReporterFactory; +import org.teachingextensions.approvals.lite.reporters.windows.TortoiseTextDiffReporter; + + +public class UseReporterTest extends TestCase +{ + @UseReporter(TortoiseTextDiffReporter.class) + public void testUseReporter() throws Exception + { + assertEquals(TortoiseTextDiffReporter.class, ReporterFactory.getFromAnnotation().getClass()); + } + @UseReporter({TortoiseTextDiffReporter.class, ClipboardReporter.class}) + public void testMultipleUseReporter() throws Exception + { + assertEquals(MultiReporter.class, ReporterFactory.getFromAnnotation().getClass()); + } +} diff --git a/src/test/java/org/teachingextensions/approvals/lite/reporters/a.png b/src/test/java/org/teachingextensions/approvals/lite/reporters/a.png new file mode 100644 index 0000000000000000000000000000000000000000..b26067d306b4fe71af59f9ed0e5c3619c9739b32 GIT binary patch literal 1173 zcmaJ>do-H|6#tOTBgJrVJW4U`R;Af7;!(|FLDCT_sQ07HbQw{c($i1MR7VvPO|8Sx z)DX`wkJcHV(L*{D&(3S(n-=l@f{-Aoea_jx+qvi7-@W&bd+z<+dv2}|)k9s)Pz?Y8 zbqbl}i((b3*(!>tZC~R3f`US_uZJtpG;F+z2AHpiUPJ(BDa6X6-a}*6L~>9v0BF2C zQ3XDO8-pedQ``bmXpGpD)TpE{0iUQF2`M&IH@`EtY;EjpKEdI{NgT8ihC(9xrG;;n zUrp-6og#I*Bcn$Vg^yL0;&Cn48?(RZp&lFFYpoCa?E$C6ieP1y7_=JOIb{X%*cg#I zOgC$uoO{NQhGR3^w>laSEa9z%k7tb3q+%MMn)oAv@T__)%$qF%kjH{V-D(r1M!k3t zo|AJUj9OA!V#VE$U$ly>XC!ALu!Uc+{subC-)@^J7;k-t;D z{;v`pb6q{LkSJ)Txrn^v_ML5*>N?#oY(W1hWQo2zSp`*;tPYG3ZXx4WtAM7d|VOc%*t*-HcL%_$^LIaIZmKuf7( z3eSzda7D?halT8HS2I1pwV{=kqLKxn)R8$XaehUZ-f`;wn#uLqY^z1vT$6-H42_(- zuqmeNum-{WgJ5~29`iCsyuGVRIsI~^-utNVqQjlyKf*#6r>!=+wO5TGr9kiAROBdT zo<*NmguAse7|ZmEQr_Nhg3LI*k|B0MqJ2)*hd*SxWZ~WfK47X7_#@lNGGhYbVx&?q zA}bSe7KBB2gbs4Ue7h%QoLb)@&9>$sX@L`v1^5!1~V?06b$b-lPe&r^Ob&|Gz$>%!G-nABev9 QM85_=aifx&TqD2z2RAlg!TPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02*{fSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+qQF!XYv000B-Nkly#F%|xa|fv zN}^UyYBwLpKa$LqEID2-zkTpq5rIbn!1pTY3*W0S{ct1rhVQ4lxAtolOBXSt@3q98 zh3}C29^|VakfMIWw?b9Om_&RZ?p{8xftG-P0DP}i!r>dfr{9k?l1?#s{9G^X=o@{b zZ(-x3ODfe!^o_pJH~N0js4m)t<8+=mgnw(sGP>nC8L6G z2`2o!D_n5^`euKAL~{7Kgc^P>!GxcScHJF@pX298B!{0%sNv@lO!#@%sKo*J`3^sC z92A_Bks_&$Veowd-;KPP^CvMok2Qwpy}!k*j@{hfT)#W(H)?a}?0yP-f2+L9oX@up zbdnX8*q_7qE8E~Z@T>P5tig>JPYO{wer5 zevY5>euvlQcEq+ee}65%QHv4c=lD5(j-TV_qG2WnJF}y^6-hJBN z9!8i4Ldi@@q?>sNb^}GbWMgepo&(SyfM&H+M zv!HMEjlR+M-*2#0Y)i3U!_V<^{2V{W&qwzLCa<63dCBN&rhZeuso&IZ>NoX!bgh}Z z{*d}@o>X~FkHUibJ+^+scT}c^uQO2J&P%9byLjk(hQ8rDT%G=c=$rG3_IX9~`<}`x zwsvJYevY5hZ;9)-pzmGwGjlNYoBB=tzHVa`eWUM->U*>6H?wwT_^gHW4c}i0w*=oA zgq0))_@;heu6`%cR)#RpH~L23+<)(SUr%^HHR=FG#dTt+>iZ!Ub-pWAS|FBdn0tfxvzqe+E6A{?#HMahL$%(P@(LMq@_^#K6CSnbNZGCHV z8C4Gf_^!v96ES={=+&DG-}N|iB8G1Vy?S%uyB=pw#PIE)S8pzS*W=8I_!E^+ Date: Tue, 17 Mar 2015 21:22:02 -0700 Subject: [PATCH 074/111] Imported util tests --- .../approvals/lite/util/DateUtils.java | 18 --- .../approvals/lite/util/ClassUtilsTest.java | 22 ++++ .../lite/util/DateDifferenceTest.java | 114 ++++++++++++++++++ ...eburaryAndDaylightSavingsTime.approved.txt | 28 +++++ .../approvals/lite/util/FilterTest.java | 22 ++++ .../approvals/lite/util/ObjectUtilsTest.java | 22 ++++ .../{tests => }/SearchingFileFilterTest.java | 2 +- .../approvals/lite/util/StringUtilsTest.java | 15 +++ ...ngUtilsTest.testWriteToString.approved.txt | 3 + .../approvals/lite/util/TupleTest.java | 12 ++ .../approvals/lite/util/io/FileUtilsTest.java | 14 +++ .../util/velocity/RunAllVelocityTests.java | 19 +++ .../velocity/VelocityNullArgumentTest.java | 30 +++++ .../util/velocity/VelocityNullSetTest.java | 24 ++++ .../util/velocity/VelocitySilentTest.java | 36 ++++++ .../util/velocity/VelocityTableNameTest.java | 26 ++++ .../lite/util/velocity/VelocityTest.java | 60 +++++++++ 17 files changed, 448 insertions(+), 19 deletions(-) create mode 100644 src/test/java/org/teachingextensions/approvals/lite/util/ClassUtilsTest.java create mode 100644 src/test/java/org/teachingextensions/approvals/lite/util/DateDifferenceTest.java create mode 100644 src/test/java/org/teachingextensions/approvals/lite/util/DateDifferenceTest.testFeburaryAndDaylightSavingsTime.approved.txt create mode 100644 src/test/java/org/teachingextensions/approvals/lite/util/FilterTest.java create mode 100644 src/test/java/org/teachingextensions/approvals/lite/util/ObjectUtilsTest.java rename src/test/java/org/teachingextensions/approvals/lite/util/{tests => }/SearchingFileFilterTest.java (93%) create mode 100644 src/test/java/org/teachingextensions/approvals/lite/util/StringUtilsTest.java create mode 100644 src/test/java/org/teachingextensions/approvals/lite/util/StringUtilsTest.testWriteToString.approved.txt create mode 100644 src/test/java/org/teachingextensions/approvals/lite/util/TupleTest.java create mode 100644 src/test/java/org/teachingextensions/approvals/lite/util/io/FileUtilsTest.java create mode 100644 src/test/java/org/teachingextensions/approvals/lite/util/velocity/RunAllVelocityTests.java create mode 100644 src/test/java/org/teachingextensions/approvals/lite/util/velocity/VelocityNullArgumentTest.java create mode 100644 src/test/java/org/teachingextensions/approvals/lite/util/velocity/VelocityNullSetTest.java create mode 100644 src/test/java/org/teachingextensions/approvals/lite/util/velocity/VelocitySilentTest.java create mode 100644 src/test/java/org/teachingextensions/approvals/lite/util/velocity/VelocityTableNameTest.java create mode 100644 src/test/java/org/teachingextensions/approvals/lite/util/velocity/VelocityTest.java diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/DateUtils.java b/src/main/java/org/teachingextensions/approvals/lite/util/DateUtils.java index 9fdaca0..d27e516 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/DateUtils.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/DateUtils.java @@ -40,24 +40,6 @@ public static boolean isSame(long firstDate, long secondDate, int smallestUnits) return (first.getTime().getTime() == second.getTime().getTime()); } - /** - * ******************************************************************** - */ - public static Timestamp getStartOfXDaysAgo(int numberOfDays) { - return getStartOfXDaysAgo(numberOfDays, new Date()); - } - - /** - * ******************************************************************** - */ - public static Timestamp getStartOfXDaysAgo(int numberOfDays, Date startingFrom) { - GregorianCalendar gregorianCalendar = new GregorianCalendar(); - gregorianCalendar.setTime(startingFrom); - DateUtils.setSignificantDigit(gregorianCalendar, Calendar.DATE); - gregorianCalendar.add(Calendar.DATE, -numberOfDays); - return new Timestamp(gregorianCalendar.getTime().getTime()); - } - /** * ******************************************************************** */ diff --git a/src/test/java/org/teachingextensions/approvals/lite/util/ClassUtilsTest.java b/src/test/java/org/teachingextensions/approvals/lite/util/ClassUtilsTest.java new file mode 100644 index 0000000..2dfdb5b --- /dev/null +++ b/src/test/java/org/teachingextensions/approvals/lite/util/ClassUtilsTest.java @@ -0,0 +1,22 @@ +package org.teachingextensions.approvals.lite.util; + +import java.io.File; +import java.io.Serializable; + +import junit.framework.TestCase; + + +public class ClassUtilsTest extends TestCase +{ + public void testHasMethod() throws Exception + { + assertFalse(ClassUtils.hasMethod(Serializable.class, "getClass")); + assertTrue(ClassUtils.hasMethod(Object.class, "getClass")); + } + public void testSourceDirectory() throws Exception + { + File dir = ClassUtils.getSourceDirectory(getClass()); + assertNotNull(dir); + assertTrue(dir.isDirectory()); + } +} diff --git a/src/test/java/org/teachingextensions/approvals/lite/util/DateDifferenceTest.java b/src/test/java/org/teachingextensions/approvals/lite/util/DateDifferenceTest.java new file mode 100644 index 0000000..ef410e7 --- /dev/null +++ b/src/test/java/org/teachingextensions/approvals/lite/util/DateDifferenceTest.java @@ -0,0 +1,114 @@ +package org.teachingextensions.approvals.lite.util; + +import junit.framework.TestCase; + +import java.util.Arrays; +import java.util.Calendar; +import java.util.GregorianCalendar; + + +public class DateDifferenceTest extends TestCase { + private static final long YEAR_MS = 1000 * 60 * 60 * 24 * 365L; + private static final long MONTH_MS = 1000 * 60 * 60 * 24 * 30L; + // private static final long WEEK_MS = 1000 * 60 * 60 * 24 * 7L; + private static final long DAY_MS = 1000 * 60 * 60 * 24L; + String[] unitsArray = { + "Year", "Years", "Month", "Months", "Week", "Weeks", "Day", "Days", "Hour", "Hours", "Min", "Mins", "Sec", + "Secs", "Milli", "Millis"}; + private GetTimeTextUseCase getTimeTextUseCases[] = { + new GetTimeTextUseCase(5, Calendar.YEAR, Calendar.MILLISECOND, "now", "", unitsArray, YEAR_MS, + "1 Year, 0 Months, 0 Weeks, 0 Days, 0 Hours"), + new GetTimeTextUseCase(5, Calendar.YEAR, Calendar.MILLISECOND, "now", "", unitsArray, YEAR_MS + + (2 * MONTH_MS), "1 Year, 2 Months, 0 Weeks, 0 Days, 0 Hours"), + new GetTimeTextUseCase(5, Calendar.YEAR, Calendar.MILLISECOND, "now", "", unitsArray, YEAR_MS + - (2 * MONTH_MS), "10 Months, 0 Weeks, 5 Days, 0 Hours, 0 Mins"), + new GetTimeTextUseCase(2, Calendar.YEAR, Calendar.MILLISECOND, "", "ago", unitsArray, YEAR_MS + + (2 * MONTH_MS), "1 Year, 2 Months ago"), + new GetTimeTextUseCase(5, Calendar.MILLISECOND, Calendar.MILLISECOND, "now", "", unitsArray, YEAR_MS + + (2 * MONTH_MS), "36720000000 Millis"), + new GetTimeTextUseCase(5, Calendar.YEAR, Calendar.DATE, "today", "ago", unitsArray, DAY_MS, "1 Day ago"), + new GetTimeTextUseCase(5, Calendar.YEAR, Calendar.DATE, "today", "ago", unitsArray, DAY_MS - 1, "today"), + new GetTimeTextUseCase(5, Calendar.YEAR, Calendar.MILLISECOND, "now", "", unitsArray, new GregorianCalendar( + 2003, 1, 28), /* 1 = Feb */ + new GregorianCalendar(2003, 2, 31), "1 Month, 0 Weeks, 1 Day, 0 Hours, 0 Mins"), + new GetTimeTextUseCase(5, Calendar.YEAR, Calendar.MILLISECOND, "now", "", unitsArray, new GregorianCalendar( + 2003, 1, 1), new GregorianCalendar(2003, 2, 1), "4 Weeks, 0 Days, 0 Hours, 0 Mins, 0 Secs"), + new GetTimeTextUseCase(5, Calendar.YEAR, Calendar.MILLISECOND, "now", "", unitsArray, new GregorianCalendar( + 2004, 1, 1), new GregorianCalendar(2004, 2, 1), "4 Weeks, 1 Day, 0 Hours, 0 Mins, 0 Secs"), + new GetTimeTextUseCase(5, Calendar.MONTH, Calendar.MILLISECOND, "now", "", unitsArray, + new GregorianCalendar(1990, 0, 1), /* 7 * 12 should be 84 */ + new GregorianCalendar(1997, 0, 1), "85 Months, 1 Week, 0 Days, 0 Hours, 0 Mins"), + new GetTimeTextUseCase(5, Calendar.DATE, Calendar.MILLISECOND, "now", "", unitsArray, new GregorianCalendar( + 2004, 3, 3, 10, 0), /* Daylight savings is in month '3' */ + new GregorianCalendar(2004, 3, 4, 11, 0), "1 Day, 0 Hours, 0 Mins, 0 Secs, 0 Millis")}; + + + /** + * ******************************************************************* + */ + public void testGetTimeText() { + + for (GetTimeTextUseCase getTimeTextUseCase : getTimeTextUseCases) { + int amount = getTimeTextUseCase.amount; + int maxUnit = getTimeTextUseCase.maxUnit; + int minUnit = getTimeTextUseCase.minUnit; + String nowText = getTimeTextUseCase.nowText; + String agoText = getTimeTextUseCase.agoText; + String units[] = getTimeTextUseCase.units; + long milli = getTimeTextUseCase.milli; + String expected = getTimeTextUseCase.expected; + DateDifference d = new DateDifference(milli); + assertEquals("getTimeText(" + amount + ", " + maxUnit + ", " + minUnit + ", " + nowText + ", " + agoText + + ", " + Arrays.toString(units) + ") on " + milli, expected, + d.getTimeText(amount, maxUnit, minUnit, nowText, agoText, units)); + } + } + + /** + * ******************************************************************* + */ + private class GetTimeTextUseCase { + int amount; + int maxUnit; + int minUnit; + String nowText; + String agoText; + String units[]; + long milli; + String expected; + + public GetTimeTextUseCase(int amount, int maxUnit, int minUnit, String nowText, String agoText, + String[] units, long milli, String expected) { + this.init(amount, maxUnit, minUnit, nowText, agoText, units, milli, expected); + } + + /** + * ******************************************************************* + */ + public GetTimeTextUseCase(int amount, int maxUnit, int minUnit, String nowText, String agoText, + String[] units, Calendar date1, Calendar date2, String expected) { + long time = date1.getTimeInMillis() - date2.getTimeInMillis(); + if (time < 0) { + time = -time; + } + this.init(amount, maxUnit, minUnit, nowText, agoText, units, time, expected); + } + + /** + * ******************************************************************* + */ + private void init(int amount, int maxUnit, int minUnit, String nowText, String agoText, String[] units, + long milli, String expected) { + this.amount = amount; + this.maxUnit = maxUnit; + this.minUnit = minUnit; + this.nowText = nowText; + this.agoText = agoText; + this.units = units; + this.milli = milli; + this.expected = expected; + } + } + /***********************************************************************/ + /***********************************************************************/ +} diff --git a/src/test/java/org/teachingextensions/approvals/lite/util/DateDifferenceTest.testFeburaryAndDaylightSavingsTime.approved.txt b/src/test/java/org/teachingextensions/approvals/lite/util/DateDifferenceTest.testFeburaryAndDaylightSavingsTime.approved.txt new file mode 100644 index 0000000..efbc72a --- /dev/null +++ b/src/test/java/org/teachingextensions/approvals/lite/util/DateDifferenceTest.testFeburaryAndDaylightSavingsTime.approved.txt @@ -0,0 +1,28 @@ +02/01/2010, 03/01/2010 => 28 Days, 0 Hours +02/02/2010, 03/02/2010 => 28 Days, 0 Hours +02/03/2010, 03/03/2010 => 28 Days, 0 Hours +02/04/2010, 03/04/2010 => 28 Days, 0 Hours +02/05/2010, 03/05/2010 => 28 Days, 0 Hours +02/06/2010, 03/06/2010 => 28 Days, 0 Hours +02/07/2010, 03/07/2010 => 28 Days, 0 Hours +02/08/2010, 03/08/2010 => 28 Days, 0 Hours +02/09/2010, 03/09/2010 => 28 Days, 0 Hours +02/10/2010, 03/10/2010 => 28 Days, 0 Hours +02/11/2010, 03/11/2010 => 28 Days, 0 Hours +02/12/2010, 03/12/2010 => 28 Days, 0 Hours +02/13/2010, 03/13/2010 => 28 Days, 0 Hours +02/14/2010, 03/14/2010 => 28 Days, 0 Hours +02/15/2010, 03/15/2010 => 27 Days, 23 Hours +02/16/2010, 03/16/2010 => 27 Days, 23 Hours +02/17/2010, 03/17/2010 => 27 Days, 23 Hours +02/18/2010, 03/18/2010 => 27 Days, 23 Hours +02/19/2010, 03/19/2010 => 27 Days, 23 Hours +02/20/2010, 03/20/2010 => 27 Days, 23 Hours +02/21/2010, 03/21/2010 => 27 Days, 23 Hours +02/22/2010, 03/22/2010 => 27 Days, 23 Hours +02/23/2010, 03/23/2010 => 27 Days, 23 Hours +02/24/2010, 03/24/2010 => 27 Days, 23 Hours +02/25/2010, 03/25/2010 => 27 Days, 23 Hours +02/26/2010, 03/26/2010 => 27 Days, 23 Hours +02/27/2010, 03/27/2010 => 27 Days, 23 Hours +02/28/2010, 03/28/2010 => 27 Days, 23 Hours diff --git a/src/test/java/org/teachingextensions/approvals/lite/util/FilterTest.java b/src/test/java/org/teachingextensions/approvals/lite/util/FilterTest.java new file mode 100644 index 0000000..318c58b --- /dev/null +++ b/src/test/java/org/teachingextensions/approvals/lite/util/FilterTest.java @@ -0,0 +1,22 @@ +package org.teachingextensions.approvals.lite.util; + +import junit.framework.TestCase; + +public class FilterTest extends TestCase { + public void testAll() throws Exception { + Integer[] array = {1, 2, 3, 4, 5}; + FilterOdd filter = new FilterOdd(); + assertEquals("null, extracted", 5, FilterUtils.retainExtracted(array, null).size()); + assertEquals("odd", 3, FilterUtils.retainExtracted(array, filter).size()); + } + + + private static class FilterOdd implements Filter { + + public boolean isExtracted(Object o) throws IllegalArgumentException { + ObjectUtils.assertInstance(Integer.class, o); + return ((Integer) o).intValue() % 2 == 1; + } + + } +} diff --git a/src/test/java/org/teachingextensions/approvals/lite/util/ObjectUtilsTest.java b/src/test/java/org/teachingextensions/approvals/lite/util/ObjectUtilsTest.java new file mode 100644 index 0000000..cad1f6e --- /dev/null +++ b/src/test/java/org/teachingextensions/approvals/lite/util/ObjectUtilsTest.java @@ -0,0 +1,22 @@ +package org.teachingextensions.approvals.lite.util; + +import junit.framework.TestCase; + +import java.lang.reflect.Method; +import java.util.ArrayList; + +public class ObjectUtilsTest extends TestCase { + public void testGreatestCommonDenominator() throws Exception { + Method gcd = ObjectUtils.getGreatestCommonDenominator(new Object[]{"this", new ArrayList<>()}, "getClass"); + assertEquals(Object.class, gcd.getDeclaringClass()); + } + + /** + * ******************************************************************** + */ + public static void main(String[] args) { + junit.textui.TestRunner.run(ObjectUtilsTest.class); + } + /***********************************************************************/ + /***********************************************************************/ +} diff --git a/src/test/java/org/teachingextensions/approvals/lite/util/tests/SearchingFileFilterTest.java b/src/test/java/org/teachingextensions/approvals/lite/util/SearchingFileFilterTest.java similarity index 93% rename from src/test/java/org/teachingextensions/approvals/lite/util/tests/SearchingFileFilterTest.java rename to src/test/java/org/teachingextensions/approvals/lite/util/SearchingFileFilterTest.java index 5612e50..73aeb8c 100644 --- a/src/test/java/org/teachingextensions/approvals/lite/util/tests/SearchingFileFilterTest.java +++ b/src/test/java/org/teachingextensions/approvals/lite/util/SearchingFileFilterTest.java @@ -1,4 +1,4 @@ -package org.teachingextensions.approvals.lite.util.tests; +package org.teachingextensions.approvals.lite.util; import junit.framework.TestCase; import org.teachingextensions.approvals.lite.util.SearchingFileFilter; diff --git a/src/test/java/org/teachingextensions/approvals/lite/util/StringUtilsTest.java b/src/test/java/org/teachingextensions/approvals/lite/util/StringUtilsTest.java new file mode 100644 index 0000000..194800d --- /dev/null +++ b/src/test/java/org/teachingextensions/approvals/lite/util/StringUtilsTest.java @@ -0,0 +1,15 @@ +package org.teachingextensions.approvals.lite.util; + +import junit.framework.TestCase; +import org.teachingextensions.approvals.lite.Approvals; + + +public class StringUtilsTest extends TestCase { + + public void testWriteToString() throws Exception { + Approvals.verify(StringUtils.toString("things", new Object[]{1, null, "hi"})); + } + + /***********************************************************************/ + /***********************************************************************/ +} diff --git a/src/test/java/org/teachingextensions/approvals/lite/util/StringUtilsTest.testWriteToString.approved.txt b/src/test/java/org/teachingextensions/approvals/lite/util/StringUtilsTest.testWriteToString.approved.txt new file mode 100644 index 0000000..0a7d5bc --- /dev/null +++ b/src/test/java/org/teachingextensions/approvals/lite/util/StringUtilsTest.testWriteToString.approved.txt @@ -0,0 +1,3 @@ +things[0] = 1 +things[1] = null +things[2] = hi diff --git a/src/test/java/org/teachingextensions/approvals/lite/util/TupleTest.java b/src/test/java/org/teachingextensions/approvals/lite/util/TupleTest.java new file mode 100644 index 0000000..cfd795e --- /dev/null +++ b/src/test/java/org/teachingextensions/approvals/lite/util/TupleTest.java @@ -0,0 +1,12 @@ +package org.teachingextensions.approvals.lite.util; + +import junit.framework.TestCase; + +public class TupleTest extends TestCase +{ + public void test() { + Tuple tupleOne = new Tuple<>("foo", 1); + assertEquals("string first", "foo", tupleOne.getFirst()); + assertEquals("integer second", 1, tupleOne.getSecond()); + } +} diff --git a/src/test/java/org/teachingextensions/approvals/lite/util/io/FileUtilsTest.java b/src/test/java/org/teachingextensions/approvals/lite/util/io/FileUtilsTest.java new file mode 100644 index 0000000..a82b993 --- /dev/null +++ b/src/test/java/org/teachingextensions/approvals/lite/util/io/FileUtilsTest.java @@ -0,0 +1,14 @@ +package org.teachingextensions.approvals.lite.util.io; + +import junit.framework.TestCase; + + +/** + * A static class of convenience functions for Files + */ +public class FileUtilsTest extends TestCase { + public void testExtensionWithDot() throws Exception { + assertEquals(".txt", FileUtils.getExtensionWithDot("c:\\some.thing\\there\\a.txt")); + } + +} \ No newline at end of file diff --git a/src/test/java/org/teachingextensions/approvals/lite/util/velocity/RunAllVelocityTests.java b/src/test/java/org/teachingextensions/approvals/lite/util/velocity/RunAllVelocityTests.java new file mode 100644 index 0000000..fcca943 --- /dev/null +++ b/src/test/java/org/teachingextensions/approvals/lite/util/velocity/RunAllVelocityTests.java @@ -0,0 +1,19 @@ +package org.teachingextensions.approvals.lite.util.velocity; + +import junit.framework.Test; +import junit.framework.TestSuite; + +public class RunAllVelocityTests extends TestSuite +{ + /***********************************************************************/ + public static Test suite() throws InstantiationException, IllegalAccessException, ClassNotFoundException + { + TestSuite suite = new TestSuite("Test for com.spun"); + suite.addTest(new TestSuite(VelocitySilentTest.class)); + suite.addTest(new TestSuite(VelocityTest.class)); + suite.addTest(new TestSuite(VelocityNullSetTest.class)); + return suite; + } + /***********************************************************************/ + /***********************************************************************/ +} diff --git a/src/test/java/org/teachingextensions/approvals/lite/util/velocity/VelocityNullArgumentTest.java b/src/test/java/org/teachingextensions/approvals/lite/util/velocity/VelocityNullArgumentTest.java new file mode 100644 index 0000000..62e5a74 --- /dev/null +++ b/src/test/java/org/teachingextensions/approvals/lite/util/velocity/VelocityNullArgumentTest.java @@ -0,0 +1,30 @@ +package org.teachingextensions.approvals.lite.util.velocity; + +import junit.framework.TestCase; +import org.apache.velocity.context.Context; + +public class VelocityNullArgumentTest extends TestCase implements ContextAware +{ + /***********************************************************************/ + public void testOverloadedMethodFound() throws Exception + { + } + /***********************************************************************/ + public void setupContext(Context context) + { + context.put("object", this); + context.put("nullValue", null); + } + /***********************************************************************/ + public static String getClass(Class c) + { + return c == null ? "you got null" : c.getName(); + } + /***********************************************************************/ + public static String getClass(String c) + { + return c == null ? "you got null" : c.getClass().getName(); + } + /***********************************************************************/ + /***********************************************************************/ +} diff --git a/src/test/java/org/teachingextensions/approvals/lite/util/velocity/VelocityNullSetTest.java b/src/test/java/org/teachingextensions/approvals/lite/util/velocity/VelocityNullSetTest.java new file mode 100644 index 0000000..4836dd4 --- /dev/null +++ b/src/test/java/org/teachingextensions/approvals/lite/util/velocity/VelocityNullSetTest.java @@ -0,0 +1,24 @@ +package org.teachingextensions.approvals.lite.util.velocity; + +import junit.framework.TestCase; + +import org.apache.velocity.context.Context; + + +public class VelocityNullSetTest extends TestCase implements ContextAware +{ + /***********************************************************************/ + public void testField() throws Exception + { + //assertEquals("not null, null", VelocityParser.parseString("#set($s = $value)$s,#set($s = $nullValue)$s", this)); + } + /***********************************************************************/ + public void setupContext(Context context) + { + context.put("value", "not null"); + context.put("nullValue", null); + context.put("array", new String[]{"1", "2", null, null, "5"}); + } +} +/***********************************************************************/ +/***********************************************************************/ diff --git a/src/test/java/org/teachingextensions/approvals/lite/util/velocity/VelocitySilentTest.java b/src/test/java/org/teachingextensions/approvals/lite/util/velocity/VelocitySilentTest.java new file mode 100644 index 0000000..5abd34d --- /dev/null +++ b/src/test/java/org/teachingextensions/approvals/lite/util/velocity/VelocitySilentTest.java @@ -0,0 +1,36 @@ +package org.teachingextensions.approvals.lite.util.velocity; + +import junit.framework.TestCase; +import org.apache.velocity.context.Context; + +public class VelocitySilentTest + extends TestCase implements ContextAware { + /** + * ******************************************************************* + */ + public void testMethod() throws Exception { + assertEquals("", VelocityParser.parseString("$!main.toString()", this)); + } + + /** + * ******************************************************************* + */ + + /** + * ******************************************************************* + */ + public String toString() { + return null; + } + + /** + * ******************************************************************* + */ + public void setupContext(Context context) { + context.put("main", this); + context.put("nullValue", null); + } + +} +/***********************************************************************/ +/***********************************************************************/ diff --git a/src/test/java/org/teachingextensions/approvals/lite/util/velocity/VelocityTableNameTest.java b/src/test/java/org/teachingextensions/approvals/lite/util/velocity/VelocityTableNameTest.java new file mode 100644 index 0000000..c7540df --- /dev/null +++ b/src/test/java/org/teachingextensions/approvals/lite/util/velocity/VelocityTableNameTest.java @@ -0,0 +1,26 @@ +package org.teachingextensions.approvals.lite.util.velocity; + +import junit.framework.TestCase; +import org.apache.velocity.context.Context; + +public class VelocityTableNameTest extends TestCase implements ContextAware +{ + /**********************77*************************************************/ + public void testWTF() throws Exception + { + String template = "${main.getObjectName()}Metadata.TABLE_NAME, "; + assertEquals("CompanyMetadata.TABLE_NAME, ", VelocityParser.parseString(template, this)); + } + /***********************************************************************/ + public String getObjectName() + { + return "Company"; + } + /***********************************************************************/ + public void setupContext(Context context) + { + context.put("main", this); + } + /***********************************************************************/ + /***********************************************************************/ +} diff --git a/src/test/java/org/teachingextensions/approvals/lite/util/velocity/VelocityTest.java b/src/test/java/org/teachingextensions/approvals/lite/util/velocity/VelocityTest.java new file mode 100644 index 0000000..221190e --- /dev/null +++ b/src/test/java/org/teachingextensions/approvals/lite/util/velocity/VelocityTest.java @@ -0,0 +1,60 @@ +package org.teachingextensions.approvals.lite.util.velocity; + +import junit.framework.TestCase; +import org.apache.velocity.context.Context; + +public class VelocityTest extends TestCase implements ContextAware { + /** + * *******************77************************************************ + */ + public void testCodeWorks() throws Exception { + assertEquals(getClass().getName(), VelocityParser.parseString("$main.getClass().getName()", this)); + } + + public void testUnknownField() { + assertErrorThrown("$main.unknownField"); + } + + /** + * ******************************************************************* + */ + public void testUnknownFieldThenMethod() { + assertErrorThrown("$main.unknownField.someMethod()"); + } + + /** + * ******************************************************************* + */ + private void assertErrorThrown(String string) { + String result; + try { + result = VelocityParser.parseString(string, this); + } catch (Throwable t) { + return; + } + fail("parsing '" + string + "' did not fail but returned '" + result + "'"); + } + + /** + * ******************************************************************* + */ + public void testUnknownMethod() { + assertErrorThrown("$main.unknownMethod()"); + } + + /** + * ******************************************************************* + */ + public Object getNull() { + return null; + } + + /** + * ******************************************************************* + */ + public void setupContext(Context context) { + context.put("main", this); + } +} +/***********************************************************************/ +/***********************************************************************/ From 8df1fe2d613ea8ed5b7457b05ab016d2cb0c79fd Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Tue, 17 Mar 2015 22:03:48 -0700 Subject: [PATCH 075/111] cleanup empty javadocs --- .../approvals/lite/util/Filter.java | 3 -- .../approvals/lite/util/FilterUtils.java | 15 +++---- .../approvals/lite/util/ParserCommons.java | 27 +++++++++++ .../approvals/lite/util/TestUtils.java | 15 ------- .../approvals/lite/util/WindowUtils.java | 12 ----- .../approvals/lite/util/io/FileUtils.java | 25 ----------- .../approvals/lite/util/io/ZipUtils.java | 17 ------- .../lite/util/parser/ParserCommons.java | 45 ------------------- .../lite/util/velocity/VelocityParser.java | 2 +- 9 files changed, 34 insertions(+), 127 deletions(-) create mode 100644 src/main/java/org/teachingextensions/approvals/lite/util/ParserCommons.java delete mode 100644 src/main/java/org/teachingextensions/approvals/lite/util/parser/ParserCommons.java diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/Filter.java b/src/main/java/org/teachingextensions/approvals/lite/util/Filter.java index 5b6c7f0..6ed8235 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/Filter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/Filter.java @@ -6,13 +6,10 @@ public interface Filter { - /***********************************************************************/ /** * @return true if the object would be extracted by the filter * @throws IllegalArgumentException if the object is not supported by the filter */ public boolean isExtracted(T object) throws IllegalArgumentException; - /**************************************************************************/ - /**************************************************************************/ } \ No newline at end of file diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/FilterUtils.java b/src/main/java/org/teachingextensions/approvals/lite/util/FilterUtils.java index 184b7a0..5fcee07 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/FilterUtils.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/FilterUtils.java @@ -7,17 +7,19 @@ * Listens to the state of a EnabledConditions object */ public class FilterUtils { - /***********************************************************************/ - /***********************************************************************/ - /***********************************************************************/ /** + * @param fromObjects a collection of objects to filter + * @param filter an optional parameter which indicates whether the item is extracted * @return a new List containing all elements of the list for which isExtracted() would return true */ public static ArrayList retainExtracted(T fromObjects[], Filter filter) throws IllegalArgumentException { return fromObjects == null ? new ArrayList<>() : filter(Arrays.asList(fromObjects), filter, true); } - /***********************************************************************/ + /** + * @param collection the collection to filter + * @param filter an optional parameter which indicates whether the item is extracted + * @param retainExtracted true if the filter should retained the extracted items * @return a new List containing all elements of the list for which isExtracted() would return true */ private static ArrayList filter(Iterable collection, Filter filter, boolean retainExtracted) throws IllegalArgumentException { @@ -32,9 +34,4 @@ private static ArrayList filter(Iterable collection, Filter } return extracted; } - /***********************************************************************/ - /***********************************************************************/ - /* INNER CLASSES */ - /***********************************************************************/ - /***********************************************************************/ } \ No newline at end of file diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/ParserCommons.java b/src/main/java/org/teachingextensions/approvals/lite/util/ParserCommons.java new file mode 100644 index 0000000..ba2ac9a --- /dev/null +++ b/src/main/java/org/teachingextensions/approvals/lite/util/ParserCommons.java @@ -0,0 +1,27 @@ +package org.teachingextensions.approvals.lite.util; + +import java.util.List; + +public class ParserCommons { + public static ParserCommons INSTANCE = new ParserCommons(); + + public static Class getClass(String clazz) throws ClassNotFoundException { + return Class.forName(clazz); + } + + public static Object getNull() { + return null; + } + + public static int getArrayLength(Object[] array) { + return array == null ? 0 : array.length; + } + + public static Object get(Object[] array, int index) { + return getArrayLength(array) > index ? array[index] : null; + } + + public static Object get(List list, int index) { + return list == null ? null : list.get(index); + } +} \ No newline at end of file diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/TestUtils.java b/src/main/java/org/teachingextensions/approvals/lite/util/TestUtils.java index 007466c..bb90aa4 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/TestUtils.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/TestUtils.java @@ -9,17 +9,11 @@ public class TestUtils { - /** - * ******************************************************************* - */ public static void displayHtml(String htmlOutput) throws IOException, InterruptedException { displayHtml(null, ".html", htmlOutput, 3); } - /** - * ******************************************************************* - */ public static void displayHtmlFile(String fileName) throws IOException { displayFile(fileName); } @@ -31,9 +25,6 @@ public static void displayHtmlFile(File file) throws IOException { displayHtmlFile(file.getAbsolutePath()); } - /** - * ******************************************************************* - */ public static void displayHtml(String outputFile, String fileExtension, String htmlOutput, int secondsTimeout) throws IOException, InterruptedException { File file = (outputFile == null) ? File.createTempFile("temp", fileExtension) : new File(outputFile); @@ -45,16 +36,10 @@ public static void displayHtml(String outputFile, String fileExtension, String h } } - /** - * ******************************************************************* - */ public static void displayText(String output) throws IOException, InterruptedException { displayHtml(null, ".txt", output, 3); } - /** - * ******************************************************************* - */ public static void displayFile(String fileName) { String cmd; if (File.separatorChar == '\\') { diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/WindowUtils.java b/src/main/java/org/teachingextensions/approvals/lite/util/WindowUtils.java index 6ec9614..1d57cee 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/WindowUtils.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/WindowUtils.java @@ -5,9 +5,6 @@ import java.awt.event.WindowAdapter; public class WindowUtils { - /** - * ******************************************************************* - */ public static void centerWindow(java.awt.Window window) { Dimension d = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); Dimension w = window.getSize(); @@ -19,9 +16,6 @@ public static void centerWindow(java.awt.Window window) { window.setBounds(x, y, dx, dy + 1); } - /** - * ******************************************************************* - */ public static void testFrame(JFrame frame) { testFrame(frame, true); } @@ -36,9 +30,6 @@ public static void copyToClipBoard(String code, boolean displayMessage) { frame.dispose(); } - /** - * ******************************************************************* - */ public static void testFrame(JFrame frame, boolean closeOnExit) { if (closeOnExit) { testFrame(frame, new FrameCloser()); @@ -47,9 +38,6 @@ public static void testFrame(JFrame frame, boolean closeOnExit) { } } - /** - * ******************************************************************* - */ public static void testFrame(JFrame frame, WindowAdapter... array) { frame.pack(); for (WindowAdapter closer : array) { diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/io/FileUtils.java b/src/main/java/org/teachingextensions/approvals/lite/util/io/FileUtils.java index bdca7bf..8a2b03f 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/io/FileUtils.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/io/FileUtils.java @@ -20,16 +20,10 @@ public static String readFromClassPath(Class clazz, String string) { return FileUtils.readStream(resourceAsStream); } - /** - * ******************************************************************* - */ public static File[] getRecursiveFileList(File directory) { return getRecursiveFileList(directory, new SimpleFileFilter()); } - /** - * ******************************************************************* - */ public static File[] getRecursiveFileList(File directory, FileFilter filter) { ArrayList list = new ArrayList<>(); if (!directory.isDirectory()) { @@ -44,9 +38,6 @@ public static File[] getRecursiveFileList(File directory, FileFilter filter) { return list.toArray(new File[list.size()]); } - /** - * ******************************************************************* - */ public static void writeFile(File file, String text) throws IOException { Asserts.assertNotNull("Writing to file: " + file, text); file.getCanonicalFile().getParentFile().mkdirs(); @@ -55,9 +46,6 @@ public static void writeFile(File file, String text) throws IOException { out.close(); } - /** - * ******************************************************************* - */ public static void writeFileQuietly(File file, String text) { try { writeFile(file, text); @@ -66,16 +54,10 @@ public static void writeFileQuietly(File file, String text) { } } - /** - * ******************************************************************* - */ public static String readFile(String absolutePath) throws IOException { return readFile(new File(absolutePath)); } - /** - * ******************************************************************* - */ public static String readFile(File file) throws IOException { BufferedReader in = new BufferedReader(new FileReader(file)); return readBuffer(in); @@ -91,9 +73,6 @@ public static String readBuffer(BufferedReader in) throws IOException { return string.toString(); } - /** - * ******************************************************************** - */ public static String readFileWithSuppressedExceptions(File databaseFile) { try { return FileUtils.readFile(databaseFile); @@ -104,10 +83,6 @@ public static String readFileWithSuppressedExceptions(File databaseFile) { } } - /************************************************************************/ - /** - * ******************************************************************** - */ public static String getExtensionWithDot(String filename) { int p = filename.lastIndexOf('.'); return filename.substring(p); diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/io/ZipUtils.java b/src/main/java/org/teachingextensions/approvals/lite/util/io/ZipUtils.java index 44d2658..590b42f 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/io/ZipUtils.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/io/ZipUtils.java @@ -13,23 +13,14 @@ * A static class of convenience functions for Files */ public class ZipUtils { - /** - * ******************************************************************* - */ public static File zipDirectory(String directory, String zipFileName) throws IOException { return zipDirectory(new File(directory), new File(zipFileName)); } - /** - * ******************************************************************* - */ public static File zipDirectory(File directory, File zipFileName) throws IOException { return doCreateZipFile(FileUtils.getRecursiveFileList(directory), zipFileName); } - /** - * ******************************************************************* - */ public static File doCreateZipFile(File[] files, File zipFile) throws IOException { byte[] buf = new byte[1024]; zipFile.getParentFile().mkdirs(); @@ -54,9 +45,6 @@ public static File doCreateZipFile(File[] files, File zipFile) throws IOExceptio return zipFile; } - /** - * ******************************************************************* - */ public static File[] doUnzip(File destination, File zipFile) throws IOException { ArrayList list = new ArrayList<>(); byte[] buf = new byte[1024]; @@ -88,12 +76,7 @@ public static File[] doUnzip(File destination, File zipFile) throws IOException return list.toArray(new File[0]); } - /** - * ******************************************************************* - */ public static void main(String args[]) throws IOException { zipDirectory("c:\\t", "c:\\t\\t.zip"); } - /************************************************************************/ - /************************************************************************/ } \ No newline at end of file diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/parser/ParserCommons.java b/src/main/java/org/teachingextensions/approvals/lite/util/parser/ParserCommons.java deleted file mode 100644 index ec726c7..0000000 --- a/src/main/java/org/teachingextensions/approvals/lite/util/parser/ParserCommons.java +++ /dev/null @@ -1,45 +0,0 @@ -package org.teachingextensions.approvals.lite.util.parser; - -import java.util.List; - -public class ParserCommons { - public static ParserCommons INSTANCE = new ParserCommons(); - - /** - * ******************************************************************* - */ - public static Class getClass(String clazz) throws ClassNotFoundException { - return Class.forName(clazz); - } - - /** - * ******************************************************************* - */ - public static Object getNull() { - return null; - } - - /** - * ******************************************************************* - */ - public static int getArrayLength(Object[] array) { - return array == null ? 0 : array.length; - } - - /** - * ******************************************************************* - */ - public static Object get(Object[] array, int index) { - return getArrayLength(array) > index ? array[index] : null; - } - - /** - * ******************************************************************* - */ - public static Object get(List list, int index) { - return list == null ? null : list.get(index); - } - - /***********************************************************************/ - /***********************************************************************/ -} \ No newline at end of file diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/velocity/VelocityParser.java b/src/main/java/org/teachingextensions/approvals/lite/util/velocity/VelocityParser.java index 7c323cf..1c42063 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/velocity/VelocityParser.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/velocity/VelocityParser.java @@ -10,8 +10,8 @@ import org.apache.velocity.runtime.RuntimeConstants; import org.apache.velocity.runtime.log.NullLogSystem; import org.teachingextensions.approvals.lite.util.ObjectUtils; +import org.teachingextensions.approvals.lite.util.ParserCommons; import org.teachingextensions.approvals.lite.util.io.FileUtils; -import org.teachingextensions.approvals.lite.util.parser.ParserCommons; import java.io.StringWriter; import java.io.Writer; From 5be018c2b0a1d2375f06e8785899f09a281ea885 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Wed, 18 Mar 2015 08:00:54 -0700 Subject: [PATCH 076/111] cleanup javadoc, ValidationError --- .../lite/util/servlets/ValidationError.java | 47 +++---------------- 1 file changed, 6 insertions(+), 41 deletions(-) diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/servlets/ValidationError.java b/src/main/java/org/teachingextensions/approvals/lite/util/servlets/ValidationError.java index 751a0e2..4d51ffe 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/servlets/ValidationError.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/servlets/ValidationError.java @@ -10,41 +10,26 @@ public class ValidationError extends RuntimeException { private HashMap errors = new HashMap<>(); private HashSet assertions = null; - /** - * ******************************************************************* - */ - public ValidationError(Enum enumumations[]) { + public ValidationError(Enum enumerations[]) { this.assertions = new HashSet<>(); - for (Enum e : enumumations) { + for (Enum e : enumerations) { this.assertions.add(e.toString()); } } - /** - * ******************************************************************* - */ public String getMessage() { return toString(); } - /** - * ******************************************************************* - */ public String toString() { return "Validation(s) failed " + errors.keySet().toString() + " - " + errors.values().toString(); } - /** - * ******************************************************************* - */ public void set(Enum assertion, boolean isOk, String errorDescription) { setError(assertion.toString(), !isOk, errorDescription); } - /** - * ******************************************************************* - */ public void setError(String assertion, boolean isError, String errorDescription) { if (isError && !StringUtils.isNonZero(errorDescription)) { @@ -58,62 +43,42 @@ public void setError(String assertion, boolean isError, } } - /** - * ******************************************************************* - */ public ValidationError add(String prefix, int index, ValidationError error) { return add(getPrefixForIndex(prefix, index), error); } - /** - * ******************************************************************* - */ public static String getPrefixForIndex(String prefix, int index) { return prefix + "[" + index + "]"; } - /** - * ******************************************************************* - */ public ValidationError add(String prefix, ValidationError error) { prefix = StringUtils.isEmpty(prefix) ? "" : (prefix + "."); String[] assertions = StringUtils.toArray(error.assertions); + for (String assertion : assertions) { this.assertions.add(prefix + assertion); } - for (Object key : error.errors.keySet()) { + + for (String key : error.errors.keySet()) { errors.put(prefix + key, error.errors.get(key)); } + return this; } - /** - * ******************************************************************* - */ public boolean isOk() { return (errors.size() == 0); } - /** - * ******************************************************************* - */ private void assertValidAssertion(String assertion) { if (!this.assertions.contains(assertion)) { - // My_System.warning("Assertion '" + assertion + "' not found from " - // + assertions.toString()); throw new Error("Assertion '" + assertion + "' not found from " + assertions.toString()); } } - /** - * ******************************************************************* - */ public int size() { return errors.size(); } - /***********************************************************************/ - - /***********************************************************************/ } \ No newline at end of file From 6cfac9a3ead097209d503dee3918bdbe42977052 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Wed, 18 Mar 2015 08:02:59 -0700 Subject: [PATCH 077/111] cleanup javadoc, ContextAware --- .../lite/util/servlets/ValidationError.java | 2 +- .../approvals/lite/util/velocity/ContextAware.java | 13 ------------- 2 files changed, 1 insertion(+), 14 deletions(-) diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/servlets/ValidationError.java b/src/main/java/org/teachingextensions/approvals/lite/util/servlets/ValidationError.java index 4d51ffe..7be07eb 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/servlets/ValidationError.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/servlets/ValidationError.java @@ -54,7 +54,7 @@ public static String getPrefixForIndex(String prefix, int index) { public ValidationError add(String prefix, ValidationError error) { prefix = StringUtils.isEmpty(prefix) ? "" : (prefix + "."); String[] assertions = StringUtils.toArray(error.assertions); - + for (String assertion : assertions) { this.assertions.add(prefix + assertion); } diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/velocity/ContextAware.java b/src/main/java/org/teachingextensions/approvals/lite/util/velocity/ContextAware.java index a041c03..b724012 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/velocity/ContextAware.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/velocity/ContextAware.java @@ -7,18 +7,10 @@ public interface ContextAware { public void setupContext(Context context); - /***********************************************************************/ - /* INNER CLASS */ - /** - * ******************************************************************* - */ public static class ContextAwareMap implements ContextAware { HashMap add = new HashMap<>(); - /** - * ******************************************************************* - */ public ContextAwareMap(String key, Object object) { put(key, object); } @@ -27,15 +19,10 @@ public void put(String key, Object object) { add.put(key, object); } - /** - * ******************************************************************* - */ public void setupContext(Context context) { for (Entry entry : add.entrySet()) { context.put(entry.getKey(), entry.getValue()); } } } - /***********************************************************************/ - /***********************************************************************/ } From d156cdbab7b690b376adf80e09e67a795c0428e1 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Wed, 18 Mar 2015 09:31:29 -0700 Subject: [PATCH 078/111] Rollback to java 1.7 for codenvy compat --- pom.xml | 6 +- .../approvals/lite/util/FilterUtils.java | 2 +- .../lite/util/velocity/TestableUberspect.java | 29 - .../util/velocity/VelocityParsingError.java | 3 - .../teachingextensions/logo/ColorWheel.java | 28 +- .../org/teachingextensions/logo/Colors.java | 658 +++++++++--------- .../teachingextensions/logo/PenColors.java | 330 ++++----- 7 files changed, 512 insertions(+), 544 deletions(-) diff --git a/pom.xml b/pom.xml index 0d5dcf4..486a469 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 org.teachingkidsprogramming TeachingKidsProgramming - 0.0.2-SNAPSHOT + 0.0.3-SNAPSHOT jar ${project.groupId}:${project.artifactId} A proven library of high-quality programming courseware for kids. TKP is a designated project of the US non-profit (501c3) the MONA Foundation. The mission of the MONA Foundation is to "support grassroots educational initiatives that educate everyone—including girls." @@ -103,8 +103,8 @@ maven-compiler-plugin 3.2 - 1.8 - 1.8 + 1.7 + 1.7 ISO-8859-1 diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/FilterUtils.java b/src/main/java/org/teachingextensions/approvals/lite/util/FilterUtils.java index 5fcee07..6a7eadb 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/FilterUtils.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/FilterUtils.java @@ -13,7 +13,7 @@ public class FilterUtils { * @return a new List containing all elements of the list for which isExtracted() would return true */ public static ArrayList retainExtracted(T fromObjects[], Filter filter) throws IllegalArgumentException { - return fromObjects == null ? new ArrayList<>() : filter(Arrays.asList(fromObjects), filter, true); + return fromObjects == null ? new ArrayList() : filter(Arrays.asList(fromObjects), filter, true); } /** diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/velocity/TestableUberspect.java b/src/main/java/org/teachingextensions/approvals/lite/util/velocity/TestableUberspect.java index c982022..a0e946d 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/velocity/TestableUberspect.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/velocity/TestableUberspect.java @@ -36,25 +36,16 @@ public class TestableUberspect implements Uberspect, UberspectLoggable { public void init() throws Exception { } - /** - * ******************************************************************* - */ public void setRuntimeLogger(RuntimeLogger runtimeLogger) { introspector = new IntrospectorBase(); introspectorWithLog = new Introspector(runtimeLogger); log = runtimeLogger; } - /** - * ******************************************************************* - */ public Iterator getIterator(Object obj, Info i) throws Exception { return getStandardIterator(obj, i); } - /** - * ******************************************************************* - */ public static Iterator getStandardIterator(Object obj, Info i) { if (obj.getClass().isArray()) { return new ArrayIterator(obj); @@ -70,9 +61,6 @@ public static Iterator getStandardIterator(Object obj, Info i) { throw new VelocityParsingError("Could not determine type of iterator in " + "#foreach loop ", i); } - /** - * ******************************************************************* - */ public VelMethod getMethod(Object obj, String methodName, Object[] args, Info i) throws Exception { if (obj == null) { throw new VelocityParsingError("tried " + getMethodText("null", methodName, args), i); @@ -84,9 +72,6 @@ public VelMethod getMethod(Object obj, String methodName, Object[] args, Info i) return new VelMethodImpl(m); } - /** - * ******************************************************************* - */ public static String getMethodText(String className, String methodName, Object[] args) { StringBuilder methodSignature = new StringBuilder(); for (int i = 0; args != null && i < args.length; i++) { @@ -96,9 +81,6 @@ public static String getMethodText(String className, String methodName, Object[] return className + "." + methodName + "(" + methodSignature + ") "; } - /** - * ******************************************************************* - */ public VelPropertyGet getPropertyGet(Object obj, String identifier, Info i) throws Exception { AbstractExecutor executor; if (obj == null) { @@ -121,16 +103,10 @@ public VelPropertyGet getPropertyGet(Object obj, String identifier, Info i) thro return new VelGetterImpl(executor); } - /** - * ******************************************************************* - */ private String getPropertyText(String className, String identifier) { return className + "." + identifier + " "; } - /** - * ******************************************************************* - */ public VelPropertySet getPropertySet(Object obj, String identifier, Object arg, Info i) throws Exception { Class type = obj.getClass(); VelMethod vm = null; @@ -170,12 +146,7 @@ public VelPropertySet getPropertySet(Object obj, String identifier, Object arg, } return (vm != null) ? new VelSetterImpl(vm) : null; } - /***********************************************************************/ - /* INNER CLASS */ - /** - * ******************************************************************* - */ public static class VelMethodImpl implements VelMethod { Method method = null; diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/velocity/VelocityParsingError.java b/src/main/java/org/teachingextensions/approvals/lite/util/velocity/VelocityParsingError.java index ae37f35..0f37d08 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/velocity/VelocityParsingError.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/velocity/VelocityParsingError.java @@ -16,9 +16,6 @@ public String getMessage() { return message + " " + getInfoText(info); } - /** - * ******************************************************************* - */ public static String getInfoText(Info i) { return " at [" + i.getLine() + "," + i.getColumn() + "]" + " in template " + i.getTemplateName(); } diff --git a/src/main/java/org/teachingextensions/logo/ColorWheel.java b/src/main/java/org/teachingextensions/logo/ColorWheel.java index 7c93e35..3422c29 100644 --- a/src/main/java/org/teachingextensions/logo/ColorWheel.java +++ b/src/main/java/org/teachingextensions/logo/ColorWheel.java @@ -3,26 +3,26 @@ import java.awt.Color; /** - * A painter's palette + * A painter's palette * ColorWheel is a place to store a color palette.
* Example: If you have a palette of - * blue, - * red, - * and purple
+ * blue, + * red, + * and purple
* and then used it to print out the numbers, you would get
- * 1 - * 2 - * 3 - * 4 - * 5 - * 6 - * 7 - * 8 - * 9 + * 1 + * 2 + * 3 + * 4 + * 5 + * 6 + * 7 + * 8 + * 9 */ public class ColorWheel { - private static Wheel wheel = new Wheel(); + private static Wheel wheel = new Wheel<>(); /** * This method adds a color to the ColorWheel.
* Example: {@code ColorWheel.addColor(PenColors.Reds.Red);} diff --git a/src/main/java/org/teachingextensions/logo/Colors.java b/src/main/java/org/teachingextensions/logo/Colors.java index 261732f..748d9cd 100644 --- a/src/main/java/org/teachingextensions/logo/Colors.java +++ b/src/main/java/org/teachingextensions/logo/Colors.java @@ -4,10 +4,10 @@ import java.util.Random; /** - * A color wheel + * A color wheel * Every color under the - * rainbow, + * rainbow, * and different ways to get them. * * @@ -20,8 +20,8 @@ public class Colors public static class Blues { /** - * The color Navy - * + * The color Navy + *
* * * @@ -29,8 +29,8 @@ public static class Blues **/ public static final Color Navy = Color.decode("#000080"); /** - * The color DarkBlue - *
 
+ * The color DarkBlue + *
* * * @@ -38,8 +38,8 @@ public static class Blues **/ public static final Color DarkBlue = Color.decode("#00008B"); /** - * The color MidnightBlue - *
 
+ * The color MidnightBlue + *
* * * @@ -47,8 +47,8 @@ public static class Blues **/ public static final Color MidnightBlue = Color.decode("#191970"); /** - * The color MediumBlue - *
 
+ * The color MediumBlue + *
* * * @@ -56,8 +56,8 @@ public static class Blues **/ public static final Color MediumBlue = Color.decode("#0000CD"); /** - * The color Blue - *
 
+ * The color Blue + *
* * * @@ -65,8 +65,8 @@ public static class Blues **/ public static final Color Blue = Color.decode("#0000FF"); /** - * The color Teal - *
 
+ * The color Teal + *
* * * @@ -74,8 +74,8 @@ public static class Blues **/ public static final Color Teal = Color.decode("#008080"); /** - * The color DarkSlateBlue - *
 
+ * The color DarkSlateBlue + *
* * * @@ -83,8 +83,8 @@ public static class Blues **/ public static final Color DarkSlateBlue = Color.decode("#483D8B"); /** - * The color DarkCyan - *
 
+ * The color DarkCyan + *
* * * @@ -92,8 +92,8 @@ public static class Blues **/ public static final Color DarkCyan = Color.decode("#008B8B"); /** - * The color SteelBlue - *
 
+ * The color SteelBlue + *
* * * @@ -101,8 +101,8 @@ public static class Blues **/ public static final Color SteelBlue = Color.decode("#4682B4"); /** - * The color RoyalBlue - *
 
+ * The color RoyalBlue + *
* * * @@ -110,8 +110,8 @@ public static class Blues **/ public static final Color RoyalBlue = Color.decode("#4169E1"); /** - * The color SlateBlue - *
 
+ * The color SlateBlue + *
* * * @@ -119,8 +119,8 @@ public static class Blues **/ public static final Color SlateBlue = Color.decode("#6A5ACD"); /** - * The color CadetBlue - *
 
+ * The color CadetBlue + *
* * * @@ -128,8 +128,8 @@ public static class Blues **/ public static final Color CadetBlue = Color.decode("#5F9EA0"); /** - * The color DarkTurquoise - *
 
+ * The color DarkTurquoise + *
* * * @@ -137,8 +137,8 @@ public static class Blues **/ public static final Color DarkTurquoise = Color.decode("#00CED1"); /** - * The color DodgerBlue - *
 
+ * The color DodgerBlue + *
* * * @@ -146,8 +146,8 @@ public static class Blues **/ public static final Color DodgerBlue = Color.decode("#1E90FF"); /** - * The color DeepSkyBlue - *
 
+ * The color DeepSkyBlue + *
* * * @@ -155,8 +155,8 @@ public static class Blues **/ public static final Color DeepSkyBlue = Color.decode("#00BFFF"); /** - * The color MediumSlateBlue - *
 
+ * The color MediumSlateBlue + *
* * * @@ -164,8 +164,8 @@ public static class Blues **/ public static final Color MediumSlateBlue = Color.decode("#7B68EE"); /** - * The color MediumTurquoise - *
 
+ * The color MediumTurquoise + *
* * * @@ -173,8 +173,8 @@ public static class Blues **/ public static final Color MediumTurquoise = Color.decode("#48D1CC"); /** - * The color CornflowerBlue - *
 
+ * The color CornflowerBlue + *
* * * @@ -182,8 +182,8 @@ public static class Blues **/ public static final Color CornflowerBlue = Color.decode("#6495ED"); /** - * The color Turquoise - *
 
+ * The color Turquoise + *
* * * @@ -191,8 +191,8 @@ public static class Blues **/ public static final Color Turquoise = Color.decode("#40E0D0"); /** - * The color Aqua - *
 
+ * The color Aqua + *
* * * @@ -200,8 +200,8 @@ public static class Blues **/ public static final Color Aqua = Color.decode("#00FFFF"); /** - * The color Cyan - *
 
+ * The color Cyan + *
* * * @@ -209,8 +209,8 @@ public static class Blues **/ public static final Color Cyan = Color.decode("#00FFFF"); /** - * The color SkyBlue - *
 
+ * The color SkyBlue + *
* * * @@ -218,8 +218,8 @@ public static class Blues **/ public static final Color SkyBlue = Color.decode("#87CEEB"); /** - * The color LightSkyBlue - *
 
+ * The color LightSkyBlue + *
* * * @@ -227,8 +227,8 @@ public static class Blues **/ public static final Color LightSkyBlue = Color.decode("#87CEFA"); /** - * The color Aquamarine - *
 
+ * The color Aquamarine + *
* * * @@ -236,8 +236,8 @@ public static class Blues **/ public static final Color Aquamarine = Color.decode("#7FFFD4"); /** - * The color LightSteelBlue - *
 
+ * The color LightSteelBlue + *
* * * @@ -245,8 +245,8 @@ public static class Blues **/ public static final Color LightSteelBlue = Color.decode("#B0C4DE"); /** - * The color LightBlue - *
 
+ * The color LightBlue + *
* * * @@ -254,8 +254,8 @@ public static class Blues **/ public static final Color LightBlue = Color.decode("#ADD8E6"); /** - * The color PowderBlue - *
 
+ * The color PowderBlue + *
* * * @@ -263,8 +263,8 @@ public static class Blues **/ public static final Color PowderBlue = Color.decode("#B0E0E6"); /** - * The color PaleTurquoise - *
 
+ * The color PaleTurquoise + *
* * * @@ -272,8 +272,8 @@ public static class Blues **/ public static final Color PaleTurquoise = Color.decode("#AFEEEE"); /** - * The color LightCyan - *
 
+ * The color LightCyan + *
* * * @@ -281,8 +281,8 @@ public static class Blues **/ public static final Color LightCyan = Color.decode("#E0FFFF"); /** - * The color AliceBlue - *
 
+ * The color AliceBlue + *
* * * @@ -290,8 +290,8 @@ public static class Blues **/ public static final Color AliceBlue = Color.decode("#F0F8FF"); /** - * The color Azure - *
 
+ * The color Azure + *
* * * @@ -302,8 +302,8 @@ public static class Blues public static class Browns { /** - * The color Maroon - *
 
+ * The color Maroon + *
* * * @@ -311,8 +311,8 @@ public static class Browns **/ public static final Color Maroon = Color.decode("#800000"); /** - * The color SaddleBrown - *
 
+ * The color SaddleBrown + *
* * * @@ -320,8 +320,8 @@ public static class Browns **/ public static final Color SaddleBrown = Color.decode("#8B4513"); /** - * The color Brown - *
 
+ * The color Brown + *
* * * @@ -329,8 +329,8 @@ public static class Browns **/ public static final Color Brown = Color.decode("#A52A2A"); /** - * The color Sienna - *
 
+ * The color Sienna + *
* * * @@ -338,8 +338,8 @@ public static class Browns **/ public static final Color Sienna = Color.decode("#A0522D"); /** - * The color DarkGoldenrod - *
 
+ * The color DarkGoldenrod + *
* * * @@ -347,8 +347,8 @@ public static class Browns **/ public static final Color DarkGoldenrod = Color.decode("#B8860B"); /** - * The color Chocolate - *
 
+ * The color Chocolate + *
* * * @@ -356,8 +356,8 @@ public static class Browns **/ public static final Color Chocolate = Color.decode("#D2691E"); /** - * The color Peru - *
 
+ * The color Peru + *
* * * @@ -365,8 +365,8 @@ public static class Browns **/ public static final Color Peru = Color.decode("#CD853F"); /** - * The color Goldenrod - *
 
+ * The color Goldenrod + *
* * * @@ -374,8 +374,8 @@ public static class Browns **/ public static final Color Goldenrod = Color.decode("#DAA520"); /** - * The color RosyBrown - *
 
+ * The color RosyBrown + *
* * * @@ -383,8 +383,8 @@ public static class Browns **/ public static final Color RosyBrown = Color.decode("#BC8F8F"); /** - * The color SandyBrown - *
 
+ * The color SandyBrown + *
* * * @@ -392,8 +392,8 @@ public static class Browns **/ public static final Color SandyBrown = Color.decode("#F4A460"); /** - * The color Tan - *
 
+ * The color Tan + *
* * * @@ -401,8 +401,8 @@ public static class Browns **/ public static final Color Tan = Color.decode("#D2B48C"); /** - * The color BurlyWood - *
 
+ * The color BurlyWood + *
* * * @@ -410,8 +410,8 @@ public static class Browns **/ public static final Color BurlyWood = Color.decode("#DEB887"); /** - * The color Wheat - *
 
+ * The color Wheat + *
* * * @@ -419,8 +419,8 @@ public static class Browns **/ public static final Color Wheat = Color.decode("#F5DEB3"); /** - * The color NavajoWhite - *
 
+ * The color NavajoWhite + *
* * * @@ -428,8 +428,8 @@ public static class Browns **/ public static final Color NavajoWhite = Color.decode("#FFDEAD"); /** - * The color Bisque - *
 
+ * The color Bisque + *
* * * @@ -437,8 +437,8 @@ public static class Browns **/ public static final Color Bisque = Color.decode("#FFE4C4"); /** - * The color BlanchedAlmond - *
 
+ * The color BlanchedAlmond + *
* * * @@ -446,8 +446,8 @@ public static class Browns **/ public static final Color BlanchedAlmond = Color.decode("#FFEBCD"); /** - * The color Cornsilk - *
 
+ * The color Cornsilk + *
* * * @@ -458,8 +458,8 @@ public static class Browns public static class Grays { /** - * The color Black - *
 
+ * The color Black + *
* * * @@ -467,8 +467,8 @@ public static class Grays **/ public static final Color Black = Color.decode("#000000"); /** - * The color DarkSlateGray - *
 
+ * The color DarkSlateGray + *
* * * @@ -476,8 +476,8 @@ public static class Grays **/ public static final Color DarkSlateGray = Color.decode("#2F4F4F"); /** - * The color DimGray - *
 
+ * The color DimGray + *
* * * @@ -485,8 +485,8 @@ public static class Grays **/ public static final Color DimGray = Color.decode("#696969"); /** - * The color Gray - *
 
+ * The color Gray + *
* * * @@ -494,8 +494,8 @@ public static class Grays **/ public static final Color Gray = Color.decode("#808080"); /** - * The color SlateGray - *
 
+ * The color SlateGray + *
* * * @@ -503,8 +503,8 @@ public static class Grays **/ public static final Color SlateGray = Color.decode("#708090"); /** - * The color LightSlateGray - *
 
+ * The color LightSlateGray + *
* * * @@ -512,8 +512,8 @@ public static class Grays **/ public static final Color LightSlateGray = Color.decode("#778899"); /** - * The color DarkGray - *
 
+ * The color DarkGray + *
* * * @@ -521,8 +521,8 @@ public static class Grays **/ public static final Color DarkGray = Color.decode("#A9A9A9"); /** - * The color Silver - *
 
+ * The color Silver + *
* * * @@ -530,8 +530,8 @@ public static class Grays **/ public static final Color Silver = Color.decode("#C0C0C0"); /** - * The color LightGray - *
 
+ * The color LightGray + *
* * * @@ -539,8 +539,8 @@ public static class Grays **/ public static final Color LightGray = Color.decode("#D3D3D3"); /** - * The color Gainsboro - *
 
+ * The color Gainsboro + *
* * * @@ -551,8 +551,8 @@ public static class Grays public static class Greens { /** - * The color DarkGreen - *
 
+ * The color DarkGreen + *
* * * @@ -560,8 +560,8 @@ public static class Greens **/ public static final Color DarkGreen = Color.decode("#006400"); /** - * The color Green - *
 
+ * The color Green + *
* * * @@ -569,8 +569,8 @@ public static class Greens **/ public static final Color Green = Color.decode("#008000"); /** - * The color ForestGreen - *
 
+ * The color ForestGreen + *
* * * @@ -578,8 +578,8 @@ public static class Greens **/ public static final Color ForestGreen = Color.decode("#228B22"); /** - * The color DarkOliveGreen - *
 
+ * The color DarkOliveGreen + *
* * * @@ -587,8 +587,8 @@ public static class Greens **/ public static final Color DarkOliveGreen = Color.decode("#556B2F"); /** - * The color Lime - *
 
+ * The color Lime + *
* * * @@ -596,8 +596,8 @@ public static class Greens **/ public static final Color Lime = Color.decode("#00FF00"); /** - * The color Olive - *
 
+ * The color Olive + *
* * * @@ -605,8 +605,8 @@ public static class Greens **/ public static final Color Olive = Color.decode("#808000"); /** - * The color Teal - *
 
+ * The color Teal + *
* * * @@ -614,8 +614,8 @@ public static class Greens **/ public static final Color Teal = Color.decode("#008080"); /** - * The color SeaGreen - *
 
+ * The color SeaGreen + *
* * * @@ -623,8 +623,8 @@ public static class Greens **/ public static final Color SeaGreen = Color.decode("#2E8B57"); /** - * The color DarkCyan - *
 
+ * The color DarkCyan + *
* * * @@ -632,8 +632,8 @@ public static class Greens **/ public static final Color DarkCyan = Color.decode("#008B8B"); /** - * The color OliveDrab - *
 
+ * The color OliveDrab + *
* * * @@ -641,8 +641,8 @@ public static class Greens **/ public static final Color OliveDrab = Color.decode("#6B8E23"); /** - * The color LimeGreen - *
 
+ * The color LimeGreen + *
* * * @@ -650,8 +650,8 @@ public static class Greens **/ public static final Color LimeGreen = Color.decode("#32CD32"); /** - * The color MediumSeaGreen - *
 
+ * The color MediumSeaGreen + *
* * * @@ -659,8 +659,8 @@ public static class Greens **/ public static final Color MediumSeaGreen = Color.decode("#3CB371"); /** - * The color LawnGreen - *
 
+ * The color LawnGreen + *
* * * @@ -668,8 +668,8 @@ public static class Greens **/ public static final Color LawnGreen = Color.decode("#7CFC00"); /** - * The color LightSeaGreen - *
 
+ * The color LightSeaGreen + *
* * * @@ -677,8 +677,8 @@ public static class Greens **/ public static final Color LightSeaGreen = Color.decode("#20B2AA"); /** - * The color Chartreuse - *
 
+ * The color Chartreuse + *
* * * @@ -686,8 +686,8 @@ public static class Greens **/ public static final Color Chartreuse = Color.decode("#7FFF00"); /** - * The color SpringGreen - *
 
+ * The color SpringGreen + *
* * * @@ -695,8 +695,8 @@ public static class Greens **/ public static final Color SpringGreen = Color.decode("#00FF7F"); /** - * The color MediumSpringGreen - *
 
+ * The color MediumSpringGreen + *
* * * @@ -704,8 +704,8 @@ public static class Greens **/ public static final Color MediumSpringGreen = Color.decode("#00FA9A"); /** - * The color YellowGreen - *
 
+ * The color YellowGreen + *
* * * @@ -713,8 +713,8 @@ public static class Greens **/ public static final Color YellowGreen = Color.decode("#9ACD32"); /** - * The color DarkTurquoise - *
 
+ * The color DarkTurquoise + *
* * * @@ -722,8 +722,8 @@ public static class Greens **/ public static final Color DarkTurquoise = Color.decode("#00CED1"); /** - * The color DarkSeaGreen - *
 
+ * The color DarkSeaGreen + *
* * * @@ -731,8 +731,8 @@ public static class Greens **/ public static final Color DarkSeaGreen = Color.decode("#8FBC8F"); /** - * The color GreenYellow - *
 
+ * The color GreenYellow + *
* * * @@ -740,8 +740,8 @@ public static class Greens **/ public static final Color GreenYellow = Color.decode("#ADFF2F"); /** - * The color MediumAquamarine - *
 
+ * The color MediumAquamarine + *
* * * @@ -749,8 +749,8 @@ public static class Greens **/ public static final Color MediumAquamarine = Color.decode("#66CDAA"); /** - * The color MediumTurquoise - *
 
+ * The color MediumTurquoise + *
* * * @@ -758,8 +758,8 @@ public static class Greens **/ public static final Color MediumTurquoise = Color.decode("#48D1CC"); /** - * The color Turquoise - *
 
+ * The color Turquoise + *
* * * @@ -767,8 +767,8 @@ public static class Greens **/ public static final Color Turquoise = Color.decode("#40E0D0"); /** - * The color LightGreen - *
 
+ * The color LightGreen + *
* * * @@ -776,8 +776,8 @@ public static class Greens **/ public static final Color LightGreen = Color.decode("#90EE90"); /** - * The color PaleGreen - *
 
+ * The color PaleGreen + *
* * * @@ -785,8 +785,8 @@ public static class Greens **/ public static final Color PaleGreen = Color.decode("#98FB98"); /** - * The color Aquamarine - *
 
+ * The color Aquamarine + *
* * * @@ -794,8 +794,8 @@ public static class Greens **/ public static final Color Aquamarine = Color.decode("#7FFFD4"); /** - * The color PaleTurquoise - *
 
+ * The color PaleTurquoise + *
* * * @@ -806,8 +806,8 @@ public static class Greens public static class Oranges { /** - * The color OrangeRed - *
 
+ * The color OrangeRed + *
* * * @@ -815,8 +815,8 @@ public static class Oranges **/ public static final Color OrangeRed = Color.decode("#FF4500"); /** - * The color DarkOrange - *
 
+ * The color DarkOrange + *
* * * @@ -824,8 +824,8 @@ public static class Oranges **/ public static final Color DarkOrange = Color.decode("#FF8C00"); /** - * The color Orange - *
 
+ * The color Orange + *
* * * @@ -833,8 +833,8 @@ public static class Oranges **/ public static final Color Orange = Color.decode("#FFA500"); /** - * The color Tomato - *
 
+ * The color Tomato + *
* * * @@ -842,8 +842,8 @@ public static class Oranges **/ public static final Color Tomato = Color.decode("#FF6347"); /** - * The color Coral - *
 
+ * The color Coral + *
* * * @@ -851,8 +851,8 @@ public static class Oranges **/ public static final Color Coral = Color.decode("#FF7F50"); /** - * The color LightSalmon - *
 
+ * The color LightSalmon + *
* * * @@ -863,8 +863,8 @@ public static class Oranges public static class Pinks { /** - * The color MediumVioletRed - *
 
+ * The color MediumVioletRed + *
* * * @@ -872,8 +872,8 @@ public static class Pinks **/ public static final Color MediumVioletRed = Color.decode("#C71585"); /** - * The color DeepPink - *
 
+ * The color DeepPink + *
* * * @@ -881,8 +881,8 @@ public static class Pinks **/ public static final Color DeepPink = Color.decode("#FF1493"); /** - * The color PaleVioletRed - *
 
+ * The color PaleVioletRed + *
* * * @@ -890,8 +890,8 @@ public static class Pinks **/ public static final Color PaleVioletRed = Color.decode("#DB7093"); /** - * The color Fuchsia - *
 
+ * The color Fuchsia + *
* * * @@ -899,8 +899,8 @@ public static class Pinks **/ public static final Color Fuchsia = Color.decode("#FF00FF"); /** - * The color HotPink - *
 
+ * The color HotPink + *
* * * @@ -908,8 +908,8 @@ public static class Pinks **/ public static final Color HotPink = Color.decode("#FF69B4"); /** - * The color LightPink - *
 
+ * The color LightPink + *
* * * @@ -917,8 +917,8 @@ public static class Pinks **/ public static final Color LightPink = Color.decode("#FFB6C1"); /** - * The color Pink - *
 
+ * The color Pink + *
* * * @@ -929,8 +929,8 @@ public static class Pinks public static class Purples { /** - * The color Indigo - *
 
+ * The color Indigo + *
* * * @@ -938,8 +938,8 @@ public static class Purples **/ public static final Color Indigo = Color.decode("#4B0082"); /** - * The color Purple - *
 
+ * The color Purple + *
* * * @@ -947,8 +947,8 @@ public static class Purples **/ public static final Color Purple = Color.decode("#800080"); /** - * The color DarkSlateBlue - *
 
+ * The color DarkSlateBlue + *
* * * @@ -956,8 +956,8 @@ public static class Purples **/ public static final Color DarkSlateBlue = Color.decode("#483D8B"); /** - * The color DarkMagenta - *
 
+ * The color DarkMagenta + *
* * * @@ -965,8 +965,8 @@ public static class Purples **/ public static final Color DarkMagenta = Color.decode("#8B008B"); /** - * The color MediumVioletRed - *
 
+ * The color MediumVioletRed + *
* * * @@ -974,8 +974,8 @@ public static class Purples **/ public static final Color MediumVioletRed = Color.decode("#C71585"); /** - * The color DarkViolet - *
 
+ * The color DarkViolet + *
* * * @@ -983,8 +983,8 @@ public static class Purples **/ public static final Color DarkViolet = Color.decode("#9400D3"); /** - * The color SlateBlue - *
 
+ * The color SlateBlue + *
* * * @@ -992,8 +992,8 @@ public static class Purples **/ public static final Color SlateBlue = Color.decode("#6A5ACD"); /** - * The color BlueViolet - *
 
+ * The color BlueViolet + *
* * * @@ -1001,8 +1001,8 @@ public static class Purples **/ public static final Color BlueViolet = Color.decode("#8A2BE2"); /** - * The color DarkOrchid - *
 
+ * The color DarkOrchid + *
* * * @@ -1010,8 +1010,8 @@ public static class Purples **/ public static final Color DarkOrchid = Color.decode("#9932CC"); /** - * The color MediumSlateBlue - *
 
+ * The color MediumSlateBlue + *
* * * @@ -1019,8 +1019,8 @@ public static class Purples **/ public static final Color MediumSlateBlue = Color.decode("#7B68EE"); /** - * The color RosyBrown - *
 
+ * The color RosyBrown + *
* * * @@ -1028,8 +1028,8 @@ public static class Purples **/ public static final Color RosyBrown = Color.decode("#BC8F8F"); /** - * The color MediumPurple - *
 
+ * The color MediumPurple + *
* * * @@ -1037,8 +1037,8 @@ public static class Purples **/ public static final Color MediumPurple = Color.decode("#9370DB"); /** - * The color PaleVioletRed - *
 
+ * The color PaleVioletRed + *
* * * @@ -1046,8 +1046,8 @@ public static class Purples **/ public static final Color PaleVioletRed = Color.decode("#DB7093"); /** - * The color MediumOrchid - *
 
+ * The color MediumOrchid + *
* * * @@ -1055,8 +1055,8 @@ public static class Purples **/ public static final Color MediumOrchid = Color.decode("#BA55D3"); /** - * The color Fuchsia - *
 
+ * The color Fuchsia + *
* * * @@ -1064,8 +1064,8 @@ public static class Purples **/ public static final Color Fuchsia = Color.decode("#FF00FF"); /** - * The color Magenta - *
 
+ * The color Magenta + *
* * * @@ -1073,8 +1073,8 @@ public static class Purples **/ public static final Color Magenta = Color.decode("#FF00FF"); /** - * The color Orchid - *
 
+ * The color Orchid + *
* * * @@ -1082,8 +1082,8 @@ public static class Purples **/ public static final Color Orchid = Color.decode("#DA70D6"); /** - * The color Plum - *
 
+ * The color Plum + *
* * * @@ -1091,8 +1091,8 @@ public static class Purples **/ public static final Color Plum = Color.decode("#DDA0DD"); /** - * The color Violet - *
 
+ * The color Violet + *
* * * @@ -1100,8 +1100,8 @@ public static class Purples **/ public static final Color Violet = Color.decode("#EE82EE"); /** - * The color Thistle - *
 
+ * The color Thistle + *
* * * @@ -1109,8 +1109,8 @@ public static class Purples **/ public static final Color Thistle = Color.decode("#D8BFD8"); /** - * The color Lavender - *
 
+ * The color Lavender + *
* * * @@ -1121,8 +1121,8 @@ public static class Purples public static class Reds { /** - * The color DarkRed - *
 
+ * The color DarkRed + *
* * * @@ -1130,8 +1130,8 @@ public static class Reds **/ public static final Color DarkRed = Color.decode("#8B0000"); /** - * The color FireBrick - *
 
+ * The color FireBrick + *
* * * @@ -1139,8 +1139,8 @@ public static class Reds **/ public static final Color FireBrick = Color.decode("#B22222"); /** - * The color Red - *
 
+ * The color Red + *
* * * @@ -1148,8 +1148,8 @@ public static class Reds **/ public static final Color Red = Color.decode("#FF0000"); /** - * The color Crimson - *
 
+ * The color Crimson + *
* * * @@ -1157,8 +1157,8 @@ public static class Reds **/ public static final Color Crimson = Color.decode("#DC143C"); /** - * The color OrangeRed - *
 
+ * The color OrangeRed + *
* * * @@ -1166,8 +1166,8 @@ public static class Reds **/ public static final Color OrangeRed = Color.decode("#FF4500"); /** - * The color MediumVioletRed - *
 
+ * The color MediumVioletRed + *
* * * @@ -1175,8 +1175,8 @@ public static class Reds **/ public static final Color MediumVioletRed = Color.decode("#C71585"); /** - * The color IndianRed - *
 
+ * The color IndianRed + *
* * * @@ -1184,8 +1184,8 @@ public static class Reds **/ public static final Color IndianRed = Color.decode("#CD5C5C"); /** - * The color Tomato - *
 
+ * The color Tomato + *
* * * @@ -1193,8 +1193,8 @@ public static class Reds **/ public static final Color Tomato = Color.decode("#FF6347"); /** - * The color PaleVioletRed - *
 
+ * The color PaleVioletRed + *
* * * @@ -1202,8 +1202,8 @@ public static class Reds **/ public static final Color PaleVioletRed = Color.decode("#DB7093"); /** - * The color Salmon - *
 
+ * The color Salmon + *
* * * @@ -1211,8 +1211,8 @@ public static class Reds **/ public static final Color Salmon = Color.decode("#FA8072"); /** - * The color LightCoral - *
 
+ * The color LightCoral + *
* * * @@ -1220,8 +1220,8 @@ public static class Reds **/ public static final Color LightCoral = Color.decode("#F08080"); /** - * The color DarkSalmon - *
 
+ * The color DarkSalmon + *
* * * @@ -1229,8 +1229,8 @@ public static class Reds **/ public static final Color DarkSalmon = Color.decode("#E9967A"); /** - * The color LightSalmon - *
 
+ * The color LightSalmon + *
* * * @@ -1241,8 +1241,8 @@ public static class Reds public static class Whites { /** - * The color AntiqueWhite - *
 
+ * The color AntiqueWhite + *
* * * @@ -1250,8 +1250,8 @@ public static class Whites **/ public static final Color AntiqueWhite = Color.decode("#FAEBD7"); /** - * The color MistyRose - *
 
+ * The color MistyRose + *
* * * @@ -1259,8 +1259,8 @@ public static class Whites **/ public static final Color MistyRose = Color.decode("#FFE4E1"); /** - * The color Beige - *
 
+ * The color Beige + *
* * * @@ -1268,8 +1268,8 @@ public static class Whites **/ public static final Color Beige = Color.decode("#F5F5DC"); /** - * The color Linen - *
 
+ * The color Linen + *
* * * @@ -1277,8 +1277,8 @@ public static class Whites **/ public static final Color Linen = Color.decode("#FAF0E6"); /** - * The color OldLace - *
 
+ * The color OldLace + *
* * * @@ -1286,8 +1286,8 @@ public static class Whites **/ public static final Color OldLace = Color.decode("#FDF5E6"); /** - * The color Honeydew - *
 
+ * The color Honeydew + *
* * * @@ -1295,8 +1295,8 @@ public static class Whites **/ public static final Color Honeydew = Color.decode("#F0FFF0"); /** - * The color WhiteSmoke - *
 
+ * The color WhiteSmoke + *
* * * @@ -1304,8 +1304,8 @@ public static class Whites **/ public static final Color WhiteSmoke = Color.decode("#F5F5F5"); /** - * The color Seashell - *
 
+ * The color Seashell + *
* * * @@ -1313,8 +1313,8 @@ public static class Whites **/ public static final Color Seashell = Color.decode("#FFF5EE"); /** - * The color LavenderBlush - *
 
+ * The color LavenderBlush + *
* * * @@ -1322,8 +1322,8 @@ public static class Whites **/ public static final Color LavenderBlush = Color.decode("#FFF0F5"); /** - * The color AliceBlue - *
 
+ * The color AliceBlue + *
* * * @@ -1331,8 +1331,8 @@ public static class Whites **/ public static final Color AliceBlue = Color.decode("#F0F8FF"); /** - * The color FloralWhite - *
 
+ * The color FloralWhite + *
* * * @@ -1340,8 +1340,8 @@ public static class Whites **/ public static final Color FloralWhite = Color.decode("#FFFAF0"); /** - * The color MintCream - *
 
+ * The color MintCream + *
* * * @@ -1349,8 +1349,8 @@ public static class Whites **/ public static final Color MintCream = Color.decode("#F5FFFA"); /** - * The color Azure - *
 
+ * The color Azure + *
* * * @@ -1358,8 +1358,8 @@ public static class Whites **/ public static final Color Azure = Color.decode("#F0FFFF"); /** - * The color Ivory - *
 
+ * The color Ivory + *
* * * @@ -1367,8 +1367,8 @@ public static class Whites **/ public static final Color Ivory = Color.decode("#FFFFF0"); /** - * The color GhostWhite - *
 
+ * The color GhostWhite + *
* * * @@ -1376,8 +1376,8 @@ public static class Whites **/ public static final Color GhostWhite = Color.decode("#F8F8FF"); /** - * The color Snow - *
 
+ * The color Snow + *
* * * @@ -1385,8 +1385,8 @@ public static class Whites **/ public static final Color Snow = Color.decode("#FFFAFA"); /** - * The color White - *
 
+ * The color White + *
* * * @@ -1397,8 +1397,8 @@ public static class Whites public static class Yellows { /** - * The color DarkGoldenrod - *
 
+ * The color DarkGoldenrod + *
* * * @@ -1406,8 +1406,8 @@ public static class Yellows **/ public static final Color DarkGoldenrod = Color.decode("#B8860B"); /** - * The color Goldenrod - *
 
+ * The color Goldenrod + *
* * * @@ -1415,8 +1415,8 @@ public static class Yellows **/ public static final Color Goldenrod = Color.decode("#DAA520"); /** - * The color Gold - *
 
+ * The color Gold + *
* * * @@ -1424,8 +1424,8 @@ public static class Yellows **/ public static final Color Gold = Color.decode("#FFD700"); /** - * The color DarkKhaki - *
 
+ * The color DarkKhaki + *
* * * @@ -1433,8 +1433,8 @@ public static class Yellows **/ public static final Color DarkKhaki = Color.decode("#BDB76B"); /** - * The color Yellow - *
 
+ * The color Yellow + *
* * * @@ -1442,8 +1442,8 @@ public static class Yellows **/ public static final Color Yellow = Color.decode("#FFFF00"); /** - * The color Khaki - *
 
+ * The color Khaki + *
* * * @@ -1451,8 +1451,8 @@ public static class Yellows **/ public static final Color Khaki = Color.decode("#F0E68C"); /** - * The color PaleGoldenrod - *
 
+ * The color PaleGoldenrod + *
* * * @@ -1460,8 +1460,8 @@ public static class Yellows **/ public static final Color PaleGoldenrod = Color.decode("#EEE8AA"); /** - * The color PeachPuff - *
 
+ * The color PeachPuff + *
* * * @@ -1469,8 +1469,8 @@ public static class Yellows **/ public static final Color PeachPuff = Color.decode("#FFDAB9"); /** - * The color Moccasin - *
 
+ * The color Moccasin + *
* * * @@ -1478,8 +1478,8 @@ public static class Yellows **/ public static final Color Moccasin = Color.decode("#FFE4B5"); /** - * The color PapayaWhip - *
 
+ * The color PapayaWhip + *
* * * @@ -1487,8 +1487,8 @@ public static class Yellows **/ public static final Color PapayaWhip = Color.decode("#FFEFD5"); /** - * The color LemonChiffon - *
 
+ * The color LemonChiffon + *
* * * @@ -1496,8 +1496,8 @@ public static class Yellows **/ public static final Color LemonChiffon = Color.decode("#FFFACD"); /** - * The color LightGoldenrodYellow - *
 
+ * The color LightGoldenrodYellow + *
* * * @@ -1505,8 +1505,8 @@ public static class Yellows **/ public static final Color LightGoldenrodYellow = Color.decode("#FAFAD2"); /** - * The color LightYellow - *
 
+ * The color LightYellow + *
* * * diff --git a/src/main/java/org/teachingextensions/logo/PenColors.java b/src/main/java/org/teachingextensions/logo/PenColors.java index 2474a74..8ed5822 100644 --- a/src/main/java/org/teachingextensions/logo/PenColors.java +++ b/src/main/java/org/teachingextensions/logo/PenColors.java @@ -4,7 +4,7 @@ import java.util.Random; /** - * A color wheel + * A color wheel * Every pen color under the * rainbow, @@ -16,7 +16,7 @@ public static class Blues { /** * The color Navy - *
 
+ *
* * * @@ -25,7 +25,7 @@ public static class Blues public static final Color Navy = Color.decode("#000080"); /** * The color DarkBlue - *
 
+ *
* * * @@ -34,7 +34,7 @@ public static class Blues public static final Color DarkBlue = Color.decode("#00008B"); /** * The color MidnightBlue - *
 
+ *
* * * @@ -43,7 +43,7 @@ public static class Blues public static final Color MidnightBlue = Color.decode("#191970"); /** * The color MediumBlue - *
 
+ *
* * * @@ -52,7 +52,7 @@ public static class Blues public static final Color MediumBlue = Color.decode("#0000CD"); /** * The color Blue - *
 
+ *
* * * @@ -61,7 +61,7 @@ public static class Blues public static final Color Blue = Color.decode("#0000FF"); /** * The color Teal - *
 
+ *
* * * @@ -70,7 +70,7 @@ public static class Blues public static final Color Teal = Color.decode("#008080"); /** * The color DarkSlateBlue - *
 
+ *
* * * @@ -79,7 +79,7 @@ public static class Blues public static final Color DarkSlateBlue = Color.decode("#483D8B"); /** * The color DarkCyan - *
 
+ *
* * * @@ -88,7 +88,7 @@ public static class Blues public static final Color DarkCyan = Color.decode("#008B8B"); /** * The color SteelBlue - *
 
+ *
* * * @@ -97,7 +97,7 @@ public static class Blues public static final Color SteelBlue = Color.decode("#4682B4"); /** * The color RoyalBlue - *
 
+ *
* * * @@ -106,7 +106,7 @@ public static class Blues public static final Color RoyalBlue = Color.decode("#4169E1"); /** * The color SlateBlue - *
 
+ *
* * * @@ -115,7 +115,7 @@ public static class Blues public static final Color SlateBlue = Color.decode("#6A5ACD"); /** * The color CadetBlue - *
 
+ *
* * * @@ -124,7 +124,7 @@ public static class Blues public static final Color CadetBlue = Color.decode("#5F9EA0"); /** * The color DarkTurquoise - *
 
+ *
* * * @@ -133,7 +133,7 @@ public static class Blues public static final Color DarkTurquoise = Color.decode("#00CED1"); /** * The color DodgerBlue - *
 
+ *
* * * @@ -142,7 +142,7 @@ public static class Blues public static final Color DodgerBlue = Color.decode("#1E90FF"); /** * The color DeepSkyBlue - *
 
+ *
* * * @@ -151,7 +151,7 @@ public static class Blues public static final Color DeepSkyBlue = Color.decode("#00BFFF"); /** * The color MediumSlateBlue - *
 
+ *
* * * @@ -160,7 +160,7 @@ public static class Blues public static final Color MediumSlateBlue = Color.decode("#7B68EE"); /** * The color MediumTurquoise - *
 
+ *
* * * @@ -169,7 +169,7 @@ public static class Blues public static final Color MediumTurquoise = Color.decode("#48D1CC"); /** * The color CornflowerBlue - *
 
+ *
* * * @@ -178,7 +178,7 @@ public static class Blues public static final Color CornflowerBlue = Color.decode("#6495ED"); /** * The color Turquoise - *
 
+ *
* * * @@ -187,7 +187,7 @@ public static class Blues public static final Color Turquoise = Color.decode("#40E0D0"); /** * The color Aqua - *
 
+ *
* * * @@ -196,7 +196,7 @@ public static class Blues public static final Color Aqua = Color.decode("#00FFFF"); /** * The color Cyan - *
 
+ *
* * * @@ -205,7 +205,7 @@ public static class Blues public static final Color Cyan = Color.decode("#00FFFF"); /** * The color SkyBlue - *
 
+ *
* * * @@ -214,7 +214,7 @@ public static class Blues public static final Color SkyBlue = Color.decode("#87CEEB"); /** * The color LightSkyBlue - *
 
+ *
* * * @@ -223,7 +223,7 @@ public static class Blues public static final Color LightSkyBlue = Color.decode("#87CEFA"); /** * The color Aquamarine - *
 
+ *
* * * @@ -232,7 +232,7 @@ public static class Blues public static final Color Aquamarine = Color.decode("#7FFFD4"); /** * The color LightSteelBlue - *
 
+ *
* * * @@ -241,7 +241,7 @@ public static class Blues public static final Color LightSteelBlue = Color.decode("#B0C4DE"); /** * The color LightBlue - *
 
+ *
* * * @@ -250,7 +250,7 @@ public static class Blues public static final Color LightBlue = Color.decode("#ADD8E6"); /** * The color PowderBlue - *
 
+ *
* * * @@ -259,7 +259,7 @@ public static class Blues public static final Color PowderBlue = Color.decode("#B0E0E6"); /** * The color PaleTurquoise - *
 
+ *
* * * @@ -268,7 +268,7 @@ public static class Blues public static final Color PaleTurquoise = Color.decode("#AFEEEE"); /** * The color LightCyan - *
 
+ *
* * * @@ -277,7 +277,7 @@ public static class Blues public static final Color LightCyan = Color.decode("#E0FFFF"); /** * The color AliceBlue - *
 
+ *
* * * @@ -286,7 +286,7 @@ public static class Blues public static final Color AliceBlue = Color.decode("#F0F8FF"); /** * The color Azure - *
 
+ *
* * * @@ -298,7 +298,7 @@ public static class Browns { /** * The color Maroon - *
 
+ *
* * * @@ -307,7 +307,7 @@ public static class Browns public static final Color Maroon = Color.decode("#800000"); /** * The color SaddleBrown - *
 
+ *
* * * @@ -316,7 +316,7 @@ public static class Browns public static final Color SaddleBrown = Color.decode("#8B4513"); /** * The color Brown - *
 
+ *
* * * @@ -325,7 +325,7 @@ public static class Browns public static final Color Brown = Color.decode("#A52A2A"); /** * The color Sienna - *
 
+ *
* * * @@ -334,7 +334,7 @@ public static class Browns public static final Color Sienna = Color.decode("#A0522D"); /** * The color DarkGoldenrod - *
 
+ *
* * * @@ -343,7 +343,7 @@ public static class Browns public static final Color DarkGoldenrod = Color.decode("#B8860B"); /** * The color Chocolate - *
 
+ *
* * * @@ -352,7 +352,7 @@ public static class Browns public static final Color Chocolate = Color.decode("#D2691E"); /** * The color Peru - *
 
+ *
* * * @@ -361,7 +361,7 @@ public static class Browns public static final Color Peru = Color.decode("#CD853F"); /** * The color Goldenrod - *
 
+ *
* * * @@ -370,7 +370,7 @@ public static class Browns public static final Color Goldenrod = Color.decode("#DAA520"); /** * The color RosyBrown - *
 
+ *
* * * @@ -379,7 +379,7 @@ public static class Browns public static final Color RosyBrown = Color.decode("#BC8F8F"); /** * The color SandyBrown - *
 
+ *
* * * @@ -388,7 +388,7 @@ public static class Browns public static final Color SandyBrown = Color.decode("#F4A460"); /** * The color Tan - *
 
+ *
* * * @@ -397,7 +397,7 @@ public static class Browns public static final Color Tan = Color.decode("#D2B48C"); /** * The color BurlyWood - *
 
+ *
* * * @@ -406,7 +406,7 @@ public static class Browns public static final Color BurlyWood = Color.decode("#DEB887"); /** * The color Wheat - *
 
+ *
* * * @@ -415,7 +415,7 @@ public static class Browns public static final Color Wheat = Color.decode("#F5DEB3"); /** * The color NavajoWhite - *
 
+ *
* * * @@ -424,7 +424,7 @@ public static class Browns public static final Color NavajoWhite = Color.decode("#FFDEAD"); /** * The color Bisque - *
 
+ *
* * * @@ -433,7 +433,7 @@ public static class Browns public static final Color Bisque = Color.decode("#FFE4C4"); /** * The color BlanchedAlmond - *
 
+ *
* * * @@ -442,7 +442,7 @@ public static class Browns public static final Color BlanchedAlmond = Color.decode("#FFEBCD"); /** * The color Cornsilk - *
 
+ *
* * * @@ -454,7 +454,7 @@ public static class Grays { /** * The color Black - *
 
+ *
* * * @@ -463,7 +463,7 @@ public static class Grays public static final Color Black = Color.decode("#000000"); /** * The color DarkSlateGray - *
 
+ *
* * * @@ -472,7 +472,7 @@ public static class Grays public static final Color DarkSlateGray = Color.decode("#2F4F4F"); /** * The color DimGray - *
 
+ *
* * * @@ -481,7 +481,7 @@ public static class Grays public static final Color DimGray = Color.decode("#696969"); /** * The color Gray - *
 
+ *
* * * @@ -490,7 +490,7 @@ public static class Grays public static final Color Gray = Color.decode("#808080"); /** * The color SlateGray - *
 
+ *
* * * @@ -499,7 +499,7 @@ public static class Grays public static final Color SlateGray = Color.decode("#708090"); /** * The color LightSlateGray - *
 
+ *
* * * @@ -508,7 +508,7 @@ public static class Grays public static final Color LightSlateGray = Color.decode("#778899"); /** * The color DarkGray - *
 
+ *
* * * @@ -517,7 +517,7 @@ public static class Grays public static final Color DarkGray = Color.decode("#A9A9A9"); /** * The color Silver - *
 
+ *
* * * @@ -526,7 +526,7 @@ public static class Grays public static final Color Silver = Color.decode("#C0C0C0"); /** * The color LightGray - *
 
+ *
* * * @@ -535,7 +535,7 @@ public static class Grays public static final Color LightGray = Color.decode("#D3D3D3"); /** * The color Gainsboro - *
 
+ *
* * * @@ -547,7 +547,7 @@ public static class Greens { /** * The color DarkGreen - *
 
+ *
* * * @@ -556,7 +556,7 @@ public static class Greens public static final Color DarkGreen = Color.decode("#006400"); /** * The color Green - *
 
+ *
* * * @@ -565,7 +565,7 @@ public static class Greens public static final Color Green = Color.decode("#008000"); /** * The color ForestGreen - *
 
+ *
* * * @@ -574,7 +574,7 @@ public static class Greens public static final Color ForestGreen = Color.decode("#228B22"); /** * The color DarkOliveGreen - *
 
+ *
* * * @@ -583,7 +583,7 @@ public static class Greens public static final Color DarkOliveGreen = Color.decode("#556B2F"); /** * The color Lime - *
 
+ *
* * * @@ -592,7 +592,7 @@ public static class Greens public static final Color Lime = Color.decode("#00FF00"); /** * The color Olive - *
 
+ *
* * * @@ -601,7 +601,7 @@ public static class Greens public static final Color Olive = Color.decode("#808000"); /** * The color Teal - *
 
+ *
* * * @@ -610,7 +610,7 @@ public static class Greens public static final Color Teal = Color.decode("#008080"); /** * The color SeaGreen - *
 
+ *
* * * @@ -619,7 +619,7 @@ public static class Greens public static final Color SeaGreen = Color.decode("#2E8B57"); /** * The color DarkCyan - *
 
+ *
* * * @@ -628,7 +628,7 @@ public static class Greens public static final Color DarkCyan = Color.decode("#008B8B"); /** * The color OliveDrab - *
 
+ *
* * * @@ -637,7 +637,7 @@ public static class Greens public static final Color OliveDrab = Color.decode("#6B8E23"); /** * The color LimeGreen - *
 
+ *
* * * @@ -646,7 +646,7 @@ public static class Greens public static final Color LimeGreen = Color.decode("#32CD32"); /** * The color MediumSeaGreen - *
 
+ *
* * * @@ -655,7 +655,7 @@ public static class Greens public static final Color MediumSeaGreen = Color.decode("#3CB371"); /** * The color LawnGreen - *
 
+ *
* * * @@ -664,7 +664,7 @@ public static class Greens public static final Color LawnGreen = Color.decode("#7CFC00"); /** * The color LightSeaGreen - *
 
+ *
* * * @@ -673,7 +673,7 @@ public static class Greens public static final Color LightSeaGreen = Color.decode("#20B2AA"); /** * The color Chartreuse - *
 
+ *
* * * @@ -682,7 +682,7 @@ public static class Greens public static final Color Chartreuse = Color.decode("#7FFF00"); /** * The color SpringGreen - *
 
+ *
* * * @@ -691,7 +691,7 @@ public static class Greens public static final Color SpringGreen = Color.decode("#00FF7F"); /** * The color MediumSpringGreen - *
 
+ *
* * * @@ -700,7 +700,7 @@ public static class Greens public static final Color MediumSpringGreen = Color.decode("#00FA9A"); /** * The color YellowGreen - *
 
+ *
* * * @@ -709,7 +709,7 @@ public static class Greens public static final Color YellowGreen = Color.decode("#9ACD32"); /** * The color DarkTurquoise - *
 
+ *
* * * @@ -718,7 +718,7 @@ public static class Greens public static final Color DarkTurquoise = Color.decode("#00CED1"); /** * The color DarkSeaGreen - *
 
+ *
* * * @@ -727,7 +727,7 @@ public static class Greens public static final Color DarkSeaGreen = Color.decode("#8FBC8F"); /** * The color GreenYellow - *
 
+ *
* * * @@ -736,7 +736,7 @@ public static class Greens public static final Color GreenYellow = Color.decode("#ADFF2F"); /** * The color MediumAquamarine - *
 
+ *
* * * @@ -745,7 +745,7 @@ public static class Greens public static final Color MediumAquamarine = Color.decode("#66CDAA"); /** * The color MediumTurquoise - *
 
+ *
* * * @@ -754,7 +754,7 @@ public static class Greens public static final Color MediumTurquoise = Color.decode("#48D1CC"); /** * The color Turquoise - *
 
+ *
* * * @@ -763,7 +763,7 @@ public static class Greens public static final Color Turquoise = Color.decode("#40E0D0"); /** * The color LightGreen - *
 
+ *
* * * @@ -772,7 +772,7 @@ public static class Greens public static final Color LightGreen = Color.decode("#90EE90"); /** * The color PaleGreen - *
 
+ *
* * * @@ -781,7 +781,7 @@ public static class Greens public static final Color PaleGreen = Color.decode("#98FB98"); /** * The color Aquamarine - *
 
+ *
* * * @@ -790,7 +790,7 @@ public static class Greens public static final Color Aquamarine = Color.decode("#7FFFD4"); /** * The color PaleTurquoise - *
 
+ *
* * * @@ -802,7 +802,7 @@ public static class Oranges { /** * The color OrangeRed - *
 
+ *
* * * @@ -811,7 +811,7 @@ public static class Oranges public static final Color OrangeRed = Color.decode("#FF4500"); /** * The color DarkOrange - *
 
+ *
* * * @@ -820,7 +820,7 @@ public static class Oranges public static final Color DarkOrange = Color.decode("#FF8C00"); /** * The color Orange - *
 
+ *
* * * @@ -829,7 +829,7 @@ public static class Oranges public static final Color Orange = Color.decode("#FFA500"); /** * The color Tomato - *
 
+ *
* * * @@ -838,7 +838,7 @@ public static class Oranges public static final Color Tomato = Color.decode("#FF6347"); /** * The color Coral - *
 
+ *
* * * @@ -847,7 +847,7 @@ public static class Oranges public static final Color Coral = Color.decode("#FF7F50"); /** * The color LightSalmon - *
 
+ *
* * * @@ -859,7 +859,7 @@ public static class Pinks { /** * The color MediumVioletRed - *
 
+ *
* * * @@ -868,7 +868,7 @@ public static class Pinks public static final Color MediumVioletRed = Color.decode("#C71585"); /** * The color DeepPink - *
 
+ *
* * * @@ -877,7 +877,7 @@ public static class Pinks public static final Color DeepPink = Color.decode("#FF1493"); /** * The color PaleVioletRed - *
 
+ *
* * * @@ -886,7 +886,7 @@ public static class Pinks public static final Color PaleVioletRed = Color.decode("#DB7093"); /** * The color Fuchsia - *
 
+ *
* * * @@ -895,7 +895,7 @@ public static class Pinks public static final Color Fuchsia = Color.decode("#FF00FF"); /** * The color HotPink - *
 
+ *
* * * @@ -904,7 +904,7 @@ public static class Pinks public static final Color HotPink = Color.decode("#FF69B4"); /** * The color LightPink - *
 
+ *
* * * @@ -913,7 +913,7 @@ public static class Pinks public static final Color LightPink = Color.decode("#FFB6C1"); /** * The color Pink - *
 
+ *
* * * @@ -925,7 +925,7 @@ public static class Purples { /** * The color Indigo - *
 
+ *
* * * @@ -934,7 +934,7 @@ public static class Purples public static final Color Indigo = Color.decode("#4B0082"); /** * The color Purple - *
 
+ *
* * * @@ -943,7 +943,7 @@ public static class Purples public static final Color Purple = Color.decode("#800080"); /** * The color DarkSlateBlue - *
 
+ *
* * * @@ -952,7 +952,7 @@ public static class Purples public static final Color DarkSlateBlue = Color.decode("#483D8B"); /** * The color DarkMagenta - *
 
+ *
* * * @@ -961,7 +961,7 @@ public static class Purples public static final Color DarkMagenta = Color.decode("#8B008B"); /** * The color MediumVioletRed - *
 
+ *
* * * @@ -970,7 +970,7 @@ public static class Purples public static final Color MediumVioletRed = Color.decode("#C71585"); /** * The color DarkViolet - *
 
+ *
* * * @@ -979,7 +979,7 @@ public static class Purples public static final Color DarkViolet = Color.decode("#9400D3"); /** * The color SlateBlue - *
 
+ *
* * * @@ -988,7 +988,7 @@ public static class Purples public static final Color SlateBlue = Color.decode("#6A5ACD"); /** * The color BlueViolet - *
 
+ *
* * * @@ -997,7 +997,7 @@ public static class Purples public static final Color BlueViolet = Color.decode("#8A2BE2"); /** * The color DarkOrchid - *
 
+ *
* * * @@ -1006,7 +1006,7 @@ public static class Purples public static final Color DarkOrchid = Color.decode("#9932CC"); /** * The color MediumSlateBlue - *
 
+ *
* * * @@ -1015,7 +1015,7 @@ public static class Purples public static final Color MediumSlateBlue = Color.decode("#7B68EE"); /** * The color RosyBrown - *
 
+ *
* * * @@ -1024,7 +1024,7 @@ public static class Purples public static final Color RosyBrown = Color.decode("#BC8F8F"); /** * The color MediumPurple - *
 
+ *
* * * @@ -1033,7 +1033,7 @@ public static class Purples public static final Color MediumPurple = Color.decode("#9370DB"); /** * The color PaleVioletRed - *
 
+ *
* * * @@ -1042,7 +1042,7 @@ public static class Purples public static final Color PaleVioletRed = Color.decode("#DB7093"); /** * The color MediumOrchid - *
 
+ *
* * * @@ -1051,7 +1051,7 @@ public static class Purples public static final Color MediumOrchid = Color.decode("#BA55D3"); /** * The color Fuchsia - *
 
+ *
* * * @@ -1060,7 +1060,7 @@ public static class Purples public static final Color Fuchsia = Color.decode("#FF00FF"); /** * The color Magenta - *
 
+ *
* * * @@ -1069,7 +1069,7 @@ public static class Purples public static final Color Magenta = Color.decode("#FF00FF"); /** * The color Orchid - *
 
+ *
* * * @@ -1078,7 +1078,7 @@ public static class Purples public static final Color Orchid = Color.decode("#DA70D6"); /** * The color Plum - *
 
+ *
* * * @@ -1087,7 +1087,7 @@ public static class Purples public static final Color Plum = Color.decode("#DDA0DD"); /** * The color Violet - *
 
+ *
* * * @@ -1096,7 +1096,7 @@ public static class Purples public static final Color Violet = Color.decode("#EE82EE"); /** * The color Thistle - *
 
+ *
* * * @@ -1105,7 +1105,7 @@ public static class Purples public static final Color Thistle = Color.decode("#D8BFD8"); /** * The color Lavender - *
 
+ *
* * * @@ -1117,7 +1117,7 @@ public static class Reds { /** * The color DarkRed - *
 
+ *
* * * @@ -1126,7 +1126,7 @@ public static class Reds public static final Color DarkRed = Color.decode("#8B0000"); /** * The color FireBrick - *
 
+ *
* * * @@ -1135,7 +1135,7 @@ public static class Reds public static final Color FireBrick = Color.decode("#B22222"); /** * The color Red - *
 
+ *
* * * @@ -1144,7 +1144,7 @@ public static class Reds public static final Color Red = Color.decode("#FF0000"); /** * The color Crimson - *
 
+ *
* * * @@ -1153,7 +1153,7 @@ public static class Reds public static final Color Crimson = Color.decode("#DC143C"); /** * The color OrangeRed - *
 
+ *
* * * @@ -1162,7 +1162,7 @@ public static class Reds public static final Color OrangeRed = Color.decode("#FF4500"); /** * The color MediumVioletRed - *
 
+ *
* * * @@ -1171,7 +1171,7 @@ public static class Reds public static final Color MediumVioletRed = Color.decode("#C71585"); /** * The color IndianRed - *
 
+ *
* * * @@ -1180,7 +1180,7 @@ public static class Reds public static final Color IndianRed = Color.decode("#CD5C5C"); /** * The color Tomato - *
 
+ *
* * * @@ -1189,7 +1189,7 @@ public static class Reds public static final Color Tomato = Color.decode("#FF6347"); /** * The color PaleVioletRed - *
 
+ *
* * * @@ -1198,7 +1198,7 @@ public static class Reds public static final Color PaleVioletRed = Color.decode("#DB7093"); /** * The color Salmon - *
 
+ *
* * * @@ -1207,7 +1207,7 @@ public static class Reds public static final Color Salmon = Color.decode("#FA8072"); /** * The color LightCoral - *
 
+ *
* * * @@ -1216,7 +1216,7 @@ public static class Reds public static final Color LightCoral = Color.decode("#F08080"); /** * The color DarkSalmon - *
 
+ *
* * * @@ -1225,7 +1225,7 @@ public static class Reds public static final Color DarkSalmon = Color.decode("#E9967A"); /** * The color LightSalmon - *
 
+ *
* * * @@ -1237,7 +1237,7 @@ public static class Whites { /** * The color AntiqueWhite - *
 
+ *
* * * @@ -1246,7 +1246,7 @@ public static class Whites public static final Color AntiqueWhite = Color.decode("#FAEBD7"); /** * The color MistyRose - *
 
+ *
* * * @@ -1255,7 +1255,7 @@ public static class Whites public static final Color MistyRose = Color.decode("#FFE4E1"); /** * The color Beige - *
 
+ *
* * * @@ -1264,7 +1264,7 @@ public static class Whites public static final Color Beige = Color.decode("#F5F5DC"); /** * The color Linen - *
 
+ *
* * * @@ -1273,7 +1273,7 @@ public static class Whites public static final Color Linen = Color.decode("#FAF0E6"); /** * The color OldLace - *
 
+ *
* * * @@ -1282,7 +1282,7 @@ public static class Whites public static final Color OldLace = Color.decode("#FDF5E6"); /** * The color Honeydew - *
 
+ *
* * * @@ -1291,7 +1291,7 @@ public static class Whites public static final Color Honeydew = Color.decode("#F0FFF0"); /** * The color WhiteSmoke - *
 
+ *
* * * @@ -1300,7 +1300,7 @@ public static class Whites public static final Color WhiteSmoke = Color.decode("#F5F5F5"); /** * The color Seashell - *
 
+ *
* * * @@ -1309,7 +1309,7 @@ public static class Whites public static final Color Seashell = Color.decode("#FFF5EE"); /** * The color LavenderBlush - *
 
+ *
* * * @@ -1318,7 +1318,7 @@ public static class Whites public static final Color LavenderBlush = Color.decode("#FFF0F5"); /** * The color AliceBlue - *
 
+ *
* * * @@ -1327,7 +1327,7 @@ public static class Whites public static final Color AliceBlue = Color.decode("#F0F8FF"); /** * The color FloralWhite - *
 
+ *
* * * @@ -1336,7 +1336,7 @@ public static class Whites public static final Color FloralWhite = Color.decode("#FFFAF0"); /** * The color MintCream - *
 
+ *
* * * @@ -1345,7 +1345,7 @@ public static class Whites public static final Color MintCream = Color.decode("#F5FFFA"); /** * The color Azure - *
 
+ *
* * * @@ -1354,7 +1354,7 @@ public static class Whites public static final Color Azure = Color.decode("#F0FFFF"); /** * The color Ivory - *
 
+ *
* * * @@ -1363,7 +1363,7 @@ public static class Whites public static final Color Ivory = Color.decode("#FFFFF0"); /** * The color GhostWhite - *
 
+ *
* * * @@ -1372,7 +1372,7 @@ public static class Whites public static final Color GhostWhite = Color.decode("#F8F8FF"); /** * The color Snow - *
 
+ *
* * * @@ -1381,7 +1381,7 @@ public static class Whites public static final Color Snow = Color.decode("#FFFAFA"); /** * The color White - *
 
+ *
* * * @@ -1393,7 +1393,7 @@ public static class Yellows { /** * The color DarkGoldenrod - *
 
+ *
* * * @@ -1402,7 +1402,7 @@ public static class Yellows public static final Color DarkGoldenrod = Color.decode("#B8860B"); /** * The color Goldenrod - *
 
+ *
* * * @@ -1411,7 +1411,7 @@ public static class Yellows public static final Color Goldenrod = Color.decode("#DAA520"); /** * The color Gold - *
 
+ *
* * * @@ -1420,7 +1420,7 @@ public static class Yellows public static final Color Gold = Color.decode("#FFD700"); /** * The color DarkKhaki - *
 
+ *
* * * @@ -1429,7 +1429,7 @@ public static class Yellows public static final Color DarkKhaki = Color.decode("#BDB76B"); /** * The color Yellow - *
 
+ *
* * * @@ -1438,7 +1438,7 @@ public static class Yellows public static final Color Yellow = Color.decode("#FFFF00"); /** * The color Khaki - *
 
+ *
* * * @@ -1447,7 +1447,7 @@ public static class Yellows public static final Color Khaki = Color.decode("#F0E68C"); /** * The color PaleGoldenrod - *
 
+ *
* * * @@ -1456,7 +1456,7 @@ public static class Yellows public static final Color PaleGoldenrod = Color.decode("#EEE8AA"); /** * The color PeachPuff - *
 
+ *
* * * @@ -1465,7 +1465,7 @@ public static class Yellows public static final Color PeachPuff = Color.decode("#FFDAB9"); /** * The color Moccasin - *
 
+ *
* * * @@ -1474,7 +1474,7 @@ public static class Yellows public static final Color Moccasin = Color.decode("#FFE4B5"); /** * The color PapayaWhip - *
 
+ *
* * * @@ -1483,7 +1483,7 @@ public static class Yellows public static final Color PapayaWhip = Color.decode("#FFEFD5"); /** * The color LemonChiffon - *
 
+ *
* * * @@ -1492,7 +1492,7 @@ public static class Yellows public static final Color LemonChiffon = Color.decode("#FFFACD"); /** * The color LightGoldenrodYellow - *
 
+ *
* * * @@ -1501,7 +1501,7 @@ public static class Yellows public static final Color LightGoldenrodYellow = Color.decode("#FAFAD2"); /** * The color LightYellow - *
 
+ *
* * * @@ -1535,7 +1535,7 @@ private static int increase(int amount, int increaseBy) /** * Gets a random pen color *
Example: {@code penColors.getRandomColor( )}
- * + * @return A color */ public static Color getRandomColor() { From 9490c8b785b82094f00b7035d7b2b8b80ca30fd4 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Wed, 18 Mar 2015 10:15:05 -0700 Subject: [PATCH 079/111] cleanup turtle, wheel --- .../org/teachingextensions/logo/Turtle.java | 2 +- .../org/teachingextensions/logo/Wheel.java | 116 +++++++++--------- 2 files changed, 56 insertions(+), 62 deletions(-) diff --git a/src/main/java/org/teachingextensions/logo/Turtle.java b/src/main/java/org/teachingextensions/logo/Turtle.java index fb32668..51d05ba 100644 --- a/src/main/java/org/teachingextensions/logo/Turtle.java +++ b/src/main/java/org/teachingextensions/logo/Turtle.java @@ -18,7 +18,7 @@ import org.teachingextensions.approvals.lite.util.persistence.SavingException; /** - * A turtle drawing a line + * A turtle drawing a line * The Turtle allows you to draw lines and shapes by moving it around on the window, and you can put more than one turtle on the same window... */ public class Turtle diff --git a/src/main/java/org/teachingextensions/logo/Wheel.java b/src/main/java/org/teachingextensions/logo/Wheel.java index 5aeb722..bbbec15 100644 --- a/src/main/java/org/teachingextensions/logo/Wheel.java +++ b/src/main/java/org/teachingextensions/logo/Wheel.java @@ -1,73 +1,67 @@ package org.teachingextensions.logo; +import org.teachingextensions.approvals.lite.util.NumberUtils; + import java.util.ArrayList; import java.util.List; -import org.teachingextensions.approvals.lite.util.NumberUtils; - /** - * A Wheel is a List with no ending on beginning
- * - * Example: {@code - * Wheel names = new Wheel(); - * names.add("Chocolate"); - * names.add("Peanut Butter"); - * for(int i = 0; i < 6; i++) > { - * String name = names.next(); - * System.out.print(name + " "); - * } - * } - * Would result in :
+ * A Wheel is a List with no ending on beginning

+ * Example:

{@code
+ *    Wheel names = new Wheel();
+ *    names.add("Chocolate");
+ *    names.add("Peanut Butter");
+ *    for(int i = 0; i < 6; i++){
+ *      String name = names.next();
+ *      System.out.print(name + " ");
+ *    }
+ * }
+ * Would result in:

* Chocolate Peanut Butter Chocolate Peanut Butter Chocolate Peanut Butter - * - * @param + * + * @param The kind of things that are in the wheel */ -public class Wheel -{ - private List list = new ArrayList(); - private int index = 0; - @SafeVarargs -public Wheel(T... loadWith) - { - for (T t : loadWith) - { - add(t); +public class Wheel { + private List list = new ArrayList<>(); + private int index = 0; + + @SafeVarargs + public Wheel(T... loadWith) { + for (T t : loadWith) { + add(t); + } + } + + public Wheel() { } - } - public Wheel() - { - } - public void add(T i) - { - list.add(i); - } - public T next() - { - assertNonEmpty(); - if (index >= list.size()) - { - index = 0; + + public void add(T i) { + list.add(i); } - T t = list.get(index++); - return t; - } - private void assertNonEmpty() - { - if (list.isEmpty()) - { - String message = "I call shenanigans!!!\nThis Wheel is empty\nYou can NOT get something from the Wheel before you've added anything to it."; - throw new RuntimeException(message); + + public T next() { + assertNonEmpty(); + if (index >= list.size()) { + index = 0; + } + return list.get(index++); + } + + private void assertNonEmpty() { + if (list.isEmpty()) { + String message = "I call shenanigans!!!\nThis Wheel is empty\nYou can NOT get something from the Wheel before you've added anything to it."; + throw new RuntimeException(message); + } + } + + public T getRandomFrom() { + assertNonEmpty(); + int index = NumberUtils.getRandomInt(0, list.size()); + return list.get(index); + } + + public void empty() { + list.clear(); + index = 0; } - } - public T getRandomFrom() - { - assertNonEmpty(); - int index = NumberUtils.getRandomInt(0, list.size()); - return list.get(index); - } - public void empty() - { - list.clear(); - index = 0; - } } From 071a59a9027c7b83e7c3108e9e1c95cb3c733e98 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Wed, 18 Mar 2015 10:46:36 -0700 Subject: [PATCH 080/111] cleanup javadocs and dead code --- .../approvals/lite/util/ClassUtils.java | 16 +- .../approvals/lite/util/DateDifference.java | 45 +-- .../approvals/lite/util/DateUtils.java | 68 ---- .../approvals/lite/util/DualOutputStream.java | 93 ----- .../approvals/lite/util/Filter.java | 6 +- .../approvals/lite/util/FilterUtils.java | 1 + .../approvals/lite/util/MySystem.java | 181 +--------- .../approvals/lite/util/NumberUtils.java | 4 + .../teachingextensions/logo/PenColors.java | 330 +++++++++--------- .../org/teachingextensions/logo/Pizza.java | 146 ++++---- 10 files changed, 260 insertions(+), 630 deletions(-) delete mode 100644 src/main/java/org/teachingextensions/approvals/lite/util/DualOutputStream.java diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/ClassUtils.java b/src/main/java/org/teachingextensions/approvals/lite/util/ClassUtils.java index 57ab8ae..addbc78 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/ClassUtils.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/ClassUtils.java @@ -6,18 +6,7 @@ import java.util.List; public class ClassUtils { - /** - * ******************************************************************** - */ - public static String getClassName(Class clazz) { - String name = clazz.getName(); - int divider = name.lastIndexOf("."); - return name.substring(divider + 1); - } - /** - * ******************************************************************** - */ public static Class getWrapperClass(Class primitiveType) { if (boolean.class.equals(primitiveType)) { return Boolean.class; @@ -39,10 +28,7 @@ public static Class getWrapperClass(Class primitiveType) { return primitiveType; } } - /************************************************************************/ - /** - * ******************************************************************** - */ + public static boolean hasMethod(Class clazz, String methodName, Class... parameterTypes) { try { return clazz.getMethod(methodName, parameterTypes) != null; diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/DateDifference.java b/src/main/java/org/teachingextensions/approvals/lite/util/DateDifference.java index 737e274..de34017 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/DateDifference.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/DateDifference.java @@ -1,10 +1,8 @@ package org.teachingextensions.approvals.lite.util; import java.util.Calendar; -import java.util.Date; public class DateDifference { - public static final String STANDARD_TIME_TEXT[] = {"Year", "Years", "Month", "Months", "Week", "Weeks", "Day", "Days", "Hour", "Hours", "Min", "Mins", "Sec", "Secs", "Milli", "Millis"}; public static final String MILLISECONDS = "milliseconds"; public static final String SECONDS = "seconds"; public static final String MINUTES = "minutes"; @@ -17,38 +15,17 @@ public class DateDifference { // assumes a 30 day month private static int TIME_SCALE[] = {Calendar.YEAR, Calendar.MONTH, Calendar.WEEK_OF_YEAR, Calendar.DATE, Calendar.HOUR, Calendar.MINUTE, Calendar.SECOND, Calendar.MILLISECOND}; private static long DIVIDERS[] = {1000 * 60 * 60 * 24 * 365L, 1000 * 60 * 60 * 24 * 30L, 1000 * 60 * 60 * 24 * 7L, 1000 * 60 * 60 * 24L, 1000 * 60 * 60L, 1000 * 60L, 1000L, 1L}; - /** - * ******************************************************************** - */ + private long milli; - /** - * ******************************************************************** - */ public DateDifference(long timeDifference) { this.milli = timeDifference; } - /** - * ******************************************************************** - */ - public DateDifference(Date date1, Date date2) { - milli = date1.getTime() - date2.getTime(); - if (milli < 0) { - milli = milli * -1; - } - } - - /** - * ******************************************************************** - */ public static long getAbsoluteDifference(int unit, long time) { return time / DIVIDERS[getTimeScaleIndex(unit)]; } - /** - * ******************************************************************** - */ public static long getRemainingDifference(int wantedUnit, int roundTo, long time) { int wantedIndex = getTimeScaleIndex(wantedUnit); int roundToIndex = getTimeScaleIndex(roundTo); @@ -57,7 +34,7 @@ public static long getRemainingDifference(int wantedUnit, int roundTo, long time } return (time % DIVIDERS[roundToIndex]) / DIVIDERS[wantedIndex]; } - /***********************************************************************/ + /** * @return the index in TIME_SCALE[] of the largest Unit to be > 0 */ @@ -68,10 +45,11 @@ private int getMaximumTimeUnit() { } return i; } - /***********************************************************************/ + /** * Finds the index for a Calendar.DATE ect. * + * @param calendarTime the time scale to find * @return the index in TIME_SCALE[] */ public static int getTimeScaleIndex(int calendarTime) { @@ -82,9 +60,6 @@ public static int getTimeScaleIndex(int calendarTime) { return i; } - /** - * ******************************************************************* - */ private static long getStandardRoundedTime(int unitIndex, boolean forceAbsolute, long time) { if (unitIndex == 0 || forceAbsolute) { return getAbsoluteDifference(TIME_SCALE[unitIndex], time); @@ -93,9 +68,6 @@ private static long getStandardRoundedTime(int unitIndex, boolean forceAbsolute, } } - /** - * ******************************************************************* - */ public String getTimeText(int amount, int maxUnit, int minUnit, String nowText, String agoText, String units[]) { if (amount == 0) { throw new Error("getTimeText() requires amount > 0"); @@ -122,13 +94,4 @@ public String getTimeText(int amount, int maxUnit, int minUnit, String nowText, } return timeText; } - - /** - * ******************************************************************* - */ - public String getStandardTimeText(int amountShown) { - return getTimeText(amountShown, Calendar.YEAR, Calendar.MILLISECOND, "now", "", STANDARD_TIME_TEXT); - } - /************************************************************************/ - /************************************************************************/ } \ No newline at end of file diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/DateUtils.java b/src/main/java/org/teachingextensions/approvals/lite/util/DateUtils.java index d27e516..bf6cc98 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/DateUtils.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/DateUtils.java @@ -1,15 +1,9 @@ package org.teachingextensions.approvals.lite.util; -import java.sql.Timestamp; -import java.text.ParseException; -import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; -/** - * A static class of convenience functions for database access - */ public class DateUtils { private static int TIME_SCALE[] = {Calendar.YEAR, Calendar.MONTH, @@ -20,29 +14,6 @@ public class DateUtils { Calendar.SECOND, Calendar.MILLISECOND}; - public static boolean isSame(Date firstDate, Date secondDate, int smallestUnits) { - if ((firstDate == null) || (secondDate == null)) { - return (firstDate == secondDate); - } - return isSame(firstDate.getTime(), secondDate.getTime(), smallestUnits); - } - - public static boolean isSame(long firstDate, long secondDate, int smallestUnits) { - if (!ArrayUtils.contains(TIME_SCALE, smallestUnits)) { - throw new Error("Invalid Timescale " + smallestUnits); - } - GregorianCalendar first = new GregorianCalendar(); - first.setTime(new Date(firstDate)); - setSignificantDigit(first, smallestUnits); - GregorianCalendar second = new GregorianCalendar(); - second.setTime(new Date(secondDate)); - setSignificantDigit(second, smallestUnits); - return (first.getTime().getTime() == second.getTime().getTime()); - } - - /** - * ******************************************************************** - */ public static Calendar setSignificantDigit(Calendar calendar, int smallestUnits) { boolean removeOn = false; for (int i : TIME_SCALE) { @@ -74,9 +45,6 @@ public static void main(String args[]) { MySystem.variable("End Of Day", rollToEndOfDay(new Date()).getTime()); } - /** - * ******************************************************************** - */ public static GregorianCalendar rollToEndOfDay(Date date) { GregorianCalendar gregorianCalendar = new GregorianCalendar(); gregorianCalendar.setTime(date); @@ -87,40 +55,4 @@ public static GregorianCalendar rollToEndOfDay(Date date) { return gregorianCalendar; } - /** - * ******************************************************************* - */ - public static Timestamp asTimestamp(Date date) { - return new Timestamp(date.getTime()); - } - - /** - * ******************************************************************** - */ - public static boolean isToday(Date date) { - return DateUtils.isSame(date, new Date(), Calendar.DATE); - } - - /** - * ******************************************************************** - */ - public static Calendar asCalendar(Date date) { - GregorianCalendar gregorianCalendar = new GregorianCalendar(); - gregorianCalendar.setTime(date); - return gregorianCalendar; - } - - /************************************************************************/ - /** - * @param date "yyyy/MM/dd" - */ - public static Timestamp parse(String date) { - SimpleDateFormat format = new java.text.SimpleDateFormat("yyyy/MM/dd"); - try { - return asTimestamp(format.parse(date)); - } catch (ParseException e) { - throw ObjectUtils.throwAsError(e); - } - } - /************************************************************************/ } \ No newline at end of file diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/DualOutputStream.java b/src/main/java/org/teachingextensions/approvals/lite/util/DualOutputStream.java deleted file mode 100644 index 6ec76e1..0000000 --- a/src/main/java/org/teachingextensions/approvals/lite/util/DualOutputStream.java +++ /dev/null @@ -1,93 +0,0 @@ -package org.teachingextensions.approvals.lite.util; - -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.io.PrintStream; - -public class DualOutputStream extends OutputStream { - private FileOutputStream o; - private PrintStream display = System.out; - - /** - * ******************************************************************** - */ - public DualOutputStream() { - super(); - } - - /** - * ******************************************************************** - */ - public void setOutputStream(String outfile) throws Exception { - try { - o = new FileOutputStream(outfile); - display.println("output being redirected to: " + outfile); - } catch (Exception e) { - throw ObjectUtils.throwAsError(e); - } - } - - /** - * ******************************************************************** - */ - public void write(int b) throws IOException { - try { - o.write(b); - } catch (Exception e) { - throw ObjectUtils.throwAsError(e); - } - display.write(b); - } - - /** - * ******************************************************************** - */ - public void write(byte b[]) throws IOException { - try { - o.write(b); - } catch (Exception e) { - throw ObjectUtils.throwAsError(e); - } - display.println(b + ""); - flush(); - } - - /** - * ******************************************************************** - */ - public void write(byte b[], int off, int len) throws IOException { - try { - o.write(b, off, len); - } catch (Exception e) { - throw ObjectUtils.throwAsError(e); - } - display.write(b, off, len); - } - - /** - * ******************************************************************** - */ - public void flush() throws IOException { - try { - o.flush(); - } catch (Exception e) { - throw ObjectUtils.throwAsError(e); - } - display.flush(); - } - - /** - * ******************************************************************** - */ - public void close() throws IOException { - try { - o.close(); - } catch (Exception e) { - throw ObjectUtils.throwAsError(e); - } - display.close(); - } - /************************************************************************/ - /************************************************************************/ -} \ No newline at end of file diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/Filter.java b/src/main/java/org/teachingextensions/approvals/lite/util/Filter.java index 6ed8235..f417498 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/Filter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/Filter.java @@ -1,12 +1,8 @@ package org.teachingextensions.approvals.lite.util; -/** - * Listens to the state of a EnabledConditions object - */ - - public interface Filter { /** + * @param object the item to check * @return true if the object would be extracted by the filter * @throws IllegalArgumentException if the object is not supported by the filter */ diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/FilterUtils.java b/src/main/java/org/teachingextensions/approvals/lite/util/FilterUtils.java index 6a7eadb..bbcdd4b 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/FilterUtils.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/FilterUtils.java @@ -11,6 +11,7 @@ public class FilterUtils { * @param fromObjects a collection of objects to filter * @param filter an optional parameter which indicates whether the item is extracted * @return a new List containing all elements of the list for which isExtracted() would return true + * @param the kind of items to filter */ public static ArrayList retainExtracted(T fromObjects[], Filter filter) throws IllegalArgumentException { return fromObjects == null ? new ArrayList() : filter(Arrays.asList(fromObjects), filter, true); diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/MySystem.java b/src/main/java/org/teachingextensions/approvals/lite/util/MySystem.java index f66a805..e1da420 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/MySystem.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/MySystem.java @@ -10,20 +10,12 @@ * @version 2.0 */ public class MySystem { - public static final int IN = 1; - private static boolean useStackTraceInspection = true; - public static boolean marker = true; public static boolean event = true; public static boolean variable = true; - public static boolean query = true; public static int hourGlass = 0; - private static int m_indent = 0; private static long lastTime = System.currentTimeMillis(); private static PrintWriter SYSTEM_OUT_WRITER = new PrintWriter(System.out, true); - /** - * ******************************************************************* - */ private static void clearHourGlass() { if (hourGlass > 0) { System.out.println(""); @@ -31,69 +23,11 @@ private static void clearHourGlass() { } } - /** - * Prints to screen the marker specifying function entered. - */ - public synchronized static void markerOut() { - markerOut(null); - } - /***********************************************************************/ - /** - * Prints to screen the marker specifying function entered. - */ - public synchronized static void markerIn() { - markerIn(null); - } - /***********************************************************************/ - /** - * Prints to screen the marker specifying function entered. - * - * @param statement The statement to print - */ - public synchronized static void markerIn(String statement) { - if (!marker) { - return; - } - if (useStackTraceInspection) { - System.out.println(timeStamp() + "**** " + extractMarkerText() + " - IN"); - } else { - System.out.println(timeStamp() + "**** " + statement + " - IN"); - } - m_indent++; - } - - /** - * ******************************************************************* - */ - private static String extractMarkerText() { - try { - StackTraceElement trace[] = new Error().getStackTrace(); - StackTraceElement element = trace[3]; - String text = element.getMethodName(); - String className = element.getClassName(); - className = className.substring(className.lastIndexOf(".") + 1); - text += "(" + className + ":" + element.getLineNumber() + ")"; - return text; - } catch (Throwable t) { - useStackTraceInspection = false; - return "Can't Inspect Stack Trace"; - } - } - - /** - * ******************************************************************* - */ private static String getIndent() { - String theIndention = ""; - for (int i = 0; i < m_indent; i++) { - theIndention += " "; - } - return theIndention; + + return ""; } - /** - * ******************************************************************* - */ private static String timeStamp() { clearHourGlass(); String text; @@ -105,9 +39,6 @@ private static String timeStamp() { return text; } - /** - * ******************************************************************* - */ private static String padNumber(long number) { String text = "" + number; while (text.length() < 6) { @@ -116,9 +47,6 @@ private static String padNumber(long number) { return text; } - /** - * ******************************************************************* - */ private static String indentMessage(String message) { Vector v = new Vector<>(); int place = 0; @@ -132,50 +60,12 @@ private static String indentMessage(String message) { String theIndention = getIndent(); StringBuilder buffer = new StringBuilder(message); for (int i = (v.size() - 1); i >= 0; i--) { - int tempplace = v.elementAt(i); - buffer.insert(tempplace + 1, theIndention); + int template = v.elementAt(i); + buffer.insert(template + 1, theIndention); } return buffer.toString(); } - /***********************************************************************/ - /** - * Prints to screen the marker specifying function exited. - * - * @param Statement The statement to print - */ - public synchronized static void markerOut(String Statement) { - if (!marker) { - return; - } - m_indent--; - System.out.println(timeStamp() + "**** " + extractMarkerText() + " - OUT"); - } - /***********************************************************************/ - /** - * Prints to screen any variable information to be viewed. - * - * @param sqlQuery The SQL query to print - */ - public synchronized static void query(String sqlQuery) { - if (!query) { - return; - } - System.out.println(timeStamp() + "~~> SQL - " + sqlQuery); - } - /***********************************************************************/ - /** - * Prints to screen any variable information to be viewed. - * - * @param queryName The name of the query - * @param sqlQuery The query to print - */ - public synchronized static void query(String queryName, Object sqlQuery) { - if (!query) { - return; - } - System.out.println(timeStamp() + "~~> SQL [" + queryName + "] - " + sqlQuery); - } - /***********************************************************************/ + /** * Prints to screen any variable information to be viewed. * @@ -185,16 +75,13 @@ public synchronized static void variable(String statement) { variable(statement, SYSTEM_OUT_WRITER); } - /** - * ******************************************************************* - */ public synchronized static void variable(String statement, PrintWriter out) { if (!variable) { return; } out.println(timeStamp() + "*=>" + statement); } - /***********************************************************************/ + /** * Prints to screen any variable information to be viewed. * @@ -207,37 +94,7 @@ public synchronized static void variable(String name, Object value) { } System.out.println(timeStamp() + "*=> " + name + " = '" + (value == null ? null : value.toString()) + "'"); } - /***********************************************************************/ - /** - * Prints to screen any variable information to be viewed. - * - * @param name The name of the array - * @param array The collection of objects to print - */ - public synchronized static void variable(String name, Object array[]) { - if (!variable) { - return; - } - name = (name == null ? "array" : name); - if (array == null || array.length == 0) { - System.out.println(timeStamp() + "*=> " + name + ".length = 0"); - } else { - for (int i = 0; i < array.length; i++) { - System.out.println(timeStamp() + "*=> " + name + "[" + i + "] = " - + ((array[i] == null) ? "null" : array[i].toString())); - } - } - } - /***********************************************************************/ - /** - * Prints to screen any variable information to be viewed. - * - * @param array A collection of objects to print - */ - public synchronized static void variable(Object array[]) { - variable(null, array); - } - /***********************************************************************/ + /** * Prints to screen any messages to be viewed. * @@ -246,7 +103,7 @@ public synchronized static void variable(Object array[]) { public synchronized static void message(String Statement) { System.out.println(timeStamp() + indentMessage(Statement)); } - /***********************************************************************/ + /** * Prints to screen any events to be viewed. * @@ -258,7 +115,7 @@ public static void event(String Statement) { } System.out.println(timeStamp() + "*--" + Statement); } - /***********************************************************************/ + /** * Prints to screen any warnings to be viewed. * @@ -267,7 +124,7 @@ public static void event(String Statement) { public synchronized static void warning(String statement) { warning(statement, null); } - /***********************************************************************/ + /** * Prints to screen any warnings to be viewed. * @@ -276,7 +133,7 @@ public synchronized static void warning(String statement) { public synchronized static void warning(Throwable throwable) { warning(null, throwable); } - /***********************************************************************/ + /** * Prints to screen any warnings to be viewed. * @@ -301,9 +158,6 @@ public synchronized static void warning(String statement, Throwable throwable, P dualPrintln("******************************************************************************************", out); } - /** - * ******************************************************************* - */ private static void dualPrintln(String string, PrintWriter out) { System.out.println(string); if (out != null) { @@ -311,9 +165,6 @@ private static void dualPrintln(String string, PrintWriter out) { } } - /** - * ******************************************************************* - */ private static void printFullTrace(Throwable throwable, boolean causedBy, PrintWriter out) { if (throwable != null) { dualPrintln((causedBy ? "Caused by : " : "") + throwable.getMessage(), out); @@ -326,12 +177,7 @@ private static void printFullTrace(Throwable throwable, boolean causedBy, PrintW } } } - /***********************************************************************/ - /************************************************************************/ - /************************************************************************/ - /** - * ******************************************************************** - */ + public static void dumpMemory(PrintWriter out) { System.gc(); java.text.NumberFormat format = java.text.NumberFormat.getNumberInstance(); @@ -342,7 +188,4 @@ public static void dumpMemory(PrintWriter out) { + format.format(usedMemory) + " , " + format.format(freeMemory) + "]"; variable(statement, out); } - /************************************************************************/ - /***********************************************************************/ - /***********************************************************************/ } diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/NumberUtils.java b/src/main/java/org/teachingextensions/approvals/lite/util/NumberUtils.java index aa0b4fa..65e73b2 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/NumberUtils.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/NumberUtils.java @@ -10,6 +10,10 @@ public class NumberUtils { /** * Loads an int from a String. + * + * @param i a string with an integer in it + * @param defaultValue value to use when no integer can be found in the string + * @return the integer found in the string */ public static int load(String i, int defaultValue) { return load(i, defaultValue, true); diff --git a/src/main/java/org/teachingextensions/logo/PenColors.java b/src/main/java/org/teachingextensions/logo/PenColors.java index 8ed5822..816fd2d 100644 --- a/src/main/java/org/teachingextensions/logo/PenColors.java +++ b/src/main/java/org/teachingextensions/logo/PenColors.java @@ -6,8 +6,8 @@ /** * A color wheel * Every pen color under the - * rainbow, + * rainbow, * and different ways to get them. */ public class PenColors @@ -15,7 +15,7 @@ public class PenColors public static class Blues { /** - * The color Navy + * The color Navy *

 
* * @@ -24,7 +24,7 @@ public static class Blues **/ public static final Color Navy = Color.decode("#000080"); /** - * The color DarkBlue + * The color DarkBlue *
 
* * @@ -33,7 +33,7 @@ public static class Blues **/ public static final Color DarkBlue = Color.decode("#00008B"); /** - * The color MidnightBlue + * The color MidnightBlue *
 
* * @@ -42,7 +42,7 @@ public static class Blues **/ public static final Color MidnightBlue = Color.decode("#191970"); /** - * The color MediumBlue + * The color MediumBlue *
 
* * @@ -51,7 +51,7 @@ public static class Blues **/ public static final Color MediumBlue = Color.decode("#0000CD"); /** - * The color Blue + * The color Blue *
 
* * @@ -60,7 +60,7 @@ public static class Blues **/ public static final Color Blue = Color.decode("#0000FF"); /** - * The color Teal + * The color Teal *
 
* * @@ -69,7 +69,7 @@ public static class Blues **/ public static final Color Teal = Color.decode("#008080"); /** - * The color DarkSlateBlue + * The color DarkSlateBlue *
 
* * @@ -78,7 +78,7 @@ public static class Blues **/ public static final Color DarkSlateBlue = Color.decode("#483D8B"); /** - * The color DarkCyan + * The color DarkCyan *
 
* * @@ -87,7 +87,7 @@ public static class Blues **/ public static final Color DarkCyan = Color.decode("#008B8B"); /** - * The color SteelBlue + * The color SteelBlue *
 
* * @@ -96,7 +96,7 @@ public static class Blues **/ public static final Color SteelBlue = Color.decode("#4682B4"); /** - * The color RoyalBlue + * The color RoyalBlue *
 
* * @@ -105,7 +105,7 @@ public static class Blues **/ public static final Color RoyalBlue = Color.decode("#4169E1"); /** - * The color SlateBlue + * The color SlateBlue *
 
* * @@ -114,7 +114,7 @@ public static class Blues **/ public static final Color SlateBlue = Color.decode("#6A5ACD"); /** - * The color CadetBlue + * The color CadetBlue *
 
* * @@ -123,7 +123,7 @@ public static class Blues **/ public static final Color CadetBlue = Color.decode("#5F9EA0"); /** - * The color DarkTurquoise + * The color DarkTurquoise *
 
* * @@ -132,7 +132,7 @@ public static class Blues **/ public static final Color DarkTurquoise = Color.decode("#00CED1"); /** - * The color DodgerBlue + * The color DodgerBlue *
 
* * @@ -141,7 +141,7 @@ public static class Blues **/ public static final Color DodgerBlue = Color.decode("#1E90FF"); /** - * The color DeepSkyBlue + * The color DeepSkyBlue *
 
* * @@ -150,7 +150,7 @@ public static class Blues **/ public static final Color DeepSkyBlue = Color.decode("#00BFFF"); /** - * The color MediumSlateBlue + * The color MediumSlateBlue *
 
* * @@ -159,7 +159,7 @@ public static class Blues **/ public static final Color MediumSlateBlue = Color.decode("#7B68EE"); /** - * The color MediumTurquoise + * The color MediumTurquoise *
 
* * @@ -168,7 +168,7 @@ public static class Blues **/ public static final Color MediumTurquoise = Color.decode("#48D1CC"); /** - * The color CornflowerBlue + * The color CornflowerBlue *
 
* * @@ -177,7 +177,7 @@ public static class Blues **/ public static final Color CornflowerBlue = Color.decode("#6495ED"); /** - * The color Turquoise + * The color Turquoise *
 
* * @@ -186,7 +186,7 @@ public static class Blues **/ public static final Color Turquoise = Color.decode("#40E0D0"); /** - * The color Aqua + * The color Aqua *
 
* * @@ -195,7 +195,7 @@ public static class Blues **/ public static final Color Aqua = Color.decode("#00FFFF"); /** - * The color Cyan + * The color Cyan *
 
* * @@ -204,7 +204,7 @@ public static class Blues **/ public static final Color Cyan = Color.decode("#00FFFF"); /** - * The color SkyBlue + * The color SkyBlue *
 
* * @@ -213,7 +213,7 @@ public static class Blues **/ public static final Color SkyBlue = Color.decode("#87CEEB"); /** - * The color LightSkyBlue + * The color LightSkyBlue *
 
* * @@ -222,7 +222,7 @@ public static class Blues **/ public static final Color LightSkyBlue = Color.decode("#87CEFA"); /** - * The color Aquamarine + * The color Aquamarine *
 
* * @@ -231,7 +231,7 @@ public static class Blues **/ public static final Color Aquamarine = Color.decode("#7FFFD4"); /** - * The color LightSteelBlue + * The color LightSteelBlue *
 
* * @@ -240,7 +240,7 @@ public static class Blues **/ public static final Color LightSteelBlue = Color.decode("#B0C4DE"); /** - * The color LightBlue + * The color LightBlue *
 
* * @@ -249,7 +249,7 @@ public static class Blues **/ public static final Color LightBlue = Color.decode("#ADD8E6"); /** - * The color PowderBlue + * The color PowderBlue *
 
* * @@ -258,7 +258,7 @@ public static class Blues **/ public static final Color PowderBlue = Color.decode("#B0E0E6"); /** - * The color PaleTurquoise + * The color PaleTurquoise *
 
* * @@ -267,7 +267,7 @@ public static class Blues **/ public static final Color PaleTurquoise = Color.decode("#AFEEEE"); /** - * The color LightCyan + * The color LightCyan *
 
* * @@ -276,7 +276,7 @@ public static class Blues **/ public static final Color LightCyan = Color.decode("#E0FFFF"); /** - * The color AliceBlue + * The color AliceBlue *
 
* * @@ -285,7 +285,7 @@ public static class Blues **/ public static final Color AliceBlue = Color.decode("#F0F8FF"); /** - * The color Azure + * The color Azure *
 
* * @@ -297,7 +297,7 @@ public static class Blues public static class Browns { /** - * The color Maroon + * The color Maroon *
 
* * @@ -306,7 +306,7 @@ public static class Browns **/ public static final Color Maroon = Color.decode("#800000"); /** - * The color SaddleBrown + * The color SaddleBrown *
 
* * @@ -315,7 +315,7 @@ public static class Browns **/ public static final Color SaddleBrown = Color.decode("#8B4513"); /** - * The color Brown + * The color Brown *
 
* * @@ -324,7 +324,7 @@ public static class Browns **/ public static final Color Brown = Color.decode("#A52A2A"); /** - * The color Sienna + * The color Sienna *
 
* * @@ -333,7 +333,7 @@ public static class Browns **/ public static final Color Sienna = Color.decode("#A0522D"); /** - * The color DarkGoldenrod + * The color DarkGoldenrod *
 
* * @@ -342,7 +342,7 @@ public static class Browns **/ public static final Color DarkGoldenrod = Color.decode("#B8860B"); /** - * The color Chocolate + * The color Chocolate *
 
* * @@ -351,7 +351,7 @@ public static class Browns **/ public static final Color Chocolate = Color.decode("#D2691E"); /** - * The color Peru + * The color Peru *
 
* * @@ -360,7 +360,7 @@ public static class Browns **/ public static final Color Peru = Color.decode("#CD853F"); /** - * The color Goldenrod + * The color Goldenrod *
 
* * @@ -369,7 +369,7 @@ public static class Browns **/ public static final Color Goldenrod = Color.decode("#DAA520"); /** - * The color RosyBrown + * The color RosyBrown *
 
* * @@ -378,7 +378,7 @@ public static class Browns **/ public static final Color RosyBrown = Color.decode("#BC8F8F"); /** - * The color SandyBrown + * The color SandyBrown *
 
* * @@ -387,7 +387,7 @@ public static class Browns **/ public static final Color SandyBrown = Color.decode("#F4A460"); /** - * The color Tan + * The color Tan *
 
* * @@ -396,7 +396,7 @@ public static class Browns **/ public static final Color Tan = Color.decode("#D2B48C"); /** - * The color BurlyWood + * The color BurlyWood *
 
* * @@ -405,7 +405,7 @@ public static class Browns **/ public static final Color BurlyWood = Color.decode("#DEB887"); /** - * The color Wheat + * The color Wheat *
 
* * @@ -414,7 +414,7 @@ public static class Browns **/ public static final Color Wheat = Color.decode("#F5DEB3"); /** - * The color NavajoWhite + * The color NavajoWhite *
 
* * @@ -423,7 +423,7 @@ public static class Browns **/ public static final Color NavajoWhite = Color.decode("#FFDEAD"); /** - * The color Bisque + * The color Bisque *
 
* * @@ -432,7 +432,7 @@ public static class Browns **/ public static final Color Bisque = Color.decode("#FFE4C4"); /** - * The color BlanchedAlmond + * The color BlanchedAlmond *
 
* * @@ -441,7 +441,7 @@ public static class Browns **/ public static final Color BlanchedAlmond = Color.decode("#FFEBCD"); /** - * The color Cornsilk + * The color Cornsilk *
 
* * @@ -453,7 +453,7 @@ public static class Browns public static class Grays { /** - * The color Black + * The color Black *
 
* * @@ -462,7 +462,7 @@ public static class Grays **/ public static final Color Black = Color.decode("#000000"); /** - * The color DarkSlateGray + * The color DarkSlateGray *
 
* * @@ -471,7 +471,7 @@ public static class Grays **/ public static final Color DarkSlateGray = Color.decode("#2F4F4F"); /** - * The color DimGray + * The color DimGray *
 
* * @@ -480,7 +480,7 @@ public static class Grays **/ public static final Color DimGray = Color.decode("#696969"); /** - * The color Gray + * The color Gray *
 
* * @@ -489,7 +489,7 @@ public static class Grays **/ public static final Color Gray = Color.decode("#808080"); /** - * The color SlateGray + * The color SlateGray *
 
* * @@ -498,7 +498,7 @@ public static class Grays **/ public static final Color SlateGray = Color.decode("#708090"); /** - * The color LightSlateGray + * The color LightSlateGray *
 
* * @@ -507,7 +507,7 @@ public static class Grays **/ public static final Color LightSlateGray = Color.decode("#778899"); /** - * The color DarkGray + * The color DarkGray *
 
* * @@ -516,7 +516,7 @@ public static class Grays **/ public static final Color DarkGray = Color.decode("#A9A9A9"); /** - * The color Silver + * The color Silver *
 
* * @@ -525,7 +525,7 @@ public static class Grays **/ public static final Color Silver = Color.decode("#C0C0C0"); /** - * The color LightGray + * The color LightGray *
 
* * @@ -534,7 +534,7 @@ public static class Grays **/ public static final Color LightGray = Color.decode("#D3D3D3"); /** - * The color Gainsboro + * The color Gainsboro *
 
* * @@ -546,7 +546,7 @@ public static class Grays public static class Greens { /** - * The color DarkGreen + * The color DarkGreen *
 
* * @@ -555,7 +555,7 @@ public static class Greens **/ public static final Color DarkGreen = Color.decode("#006400"); /** - * The color Green + * The color Green *
 
* * @@ -564,7 +564,7 @@ public static class Greens **/ public static final Color Green = Color.decode("#008000"); /** - * The color ForestGreen + * The color ForestGreen *
 
* * @@ -573,7 +573,7 @@ public static class Greens **/ public static final Color ForestGreen = Color.decode("#228B22"); /** - * The color DarkOliveGreen + * The color DarkOliveGreen *
 
* * @@ -582,7 +582,7 @@ public static class Greens **/ public static final Color DarkOliveGreen = Color.decode("#556B2F"); /** - * The color Lime + * The color Lime *
 
* * @@ -591,7 +591,7 @@ public static class Greens **/ public static final Color Lime = Color.decode("#00FF00"); /** - * The color Olive + * The color Olive *
 
* * @@ -600,7 +600,7 @@ public static class Greens **/ public static final Color Olive = Color.decode("#808000"); /** - * The color Teal + * The color Teal *
 
* * @@ -609,7 +609,7 @@ public static class Greens **/ public static final Color Teal = Color.decode("#008080"); /** - * The color SeaGreen + * The color SeaGreen *
 
* * @@ -618,7 +618,7 @@ public static class Greens **/ public static final Color SeaGreen = Color.decode("#2E8B57"); /** - * The color DarkCyan + * The color DarkCyan *
 
* * @@ -627,7 +627,7 @@ public static class Greens **/ public static final Color DarkCyan = Color.decode("#008B8B"); /** - * The color OliveDrab + * The color OliveDrab *
 
* * @@ -636,7 +636,7 @@ public static class Greens **/ public static final Color OliveDrab = Color.decode("#6B8E23"); /** - * The color LimeGreen + * The color LimeGreen *
 
* * @@ -645,7 +645,7 @@ public static class Greens **/ public static final Color LimeGreen = Color.decode("#32CD32"); /** - * The color MediumSeaGreen + * The color MediumSeaGreen *
 
* * @@ -654,7 +654,7 @@ public static class Greens **/ public static final Color MediumSeaGreen = Color.decode("#3CB371"); /** - * The color LawnGreen + * The color LawnGreen *
 
* * @@ -663,7 +663,7 @@ public static class Greens **/ public static final Color LawnGreen = Color.decode("#7CFC00"); /** - * The color LightSeaGreen + * The color LightSeaGreen *
 
* * @@ -672,7 +672,7 @@ public static class Greens **/ public static final Color LightSeaGreen = Color.decode("#20B2AA"); /** - * The color Chartreuse + * The color Chartreuse *
 
* * @@ -681,7 +681,7 @@ public static class Greens **/ public static final Color Chartreuse = Color.decode("#7FFF00"); /** - * The color SpringGreen + * The color SpringGreen *
 
* * @@ -690,7 +690,7 @@ public static class Greens **/ public static final Color SpringGreen = Color.decode("#00FF7F"); /** - * The color MediumSpringGreen + * The color MediumSpringGreen *
 
* * @@ -699,7 +699,7 @@ public static class Greens **/ public static final Color MediumSpringGreen = Color.decode("#00FA9A"); /** - * The color YellowGreen + * The color YellowGreen *
 
* * @@ -708,7 +708,7 @@ public static class Greens **/ public static final Color YellowGreen = Color.decode("#9ACD32"); /** - * The color DarkTurquoise + * The color DarkTurquoise *
 
* * @@ -717,7 +717,7 @@ public static class Greens **/ public static final Color DarkTurquoise = Color.decode("#00CED1"); /** - * The color DarkSeaGreen + * The color DarkSeaGreen *
 
* * @@ -726,7 +726,7 @@ public static class Greens **/ public static final Color DarkSeaGreen = Color.decode("#8FBC8F"); /** - * The color GreenYellow + * The color GreenYellow *
 
* * @@ -735,7 +735,7 @@ public static class Greens **/ public static final Color GreenYellow = Color.decode("#ADFF2F"); /** - * The color MediumAquamarine + * The color MediumAquamarine *
 
* * @@ -744,7 +744,7 @@ public static class Greens **/ public static final Color MediumAquamarine = Color.decode("#66CDAA"); /** - * The color MediumTurquoise + * The color MediumTurquoise *
 
* * @@ -753,7 +753,7 @@ public static class Greens **/ public static final Color MediumTurquoise = Color.decode("#48D1CC"); /** - * The color Turquoise + * The color Turquoise *
 
* * @@ -762,7 +762,7 @@ public static class Greens **/ public static final Color Turquoise = Color.decode("#40E0D0"); /** - * The color LightGreen + * The color LightGreen *
 
* * @@ -771,7 +771,7 @@ public static class Greens **/ public static final Color LightGreen = Color.decode("#90EE90"); /** - * The color PaleGreen + * The color PaleGreen *
 
* * @@ -780,7 +780,7 @@ public static class Greens **/ public static final Color PaleGreen = Color.decode("#98FB98"); /** - * The color Aquamarine + * The color Aquamarine *
 
* * @@ -789,7 +789,7 @@ public static class Greens **/ public static final Color Aquamarine = Color.decode("#7FFFD4"); /** - * The color PaleTurquoise + * The color PaleTurquoise *
 
* * @@ -801,7 +801,7 @@ public static class Greens public static class Oranges { /** - * The color OrangeRed + * The color OrangeRed *
 
* * @@ -810,7 +810,7 @@ public static class Oranges **/ public static final Color OrangeRed = Color.decode("#FF4500"); /** - * The color DarkOrange + * The color DarkOrange *
 
* * @@ -819,7 +819,7 @@ public static class Oranges **/ public static final Color DarkOrange = Color.decode("#FF8C00"); /** - * The color Orange + * The color Orange *
 
* * @@ -828,7 +828,7 @@ public static class Oranges **/ public static final Color Orange = Color.decode("#FFA500"); /** - * The color Tomato + * The color Tomato *
 
* * @@ -837,7 +837,7 @@ public static class Oranges **/ public static final Color Tomato = Color.decode("#FF6347"); /** - * The color Coral + * The color Coral *
 
* * @@ -846,7 +846,7 @@ public static class Oranges **/ public static final Color Coral = Color.decode("#FF7F50"); /** - * The color LightSalmon + * The color LightSalmon *
 
* * @@ -858,7 +858,7 @@ public static class Oranges public static class Pinks { /** - * The color MediumVioletRed + * The color MediumVioletRed *
 
* * @@ -867,7 +867,7 @@ public static class Pinks **/ public static final Color MediumVioletRed = Color.decode("#C71585"); /** - * The color DeepPink + * The color DeepPink *
 
* * @@ -876,7 +876,7 @@ public static class Pinks **/ public static final Color DeepPink = Color.decode("#FF1493"); /** - * The color PaleVioletRed + * The color PaleVioletRed *
 
* * @@ -885,7 +885,7 @@ public static class Pinks **/ public static final Color PaleVioletRed = Color.decode("#DB7093"); /** - * The color Fuchsia + * The color Fuchsia *
 
* * @@ -894,7 +894,7 @@ public static class Pinks **/ public static final Color Fuchsia = Color.decode("#FF00FF"); /** - * The color HotPink + * The color HotPink *
 
* * @@ -903,7 +903,7 @@ public static class Pinks **/ public static final Color HotPink = Color.decode("#FF69B4"); /** - * The color LightPink + * The color LightPink *
 
* * @@ -912,7 +912,7 @@ public static class Pinks **/ public static final Color LightPink = Color.decode("#FFB6C1"); /** - * The color Pink + * The color Pink *
 
* * @@ -924,7 +924,7 @@ public static class Pinks public static class Purples { /** - * The color Indigo + * The color Indigo *
 
* * @@ -933,7 +933,7 @@ public static class Purples **/ public static final Color Indigo = Color.decode("#4B0082"); /** - * The color Purple + * The color Purple *
 
* * @@ -942,7 +942,7 @@ public static class Purples **/ public static final Color Purple = Color.decode("#800080"); /** - * The color DarkSlateBlue + * The color DarkSlateBlue *
 
* * @@ -951,7 +951,7 @@ public static class Purples **/ public static final Color DarkSlateBlue = Color.decode("#483D8B"); /** - * The color DarkMagenta + * The color DarkMagenta *
 
* * @@ -960,7 +960,7 @@ public static class Purples **/ public static final Color DarkMagenta = Color.decode("#8B008B"); /** - * The color MediumVioletRed + * The color MediumVioletRed *
 
* * @@ -969,7 +969,7 @@ public static class Purples **/ public static final Color MediumVioletRed = Color.decode("#C71585"); /** - * The color DarkViolet + * The color DarkViolet *
 
* * @@ -978,7 +978,7 @@ public static class Purples **/ public static final Color DarkViolet = Color.decode("#9400D3"); /** - * The color SlateBlue + * The color SlateBlue *
 
* * @@ -987,7 +987,7 @@ public static class Purples **/ public static final Color SlateBlue = Color.decode("#6A5ACD"); /** - * The color BlueViolet + * The color BlueViolet *
 
* * @@ -996,7 +996,7 @@ public static class Purples **/ public static final Color BlueViolet = Color.decode("#8A2BE2"); /** - * The color DarkOrchid + * The color DarkOrchid *
 
* * @@ -1005,7 +1005,7 @@ public static class Purples **/ public static final Color DarkOrchid = Color.decode("#9932CC"); /** - * The color MediumSlateBlue + * The color MediumSlateBlue *
 
* * @@ -1014,7 +1014,7 @@ public static class Purples **/ public static final Color MediumSlateBlue = Color.decode("#7B68EE"); /** - * The color RosyBrown + * The color RosyBrown *
 
* * @@ -1023,7 +1023,7 @@ public static class Purples **/ public static final Color RosyBrown = Color.decode("#BC8F8F"); /** - * The color MediumPurple + * The color MediumPurple *
 
* * @@ -1032,7 +1032,7 @@ public static class Purples **/ public static final Color MediumPurple = Color.decode("#9370DB"); /** - * The color PaleVioletRed + * The color PaleVioletRed *
 
* * @@ -1041,7 +1041,7 @@ public static class Purples **/ public static final Color PaleVioletRed = Color.decode("#DB7093"); /** - * The color MediumOrchid + * The color MediumOrchid *
 
* * @@ -1050,7 +1050,7 @@ public static class Purples **/ public static final Color MediumOrchid = Color.decode("#BA55D3"); /** - * The color Fuchsia + * The color Fuchsia *
 
* * @@ -1059,7 +1059,7 @@ public static class Purples **/ public static final Color Fuchsia = Color.decode("#FF00FF"); /** - * The color Magenta + * The color Magenta *
 
* * @@ -1068,7 +1068,7 @@ public static class Purples **/ public static final Color Magenta = Color.decode("#FF00FF"); /** - * The color Orchid + * The color Orchid *
 
* * @@ -1077,7 +1077,7 @@ public static class Purples **/ public static final Color Orchid = Color.decode("#DA70D6"); /** - * The color Plum + * The color Plum *
 
* * @@ -1086,7 +1086,7 @@ public static class Purples **/ public static final Color Plum = Color.decode("#DDA0DD"); /** - * The color Violet + * The color Violet *
 
* * @@ -1095,7 +1095,7 @@ public static class Purples **/ public static final Color Violet = Color.decode("#EE82EE"); /** - * The color Thistle + * The color Thistle *
 
* * @@ -1104,7 +1104,7 @@ public static class Purples **/ public static final Color Thistle = Color.decode("#D8BFD8"); /** - * The color Lavender + * The color Lavender *
 
* * @@ -1116,7 +1116,7 @@ public static class Purples public static class Reds { /** - * The color DarkRed + * The color DarkRed *
 
* * @@ -1125,7 +1125,7 @@ public static class Reds **/ public static final Color DarkRed = Color.decode("#8B0000"); /** - * The color FireBrick + * The color FireBrick *
 
* * @@ -1134,7 +1134,7 @@ public static class Reds **/ public static final Color FireBrick = Color.decode("#B22222"); /** - * The color Red + * The color Red *
 
* * @@ -1143,7 +1143,7 @@ public static class Reds **/ public static final Color Red = Color.decode("#FF0000"); /** - * The color Crimson + * The color Crimson *
 
* * @@ -1152,7 +1152,7 @@ public static class Reds **/ public static final Color Crimson = Color.decode("#DC143C"); /** - * The color OrangeRed + * The color OrangeRed *
 
* * @@ -1161,7 +1161,7 @@ public static class Reds **/ public static final Color OrangeRed = Color.decode("#FF4500"); /** - * The color MediumVioletRed + * The color MediumVioletRed *
 
* * @@ -1170,7 +1170,7 @@ public static class Reds **/ public static final Color MediumVioletRed = Color.decode("#C71585"); /** - * The color IndianRed + * The color IndianRed *
 
* * @@ -1179,7 +1179,7 @@ public static class Reds **/ public static final Color IndianRed = Color.decode("#CD5C5C"); /** - * The color Tomato + * The color Tomato *
 
* * @@ -1188,7 +1188,7 @@ public static class Reds **/ public static final Color Tomato = Color.decode("#FF6347"); /** - * The color PaleVioletRed + * The color PaleVioletRed *
 
* * @@ -1197,7 +1197,7 @@ public static class Reds **/ public static final Color PaleVioletRed = Color.decode("#DB7093"); /** - * The color Salmon + * The color Salmon *
 
* * @@ -1206,7 +1206,7 @@ public static class Reds **/ public static final Color Salmon = Color.decode("#FA8072"); /** - * The color LightCoral + * The color LightCoral *
 
* * @@ -1215,7 +1215,7 @@ public static class Reds **/ public static final Color LightCoral = Color.decode("#F08080"); /** - * The color DarkSalmon + * The color DarkSalmon *
 
* * @@ -1224,7 +1224,7 @@ public static class Reds **/ public static final Color DarkSalmon = Color.decode("#E9967A"); /** - * The color LightSalmon + * The color LightSalmon *
 
* * @@ -1236,7 +1236,7 @@ public static class Reds public static class Whites { /** - * The color AntiqueWhite + * The color AntiqueWhite *
 
* * @@ -1245,7 +1245,7 @@ public static class Whites **/ public static final Color AntiqueWhite = Color.decode("#FAEBD7"); /** - * The color MistyRose + * The color MistyRose *
 
* * @@ -1254,7 +1254,7 @@ public static class Whites **/ public static final Color MistyRose = Color.decode("#FFE4E1"); /** - * The color Beige + * The color Beige *
 
* * @@ -1263,7 +1263,7 @@ public static class Whites **/ public static final Color Beige = Color.decode("#F5F5DC"); /** - * The color Linen + * The color Linen *
 
* * @@ -1272,7 +1272,7 @@ public static class Whites **/ public static final Color Linen = Color.decode("#FAF0E6"); /** - * The color OldLace + * The color OldLace *
 
* * @@ -1281,7 +1281,7 @@ public static class Whites **/ public static final Color OldLace = Color.decode("#FDF5E6"); /** - * The color Honeydew + * The color Honeydew *
 
* * @@ -1290,7 +1290,7 @@ public static class Whites **/ public static final Color Honeydew = Color.decode("#F0FFF0"); /** - * The color WhiteSmoke + * The color WhiteSmoke *
 
* * @@ -1299,7 +1299,7 @@ public static class Whites **/ public static final Color WhiteSmoke = Color.decode("#F5F5F5"); /** - * The color Seashell + * The color Seashell *
 
* * @@ -1308,7 +1308,7 @@ public static class Whites **/ public static final Color Seashell = Color.decode("#FFF5EE"); /** - * The color LavenderBlush + * The color LavenderBlush *
 
* * @@ -1317,7 +1317,7 @@ public static class Whites **/ public static final Color LavenderBlush = Color.decode("#FFF0F5"); /** - * The color AliceBlue + * The color AliceBlue *
 
* * @@ -1326,7 +1326,7 @@ public static class Whites **/ public static final Color AliceBlue = Color.decode("#F0F8FF"); /** - * The color FloralWhite + * The color FloralWhite *
 
* * @@ -1335,7 +1335,7 @@ public static class Whites **/ public static final Color FloralWhite = Color.decode("#FFFAF0"); /** - * The color MintCream + * The color MintCream *
 
* * @@ -1344,7 +1344,7 @@ public static class Whites **/ public static final Color MintCream = Color.decode("#F5FFFA"); /** - * The color Azure + * The color Azure *
 
* * @@ -1353,7 +1353,7 @@ public static class Whites **/ public static final Color Azure = Color.decode("#F0FFFF"); /** - * The color Ivory + * The color Ivory *
 
* * @@ -1362,7 +1362,7 @@ public static class Whites **/ public static final Color Ivory = Color.decode("#FFFFF0"); /** - * The color GhostWhite + * The color GhostWhite *
 
* * @@ -1371,7 +1371,7 @@ public static class Whites **/ public static final Color GhostWhite = Color.decode("#F8F8FF"); /** - * The color Snow + * The color Snow *
 
* * @@ -1380,7 +1380,7 @@ public static class Whites **/ public static final Color Snow = Color.decode("#FFFAFA"); /** - * The color White + * The color White *
 
* * @@ -1392,7 +1392,7 @@ public static class Whites public static class Yellows { /** - * The color DarkGoldenrod + * The color DarkGoldenrod *
 
* * @@ -1401,7 +1401,7 @@ public static class Yellows **/ public static final Color DarkGoldenrod = Color.decode("#B8860B"); /** - * The color Goldenrod + * The color Goldenrod *
 
* * @@ -1410,7 +1410,7 @@ public static class Yellows **/ public static final Color Goldenrod = Color.decode("#DAA520"); /** - * The color Gold + * The color Gold *
 
* * @@ -1419,7 +1419,7 @@ public static class Yellows **/ public static final Color Gold = Color.decode("#FFD700"); /** - * The color DarkKhaki + * The color DarkKhaki *
 
* * @@ -1428,7 +1428,7 @@ public static class Yellows **/ public static final Color DarkKhaki = Color.decode("#BDB76B"); /** - * The color Yellow + * The color Yellow *
 
* * @@ -1437,7 +1437,7 @@ public static class Yellows **/ public static final Color Yellow = Color.decode("#FFFF00"); /** - * The color Khaki + * The color Khaki *
 
* * @@ -1446,7 +1446,7 @@ public static class Yellows **/ public static final Color Khaki = Color.decode("#F0E68C"); /** - * The color PaleGoldenrod + * The color PaleGoldenrod *
 
* * @@ -1455,7 +1455,7 @@ public static class Yellows **/ public static final Color PaleGoldenrod = Color.decode("#EEE8AA"); /** - * The color PeachPuff + * The color PeachPuff *
 
* * @@ -1464,7 +1464,7 @@ public static class Yellows **/ public static final Color PeachPuff = Color.decode("#FFDAB9"); /** - * The color Moccasin + * The color Moccasin *
 
* * @@ -1473,7 +1473,7 @@ public static class Yellows **/ public static final Color Moccasin = Color.decode("#FFE4B5"); /** - * The color PapayaWhip + * The color PapayaWhip *
 
* * @@ -1482,7 +1482,7 @@ public static class Yellows **/ public static final Color PapayaWhip = Color.decode("#FFEFD5"); /** - * The color LemonChiffon + * The color LemonChiffon *
 
* * @@ -1491,7 +1491,7 @@ public static class Yellows **/ public static final Color LemonChiffon = Color.decode("#FFFACD"); /** - * The color LightGoldenrodYellow + * The color LightGoldenrodYellow *
 
* * @@ -1500,7 +1500,7 @@ public static class Yellows **/ public static final Color LightGoldenrodYellow = Color.decode("#FAFAD2"); /** - * The color LightYellow + * The color LightYellow *
 
* * diff --git a/src/main/java/org/teachingextensions/logo/Pizza.java b/src/main/java/org/teachingextensions/logo/Pizza.java index 080c24e..b7b6822 100644 --- a/src/main/java/org/teachingextensions/logo/Pizza.java +++ b/src/main/java/org/teachingextensions/logo/Pizza.java @@ -6,80 +6,78 @@ * A slice of pizza * The Pizza allows you to make different sizes and kinds of pizza! */ -public class Pizza -{ - private ArrayList toppings = new ArrayList(); - private boolean cooked; - private int slices = 2; - /** - * Adds a topping to a pizza - *
Example: {@code pizza.addTopping(Topping.Spam)}
- * - * @param topping - * A topping from the list - */ - public void addTopping(Topping topping) - { - this.toppings.add(topping); - } - /** - * Checks to see if a pizza has a particular kind of topping - *
Example: {@code pizza.hasTopping(topping)}
- * - */ - public boolean hasTopping(Topping topping) - { - for (Topping toppingToday : toppings) - { - if (toppingToday == topping) { return true; } +public class Pizza { + private ArrayList toppings = new ArrayList(); + private boolean cooked; + private int slices = 2; + + /** + * Adds a topping to a pizza + *
Example: {@code pizza.addTopping(Topping.Spam)}
+ * + * @param topping A topping from the list + */ + public void addTopping(Topping topping) { + this.toppings.add(topping); + } + + /** + * Checks to see if a pizza has a particular kind of topping + *
Example: {@code pizza.hasTopping(topping)}
+ * + * @param topping A topping from the list to check for + * @return true when the pizza has the topping on it + */ + public boolean hasTopping(Topping topping) { + for (Topping toppingToday : toppings) { + if (toppingToday == topping) { + return true; + } + } + return false; + } + + /** + * Cooks a pizza + *
Example: {@code pizza.cook()}
+ */ + public void cook() { + this.cooked = true; + } + + /** + * Checks whether a pizza was cooked + *
Example: {@code pizza.wasCooked()}
+ * + * @return whether or not the pizza has been cooked already + */ + public boolean wasCooked() { + return this.cooked; + } + + public void ____() { } - return false; - } - /** - * Cooks a pizza - *
Example: {@code pizza.cook()}
- * - */ - public void cook() - { - this.cooked = true; - } - /** - * Checks whether a pizza was cooked - *
Example: {@code pizza.wasCooked()}
- * - * @return whether or not the pizza has been cooked already - */ - public boolean wasCooked() - { - return this.cooked; - } - public void ____() - { - } - /** - * Checks whether you can take a slice of pizza or not - *
Example: {@code pizza.takeSlice()}
- * - * @return whether or not the pizza has any more slices to take - * If there are still slices, takes one slice - */ - public boolean takeSlice() - { - if (0 < this.slices) - { - this.slices--; - return true; + + /** + * Checks whether you can take a slice of pizza or not + *
Example: {@code pizza.takeSlice()}
+ * + * @return whether or not the pizza has any more slices to take + * If there are still slices, takes one slice + */ + public boolean takeSlice() { + if (0 < this.slices) { + this.slices--; + return true; + } + return false; + } + + /** + * Adds more slices to a pizza + *
Example: {@code pizza.superSizeIt()}
+ */ + public void superSizeIt() { + this.slices = 8; } - return false; - } - /** - * Adds more slices to a pizza - *
Example: {@code pizza.superSizeIt()}
- * - */ - public void superSizeIt() - { - this.slices = 8; - } } From 9d3f15d56c8741215d3980c69d4a8a075bca9ad7 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Wed, 18 Mar 2015 14:09:48 -0700 Subject: [PATCH 081/111] cleanup javadoc --- .../approvals/lite/util/NumberUtils.java | 5 +++ .../approvals/lite/util/ObjectUtils.java | 30 +++---------- .../approvals/lite/util/StringUtils.java | 43 ++----------------- .../approvals/lite/util/ThreadLauncher.java | 19 +------- .../lite/util/servlets/InvokerServlet.java | 7 --- .../org/teachingextensions/logo/Pizza.java | 2 +- .../org/teachingextensions/logo/Tortoise.java | 6 ++- .../logo/shapes/Circle.java | 2 +- .../teachingextensions/logo/shapes/Text.java | 3 +- .../teachingextensions/logo/utils/Sounds.java | 2 +- .../simpleparser/Parser.java | 1 + .../utils/VirtualProctor.java | 2 +- 12 files changed, 26 insertions(+), 96 deletions(-) diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/NumberUtils.java b/src/main/java/org/teachingextensions/approvals/lite/util/NumberUtils.java index 65e73b2..40b7f4e 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/NumberUtils.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/NumberUtils.java @@ -21,6 +21,11 @@ public static int load(String i, int defaultValue) { /** * Loads an int from a String. + * + * @param i a string with an integer in it + * @param defaultValue value to use when no integer can be found in the string + * @param stripNonNumeric true if non-numeric characters should be removed from the string + * @return the integer found in the string */ public static int load(String i, int defaultValue, boolean stripNonNumeric) { try { diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/ObjectUtils.java b/src/main/java/org/teachingextensions/approvals/lite/util/ObjectUtils.java index 22df2a8..58b08fd 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/ObjectUtils.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/ObjectUtils.java @@ -10,15 +10,6 @@ * A static class of convenience functions for Manipulating objects */ public class ObjectUtils { - public static Method[] getMethodsForObject(Object o2, String[] passedMethods) - throws SecurityException, NoSuchMethodException { - Method methods[] = new Method[passedMethods.length]; - Class clazz = o2.getClass(); - for (int i = 0; i < passedMethods.length; i++) { - methods[i] = clazz.getMethod(passedMethods[i], (Class[]) null); - } - return methods; - } /** * A convenience function to check if two objects are equal. @@ -28,18 +19,7 @@ public static Method[] getMethodsForObject(Object o2, String[] passedMethods) * @return true if Equal. */ public static boolean isEqual(Object s1, Object s2) { - if (s1 == s2) { - return true; - } else return (s1 != null) && s1.equals(s2); - } - - public static boolean isIn(Object target, Object[] objects) { - for (Object object : objects) { - if (ObjectUtils.isEqual(object, target)) { - return true; - } - } - return false; + return s1 == s2 || (s1 != null) && s1.equals(s2); } public static boolean isThisInstanceOfThat(Class thiz, Class that) { @@ -57,7 +37,9 @@ public static Error throwAsError(Throwable t) throws Error { } /** - * @deprecated use Query.select() + * @param from the source array + * @param methodName the filter method + * @return a filtered array */ public static Object[] extractArray(Object[] from, String methodName) { try { @@ -124,8 +106,8 @@ public static void assertInstance(Class classes[], Object object) { + Arrays.asList(extractArray(classes, "getName")) + " but was null"); } - for (int i = 0; i < classes.length; i++) { - if (ClassUtils.getWrapperClass(classes[i]).isInstance(object)) { + for (Class aClass : classes) { + if (ClassUtils.getWrapperClass(aClass).isInstance(object)) { return; } } diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/StringUtils.java b/src/main/java/org/teachingextensions/approvals/lite/util/StringUtils.java index 276ea88..1bc729d 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/StringUtils.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/StringUtils.java @@ -11,24 +11,10 @@ public class StringUtils { public static final String NEW_LINE = System.getProperty("line.separator"); - /** - * ******************************************************************* - */ - public static String loadNullableString(String i) { - return StringUtils.isNonZero(i) ? i.trim() : null; - } - /***********************************************************************/ - - /** - * ******************************************************************* - */ public static String stripWhiteSpace(String text) { return stripWhiteSpace(text, false); } - /** - * ******************************************************************* - */ public static String padNumber(long number, int digits) { String text = "" + number; while (text.length() < digits) { @@ -37,16 +23,10 @@ public static String padNumber(long number, int digits) { return text; } - /** - * ******************************************************************* - */ public static String padNumber(int number, int digits) { return padNumber((long) number, digits); } - /** - * ******************************************************************* - */ public static String stripWhiteSpace(String text, boolean all) { StringBuilder newText = new StringBuilder(); boolean whitespace = false; @@ -81,11 +61,7 @@ public static String stripWhiteSpace(String text, boolean all) { } return newText.toString(); } - /************************************************************************/ - /************************************************************************/ - /** - * ******************************************************************** - */ + public static String stripNonNumeric(String number, boolean allowDecimal, boolean allowNegative) { boolean allowExponential = allowDecimal; boolean afterE = false; @@ -136,7 +112,7 @@ public static String stripNonNumeric(String number, boolean allowDecimal, boolea } return result.toString(); } - /***********************************************************************/ + /** * A convenience function to check that a String has at least 1 character. * @@ -147,13 +123,10 @@ public static boolean isNonZero(String string) { return ((string != null) && string.trim().length() > 0); } - /** - * ******************************************************************* - */ public static boolean isEmpty(String string) { return !isNonZero(string); } - /************************************************************************/ + /** * A convenience function to turn a vector of String objects into an Array * of the String objects. @@ -181,9 +154,6 @@ public static String[] toArray(java.util.Collection vectorOf) { return array; } - /** - * ******************************************************************* - */ public static String toString(String name, T[] array) { StringBuilder buffer = new StringBuilder(); name = (name == null ? "array" : name); @@ -198,9 +168,6 @@ public static String toString(String name, T[] array) { return buffer.toString(); } - /** - * ******************************************************************* - */ public static String toString(String name, Iterable array) { StringBuilder buffer = new StringBuilder(); name = (name == null ? "array" : name); @@ -224,10 +191,6 @@ public static String arrayStringHelper(Object o) { return o.getClass().isArray() ? Arrays.toString((Object[]) o) : o.toString(); } - /***********************************************************************/ - /** - * ******************************************************************* - */ public static InputStream convertToInputStream(String string) { return new ByteArrayInputStream(string.getBytes()); } diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/ThreadLauncher.java b/src/main/java/org/teachingextensions/approvals/lite/util/ThreadLauncher.java index c47d6b5..6b224b4 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/ThreadLauncher.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/ThreadLauncher.java @@ -10,9 +10,6 @@ public class ThreadLauncher implements Runnable { private Method method = null; private long delay; - /** - * ******************************************************************* - */ public ThreadLauncher(Object object, Method method, Object[] objectParams, long delay) { this.delay = delay; this.object = object; @@ -21,29 +18,15 @@ public ThreadLauncher(Object object, Method method, Object[] objectParams, long new Thread(this).start(); } - /** - * ******************************************************************* - */ - public ThreadLauncher(Object object, String methodName) throws SecurityException, NoSuchMethodException { - this(object, object.getClass().getMethod(methodName, (Class[]) null), null, 0); - } - - /** - * ******************************************************************* - */ public void run() { try { Thread.sleep(delay); - //My_System.event("Running " + method.getName()); method.invoke(object, objectParams); } catch (Throwable t) { MySystem.warning("Caught throwable exception ", t); } } - /***********************************************************************/ - /** - * ******************************************************************* - */ + public static void launch(Action0 action) { new LambdaThreadLauncher(action); } diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/servlets/InvokerServlet.java b/src/main/java/org/teachingextensions/approvals/lite/util/servlets/InvokerServlet.java index e8e7386..aaf3ed6 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/servlets/InvokerServlet.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/servlets/InvokerServlet.java @@ -61,9 +61,6 @@ public void init() throws ServletException { MySystem.variable("Mask", mask); } - /** - * ******************************************************************* - */ public void destroy() { for (HttpServlet servlet : servlets.values()) { servlet.destroy(); @@ -71,16 +68,12 @@ public void destroy() { super.destroy(); } - /** - * ******************************************************************* - */ public void serveRequest(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { String pathInfo = request.getPathInfo(); String servletClass = pathInfo.substring(1); int slash = servletClass.indexOf('/'); if (slash >= 0) { - // pathInfo = servletClass.substring(slash); servletClass = servletClass.substring(0, slash); } diff --git a/src/main/java/org/teachingextensions/logo/Pizza.java b/src/main/java/org/teachingextensions/logo/Pizza.java index b7b6822..d414bf0 100644 --- a/src/main/java/org/teachingextensions/logo/Pizza.java +++ b/src/main/java/org/teachingextensions/logo/Pizza.java @@ -3,7 +3,7 @@ import java.util.ArrayList; /** - * A slice of pizza + * A slice of pizza * The Pizza allows you to make different sizes and kinds of pizza! */ public class Pizza { diff --git a/src/main/java/org/teachingextensions/logo/Tortoise.java b/src/main/java/org/teachingextensions/logo/Tortoise.java index f23c2c0..315078d 100644 --- a/src/main/java/org/teachingextensions/logo/Tortoise.java +++ b/src/main/java/org/teachingextensions/logo/Tortoise.java @@ -6,7 +6,7 @@ import org.teachingextensions.logo.utils.TortoiseUtils; /** - * A tortoise drawing a line + * A tortoise drawing a line * The Tortoise allows you to draw lines and shapes by moving it around on the window */ public class Tortoise @@ -91,6 +91,7 @@ public static void setPenWidth(Number width) * Gives you access to the window the * Tortoise is moving on so you can do things like change it's color.
* Example: {@code TurtlePanel panel = Tortoise.getBackgroundWindow()} + * @return the window that the Tortoise is moving on */ public static TurtlePanel getBackgroundWindow() { @@ -177,7 +178,8 @@ public static double getAngle() /** * Changes the type of animal you are using.
*
Example: {@code Tortoise.setAnimal(Animals.Spider);}
- * + * + * @param animal the animal you want to use * @see Animals */ public static void setAnimal(Animals animal) diff --git a/src/main/java/org/teachingextensions/logo/shapes/Circle.java b/src/main/java/org/teachingextensions/logo/shapes/Circle.java index b9e83f5..2c095b7 100644 --- a/src/main/java/org/teachingextensions/logo/shapes/Circle.java +++ b/src/main/java/org/teachingextensions/logo/shapes/Circle.java @@ -10,7 +10,7 @@ import org.teachingextensions.windows.ProgramWindow; /** - * A blue circle + * A blue circle * The Circle allows you to draw circles on the window */ public class Circle implements Paintable diff --git a/src/main/java/org/teachingextensions/logo/shapes/Text.java b/src/main/java/org/teachingextensions/logo/shapes/Text.java index 7b53039..9e0cc0c 100644 --- a/src/main/java/org/teachingextensions/logo/shapes/Text.java +++ b/src/main/java/org/teachingextensions/logo/shapes/Text.java @@ -10,7 +10,7 @@ import org.teachingextensions.logo.TurtlePanel; /** - * A sheet of paper with text on it + * A sheet of paper with text on it * Text allows you to write text on the window */ public class Text implements Paintable @@ -31,6 +31,7 @@ public Text(String string) * the X position * @param y * the Y position + * @return the same Text that you are working with */ public Text setTopLeft(int x, int y) { diff --git a/src/main/java/org/teachingextensions/logo/utils/Sounds.java b/src/main/java/org/teachingextensions/logo/utils/Sounds.java index b2b887a..9196e92 100644 --- a/src/main/java/org/teachingextensions/logo/utils/Sounds.java +++ b/src/main/java/org/teachingextensions/logo/utils/Sounds.java @@ -3,7 +3,7 @@ import java.awt.Toolkit; /** - * A speaker with sound waves + * A speaker with sound waves * Sounds allows you to play sounds, like a 'beep' */ public class Sounds diff --git a/src/main/java/org/teachingextensions/simpleparser/Parser.java b/src/main/java/org/teachingextensions/simpleparser/Parser.java index 1e4f1aa..cf2bcc0 100644 --- a/src/main/java/org/teachingextensions/simpleparser/Parser.java +++ b/src/main/java/org/teachingextensions/simpleparser/Parser.java @@ -25,6 +25,7 @@ public class Parser * The template with the fields from the data object surrounded in {curlyBraces} * @param data * an object whose fields will be merged with the template during parsing + * @return the completed string */ public static String parse(String text, Object data) { diff --git a/src/main/java/org/teachingextensions/utils/VirtualProctor.java b/src/main/java/org/teachingextensions/utils/VirtualProctor.java index fb660a4..d6bf083 100644 --- a/src/main/java/org/teachingextensions/utils/VirtualProctor.java +++ b/src/main/java/org/teachingextensions/utils/VirtualProctor.java @@ -7,7 +7,7 @@ /** * A teacher at a blackboard Virtual + * style="text-align: left" alt="A teacher at a blackboard" height="50" width="50"> Virtual * Proctor allows you to see what all the TKPJava coders are making */ public class VirtualProctor { From 24bcdee068060a5bf07642198ba21d3b14a0456b Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Wed, 18 Mar 2015 14:43:03 -0700 Subject: [PATCH 082/111] cleanup --- pom.xml | 2 +- .../approvals/lite/util/ObjectUtils.java | 2 +- .../teachingextensions/simpleparser/Parser.java | 14 ++++++++------ .../org/teachingextensions/windows/MessageBox.java | 2 +- .../teachingextensions/windows/ProgramWindow.java | 2 +- 5 files changed, 12 insertions(+), 10 deletions(-) diff --git a/pom.xml b/pom.xml index 486a469..c648ed1 100644 --- a/pom.xml +++ b/pom.xml @@ -105,7 +105,7 @@ 1.7 1.7 - ISO-8859-1 + ISO-8859-1-Xlint:unchecked diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/ObjectUtils.java b/src/main/java/org/teachingextensions/approvals/lite/util/ObjectUtils.java index 58b08fd..c3a1d22 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/ObjectUtils.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/ObjectUtils.java @@ -68,7 +68,7 @@ public static Object[] extractArray(Object[] from, String methodName) { public static Method getGreatestCommonDenominator(Object[] from, String methodName) throws SecurityException, NoSuchMethodException { - List classes = new ArrayList<>(); + List> classes = new ArrayList<>(); ArrayUtils.addArray(classes, getAllCastableClasses(from[0])); for (Object o : from) { for (int i = classes.size() - 1; i >= 0; i--) { diff --git a/src/main/java/org/teachingextensions/simpleparser/Parser.java b/src/main/java/org/teachingextensions/simpleparser/Parser.java index cf2bcc0..1259fa0 100644 --- a/src/main/java/org/teachingextensions/simpleparser/Parser.java +++ b/src/main/java/org/teachingextensions/simpleparser/Parser.java @@ -14,11 +14,13 @@ public class Parser /** * Parses a template with a data object to create a string * - *
Example: Words data = new Words ();
- * data.action = "Shake";
- * data.weapon = "spear";
- * String greeting = Parser.parse("Captain {action}{weapon}!!!",data)
- * + *
Example:
{@code
+   * Words data = new Words();
+   * data.action = "Shake";
+   * data.weapon = "spear";
+   * String greeting = Parser.parse("Captain {action}{weapon}!!!", data);
+   * }
+ * * Captain Shakespear!!! * * @param text @@ -33,7 +35,7 @@ public static String parse(String text, Object data) } public static String parse(String text, String startCharacter, String endCharacter, Object data) { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); String temp = text; int start = temp.indexOf(startCharacter); while (start > 0) diff --git a/src/main/java/org/teachingextensions/windows/MessageBox.java b/src/main/java/org/teachingextensions/windows/MessageBox.java index 18fe2ff..22f18d7 100644 --- a/src/main/java/org/teachingextensions/windows/MessageBox.java +++ b/src/main/java/org/teachingextensions/windows/MessageBox.java @@ -7,7 +7,7 @@ /** * A message box
+ * style="text-align: left" alt="A message box" height="60" width="145">
*
*
*
diff --git a/src/main/java/org/teachingextensions/windows/ProgramWindow.java b/src/main/java/org/teachingextensions/windows/ProgramWindow.java index 25e1a19..dff657e 100644 --- a/src/main/java/org/teachingextensions/windows/ProgramWindow.java +++ b/src/main/java/org/teachingextensions/windows/ProgramWindow.java @@ -18,7 +18,7 @@ import org.teachingextensions.approvals.lite.util.WindowUtils; /** - * A window image Program Window + * A window image Program Window * allows you to change the color of the background and more... */ @SuppressWarnings({ "serial" }) From 7bbfa7644857b3f28863949f30301d572819f109 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Wed, 18 Mar 2015 14:58:06 -0700 Subject: [PATCH 083/111] Cleanup --- .../reporters/windows/WinMergeReporter.java | 1 - .../approvals/lite/util/ArrayUtils.java | 22 ------- .../approvals/lite/util/Country.java | 39 ----------- .../approvals/lite/util/Filter.java | 11 ---- .../approvals/lite/util/FilterUtils.java | 38 ----------- .../lite/util/LambdaThreadLauncher.java | 2 +- .../lite/util/MethodExecutionPath.java | 64 ------------------- .../approvals/lite/util/ObjectUtils.java | 4 -- .../approvals/lite/util/StringUtils.java | 2 +- .../approvals/lite/util/lambda/Action1.java | 5 -- .../approvals/lite/util/lambda/Query.java | 16 +---- .../lite/util/servlets/ValidationError.java | 2 +- .../windows/MessageBox.java | 2 +- .../approvals/lite/util/FilterTest.java | 22 ------- 14 files changed, 6 insertions(+), 224 deletions(-) delete mode 100644 src/main/java/org/teachingextensions/approvals/lite/util/Country.java delete mode 100644 src/main/java/org/teachingextensions/approvals/lite/util/Filter.java delete mode 100644 src/main/java/org/teachingextensions/approvals/lite/util/FilterUtils.java delete mode 100644 src/main/java/org/teachingextensions/approvals/lite/util/MethodExecutionPath.java delete mode 100644 src/main/java/org/teachingextensions/approvals/lite/util/lambda/Action1.java delete mode 100644 src/test/java/org/teachingextensions/approvals/lite/util/FilterTest.java diff --git a/src/main/java/org/teachingextensions/approvals/lite/reporters/windows/WinMergeReporter.java b/src/main/java/org/teachingextensions/approvals/lite/reporters/windows/WinMergeReporter.java index f6f3a96..2182b2c 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/reporters/windows/WinMergeReporter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/reporters/windows/WinMergeReporter.java @@ -6,7 +6,6 @@ public class WinMergeReporter extends GenericDiffReporter { public static final WinMergeReporter INSTANCE = new WinMergeReporter(); - ; static final String DIFF_PROGRAM = "C:\\Program Files\\WinMerge\\WinMergeU.exe"; static final String MESSAGE = MessageFormat.format("Unable to find WinMerge at {0}" + "\nYou can install it at http://winmerge.org/", diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/ArrayUtils.java b/src/main/java/org/teachingextensions/approvals/lite/util/ArrayUtils.java index dcadfbc..7f34890 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/ArrayUtils.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/ArrayUtils.java @@ -43,10 +43,6 @@ public static boolean isEmpty(Object[] array) { return ((array == null) || (array.length == 0)); } - public static boolean isEmpty(Collection collection) { - return ((collection == null) || (collection.size() == 0)); - } - public static T getFirst(T[] array, Comparator comparator) { return get(array, comparator, true); } @@ -65,24 +61,6 @@ private static T get(T[] array, Comparator sorter, boolean w return last; } - public static boolean contains(T[] values, T value) { - for (T value1 : values) { - if (value.equals(value1)) { - return true; - } - } - return false; - } - - public static boolean contains(int[] values, int value) { - for (int value1 : values) { - if (value == value1) { - return true; - } - } - return false; - } - public static T getLast(List list) { return list.get(list.size() - 1); } diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/Country.java b/src/main/java/org/teachingextensions/approvals/lite/util/Country.java deleted file mode 100644 index 97e5b95..0000000 --- a/src/main/java/org/teachingextensions/approvals/lite/util/Country.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.teachingextensions.approvals.lite.util; - - -public enum Country { - Albania, Algeria, AmericanSamoa("American Samoa"), Andorra, Angola, Anguilla, AntiguaAndBarbuda("Antigua & Barbuda"), Argentina, Armenia, Aruba, Australia, Austria, Azerbaijan, Azores, Bahamas, Bahrain, Bangladesh, Barbados, Belarus, Belgium, Belize, Benin, Bermuda, Bolivia, Bonaire, Bosnia, Botswana, Brazil, BritishVirginIsles( - "British Virgin Isles"), Brunei, Bulgaria, BurkinaFaso("Burkina Faso"), Burundi, Cambodia, Cameroon, Canada, CanaryIslands("Canary Islands"), CapeVerde( - "Cape Verde"), CaymanIslands("Cayman Islands"), CentralAfricanRepublic("Central African Republic"), Chad, ChannelIslands("Channel Islands"), Chile, Colombia, CookIslands( - "Cook Islands"), CostaRica("Costa Rica"), CotedIvoire("Cote d' Ivoire"), Croatia, Cuba, Curacao, Cyprus, CzechRepublic("Czech Republic"), DemRepublicofCongo( - "Dem. Republic of Congo"), Denmark, Djibouti, Dominica, DominicanRepublic("Dominican Republic"), Ecuador, Egypt, ElSalvador("El Salvador"), England, EquatorialGuinea( - "Equatorial Guinea"), Eritrea, Estonia, Ethiopia, FaeroeIslands("Faeroe Islands"), Fiji, Finland, France, FrenchGuiana("French Guiana"), FrenchPolynesia( - "French Polynesia"), Gabon, Gambia, Georgia, Germany, Ghana, Gibraltar, Greece, Greenland, Grenada, Guadeloupe, Guam, Guatemala, Guinea, GuineaBissau( - "Guinea-Bissau"), Guyana, Haiti, Holland, Honduras, HongKong("Hong Kong"), Hungary, Iceland, India, Indonesia, Iran, Iraq, Israel, Italy, Jamaica, Japan, Jordan, Kazakhstan, Kenya, Kiribati, Kosrae, Kuwait, Kyrgyzstan, Laos, Latvia, Lebanon, Lesotho, Liberia, Libya, Liechtenstein, Lithuania, Luxembourg, Macau, Macedonia, Madagascar, Madeira, Malawi, Malaysia, Maldives, Mali, Malta, MarshallIslands( - "Marshall Islands"), Martinique, Mauritania, Mauritius, Mexico, Micronesia, Moldova, Monaco, Mongolia, Montserrat, Morocco, Mozambique, Myanmar, NMarianaIslands( - "N. Mariana Islands"), Namibia, Nepal, Netherlands, NetherlandsAntilles("Netherlands Antilles"), NewCaledonia("New Caledonia"), NewZealand( - "New Zealand"), Nicaragua, Niger, Nigeria, NorfolkIsland("Norfolk Island"), NorthKorea("North Korea"), NorthernIreland("Northern Ireland"), Norway, Oman, Pakistan, Palau, Panama, PapuaNewGuinea( - "Papua New Guinea"), Paraguay, PeoplesRepublicofChina("Peoples Republic of China"), Peru, Philippines, Poland, Ponape, Portugal, PuertoRico( - "Puerto Rico"), Qatar, RepublicofCongo("Republic of Congo"), RepublicofIreland("Republic of Ireland"), RepublicofYemen("Republic of Yemen"), Reunion, Romania, Rota, Russia, Rwanda, Saba, Saipan, SanMarino( - "San Marino"), SaudiArabia("Saudi Arabia"), Scotland, Senegal, Seychelles, SierraLeone("Sierra Leone"), Singapore, Slovakia, Slovenia, SolomonIslands( - "Solomon Islands"), SouthAfrica("South Africa"), SouthKorea("South Korea"), Spain, SriLanka("Sri Lanka"), StVincentGrenadine( - "St Vincent/Grenadine"), StBarthelemy("St. Barthelemy"), StChristopher("St. Christopher"), StCroix("St. Croix"), StEustatius("St. Eustatius"), StJohn( - "St. John"), StKittsAndNevis("St. Kitts & Nevis"), StLucia("St. Lucia"), StMaarten("St. Maarten"), StMartin("St. Martin"), StThomas( - "St. Thomas"), Sudan, Suriname, Swaziland, Sweden, Switzerland, Syria, Tahiti, Taiwan, Tajikistan, Tanzania, Thailand, Tinian, Togo, Tonga, Tortola, TrinidadAndTobago( - "Trinidad & Tobago"), Truk, Tunisia, Turkey, Turkmenistan, TurksAndCaicosIsles("Turks & Caicos Isles"), Tuvalu, Uganda, Ukraine, UnionIsland( - "Union Island"), UnitedArabEmirates("United Arab Emirates"), UnitedKingdom("United Kingdom"), UnitedStates("United States"), Uruguay, USVirginIslands( - "US Virgin Islands"), Uzbekistan, Vanuatu, VaticanCityState("Vatican City State"), Venezuela, Vietnam, VirginGorda("Virgin Gorda"), WakeIsland( - "Wake Island"), Wales, WallisAndFutunaIsle("Wallis & Futuna Isle"), WesternSamoa("Western Samoa"), Yap, Yugoslavia, Zambia, Zimbabwe; - String altText = null; - - private Country() { - } - - private Country(String altText) { - this.altText = altText; - } - - public String toString() { - return altText == null ? super.toString() : altText; - } -} \ No newline at end of file diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/Filter.java b/src/main/java/org/teachingextensions/approvals/lite/util/Filter.java deleted file mode 100644 index f417498..0000000 --- a/src/main/java/org/teachingextensions/approvals/lite/util/Filter.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.teachingextensions.approvals.lite.util; - -public interface Filter { - /** - * @param object the item to check - * @return true if the object would be extracted by the filter - * @throws IllegalArgumentException if the object is not supported by the filter - */ - public boolean isExtracted(T object) - throws IllegalArgumentException; -} \ No newline at end of file diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/FilterUtils.java b/src/main/java/org/teachingextensions/approvals/lite/util/FilterUtils.java deleted file mode 100644 index bbcdd4b..0000000 --- a/src/main/java/org/teachingextensions/approvals/lite/util/FilterUtils.java +++ /dev/null @@ -1,38 +0,0 @@ -package org.teachingextensions.approvals.lite.util; - -import java.util.ArrayList; -import java.util.Arrays; - -/** - * Listens to the state of a EnabledConditions object - */ -public class FilterUtils { - /** - * @param fromObjects a collection of objects to filter - * @param filter an optional parameter which indicates whether the item is extracted - * @return a new List containing all elements of the list for which isExtracted() would return true - * @param the kind of items to filter - */ - public static ArrayList retainExtracted(T fromObjects[], Filter filter) throws IllegalArgumentException { - return fromObjects == null ? new ArrayList() : filter(Arrays.asList(fromObjects), filter, true); - } - - /** - * @param collection the collection to filter - * @param filter an optional parameter which indicates whether the item is extracted - * @param retainExtracted true if the filter should retained the extracted items - * @return a new List containing all elements of the list for which isExtracted() would return true - */ - private static ArrayList filter(Iterable collection, Filter filter, boolean retainExtracted) throws IllegalArgumentException { - ArrayList extracted = new ArrayList<>(); - if (collection != null) { - for (T t : collection) { - boolean ex = (filter == null || filter.isExtracted(t)); - if (ex == retainExtracted) { - extracted.add(t); - } - } - } - return extracted; - } -} \ No newline at end of file diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/LambdaThreadLauncher.java b/src/main/java/org/teachingextensions/approvals/lite/util/LambdaThreadLauncher.java index b74539c..719de22 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/LambdaThreadLauncher.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/LambdaThreadLauncher.java @@ -4,7 +4,6 @@ public class LambdaThreadLauncher implements Runnable { private final Action0 function; - private long delay = 0; public LambdaThreadLauncher(Action0 function) { this.function = function; @@ -14,6 +13,7 @@ public LambdaThreadLauncher(Action0 function) { @Override public void run() { try { + long delay = 0; Thread.sleep(delay); function.call(); } catch (Throwable t) { diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/MethodExecutionPath.java b/src/main/java/org/teachingextensions/approvals/lite/util/MethodExecutionPath.java deleted file mode 100644 index 9f808bb..0000000 --- a/src/main/java/org/teachingextensions/approvals/lite/util/MethodExecutionPath.java +++ /dev/null @@ -1,64 +0,0 @@ -package org.teachingextensions.approvals.lite.util; - -import java.io.Serializable; -import java.lang.reflect.Method; - -public class MethodExecutionPath implements Serializable { - private static final long serialVersionUID = 880073980003375984L; - - public static class Parameters { - public static Method getBestFitMethod(Class clazz, - String currentMethodName, Class[] definitions) - throws NoSuchMethodException { - try { - return clazz.getMethod(currentMethodName, definitions); - } catch (NoSuchMethodException e) { - Method[] methods = FilterUtils.retainExtracted( - clazz.getMethods(), - new MethodParameterFilter(currentMethodName, - definitions)).toArray(new Method[0]); - if (methods.length == 0) { - throw e; - } - if (methods.length == 1) { - return methods[0]; - } else { - throw new Error( - "Don't know how to handle multiple available methods yet."); - } - } - } - } - - public static class MethodParameterFilter implements Filter { - - private String methodName; - private Class[] classParameters; - - public MethodParameterFilter(String methodName, Class[] classParameters) { - super(); - this.methodName = methodName; - this.classParameters = classParameters; - } - - @Override - public boolean isExtracted(Object object) - throws IllegalArgumentException { - ObjectUtils.assertInstance(Method.class, object); - Method m = (Method) object; - if (m.getName().equals(methodName) - && m.getParameterTypes().length == classParameters.length) { - Class[] params = m.getParameterTypes(); - for (int i = 0; i < params.length; i++) { - if (!ObjectUtils.isThisInstanceOfThat(classParameters[i], - params[i])) { - return false; - } - } - return true; - } else { - return false; - } - } - } -} diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/ObjectUtils.java b/src/main/java/org/teachingextensions/approvals/lite/util/ObjectUtils.java index c3a1d22..844e16b 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/ObjectUtils.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/ObjectUtils.java @@ -96,10 +96,6 @@ private static Class[] getAllCastableClasses(Object object) { return found; } - public static void assertInstance(Class clazz, Object object) { - assertInstance(new Class[]{clazz}, object); - } - public static void assertInstance(Class classes[], Object object) { if (object == null) { throw new NullPointerException("Expected Object of Type " diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/StringUtils.java b/src/main/java/org/teachingextensions/approvals/lite/util/StringUtils.java index 1bc729d..a3fcce0 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/StringUtils.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/StringUtils.java @@ -120,7 +120,7 @@ public static String stripNonNumeric(String number, boolean allowDecimal, boolea * @return true if Non Zero. */ public static boolean isNonZero(String string) { - return ((string != null) && string.trim().length() > 0); + return string != null && string.trim().length() > 0; } public static boolean isEmpty(String string) { diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/lambda/Action1.java b/src/main/java/org/teachingextensions/approvals/lite/util/lambda/Action1.java deleted file mode 100644 index b4456cb..0000000 --- a/src/main/java/org/teachingextensions/approvals/lite/util/lambda/Action1.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.teachingextensions.approvals.lite.util.lambda; - -public interface Action1 { - public void call(In1 a); -} diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/lambda/Query.java b/src/main/java/org/teachingextensions/approvals/lite/util/lambda/Query.java index 6aacdcc..6c7216d 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/lambda/Query.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/lambda/Query.java @@ -1,26 +1,14 @@ package org.teachingextensions.approvals.lite.util.lambda; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; public class Query { - public static List select(List list, Function1 function) { - ArrayList out = new ArrayList<>(); - for (In i : list) { - out.add(function.call(i)); - } - return out; - } - - public static List select(In[] list, Function1 function) { - return select(Arrays.asList(list), function); - } - public static List where(In[] list, Function1 funct) { + public static List where(In[] list, Function1 predicate) { ArrayList out = new ArrayList<>(); for (In i : list) { - if (funct.call(i)) { + if (predicate.call(i)) { out.add(i); } } diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/servlets/ValidationError.java b/src/main/java/org/teachingextensions/approvals/lite/util/servlets/ValidationError.java index 7be07eb..a2db618 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/servlets/ValidationError.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/servlets/ValidationError.java @@ -67,7 +67,7 @@ public ValidationError add(String prefix, ValidationError error) { } public boolean isOk() { - return (errors.size() == 0); + return errors.size() == 0; } private void assertValidAssertion(String assertion) { diff --git a/src/main/java/org/teachingextensions/windows/MessageBox.java b/src/main/java/org/teachingextensions/windows/MessageBox.java index 22f18d7..0538b71 100644 --- a/src/main/java/org/teachingextensions/windows/MessageBox.java +++ b/src/main/java/org/teachingextensions/windows/MessageBox.java @@ -47,7 +47,7 @@ public static String askForTextInput(String message) { /** * Prints the message to the window.
- * Example: {@code MessageBox.showMessage("Girl programmers rule!");} + * Example: {@code MessageBox.showMessage("Girl programmers rule!");} * * @param message * the text to be displayed diff --git a/src/test/java/org/teachingextensions/approvals/lite/util/FilterTest.java b/src/test/java/org/teachingextensions/approvals/lite/util/FilterTest.java deleted file mode 100644 index 318c58b..0000000 --- a/src/test/java/org/teachingextensions/approvals/lite/util/FilterTest.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.teachingextensions.approvals.lite.util; - -import junit.framework.TestCase; - -public class FilterTest extends TestCase { - public void testAll() throws Exception { - Integer[] array = {1, 2, 3, 4, 5}; - FilterOdd filter = new FilterOdd(); - assertEquals("null, extracted", 5, FilterUtils.retainExtracted(array, null).size()); - assertEquals("odd", 3, FilterUtils.retainExtracted(array, filter).size()); - } - - - private static class FilterOdd implements Filter { - - public boolean isExtracted(Object o) throws IllegalArgumentException { - ObjectUtils.assertInstance(Integer.class, o); - return ((Integer) o).intValue() % 2 == 1; - } - - } -} From 1b4baa97cce3e8c838d8890cc6cc248678aa6115 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Wed, 18 Mar 2015 15:09:07 -0700 Subject: [PATCH 084/111] Removed extra maven deps --- pom.xml | 260 +++++++++++++++++++++++++------------------------------- 1 file changed, 117 insertions(+), 143 deletions(-) diff --git a/pom.xml b/pom.xml index c648ed1..4ce79ef 100644 --- a/pom.xml +++ b/pom.xml @@ -1,147 +1,121 @@ - 4.0.0 - org.teachingkidsprogramming - TeachingKidsProgramming - 0.0.3-SNAPSHOT - jar - ${project.groupId}:${project.artifactId} - A proven library of high-quality programming courseware for kids. TKP is a designated project of the US non-profit (501c3) the MONA Foundation. The mission of the MONA Foundation is to "support grassroots educational initiatives that educate everyone—including girls." - http://teachingkidsprogramming.org/ - - - The Apache License, Version 2.0 - http://www.apache.org/licenses/LICENSE-2.0.txt - - - - - Jim Counts - jamesrcounts@outlook.com - Teaching Kids Programming - http://teachingkidsprogramming.org/ - - - Lynn Langit - lynn@teachingkidsprogramming.org - Teaching Kids Programming - http://teachingkidsprogramming.org/ - - - - scm:git:git@github.com:TeachingKidsProgramming/TeachingKidsProgramming.Source.Java.git - scm:git:git@github.com:TeachingKidsProgramming/TeachingKidsProgramming.Source.Java.git - git@github.com:TeachingKidsProgramming/TeachingKidsProgramming.Source.Java.git - - - - junit - junit - 4.12 - - - javax.servlet - javax.servlet-api - 3.1.0 - - - velocity - velocity - 1.4 - - - commons-collections - commons-collections - 3.2.1 - - - commons-logging - commons-logging - 1.0.3 - - - sshtools - j2ssh-core - 0.2.9 - - - commons-httpclient - commons-httpclient - 2.0-rc3 - - - commons-net - commons-net - 1.1.0 - - - org.mockito - mockito-all - 1.8.5 - - - com.sun.mail - javax.mail - 1.4.4 - - - log4j - log4j - 1.2.9 - - + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 + org.teachingkidsprogramming + TeachingKidsProgramming + 0.0.3-SNAPSHOT + jar + ${project.groupId}:${project.artifactId} + A proven library of high-quality programming courseware for kids. TKP is a designated project of the US + non-profit (501c3) the MONA Foundation. The mission of the MONA Foundation is to "support grassroots + educational initiatives that educate everyone—including girls." + http://teachingkidsprogramming.org/ + + + The Apache License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + + + + + Jim Counts + jamesrcounts@outlook.com + Teaching Kids Programming + http://teachingkidsprogramming.org/ + + + Lynn Langit + lynn@teachingkidsprogramming.org + Teaching Kids Programming + http://teachingkidsprogramming.org/ + + + + scm:git:git@github.com:TeachingKidsProgramming/TeachingKidsProgramming.Source.Java.git + scm:git:git@github.com:TeachingKidsProgramming/TeachingKidsProgramming.Source.Java.git + + git@github.com:TeachingKidsProgramming/TeachingKidsProgramming.Source.Java.git + + + + junit + junit + 4.12 + + + javax.servlet + javax.servlet-api + 3.1.0 + + + velocity + velocity + 1.4 + + + commons-collections + commons-collections + 3.2.1 + + + log4j + log4j + 1.2.9 + + - - - - org.apache.maven.plugins - maven-javadoc-plugin - 2.10.1 - - - org.apache.maven.plugins - maven-compiler-plugin - 3.2 - - 1.7 - 1.7 - ISO-8859-1-Xlint:unchecked - - - - org.apache.maven.plugins - maven-repository-plugin - 2.4 - - - org.apache.maven.plugins - maven-gpg-plugin - 1.6 - - - sign-artifacts - verify - - sign - - - - - - + + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.10.1 + + + org.apache.maven.plugins + maven-compiler-plugin + 3.2 + + 1.7 + 1.7 + ISO-8859-1 + -Xlint:unchecked + + + + org.apache.maven.plugins + maven-repository-plugin + 2.4 + + + org.apache.maven.plugins + maven-gpg-plugin + 1.6 + + + sign-artifacts + verify + + sign + + + + + + - - http://teachingkidsprogramming.org/ - Teaching Kids Programming - - - ISO-8859-1 - - - - sonatype - - https://oss.sonatype.org/service/local/staging/deploy/maven2 - - + + http://teachingkidsprogramming.org/ + Teaching Kids Programming + + + ISO-8859-1 + + + + sonatype + + https://oss.sonatype.org/service/local/staging/deploy/maven2 + + \ No newline at end of file From d0cd0d0cb0c3d83d148924e94db7ac8bd7dedc6d Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Wed, 18 Mar 2015 15:13:57 -0700 Subject: [PATCH 085/111] Java 1.7 --- .classpath | 4 ++-- .settings/org.eclipse.core.resources.prefs | 7 ++++--- .settings/org.eclipse.jdt.core.prefs | 6 +++--- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/.classpath b/.classpath index cdf5b63..d02e9eb 100644 --- a/.classpath +++ b/.classpath @@ -15,12 +15,12 @@ - + - + diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs index 8fe5fbd..987b2d7 100644 --- a/.settings/org.eclipse.core.resources.prefs +++ b/.settings/org.eclipse.core.resources.prefs @@ -1,5 +1,6 @@ eclipse.preferences.version=1 -encoding//src/main/resources=UTF-8 -encoding//src/test/java=UTF-8 -encoding//src/test/resources=UTF-8 +encoding//src/main/java=ISO-8859-1 +encoding//src/main/resources=ISO-8859-1 +encoding//src/test/java=ISO-8859-1 +encoding//src/test/resources=ISO-8859-1 encoding/=ISO-8859-1 diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs index 714351a..ec4300d 100644 --- a/.settings/org.eclipse.jdt.core.prefs +++ b/.settings/org.eclipse.jdt.core.prefs @@ -1,5 +1,5 @@ eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 -org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 +org.eclipse.jdt.core.compiler.compliance=1.7 org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning -org.eclipse.jdt.core.compiler.source=1.8 +org.eclipse.jdt.core.compiler.source=1.7 From 841d5e6d085cc11cbe3d555300a7314402b85dcf Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Wed, 18 Mar 2015 15:24:28 -0700 Subject: [PATCH 086/111] updated log4j --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4ce79ef..948a44a 100644 --- a/pom.xml +++ b/pom.xml @@ -60,7 +60,7 @@ log4j log4j - 1.2.9 + 1.2.14 From 5e8be4590c7fb453a6f3bbe14825ace925de9a93 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Thu, 19 Mar 2015 08:19:54 -0700 Subject: [PATCH 087/111] Finished merging --- TeachingKidsProgramming.iml | 23 +++++ .../teachingextensions/logo/TurtlePanel.java | 94 +++++++++--------- .../recipes/completed/SimpleSquare.java | 9 +- .../inDevelopment/SmallBasicHolidayCard.java | 0 .../inDevelopment/SmallBasicTicTacToe.java | 0 .../section08tdd/PuzzleBoard.java | 77 ++++++++++++++ .../section08tdd/PuzzleSolver.java | 35 +++++++ .../section08tdd/PuzzleWindow.java | 14 +-- .../section08tdd/SimplePuzzle.java | 29 ++++++ .../section08tdd/Tile.java | 78 +++++++++++++++ .../logo => main/resources}/Batgirl.png | Bin .../logo => main/resources}/Batgirl1a.png | Bin .../logo => main/resources}/Batgirl1b.png | Bin .../logo => main/resources}/Batgirl1c.png | Bin .../logo => main/resources}/Batgirl2a.png | Bin .../logo => main/resources}/Batgirl2b.png | Bin .../logo => main/resources}/Batgirl2c.png | Bin .../logo => main/resources}/Batgirl3a.png | Bin .../logo => main/resources}/Batgirl3b.png | Bin .../logo => main/resources}/Batgirl3c.png | Bin .../resources/{images => }/ExplodedTurtle.png | Bin .../{images => }/ExplodedTurtleOld.png | Bin src/main/resources/{images => }/Spider.png | Bin src/main/resources/{images => }/Turtle.png | Bin src/main/resources/images/Thumbs.db | Bin 6656 -> 0 bytes .../section08tdd/Batgirl.png | Bin 93011 -> 0 bytes .../section08tdd/Batgirl1a.png | Bin 7198 -> 0 bytes .../section08tdd/Batgirl1b.png | Bin 10342 -> 0 bytes .../section08tdd/Batgirl1c.png | Bin 16121 -> 0 bytes .../section08tdd/Batgirl2a.png | Bin 7716 -> 0 bytes .../section08tdd/Batgirl2b.png | Bin 14391 -> 0 bytes .../section08tdd/Batgirl2c.png | Bin 17539 -> 0 bytes .../section08tdd/Batgirl3a.png | Bin 5027 -> 0 bytes .../section08tdd/Batgirl3b.png | Bin 5962 -> 0 bytes .../section08tdd/Batgirl3c.png | Bin 12267 -> 0 bytes .../section08tdd/PuzzleBoard.java | 93 ----------------- .../section08tdd/PuzzleSolver.java | 45 --------- .../section08tdd/SimplePuzzle.java | 42 -------- .../section08tdd/Tile.java | 72 -------------- 39 files changed, 296 insertions(+), 315 deletions(-) create mode 100644 TeachingKidsProgramming.iml rename src/{ => main/java}/org/teachingkidsprogramming/recipes/inDevelopment/SmallBasicHolidayCard.java (100%) rename src/{ => main/java}/org/teachingkidsprogramming/recipes/inDevelopment/SmallBasicTicTacToe.java (100%) create mode 100644 src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleBoard.java create mode 100644 src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleSolver.java rename src/{ => main/java}/org/teachingkidsprogramming/section08tdd/PuzzleWindow.java (65%) create mode 100644 src/main/java/org/teachingkidsprogramming/section08tdd/SimplePuzzle.java create mode 100644 src/main/java/org/teachingkidsprogramming/section08tdd/Tile.java rename src/{org/teachingextensions/logo => main/resources}/Batgirl.png (100%) rename src/{org/teachingextensions/logo => main/resources}/Batgirl1a.png (100%) rename src/{org/teachingextensions/logo => main/resources}/Batgirl1b.png (100%) rename src/{org/teachingextensions/logo => main/resources}/Batgirl1c.png (100%) rename src/{org/teachingextensions/logo => main/resources}/Batgirl2a.png (100%) rename src/{org/teachingextensions/logo => main/resources}/Batgirl2b.png (100%) rename src/{org/teachingextensions/logo => main/resources}/Batgirl2c.png (100%) rename src/{org/teachingextensions/logo => main/resources}/Batgirl3a.png (100%) rename src/{org/teachingextensions/logo => main/resources}/Batgirl3b.png (100%) rename src/{org/teachingextensions/logo => main/resources}/Batgirl3c.png (100%) rename src/main/resources/{images => }/ExplodedTurtle.png (100%) rename src/main/resources/{images => }/ExplodedTurtleOld.png (100%) rename src/main/resources/{images => }/Spider.png (100%) rename src/main/resources/{images => }/Turtle.png (100%) delete mode 100644 src/main/resources/images/Thumbs.db delete mode 100644 src/org/teachingkidsprogramming/section08tdd/Batgirl.png delete mode 100644 src/org/teachingkidsprogramming/section08tdd/Batgirl1a.png delete mode 100644 src/org/teachingkidsprogramming/section08tdd/Batgirl1b.png delete mode 100644 src/org/teachingkidsprogramming/section08tdd/Batgirl1c.png delete mode 100644 src/org/teachingkidsprogramming/section08tdd/Batgirl2a.png delete mode 100644 src/org/teachingkidsprogramming/section08tdd/Batgirl2b.png delete mode 100644 src/org/teachingkidsprogramming/section08tdd/Batgirl2c.png delete mode 100644 src/org/teachingkidsprogramming/section08tdd/Batgirl3a.png delete mode 100644 src/org/teachingkidsprogramming/section08tdd/Batgirl3b.png delete mode 100644 src/org/teachingkidsprogramming/section08tdd/Batgirl3c.png delete mode 100644 src/org/teachingkidsprogramming/section08tdd/PuzzleBoard.java delete mode 100644 src/org/teachingkidsprogramming/section08tdd/PuzzleSolver.java delete mode 100644 src/org/teachingkidsprogramming/section08tdd/SimplePuzzle.java delete mode 100644 src/org/teachingkidsprogramming/section08tdd/Tile.java diff --git a/TeachingKidsProgramming.iml b/TeachingKidsProgramming.iml new file mode 100644 index 0000000..c5c7943 --- /dev/null +++ b/TeachingKidsProgramming.iml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/org/teachingextensions/logo/TurtlePanel.java b/src/main/java/org/teachingextensions/logo/TurtlePanel.java index 2e605a1..df5844c 100644 --- a/src/main/java/org/teachingextensions/logo/TurtlePanel.java +++ b/src/main/java/org/teachingextensions/logo/TurtlePanel.java @@ -1,60 +1,55 @@ package org.teachingextensions.logo; -import java.awt.BasicStroke; -import java.awt.Cursor; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.Image; -import java.awt.RenderingHints; +import org.teachingextensions.logo.Turtle.Animals; +import org.teachingextensions.windows.ProgramWindow; + +import javax.swing.*; +import java.awt.*; import java.awt.geom.AffineTransform; import java.awt.geom.Line2D; import java.net.URL; -import javax.swing.ImageIcon; - -import org.teachingextensions.logo.Turtle.Animals; -import org.teachingextensions.windows.ProgramWindow; - @SuppressWarnings("serial") -public class TurtlePanel extends ProgramWindow -{ - private Turtle turtle; - private Image image; +public class TurtlePanel extends ProgramWindow { + private Turtle turtle; + private Image image; private Animals animal; - public TurtlePanel() - { + + public TurtlePanel() { } - public void setTurtle(Turtle turtle) - { + + public void setTurtle(Turtle turtle) { this.turtle = turtle; } + @Override - public void paint(Graphics g) - { + public void paint(Graphics g) { super.paint(g); paintLines((Graphics2D) g); paintTurtle((Graphics2D) g); } - private void paintLines(Graphics2D g) - { - if (turtle == null) { return; } + + private void paintLines(Graphics2D g) { + if (turtle == null) { + return; + } g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY); g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE); g.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE); - for (LineSegment l : turtle.getTrail()) - { - if (l != null) - { + for (LineSegment l : turtle.getTrail()) { + if (l != null) { g.setColor(l.getColor()); g.setStroke(new BasicStroke(l.getWidth(), BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)); g.draw(new Line2D.Double(l.getStart().x, l.getStart().y, l.getEnd().x, l.getEnd().y)); } } } - private void paintTurtle(Graphics2D g) - { - if (turtle == null || turtle.isHidden()) { return; } + + private void paintTurtle(Graphics2D g) { + if (turtle == null || turtle.isHidden()) { + return; + } Image image = getImage(); int xCenter = image.getWidth(null) / 2; int yCenter = image.getHeight(null) / 2; @@ -66,36 +61,39 @@ private void paintTurtle(Graphics2D g) move.concatenate(rotate); g.drawImage(image, move, null); } - public synchronized Image getImage() - { - if (image == null) - { + + public synchronized Image getImage() { + if (image == null) { setAnimal(Animals.Turtle); } return image; } - public synchronized Animals getAnimal() - { - if (animal == null) - { + + public synchronized Animals getAnimal() { + if (animal == null) { setAnimal(Animals.Turtle); } return animal; } - public synchronized void setAnimal(Animals animal) - { + + public synchronized void setAnimal(Animals animal) { this.animal = animal; - String name = "images/" + animal + ".png"; - URL resource = this.getClass().getClassLoader().getResource(name); - if (resource == null) { throw new IllegalStateException("Could not find animal: " + name); } + String name = animal + ".png"; + URL resource = this.getClass().getResource(name); + if (resource == null) { + resource = this.getClass().getClassLoader().getResource(name); + } + if (resource == null) { + throw new IllegalStateException("Could not find animal: " + name); + } image = new ImageIcon(resource).getImage(); } - public void setCursor(int cursor) - { + + public void setCursor(int cursor) { this.setCursor(Cursor.getPredefinedCursor(cursor)); } - public void ___() - { + + public void ___() { // blank for the DeepDive } } diff --git a/src/main/java/org/teachingkidsprogramming/recipes/completed/SimpleSquare.java b/src/main/java/org/teachingkidsprogramming/recipes/completed/SimpleSquare.java index 51ab6a6..1e6a1ec 100644 --- a/src/main/java/org/teachingkidsprogramming/recipes/completed/SimpleSquare.java +++ b/src/main/java/org/teachingkidsprogramming/recipes/completed/SimpleSquare.java @@ -3,17 +3,14 @@ import org.teachingextensions.logo.PenColors; import org.teachingextensions.logo.Tortoise; -public class SimpleSquare -{ - public static void main(String[] args) throws Exception - { +public class SimpleSquare { + public static void main(String[] args) throws Exception { // Show the tortoise --#1 Tortoise.show(); // Make the tortoise move as fast as possible --#6 Tortoise.setSpeed(10); // Do the following 4 times --#5.1 - for (int i = 1; i <= 4; i++) - { + for (int i = 1; i <= 4; i++) { // Change the pen color of the line the tortoise draws to "blue" --#4 Tortoise.setPenColor(PenColors.Blues.Blue); // Move the tortoise 50 pixels --#2 diff --git a/src/org/teachingkidsprogramming/recipes/inDevelopment/SmallBasicHolidayCard.java b/src/main/java/org/teachingkidsprogramming/recipes/inDevelopment/SmallBasicHolidayCard.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/inDevelopment/SmallBasicHolidayCard.java rename to src/main/java/org/teachingkidsprogramming/recipes/inDevelopment/SmallBasicHolidayCard.java diff --git a/src/org/teachingkidsprogramming/recipes/inDevelopment/SmallBasicTicTacToe.java b/src/main/java/org/teachingkidsprogramming/recipes/inDevelopment/SmallBasicTicTacToe.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/inDevelopment/SmallBasicTicTacToe.java rename to src/main/java/org/teachingkidsprogramming/recipes/inDevelopment/SmallBasicTicTacToe.java diff --git a/src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleBoard.java b/src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleBoard.java new file mode 100644 index 0000000..9656e71 --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleBoard.java @@ -0,0 +1,77 @@ +package org.teachingkidsprogramming.section08tdd; + +import org.teachingextensions.logo.PenColors; + +import javax.swing.*; +import java.awt.*; +import java.util.ArrayList; +import java.util.List; + +public class PuzzleBoard extends JPanel { + private static final long serialVersionUID = -3592444274530147326L; + private List tiles; + private List positions; + + public PuzzleBoard() { + this.positions = createPositions(); + this.tiles = createTiles(this.positions); + } + + private static List createPositions() { + ArrayList p = new ArrayList<>(9); + Point point; + for (int i = 0; i < 9; i++) { + if (i < 3) { + point = new Point(35, 35 + (127 * i)); + } else if (i < 6) { + point = new Point(162, 35 + (127 * (i - 3))); + } else { + point = new Point(289, 35 + (127 * (i - 6))); + } + p.add(point); + } + return p; + } + + private static List createTiles(List positions) { + ArrayList t = new ArrayList<>(9); + for (int i = 0; i < 8; i++) { + t.add(new Tile(i, positions.get(i))); + } + return t; + } + + @Override + protected void paintComponent(Graphics g) { + super.paintComponent(g); + drawBorder(g); + drawField(g); + drawTiles(g); + } + + private void drawTiles(Graphics g) { + Graphics2D g2d = (Graphics2D) g.create(); + for (Tile tile : tiles) { + tile.paint(g2d); + } + g2d.dispose(); + } + + private void drawField(Graphics g) { + g.setColor(PenColors.Blues.SkyBlue); + g.fillRect(30, 30, 386, 386); + } + + private void drawBorder(Graphics g) { + g.setColor(PenColors.Blues.DarkBlue); + g.fillRect(20, 20, 410, 410); + } + + public Tile getPiece(int i) { + return this.tiles.get(i); + } + + public List getPositions() { + return new ArrayList<>(positions); + } +} \ No newline at end of file diff --git a/src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleSolver.java b/src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleSolver.java new file mode 100644 index 0000000..2007553 --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleSolver.java @@ -0,0 +1,35 @@ +package org.teachingkidsprogramming.section08tdd; + +import javax.swing.*; +import java.awt.*; + +public class PuzzleSolver implements Runnable { + private PuzzleBoard board; + + public PuzzleSolver(PuzzleBoard board) { + this.board = board; + } + + public void run() { + final PuzzleBoard b = this.board; + Point target = b.getPositions().get(8); + while (b.isVisible()) { + SwingUtilities.invokeLater(new Runnable() { + public void run() { + b.repaint(); + } + }); + Tile piece = b.getPiece(7); + if (!piece.isMovingTo(target)) { + piece.moveTo(target); + } + if (!piece.isAt(target)) { + piece.step(); + } + try { + Thread.sleep(10); + } catch (InterruptedException e) { + } + } + } +} diff --git a/src/org/teachingkidsprogramming/section08tdd/PuzzleWindow.java b/src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleWindow.java similarity index 65% rename from src/org/teachingkidsprogramming/section08tdd/PuzzleWindow.java rename to src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleWindow.java index 0f42822..55b8a59 100644 --- a/src/org/teachingkidsprogramming/section08tdd/PuzzleWindow.java +++ b/src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleWindow.java @@ -1,18 +1,14 @@ package org.teachingkidsprogramming.section08tdd; -import java.awt.BorderLayout; - import org.teachingextensions.windows.ProgramWindow; -public class PuzzleWindow extends ProgramWindow -{ - public PuzzleWindow() - { +import java.awt.*; + +public class PuzzleWindow extends ProgramWindow { + public PuzzleWindow() { super("Puzzle"); this.setLayout(new BorderLayout()); } - /** - * - */ + private static final long serialVersionUID = -1526978082665818880L; } \ No newline at end of file diff --git a/src/main/java/org/teachingkidsprogramming/section08tdd/SimplePuzzle.java b/src/main/java/org/teachingkidsprogramming/section08tdd/SimplePuzzle.java new file mode 100644 index 0000000..62785ae --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/section08tdd/SimplePuzzle.java @@ -0,0 +1,29 @@ +package org.teachingkidsprogramming.section08tdd; + +import javax.swing.*; +import java.awt.*; + +public class SimplePuzzle implements Runnable { + public static void main(String[] args) { + EventQueue.invokeLater(new SimplePuzzle()); + } + + public void run() { + this.setLookAndFeel(); + PuzzleBoard board = new PuzzleBoard(); + PuzzleWindow pw = new PuzzleWindow(); + pw.add(board); + pw.setVisible(true); + new Thread(new PuzzleSolver(board)).start(); + } + + private void setLookAndFeel() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException ex) { + } catch (InstantiationException ex) { + } catch (IllegalAccessException ex) { + } catch (UnsupportedLookAndFeelException ex) { + } + } +} diff --git a/src/main/java/org/teachingkidsprogramming/section08tdd/Tile.java b/src/main/java/org/teachingkidsprogramming/section08tdd/Tile.java new file mode 100644 index 0000000..289bd66 --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/section08tdd/Tile.java @@ -0,0 +1,78 @@ +package org.teachingkidsprogramming.section08tdd; + +import javax.swing.*; +import java.awt.*; +import java.net.URL; + +public class Tile { + private final static String[] resources = {"Batgirl1a.png", + "Batgirl1b.png", + "Batgirl1c.png", + "Batgirl2a.png", + "Batgirl2b.png", + "Batgirl2c.png", + "Batgirl3a.png", + "Batgirl3b.png", + "Batgirl3c.png"}; + private final static int width = 122; + private final static int height = 122; + private Image image; + private Point position; + private Point target; + + public Tile(int imageIdx, Point position) { + this.position = new Point(position.x, position.y); + URL resource = this.getClass().getResource(resources[imageIdx]); + if (resource == null) { + resource = this.getClass().getClassLoader().getResource(resources[imageIdx]); + } + if (resource == null) { + throw new IllegalStateException("Could not find tile image"); + } + this.image = new ImageIcon(resource).getImage(); + } + + public void paint(Graphics2D g2d) { + g2d.drawImage(this.image, this.position.x, this.position.y, width, height, null); + } + + public boolean isAt(Point point) { + return this.position.x == point.x && this.position.y == point.y; + } + + public void moveTo(Point target) { + this.target = new Point(target.x, target.y); + } + + public boolean isMovingTo(Point target) { + return this.target != null && this.target.x == target.x && this.target.y == target.y; + } + + public void step() { + int size = 1; + + int x = stepHorizontal(size); + int y = stepVertical(size); + this.position = new Point(x, y); + } + + private int stepVertical(int size) { + if (this.position.y < this.target.y) { + return this.position.y + size; + } + if (this.target.y < this.position.y) { + return this.position.y - size; + } + return this.position.y; + } + + private int stepHorizontal(int size) { + if (this.position.x < this.target.x) { + return this.position.x + size; + } + if (this.target.x < this.position.x) { + return this.position.x - size; + } + return this.position.x; + } +} diff --git a/src/org/teachingextensions/logo/Batgirl.png b/src/main/resources/Batgirl.png similarity index 100% rename from src/org/teachingextensions/logo/Batgirl.png rename to src/main/resources/Batgirl.png diff --git a/src/org/teachingextensions/logo/Batgirl1a.png b/src/main/resources/Batgirl1a.png similarity index 100% rename from src/org/teachingextensions/logo/Batgirl1a.png rename to src/main/resources/Batgirl1a.png diff --git a/src/org/teachingextensions/logo/Batgirl1b.png b/src/main/resources/Batgirl1b.png similarity index 100% rename from src/org/teachingextensions/logo/Batgirl1b.png rename to src/main/resources/Batgirl1b.png diff --git a/src/org/teachingextensions/logo/Batgirl1c.png b/src/main/resources/Batgirl1c.png similarity index 100% rename from src/org/teachingextensions/logo/Batgirl1c.png rename to src/main/resources/Batgirl1c.png diff --git a/src/org/teachingextensions/logo/Batgirl2a.png b/src/main/resources/Batgirl2a.png similarity index 100% rename from src/org/teachingextensions/logo/Batgirl2a.png rename to src/main/resources/Batgirl2a.png diff --git a/src/org/teachingextensions/logo/Batgirl2b.png b/src/main/resources/Batgirl2b.png similarity index 100% rename from src/org/teachingextensions/logo/Batgirl2b.png rename to src/main/resources/Batgirl2b.png diff --git a/src/org/teachingextensions/logo/Batgirl2c.png b/src/main/resources/Batgirl2c.png similarity index 100% rename from src/org/teachingextensions/logo/Batgirl2c.png rename to src/main/resources/Batgirl2c.png diff --git a/src/org/teachingextensions/logo/Batgirl3a.png b/src/main/resources/Batgirl3a.png similarity index 100% rename from src/org/teachingextensions/logo/Batgirl3a.png rename to src/main/resources/Batgirl3a.png diff --git a/src/org/teachingextensions/logo/Batgirl3b.png b/src/main/resources/Batgirl3b.png similarity index 100% rename from src/org/teachingextensions/logo/Batgirl3b.png rename to src/main/resources/Batgirl3b.png diff --git a/src/org/teachingextensions/logo/Batgirl3c.png b/src/main/resources/Batgirl3c.png similarity index 100% rename from src/org/teachingextensions/logo/Batgirl3c.png rename to src/main/resources/Batgirl3c.png diff --git a/src/main/resources/images/ExplodedTurtle.png b/src/main/resources/ExplodedTurtle.png similarity index 100% rename from src/main/resources/images/ExplodedTurtle.png rename to src/main/resources/ExplodedTurtle.png diff --git a/src/main/resources/images/ExplodedTurtleOld.png b/src/main/resources/ExplodedTurtleOld.png similarity index 100% rename from src/main/resources/images/ExplodedTurtleOld.png rename to src/main/resources/ExplodedTurtleOld.png diff --git a/src/main/resources/images/Spider.png b/src/main/resources/Spider.png similarity index 100% rename from src/main/resources/images/Spider.png rename to src/main/resources/Spider.png diff --git a/src/main/resources/images/Turtle.png b/src/main/resources/Turtle.png similarity index 100% rename from src/main/resources/images/Turtle.png rename to src/main/resources/Turtle.png diff --git a/src/main/resources/images/Thumbs.db b/src/main/resources/images/Thumbs.db deleted file mode 100644 index d87c6f803e57e77131a60616f977462bea30e94a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6656 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 }`G&BZJMoNeiu+mC$ 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 Ef~t;kI{*Lx diff --git a/src/org/teachingkidsprogramming/section08tdd/Batgirl1c.png b/src/org/teachingkidsprogramming/section08tdd/Batgirl1c.png deleted file mode 100644 index b53eb50bf24782a9309a64cbf8b03b537b4a1104..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16121 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 LNkvXXu0mjfy|3VH diff --git a/src/org/teachingkidsprogramming/section08tdd/Batgirl2a.png b/src/org/teachingkidsprogramming/section08tdd/Batgirl2a.png deleted file mode 100644 index b0bfb4ef1bd02b6385bc2165858d77ffe4551e60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7716 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 diff --git a/src/org/teachingkidsprogramming/section08tdd/Batgirl2c.png b/src/org/teachingkidsprogramming/section08tdd/Batgirl2c.png deleted file mode 100644 index 4f621877910188aab9ab3ab012935cf70622b3f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17539 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 diff --git a/src/org/teachingkidsprogramming/section08tdd/Batgirl3c.png b/src/org/teachingkidsprogramming/section08tdd/Batgirl3c.png deleted file mode 100644 index 7a2cb0e8df0ff46672ce56fe20649d62b1edd6ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12267 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 FV1oQIj=%r_ diff --git a/src/org/teachingkidsprogramming/section08tdd/PuzzleBoard.java b/src/org/teachingkidsprogramming/section08tdd/PuzzleBoard.java deleted file mode 100644 index e18e540..0000000 --- a/src/org/teachingkidsprogramming/section08tdd/PuzzleBoard.java +++ /dev/null @@ -1,93 +0,0 @@ -package org.teachingkidsprogramming.section08tdd; - -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.Point; -import java.util.ArrayList; -import java.util.List; - -import javax.swing.JPanel; - -import org.teachingextensions.logo.PenColors; - -public class PuzzleBoard extends JPanel -{ - private static final long serialVersionUID = -3592444274530147326L; - private List tiles; - private List positions; - public PuzzleBoard() - { - this.positions = createPositions(); - this.tiles = createTiles(this.positions); - } - private static List createPositions() - { - ArrayList p = new ArrayList(9); - Point point = null; - for (int i = 0; i < 9; i++) - { - if (i < 3) - { - point = new Point(35, 35 + (127 * i)); - } - else if (i < 6) - { - point = new Point(162, 35 + (127 * (i - 3))); - } - else - { - point = new Point(289, 35 + (127 * (i - 6))); - } - if (point != null) - { - p.add(point); - } - point = null; - } - return p; - } - private static List createTiles(List positions) - { - ArrayList t = new ArrayList(9); - for (int i = 0; i < 8; i++) - { - t.add(new Tile(i, positions.get(i))); - } - return t; - } - @Override - protected void paintComponent(Graphics g) - { - super.paintComponent(g); - drawBorder(g); - drawField(g); - drawTiles(g); - } - private void drawTiles(Graphics g) - { - Graphics2D g2d = (Graphics2D) g.create(); - for (Tile tile : tiles) - { - tile.paint(g2d); - } - g2d.dispose(); - } - private void drawField(Graphics g) - { - g.setColor(PenColors.Blues.SkyBlue); - g.fillRect(30, 30, 386, 386); - } - private void drawBorder(Graphics g) - { - g.setColor(PenColors.Blues.DarkBlue); - g.fillRect(20, 20, 410, 410); - } - public Tile getPiece(int i) - { - return this.tiles.get(i); - } - public List getPositions() - { - return new ArrayList(positions); - } -} \ No newline at end of file diff --git a/src/org/teachingkidsprogramming/section08tdd/PuzzleSolver.java b/src/org/teachingkidsprogramming/section08tdd/PuzzleSolver.java deleted file mode 100644 index ffcbc04..0000000 --- a/src/org/teachingkidsprogramming/section08tdd/PuzzleSolver.java +++ /dev/null @@ -1,45 +0,0 @@ -package org.teachingkidsprogramming.section08tdd; - -import java.awt.Point; - -import javax.swing.SwingUtilities; - -public class PuzzleSolver implements Runnable -{ - private PuzzleBoard board; - public PuzzleSolver(PuzzleBoard board) - { - this.board = board; - } - public void run() - { - final PuzzleBoard b = this.board; - Point target = b.getPositions().get(8); - while (b.isVisible()) - { - SwingUtilities.invokeLater(new Runnable() - { - public void run() - { - b.repaint(); - } - }); - Tile piece = b.getPiece(7); - if (!piece.isMovingTo(target)) - { - piece.moveTo(target); - } - if (!piece.isAt(target)) - { - piece.step(); - } - try - { - Thread.sleep(10); - } - catch (InterruptedException e) - { - } - } - } -} diff --git a/src/org/teachingkidsprogramming/section08tdd/SimplePuzzle.java b/src/org/teachingkidsprogramming/section08tdd/SimplePuzzle.java deleted file mode 100644 index 6ced96a..0000000 --- a/src/org/teachingkidsprogramming/section08tdd/SimplePuzzle.java +++ /dev/null @@ -1,42 +0,0 @@ -package org.teachingkidsprogramming.section08tdd; - -import java.awt.EventQueue; - -import javax.swing.UIManager; -import javax.swing.UnsupportedLookAndFeelException; - -public class SimplePuzzle implements Runnable -{ - public static void main(String[] args) - { - EventQueue.invokeLater(new SimplePuzzle()); - } - public void run() - { - this.setLookAndFeel(); - PuzzleBoard board = new PuzzleBoard(); - PuzzleWindow pw = new PuzzleWindow(); - pw.add(board); - pw.setVisible(true); - new Thread(new PuzzleSolver(board)).start(); - } - private void setLookAndFeel() - { - try - { - UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); - } - catch (ClassNotFoundException ex) - { - } - catch (InstantiationException ex) - { - } - catch (IllegalAccessException ex) - { - } - catch (UnsupportedLookAndFeelException ex) - { - } - } -} diff --git a/src/org/teachingkidsprogramming/section08tdd/Tile.java b/src/org/teachingkidsprogramming/section08tdd/Tile.java deleted file mode 100644 index 445786c..0000000 --- a/src/org/teachingkidsprogramming/section08tdd/Tile.java +++ /dev/null @@ -1,72 +0,0 @@ -package org.teachingkidsprogramming.section08tdd; - -import java.awt.Graphics2D; -import java.awt.Image; -import java.awt.Point; -import java.net.URL; - -import javax.swing.ImageIcon; - -public class Tile -{ - private final static String[] resources = {"Batgirl1a.png", - "Batgirl1b.png", - "Batgirl1c.png", - "Batgirl2a.png", - "Batgirl2b.png", - "Batgirl2c.png", - "Batgirl3a.png", - "Batgirl3b.png", - "Batgirl3c.png" }; - private final static int width = 122; - private final static int height = 122; - private Image image; - private Point position; - private Point target; - public Tile(int imageIdx, Point position) - { - this.position = new Point(position.x, position.y); - URL resource = this.getClass().getResource(resources[imageIdx]); - if (resource == null) { throw new IllegalStateException("Could not find tile image"); } - this.image = new ImageIcon(resource).getImage(); - } - public void paint(Graphics2D g2d) - { - g2d.drawImage(this.image, this.position.x, this.position.y, width, height, null); - } - public boolean isAt(Point point) - { - return this.position.x == point.x && this.position.y == point.y; - } - public void moveTo(Point target) - { - this.target = target; - } - public boolean isMovingTo(Point target) - { - return this.target != null && this.target.x == target.x && this.target.y == target.y; - } - public void step() - { - int x = this.position.x; - int size = 1; - if (x < this.target.x) - { - x += size; - } - if (this.target.x < x) - { - x -= size; - } - int y = this.position.y; - if (y < this.target.y) - { - y += size; - } - if (this.target.y < y) - { - y -= size; - } - this.position = new Point(x, y); - } -} From 37de4984225e10ceff5482ce180807dd3ce39fcc Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Thu, 19 Mar 2015 09:03:15 -0700 Subject: [PATCH 088/111] better ant/maven integration --- build.xml | 49 +++++++++++++------------------- build/maven-ant-tasks-2.1.3.jar | Bin 0 -> 1316000 bytes 2 files changed, 20 insertions(+), 29 deletions(-) create mode 100644 build/maven-ant-tasks-2.1.3.jar diff --git a/build.xml b/build.xml index 991a64c..e5b4cee 100755 --- a/build.xml +++ b/build.xml @@ -1,18 +1,25 @@ - + + - + + + + + + + @@ -24,16 +31,12 @@ - - - - - + + @@ -43,33 +46,22 @@ - - + + - + - - - - - - - - - - + - + @@ -86,8 +78,7 @@ - + @@ -114,7 +105,7 @@ - + diff --git a/build/maven-ant-tasks-2.1.3.jar b/build/maven-ant-tasks-2.1.3.jar new file mode 100644 index 0000000000000000000000000000000000000000..bec446fff5f05d21bee64a25d037c46604d510e0 GIT binary patch literal 1316000 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%0A?qE8JU{vNoFPyLai_KK< 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�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�&Oz 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

V2W{w4R_ic}W^NOn#U3~k*c>eY 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
    i^A|ja+{*3*- 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

    onYW%csnjUTW@sl0n9;)za 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

    LtSo#ypmRg^V3@-Sb-U_gy-)%Vaw2m840!qn z^_4yCzWi7llZHq|ZI#p59xmQGMAd``;cYX^Z5sF>Csx?4ia&v(vUCsK#h6%z^O~x_ z(zCKyR&EtA9!qo51CNu*cw_{oOjpihKvY3kG5A%6ld^ElOvdqq$nDWS4FaxU?s$yN z5Vhv1;w#K0Wvu=MYaiYGM{^KynWfS3GlR^c!hCK;L^A>|s$^b03X{u@A+g}4g0u4v znSzbURd|rAl{>D%n1;e`yElAGqhim<8A26;gXqGJ>ZnS0_-?@LUFCT)aNR|$^RWt% zPnwLWN6|cZ8$M`6yterIu)aae;g4u>iCPP&Ih2FA$r;FUWE;a@)G#&90F$wnfQ<{H z`@s#FH=;_;-B!U$Wkzy^_a-P#A!_;g^IwdQe=WN4@yoc^SI%SnTjC|lf4b;jtR5$a zFAL)TbrPDX@@k8sjPh|gDdpNKWxk=XFYo^J>*BH(SOrf3Wwfpug`!{?c=d$g0&eB9 z{Vl*k&@6A_m5LsDeV)g;KKfZ5Dv+3||~vF+$Svt?!L zv-O?m*9AtHJ}lfqU%x)0s1OdSy%lDwotBKOP;BD85y}RAza9DDo+7CZoxR2#-pmw4 z?oz+H{EJWq<4ta;H~(E2&kvm`QG0#@m1`Y)iAK-O3N5^4_Ak_oY%R$b78l4*71EkcrN{PISnYW! zAeqGP06rr2sfBDN!5V=LG1PDtpOai97}|%8txt23ALVS+nQA|-ho|Iiw3%veu7|-X z7`+c1o>g-Tbk$3q@mNOVUf`S&&n+_pNCu>OrwcWB5h+f1zMlmC0ZoDy>->hUhzHu2U|} zGr2#xe{rkl(5i+yrT;g5NUYY>r>N=xVo@B7LguLrW2T&8Ae^I=#FaZhY?T48j-hdd5i#ucVWPZQzGlv>WL29;i`Pc6HnMBG)J8jxoY5qEoNi zCm`%=0{54Ya&IXaQuTA?Tj$8ncpehR?AVqwqjN`?9m$AYO1I__3{T`fk#(qN>~?>( zui**CiX)h6s(ORiHr*k#+5CI#8flj~@-k^A*C8niH*RjTI9W_vygS~3>$b74lwNZ% zcpcB*GX3>8-UJ8X&!1x^r9J6?nQNFnZ+c4hTYLZ9s;k9M`6HXr-Imd(>(+@6-V4R@ zdIdY}25!p^P%x5n;&&rJGyfc``H z^^a5Af5CbMeH+t%Gn3SyJ(U(xKYd(H7^1a+VcS60WIFcZtOQw!)*BI(nrJ78s1;xZd%q@ zO2P1;bm+25hU{=J*ZBq>V)9uE*qxPlvSmYzJUA+rQ!m%Bw4IpUR9u%wjYsplO`aIH zyCED8*33Se!BeN;q)jTN(SC7?vU?)JnPP%sLp2{E$r!bxM?GdtB+XORwbS^wz8_VcmmQ9 znVO6p*V2%@LXDyq=F^w;jnj}?1S~8G)y-D*Z6%BwnWqHs!HM~|jz<9@d1z*vezJI8!Z-$~rb)7VY8IRwuq~r}E27kn; zig1>FPf%j(_FOFg)m>kgz_N{HLQP62k^kWI)D(-ucz*WzU9(AJbkf8&H|Cte{47^q zh1-6DtqkzH0U`X7i9U4#1*t@;llUeBxtvA<9@zuwc@*cQRP_#UHu@o?Q80c>Ro!aY zc0fLzc(JOJ8k8Y?%A$EJKY2uSh1aGLOYtX16Y;pjvhKYl-V!ufmu*j!Z{f=VSZ7GA!lBFwAwFT^i>wHQ8CZt?o}vh3{}P%r#QTe zh-|x~N@~*`33cF;_Qbr&QUl9P`T=bz)$YGVXLx40Poyp&PWCci;%eU(`l-U{9r;Or zqv`zNx;!@4FZHGan^ZZO?<(B*P&C(umFOFqVDLwU0AD;`S>z-tpCNYh!--%axp7{A zIJ=%figLwGsM<&iO5NOAI;Ic8mGP!)*8uz zX8=`tUL^UCuL<1T$X9s_{mRScyC9y&1N4e~_$Y{d{S!}qq0xW~T`C&Ib&DQc}ce#@(b;OWsO1J9}wJ3MY^`#b zOr&%(tg0+pJYTF@RgB@0TIZltA6;zC~6cD)bI5$`Tt5~Zw z6gqAQSKy*EeBSOx0atPLAl00JMpH-!4l=mv=v#FeX&)suE;gKn&>t{KNu)at+2s4> zl`wIG{O(&7*L5_#E35TP4vS5PQqog+ZmfBcnq7)sFwSBOdLCN%65d*6R2II1k8cN` z0=y@&AxhJR zf0+wTf7XhIo!p5=j_-LCFjpK3ru&1io(aA^Gv}{ovF4xl-D8)z`Ub%>6Uw*`=qWf* zx*?UV7bYVzvc27`rbvOVI$$16=R?cFjs3J5_+BXi-zUdeid+Oc2lSgdCO2?2msal# z4K9+a%U~W+ah*xmLD39Jt z0;>5v0?>QTbDj`I*a$r}&5>$?bKVg1`D6|Sbk`xPk0MxupB`2Sv26%pV5Y~KDfCTs zbaqy)9cZ>}A*p_C0O1TBid_T~=Rr6<7ty{vwm!7Nh&eU$)Qb5NPn;f7EeX#48yK3s z;c#QNfHC&l9mVC)iDdyzxyNQ;$gI*>lZ(!Bq}p%V`Sc1#JaP4@&;;fJtfDp-BLWXWM0t5&NCD7DgBxJmyn1f6vz4qR%BVxh~l*LMi`b}cWF59?%-bfWVg*h zA(aDLyU0&CA8}wGbItHRkwCTN;qxip7q370{54C2JX*ukkm|jK0_m)7ZAWL5hi<_yU9?hD*vwkiICRYNg&ksQEf|wZ;b<)uIJUD-v!H} z#eB}J%IIZf1SM&)W>YZ1YMK5pM@IeAKUk$DG)a0o{!%o|2YogkZZ2%iSxK=kip<@Z zup+aN#G+p`y@(B1nTgL(aH~Pj9GQ7i(;9ZvJF?Y26 z)Q=l(ej{*-SBl*i4n%J0F1B&xE#ktXYw{qmcNU7NKhMBAJ>gFzokMsxsH5-vsliVt z!I?4wRy!L?X&Jc&;^xVzJ`Z_pb%e#|>l}fn;!69A_ z3}i%@vG4U*OGh{^@%WsXMBpuE-DOBHaNj#B4*|^Vl6*clUo1msBkf`fc$Kmf&z*zA zK`#J4d=5)FxIdc*>lv!3eRNwY4Vz#=ojI((8eM?ga?$sn(YlelS-yt4xP1L4`m00V z=}P#g-eG@MD)GBIM@vvKn(-u(t~0qnSLPEat9K;qWE7nw&GJJrHA{SoN}}G9!+Jw9 z@9Qg^E}=5~vZZ^{9HAWSZg^(ikr{eUaAB?K{&r>mz~kx@Vy^T+g~dRs!!%Pd8T&0s zf_ZTSREs}&OcJ5ZY+qI)1fN)couXlxY|bt^Bk0xmJ6`?>vgbJt&fF9woSwd@zcr-mxVI%IJ83bLhlF93z!zmHG6;NM|H`{)nL6y=KNa@-!hD}o<`l-?l&2DuoQDaWEUc? zhotI5O;=hIfZ{11bP~4nx4MmqP9P~&71yM(bKYNohPRwgwlVznyd++?Gq!PFH*wmo zX|*s~^@x)v!Va%wnPOc7C#?xJC^{fCbJ+y5szkG@WHZ~kn^`7rcyx17b(<=EPn9vN z$;yM$5#UP$^prtRb(P!-z)U$3wRWzy;3Uh%AyP$MzkBXHr^A;*ba9h4k-i9Vn7es^ zCnvW&1)1%1X(9;gVw#=6NR0!zSA<6RF(-F0o~ zOZQobh&>`SR!ql}+9JUms%pe88Fz1g*C^mIERGtA6mgjoA5ajH1xIGyQlDN_E&n+A z9&8=2=@Tn-5uj6{a{-cK!g|f<%<2OX&gp+tEgiv2bWyVtQQ0Xgm8IgoH2ue5GHTa$ zSbez`d(xt$COMDlhSngrJwn4B)pQtMo|YGYx-{^nJ=8cM(lo};I<#Q0_oqekyWOdM zx3q^|zv*HI(rfNjamkca)yNB0tNZ_*l0^idK2Y;!o$S zyi!}g*973>ORms2u;KHMKU~n0*&Gdq>95Undt0phnA}j)f@UfnyjhO~8PYMf=B`qx zgGN|HogFA$$*0Wsjb8!wNwTgy#a&GHDiL;$e}Q9urD1;M%%JKLRr>e^c8kaT1fun0 zXxavXh8`yCo$F(=WpZhFE-wwkyeV8+G!KM&@wi(D&sDVVTx@D@Uk7+ ziunobRv}f8>PH>NyhVJOib-eC#jLi%3=;Kuk7ff&QZ*4(>!4In&S@iT9u~hLuz&M+ zQ;hhU=@h?#K_x1BnZwld8!+%EQyk8I5z4oD{XkZhT<395XGb* zf@NHNxBaC?`sArKySBb-_g=-N`drw@QcET-=q)@qEqErJpek+qsGCRB41+eqVlmAA zFar`Tm7?yLA!}Qi?e7hu>bk&8u(mobnH(YU|D#}Tveyil1 zWw5@=2Xc?FYg;_3aL}i}K?Zzs4RFJtM22;_pGEA#3hnz}K9l39nD#gb-@auK{9SvI z_Um9*T3CsnT3kki)>_}i*oM~D!IVbdPT$bXnC72v{Pjw$|1Y<^|B68Nk8|Vy^73}J z)--O`Rt-whj&pPf9cQXkJUvp@MS&oST8uzxJ%Z_U&JsJttJtD?k|J^Tw^!;TF5OeGE=%**&<%(ZSztpmRNoQ;0fFU{erNZDp1AGO>bF!dD}m&4SX4cL zYRv%mG3b}kg~10cA}S>^Nt+S`uI!_5bUxAf-^2_BIr5+s3H2K5E=j=ma&T@1h}a2> zLf_bPt2(qQ>K>1(5t(ZhQg)E!AA4;ef56;HeEx!6*fFNSp{U{)gJRMFo>Q~GutG3z zTgqM4kn12W(wsq>TV)?ckB4DYx)0d5t!kD3@SUpx61_G)M$Zspbd&jp7E!W2fbG+; z;}J6|V0ta9-L36gL6S&ZVs6=E>}%!Zq?(!Ug-uzkIR-i20V0PvT?SVDq zwI#Yf7Lic7JEH8#Z>@EBL?CW_uCZtaWA?TJDZSCY0b(mI)?+KKGvQ(P?)2wckn~bV z(bm|xf1K%{&;0FVIzOx&54c!Vt5z>dFbVwHCd>30aoy-Fy6lX3eY~pjaLm~ytM3$Q zvnmO{*11t*)*R^10qX;WrZ*dK{s#i&rN%{lJm1dG;Deqs*%z? zRDlAsp@Ov_G-sj+>}&#Sl8G+F#i|JX=r!oh~`Nhqphc z4Bn^{>$<~4vaTZQIUAlY$#|{|>9|9>w6qSb%hz&Zh8v{Q)I>6o@H)l4k}u#4PuK>g zqXZZ~wS!?9RJo^uS!`w={BjyN=ig)AS7V8jy1GxL26oB-+!R`C=Xd8qxsi{LS z<%P6OdqZ$li(TQ{xSQrS4r-g?HMi5+{0hiKZE)|kd5byawQEyN#DkjG55?YGc&LGE zH9bb{na|C+yM7f91UKEHO&hKLpm_buYYq6ZQ1j%g^G5x*5>W2{yUk?h@Z~76jWAm}(j5l?scs`mks z)PTwHsXFFa##zRF3EELw>T9W*30jFINh&d^NwI}7Fzh%rrMT3j6fNKc5a{Dx(B{8{ znFQuj-KJl^*YWG`|18Yp`}*`N-O&Cs-TW*6{I5h~WNc?;>;7eL`#%_vUvk#J-v4Jy zeM0rs2S*w8bJM7b!BqA zG4dA|m=M^FvVWLu*;8&9qIv?M6h*m8C{ zL9Lv*68nF$Nra{Isb7%AUvE>A%fTd~$m}>lnbK7x$x_;TBR%c`k(}@gKc=GK_4ZM4 z`H3#vrUVV49+@h-0n1vr0eq)O?4h$%N_nbwpvA3v=CC?bx*5gq$gkC5b!V?LetB!4 zX&?P^GMc#q-OP6G$R!wKP-Tdua36JoIRR7QKLqv;5*pNY#_&lGUpl#z^P81ApHKDHhsFL)rs3NrL}(%-VQvKXUc=g zrYCf!HgTa=pqfC}qf?2lf*+s|C5QAwt$VV=L0XlIn2$Q0&O@DR)eVf-Ryb(TR%~z~ zr$kLj7-@Jm?H-t&y_7O0S)Mmo#e0s-FtXQ`pC*pTGQ?-4#`~tCvn@3wJZz+w2|00s zHZr%p&ftdi3$cdiBcRnO+&3YqHP-Obaf^d-%@P3tpz@ipJLz_ijg)l1&8<<2r|Uvg z{M1MDYw;<^^LfJE`iu?KC{1q5*-aOegyj_}w>(NVh~LvUR^r{P8y&b*Y&<(2f`ipv zy!jd&*tg{5iEE0P^+Jf)Z1QZpqF8g@esc2k-NZ~NJLSFC$8ou4>0GD%_2K=<2$(`@*tV0(Y%iyU!9Jl??i_sWSqp#d_*qsrn}^RBiX^ zs*L@~zgrphR6*~pOD++(NkzIAhc~A2OYvgDiwuc93;|Q#0l7e!Xm~|A5@wrV{Rf71 zjT)_F8YAs)rP+~xkvfW_^v^-MiD_c4q6JIGy~psOJQF%qyCR3XroGMC>g@hva;ecE z1Iy;g+9nHf6&WmswiPILNh?2R_?W|r6Gm7C?COI=)M_TFA)#Fvx$i{s!p(w5M{Pp- zr0KlDvtd;0*p8W_RcfkXJekx(mWhcAi-V-IyGYTCjW!~fNey#pU+76Kht}kHNGciS z>_c*BlvGY=8h&V}gF2CNSn%eJ7KPnC@PW>fX1gsgqxRLN&PJDri3_06P?jlSV2pu0 z5*5@%E2#=L+*>ivmGJxnARP=z*AbebnN@js6LbJF6INb0ny7bk$@w`3BvG=}4IzAG zyLfBf+aRwTYy;cYIB{DJ2Z4>fv!Gli%~M`QGVY8lKO{kQ)zobaxcADW{k!d1kzM|FeXf+XW5JRlv-?_-!S)bcQl$?+ z{s|ecJMxXy`d1%7VKCVIs@;)QPemD4G{J3Mjm>vE)M>LwRdwp%>5G|og{So16)FiZ-~Q%crsiKWbMjQJT2)W2gI}$CJ=eOf`!0w9Z9K{DYv0QC z(B2GOd18<3C{44S*?4o9C#_laU6vw*U&#YVq6YQYVf<~3(%YyI#qc`Po` zKQuCy7AC@bI3N_e$?{{$7f}#U$(Qseb;hT~^N}aucqM=zvoXBU|yiCfrX%btn%lS_cFSid^^#Vl}A*~H|QTKiu4$5xCx2Oy6y}bAsY+#JMN2K}P(lDuDo_ zUAngS|Ndubmr%DP_U%Y)MEy@i`#*PQv-mdr7+72X->bI7|Gx1*2|2ZQH(V9Ge;ZS# zW-QzV-(|ZdWpqcGxZIDC1IeZ7U zGBA$1G?;p4eV^eABzM7y^NZl@c>3yKX$nQl>*=D)?dp@4Z~MCI+3VleHODrnJ>*yE zz@RzAh`k=fcg2OzTfCvdn*yjz-Le*+jX0Ag{GE#nENq?!sQD;}LAPM%nD4FyVR5F9 z_J)*YHW&gcu=Usi3=tQ~%j1+RvQ+~qSkn82fcV2Cl9NSP-q?9#JB{wrY;jgE*(e{v z5P2h*tiLLDD_FbBjd*gG=OP#^UL3LY=H`OR*#4^)uzKs{^E{N`M0B?F+;u<6mj6KZisBzG6=wG=la1RhQXQK|FXb+VeRhoA$)?!5r z>Au8hUCPkV)T8Z2p86GSc*hmqLIr4I!cqrcSM${?)yX&6a4l)nlSK-0rd8c}I$RO4 z#{)mi77eITv!=DF|88gtpZ*KZbVudmS4?}YW%Ff*m-Ps73NL3y>p1lgfWfC#<*B9< zt|riby*d6V(&cmRPSb-I5#bLop-m0;&t4(}%bkQ8#)3?Esaa?(0{)r|jSL(YQRH zM(CS-(74^?V`O!{5}!E&Vzl&siRwNrr_BOx-z&LqpI{is!JI_jFi&m9%9S|071rxVW3YG-F%=`W$q_!AzpejocUBLXJ| z0&W_wou;CF8ZRO7u;CCTx*Mprc8J@&DKYGPqEhw~nC5~biiu%UdG&s75=H_^~w8+rmaQQJ0cemEjCy;pC z7~;HPiEMjrCDF6ETs^;plJ80Ov;^xIWUPI^b?4Eve%01W8E|xHs)IGxRin)_3Gyj< z+;ykC^r(fYMw&*p3G;@U7c&qnv6ISqPVxr~er*Q{ZW3ODMho?$0Lv{Ek~LR>ixng|m}5 z&i6D`n$1}_$p(G&Bf;OhGr+GvF?*amee$2Y;XnPVIbNKl%d4_|P>(ep>bjEjA|>nW zuDX9X@Di_&FPF;_huK`T-sDA^E;nq(#>s~p`lg^^zt{M%h(k^0OA!9`Mjo5XjWWmY z@>jlQZE9i7vS!J$Xwvr2m2xpt@>xA#Wp;vjRs~-|tDHmFK(E+{jB`v57v-*xs$4Sv z(eX-YBfSAF`#<8iv)uB*Vso{)T-pa+&&f|AZrURd}-h z90Prz2m_H=bMVem(z)F5(Bp&6!Gl=D-uY_&%xYU9u#`$B$g|*{7igUl7%hBFVa%eQ z!!M`m1?Hy$!_uWeH!m#GNxZ!AO^Qgfc5|P-U2K8YEU(ScFwEK~9(i z{gvEw4H&({xSxt#Wi|o;b-9PiRv^Ibpa=*K%#xkrVd~82j;(5NZq( zXG3bTc5MxtIPRG_(v$p~*PE}Q-F@}ohB1E;O`j?Fpf!j%zWCg-{*3SGsT^SVB25tj z%Y72Ue>xpf1!{3*lLxp3dv*>G_28$bgfQUnVBl>3eF{UwuwB7z%4_n3Fk?GBM*T30 zFO^%M0GIa4H&%wBu)B5T}gfm>Lq1R z6*6#W^mytL|FudVSN7@QrQz64+5CUKBmRRTdjW_$MM(R`(1;+xcXeAC`xz{lGv5Dh zA94KQH)x3BtUyd1czV${D0fUjT4B^p)1B~ARIga9*`s6roJ5q9c&Nb@AN2#5FcL^q zqSQ6Nq+3Mz97c%QJ?(;*A`G=G4s#iQRmzUldk)5LGtrIN*A_H+uU@m4@Ssfv$A^SQ z2s@Hi-+4kD`K-a|L%B7lx>6upP(!a~(ua&gprZ`WceNZ{p4QspgkD$PIn&Bp~oY)k+{VBTjljArA)xf-STrco%r{NcoLgY;r4z<(^YAQE^>L z{AH>EwGC76%RvH16H1nccEF5!2vky?mjBAxsyd2@#vOS3w2+klqPBY38nL6XC9>26 z!9>dm#Z^go%oetROQE`&=ASUQ=PD(~>In)rljDNOq$>!#(y(bcQn;k`pwv*rIFtMVl4K*7)z0O`}@t9 zH!gt~s#d`N$(ST}sU69y@~dYm!kEPr1HlDE~=ZdpPNd#u{AyJ0ms8*PLhG$T)Kj^{{+vxxh|y*}Los9UaGa>BsWwB`{fe z0#wGeSHnF^KaS=8ySyT;pg-(TJ!zt|5h{_Lm&WVA8JDxHJu}&TuG7y*wMr#-_%F`V z1i3kc>eJEYX&*CnqQ^vPK7~4Kd@ z{D^hFAqjd`xw%{zlXoMY=^dS_Z(xd@%4-Dc4k>p_p7rti3zf2U>zz`?yPdLc=D1wz zJof?zmso-Mxx$z&Hcx1%1O^)MZ_co*+Zo{KO#8NBh(jRpUzD!e#=GsR4^JH0J%yBQe)G-pJA{;fedBhD zuT$)tiF!tdex&BDvz~U%cYGBe>^RjstySKbJlFY8+|UIb%Dx;js}_ek?CKNOB_2=m z4g~0aZ^$WpmO)mpywvzbdk!gl2K#b%Wy)WefiJA+GwQF6 z)c>mBiGvrMsQtDeaLV5T$Mu>7xK;ENU$?F8K~?lrUuoDmBlL`pf8Rk?f3OAKw&(Qp z{j0t6n{AXiw5$A}OX;b(b5s7R9p5Io(-wO8pm1@|vw!73BtRLZZ1xsTeo2q?TYaJU zP)hL=Wyq`gfKBm}VDT2Y)Kj{|N%@yG>}_?pUGd=+7$W>7aQIK*)vxA549EG#tKyNO zaC(OQE9!?g`Xn`H3seCN_-;6BRb6?%WsuGXwo3U6+UcULQV5;`dL}iqazaHUEq2cL z=xea@BY6>oN1XCVZ522{gowWIYJef8tOJw}R%N6?(_T4s=sKZZbUv4?;*hvX8`LDF zC2mb5(*tf*q|hl>Y~-!-fdW%Nq_+xMd7(VI$WM?y^aW5!Wu^qA?BE7ka;+gW73t=_ z^-)|V8T194o7{8*bQb6&jY|8f!esraQo~s4qxpMAmC2%O6IF*c`0iqv=aTe-NJo{) zGPfRT>S{xfz&$IdEo5cd;=;s85oOxaLP_)`SA~Jr^&POYHxM>I!pd@WK@qw!W?yxp z*y2K2bg2l#$F}VuW))hsAs7|hlE{=wbrbX|n@OVBmMA0nhCytV@277Lrl`y*@NOKR zZjN+mI)mWGp~hC(ZH^>YVO?JlpEE?~RlzkwKUdK;F*5Q{_O-ZH(Mzkylezonm09%9`m_ zaLG0cDjU3pW=*4w3H1p$QiQ-d?BgdrgBDKn`moW30Hcnr{9Rr}RRv^cn$^&0=`1{2 zX=r~N2RAu<99dqbtElNsi!6Z)t)b*Llz?ZW`<<<);AZ`rm9F7(I7AzI z{1h699JtioyTFeKaqrpx5M0zv{-K+AqN`}ywB!=z@3i6*P|gwkyBnTU0i$;4___Mt zi;OB>1Qs#+Z4*4)oVj{#{lMZrYnD+0B1oePd9*1pS;&H=S-7acWOT5>l$5-dBw61O zD#4hs5mB+(6ExS48Ojz1)a%PtB})WpM{y#3fd4`kYFpC-VLSEePQU+_S8q{ASdVIXpNR zrPxu5myvr~@(8aQc+mN};4L_jJRMU$ic8J>9*M!CA+9#1p4pQV2$gl{o)tV%Gvwfp zREmd}YF&%h^Y%@A%cx=JpF#d0W0N!iX%$O|~nLH8-yy(umWTY$Z!AK+?ksuL&0D zbDr5$vppnuNSPY_3w=yzStdJo#+lKVw95|^O%s>!Xcd4O-EkXSpT&3*S(ma5lv>Bu z9RHXS@V2pFo5{cs+z)=E+w6eG6kvxD;R594y~@kVm^LTEF`~q=yDzRs>V^$01l7U8 zcnRUOI`*#fJ7pzsR<~Y_O>0VM%vWLcXLl3sRB}-K7~G!RFMDS1p02unc@?lLCI{54 z1W&RfPR7709HKaJXVN6jY05Q)WUB{>iJOb~ttc>%KdeM|2XhwuLGdQcNV;3Ds=`Q` z20tP7z?mwi>ZYt;E-(U^WjUuecFY9OL^QFnx|1Z7vMV23y@#C$RIJF)UR#;VQK5f= zDbaw$16h%|3Owjftlyz|w45!xo#_I*AeX0ih~1H#00$vXU<$9LmH94yw6V z!cKy_uvt!3`}ePi&Pz~TB$<&LmE7kK=>h!nO0$n9^MF!J#YpZuVO6t(rcWEsR`5K5 z#jUiY?RcN;CL66t)Jpw#m$U;|vBGctn4az;1_f+BGjLw7ZYYoz##(~@QU32_)k(lT zc?j&PU0%RD5=j*PF|k5sylje0`B^FeM8`IYV)o=Y^OVwPbM^BMUWV?GZg)pClC^kH zOG}}QFf3je{^ZtUzp_b7Zv#|ZOHauQ4g>=88C&bY09`4wdy-4_46;^ZSy4%$m8B*fs}| zCS9#Q6&#t_YyA+oJN!6X(G9yCG%1r%%qa(y5Rz7p!Z@0iMmLH>r|%|6iOU@@RFXl( zU$6-$$JMgvxSIW2;#mZ022s1xOy;Ewf`Yj0se~C`z1YYK$TkLkzZ7BJi^wLvTj)Bf z6&9@Ri+ygK*$gsBfF4;`v;MS}=~>i1^gR$KQL@o{%bVV=|RSExT{-`+Jj~ZbO z7n;C~1(I>Gy4a2Mp4f^XDM9L61V`n0U9RAr<)E&sYsV#eCW6n&X|ZgD|2f221jx-ae%_ zA3Qa>klv+sS4>d)MqH1PAl3oRCebvX?LP(Ql@*b-tN!I;n=3()0{Q97Gk>nPtkV94 z11}z=2qw526;@H|J)eJIZ0bdsI?K9`8l|md97465g*DMPGPzx;SDy}vzOVd&ed8M` zvh;gpd9Y8AF}top!VE^D&su1Po|Gz#;9CsU)1UJix|{IH3n&JD@Qb#FFmBuqCmq8E z?uN{nhxd7W8Z3X!qywo|38Xc^BGITVHe%+U9F2CJ5U*|^RnW0Q0ZnjsPLDB!+szmZ zqL{lYRco_*_Z*>Jl;bRF1UEoNZwuIb5Nz92K9U;a)NF;)YtI&FqlHv`#mY(r^i78pE%kYFv`l8cl}gB|n7(C4O|l?|Pn;4hDHaIT4{32GfP`z!j8dNRl{jCV zPw`Sg5muf-iA|{eXmymv=F;$bgs}n1r!t1XnLAI71aujHIb9`3kx6$zznY!1!QHN+ zE%k3S2MIf=hcVkLCTo4&@$7D3N1t6b!)mHz=Yzh9c;tS*A@=Wjn+vq2(1=622Vu=h z9-^4n6$flBxsW`(5&b%@Yc%z1n`k%d5?&DM*s{VHn^|>k^el^w>`(5hGgrgX`lOYy z%(jFgpDf2866=61a%Q}(P*4d~s;cgxb4jRBDO9{YMCFY^{q!oPlbANpzH*vC1ANg| z`ZyX_;gX1~SL$M1y@Cin#Y;HXfZ?(m3+#?$ozi+d>oRg%11mO%su$G$GpTzf^$)&Z z?1BWP8>ocUS>6GnY1t#q^+SJW_n6Jm97GN)K_amzgVM zSF?jTd-P~MS7?ian}tbzvnI&i4r3;5CyZlKV|0IPbl?yi*g}G8=#$;y!m>!{o%eM- zi?16Z>18$s)YOM;Wj1J@7y(6Y?97-UT9*sYbZBW2TVNcKpLHLj1**?NusL9wjWaYrRT9$U5nJ?HVTyvI!GD7d5`% zDH`HE(cromKzi-E8VZ7UZt{D5RQYT-Nv`3g&H@eLy0dIclcw8*E2sn%Gk3ofpIaUlE@bzIOrXi zj5IKwB)nAif)bO{+rm6bp>RO}i1C@|mI|@;o4y_)ZU)&5mkh?Be>Rdoh?#x+R~S(? z#4?y;#&)Y__~bX}q|j>*6Q1N}*#%3C&vbY1;nTl^Z~@uEr6tmmw3m$q@{1V@lt`aD zOw@zTFlu)4X;S$jJcSRpJ|->(0ZnO*l`htw6$V|w$T-QMY8pLplQ&U zf5)BtFY^4L1VGrdFWDpxtWNkiDW(p|)5c-LE#M9u z-_xi}qTOtS4^J&&&)c)(7XXF;$Zpbla=fn)9n0Dh<1ZB0z3kTYKd zKE#av>Dv`j1VET68g8St7Xrm*84GZTY)L8$Jp_xYuW^7Yw;mkwX>AD+cDM(xA1?xN zTe!~;olQOx^#5pl7YF6`%w#?U6`2QC;`-#hA}_-~NQi6-Nh>CtS;g^}o-f#xTidk? zD4fjyYH53Pi@tRx*vzBJr>pE{5~GRiqnh)M%)2HJsHQRO!LYL_L_)s)j%S}wW_5rB zy4HDuI_ET~DbhqaYDlz-GVczYekX&i9tX%^ zN!5fYGJR_R51Va)TE$EZR{bv$0?lgm%qyXu>*tn9#dm=DIPM|T6dZa+{Jbp)zQ^02 z+KoOjWKKG|Ji*~ydz6M64m0aERmtQFwoxV`hpG({WD$dc8hPssIOgVK%BA*M%zc%F z1f_WL?4hzS#tl-ep6uqG$up*m*ZTL4nTq-O%4k&OpfH}}^;rBI4p(A3cpcAa#H-;B z7X8@oCdnB$ru#}5ICFX^Hrnu>&MgRBI54k1x{;YJ3FLYYJyM~2wd_NvoHAaB4|SL* zHcx%U53H`lT2?BOtR{ub5;Jv5#HIz(2Xl{)!SE>vTtNX9C?c868X19w>xqCWDy0;Q zw`R4Bz{TX#aX9CIVqV$7?k!@Am-|idZ*h>KPs>`ZJ)GOKypAz|915i|sGH)D$I&QBUPBx*@^AyvN+T(qgmjYS z5oWP3Nf=b4q^+{lHi{`A5Tthg`kCG9!({h}U6KDte!!?nM7(-Lssf?u^|P4PR4aum zlUWT*a`G44WxuEsgp|@zK~VW*abfi0*{&ql)%aQDTSMV^Cirl!@G0#wheiEXJZ@G> zaA3_)gmkfrK!og$m4Q>}io2|(;|s;A zHMdx?;%s1wgebyQvKC1z#Z1>Fq>FnI?ncM$cL(ZxOj&;Z@zh2YHh9toe6mS09fT!P zEqaZvN?Wd+qD?{dDB23#gnXlAR@kYXH%ky_6 zv2fGU-kNC1Pdxc>S>OJ85xrt}ov+15FCbo|F}@Xu&ZpTTY=P)K#cW5lPH64kHJBC8 zh}RPA#4C1-Z@7%zh#<%n16_F2+&cPf<7O|I`bV`I+j4wlcsI}(1n zTK_ggBH1KX>^^c5&e-W+WpanwkF9!c_N?;p<@;=Bf;IasnW;FIv_JB3#(FmmLMPty z`xmD~(-cRlN;Vqa_8Z}4i!Gz-+)}iDxlUSO0@ZVahhP-_RA~KU6Ql$p!^Ll;mqUNF z$pxa6CyuJQ^BG4hxVcuF8T{x++4*h;bb?Vy1V<&@gPWi~{&u(cah{CCe!M$kN!J$A z<=wo_-s1#1hTw<1LAFN;4pGEFsFjRX>LKu@aY+ zij*jsilc@%!yt%5mC~!kn%~umrAZTq;1kK1imG$hBzqp(4_}?b&1U_i`!X z1=rBYn-2354A!G4ZjSSh0J+`NuDW;gyyj7_qew!O3k8ykh%Gz$8FJ*Qtn3R17-8a3 z7c*!BdfDi!%R%~ST>f*DfFm^vD=CE+1|YWUePyhNME!R%VmC4H%;eH@Q3LeQyQQ6T4fw=Dg_c{Ix=?Sy0Nnrh5f*pjlXLp% zU_86)`-=?l-!6LDWJSj40& z#wLCy=G$xDf^(fE^Vzzy4Q*XjofqytcTeid%nMsT!|n=`x_)cJ0j2+9J$((D+5`DA zPLJdklvrL$R*6xqSzoyYe;T2xRcJY*b_Ed=87*u?uG(0a>B9lHLWcYbpPI=_#~qV{ z&?`IS$+S{m4GO-@k5L^Wq>qOSqni#zCl52y2MX0|2qi=(Y`|tc44&OLEo|NtO=F)N zI5PkP>{HNr0YtBYanU^Y@@I4WWhzI7*bgH@pil+w#?u4ZIeL(^LS6c9GCznb(Ovt( z3)lBg4$pU-AB-<)UD*q>A#7a{=931{W>@}P{7ME0ej(NAdocU*fzR(Mr~fE3ieoWA z$e!|z(xc@h4vR?^&$A=ciEKK4X*$AW6eeYQCG6tj{i7l~b|8!)(F#i{4}Q+YdGvkU z1Gz)DZrp1m@A-krit=|EoW6BW`O05Gq{E=eA5uS>y9P|OgU%ENuTm*Ie80)LudQpk z>7#?th$H%VN4f*=cq|y15oQ=0KtHH4+-vVj)FDpaNgitz6I)fSLkn#ZLb5`pjtXUz zy8#E&pGg^!M*f!-TbY(&AUDk@kLLFL+M%|}A=JtMf5Tt+7P z653S|cz9!%J;#B=3P@vg8Z_?TY`vsyXz=)17h<@Q#9D zA(=VeQ7JBK!$3_(fGZqMPWdX+*h%>IrewDg5q>e(!c)LNMrgD>b%#NNf6flOP+lNd zHVk~8rT$^M>EwR8ZDw_EjkAA=e|ly-U~j~wPF;}$o`@k0O^wvVF#DB#I>Qcr+WsX} zho0-6EwUb$=+%MK*vNy%w+H^T3)aH{Qdy8!vB^ygSD}pv7R`MmpJy*Jc7Wc zch@mR+wd&j${SkiTZUD$Up(hLM!#?y_EitkD-Q$X@IZzcphe&;>VTC*%@p50i+zzs za3$-IoFD6}HT^rZlKa04CtxfqO6w%!Glv_Re<&-k$? zzjz-;)OTF4pPYIvJz$9?)Pmrqb(fPGNYB{`M&4fImH(?2=O{_PGy$M0KeYx83nyc6 z8A$R3O!3L*q9a{|<%(aHI}eluHCSBasWUGza==vnvrwR4u z&5SZq^ukHU1OnsMt2Cw^iLGtP;zadlLbPb2bgRRfz1{k>YeKbXBBINUYxSgou0l$* z(uI@d=}Hi_R>CR`47m;U)s3`soaSZjMRX=fKge4b^78JLGMg}upkLwv?PTPpNCbi> zM&^@*(*W0YJ!@sEyh1M6;v((>Bl{5FncL2=RS<{+rL>wiYtUHlrSR>=XrG?O52JPE zep--kls4;F!Fzc$OaJY6h><>ZCA^ehkGKo?r12hBt?QUokT|v?HFjQnVb?exTzhO- z4rv}SzQnKgp|$Ej##BaNDhXm!WRzYO|FqZWP+NnkOrWXsC(oWQE$$=gr@#CI?)|~r z0*R+UBm9DQ!CPISDB}a(SpUHh`-WigP6CwX+n)p--Xq-ygpp`qYtqr+PFU|4xrWzS zb0)z1FJyqx8*(ZK{V7?N5`1KYT#>4!l>iX z7+S56I=7eAE3M)VUNJu4Ac$eljJPP*jjVz`F>?oY4P(^*R!4u&pxebzow&RZ=Z&O0 z3~Th%?fdX%g1t$h9gQ=cc*S-_Bp$ z1laI;+GJzAugR;wDoj+ir$s)rM}=Q};2c$gn*6rQ?_t-$UZ*m)E0^Vku;P!ok@K%O z5Ki3s6lWGmEx?#x!JFcw`8A%Qi;JP-SQnfN?mDGCx#;TyPNQ>N%viIl68_VtsIz|_ zEKh^)4S)DW{qW0(D(6NXd|f;Z%!#julvO`%tAnNQ{~UB+kO{SDlRNP!WR-1VIGerC z3P6!*Fc*0K17qb?&yMj$NX7_n@}}_gW1JmpC~jZ$*2p3wqnc+FKe2ljv{+sqsS4JxK?Spdfot z`^j-I-TgVdufy>`8{5~bu#O*y%J$Nh4k#m{VK5N?>s+l}dEbOezYe`WrQDtE?GMmE zl|5FqUKfy01YS#T{#o8Qj#T!!yPunR$(fEMc65VEp%KBW_+95a zScJ-CL$6v)u7XP5SYw(v;_S^HZTjz4^ag>}_t({jB7ftx7;j+O<$Nna87HwinxY9tF z#?=djif8ng|3=Gs7muEYy;ew_EqgcdPGo)6HM+Ao8gnacu!cEtxee;ZZaGkst?PR68me|Cox45T~ym@I_Bk@@$Klq2&?d_e#Z~R1r#)- zPPH0da5Q4s9eHk9x8*8(Nw$A4SZ0m++@2}U zVl^kRxeS{M=q=$Wr=(>Au1vXIfuGjJW*UIl;XAG-eTICnPiD<ioo3Ti<)&Kjz=0mhQV>`H} z^``L^??e0R2VWdtG!OnE#qIMe`xntR{rsz4a84dQ%%n=`8mqG9)U z=kOisCyBpp-X;6>^zPnv&%td2$w+D4Kei!Nzc{CFj1^6f2`*&7o=QZ|ylVHMNw<@@ zq26j!LPT_K7IjDT$}K3OFKsD}J#Q_N5>9gcGI7d!wg1edS9g&ugerUCJcnLcA{O$D z<_*Z-fsgJo5W(yALG3?sww!z{*xfr@zX}(VdPLC+Pl`ztws{56;ue-=Nb`oCDN`vJ zFujd_lwSy2s-%dnRscbtDVy85?`V0@c3-M`WoIsfLGCU+0_Mh@xJL)ZTwVHM&4(A9 zY{u7Q-RE+)Kn5O;(nhg%)PzD=bPm>lyLLaLa7)tMdZTT9<>4Uv=R{u#9~g{vPrlI2 z@2$z`CAB+rCh;3`P<57hCi&$?Klw+ zcZKVUWX${XPf$ipuP4^NXB+wYV^2e1lr|uieBmGx)Wy}w4E;FgePU`UF@ma*u(2XL z8)=JTlN4suU}>UT{wjGdSMN}hBQd%})mb-`fp|-NKG%o3dl1@yBp7i2VxT<8<0tzE zclMH2m*@v(^TExT;D=~-N3etYg{s}}7eMnf2qze{6&m&zS@jL5X06&Bbtf6CyP9#m zG*dWyFA`AfpdrDqE|~5unXz{Ck0=1xX+JnS6E-;%5bibG$3Xu+9C>+W zilMiQV?O&ujOPL4PgofF$i_9m;h|%baZ3l zAr&YcaypF6&yIFJ0_sRc0wu--qO9;^wGa>*PQ|D!9lUGEJc+F2K&My#I|ki`?SvaV zr2<82zDMlMqsas7-{R>cAa0={fi;FF$@RipmjPaf)Hu9 zh)`9LV_Wo%0vR#21(P!GiLYTQRvwvBrQ-Gp3anFEW+eXh(8_1L2Uym+Z1N(Dpyvma6;3^VEB0?2#bfMMTwuL?jZ zRz=KQc(31zA6Z4`t%&<--2Br4Ki)f)trvMw$qxlsu08PsU7l!+3H@w!kfA-wbSl+8 z?|N*@K_>fXbug?A}wv)V7hT()&7%Dvfcl+9I`_{dea`{Z?ns_wYOeB?zbr3BW zJOa1=o(&7bcCx>F(jEVR<_@KYn&cfd#bdk*wUB8GXD>~tyz3xA*^vv8L3+vio1i0U zib|l`1^Z6>Y*`l{n4(Up`y@qNG8tZ#Aub<|r#D)AKZ`!(sc?q`Dw_q(O*-UHHS|G) zIrp_oX=}q#FJOZ7mEZd~ch~yBO+xIG^m<1Ry_62jwr4hs zD%N3&&RJHo0z8`8@K%FdJIKcao(@D!kx_)C^dU-vhxYAlp!7&;{UV&EVZ9!w6m_BA zI;Pe+^E@|)55fDu^3UiIW&%> zM~_d8_WDf?&Sie-!1!8Z|11GQOJ|+2Zz#7G8E-&03R4hU?7M=EnZZeMI$CZ=oRzk??V7RR#FD5bstdw8s>t{@I%08 zOt8jM9^cV!w&>I0SQY1$-GY?kRy*SD8#}&PEOyTDr@CV}4(TbF@q{J*`^9_#o=&MN zxcSJTofUKp&{ZgLXyGO7A%uKpH@fq`wM|dpSNn?vws(TC1LjdH0Q4B9&=o^}6`f4j z4Z5*oBrrs>t1U>NeFb+5>flzE!mSj6pfxSG6UualG~jwAf~a1HTVS$4^sZ}&a%dg0 zpt>;bx1c&RhQUK|X<+p(c43ZE_Lr4%TVq%R87#{oz5Frfn^??})=WFllQS5G-INzx z4>iY&clTn?+h2Fyp7H{q`hr&cU@3mVY!m4YWZJ_ie(FJfP1rCY{AVVVGQ9>ygXB@A zg}kr;L-nF&4`0d5QzPEJqd0#{#u0<|1Ft^;Mn*R{mp=<#Z?O7>*z{ImnAp^yS2#*M zECRr8Q=$Y#xo6}MS4NhYuqP(`NdX7t7hoOIM;H>MBoVY5i9Sq89j$aBpKshNO$M9h zXzop=M?xeHH$&?V_bb$6!r){HzB_1DjoRwk_(`_3AfbwRwFfuV0C(ZIZql7@!oI;t zy#+b)n2<_nl zKuYV6S$VuyaL;NjN~bm*M&f$)O&4Z8 z>3IB#>KycE$OjXKU=T?YX_fi}$65=~NpMF$Fz*1^7Ay`!^;#{eaf6^)ccWjC&3*IH zRwombI@VBsfbTm3N90#iZ9!a4D@1RPMC{4GG%rL5TpJCFwZmxmTeawm$sPTQ8@((O z8?y#Pi*H=H^<&l>!eX>F(g(CsD411k#{cYAl%}xhjlYycAyQ*lLxJI$bXOXPX~_l2G)$Z$smA_7x2fwQ9?KF_I)3A)inBJw7j& z&==2WPwzj^^Js7q4+@iKmN_7{Y3b z1zuSu^dfH6`{rd;+d#3DiZ4uuK%W&5XjZ4l9pka{0Eq+S63=>W0CZy& z5+7ENh%jcLl&#v5C38r~!`A?d7f;{SL*cmK+Rp@RvOvj<)qplUYC$VFG+HpSNvePs zAnuf92ZJwePMTWen<|v6R4Qpc*;f7ty(&dmwZSc2S|o*@x7P7P95ZlAoZc9waO0*m z;dr>`qAtJQ?Ws=AwPww-8eOP}4{+p+o)M_kGN5XM=Xf&xzBmjsxb&smxvw(~Q6tJq zGk_=IbPp$pCHa{wfXQ%tpAdGxORp<1jNlv0L>UDu|2I0JnZ$Uon-PDNAzFe^i?T%K zFGg7(C0YobIebguU`}-DtukxK_aX4mnNn%m|8-nLzA8IL(T!em!=p}yi$GR|-hZL~ zQu`34P5uvDts;F`Rtlbdm?QYc?+*mBD@k|FKiIk|wE=F)R=XsJz~oMx9WN8i54BgY zkMfO4QRhc3UGZwzFmI3pLFRNTkg7Tu$3(Cb?JK)p5m_NR)t#c! zYK~(C>3(?07)OOd%Db`?2C$~rp3ckehSV$MG^BQj!U=6G_v?|2|iUESx46Wklufwfvt{(3s1 zFMl~0d&D=Q@Yu(2C@`Xg7aTT5%z(ja5p@e#ppNN>KBQC++FqiX{-NiAJ}TdzQgBNV zb2@%BJE&Vf=>=r76#-e!mTYev6v|IoFfQ>2KOjPV5l{8U)@t6F_r_wDwF7+lnen0u zSfbTnlx_k(#wF=N>p{($tZTu&=9zKpJ)SB(^|*1XwqFuPf#VAF{-k)%*5r`ech{({ z`RMpd*%d8S@7(O0 zZh139rpFUM2YBC2o|`kP#d{Ihx)6M?^Y>c8M`KvPEi3?aw@KbAa%Q1Xat9!u4#9JC z0*B@MZVe&hx+^p@K%_hq>_1}!lYCi#4u-Ec53mTptpq-+h5X*}|B}h-tgK3{F@O6e z;q^~iNTL6>7E<2P&eg)$#PKV`$^OfU|6fv~!oGCm?JrkneJLVe zsDIFIND+p?p*1VU*2E1k*;fAwtP2l6DW|feI-|mZO>5q8zVMmG)C>t`*H^c}yCYl% z**-g`Z*8B9wbm$_{ODl@Tn?9W@77G)DA~Pan`ErtrRf+_a3|Zmw8J_Uu9=GSxWL2J zCYxYa`zJ*2b{=K%ef^>0@i&`G4MQAK6yIqglbDQXv$KuE&FtKq>s*8Ljk`+Xtp^Kp zr}^u9vmqpe*FU}YMdHQO&J4yf#JYwQDo0>y$4XzC{NrcYzCrO7DnI{U4p96{Tut(4!eRO3ho6Bc!^ z1!7Fi)qfW4MF-2A7*AeUVqF?W?9TdSnMJlQbF#JZ^#|}1W7N+vj-O=Dsid{y?qb!h zBNdvrVLziB7hCy(eUIz$bU(oGc3~d%$Gd`Oq*4>9Kiwp>>5md+7pF@%rUZ#jI8b~(BHYuyz=ZXUJ z=0`4HIGc4nq>LL&Efap+1ZWX5rHQ+WR~tb^jqCucgy)|e{T=VS*hWt+_NCty_{VtP ze>PqDAJVtK#k)dwHuiS5CbrIB;Y+3#W-g8f&UTLfR=}y)$e{=z`l3rpNdbX*m(nYT zn^V%0`!XU4=3zk2!eFr??iK&8Z3tOjH@(t)LHPqfAyz=~`@tX1(T-CH7c1X0K(?8c zmgRG_nwHhc55eyTqTVwP`>G&rz!ZRoIw!un`>p6&ygWvUqKIKKR{Iv1Ueol1R@RPz z#JZIh5R6NYcpjyxQG(EMkzg_qNB6|ua@&B1jiRs!gPDw5N`+qS)J#=@Wf$JFM|JDk zf*pr-9WK8_Rz1>_+}H*yjJV3Qazh0-NL-2zwGrhqd#leu!PVX|N}B_Lb}r+g)-sz1 zb$~obWf!QriQ&c4O3NSzzNBT;ux?{!6CulY^fSsmG#S2z&xGjOLu4b@< z6*|CkXj2;_2{Sm;ZZ$r6+OJ^f=Sfz!9ryFl`c3oWlb6iW^T=d5MbOpA1&t|O6xRl2VnNsCdP{6;x_aT@ujdHKl@ftu_@Y6aor z9B5ufbpM+L`efu$*Bsx9T0M`r(c?@gA?z3b8cXWukX4JUuIC*Fu*_`cXHa&f&pn^q zQGB7D_{0G+|I9E0cgp!&^a10=TCNvtc_C6H)(+2*eLzQpGfMM}Rl)iQp+Nz6iI!_lqY3 z4kP>X%`fpQohMIFNv30b^5SA@f^T|$s`)CX8(6(33%1BfKXo*(z=tzJ<2Ut};0b;o z)pBj(v?lv!QZG+`34P*0RFpHr z?%M_uY|sO{cZwG7CD)SZuYz+LMu4O@f}Tvbj1 z>p!Zo6jr$N9qVXxqwLFKuL=G`9TLmdI}c6fg5aN)et#e$J}xcv<3-1RVM^@qh}x$g z(aFssib@b6hb@6s0$xb6&>W&KI7F^Wi6pvIUw|K95ru*VfZ|nNp(&YIU*Ti3xrK`q zH^rJ1*N3l%OYXqxl5}b5_7qui8&BZTE9vGfDKuqvBmwr4fW!K%dhANpPkQitLF+!3kZKb^YtuVOaWidyx2d!0$Bb_t;^rf{J;Gh{ssDt zs(-8NaZ?1-6+sTO6)7aBRV3%jw1YtVHaSXXt2%EzrQG+hpHTw`KoGpY z;RgZQCE8geBw#MaSL(CV_V?3j{odanalcjdTSH%(5g;U35L^?0DS>*Xpi44?ib`Is zQ04O_u)YqM6Iyuy`>@*T)}+US+8S$N97swoQ^2G(_gVC)wiaCdwmh?*;bT^MayJi* zSAfRb>lhK5JIiNw+&Ivklvbh zvfjFyb)cLS5!1`Y9jbKk4&%?}%~dzugcWfo4@aSCBzpk)w{h@M!C8&nyGrfPjO#a) z-Q!jRG*iIOn9Y7jEK%qBlfv zWrLPf6`@^{l_S`W*2nHsLhI_=3k~M0&bR*}0zBWF0Ax{BcHA+)haVU0VxeeP7$(D; z>(&ogEV~f{E3FE{&{Aw4XTxpq4dtPP&M?dt_)cUKRoAV^p^gt}2uFYX-avy|e{ii! zwjDKO(P~WKzc0bnGE|iDRKM(#ZuJ*)?gTps?a_yVq8#pJT9#X_i%FkAL9>ckzYKUe zJ;^qUUu?l^4nzTL=iye-7D$w%qQ2%rGJn)yKkAoR8xQu~a@*4X3WKNNPf)-KmfRnV z(y&P^et#&(#YfiZd#0sFd8}Mlk65di*9eAHMh0i+2GHD$Fsdr^P*F204fDvP!r5B4 z?9@ZvQ3Zu5m;%jt5oB0ZB9lPHK3R#B>2iyc>2@n<xyLXUuNNcj`#VTaprrN~CI}mEV1L!S(KdWh^jF?u(m!T{{d3mre`xvsKi4QW z3gfbU-%)u%#DU5Q_VT6Jp|P>qZCPwXtEd2sZC$iRxQa!S4foxVVK5lJKk!XDOoXJl zBU)oxk2jo{_`CJCztQceublsi`CtPDM~4T+icz{!{dGl4LC#Ku+g3k8fvXF3ub9>; z4>*TFIku#W>RGMfQNN7L#>7ePDMs5-SlnB3L8Pp#!~XeNLtquT-->$TDLFoBc`9`$ z>^qP(MWdVceXBIj{?G6BViJS4JAb_$CbnEDC@{M(8+f`#DKe#MRAX&R=t76`8FY9X zoZXcn^mJ=WV%IZzeLyWXfBw&b$)*q zdXvH30Q@mIPQ?6Wgxmt3yq{ix+ly^g4o+7)j@8M>-!3Q3j>kfzU*;3%U*G@SMMwA_ z;n&f`-p`_(fw8YLIr*76>Z}TDa{v-$;<8zI>zPir402Ou2HPI&h`+UKy&>}w$9hN$e2mFwtey|@DUye{+4 zMRd@8uCU|A`qZ#ti_rAGI*d4Ki4ovmB^t97?RAE6C0ZV_c!##0 zUz-h*{<-XSse8JeZB!Q_-i?CU##>akl0Vmj-+yznx^4dQu5ugVr(SaJ+`Bv~o=rMEt0fBO9d){JNKOr#bX%dY;e^j?8gGfO`OtJAee>A!V~Uzb}AW1vapo$2{09P)Z{&ZbO|4ltT;*3WxV)1FO}I?31_W-I!ekCHvo`) z6c^oWFF3po&`;%4?n@-B=Gn()Qpva0Y>EX1!zG`s-ba1Scdyt7R^$?8C?k$QaPj^r zfm=-KacTcM!@wD%hgr92;^^e)cM3u(O@B~yTOExARpZ?0(rSLo5UfF)F$`&D{#88R zOb(_`ABjoOsZ+5Ox?oiCdt7+c(7feE?ni)o$OY!B%6Cw#sGEtA6M&JHes_82Rs5to zHHQ?BeErik-{9z~N4iUCnlYS#_++6OFrze8G=g_DR%M8VH1aTd8xVA)&)ReJox}gkJl2hU^EeV6%aqX{_5TD1CK%890N>!nL&1C2CyZa@HBt1U{FkgNjm+U%Pb2nGOfciDD+63f^?S_ zA20awGT2i)I7ZbI#sW?;(8rR4OxlXe8D zlt?mDB6({cPyh9gz7b#>=qR?(?RUUtk+exw8!)!d&un>=H4Qu3@AIbt-rBh*&w!kn zD)7r@WBR@Ln2bUN&wk`)pb{@x{2HWp+*P^L6IY1gH3)ukuR;_14xj5MWAcTb@QzMPS+U7MoYlKMYJDp3QYzo6`2fOV*n zxbj13(yQ7lep$AL5y+6F0?uJ!9goxF#Dv?Cx7k$M%XyBTAILSMq{6*{bgw%qP-Npi z2^p$(6j9_Tymo)0brG8O)pu@3g^8WuL|dw7qHuMW-ipLq#WvDH&Q^C_w&uesJBel>Oq|7uu*{arKZ&Av_D%#WO7-rZ? ze?#__=&cJ!^DZ?+OBCv_2GF4C?RNQBt9TRF;_VRjt4sYE-i@2t*pGihmcENhw&u#H6?(!UjWA84Tb40XWywA%OISq} z;Za9D_#I@LFQ($`Hg`{|vFY`uG=DEz@#lt8=^qkMuM1JZ&7~Bvgwv(P1Cabw z)7K(elv#(y8i1BZwPJ?~(xh-U(z$54Fx; z-VSF;gES;9y-;$<$(}8yRK)Zawv9z`QEWOZuwIl{Ela2qiFuR@MWytSR7`D{4qahU zxbKX4;@p)OJF@R9<`GZl2p(O7j7u3rBrC}pVEM2m3IVfJW0YECkAa)$AHwyPTDz(d z4yAtnDVn2jLp}vr=xPf5r;7+AV0yOEPf=F2(M6A_<>IZ*&lGPin$tow-N>aI)~W$W z3UP_cqV7*R_2=K|<0H3B8tPwwwg~%AfF}E21vDEIX9HscX9IcxL#MCUc_ZilxA~I! z_o07bTBSOaxAGw7r(E6Y)9tNb-_Wn}AJqIwvBs;O4m4tLScuX;$QXe<`QlTIUFhBP z2v#gX$xzv<+DCvRu$8u`JmOdMgxF_-VaQG?I_(?Ldu<(Y=P`y?AS64_frbjDd%vXXo9eaG>_MG=Y9m7G`AkA$|yIuki#si+c_zv-|Gje@Cm`XEHTj|oF8&vYYHVT#g) zS+j~|2{X3@=?bP%t5m!rMykAZAvj5I)iZOAz17JB@^0vBLiz+bL7U#(Q@{e{WU(={ zuG-`L%Y9(5Tv853vwTT`GaiywXO?HhhOAPYNVdix!--uecN-uc60hJCyZHkxEEwEq zR^E{S3$8L;M6FKGqF~On%-%`GxgdOzay=(VNz)c$|G42NNtRtSJVda|7>nlws>i{v zrd4Lt0_UfBHB$r^4Ptpr=6DINN@}#)gWwx*QceW21dM|@12hPD`ZS$$ohlDNtDQ!# z4c%M zCQ}wX4yBLi&7kxo9V*A0`*)`7r9)7&{$`4q`x>L-DPZ3vcPUG+4e_Ekl%*CM2H3E4 z*VV{R{ShF<67dYxty46gpnUsHD2`GZ)1p^Ef>X3fmiMHaS#TB`23li+24U{uVhI}r zE%TPqqw_)DX1nXJW;N4&i~KpmxDSybX)i;9MH{X(m!nyP!nF8+X!MQ(BTPE8vQ_y2 zjX-7%6fjv_T5{w@7{SHsLjhd9UNtmtnc?NxULobnrpYr!X9{l)pZn{ZU4%N;6(wYj*!PP}s`AF-n zW$3Lj>~^gKR(Dn%~+f)GO!m4$E%_XJhr1 zt!-(y^p&HlI9z>gh1(q$>H9TteEyL5d6kLI_2&n_b zPn1%7{kF(>zmeD%^6A!7;QDYWb+FI58#{~2PjS*u>e5e%GuHR*2OCBcNpgzZ2;>eH zTV`C|UFQyn<=Zh9*CXh_hWG66t_kQoXZV%ml4)0K$e4RlUVT8>Ynn|}9Q&5E;}kQs zgciXdZP%epBJM7^BPFF%0UEWBl1g|o7&+#m(1}Zg=zG_&&5QFfi0B z7ew?wP)D71920~;07NjRw;0?|%KKF!qH7mnGcZc=!HeB_ZUaGV)$2ohQ$Yz{emTC@ z4|QzGvJ4Q!7SuLxfg;Zv`KsK-$h1ZF>+zl&+S6?*m2xoW!Fsc%IB!&wSp)i5wHr~> z#C9FPDa%nE*HxT9>t84G{ngv{pj~+;+w;R%rhC&B919&}cNAKOpfaW|cpE(n9tuyZ z@fh-0d~9-?Gg+Jf1u%ex=p>Q>bqPuykBOGU%#+1cF{3|C7g0KcGcx$&?XtOer<)h~ zdFoe3crYf9LWZecn|9>4merVpGE?Z9orTs84k3PjfWGUhOx>xj@z`M27JT1#Sn_zvD^q-t$`j?H<<)7K z%1)HKL{jRQw;y+W!-%_!iQWj+%5~;X=rD6vPzoF~yGYIb6C622W!Vt}C4+L9C-`f( zrG-O90x2my^@q)H`9RHvitxjzLf<6C7FduR3W`Y7zq))2YO9>ALGR=K59LpR#UN88BvNh&<&_zb1|+zgw(8yru_MXUc%D zRUsi39}&okV5qht;{Lf?ts26rN_f8_)JJ%;cz}z-RKDoJ91oFiU1KL~flzsaIo)J4 zqfeUu-G#nbH36d_s-(PA>5l!7W~^k_JjqBKVuZD2uphg?Es?YmS|n)TMcLXIe`Pp= zuVrPiAmKcsG4Mp^`(Up|szn^pD!l&+?aRp&7}gMG*9z$sEMK2)${AFvx!r=$Shx}( zvCHJA0bXn?kOk@WVd52p_Xz&6H3$1{5VPH`ru_T6iFz$%cir}t2fWHdOdiR_&BX0x z4`{boG!utW^77TFK2r)+2*V)zpj^J(X1L^b8e1dSp>NCxf&BSqIJDN0Dh;B6O1zl~ zL!}fnKWPR0t~D?px%MUfQ+fPhtFKFSNfHH1#;w(x+xKJ31rvsREA|I?L!k6h8|LJd z4>p_um3Xj?5K)(NVf50Veus*e^X0M0gRw2NKdQ1!Trqcjr zA6$)cj$yX?1mt2R7IR>hY`Af9i4v%n23CR_iw|@ zizC?W0J`c}t#9MTd{Hc3s}%M8LyuhP>#H4OtnJmi-})-!L8upbOik4A5{4?VKFM>Na%)h2iQHl*FNaZ$F;68O?^?4Jz2-3Pn1vAENoifgle5Q)y2 zFO@l4I90+KF!(48E+wkjJqlK6NVgS((30%9@y=p~kOw`@;FVn%fl$kZe-w^wjmO>v z|JU;TmjCTa@oP`F0{j1RH~a7C#s93EZB$uT{2J@?CJc~RC;vba=x{(HR3i$fz&O;T z@Yf6%JY6Tj>{lGMwR96g^V<`9{-pw)r}Ed9?`r*OU@9s=@pW!~e)Cv*`r!WPxY~~Y zo3y@&06@Y*5xR|GOF)+^P%Aa|$n~2WDkuZyfKIC{n1fu^lZhkOkF;;5nEo3LjczDsa3Nh1ZNqtz?%JVlBsi;}SkYXCcz*EoZ^j2gCEuS<}m z?h3p+?eGjrl+DF0Z#JDhZ_ZZ3Z$LrzS3Wf_Z~uk`z3vn6B!9+T>ShrIR#S;trfo*7<|fOSscMC#qCN<@l!>;k zk_hMr)zS5LPXra`eeZ8~RNxFHhL8cUK2cY#%1h9k29iC%LSl`KWqJe1AQ=j^G_&~t zBlq{}L?73(NRte5`JnouohA=k#dh z29MzM;jyHj?=@?pq{9AC^UIj}*W#pc#j*IkV0F9=86hc5-wCqyL-cb-9)6`*+mS}{ zX#?ZP^U^AF+F`KDa3#(7x$4kwS-+vN;o&wd8pW<1p=)gk`vC{gH!sa7I6 z7m`&5$`zaFN1xaoZgq(yp=r`N{FXaZrb{>B!8aGN|e#AN9qMaOy`(EWz6z``;$EcQj`n+%vR8s z#94kB@B$%^jUd5_TPOQysulC*e^HW;6Q*4RU0M`-LEsQ5i-08pC_5z$q%iagwU1b` z2_L|f-edo(>YOHN_g}xJr#b(~7*PIiuOa_!i2uJA-G7*_E^5MfD<39(=8Q^T8XuAU zymmx&z6SD;4!wnB;0gQ|r!N?LtxA(Jk!5U*XMp#;O!W-AP_;o>uu;`2N>f=`I*hR8|@Z5At(s_n+s(tt;P{yR19@=_~B5_xnP% zZ`z`rbQ}I|Xz#5sY#myG88=24{JwibdOP%+&(!aYJby%cx7%jJ_H9vjuMTdW=sH4j z#uohKubD9muEQ=ZuAj+1bBa^ZXQVt5wQr_#cCc=3C^0Y@{VwsaLvBeU}*Wkj+ zpHU}|axy@Q6FhE_k8vy9CT5;aTJo5~x+;Ql=BqZGX>s`}sEZ*}0Hb4G6oJ~d5|mU| zl}5LVE~98(2V+%WMw;XlL3N-&nOGKBBp0eY{!U3(mMewUHW4JlEadU>Mc~CI;E<>y% zKC2y+%u%YFUO0E^I)_$gUYdY~s(I8WyLv1cgoS2FRI=XKr2Z8#X=&q`X>Vafv!$Bv zVqW>%Q$~2bNX)9ioe6b8GvVDrx=bUZ-Vi>wK!pq<{k{NwCLSxd;fBj5Lp4D%xQ~_A zGrkyg3Qk05^d->$Hk=joEl>S>ibrlq7Z2KM#ju)1M*oJ=62NM)@9UJ}U6Zn2b-alL z6&z4z4xPlwkfcU8Q|Y0jqLYTaC53&XNlWs+UgLVrJ6dU)j1Z%gz50<;?Tf>$V3SHPHDI!LLU#^GfbqePsEfp-# zD#<2r$cm{dk+7^RvLw$fvIMb}+cZ6^a-#wrz=;iL*Hq`@Bb{1GrGolIz0+puNR2@W z>MsMc?AmD z2p41theE29EF$D7NBtX8VGxu0P~&b&BpJ`-9k6ZH%*!Pm;>ZNbgUF*}_dj&=HIse^ z)V8qebdhujMB`7mNw#c|t=kmi2A=kp?m}UBXc?8-_h3hnc4oM2g(&&6qff@oPJ6k8 z1C)YQFHop%ErwlGBd1(+H2pVlTP*Lv72DV`?<^In@nVMe>V9L0w7obAQ`U`ydsdmP z)CccoO{7`Xxp`6GB-=Q$6wbjp=L_m7o|1`Xy3VDjw58b+((t#3APSDBsU2qCC<@Yq zSiYQ<04jP6GaWiaM<+^Lojr{N?1FKG2A7UptFDDDrCe|CM1*O!7FF9sD%t>zSjC|lBlUq*HuX1c>&MAaZ1_DzgYZ@m;%W);1R=jQwlOKPaQ#BP*feky?0%9mo5z%at!0A_p7g9v z1iCz|x!MR8gpg8=yTRDYsfO{>k>-4j-EZqSpcgTXC)7A#T(d-~H!XIZgf`AP989n` zc4XqHJ#wQW&cJa?p9AwdCqY6!>8xFG`mE6#+fizWL70ScIC=Yak zHnYNLR;u-2bED7oodpZs*UaB2uaxqmx;B_|PS1z2`4Flagn1lSVw6qJw1_7dFifVy zd(*gGiFMuUGiF2g@5R{j5S?BV?UW`Nt9fo%z>yQ<@~8M~&}+uVbClkrlETEVPZIho z>2rOKmD2@vhYbWw%7k_0#|2lmPNS39XPXA_jj(;IBwWsc%vPj2WR4P(m{dmSqyd%k zeb=cX-jRDdR9i_OiBWZ`j0aJ5%hnwV0%Bi2!1HkO=N4yM2JhBRqSiGz(plx`uO(esG017y_b&muQ#scpeblQlF0_W5BI}1eLM?S2pR5nT%-4-DvLnJmcb2}4 zmX*8eMC2%@PiTeG*rLI^&MR0EWR0=!$!y_`T=so3A3d+{c0|S5?zQMLOC)QU{@=UC z&^(iCtRcI54-m1W4;`m`r$iu5J@{I((32XbP`M8BFf6#p_DnZ``zmX0y4UTwd#U1=+Rd6g`6W6g=fS@DG!CDLDNVO|6AjNAMCy0~J7RAM~B^hgN1}x?`tm z1u5-bTTs4o=Rl7usxJdVB5JA9>}`QO9kRDi9Uk?)F@`)6iBoHIyQZ!N!FaD-1!~>; zb>+2Kib^8llR_A35io9pl~d{oBb?%_T^v?PLEN&9g#;?4RBw~k+G5j9PR4VNv_Hoht>{y8W%mR#*0RZ+aXvn1yj}tq{is(THY8MzqOXgjO%gp zihYyI?L=U<2JD{+c8*Gv4toF^c~e`Pu$9WoOb#o6mkvm}-yq-5nU#-IX(nV6?pnMU zugux09Nn^~jUsmsPoppn&Mp$vFgd-jcKB!-3~Wr2s@pJJHqEcO!L1KQY!70iZi{Ky zifKl(ZgFr}vWwt|k*R#WH?J~XAS~KXiE~!^St0#yf;{R)!x>2fP~K-dd|6lbWEtK@jTJznt!G5WAqj@@-t) z0o(rl=B<62qm^pbywwbgYfZRoHK63;LNe{VehAO-)VBfr&o@147UYjb^pZ}QEkbW84P zq!?1nh7agN#Uk~)>n-<$y%L2g#V+{d98-T(JREyCnr)(U3!`>-3(P)sIge!H@K!{j z^_mLPMvrUtGwx;%ua1UF7A92{kx{|g)ef3#On{Ap2AicW@tMhpNGCK1@2q?^N`CE- zyj?CswgPFhw2I@nGHLT%S>mVGGiulPw~`hph?Z#sip3aY->!-M>gy2&)wA-BeFXPv zqZTZ?UugWo*uH`1*XT{VHmcX$D`EIf2cKa;=7d*F>kNm*H<3`MvPS$n>fj~$8!d`` z?E7mJ(aVVtmtETSKK_f2*nTX`>Cj@o&~#GiYIGmkK*NaDM=dQ+d#UoPA%S)%11=|)hn%PU zEo^9n$+HIqmWEy`A{y94_YkM~Dd>itP3|2h=EfO?AlUL_(lxEz&IrpL4^P>2C~yOcbUR&~jIV@CYJ$T6GpQ$xTNGSv3~(L(I_ zpsGq2=llT%7tu-GbHF}_zCd$4dzHSBZ=!}uAQ((0qEIq8c_4-cLB_1-1}M2PmJN_U z&IG=`{Nq=qZz}p?%9+$Az>|0v&6h zddQ(GWHN?j$DEQ20m}*=X?hmCUa}^V%2Bn!rCJYl(bEF<5-f)RbL z=Qqz;SLbU?LfdCg`^{5X*kkGYbrYwU5A#Mq5}Xku5YWC4=US8-cN5@>cj6OtiolCz zB86$L@cjw7g}{h7>Ex4qL$k-!1;4!`YBp(!8vF>M?#}JTiw67oNnHwTqdg~}_X(4h zTHgM>$>CkKg@dM0lP)Ql=?pIQd%Zp13+MjSAaHt&t7a%7Z66-qw%oX*JUKkApJm=w zj}LNBTLqIjKi$}5b=(HeROmgCCreh9kuP1o>7j{Hxo+tcy&8^cYy8wSUc14r30}K; z3-SKpCLoKaM-lIi=?33n;&gBW@nThoiHmHwO(w~@12y?L zH;2V#9^|6}4Si$hkgdhHiQ2rGZyXd;m&}=)YAQCI?VA)toG3{y_XgzwgsHA z?;~1MO?M_3FHCC(7G_}IUh~Q2nG$~Y!<|ZUrC6^$AlZ>wO4$``|QMLfUiGs zF0E2o50DLgeuKEvo#Gn40per1kGn~pOm4n6fmZZ3ZYYRhoHYNbRb*p7-T-I&F;Wv1 zbz!Elt{%*Uw?4jA7t?u2D4ict8;)nv?v9*s!f1WO9X(NmX;`q>%8&&+Gi{@K4Pv{i zqhY$un4X2Q4hBF`O7Ttu{kZBWr}&+T@5Js7R~ z&hM{1H?u#Cskg}AzD+az(@yt)nTYm3c^hJmb}sh+`;ObcNgJwKZYV0Ke`GU^*Nn}r zY+wWu(SyiNNq-ftVXrt+1~q^}$Ds?$C0KB!n(j>mg7JfW{-EbO(ZoWpOCC4-Qn87B zOc^^`D5lsX(|b*=nq6IGe*BiY9oFmq1HOZNi-q2gs19uespfe@R~1ajr)H>uTOn)@ zw@lpfGefe%vIR{P)XHFE2)9vFk*IK>4H;S6qs9Zcj>bc)Y&qycx4iZv7LF`QfDP_I0VF93$zTuDgY z)MukweE5166x^6Dg)Z^V)Ild%(is`RA6U~*342VdA-+CT_2Q4c>O8#>#{e$|m(=ma zoWM)Cu*8YfOeHCR)^(i}bev?hme9fj3wO*pT_|&7$On;erJQ%LK-p*<69Feo4MBuz zH|nq^eZHJxF8bMIFuzJO7GH1HYP`<4AzBB9ZX_1*D>*l~T5RBl&4pIgY$V4rBSB7^ zMbhsIhk4}(?;|}bC(S|evzTG;Nv&at4K+ihVFpp>Ofl_Y5T1p&UJNX})0Mua;9;)p zor-9BMq-9}iDVa^K~6Zm(`T#>SBPR~^mMmI7Dv<#bPG!{5&d^!G8hlTCUp(zboKOQBZJS>9FlSz|b(-r%Zdz0U6@u_bZg z65YX#-Y2p4s<8r;f+kf0&l5OAFb{2UH&6DSvIew5E0<3^qb>&q=po;QO)$3daZ0gv zV7DMTl7NvpCSCA1e*y&d0pI=C5bT#ivJccK5_=F_XgbSoYEcD8=B1UQo4i~t_sl?jzr^58oPMG&2Ai$EmF5rD-L7G``O!RT6w~|uS030vF@4zs0|&-n zz2Lv|ReZ7@@glt%%2g($!uw#oMm4}b{oPw`sH!+*d=TWI!=MGftc`wNuIjT~gY#N< z%Cp>qcLG=28*n`14lS_JTyqoMX)2e0&nej%pbiAC@4fo`qm&leEfTmmTdeJ|f)967 z3o<*S9F)|Lo!4PhbMr`kGAMFiPeAruXCNJyOF5KtR5};5Fn$(?_VsxmS+Gnmx7{;N zTZk~0fSZtdPSsF$n6AJ7fjYhHQP-xK)D0NyLm3ahFysIz5P}I@`Ki`5<8=YzE zv!8rXpNKqG#B|N|KI8#3+p@5iuZd<9#sumT?#cpp+w1q4#9xYLRFV|UnugzYE38I$ zHA%o|ZO+9|Reh|03vx^3G_cg!(WR_AQU%UWGGlG71|D-gz4|FNa|ZVM8y9J#9sThj zYSnCc&S(>5#kT#93!Gb6T$uw9354|WBy>ikzvF{XZjH!xMTBQ;`RvCPOEl%F@kBws z4;20Y2BP-!H@?KwQX^b6;mo|Bu?IBp+j3pS$01_hyjJdO_6(AGnTeLDkYJnFX>EXI zkzP{#5h#!d$&C)dUXrnqPSrJSM7;@U9!8L_r0ZPKSv7qmLlG*KJ4lVzpEZn_$G2dx zxy@h~1F-dkRnHh6Ylh^< zB55fH?H`5@D0_mP^2$SoFhUeLjhefB%`*g{16O5ujX9{!#8ijn@gpiJV4p`l^q!M* zwHi7S&UmChvP1cTmOg4VL6Fw8&n;$`_Lu#N5gO3IgOTS{=$I#dU2N5#j%T5zxTn4) zPUNRcp=;NLYSL*qdaZ6smHaD_23^Bs5Yzq3%+ki8wvszZ@|SV}(DD2#B$$E=_1PQSbHmwh2;Xy6#&T8o zejxlk%~mEtr1+ShpC4Z4?cARD^ZM~Y{)3Q5VJ2Dt%q*8R!BxvPMAIIkUoleLfj!g< zTCfGbuS9!T5Rh^n=qxLFLlCNrh=3`$;dqb0bIx#IBtu<&13X;?Ws_hBB}C2LNGX@5 z4=H^Xd|3c^HH;z|P{T|&oygQTmpTu2SKXL^JV%?hjwOv}tM@ia(rVlA8X_~3X~s;B z`Q9wt+u$%Hw14X+?rnFj|8NDS!Pm1(@NPWKlv%{Hn(zKC3~?KZobL7SZTq zkL#`!$yerUkTjn*$*P9qJ~ACh6`8?_Z7g1qG2&`Q*tx-g&JH!+HTJE99ZB59w$Qv@ zZGK@WwCg~B@|ucven|ioh&&_3XY@gLG+nhMeK5fir)5RrkIF^b^DZg5&aV$% z-6WU}tE7m=6zWWK7bLCGZ20D*YYK!)&`4tLhRT{-RF&1Eb61Bj@BhBnZo`W%GkiM= zeIWnon*IHMxn><~ES-()zYT2qP9_RQ->;k;zdiF(W)6-<)<*w09AlOIVOfIEM$T6 z;yZrJ;AJSxn8&{p{0jP{{nhE>;!LU*XXmiy;Am`owE1%Bg6|;u_5QT=^Qbp-A zlz(T;P`Io3pfIYA@=aY>b*XD$bmy4gvXbXF;el#XH-=r=Q*iM6L2|HJSyRDIZ4edJ zrt~=~tU3PK8p?nn?pYh@isa^lWK(%Yr;!?UhXNz3F;il+W?Wy*rlrtbSu-cJut=G5 z@>LzVz((Cj&kf4Hp8B;+yX=%C^9e_R=tQPoe>I9C+mXjXoSjFtS2t(*dcxdH+ZBe< zOufh@+b{Or*)ocbLQEpqh<{EmVch9EV9lNX=06aKD{ZEGnYGKMzl%T zwOxi36M$@Ff5jVdq}9N6o`16=6t@U=10h%B=NTfM%G*BJv-0>I&<+a zm};}(zQz+koI6i@5mx@LI@vt*E^bwe9Z2k@^dw2!tTftnvQmy{tvTNlu+c@IUm}C0 z?54KoMwXh^j2%T-BrS7V`HOBEqnO&?j;9<5b0cyO6K9YS)PwEl#usd{-j?b4M-^3w znL5~6OVWS`<~su4?ghSLsl^LHXkG>FYE;sIEYmY(6{Va={IePu-!MJXGijC4HFZa| zZg!H3(4;o$L!R+Vv+opZ#cfLw!4?%u$r*&|Jga}X5;N_j2AcZd?Adrel=bXw(uG;o zHBVmI3uvJmTmE^QtV=8A^N+2V0y11D_lt<=xsY)+}v!+cukJMWh+CBvvzbr1!*90}omv zyaj8!C0(T%N==X6Rx{eTK`D&)cn`g7TxDopiHv%~(7uZjHj3d%1CMhrJS>XMsFp*hg=9V$zhD|rso)IJn z(cge>`f}l8p5uLPd9i|lIWLDHdvqA9{5;Gu1^tGIBHga>2lx}j?2+Kb?t6H1EQ1t@ zI6xISNOxY%z+zReb$>EmwF94jVR*@Ug?#q4b`y2^8p;&vfq)3PGCzMpc=8nyUnkIW zM|q)ugBBBmz)OIv3i!snvBjJMr$!Rg_A zZZX4+zY+wbw?yUtYB?}P%s898Fx4g9ZTc(fY2A@ls0<^{6C_HxVn-D^pOUZKXTrOm zok8|u7B``rBE!p{26YlV>!B`U(*oX~-W;-QJ7D(5-hAlnjw7VL!68V+x6miHkYh60 zI=u>b=^X+vh!tp%ejETN$-AO!J zO}J+pjm2M86Uw66q!hZDLSE6^;v1^22+0|78{XT6q%1TK*RsHlHgX;Ug@_OoVj^K4 zJVeMo8e0rW5)UGYW6;zYLq@2*ahsc=MAt8Eb4$~Vlq;1VSXF?4$Ass?%>fY4&2bgt0^JNXqkRB;TaK zWk6a4w5_jm<&%n8oIDdvK&+<*tS&|hSo(K<0IRXQBND?;1Y7aqV&-{<6TEhhxSW=&5bE3Q z^sq2^5!omi278o;=WTnQQ~2xEZ*U*p)kW(052PS){I=7ji?VjlCzZuYozIU~4Io$! z)xV^siM3c(QjHD{?Cejr^~vcTt*z1NwuD?WY9U@L^gG^{?S}gJF|(2WJUk>jKMrwX z?NEkEct)V{;&Qk3tnp&)Fn%GiTzVKK@Y4(Z3<}_dl=syfkHV<>E&trYmQyM|9Z{|~ z|Ih?Y6SdxkcEyC$WZ~ZAprEU<;+$8OG;^Pl`)C0YRA?S$@@Upp%!Pcna0p{#Pbsdk zi&2G(&p@>2qh{89(pH3;**6wxk%fo6g3CrEzIbfn_K}7@uhpnJFH2%MtVm9~XeBAj z6{Y899-i6Iq2e(ERS%?qA+_SHnPZge*JcovEBrXW+e9cR8}~v|G0>bQrEp~+t#?rVHeh)F&fM=yl)qTxxWHQGnvC~E!cdRg&_B+ zp0v|2z`A?@sO1YUQJTvAD}ZMkht|ky*+TH`+!Y;US)H$s6@rRKa)M&;_|-rAohZ@Z zY1%X;I$Cfoqdoxc%M1YV9dau?f#LTKVJVM3Uui@z;kK&ItfOICRCYV1OMqVy7iC|Q zhC3@O570y2%OeQj0(~%5szEz|TGH$EgDRqGEfr|=gZ)M^h1)|if|5l^a^w<3dHV)| za#!}~YjM{~`c)G2`it&}5!7?rSj*IEV3WE+#bFSH)Ju|s`eP{AB1KcW;uNFs_>!Nb zjFVYHW%bQNW%br0Whq|sXy;(}OfR(<3om+g4#Q4W?ux5?Q(5NHoo4SZ=wfV)<1}>D zq%Stab$HUpxqC749!U4Xi;fTdS90rZ{-Rt?oZ_HR%nV}!D@ZwTdsQ|7qM=v-uG^q# z^}Ktd1pVZrlLxFjtF~|4tU1C&z=f>!^7`md`9bV%I7-MVs!wK~c)c1D<833Z(*KarNXtjPwp8rp*a$*fxJnr-Xs^B0@xiTlSB#F+sX{$s@cb5EcBq_RmZCqGE75p58jKn5xF^Op8~ea^2NN-tvfB=`3(D zI81?S(k!pOpXhSkq)N$t5L!YqB{V4l1WHNi0t`w?$pY3TQWAvp4UB>FxvwZw0b{p{ z6c{%~HbqV06-1EtG;OfgluH?Vik6Z+#Ve;dvbBI#-od1!7nF6n7ZiLFhJ?hodYMRj_GJ6OY9=(a7% zquHWzS-^u$Ah0z{Y95QWVGv=Vk>$}kcm%eq2x2_scAxrx3cx4wY{2h1bjt=)3o*0$ zoxp9J1RqL}*)n|&v9Tb=kUm4N*ZLniU|b3y{&=I*n-Vibwj&H2W2DC61IRyI?<-N&ZpM9O+e#J;?N$RIiiYlBi{%g0&1? za=b0BqbK}9p|TXMrwnxdvY&v+gq|RucuytMt}4@44)GVTvUjArE~MS`A_KWq%9>%d zOHPBzr^x%^D{(_zHeh3l(w(pT9%`J1e4jf)2!zpwX8FLMXTtESznS3Z-|I{Mp@`Dv zH<=0+;h*Zu|MP75zpXF-K^jm8cg0z3{G7H-1+2=~T4K^WF@lZ9S)~FEi4~31!Pt|G z|DlVeG_JrE4_9r!MbjYbfhL6&5a@xdC5*Yemm>{;2ttVuU_n9>+adKunM00`5%6=E znm9j~P#>rAq<6bId1G-noa#Kvy4!M)O>Nh4JIECU$|y@PYXS3Fu%(47bDaf$n@0Yo z2AH7Io5|V9`GfmF+IM$L9Cd?UKOtxj@v*!kS3@|7k(LNy8E@=00l-#Xh+LIh$hjZBPCo=ES2~ksFRnO3tIh53Q`HvgcEN$xP?S#GY|q#Oj~jC z=W3~Ni*tjbmXCjinK}|pE*_Jlk$1`_jZ@mE(p#1ZH2f`7EF4;jUAO;JZ5!F)09c(oQiRg1aU07RwJXCij&Ngc=(|{^=D=kEA1F3acXf!>L@e~ zma1}Qh6rAIfdB;CXetqlb(Si3O7+AKh}FWh_|C5(O`FZ1Rly$vj8 z*=qP5Og$%)_zKCqoO)vD8N3=ZHqaI^HQ`R&8JWXQj$~ZMXk9RGoW@{aG+!13OMBK_ zVP#>lI=9);8v1)OAa2NzD3cK>HByAf!hHqIi^sWmHdCqr3o?IQ3NfjHL=n&^l0Ca> zu=I$wH zinw6{hfmAVdZ9EcJ#EK0$eA$@{IdfHMOv=!F`KdsPn94u>b#kg=a=n`; zDa2@s(6tQBlEf7|UOryWG?a9Lb#=4S*u1lrb&3|1c2tJAYgTM-jyJJ9o5e+53#pxBx+rT&4FD`?Bzy+)Q+3oF%#yTC8 zgSL}8lhH$UZ~#HVYO~g`lBd4K*Rk(d@`(g<$p|^UczFUtp4ecaiJMs1j4g(x97oa- z`IKzbB%eEpGx2EO%t;%0Nm{n7GF)EFd z!;lo_qxP}_=+N<%n;Y?Q_l^g{FXMg#ym< z{)j6gbp>T0sdmmwvU_YS9nSWXSgwIWefZ zsk^$p&`1*xGLlMIp?LihH7*(!vB%c7xUE}FWPOfG#%xU@qPIMIWwQI}b7@Dx4Om`Z zh-3_aK$`ly){?y>QQBftamULq#EQ?zb<(N4^o*?H(6!I4d`|U{le{zOKdU#cq`u>1 ze4eoIyS==a6UO+IA>5OYXv~Qh;}J004iWt$zd1b8s3vT=gdMy{+%6&u=Rxt5cK>XQ zI6jKmGmH}DGp0%#s*t&msR#IyfG4d{J7;D~7{8_EXJiy;mO?qK<+n{rSKCphl#PvL+NxP81>HlgVIL=TW^H^_7K2Ovx~3W;Gj*BK0lZ{K2WEXR< zoNx59tIxK%F=Q|11~k%oHk+FiW}D1eLR=`Euk_n$(mbCwgjdbfVqX!lNWIneO zNVJ93=*M-a>xWtyJA#@lt^dh{t~XvXEIl^IZQfSFZQkpT8&m@=lK3i|$3DhNtXe$b zYSS)epG$`rC)dN(RH)EzPH?F`w-Pz}q^_%VRZ{U5X=k+}8Lpzsn@>NXwRfXVMvcWI z#uXc=DAPEGOcqpT8k)Xik#N0?!1#_u8P(jJ7C#M@9{Dpx8X7$=PsyjJ~|zXC0tJK zdG&6+Ux75PQJRSKF3Po#&+hqOViB606Z_QLteA@xE|7Ve^8z0D$ap%^VJ%P?qPxMkJ^j&_s(7!(1v`@?0e{Lu!t_h1 zpX(P4*hf8)WS{|RN5yDWl`D-N-O>r-TJ?PXeTpWpD2IszTzL;gb<_BY7#XG=Sc^&v zL!W(-fyQ1t(QF0fuLv>i%n(DbSgGh(yNjx7`owd|K@4_0ee3C=*Vhzg)nddKG5u|GVmVOqr?_boCyd2dRubuv1+90{=BSskmT6Df5<1H#*sco0KRhK1ZBFkCXe3z6@3(f7dNb`)>=)DIlu7o3X}1CDJxG- zmKXDQ*MW!{(y5%XKaH5N5%!EU)%WkRSg9=f>2KkWi#FTg4Q#H5I3%g7DKq3*ogI*w zTtc%k|D9Nz`WSPNy2Ic7z=53jx!#voR(ltT+AHpVD*7-z$tLsln=Cc{xq?Vhx&Q_d z=cBfvGQ3#A@h%-n@6QWD@o`kB2&sSbG=ct!XSz;ZX%k&v9b{$@N}!Gbg(`*_GnT=6 zwvJR}ErtYX>{Mk>L|H5}fem(%7sIID%tb3zs(LavJ#~EAD&*F#L+fcNRYhc`pwL@> zUxoffhc)BT-@l#vA-$mB;HU-~YGzXb%PAk2FEsi9k+cQ_rVe{hfjW>1tnM1@Cr!hX z1ra2PKS7b8CgS7dw1Xk@1xAXv7WuQ6S&`Csk$&^F;(4*ztSFMr`_nA0$Ok%!T-dq> zmkC1S#Huu<*v({UdlJp0BpQc#WYz`Dm7}H=)MV|6%}?g5!{tW70p(%Xl^yfYKn8p> z4Dtg*oYh<&>M$I?hvuw9XpP7+*VpP&o9N!oEsS&NmUfa4hWBUwG*yflc)T&STc*?S z;8ta~8BfuTgQty?ITP??`rk1ZJ08*yrx#=3h26~29L34hw<6McC1Rl4s%^zfTqYDY z8B>d=>!)3Mm(ZXol7foPSGZDt09X!uJrs&cl<4Z!R?vBK;;<$OLkjYW;7rZ z_iF%6Ma>eN@kv+lZ0!M8LmhhwPb4F@6i366#wwAgDs;L!O$>^n&n?2V;m?KZb4C63 z5uFQA!DKQqt9!t1BXXT-% zjOTz(ScqL)b|>^7b>ZY<4UBC20Gjd0ysR$EAqlIYj&uT$FSr*>m9!FT^(|7JKzv;3 zJF%U`w?A5r>-e9mWA{>$&`p8)P|5mQY_YbT0n;mHVtVz)>X#)UZ>1IHbZrgkMUQvc zkR{ynzY-`Tlu~bKO*cjuBN2`a^bE;Ep)I9~q!`PbEp$|DCCg{=&n6!av7ucaV!c7x zefo4d;E|%Ro0F7IWY34;nO&+j6Q&R8K~JXd(FGQTx?{@k*&{!r{E_$zSAGeIbLaLc zcd5P$=A)lvb6Mx|jlnCxN2VWPPLKc$geFaS14^OH!UW18$ffuD6LuF-zVpH}m8FM~ zrB}AzgFR5SL4+4;v>-S+ z^hBb4ux$*u&~HY${F!Fo%k=zC;yd!7j9!g&xp@G*I})-K{Y5SV&sBn-56AWGp>e$` z?1r1);s!f8;CDax0s8bOVzXZra2fS$W&CNKCg`?*OC`$|Hp(O@VBHS<3GESkd(WBR zk5;{HtO-IcPrmtEV82+&)2>Xo8-mM@*M?-t(;mo#cF}A_(j>$-k!K7gA0K;ehNx%B zv*V_!UfZ}Um%)HzScc~6{EPMB5>iin+o7H7Rq2dHkemRHAP zz#huEBJTtfuIx(rMr}wbGD=dFF-B~Zupmb)G|LvjA>0lL=;D(B-X42EeCIXIgTt00 zgkZ|_X^EZ_gz^AI6GY?RYl^Zn;GG_Wl2w1^K3`FJMRXW&@R}MKXbW%#_6k^Cc`XVY zuD`20GeBs|Cwd=14K=)f*9t$qf-jw86wsGIQ#6StKsyy7J-s6RkFfix&N{$Vm0zFo zvPpTYAc`fIpBbi(W0EDo?Toc-F~+&j;C5+Z%^;j6k_T;tc(o`b_uUaqA;w=C>HIP} z!AbSB26#>AD}EdyJ>tH`U2{Yu`fs%_oQWZn++X%utNL|PBpQ{N*3{zlK>?RjU0IwL z6SBD1z#FN=+iITp)+2EY>9?UX2hT3Z*OnEf8S(ibpr3CA-wCDO!XcVB0`TDAb{pRc zTSv{UC)ul4uf&Qu%QFRUv*g7t2esI=&?{J_7XFkNIi6~71Mr&jp|)j2o^fU>P?fbBExCe zZvn?6EvZms%UNw3p3Unxr@TqX2doZ%{l*xsX@7$dJk1|GkLC@F<}Yqd@sHj^hLFcJ zzZUm|;!lfoduHJUiEMVmy)?f3@gBwr2!G3&^GXSSbL$R1);oLw%FmzokhkevJO*=S z_IE|#H$tYuEC^1K__M&^mjyLpa;g`Q0KSsyjTU{qUL4!!og~p8W6zAeN_-xXWdw`Y zf3#gpHW)sAr;$h}2ce@Ijf^lIdnYQz`58hvjL&HFMx5I*VdTd&;`vdTfvWK~w z68e*PE*N5Z>o2aU2wz+a61N@eT}KpP?}6tETkR|T&!Nlq84g@mw8jmM@dm^QG`}9M`>@eF zit&?@_yJnvIeEH2+sw$Uq(dZ;0*>2=1G4quZH~``VGA1#G3uLrml-E$N-Edq)rp? z_fuf9NG*j4e@dM2t@;A;GnFUW11s3FO(1-CL_w;-&(|Pgxh2FBDWXJLSX9K~3Do~s zFk1uhNgPH=y4vALy`E^KeyCv%8yI$72O)PX!(BN-b~oAnu3B0-?m#R7a5seY{l0pZ zmoZ8Fnk)g~sFra>k{Lyk7eyUp=g7byD{-oa`suCZQsw{4%8!uqs~f{n-CbW|LjpCC zq%Yf*?gmO!>WA}TJT)7|2+XcSRk;)mS%z+i>bx}~{)z907=SB=5dvP@C_|ki*dI1+ z-!)5U`-7?E`RrcL@$M|E4XOCo&}Jix=BZHTgMga+(QR9ut$2$i(0UL8`tW+WtwmlH zkLD)_5$FCm^jpAqaLhf!#=#B~_JLP0uR4K@S&JcrSL?ARS!RW}Eb3TV!m8>PJ)F0P zXd?p7;h35lEe=#N998cR;dPf|$S7Y4Q+%q^u?mg`1HBeY1n#HseU)cw=w$bx8Twte zi{z0})ZNUKUlG(?Xi(+m;&>d^o!&kiuIzgq*(_9g*v+b6l+Njp6+Pb&E4Hz-+L*}; zuMWIw19a-CCX{Ih0kdW=*zt-cCTCI7iX~n^=UPUIKk>Wnyc0; zI#UnfZbjR>#|kTWvh|rzk&vYhW}1pCI0fx?Pn1U#lKWZX#=u*{TrHDBd&d6I0nfp7 zyO!EjiTFt;w6XyTk_&&izTcC&^6>nv@fo6V*IM2G&6L()A*$F6B&#^GKo0!HlsUgC zP~!MIBSrG$57RNqX~D7_I&CqYdH!>W&^@{9)aY*a$lCa3%M9b-5*GE7TKx!P@L>4H zz%aF$SW0{VHR+cI#v|+wmH4M6_xBHptpa9*iCQfGLhA`9Yl{?BPgI01`RDIZ>g~;K zhBa-jO4wxKSBi#56$t3|n->0mKK%RV^ceeplluId@JCh8{u_w)f0X`ICTM-9$DjmlQ6?rS@CyCD zK}HEgGhz+E0P#&BV+{g>U_EeO!CN1^ux942bl>y2?Mrdpfxi~ToVHwULLsR<(4U&h z;JnLlIh>fP-s1BHcJ)1?9Eip3hgd>#P3x)uxdbYr)vZ8CTBCWbJXrU^q-;c7b4us6 z8=dOZ5vB~0-^Ag)euL9VTvN9;?I$HpkhO>5Tk5wr>z(f`aGJ?ux5}(|ZFQ1VU_ZfO zKjgFs`O{gTtwOS0LPeTww7y_&%EQb;QhvK#T4AYH36GqcX)nmxvwHhyT8Esex?+xw zsN|YGJ=iC##pr`T>-fh2^aNNMAb6~q62e}2n3nqXXIx#TTTsVs>kH*@JwPOt3z+;p zE&r}-jl5Lq*W)YF##IqgP*v%~`rB_OndGRs1K#z+g(Iwox&@_%53U2OFxFGSZnEn# zKGfnmN?KKWK)AY{a9_qUupqM$FFP&6W}=*K9oa9n6Rt=*VJFo!B?Cg>yC1EFXGo=g z!!uO9FGBP>to^Eik*#neyERvHwUFj5M;V%V6i|%epEB-`4GN6*_z-|g^S0#J4saC{ z-@ZDw&kn`r#rh-+P#}FT^t{o1Ph>*jWMoDYbnD@Fg-c==r648WCkA?5{%TB6?2}VW zevk~U6uBmt_(XJA*cN8%Obq4-2Nnq_lW{+08V(&lKYCttsC(~A=tDIP7~G94wJe|T|uh+aRK+3aAq|${QSNGz#)>Px4QDaaWG*2h=URR zM=9JlJJj02*v8)Kzd)iYM)nThS~#Wu{6O#DlyUz$wdhn`cR*Ig_{wySmyQRODAYwE z)eUR_MYGY23u~B3k{By2^#z6^A7#^$a_+w@lIz(0_}qu?;_f&-ZcrS54q^U;oqFEZ z+3}Cs5_gV|30eu?b9ATMdbwPltoHf3XZ~w)ZG^zhfYS#d0>VN0SWBQiM2Q(n@Q#se z#}xuJ#C=UN6<~{Y^m9rGLR<>$21}?h?YUB9cmq@uIqT~TGbJ^A)7~~Yeue2}c?9sUzt+c7@zj#|B_7^Nh2 zN|Z|A307cp{j6ewi{Gs4B5SbfNt%1`g!|6st8UOFY9|f%B7u+YBp4p4Z|_bzW+jFF zRFYj}E^+A*%w+;ioa2?xWXr?KEQ=a9vtfckVj1g@ZDXSFq`;m6RM5CEOCpw38Yy*t zVbEp%%=7)z2JK5?`oRE}v7P$z zy<`^G*(}CP6;BuaWEfF?$a*O2?V<=y(B|u)2zJztz-Ck!eX(9{SJfda&?`uTX4Y4m zl7gf9w8Cw#6e!-FU?uR{kafs<#NmjR2SoYn*xxT0*$kFZQX0mD3iCWfdy1ghy(G6| z8m+VodKAw%I&z-+v2oJ&)K@R9Au^bP;BiLnY|JoK?U~Hy=sZj;QpT>MD&cMyWL9p> z$;3O#YXPa)Y(lXnnEKR6r+!$4q|57R=%!{Pt}0@HGBluh~Qx zqUP8z8;arkGV$w*FP5!pzyrGYz1(EI6y!>p$)Qm zTA-TGPvHi}jo!m5XD$htyK4ad5z@Qj2Xu_VoR;Muf!~^3`U+do5J81r9_Wa1Gx$kp zxeff5*c7W?G>7nSmj)gy?9q`=wT0E5*DKa}s$cXF%9o5jTRdFowQ3MwZ0FTbUtsl; z$7$+4#6Q=Fegm{L%pl*)Qiq#Tq`vF#W&ZRa^f)lNl;nXCVszr@*oX_FH_(OM6@Li) zc=*a@Q2Q}rvyuL{izmsh@AGO55rM8N0xnF7`%w{w%J-&d~AqwK09mEx)m3cJSzS;5B=*x1|KqMpKOCk6mjsbRsyq zlw@)Z;z+vG0w4!8e#`vJw}WV+focAI8m$BWPYusM6Qlood;br{*MG^H{>S$IKWrt9 zDjGJ}-#VwEWJ@~9d9u!#xF9fvnzI6HNkQ?l0&n_GVa5 z)9onVb}(Kf4zgcc>PetqP2`!Ub!Ul%Hmx$s+q##zo+R_ETXplC<)#6;0hM*nSN#gklH zQgtLyd6|;ONXu;>eS0I6Hdt1LE<+kv?->UE$eoHf11KmjdkZZm4zOusH8Ee5H-5v< zsjRjPcZqzU)u4gSm1Ya-Oir)iRXdD{>)>Eok1>{jqY%q{8R{_N6TZ%@@s)U-7 zc9`x~nTQ%FKZl+sw6{$yyepNlIGbw1Bepih*$lR`eBXfiE{&|7_FQ$$X5+FQWEPW~ zXs>lma2_vLddM}CjJM{?^xG|r4j3G|-h2R8)Vkp7b54^z#T$>|)|1pFn35*S_T-Dl z6*54`cIJ8$w{n!1Z6s0HX;%!{$Ooi7id{5=Xm~HSYD9^M)q*?bJFV zi$%vlmGU-4?M0_QyC01~BTY%ldX>86jz+>N%I;Nm5SD1Z?_HCoN_qhF5$j}~UdU}$ zBXrP4HW1`?h8UL*%;rOs^o8co%Es3I^!qapZ*-inUKuN<+D4~z7#vetTi~E88MiD$ zN?DT2qcvutcu(I5N==1NRt*(5l6&$vX=Y$T^82RH<6tT`wZlF<>)Ai|zs4zz)a&dN zMR3O{%NEnefkly~%SqhCk7w4k@d32RSSwdIVZ`CWyN#!!gykCj9&d=NPaO#mDGF|l zr{FH6Y2lo`vebcX+%PwXE71^edl0TTXRp1VMw_(698nzIYAP#ma&gA=E5p<8z&DBv zMlqGGlmq1)gP$Z@QNNi6oI}RG>lvd>vixH!GaoV12kb2D0MRqTsCk`K;Y-EIW4to&!^yl1m-j5cV#o(DpW=9NBc*3X|Gn$ZNGN}(Iwvg&i zu3^@YpE^f&zHFON{uRS?_EPbj2muZeN%ZnAJV0B$wTvBFI^B{BdWco@J?t6yCfQJC z`=VzgG7&*IBQ&gazW(wG&mPoW=%rjCReuE{lw?3rSpF)B5uz%Hf%c^98JBtmuBrB8 z=p2ss=fYjC1BRaEF!n~W^m#CWHo|Vu7Sz^Kk0vxBSjV3LJ@bkG8XW z7%KA5PRRe>QKj@8jU4_87evP^NyKEGAd8XIl@Wx; zGoN9sCX5z^el1Zqr_}rzP=;rwdc3Am(#POt?*Q}bYy+9lsq%OMP&blZ zrdx%(h-yQr!u4tw`s%3H#G*q(dL0=>PC-&rVgM=Y_A0aCVMa1OTrQg< z<&=^|yNKN1xTxSnt47rkxtAdFwF^P@`o|=Qqti=VISbs5ppe&rkC|x3p}r4EeK18o zoId>xMJ6UTfZvm82_G};C2w>2Sp7`a(0TTQj2UIUzZJq1Z`~hl@CqX(qBE$gh%KA^ zhR%JfgGjKmB^vV;fb~ErjT}ggF(mqo!MHz?EqhG~h<*86)YcwWAlo2@r$cVC05ECc z$6yz1URYzOq->s>G3^j<5`iFp};7H z{jJ7x|wT~H3VE9C5=z;*eEAKD+-NZb{rNyQj^uNvUbvVli_}^Pn+&{*G z{J+ld3PzSjdJg}sUH>0V-oIw}MpZ3UWKj%nwx38zq(UgP>K5i!puk0FRxfdAFLPKm zq<@7go#G;DSVo5cuwzE_uf*@5oyXFhu?C#Qn@`>M^!N9vlg7RwBceMv#wJ^-ZdpfO zN0}~cK3{J~IzUystx*msA^LToiYZHW(9KR6gUyH=p+uGWkj&m}f1~oOP#nmV3tE}A-Y2+0CvN{mblV2%ve~Q#|8FXZcD5mw`BpoAaCQ=lxC6lDo zYd=Jebx^FLm6$>vrz<)%N{)`Fvx zYDuVUH!VyhLQ$p}-?ZA}9MCO{%%&&Y;J3dSy&la( z%W+1fa1aj>%C!#mV@jg$yIFznVZhASgj4k~Q_@A`!%XprJZuCpkp$oIsAk)c7)i06 z8P{XoxB<>f_Qe$vl=vt=VUy7%$_`01sbiC?8p1p3kS@cdR+POUeV`LkP(jF4VBcZz zIwlwwtYP!PuZ_`xK!gnwl^%l_^?L-=`g`=AR(ljP*mbFkaa+Ks{w&&_>Dt<4SE>I@ zm|+E(j#*@I-XHhL#xPLJ0zu61caI3a;+vY-H)?f?l5x67d%JPR?vC4^52Lt7Iz3)% z+O>98F2l0RJ{a8E1A0p~po?}wf3J#yaqhGNsLp;Tm2=K@wswL!o&y(=HK~kEgjBlK zgA;rCFsf>>5#x%|jDzGadqKIDAF5iOrIz8~xrdJ&HPZ$9b~;}G9<+ZnD(^Aappnu) z6Tw%@923w?7VTyKxKd1~%>O>D6@QODsnb}k2Av}x7=9nLg*&Z=OeT`Iw9JtxXWe>dteYRcY5!s;0OvK1lDPJNWSWyNCY5O@YH@`&^5te)XO zv4(dF`lV=zEG>BvyAPIU6PLNOYzpT)-L*V}eT~f()R)eXw6L#|#*W}|7bnEH(Zl{e zIlnEART#kh43mA!7m*&KD247(@MKh`&F;>Vi%BvoX`)mOuNo2ywV_~;?I6{<2$E@q z-&%##nJu>5Y7Ml^AoeJK3m<<5cDT}h8b~OVK<2p(biF4{oxs}_%IjV-;v z;|8J0Z%q*wc3}v(kx|wlq($B{w7TTc&%{cXoBs?&opCZ1L`nHT{lF6SwPlzU^ygqZ$x;!smIYB*(52h6Z?5P`nP%>6r$MKQ=xDxBh~R@C8y-@qOmaJbPWAA%jIm> zKr1}uu7$Oj@*GDtR5jxZROSOos%a%Ws;`fBi@m&OTg!_xeBQ zB)k)H^6U@wD@^FIkJ_s!wN1xc$Gb7C_7NJQ( zEHqrqzOwizg+D!WPZ*MH)~oBTJx(QQWu~udxLj-?S)!(7l1ikvcxL8?To?8OYNIb$3i=SIs1;dM+e8Y;wc=W3fDXKM^1bb%n16sNAX_1!wPgbmd zt(IOyoz9^V7YMtUj)r(n({fF0ib>>@PKrG~HwK`cE`Bgp%0|C67GRz%2^4KfncpZi z$40zx@2V3mTBKyYpiV|$*rjoe7p>}&G@nosuZgaPw%HZ19g&rXXV`=nJbQa)6=X3e zAkK?DuAi@;7cS1Zsb*(M&654#2WiSqsYtOl*PC2;2i3c1B^^(0xUX~45tH5Da5^f4 zpy5SC5A{-r#w@a?4mtkW>E3V_p{_Jkq8r@989yYbJ2evWM1CvZt($Oo)5q5p$EuXS zvNBUT79}RD$viJ!=BCR8$$+X+l)z0K=UPuwYpS$8hkU0;6$U8P)Pk%?(;YgbRv`QK z#pnVO?zG8d8F9`o4#^mwc8G8x9!(|ku%Asc-R$da>lk^BF9oC^SNpn`Mn}$tl&1Pi$ zBPR20`Uqb({gc~eaRq>>w@?*X`KD=o8B2D-v(SF9GhODwtGioBz0)@-A3a4fVRx8^ zjJ?^mbb;9o%t}X$6GO2rgjg$A{u2Rk(}t|%J_#}1g{jGnZc0(J3t8mMuMA5>kG($@XWKUHL^N=u*Fx`=C>>^BS)$*!sz zPTQ%vg0I@IK~VV;o`(u+`TFjtUTahbqi^Ev5J$8h!w@L$OP;Aei*~ORHu$b( zo2Eoc&vhmMQMz|aQPLV*TF=d4=-2qC20M_1W14xIsBk>gGc&WPZVX2LJ*@cB55CORMbAw8pHK){a6-#ZRHlVpLq(XVTP4RWs*{g zgN}@Xy570(Ttu}(O7tj%HYy+Q^P6~Z^ji&-Xp)6WmVL&`O5v#kaqL#fCGvwbjOiCn zx2k%+hsb)?o0EG&_0jROOlY01-A2Tr1zhJAAU2=enA(puPJ;lg9lsBSUtE|k2RS-P zOL-j)i%Y1Pzcrk%W>;rvLtBqm1s=O6f_qD#?MD6W)VX?vs8&!auq9awB?AH~wPXt$ z@VxrwL;>csRa2VU=9W_- zvsyqa=b>o(`*O_sR3ciemKbbXw?O)wXH1gY$QV-qt)shbO|jt0C%iT0bLCR7^C^kw9XI>X|_g9=_F5NDn0Tn9&^jnVMqA2bKfGOI;e4Wwm( zD~VJ1e5}#!3P>Y`!*6MxIWnM|ENe`GYm8gozzZ{}qf4S} z>O($$iB(C|K)a9r1@$mar6XjYA;<|Ix^jmVWkz!_dA5IORFyZ%$v30Ch}Dhs6en`* z9ufLvm|WFfJwH{HSZ#Ic+cb~t>^Uq-C-wT&2DziPcb&^SUPzA`yg9;Zj7|?3uEjW+ zLHbEzd3iap;_tK4kb7`txcy-gR124qeZ?7P9?ujg0-L9_^=ZHqXu%}S-5#lJN}Q*E zSJS7bJ6ZQJM}sOOk18x_D)oUP`J#eUF*_OA#RI`&o8;S+_SSOzSIHjLb5}03Ud>qX zQdGWh)s;P0i=Qq&7@E@P>d+5dX0Yoxtcp6~DL~slUV7&}N2Nn(1|x(Ed*g}q+65qv zN?1Wx%pYm>zzd?WmH{vEvpJWpJY39#f z?qp(o5sN?8lh7V7(eeaP8tpOWf`43FKD-eP7kJU~S1-K~I6*4kt`*!S2ZRm}i#?H# ztkHd0g8Z9AMb^mk_9Peg?n$8#gJKK(t4|07XCLg)qwr}aM$=Q}4*(mg*Y)RVb z?z%6P@%dheb`oPsAnRFdwt}s$|x{d7z*tp{cL{U?W`isUHe3kJd{X zI%djDAtTRO>PG_Hd+0BSKG@BNWGK~t3*6tt9sjnZP9mD(-j@f?jnPwqIpNg7a{-VH z*D5WBpA%?}T0eiS92p$YOP#TapNaP)@<{$WbU3&sb_pCb!o(jS+yNa)j69EwbS_Nlv~l=w2H1BdAiL=ex|H4aKb zor>xg?|=T7E3Rzh5rF@LBbZ(x$q&?JDBj*TxEXTMWA%Adi3o^s4GT+;Ym0z&{(V#3{I7<)AFKIo!^|=zLS!_%X<0G z?8c2OCEnbd>|7S<|MUur_l=>TD5>$4MOI0Q&C%4$(uvL4&6?HJ#njx!lJ&n1{0CV~ z|CgW^i=(NNsr4I==i`5f5O2SK_r`??IAD$X!=r=U8Swrs#hBWj9((;REx#%-Qbq57d?n35H9qC%~AEh>d3Q zWy|Y8Lp+xVId_IhxB?TtcQ|F^EhAHKyjRGt!@ZBoz(8ogd147Ymz4>1I&NQ!8N)NR zn=Mf>2CD@Nht&v12N4~9&G*>SFG$yg!D?94DSh-^rKpI}izKxM6shzvXz#Ejto;PC zltr@p6Y&o%4Vu$NJo_i2-x-KgEwC_;qJcP^a(;hk`SkUO9)RRt>_D*Fuu7j>gEAte zQpjYKP}2J2Q|qDa;bOVF%!Q-H#>`e!gM1JB)8;<1QZPjaVo!~HuGe@cE;$}zTbh74GdFKCZt^b4{j+x$y@P*aev?u1^{c}}JnNokPZRR)r z%?y`>*=8P$r#AsX9pp zo*s3LwJ)?xsZ2$SZNRF;rbFR&U}#6*1rpIE?GlJ6?u$-2?L%$-1B7!Y=?)ObtHJ#a z53U?}~)iEC&rY$=xyy?B%U)D|; z{fSZjV7raXHSX&-R4HE#ftAAhRquuuEXDBU_uYT}_yf~cbYJGxC!Zl8r|bfUPO&Ip zAJ)|m>p?a!&!Nh|$=rq)o5PB9YtdAfA05r2aO%rEmQq%BrZh4nj z6b_RUC_O9Iri+~i^ET)}dMxlH{43J=vG~boJ551FcA?ABPqG$khY2~{wIsNL>@*oI z)ig}QCc$lT3<%e;;DHrz2cZpDA!Dn9P;PAamS5`FeTJKer zyO{Z4nUg0*NoZnlR+4apq$8Koz;_Kqf`jlAYWzusTgW%gn64@#H%&|fX< zl6FZnQ}%m2f2+eiu1B@!36BFVIw?g2kQ~>Yu0y4zRhOCm{t1mhkpzFNwoN)4T*`a& z#3vim!0~FO_I&Kc_6z!td}fUe+_#H2!7=jxafVj%|66f!adURDd@F92?&@C36Y?x_ z%(9BAGUXajMP~Vl9W}I3dQBH*MeWa@)jxAJa&Z0T;8t<*L{$CE@ws-FQJ#fya(t?u zdzN#Sb61XSjEx1VP&dIQwh>)X_+Mlio7;ko*z(un)$=9sBC-@fg_h zpYj=DRuJj@)_=dZ{eNFR+278-m1Va7D$DNC&(O#*<63+Mk)mj9VA@xQr^|77`ZUu~VYlxmiy7XPgiH>ihbk|g;z&&RoImj?9{ zp=w3Gq{QS{J_1s-8`4++BB0pOra)Fb5r^I=@~1)mc2s^a5-coi80Gel!}1D1UPX1A zQAPD|bz2+bEAQ5=;wt6g@yq?IaN-tdyu*Ie&;4dJk4N-V=plp|NgOE`LSPRmw~Ech@kavZ70?8VThmt@t_%|_qU(?$%5IoLA5rp z#$jM`=+q~FQar~N!mjVm6T{sIUC8~nQ0J=)ae~0myzyZ)v0f6@O!Q9@Vz^T9ANQ$b zWGdf>2NR$H&!83<$bAq3KqAW!f+==iap;7O=sM_We*Gu?t%PDr^S#s8mbm-PG!vlh z`V>YO3{yx;kWMy=GSS03&c9!R+ZE$dVF4H&Qh?g~y2x5h40J>w`>DLc#1??wl=vzj z{oV$1pvlxV)7D{lYdN|}-$Vzl3mqn0ek);p*a&{ue<@Dom*Z+h-&{7a5#h1WD21Y+ z7Ja>;;s_B~XjCLhe8Dc%VEVq9P;-P~tXwg^SQjBMOrJWUGL=vc6s3<7af&hqGZiBh zD;0AHkq#>rTML60VTx8L;8pw zfNk^zKmqpX10q;s7%A{2x!{3mLesD&X|u)o(p<>E{(T?>d<-Kc04!LnPcl>+%SaNy z4dxDA!ZMO>Nr(FO5hJ8wY{~$z!4skKh-sLcVgM$vV<-qw8)Ffxn%Y1TAP6Q6tw3DD z*pvm}gZ276L%p###anV+KAMt(rTY93c`==6*Tn$j;O9_u3=x?-3~+yF9EKB(f3gcP z*gP~2`y~O2D3*Izg77MF#|7pLT|>;H@sEZ2^x-2IQ~O6jE&H?)jA?dl{BoeEeWKW1 zvUhmkwa_36{|KmI-z~zc+?@y*K9n3QP~wgqyoDf2@steZ?CZu3RJwx&r-d40zJx&Y zLXEKl#qU_a-3Z-OPr1;oP*IE*nLBJSnp$u&HEdygGUZ-8Qan;3r5c5rsTyn{WnpH# zom@F#S*Hv)9WG6g>>tH)*s=hbKk{~>YGH+c={(<+eUxpa_QWU)k;P50lRU;ytCA&^ zD@QHsmuaL~h}G~@BbD)_UWn3QFYA}}q`iSxGn66ydMu-6C`&3?PF!|Y7)$GkQbtzj zn<$Vv?^@`aAdowcSm>K{EMCr57FhU@MD*oYLhYk0Dy1h@S&}R&EqCa=idw%6Djj$5 zyo_3b%#Szj_`Hr29Z87s7)Y6jLg6GB5fHH=%$Bb&)Np0ct zjfK@zjp_3@g-)LuL+5`KI#GIZmK7DICbWgkR~0%@HD=EvsWldACF)5Yd#QQH>nYly zmI=ykNZPTKc^010dZL%z6!OHEQ#B^ccNX#_tSZo5XkUQp73!=N> zFJqGlkUeHnd;N5ytY)0_5I)~r_#$~MsJ4~#z*|Nx^DJ{rrzSXpxhv!Ljf7e{VJ9B@ z6P*lN0yZU`g3^0_Ot;MVx#VoC-BU>=cengq8@Io-C9wRD@%3!{j|u8BlP|j@Unalr zHc%gYazmpniOkm8B@t7ycSEBoLFJD~m`ly}+HIgK`N&T?dL-c@m=;vB>`y}GB_J5| zxm13dpYo7|L6S>LYmrTaT`On&re>VREefE8#Q!zAr!HztqB;#{x%yd$L1W89*C5&| z1Uu#8*Fsq$z{;bNdbC>tzC_-9w60E}Z~7&UQ9Hpzgbr27dQ5P*+^h)qVzO*`7hrjy zLz|XPz%=1GIZ!dXBEgzdc9b1`U}jloQ0Y#&;bW({kdPB`CmLgJW+9}7H+7wCW^ASA zJNZpQNY_h_QhTPRjWL7%$DWR!kD#^^gS`%B#iUoY+)&A-wkK=CsStO{sexvWf)`nu z9NNJ-xK1H;1yw|lhkucuu!8wqh%rr8BlY|*ej2D0P;KqElg#Mdf@2t1FToJps&hZB zGj_8w6)FoJNQ}~19HZy#a;p4>1AbAL-_dN9XiI!-q>nrBJvX}qbm`1lt*_GMC=HpX zn46E<;R#f41X)}=H-Zq7n0atO>=B7}oD|mQgsP&}rlHbfLg;r^QZZoe))wX1EzWWU zo2`fmtCuRG&sUdbUj&k(_bxdH=kP{;C(mZ%Oz1Xu;ntxH2MN_jloZt*Lo;kIWZv`v(_@)%7^rrFll z8p5W_32LjWwx>l|hn}Jg`^9AdEodRzG2ZOq6=-@xL@-C|ha>F_aQnF6`^2lD8GbvY zmVKHv+-@CI|Fl)8`)TKL#9CKadvoelVK#`u1|VGjHAQoQKQ|q~d}DlsMoX@DnplO? z@5OT7jj=@8e)8r+$lFVj(N{3LkTHArEtDVg&*K&61XwBuL8G@2K|@U7kObGYjejF# zat8B&phSB5h|o3G)7ORLX-H?{+*0Rs^7~eaK!Qg}v(L*rO|1d=Br-`ys!3P0yj$v! zot(4Eba%0Vqd(V?J%cW`14ld8r~=QFN;xx*odHn85RXYaCELN%2=7xxSe{ym`P~5|bnWQAL6LN*u1705jwn`<6bvB08g6`6|Tl?J2?f{YrRe-t=b> z^bjw>V?SW|#G*7~QNM|=s9+s^316Sz^p(z(FPGGH(lzlkMvA1~N?nbOZ_ndkaPO7| zUfJf^A0@_;>F$ZhmGMW;%@DSL;S_aBv&cPZKGuz*WYMtv~5Odn;8m~L#Kq4N{yWS z5Czu6D_P4y>u=(R>GlO0YDv;Lezs9;_C2NcOow z4{6f=YO!-$xfGJM8FPlEBx~sKv)Pp&9(5DNXsd;R;6_d?%9P_cv~xsZ*moJj)rt>a zIy+<1Vv&guv_GVg!HGMy#mxD$zb37fVy6QM-<8#sl^czDRLgZG$ij9Yq562yzQz?h4Wu(6D)a*&H8)Ox_=FA!9_G zEwMgDSeBN#M8vK7wjIpiRhOFKN?>o65V0DZ^S%#3D-D|7wHRAP^6vYKk7_+?3cjV;uWnrKw2a%^jHw-`kjs#LVn)$J z4l=G0G`*e>xcd;+1O8)C-=E*Lp^?9Q8u2-}nWr2ReqF9tTR8PIH&-aA2QDv+`=w7k z5}obSR#8-QZ~V?C!VPbWEo1jN1EQuJ1PY@Qo40QDJPqAFrMfg<+&l5QHP3vE_(5V9 znUy}GbQR#kc?;ajVB^*Zoaf*j@ZWDvFYY+b7Gc~6woQ1{V>hm2xaQp>C0X1@L7or? zuJW~r7}=teMxyjpvn3hNIJ^5pH3O&Z#P{H<*fX5qGc4rpLKHX#-K(z@I5hVc_AQVK zuh!3aG;*_KOB?o@Ho5j9GGgQ&I~1i-XlUs=QhyX12Nv@ceOU1Mn}w2M?L1q)`um_k zZ9zmlNrU^|={AdR8+Up4MQf5lbI03ndLSY1{Td#jVE~)+4gzuv;}6U6eWa!ghVgv{ z_17UklBSH%TU@{~7Vo;yRj!`dlcB8~eV1TBIE9)>?>)hYCba``Nm3?H(WOJ$c44or zy3ja7$f&~DAhN=DdEa!-p)zLo&i-WCFpb={vH7t|ee3kLNsSz##^q3(s3L`UIuLW? z!1cH~?Qi+Zc||KXv%NE;NZB1=;LR?Fy3S5UGNLrCq78LDyWpaNc5&|dDV*sLjg`xK zSyYOx`VKi~*LhB5`RAJ(!b$%Hx?J}o+g-vBB zyrH>WG<*%WtRDC^FsDq=7M<8Ro1~)L4be-=#D!T?ZC@?>@^j(pCog0aPt10hAsQ4j zZQWEtV&I4|=8W(tXEpub^ zOd40fVi=R6e=%f_HBa+QF#MdVJ~-vh%5{u?Z&8|dXRI=gZzuS|*N1km_&(%#-NOqk z#VhRpHha={i#e6+9(yxm<&A9?Ffa~9rEivGSEA9FBbpmegR?1uj+Ky`jQy#vI zP#-&z>sb-LZe#cz_U zH4QW{)>fDs+*+^ zj(^vOf+n$81?5{#nN79yMeYZLoF{V6{s7%rO=;OhxD#$l-~NN;V+$?GD-P+LcH>3k zaGVL;#GbU{*%!H!CHv_BxfYjP(_GoK*3cDtiweV%aic@03C4Xh-GRJk(2 z63yHkO4lOFn3n5ddo(joEWM&u8eqQ4iPFu%r*H)(g~p5_P7m`tt_tz@NAUNboV<{6 z_kCiBDFfV#b0<)~PW!nNRGV18feoD8a!0jyd7i!J-K5O;2oO3D);ZsBN^^$s`}35w zvZ`3VKUavuLS)qDo7psYbdw!R8(GqnIc|A<%>mK81u4rvY2|9iq zGIaikSHQ%P-AFSEPr9fD&b0f5un`>N0mU0GxB~XZAYq49ASUZit73=eB!IPdySg`JErL zFEIy5JsMvt_rpWrzMgb$zdRJAFU1YxC3E{dU`z!Fu-&LZ|v?*3%IWg~`v1+FG@ zeB5Bt?L7H*e69P%_6MU6lJwQ9m4c9WzW2m%QSW-mf%8p=)NA0Vy#rvy!=QcZ)dK>@ zaYgK8jN{p!lZT_2_Orse^5V~>iTBA*M#GyBU407i@EpIe;e8G=$8#{?b5g*uGq{6` zLt%akdh=A}b&xj{Gal^AW+glUx3txtfzNmKV62%_ z;Vm1|Ohy*;g)mEp(0fb3PHLzku}CYN5RRt|`3Agidp)#KpC# z!tmADcVNXa${NmS_(^^dv;Eezl4FTqzxR2J=mg8-u2vAzEK13}-OOY--n4yLTi??v z)(}ix7>Z%QG7*ANAVx9qh!JF!E}-|W84>fWR&@l;F65i1!u#DjPDtYyZiW54-*E2E z6ncm>vD+f*CX7KutXX0GuSo1|JG9@`Jj$_;eKBt$&C*<4JbxWG$nt%{1M=ugm^|TO zl60%8aB0x>34J1A*^U#yJfi1~rbTbd$qMF^teQNTTSx*Q?c@`s?;rCKO@>_=Y)JLr z$4pD&_k@YH`ku3Wc;f%o4Ilk+P&U7cfEh08msueJ++3?9d)hm{UCMOuV-e@88J{5O zBC<|rl6*ECD`HD`%)wuvY4Le1W@RblTqPnlCwe8@>IOvsfa*gm_8EAS!rC^_OtHHf zhPtfHH9d>aHjmE*3}P3t-MC=)^3GYducJQ%)Yur&<)5AnOBAZyC5L`--=lis-P;Fesc2 z8J7Iq7KBdc`{h@^PrD9DgCq%GE?v!@l>Z z8&oO;+wX)LzUK8Skhi9CGvY)<^9cPgNnjkOKyBKKx`9&=u(yU7u#U1bM%Zh6M9hZuyZwj0*h9hCc$}ubaDk} ze?coBl;!#G%`#}jH()$b6mw_b;D^5_Df6bHP;(XbpRI6d7 zN{CgAHK&p_=cEOvnS&HVmg?q6Oi}GPuX%3wd-}7xmP07#Ufi;6)NS&)j`4g4O&MQ} zovYCTq@#S$M-xa~O2oaVqGYORFCml5Brt|dR0cp^ZzEPF*QINFG3z0@3Bvn~tn(~+ zdQ`DIw^UnFW3J3*Ycb?lyS|m4ZPVoTWY}Ycp}p=DLVV{+Uc*o$^Swmod5r39{S4#Z zc~T)W*m>VBu&qZ60kY39-b_x8iwAn6BuW2IY4nI@(~jmpcs)+Nc<(*yvo|QWnN!pS zTK(E%&xkP9Hi8>}SMHg)dH}a?AS2BV_Y!NBt^B@bbVeY!#i*~1 zW~98i7R2^Vkx9CHy~3p`xN12BeKFyef9=ZnCgubM#v8rz#EvmYtz?ZG=VG$F*Y(|L&2yZNYd?$_KWx7??2_hnE$MPAFvpK(~TQcL-Vw@fkZOozsO?bzt+y zuba;akzz6=2(bCWT$sYYG6)bRe5?y4`5Q2}Rp=)pJ`Oml3=mI?dtaXVE^qsJ!OTfj zIO-4BIxHWxU!F4logi$#n8?Vrp87q((%RZ3?3*h4ODBiEY{M1Zo2hXF&2GJ_LA@bH zS;dpmsNHJFgl!rIj15*u2G#JFQJ6Umz_VsZ z3Rs*z1D2Kjnko}?6AWhD^N|r?gV=_v!IID7{_yn!=q^zxy$(L_#?#>YKk&b+PA<4J znfq*4=yQLOU%X()L+kLmFSw`tA^Ns6ajuZ3HQhFQ^aTq7zt>zRJG}@X+=69>*GI1TF}h zkrZj;@J)%Ujy2jTurFA;w{gApCEvg>gcJ}L@ZKNpAF7eF05>58`UTDRHa;F&m06?i(N~S zcj5%BNY_Xh-^|$0ECpOkT~CSlaz3QSZN|O~N}o$?-OTvSbUz$EAHs_~e11rX6N!D9 zkj|43y_vC|>3%%CI>Z-w;CM)hd%=7ziR+3D+$nG_c)gtQo;eS=K0ibkd0>A?iu1Bz z5GpO2$6}UZNg0eyeGd%LOB|$N>BqyjA*^eON>yZWD&8}~<6Yvgt6Ow)2I||i#tlB& zwdM_m>76-Wyw@YMag}F5|9xk|0%Ue7+M~d0Uc6KRuG#pc4>~qFSiAbM2f|T&C zf+FyjWUW)U?|H6D49B`>hu-lt)3*k+|4lB-8%f8nb4_xBxuMY*=6IW>U! ztin<~(Fj&&c@# zRgbmqPKw3(_nj3>nqG$jNT0b&6ST%`RK14;v~M)9y#Yw!1GKTx;+j zhYUA96$~od+!qci+uqXw^A;}&fz9^!m4j2Z_Z@?5Huw31Y_|8m2WxEZ%Li+0@7o5Q zZSJjsTl1GJz^%ngHoWeFy>`6rl09RVKw}U(^NR{7j`>9g)UEpzm71sbl#v?LeCN*6 zU3(|b(*666T<>KLQq%Y}1aWSBN*mm=z3&`+UA%+`2F+j60ljT%Z^#Sb^k3g|FF&Bi zzBMRHdl!QcY~KzealIW<{09^Nfqz%%g;c#xi@iZ@&D*uVRNh)H-~P3V-T-WZ+VmpM z^bhR+0r5Z3{|A2mK>7_nzFMD%dMui}!ORyHfvJQvX^*|5{4_;>Rq#L3a7SB>#zD z{1%#``0XqG!rO@f?z@{UVUq0Gui`!z--&;jm6W6e8~s)2Is6J3$wnl|NP36Bc&PQ- z5WE#h?sJIrwN{NQWNlESRtu+BVCMZ9p5gtsP2|NZev=RaL{A8ph@?`epCm5)E!Xn+ z!FLvajt*r5_}eRrm-iy*LiEQvtK!gF02Uc0Tc6eio)Du*up@*C5HkfA2YUCUdIqaJ z@(h;sp%=O%=h3g&6&rdap7UpfGc_P1eu-gnSj_shFsb}*;)FuB2Y zFfR4kyK#1~l85o`azd@|89NxZ!kTwWpiNJ3FCRW^e*fHo?APz-g7JjA+WY7NCUEy2zS3>^}DNqK5uqhL`C(`}?0~b{P_wr!*7SgWZ8z?&9-3y{}&k_{N zzu%yHFZVV0d|S|C+s^^*bto13u_=Q5g8mNCuOE#h_``6)0N)2Cv4Ja9Fo_4$4rQAI z1wur<9!jwuZt9PQ3{{NT9$tp&9x9eI<6MBzFBMytZtM-v#9vn?jR>>DII9`je$N;V zUyjqH!3~Jd41=!-(I%q^tQ8Rxi=wyg9V`6ma%%SF#b zx&+tDExK-*9}eC7!Q9#!=B1aPw4ERE^h{%CW>OLm<4*Y31Y+`1n2} zM!-xC|N73)$Lzw5hR)oN`JJ1OqZUybwh4ULdV=0w*Ln$9ntf##Jt|Pq}zxMf<=CRli8;9k^rNO5v z&e_;R!S3Qau155+SK>*~-_!RkpSa-J&<%fRho*x2ril!2RztPJo4}gC4xq==SpdaD z^A4VCZX^8E7QS_u8gzUJDwwB*dL7mog*<{c3?4iIW^dsl>9+*qY+_aS>i5?}o1kI_ zWL=orq1vX7fREKEqA?YH$~%9+OVC*8V~fBOO*P_cq&HqDv^p5CrRgVbH52_1D(stp zz4gIG#4~<)?uU)F0+Wc?ax^SKV-Wn6w$j&{+WGD&NP(#NL*$eP3Fl32-nl0p+8-5v z6RJtkpuo*B$$r1UzjCQN^8F8@+dcT9A#BeI5FTR)##zW2@<(}+*?PKRv#qKTIDb*=E@LQL zkjJplfBAkPSH#O2(Y$+Sp!Poz)c*frc4@oWdi*!Dt4iC)Lt}yPb;IF`<4Q-sA>Rx$ zT7f5bL=E9RD!UvPGB*K6*56Va9U5>v=`DOXt_czWrZ#SIp13;bUr$Nej?`yHhrCnLZ5&lZ3 zeo*hl$JJpkOi+#2j8EE4%OB}aO)mJ!60Jx-B5O=j)=s^^MhJ(q&O&!PGHlf9RudfH z_VhcrkmQz0W_06rbo80s9~PbduAGEC224Q`A6Fv@tqnFz{F6YRx~&Qu;`Y=QJiH5V z#);cOgjF7MmFeZpU;gGiHrk9slAPo$?TVnx0MLt_qQ8qJL1$`FAA73K7OL28MaWIt zy~XLk=)I)^sQ&!jSy$ESZf~w$|E0q-ZnMNbHTP&nAg3eaXyud2jER+kb_?!bQjIP0`h4cZt&Oje@?Ro7y>m{E z%v|sB4d2iKaa*_u|P(hCieWG!vhr; z1^E+YeZ6WE-PPEJ1wyBU51EfiQj_fUgo43TA2s>DL`0(cci_5=-#)g+e zC~SRem18?Vx$IlVtbRJ3TDI?Cg9KXltN@LyjSH+&)&`Zw;_@0ZFHr{M%4kV!(Swdl zoC&~oGJ1h|Krbug`$E?c2IA%5C>EQrYq3EqF2u@~+Gj^W0qKQj&(7GSiltrq`^Al| zW;J=sBt6!=2|}*rTJ38ATYK9&!}*Li{})$}Vb3;;3kZUd+Qr8wm7lhHmxtx5*2Mf9 zENpmA8iR4r9Rwq-3v3e23w09pnJ7ob*aF!>PaBO3q`+c`CW+-c-^&%TYMLSlj8Zut zjWG%cf99Rb{aFLfHIb3_uLAu+Vm|ENDb0>3W0hcS-lphgCw+n!6ae3irz4yb ztW}5ITmjJ5Q%yB3P;u3o#cl1VTRV;07REgXg~<&o5H}T+xHF2x7Z0={7pGjta^QCN zI%__mQCT$X`Ya|-ppGnTNke}{#~CD~o~Z;!i?-A-lzD>Oc|gln1}A1xw3_RsEx}Dk8ja6MmUm2=bNuH=OFxW?MzfM< zlm{o0Y_eick=k}LMMLC>`pa*Uyr zkdNbeA!Be+nrW($`m_2kOuiXGotnnd&_Y{Mx+-r>#s|rwh1}1^Wra>s6%}4otJ6xX zu=dm6tLQxy_4@d0bEkXd^f(tiAu+EjJ1Td`<(fP14~-9dU+4* zq@XozJL#H&F)KyOM(!W-h*<+j--Zd&$X4X!>``%o-B#oK@F@s#ap z{IuIfy{pF;oUz~*V=Sk^O67Tv&@^gF0E9s^2QuwMPfJt>Wy-2I)jALWVY>y{lIBx_ z-z*z%_7;#qJMs*NoYIr8RLk^luW{vmBiz&WK`|L!nc4{c@FE;}ox1e9u%h(y0p%R6#rt1^4I0dtKOA_HH1IBNbHXoSbTTd`deWGiH#C6cHQ>~BguEx{x zp%|QpvK?G-c$=Zmvm(bSO_2*Rkz;kW2G~8n8KFCw(@~ngnkzn5bH86Yj<;7FXNJy||d5CmL+Te<#@vN>L?eG#2f$X{@#3ollE9#zF=S-$qg$h$4jEuM&SC=7r(e(^VrR$rX|Y54LcYy5x6um5jC`hN+#6lwbb zaI|q>Hv(w0WIxD%*!aNxrFUYe_RIIa#KJI)PZ(r8@knYXwS??U==7$ye>Lm=5tCdbI$*tR5T4iRCSlLf zvW3(enjKen#|KmfT*#6?El=bK>iU<%Jgz|Jn9msdH||h?e*P}MrXuvN-R*gSADKl! z5O?OkbuDSaq!zAu_<6Uc0$DuZxB2ibAREW=FD(D4#|T~j40dvpi%;I&eGmj-&F?!R zV2$5JJo*)ZtpM5nBCigKrEAQfD;^;pUB_K9K3yk3qGzp$X0B{e>3z@|PpdTA@UDb* z%f|G)#1iHEyh_4jEq=S&ux9BQ5AKXljT@9y-(~dGPLMzh{Hs-=J8p4_2-enN+%zfk znp9;s;XBb3-ech;XCo6d@S7UU8%4Ap-`P`N8-5M-IhH$3o7lFmro{hfC`PEHCvqbA zwd7fxC#eXdPp0g}SeGinwPMTKGxw8Lqd>NYu<{Rv3-?^@7t5?nmBqpxeH_Qm4w_<@ z@I+PqMGAYyTgM{Mp%%jfEES4%k4z_33aiySG_PxfrqMvl<)DHk~TaoGIVp#)9bk6OPaqZ%c?_0 z$!OYz_a3HUG~uVF(4E7S*~a4o1H-R_QGOuf(M3`Wq0{I)Gs?GU4(=By8S>2fUta$j zwI^X9Ms^$CK5NPMR2>0IMJEZ8HfF($sb$Xo4#Be<+EqcNwEBvqhboz5D{!u5pj4E+ zZtCW&Sd889KKM(hT(@fW+~3gb+4dxbHzRK+Y_+&AVYv$Ssx-umDZg!aXTDHGba}bk zWQ;v(<~F8}vdi1_+aWpjKUm%%Q&;w3eQzyT5&bUfbId(#Vd$LdSzsxxAxpS#r9^MF zpV&ZjqQS+;(HiNNB8{#$SkOdEW6#m5){qI%J67(%fFW%<#xQf9y8%<1=O;GnnqKEHtm~%xCdATfcjIk?rDx=J^b!Mqdpy zKh&6W*_q(9`Sh6PNvRK%oxHV^f@yxxYFOLTsNck(DiTsGrx?D5TdvCPS)!RMMP(YHOo|eB$)-eDsK(aN zi&z(dz3C6?O3gn^z2P21>-Q&ffCzI7il0lZQ5o+0-`b98dBWdoHI?iUuoP-cF?ITS zsaoDwL_5gkkA_lY;fukdHq4lA#^>+43ztm;adOiW4>{T<;`IKv{4-qU!E-rEcN z<3)$Br7dHt=x>@``hAg}bW@d;AI-B?#*Vp+G;ZE5(J>2k=TB$dLl}vXb3U|#{{2u- zY8rcl^8wFmLwQm1AMaAGeoy7Tg}AbhF3u$1talIr&oqR|4~B$y zhgn}&5M|;bIOuBxqmbaMr~HVWDV8@|8sC$KP6fU#rO>NQ!xId_A&97 z+4yB%>R)Q}{wx?4pfI7ANF0$Pv_G4~o4C$(YH?6R=bczs5mgCrW6Cb}`k+YW2Z#IX z{T+k#POLezeKeRBr$=*Iy#n>kxr!y>5k88-|vxsZn*xNXW~rTrrZ7fCqhdOZt0^TuL}&)hgri_a4afI9=WL65!6 zhp%->{>Fr^um;vD+~1BuIjA5=7opAVL?@gGdakV>odm0O*Ez(?f28+(jb-2cBKlN4 zlpQR80Cu0cJ3-hXwd$a`p$zd2BF)mtoc#vWbYPEk1G!j<7W%FYJfNBV-pE^l7u8?c zfW8+RBddx+;k3uVZL-pWt3TqTtI0^})f94f8ZewnbmNZ9`f$csO4cK!cjvEH#I!xR zZI}5q4^{)pXNnBRe)D-KgRx$@_qKpzyGan4I>92>;#=$UKuHybrO|mVhw!hsWum+}X zYaw3^9FNz{ME~Z)pOxLrMQPGJcuqc!1Qb zc$uv)UwItscDC|y(7;t<99w$O-_=0kjjO5JL7h1Og6LhK*GY8HW)7a@4}!5lq?%@7 z<{jH~Bk<#ft2aUa)b}RX=V3o1zI#Xg<}2~PU->BTe>^f%aqzUZ{a>Q_IjR#**z5!( z&a)2nEAdSYMNhZq@l9BGA6&m{iOC=omTJJBBSX4a zL4;Y=q;iG&|6S(HoqD;rdJ_B=v5cb9yTNGXGSwG=Tp_aPU-`IfLSK^4Mu?|J2ho5^ z6tX)LSIyorh+F>Lt9$6dKyaL|iyS{;t((#)A14zpYxR_YWBY$dd&lTXyKP&zV%xTD z+qP}nuGqG1+qPM;U9po&QpuOvd!KXfIp2NXdv?36W&KKPbGEhSc={aU>0|WXK#Rew zNtygM=qq;SR*=X(NsTz3KQ~b`YP|NKJabc&{4*`mKg=`XdAMBq*ELmJN+7iw=^~zo z9_BoX=uMz8dSw#f4fQlqz;ddg|o5u2rZzhSBANzILf+)srQB$v6F z5Y7a;*u8XgqE`HQ3Yd>1#HX!I0qLfaQ%~6xHv+eJxKi%r{*bvi-&6DyxdnQ=n^-@g6) zng#yrSo!y}`2Uav`)3xPt*B%5QDS@{1l4=h%k9hec{4Vh&(H5S=nb$g4ocOE z{748x<_LG$z5$9YicLs{YW!4FSO|1vwvYp{JNZ8EvrEPP2UJM=m3VOXb72{k5@?H1 z5v^;| z0na6k&6`hCKb4o$Wrd_OO5?K;nznG5(uCXz)?DFa=LNG#p1m;=Ri6_TFvnUapn3e( zKa3L3^ZZK!Ighc~)7n+>~Jq};sT0J0B>X!`& zjw2U?DKXj{=5P||6|=jDx%$i2LYN(9Zp+cnate&2pL@xw6Q4&7wuPYns(fG(-^6EC zE$<^8POamPKRA@}U3>FiSYaYO3J@m|%Sq^t!D1SFYLyzV9ortN#xOp=o46jU*?kJ? z5?Lcbx>q#^THH$=Jq@z?n4;CFQJOXCEc#Ll0CO|5&_J_Dec){oaOY1_b1}EoA;BzzjQ5lzVt!=I^zDwTKs!++5d9*`0~H`SIntu zxgn__f0U$3bKxW)N>ZU&^g~*#BMOL^TUlxG$F-1C^e>-VIIhDQo9<5)&3OW#Ab2ma ztt^=N+>2H$Pb%Wczsu1+r%NP`6BqNZobfWf-DP*re$3=-{=Poh`G!3}2Khulau5)e zYBEJ`&R+r1Xy_x-U+FHx-CdK1Ye&8s$)?puzalMXLBJ?zPjDQp9#>z6PYKVw=dLh9 z0&*!HK4*>O{KrS4owTc1KlOW)KGYs~Y*!QsMyiQ+Jp2S>=tfM?>5xdv5Tb@DHE}{r zF$Pp1qH&}dM`L>s>4rXs*F5oTAyP?moIXd2?jb}rjRR3XwOFQ^1)0HZmW5S}1r3?= zRUNdGI-y1saaRe6?OKM#Dxzlh@4J{38ENyDI##k~kU$QP$ftAIw9tx0tdh7C>c;GQ zj`dKpvNVF}xhw;S$NHS4pb!TpA^CWS>0KocpBSx0YuZVXYSRo8rKyD>FNL*TYRjaR zJ|NZ9JIcEmDT8!r1p))FDo(R_)iKvxk|4A;roGu-nq{R*sOg&A71H3G*=n}pVBLh` z9%%UoAvaO}V#(?78nS)6*$>JiP?;y~~Xf6h!BJ%N^9{0+T1{R@M0gi-3c z2^5=15GX|6%Vc5ond-zn{<&_`azMfax5|uVXUfo@91u9kN3YZ<64+#gk#qQ)lypH> zh3EV77ZDb5&C_NmVU0y3v9BIm2qtZ!p?VIRbBQIzO!JH+7RS}heC6R8geDcZ$RCuj zgaU7%P>FS&RhXqvrm;#aWHm(|GY)TS2vO*hR%_6$#L&N5$n`+Djv0DNsYa?FWJLII)#ho2dZ?%|s7wv=csyZOGDo5>sPyYzT;YQ)%=5mWKwHRboD^3q5 zCUZ4wMu}Y|NSSm9ywdlp{;6C{>6%i83}GL@3(L${a(W0XH|=s3L{$rujc|)k57mtf z=4DEOQ%lC|Q1SB;rua_F`XDNBrJ#D*=SEZzqn1dOYBhWAe)#*<8I)EwkdMOi!l=%G zk-2d8E~(G$IWW&wGWuDKu;SfMm)y70-koMKaj})SL!<{%)$rw!7s?_#os~gi6}fP- z+oU%mK=5`l`JT195ofc*ucI`iUN8<%t4k%d7~aHX5Y|P1Wt&In=;w0`sVqk;qkWGvD_|6aycb3?z09 zsLDrO^?lN}`W~XHYl(YqS(KkQ1$b7KeHA<3CNn`xrKaFBdLSS4z<;k0Qt9GPrY|I+ zlPAcMv@|23aYDKivr{YMEpm79%?I?3iR#r5&X^1!{JxI5dO_eKTdA`m?eId0m3@3h zsUzFo(c(7)&@nk}JJF>qL{egx(kHmcThJq{Rn3q%i6h<>vR#WNzK;8C*YF;A*%rz3 zl1f;jGj;#@58aR$m3T14FY!>kzZIMRlUx4JM2Y^FGzHCnDs22a@<#&yPdoif0V!Ig z-|>$E(g9TqHwhCdMJJE3_8$eLk_=77k)+IH@OUan8i=}Y=#qXrAmS5Ams3k8o3 ze(CEQF;+prmL~l)C;@Kw*0;Fi!Z4DAN|=@+aoQ4-p^D zrDJ1>Il%oR+taAy?_ZE{5Ba3-)=dYpz`={Kk>Oe+S2M7-I3@ksU(@YG;|)h7g5_fe z3+?#=I#378W?@?MeZBARe;(RuHj-47#3lT)S$mVH@Zer$o%eR+4@MZMJ!iyaRoJA6NV<%o_BbQPlJUe?Q9W_DCZW%e zrQMej(tT}|v(pj=udCptZ14`$JnrGx3EzP6RnHR^D5cjrDZVA(Y| z8j&`Pb-V$TsS!CSlI_idg?goS^gC+DirOk5&e_+{%M)OXo&w1*=yN(-BGVlcv!lXw zw<;(ZFtXAmcjs`2gV3U)ybnpbHK~-iSZiCVLHPl0SJ6V;n2q&#i~bQ-;wD8oMi@nXH;6rh>?YptQQJnB{*W1t5Dzm zStR?#B%jzf5zWJ~U;#Z{_ewx};t5W8;^QBvVY7I%t@Bl3$btP`&L{r={4D=3!6BTf zddNU}`0sl>at^!J;);~Y_T=i4p|(AJKeUZN6YX_@cY1~&KX>hNlEM_m22Z}TT_q_q z(V$#?y+-NN^*Vo*0*iG3G@FvS9MYPyuwS>R1U%8y^&P`zM$JN7IOh;Zc^TIDa1BW* zKcta7F4U2jE6jWShod7@SWKbo*EjL~`uuf%i}v;3|6hLVW?*J#`)}#~Q2+HZ0)|ds zD$PdDYJV0bX831P9IZ5IyU71lhyiy(lz8wWwga3@uWhfNRR zV5?oRuO{;M0IN{H1QX5^*6Xi<;03oC2`WeiHl)2}cwJ?AnH`VL+U)>T6~>49V`);O z>F=8YP_?P_*=#Z>usEy?Q40Bv4O;TWY{#NsxFWyNUOUy2ZSwFUFZhi97Vr4k^QJwS z;*DejU&WMAL8iRRfL?({{KF;WhsDe2mhkYV5?!;Hxe-&Gzvs}6;aPlQoJRPM77WK} zb1{144S!@gFfSbhyIWiFcuB51_qOQ+{KhMj6x*8HQ9FX|2pZ#+^8-1Y zpZjnho68W3e@E1S8=p;}<$M&PH@k$#IH79DT^xdxh(xr&LaP_=ke(DL!V}jWS!kQG znph52I~!GZ?7?@6a@08|I*hTm#dBKc&<7)PLGwF_J-0lEtWj)sl$29iFC7!3K0q?j zm2z0A=htL2Ekb_>{8NXmtUEh_ebr%be_Mx9{tpA}pW!vF1>vpy;|Jf#^c`uU*q9(7 z5I_izG$IjU8AR9xuuvax+^|i8^q4p!k|`V@@Fv3iMH0oCkQ zNvBNY4Hw>7ITY{ws4nr7y4a0(C5#5}61^1sX7QD5Ow_HWOrO4L_`&+)8!5cc) zzHgVU!9!j}?zORW$>FKvgGY*8awk;pO-Va+aB8o=D0?(PwTXtoimo*&Y7+N7J-h;& zc*%!Dy}b)_?e-_V-wib2&tkzRV<#qKB^(-&-<*4fvpHZcoFH_li5o=%u_HxHxUQ4@Y;Z^7r(EY z4fjeh0;K4z+vF=A@mAEP7XenpPCcwv{E`vnC9f%F{3^8IDXyuPx{sykt@MhUvX4L! z1Gyr0G~5cjYQ*cSePZ|a!sXi$u;KHr!{-;k>HYGv~2^Uegv|%Z3;OYo=BY!pXX6l)sToX?gVC{&ySynkOUiDPJ zi&W?o$nb#qSIHQ(p)|jR0Pc*XB;m!48rd|N7CoOM-UVkb<%x9r(amTgMA*Z%jvzsw zofTV+snts01)7GkYMfRf%8s-6PDR)q4z4f8nU}RKUO-kMoUPrRl*v&)uphsiDDb~Y8zWt_-O6SxwNA| zqGavY3!RNriE!7+1X5b`8iGVKd({15MSCHO91t;U5eUYFoIx4+B!gQS4n56;oH4Pg zGV*owP|AiYkWhfR<(+~woc7ud?$2aUb7~ISZ?cfSZvdF{G)$%$sVhs4QtDCq=j10* z%0Pl#?>qT6Z|OIy9s%yyTE7M^M?RTs3*#HbTo||RK4El1N+=n1N)-kis5fD(uEI!d zuy8lFapXj^a9MkJ5Cnub;bp%KMUd|k^@$PHy(d(ZL=JWiy3D(8RhYX8J5YRa5-VIf zC3Qpz(jrC%iKYt2!WX(RD}mhj3Vw_U4bPx%Duwp+il(9KAq>W$M&N){u4jTj8=hE7 zUJSmrr8n-P1XLkZ_ZjFy&?l)N|x$qFhIsoO-o& z-|)d7vz9Wmu^$;&Fc)6;0t;fO84xy9!ui`CY;PYlA0XH(R-r2_Z!E8rFBjS9g#^(b zeE+6|IX%wrcqUv#2JJDti+8|@PzVO5pSlJxvA8$Gg$Hgm!K zXC15=)dh{pHu{XyHvKQl7$96=J_0hG;!wuX%958DocNfLwBqcj?Z@owiS^5?$1xCK z4GY!W0?nVN(q@1(@iRR|G?4;P;lkLUtoaiN^oz9BNeCF;P0!s`3aAYN8|nxa=Rje1 z75NP6m*nzhj9o+t;e#2<%P6w23lr8wfBw00wj=hR~1u%PzKXX20GFSRjG>}&ikL6VLHA(>NMGe#^i`QU|4OqqeFjW^cHXbAL zv(SsKBvI7uTz?Me!G$7*ej0bY`e@2S8o1GB2oQ0yb5Np4MjqgEJ#XW*kzJrDy1BlS ztAS`UdXoyp0l#W}6$PS11yA}(biFWpUR2Rm|DslP>>etBifCn1i8>C~x7?_>x4 zT}wBb-o9&v0hF)5m+3`!@BG_+V{$Oz_X4u_M^=%(=< zEbw#8kAFSx;Av==@76o;bL#%S5`UHevnKI!ce0A9|6Ns!HKsFFe^kHBS$wMN+gTYL z<~ueY-LM|?2i3ATU!I=iE$|}7o-*aaB9(;&JxXf{u-A{`co}9)2~e&B2r?mp*MP7} z<%e5v9FvNf#*va660c#E>{6WDxkAvXW0`C{<`)v*wOut~O+O@wUI9DI2kvgeIi&|L zkGBc|IV51-Kr=!=?QTb-InH>HgX~9v?9Uh>r8*{rYY4(7Fs@|!VdW2lx{V?bk@iy= z>yjCqaR+jyQ;k=u#Y2PHj+@Y?hiQ16i=jS!F>FM{axvm2A=cfO1OYlgo^JlxZ}%ZG z7E|T!JoX)d^Xl}yOOC^s8Vh_bAF2Jdx96a}{c+p9Fuq^IJ}ivP%glkgg)1)8Cg!%& zM&`QWN{a**)1@fr8F~?d)%bq!69}07%1rwA>*z23$RLU@#pFo?afZ;4QB(nedBxEv zcon<1pmK*2plXr~>80q{hZdl6Vo-sR`Eme5nh?NNp5IsVib$KgO>Gf_W;scwnaM8E zGYwS>z6UDOJ)Kt7snH3D&``CpZKDNAfW0Lco{W7@ZYXdhz34~mUrBFQo*qtblwFa8 zsg6oTUuV|^6vKdF5%a_!LX9@HHBFIcQCpdSsTRcgvUMZwM{h|ukc?b#Txbq=#4_fBfP4M1!$D0=S zFr_DpZY1t#Pn{dJxmKkMf$I6;=|b2!RkW>@4H4*f#=FKvoJ|>lRhxy`Ak1^|zG-ZF zU*=>s<(+M;n{dZ~&p2lrKObc>BU{Z*P{erQ6=^!4N;}>3l1Pb%8Vp2w^dtR@Ii*i~ z{DEq>Wl<^iFHcVEr|x zF7sEmzuKY#=QUlliao2fnB0D75-22**2`u)X!9tz=axcZV`hg-X$q%BLXzgI+31yG<~5KZpp0t)9c5~ox#=}b0xu@@%uu;)L$K2x$l`8I7uu6MB{b08GNQB7ek;Wj zB7$_@GM9aW6#jSvkec_X{Q+F+a-RIjb!}cv@|heCmVp3*YKFz2jcA+8%|^+(Cl`TT z9m+8pleVAb_0R@CZOT6AGjm6dZJ)+r;9;rcEBsd2lZ?Q^8fH|~;Xqv)}LZM+op%NROVcKBh(IsFq z*8&SdSAmC6$*9=Gp8z5!v`HZxkv-yWg*`~Ukav07-)bVwsk0@JEHGq>QP7`BI!5#5-ZQaVpt`umfCdz@xX9+wRXE3=#eWF{)8vuWX{@r#e4k7t#iiS2a0r;bk}h>B_hzgMTQ( z%^k`=3Q$&gBtgP0A_w`GpXY__7AmXo@Gr(JG+~y5nR8ZPh?OJLnHg3+%%JCKNdn*3$mXl?G{*bR)0AW z{mqLqzcjyzZ_fR-P;h@_%23~Hb)>{oo>x$e#u)5|m{A*&zPTVXahU*=bp^ZF!=2p& zFIaw>YsFfQL%P(ONBTa0R7naAdQQ+emzBR1uYf6L43V3Dmmw_F;s`k(H%}}XiMshm zQ&JB|{=|#O1G{Dhk$QL7wi^FQZr%gs@h4QuE2m68n>i}=6}2qgA@X~V%uap5O?paL zcfJJ1MkGdY7pooJl6xVOWPK<%b^b3e`K!6GtKM^UgzVqn?}5~VDZVC{&szorsymx} zzhgGQEMvg>3iGuL^tUDv7d;}qmYdX(4mcd1IF5D%Z_VB{XfZRo@|Efx8n7W;kebxL z6_3ZD1!m*f?dJ<{savo2rQ0G?n1d= zFOpuBR(R@6otYjzQlY(0_`HdGs)9TaJ%U)u=k11N^t^uiwyXfeTBM}x12BH<9A7bA zoC9`l(SNNbuJ0`_16bFoH|YQEhpzAD*I$b3re;r*Z(zIak5?M&At5J=WW+=@2(xtS z0q$(lJLrswMswQPe9oE@P+j0oZRyGO6jetYmRoMiuZcKXy1YwoPMz=1I$c4A-l{3` zxphIFl#u_tMqK%RYGVVW^ZZ;auf-eRz2kE!@|OXVFxAnCFynF}`l(ye^} zzM=Aki_*sO`#*I1t)*IbQfzx|w12lazuEkJ(po@CUzQ5mWub3tRvySK4`}7@*&x`t zH|J!Vm$ogz+~(J63+BA>CEFgo^@YpLC73LQ|B&`GSMJ8oxCF5VGQlFJa?h}YFist; z++alKj%K$44F!p?1r3CZ6lM)%u9uB-N6lXwN*g#c39XSI*`mzRy28ziK66ld;?*@+ ztgiD{!yn3g(lP)@UCvDky7b9%OGx!HryecO^7`TEjqU;YJ3VLc?Zk$=HXzoTf=2tA zLppQVVYd3YZ;l&sCFMKVNJB1a+KAeP%5v&9L`$(7;N*}q3y`ljzX|$5e2<;VqosX1 zBu;h9N*m}CGfchT_m6^$@?l+@$nJGiuV$JjORcIO9p>GN1r~Ay5VGDB?Jtm+gK7)z zAMh%7(RHPj7MOnD1-)^qMRz#77vVj)rTm)T8H~pZ^_Yn!w`ijQIPK<~NFz?NdUIPc z6dQ;QB@X~Y`E=7Z@VY1Px&dM-s-!Ev%m)1y(n{Xz)qm|ZLHi+>!@L%zn(B+8_&ppx zjtVecw;rur*P$*#+2sR%0HfUF)TMAy^tmk}e;^h;QDpSD4nWxjqHV*{bph$RlXczL zy6^D_6}=4j9g{x?3`LS{r(e$+{HD{8UZ)o&HcRs**E-Fx#$&ej4Vj*;`-Rb>4C9GW zKYh6>jaMk>y9rC;5^+zJk}cE3y4aFn_*x-1wO>%3Z)wNT@JjD3-W$6PTGqWuJ=c5%bc+a(X zWf3B#wBPUpGz-M?F_6ltQEl0@wrW~eBeR*&BK=mY^fC`{|tq0a`Nqrc=IT)=& zh+#W~Z1BnEVM!UGq*k2M%if16c0s@L+wXR|aD8EIA1|Cnq zRi6wAWP+O~e`iIRD*;%C=FfyM&w#n)gwjj~(yVtoT&=LSR$*0=F&&(gLcZ0c|1ab49Id4;?(l1>Jym z;_|ho`fh_##{#&q*4F~Nn&Cffq{pUfEfOH9KWIVJ!UC*+d%Ru_v;@U(E8MNKwnCqb zipv(WIFN~u8?idsfdaoYT(}Ilja4qbA#Jjbno(o}qPIiu&9ml>G&=h1ebWu^J-E98 z+k>;KrGLL=ahq*@PqW;JLDq;N*Mb2?J!0fUe+76DX;HN-bI^pYV(CEt1UI^xI?e9l z9hIoR2{z)@=T3*N2RITu$beh0-*aH}PD}3#hpq=Xk{WpX*0+i-IxK|R_4cCdjq;)k zgrWz9q6dev^R34yWRFXD&?_ePT4whR;pR8`%N5X$R$pt_sHXR`eoNcA@{LZ#iz;5h zho@T~P7^zrJ>+U;_q=R#w-+UvQ+UTfMiIX`yk|Y&p6hr1mhvsg{2kGw^~)QJb}PCg zMyMgh^N$k#%L^c93D;$H{YI)?2XQYPHTL!F!^JDW_PeaZP5fuRLIO9qF&z99zMZ-; zni;|8n9dLaHh-X*ELARWMI;Z!oZucOc4G@g(gv{a7xZH)$0W}+^Ko2&j&S~)#yJUM zw%52hn@iA+aDkgd_-Ka~9EYTb+e}@XC8lGS3~?DbXlq_#ffru3JN?bGuBaZ zcZdlYpw%l&JwLW6V@JLL-aO)z6?)t86}>_ryDY_cVj6fuI8%K zSdz{pKq&77Fku>2&h9bb&YoBT5R~0HSW4GY18}y__p&}%HQLd*sE-mV)pdb(Ff#2- zzMU#Sby>bE;gd73O{n<|gtf?5&+t34#Hx0Y`f^A4#E^6AsDMcaSM%&{eys-3(luG3 z(hA$g6=eZ+1-)a8C8cA&b>pau#U$KYi(Aq1LSiK&N0-j_E?zpAJwq%P(39DDam zfV!46f7>RXBgruIHp|6TX!=;$)l|2~)@+F7tb1YaY?8E+gV5cd6CbZ>m) z#C*@go*M!;Pwii_RN+N;Sfe;012!+z=o2-{`wW+EB1^|xxF(dgr?;t zTlg3+@gc=L3on8SMiXB5*G}P6lltU-g$!4HLR9BfMO7YyUr+Mv9WFB7MYnIFG-7;SSzkxsv>926p+P1^+rA z{*SGh|D>+}TR{BRqm!^Twfk3VX2Ql73k@G)hC@agBO~?G-^pT5yI0ufAIh%++vBoH%`>>6oM7REi$C5`$L_GBwyl(N`{Uf zo`vS>$ou=Ox}cpFyY37j4_*lb;ZSe^WMJGc;mzF4hO=Z z+C~JpX;r`O_@+7fl!cb>fBrT!h&-FL*x%L*~gLDN@#2>(_TFpne+4 zR{nTa)8bSqBtbSHCueHiDEvVpIL zm%&O+1Y{65Q8aXr;vt$4nEs(62cZ5(dD7yLnK<6>JB}jz18_HmQErd|NCtbD=f8pYk<3UL+2`#o^Q`j*;=FE((3&wOR-UMG9jpe5tsV>d5^c{-`{I6<#p{!= z=OEA4^C1i5!jUOctWE4C0>E)+*G8tBUj#!xw?Jw~%C$40rp%fNYC2s}TDT-#J8_)R z1|fa*-ERdGm2jFfp!a|aU6C&MRnafCpuem9j0Iv@Aw^u#2puJ$NN$y-Pvb!Wi*bKw z`gxySgPD;nhROj05_0UfGc3O);4$BpK1j0gK=)eI_aG`5*uZ*3(c#qmig-cu^BPH2 zRV9sGT%F_4K|G5mV!B9;B)L+!vToV40LP*uTJyJS_)_fZa77ma)3PBa<$hR+ukp3H zN}%T`MCSv{pXXKw6%ASR>!fu4_M~Y4`VsptCuQgOpDjs>I&yzzLt1G%O*D#?h2Qz9 zXw{S2UbF|K{D+D(@Fc~(vuK4ni@1bJI=_ETkg;T(cJfWQn{5=S%it%bb3Mz&Nh z?(Fz}TNPLwgv4!Ace$Mt!ic@NT^-Jd1U2BojhH8&E5QqMLVz=li-0N*keXkiG(TrX zIXm2y9PucDF(`K;r4?pJuE1-lHjAX+`CZoFKb4TS8#Rc)nz0hMHAP&pv;G?ER9r1b zY*3#_j&Wommq9d-)lj@WUyqIpm8kAxNUhUNQZ*YA?(ACTq-9Dy+bCR_B678g{<*|| z)4|DB&n<1;ca#phqYj2P>r*vI#%wzw?9Lf1-0|&la*<&S-Nw6%f7b{olU5foL)w|0 zl#@CP7OG${oe|I$3HUQxaRFK2C`>-H#B+x$(P5-(8d=<4t~p$IqMM^LT(W^ju)W=7 z%BVq8>yXHIy@xlu(0@KPWv3UExfzkwPR*qn0F2g;vqD8-nA>d^0Lce{SF&wTbEsjc z;p2?zROy6k0@q32p+!hV0WhP0LW&jv>MMjCZ*P6Y{cKxr@i*YD>wv4heObvl)Az zeSPSA^3n5hi_{0Yd|qZ$9%7Pt;DcpTwPdjG9~_E`tKn|F2LS+llC8*i4l9x~nWf*g z^YaHS)uF->N)AGc z>5kX!)dCe{Up`3BI4+E+JfN0PGFdi`a9pGAi4%K-l6D)uB8S%6dC^D0{K1H%RcxH! z)XR|GcxYQjOoM!9#Iy0Hv|o44HshD(rhlZ$0A}Q?kwP!>qm+VQz`j1rEVVlf2Xd+Gl{_gXSw&C9}RvNcylK$(iX#)cet&D zbLo0+uc0aj+C>ltt$=#A$uDR@BS1p+cGXNyYSo zIovo@?cvzi*Q3rR0heh10q-!>yjuNVp&|dbp+Wz5pkZrkV)TCi_GpD^SwIH#th>fa zs(^w#F&=b;ut}W3U~|KUTflxNjm%dS!(-%f7htGqQep$Rb3z#&P)} zA6{&wV(innSTODsQav=MpW>v@)BL0Hv!&eF5PkzEg1?|}Esorp6$zz_Ra@!u(=zg= zcV&eWZpIQm82jaS3@^os`63<%#(P?|nKpszOmHTdow}YyldM)=UL&fiskpB;YQaLTmS*Eb z@N9Gvr(_&a*0f(q5J|Oa*)gY%S&z-A9@#Ov$(R-(!kSwOohK?sdWO1ozW*Z;n@#p^ z=KVSwslNqu+`m2>lP^zWXQzLwU-fTJ`d_OlnK(K9xyJvj{VyO;eX~J}K{u)rFp@Wb zO5kVi379u$<~3v%m5B=f8Y@J9^uF#sw_V|R-+Svm`NeVK)pN4xW%qG^*ED@1KFg@Q|ki)LnGJp)k}Hr|0KwMk0MkF;R{9`Tcp!ee zZgvGD{PepDw8~jr#)KQRnX)Wiba}crVRiu!*jqBeaHg`NL#?0m=9KBM_=uNqc&XC1Z4Vn5W(Rsz&jSEp4Fsv8rMZ2c+_WpXk3@oazq7Q2 zE5#b{2~0kVA9=iyIulA=iscNJiW7(A$SlW1nW7RSbv7?vNC^gG&co0RKT8ApdAjSDZ$f_FVT=Sk<2Q3(vXUe! zD1n&^ZXMaEZ>JA`RF-~ev2xil(r-UA>uD&=aTDTTrD`;pwvuq2!G^W>2v8M_J15dLNzeRHE!hVvQm_9@H0g({=EK>%x#!zWEyhn)1E$OAp-WPZPgNDKLk0TT zeX25dDW;xC*VGz8s4GzBGhAyDFNNWPm7SkVcpTMDeecwTQr@!x5^>Mkpu&C+Z zE~&~O4rxH|Q-eBKVw?*Qzls3F$j22T8>2U~i?Z@IVfuGH9P%dTd>QZ+g43P}0%ZZM zF^_Ak|2EGYT644zJ-KgcHR{}ZXE9L~n3eu5Lh}j#S-hv`r-@~5Q}9FB3at9F>Ai`4 zn>9v*UkLyU(wth~1|SDe6|Jt~`w<9rH>lMti}F*{0O^_-{!(n7C2)*_^3Kgts&bud ztX`GAXeV}w$!3s76Q2mrEwswLM#uBX*a=9*ZKQH{Y8fyc(RVfYp-S)rmX47~@dKAT z*j?R&Aex|AqE&9jt(~E^7DMe!S3OVd&=RlAif34fQ>P-MdMQrSMoclNi3IV`^W&9~ zbGLrw?nlvPcUZHg4X|dkIUy=hDr%|5HambfV~ZA95#w^v(w0fZYT4$o1f^2eiG(60 zT#bxEC0dP)N+p*DX1P+~^b;YF>y%?)^(Mg1 zT9M(&DQU)1ESj1nJg1a&$*Kt&(UOoaSX||?50W`UjO$_&o+vDBqBwrpXC8qM*ZD}- zMsU3RbiBfNyrO`)b8x?84sR$zZZKqbow7#I*hA^ct$GI%m#XCsu()IGetz_d0r2h0 zyo-zT#jng7KSK2k*1jP1?$N!+_}zk;AS~Z)KK^4GxGKz&e(h_XO#5$rsM-Fnm(c%y zZ78|e+uJ$*>-MNl-mt?GK_2OK$YKv?i#aEj{SG=&T-WZB*}`ujDJijlXpdAT<+<0< zvNEGOW82gzyTOJFpX#Q3%2j}W8=wph0CD?$;t0jz7m&QaAK;5=w}bYEc=Hh$-j`X@ zapq1I57XNspPmnpKHpup_`WzWQ#bgYI9!N5a|9U!)ii@ePQtM}vYe4@#xHQxg0TG{ zX0l=r(F_rboaAE;3&n-31XGHDBk&xwQ;LilGxd-I$RQ=PM;IL{4^suHc^;xUm!&3Y zJJmcP94!R!*)G&MsiJ7xulr4rMr(I~TN>UTJ66?~upXZ*g zKjxMnUCqTl3z?Qj{H1imV3c8_D z-8Yk#LP2wkWON%W#S^Q#w8FTf0f*d|G*m}T&3^0fiz6l6e6sKY*nvPtk+O-Bg zLCzWl`SNr(@h>mQ5b39qN9m%Rwp!?-ji!|m&8TALz*f}fM@h4NovX*?V$qz@Htq&7 zY}JG40(Ymig4CUP%xtgp)^zB0cN&_Tn~@8Znve^&!V? zc@OQki9Z|u#keVIW?naQ{;b-owNdTRTBG!~xzWjdyzG1$_SU<#mQLkndNeiuG{8)E zM@;8#tKI@3=7ZgsYJR=9NX^L(xPOodf1pR??2CkxOZ1N6LlCtg}9AfV(Mx_x0rs??b4foKx9FqvbKCB`(A20N$ zPgwys9yyi2r5cb*aY2Q0d5VVI#4Hkz*R6e?JGFciXhb|bZ#6=cDsZ7nfQ~Q6%sek3 z3%pn0FN2RtMQf-nz*5rIIU;+QLF@-e@5s{yPDU;jO{PLJQtQo99Kp(wK9id9gB&=-Emr`nC6jWh31qH1R&g*Lz9+zeOXa z|0x>xdSh+k?;esS>;i9=Asw?;Dv5y1%LaPf;RV?#xh&W1!s zHdO5ILIf9#;P6;oHzyvSM7`a;U4U&v1_2fUK>j{*+bhe)R*cQ_fQ~7erNx?+`|*c~ z>v8e3l3GL*+*ow?vjHAWH8Z%tBYc|j6!ue3GM7+R&?wU_xAS;z(!3_uEM}Tcaw_LW z<^%almNG}#2x%X8#wsNAhAW#K=fIvMH0$&i#woNvM8}gEHIJjAAX_v;+ii3NS|1|< zT1Gan-F4bV`p95a46}RF^85UrX|Qw z9L$?n#I2c1Tztuoybde>0UUy1x(hZ)-`95&IMX-h4*@g?hr83=sad__3_5+${+#8t z{hZZUiTC*yeGRZ0qV|5uUjk_}_6ku#+@=+fRdhr`?#^&IY{6Gy9}8!8=&2e2CuLuY z$Gb_kcJ;gm(9U~0C{`2@`+5@xhj+hsfcO>!m;111fQNg#r+~*xVsTP&Yr#$0>@8Zr zgy_8-J9^83mveI<;k_M8Cw|igEVoZVmy>eNlyDc-^jL+ahYU`Nq~jC#b`XBR$#3l|Y-N+3^Mk`!G_Cl-g(cW{f}Y zhmU}Vodkvg$nqq>9e*k(UZIu8iSPw)ylLFN_&G^Ml3*74;_=*oJz4RyvL~W2{^EA5 zY`BZ15AzU2tmV0^jP+g*x7MVphT&gKR4IRQ|GnVd1u{tG|3}$7##i1o+oIjEZL_0} z?e5sNwPM@p4pwa2wr$(#*tU(6=Y99S`<(l`yYJZ_*4O!A)qhsi7<1Gphk>&A?-{7xxlsK{|~;$D47W3f2^I(I<(=JX9MA zk@&%vFm{yuDo%=-NZDSgR0twH`a+lWv5}+6GEBXFY?m8VMc>4`dT(8!mTTMQnP@@P z{%Ey8`PtwXK{ZyNT3p`@ombgQ9MP&qCS>}l9Hi5^d{52`AV_q4NU$hv*mY=b$>W3^ zJigR|DDG1oLcp*u9&74K;ryAZL~XYx3bsJYvBd5b6W`^q;h&MoP+D$JotUzFoZUNn z1i~&AoM8-@55R|c7L~!y4VY*k9n*2%jVl`l4^&E^mBQlu`jG{*1V_wK2-YaU2>)_L z4)0+X3hc#Nuod%tFz$6yMC_M7Q zIgje2_TXTmGCz*q$7=1E2|~NnxKZv^y<(;BsMrE;qfAeox21?M!|FQIY0KNfoif`> z!o*|=(;o^A#i9EwvWKlnUvLH(v$s+=(SeDHidGf=U>Yh|5H;VIl>G_3%twa8hOKqf zl3_#V>4uR~ZH{JJ`s0RG^!VXZLCf8aj^uI7;78MMc#HP?l-M$3uHTm%N^fujZ2t ziWZ6W_FszPX$R|pOlh$G7ZlFGTZxLh=tJ}%u@^uSNw~0*(DABpldhsYAQ>6aCsUMk|^J}C7ROg&9%r94{thI{U6q&#rVCOQ5nmW!Hn19+mml4OiR zYp4(`Dt}HQrDuz*KRMFlCLq%&?BAZKg691z3Um#HZ*a<}Yb`sJ8k<&vfLd5u0s?A0 z2Y?}M)8q0et%TnJ;#1WEMXS_TLSkM)bonNB$ket6_a~M549=w#4`#3LPGXOfMGpe^ z5qfpRW{cM~E3-tPF>-Q$ zg1V&!*8XvT{=x(zvsqxW5~~HUIawG)j*89zR!0P^vMN#6FwiUX%{>|X0e}7dWS6f8 zhpl~G(n}$i0tIj~*0@uB=BkvO;{1AiN^86enYUW(uJ8TqOQSj$3B~Wf6UvFAHG#|t zkrwe9*Wx1rv$0Y@$7p!eV!T(!j?)&Qjvs+mEs~%Wn7g^43Es$vQx?lpTNDX#GM


    m?ZYEx}KI7E$dY1~Oz|tUEihGtg&88(5GxA*DdV?bSawG7J-HH5} znGydVN>_v>nLd1_$VfO1LCQ_Sb6KKbkM+uu*xq#NP74MBOsK&fK@t!7hstx88a-`6 zm#{@;O=w=QR*(SKGtUXh5bSJ`RR?rpR0@~YW;A5Ch3)H@UE1I#Dda!Ot9sjK)B~o$ z&FQWl;)}fer`WA-#*YPD!Uwp~J1bd#U|ygsz;hyqD+5%^MBAbC(@lkPO$F3gNJ%uR zwJm#Os4fJZ9vCD=kor5MANEUu99;P`)b?m0?GJ;|8OS6(VPT+% z>B%Qa_VAF8&Gr}txP1ef7!HXamSM4qvOBeYBTinKYhbNE$3kZvJjaHfz5$wX)S~nh zPoqO$w<*t%f38|r)GbkkZD}tdW0bPSlK+G~}bRJJy$2 zofJH`s5D3^7oN<`0W_H{PFmV2Q=Xm|5&)t3FLerLE|dp?5=jzk`OD{V*xhUL&|u$I z(&_cP7D^Wy)?sEFv*!`O?cy~~fcW2|U07D8CG*-fY1!S*bpXA{Xm8Si$$-dxH3NFl zw0&rlft8s;OXhv$73vlD@`Zs6-t_wBvLE3X$0sKsY;|mdD#Gle6F@L3nk~~Ct{WAn z(wtW4BeQeeI;+rHZs84IouWie`n|K(oMZs&#UfDMxfZ1~MvTdN)c1WfS$7Lk~}+C)_BE zPFIMpg{ypzkOv@llS>4xj3if2+La#qhN%Fp%@-NEaJkdj6BK8-Sz&Q5^z^vpMtM`S zE47(oR;NsJNdBVXat57tb{Z~rZ(9EmeP}ceXRVXTL({{}vQ1y|88_nPi@X-wn#f0m z*v+DLvaM+PE2wUE|G=tuZF=Ma66}Pfc z%-li#w&mHZo8d1SJsw{W?HlCINT6+jB_`A1X4Hs~Bd{Gc+od88^2#8}`Qr12;~^VJ z$GrZi9oyi#j9WAV0*~&IdL&3vEYKorj%5m``eBa-7fd?)?BspUQ^Z@>iwIogo?(WL z+bGtg)hrW$IHZo}i%bajlp7$D!(FdGeh;Zsi5f3@S;qE8QRnj)k~#oEardG$Q`^8J zjM>c4BTJ?n^GGGml+>tS&7^~tE5Veb5km|%?s7MBvYZclmNBPS5(5Zz&v>S7b|1w2 z7m2%Ue|Df9rg}fvN3V1iyPBPi!U=6p`}nlWp)3KBm3ClE!$VTT1NO_;*?Zz0evV%}WF84GkYuz^ln8+NTjpW;zs@}WCrpfw?EX|NAOSyq znxYF|ZgOu1kY622`$3DNN=r1kYK$}`#A!2WU#{^ye&LJLU#WAS=RM_TUiwJ&>FnU= z`zpm4Vux)g)^wd?_4K(3`Eyb70joZjOd3|c3zvss{XAsDu{N#=df-f=`LwICvWH78 z8Jwonas6DBJhvN$iT`Mf?F;|;=v$k>2brhsigq`v=hTETi40UbYvn!AmRE-DIZHXa zT)sGQHHAxu-^pY6k&&K*$NUeO+tE^u6g8s$b)#)LjpvoipIP(Xj7OEM|F$y7>IN^8bno{~|5;kGG?LS)KfEkT6_f zRHFA&{4rY)*=Op-Us~QGPJ?5&BY-UADDOu{-IB3DEV3+=qSPrNclnjBubz;6JsCo` zpBmI5wA9kcKmu$GvjQM7i@UuDDAP-gy4SZFVYbpc?sMA|y; zV6EhFKluBv5JJE1ehGkJ6k`3RFSte9z zqh81nQr)y(U^!ec;xbj?gI3rQ(nu9yxZNujlfa_T6u2-Ngx9M|`jU5s#9VA%u>P;u zXQ*6WWqrn7;IA*le-WXITiZH03h6uQ|NFHtUSU)QCI<_-Ow60XgeNc6S_8U>nqmjw^jSe}LVwBln4Qj$838t6w_p%SrCLc?8IAf)JLEk@ZsnfI zUwc1aXw7rk=ifLeY71L3ocyjaC-N=&{lynT0E*dCx|Iajlu=DphSOQbVl>~+)(* zHYkv(HMM^DJ=P0o^10(D@P3I}@jZDV_^|f7*#VTe!kH}T`jN;rnxYzxN#9EGB|!=zGLxgroi%;lFS`Qu^+0B4(BVStrNOP%Apx1N5!_BiKrs z|B(Cd3yGF(Yu{v!Q`SN1;5QfR3IY^N>Btjtw9=Adkf6{JEldn;>Xum7onX-gd{zCy zDsSm;zmlbhmG_axKj$KCoXX%;GO7(-Cnq~RO}Ol*EgksqK7n@OF3v=C=Y){MGk!0$ z1)&jGoniPL1AMspy%-hjG#p0*{_aDR!#XP^?#0 zW3kE{lA!thil_9)8k<$E{*2={gA(Ugl|kKym4a%~#%Rvb>Q``Z3Ww}eD~@oI@r2o= z^d++QnpWwktB}1Ui}d!CrF8~#k{zS|a@_lZ>4rXaYE04W|r%2-jw;8&$ePhHe=v-yN8>~Z5n;iG=KoFl3EXS;h zrXz{^nvcHzm|eNsYT$m?Fn_()P*iW`I)14j-Yykz0SurX!h;YQm0h>d*4Zk5bY z%P$~ub_td)$kDWwe=FZ(AtKrh=qQb{yEZ=6vuOu$a{bhz+DEscNEbBR#_ zeHDS^03-9Z@*@Nf6AkTs@b+>BVLIm+HSpNJo*NgYz+JJj*?ahmV}h=MdF>xKr;ZekC60A6NyPU86N+VLx~L^W!E9{La#r3H-)vhGU@!xzO91M{!LI%5`np14$6g$ca5on2bH;#*u9 zANa%k(Bl9?QqeAV(}XTj+Z#E%*caip9z|cB%IituD5C@NrMMs8PX)c^23hC#QhMO7 zV@|}PDumRrdh8rI29@p0?0qPDqIak`b>h2ni4Bhb@byg-^hGUxBd5?rISKs(9P~lf z?>S&h8m<-Q3-W=8M|IX>vo7-)Vpj zOn~dy0e$R<{G7NlpFAgh+n8SuQhEV(cpK8Z8zZ1AM?gaNnWeRP z&2nihZb|&P^;zlgpCJVD^)*W|2`a1`29tB%F)DtFEfyXlg&f!F z-gjdB=8RvavaFpZ&lJ#m4>DZU3%1JjlHEioYF5vK=0!$1j%3^u16(8A56`F4!cS2Z zct}MqV_m>o+KF!s&TB*sH6suuMbMtF7k1aV(s-{>5mdY4mTxPu;jGlSlvfmc8~ywX zJL$ZP?rGxd;1~1b4nfQa5>3O4SkXm07#HlW^Y+H+)xQIB9=*H?W&<8XgyfTi8>@#n zqFslZSTg%81^{JfC{{Z0qbRAQ+aW?2Yu#(xzRDdXJmfD4SMQz^d<=X^vfHRTf;=h0 z+l(1nF^l?Iqm%q^u>X{-8zSMT+0T+y_*aekUtXpE>w^?D1sGa5I9bX5$0zz9g-iM0 z=F~E&-^`c-Sn7xpmwkQBG*U=>NAj0(k;F&y^W{np$vD&D$e8VneY@ll(FJJ>fj;=zv}v8>909 zST&DQ<#Z*=GVrkGYDy1u!nT~gG>oPkg#F5_^u_v|Ar|I3!Nd^`@>-Ew5Gsa`coy=W z+57aQP1xP4$ey%Fv?)MG-XkcuJ?kTv+b|kf*1_9z07l-)F);0hJ`H0r8?!A%Cxdpl z$Er~USquUJu*SqBnPI2_VG}T!lyD>s?N}(H3MNqNEDv)!mYkqfrhGl4zHkF5PCN6} z(V50qJUbbPQf1Qqy~DY}$mFg}A7@mMvk|SbuenxL9+vKs?;y%$UC_O)u+}qF{nQGs zekZkJPdWt-p;&pX80UUhqtD!nqImd#w`Tt*KbG7~@xe%5kLj-EGDdQ8{QDoT{rQE! z)0<^!5Yfhfu4|UpM4q)PaWb5Q(FiM!Q?Sw+UL6Z&bz$1H%JRz6d*||TTh)Ywt#~k@ z2HGd}Rs~u~erp=k!Rn)V#ki*wVx(d)^Q=VT_9FyxxIB@@Ip4ZZPc4_i1>=Uc=~VW1 zEk6`k3aNWW8;uqR8<~g2z9Q0g^mZ*$G0Wi!PH?vgB?;_Pv@U;v!efkm8B?t8A{+#B zj$heO*Eleg=B~KCIC)H!y;E|&#anO_FnH$jqY0xkQ=_vH@}*T_($b8{oYBW2W)JgS1=WnW3ESQd*!F2jL{KZF>I zyOm7_8{UZJxM(vHuN#ei1JWOTdWMrdp}z;%?d}!oP3x4POU#B}6qHlGY+M>c^%cjL z?YXxo>rF;j-TizY%$*fHlOzeSP)>*@LYAPyrEFD;M3D%8US23wHk0q&sf@glc)&97 zp?(3*7MVa|P>dk?dJvubJ;G+?z0R^p^|7)tP}7rIt!dpYOa86`FI+V@w zl*e+Y1h&gGP=_`N;9U?b|EL2`L5N7ny5cI*Xph|S9^!zt_5G?rK53`3Ssp8Wj_Fz< zgL35fqs;}B(Rf;%e>yDAG?y?-r(1?iYO|M?8U?MFe$1J=MxcFFPguq5EvRHsq>|4% zgy?WyI->A3f+`5k1aL-Ndr6Ovb7nScx@lQ8<_QEfsSa%=&>#%wl_euEjG65+46_eO znBWuiyu+@Wm%b%;vD7>G4Nn&Hre#Ug9IWj_4vEoH2pq`x2Y@LG9AVsQmsioER! zp82dn^kiI4pr0Zk@74Mf8evwDobTt_7X;ib>6%H%H+@&8JwLI4A&|Frm5eR9E_M}HrPE{`s=jM(!B zHuYvVg`BFLTH&XBYlz*}+eYI4&GLggCSzATADfX`!d6lh3Jpgr`-et~!hJpfmV88? z^L1b=?cV43=wUr7p@)SSJWpm5qU9^Km*@GPdt)f zYqVI(?A1^=HSx5*N%HcXTxu6?Xh>Fk#3NfLS1wQdJ2IKAy1C0LEsWheOfGM#2ho^E zbno&V_G^WOD^2{)*((qHND1M{yHnmq%xl^8i9=T{1D@<1M0+2FK}D{2O5Ke3he9VF zQfY47!Dfzkw82_Co$1&(pFY7&r)ihjj{z6Q%Kgs z4vS?S@g^Mi^D4{H4MF(i^g))sZ)rJGRd&lY{n_rU^sAiAy2SZ5%T!76h6NVG9%5ln zHwlHr%x6t|Y3j_dHzca8ve4Wv%ip=3Cx$(Gc*(Ws*{QDYm}r+0)E9)H+q+RSOgQhQ zq!$yk7os%fD>tVf>}$LI-mVLj^4g$;d&MX&Sj!@@h(d6ldtdVQ(D7CueHo9_G)GgYOe@Q(FQ-V5y7fWCrndsQcK+Rs^A z2@|JWjC|zMC&PavOAK0N!fsTMotH9AIAw*?GCvojhR8L!SD&Xa!J{RIaqYK6;1suduKfazTFT<6z{nSHZ1O#c#XP2K>1afoa@sK(kI9O?3^8&Ty1j zK_C1+Q^1(=!L}Z}vxfE_3>#J}Z=X(08vtC-txv!b4c_8jtvgYC#6*y=!5*X?mtc@c zQ&?}KjKE=1yI?#J@$SaVkhe8Ys8M2EH`#`low~@O0BBqUjMcInfO=Ab^BVxz*36k$ z;mWNeuFed6O|B`hB^pLbjK}Nto}|7@T01)NRy`8=a<=|3P!@E)y9xiTAHG4egafDY z1S1;{Hu|<)dX)^I<|Z+ZFnNk-B{CTg!C6aCv%UgH7U7CU)VM9u)K6v6tn&i7PhxF= zgLN}%hIR+1IviTN);t75OITq_pB&bVZG=fDIM=hZ>zmqa?!TbxtUTR-r?y6%7f;tL zf)?HfJ5e^0mBu>iR`$h)+Dne-=m+G>$K{-b06!*xyw4t>tBQL$A2C{pbak zhuuG2Xy~iMYE8@|Gfj$D^gVfep$epX|IrG4(&W%ok|~PEV&18JmdYu>VcGotW4gr^ z?Y!P+didqZ{{0GO7C{(`OT8C`%>$92e)sF@UYEkuhTW_ zc}JqNT}oQA3D5%n5D&AHrQz;a`xVXm4n4y?krXD~DvoB}T`1`4meMN^(83vns;6Vx z)iE^R5aM6Y+4U+{>X6c2v;Q^1g4CePGaq@9MrHOB^bdRQBR)h(o+BvxE&S&il+9MJ zWFmJ%Mk-I~(~zp+>eafdAErAZ2xmK|ZFKfA)Nzb}onJNEUf2A)PbAGB`)$pAm=qcf z1hCx33^R;g+u@_s2L9yn zbVVRC*slT_TF3`PO+S{ML_3^+?z|?R$i~l2z9arq2gNzcD=Q$reEC578`7ot?}6#R zIk5ko?i~I{ROWRqvGQX?_)HvU-t$m7If`1U-seF5 zg7W&z0Y<;ce&&UT`VpsyyvX$f`q)!`Ya-0sSoX3`2j!E~>Ipaw~0-+ck@i4xb8SLTd6fi|vN}Rf#I;MaGf-Y;P zB`D!s*dC#b1^s759QC|U+M0fsyU!XTM)i}fCLvL+XXm0R-ymJE&_2vT)&z|3&vL1I zHOMRj1ilsDmqtJ8k)nqvCcRIHy|R-YgS>=WM&Gj$Gp8`W!2A>AhXTdf$WQQ?{8zs7 zFO0UFzN4wKqnV|{zp-Ner?5?F58Hda-DIh&rbCb$qOsN*T>TyXQh?nZiUnuG!=XM=r(Z zHWS$du!Uur;Y;m}i?@siH~Nhw-S?A6$S-vLCO@@+9baaCDv{($`+RXR&xAK1uwUMN z!-C2INv&VX8CT&ypYcv*b1A)bw(>5Tc{n^=|Kgn&`vTIWdw>XbsrQ9{VM}nC2d|5C znZIP*@GDQn8|qh{;x}2}N2&~%O|$vSFv3X)Mp&=qSE*F|Wu8KhNysWifXh)arehs< z5N0*SuXgX#8^g}7M#^NF{Y0o$CkHODjQnJ4Nrr6lRRUhcrnR>Q7NaS zrM!uBVc8D$WYjUsVIvO|rV z`Fcwh_SE3GrCn0$D@#GoLf+ zV%#WpWz3VQx3z89u`$2pr8e2KfJPA6#phe0rAZABI;|*vu(M{#a_VR*_1*=G1IAN9 zMp^s?gCc0(;YmZw>E+d(hUUsVnJVTRh2;FpeS$CUkh;56>;5e;jD*plnKt=5yWi88 z1dVWBYB8Y0k1SdIdv5G#Q?BJ4(o_)e$`Cz@vX(hf9DcVP-PtJIp^S3E_bmChWnz8~ zk4DIvq>?DqjUA`7xc?=JHS`vsjpWxoq<~tGFtJwX37GN*_Sce4Wh)(6eWXg*9uq;t ztpit5e?Jbio>UIJ9!*zXf9LtPZ$K;ps_`FAR#2tYK~m<2ftPF%reIEY$U25los=1! z0lO4I_xO0zN3D+OA&ObQa&M!`!)o>MZgyOuE{=k~)U$kgDK~q!t~2aehDn3svK7%% zTz0S#`d?=2G>Ra$;@)*2#z#e7R-5yj4pI<%h6oBd2kQ+yCk>I?R7khBb0k z{vew!FQ>R%d)aHNbG+{cDJzbAF;!XPTWBB%mzGWEMbvabNGjHHkWIm)16+Cs%AeG+ znZ&{cXQfv)vx?7eD-WRACpb~WTC?8Vf)lIGms`;JWvSmiwz!XuID;%SfRM*tlhZ(<~ zR-YU!8ywMProLcIl-&VL`Rr`X^Z~Pe*N!eSmu|5}2(0gS1<+)xThkkS#aYtr{`h(R zg?Xzxz;h${J;FD2v%#eR2U+#&x$t}|GSlijxGTg~xND#Ubs<`R6_(`U3-W++Q;Ng{ zW#xgn??~m7>>g}S>Xa8HlwySd`r1mU z`54>?&s~)+Wfj zWtNuLs*<=`zcAcS-7C^jv|OL5o~VrA$xp&IXP_fuIqTg!|0%tpk?Q)> z29&Me$-D~_yxYEVz}s=cpAj<)&z#X8{t0AU_&Ew6$!*`kE!P!>$skXG+0?t5BtNGY zcC~JA*yjOsw{c4wZtBxh^!Ne`*8(tZvg1b);mG!$<&ry5@6<&X=B?`#5XR+!z|76- zVh)2vY(|K8O_G&#uEMIUXO3Wt-+s^@%vOH2wrIp}31>QyK+qON_-#Y^1j%$SYP_vW z`9f=crJ5GmnT_CM()sAL&+@22N=gS8gt^ieNs$M_ZG?9}oBb6bCj?S&rGz|!;2*PRj!XpD6-Ci#; z1!2>P7j(E?WK6RcA$2I}4A%+on1%;h?T$4anp|N^-hc<@-+K(lP6M6>VNmqN_jV|E z3oC$)QHJF}vA8#eQ}P!qNcoGeV=Or`(#7@?VS^b!+}>aix@oCPVXY8PrR(xt)auAR zwb2|+t|Yw_PaSpt)>AnLNmSSy9C-2JOZ6%jRxlA?MH!Cnqr{!>SCVPlEs4rt3WHvL z+;;xtzmJ$O?UDnVXMTw^$8@q{Y>KD{Ije`&+oShZLv!!B12^Gc0rsSVRq%yI;O}HK zSLJ0GiL2DHd(O=QT!3gt$=KTw`z1>J8u9PLm-IB6DdF$cTWOQb7%tj($j z!=Tp{Jl_X*i)5N=9QGK$EH-6fZM7!tO0l2(f$t9qWzQNiqD>6!~g?*x| zpz!^IeO5(CL1MS)#8^K*BN~#ONpj7jRfEds_Vw#hI8_ZKvk{>|4dKlmd0BK~wTup6 z**W2KrPre_YYhL!@w|VG#B_P)ung?vEIvC0bE}*%rdoDPsUt$0&9sDizM$!??{LNa zs;IFZ>JGl;gGj(W=$t>S_!>h{4~lsYYJZ5kC=mq3K1{AvQZCazYhcn>!vjOG81yFry zsnLK(SYExG3Z7DXkeY3K&sWXtW zV&RicyW>~dRGI%d+beO-o-k83bW@&X6*(n(NO7Lfd zeXeG>gYnMhp9Z=&q+Q43da2Ul=1V35il5h)lX+4y@=Z+zh)hbY;!hCFGq{=T122+q3C*=VfG(O9NSy zS`K$|GqcHlhR6Bp5@9Ew4|r8jJd3p+4?HTWd6H7EA-v*$4hX82(|6@rwjlSm;rmDQue430 zsf1=iZMYAncQxvSRPBjG<36J2@J3Z&mNTw8`tt+{sclWKq!Sq>4KEG8`fCzA;9JN7 zD=x~$-{9rjRLUaav7h@;di&x9wd?!-Y+v`k08J%fB>BSdSoTD}Q->4O19Z&KAuY?M4JpD|)yL;6&2hf2Yn%T2v&>z=i zy|>)w-}-KmQu?7iLDerRe{@UTCrMN=AIfDO+@09H>gOd z>-VP$>~3}bk7zhGsJl*`#<$U-`-90YzJV2NoN&4z{jezfoQwkesmka+FbG@NMtUf3 zlAl;|0B643%-jo9lzdAO8^wnqquYIbwol(n_SC?9{d;Z?$A~wh@TQk6jo=NJ8Q^cvGm7l~)J- zIFey%SPbo8CMhkleiRAANhXos3-c7(kw;XAz=za|q>&3WR!Nup;$M4XIq*LJ%O%B4 z2!!AD(`td|uWyR@|2_2oTyEy-_CIo4_zR!@@5AK&Ir6`J*}@eiWl`nP_!OUW>e_aR zWrfis$l

    m1g>s>>N92HY%;RHUdKT)fwNF$qafoqH)tjcVv>yY*Hj=ST zsbUv|I~^vQA3WbCTrOT;UjUIoz(buNbJMaE0hS5dbba3~h+b)+CR`)-_SY1+sq`<> z&}cGzNglVZjI5ZQnK;NrcFxkvQGI23#(i@QMoK;8d-2kVofR4O>Lg zuxK?jvo|-xMB`Aq+VgOVS(`1yC(u+BhRKO=hKjR^)yaPxEnz$-R!0n(bIi>Z{$yB5 z=Z<&j&yVdF(1swKskSkh zWOqnD#I8+UY$0;A3r>%YJW7#m*_1Xy-er_FJ&364Cm0kBpSxw$tJj9P(-x2V=xEq} z!47QWi@ z$`sn#BnqRm;Z2>N`5VeXjWtN{SPq!mv=n*uLPHo$jq=!84s-&Z7t}Cr2t2ZWqW+GX z2_w*3Ci35R!JBk*NLsiQl$WAayNF#xOGcp0sO)xGn>MoSyOo1FYoZ#vLeB+W_x$S; zp`M`5@s;SBVW5>TuCX~z>B!_{#6*LmDmT{!0e#A1RW(sIU8Cm$zI*D;^jiiivp#t$ylZSWdLUby98Pb zyZ8}Pd2X3oN2#Q|eFNroG<4K`ui1bGj+*dQHsWWS3rS?-PT5w$VRcj_D1x*h3b@Ty zfBgdj-+!^1Z(SaEX`hK}|MU0XPj%A%|E0EnWuyP2T5Eo$Bcykk*3kw)byJAi&o+=X zg%&OJ&+XlPk_u5nv`9J#dukYoYsRfaI3G}*U6?waRKa8&F^{0050OOR$oJeeKtPa-FEzrg8n{T@ABn2P-Ywg!DmQr;a#9Q!MTkE%xDb}%ZmJ4ObS5pIBi zEU_0yge8oLC48j4wo7-! z^}2=xYsuQg*cRIw__R;2DauoQmYMPl8#+eL=^ulhJJc_L0I=cGMP^qRhZm5VI=r#= zA?U?~9K^>NkcI8zIOg^@2~k(x=Evd0K+47UM)G$GBYr60WV7Tp1tT~rNJxmCR8-}l z=gf&aE;9zK)P)ei!@AgFPDeeH#gH+h#pn0f&jo)y?m~J(L`~_#%MIe`51X|HnWQwx zsM6VjPGArmdJw>P@cGwW=WTMojQuR+gMTgLB>(-_{$D$f|3}rF>Hq3P1%R!MgPEg^ zz1zRp<8&1ZM=fRacNwNisc++@R9@exZlfp2(i`f~O=n{A`XN?WVj8BdtJq^x$7o}l zdsn%=zAivgBBCQBn^qHPgs7PzF_kM(k~Huo_-N66G-=WOnb{-!cofwht=IB?Sx+5y zWRmt*x47ps$#l4XzvuI~aPYa?a9Ibfg6M=YX2CZEHKW|)NuPeHVfUESk4a6-c#(Pk^ z%`&`~?8iG1qyr-+g1*$BuVUE~Gqu2kFIw^09cz5E$fMZRb*^&`9vt+?Dny+9=J|eDq zfZR8WW#b+xDy99Jym@S1ZeulrWrZfUz-0Vz3vAlxxgEo0VqSdyvhb86SCvmylz!?` z?iDvo@9*N=I)VvP_2tH+z#bk<-3c~@tKVhfqz&1l6><^hEgXW_<24AW>Mf{;EHl9N zh2s{>fRbl$YehrU^%JyZyQ-l*#W69IKX?b87Iiv_c68>PnU33P9f@(K!#HzW5Va(^Zx;3s##| z?l}>XFQ-r&W3BMatS;z_F?6g#*UtfQ3u&)0Lfw3&EeLt%-)=VVox&W5prc*AP7v2F1QdBHpiW&x^RmHm&rv{(@bIwhnhNiyPD)k_IS76$ zXA^4>Eb^-wOPgOP@++9j=%Mz&TY{@rLua8}d`t(i7o+b_P8D8sPHVz}b0Rw7OFnOj za71C-E_p8-FwJUOUqmn^k=u7TLh3r7xU}#tkl4J6+iME?A%-14nGg1e=C!groMlKB z?&iQo^%T?C;0d;^*!2qMbfnU8Vi5qI(xwciu6AVe^eW) zK&W_m%_+e3pWs7BhGD-X1fM{ws4I-BUr9;u3+x+JwN5+mTdKVkv|D{QBy1P?evgTh zyvyqnz;Pm7otIRtT5lyPHfvEJtZmpGW(v(cLBU~7Ua#-fge8K+kGR7$p+}YZcqg~` z3#t=}Z5tJDqi-?^W_64|v)(#Cq0^*CGAF#+oXMT~o zy2@ajiCq{-Qq19=IM=9tE>R)f4lHWo9ahGE)ig!TK~o*Tk{c-9kb&zW>r6CZJb4cS zR>dj}?RaBVOFR4N zqsWeM&K+{bE6jefO)-S1npw9%b_bV$GGRm1BxZ203>w-Wh^|w@vWx1o#UB1K+@m1H z>G+@Uy5jnWxe3UOHVB#MS|H_;s*dWKR7;D5BYtiLB-PR+hpbD<_Gy_6K1F*Vv=)pJ zvV-|IA_czw9|YOwqEyW`GgS2`(+CAu!rzU|=?yCAtknc&x_t=7xkLA8GrkX~pNQzrX@)AZJzcAf z^sB{2O8y}n+JSJP`6=A`poU*#ANu&%Y9kHu=LRZ3oWm7E=07L>ogZ| zzqZcjQ7CBKhqfi;owDf5i!j#j4p;}$Oi`m1uF&C(6h9)`NFw(pvKFGJcCKPx@NTtI zM_1+!+dMK$<)xn?e6dUx+WP0Axf}^bANyQ3Nk*Twx$J{!w?L1dqY6>LFV}Rg=V2;n zpjgVV66MXT<}vcO@CpxJWA?qrm7d}M1i~J>^E%xrDYyhw4;kiDmeDAy@k?*n6kob% zz489J^X(aI+jPbNS)SVWr;k*|wA}-r8#JPXMt9gr5^cr3h_Dc@o~^|-%PQL%m zFZV3k@M$;mc^A)p(A1UaAPw{sQUTL$*X5> zEnYKVgJ}HclYB7<3w9q0`Zj^L8Ag2d;ZekZPQZpsf^2o?_4ipbTEW`;Iw^w-!!;R9 zsl4=4rj#Z>KWE7Ka0;W?N;EZ>?icG0vg?St%Xwa@WLQhmRwO0(pYtR|$MWSk^0_Gt zy4ryO=3h1D1j^(>r?XR#RVAnMt-CPl)7&HCq=&l7IP-JzL`Mk_CcM=e2x&f0*d`or zcvU<7L-4h%vUYzSj0t}HiwVgBpp`{_0;N%uzrh9G|6#lHU!>oEyql*-|BLJcZY+79 z)@Wzx{S^LjRYDtl63!^1D9sWT1>+y7!%f@El)q+X+{pS)BhB(n=MnT(-k*7;K)59v z8uKNC*<@nS!TDYL?Fn|1Jfn5U&M*Es ztf0r)5666aa;snimiT6c3>g+pw4$R4*M0%Vo876k^GjXM=|!hVW!*-9aYHr9055$J zH_EOX2FO7_i#}lQ<#Wc%tODx0pK+>lFGjn0#yU6XC=10T(+tUvv z=3|>GLh)siVs^NkAo3d6+r8K!t|KM_DfAEjJ1^rani&)ok$%>ZhB0lY7tFHZ!+Cv2 zB`coZ$rwIs`-cp7pR6HsYB6KBA%de`$EY!FqI23P)MGD+XwhP#r6nR=F~UMWqYIE~ zo8NWC59GoNF)0*({$YSup}~(EKP42mf0a-W{V&qq0l3nx+Zyepla4#KZQHhO+qP|+ z9ox2T+h&IyXsbROH#hhWIUK9IEcIYeo-8FMvN;JN z8!YJV{&nVyXFf29e29Pq0gpZbqt4snF>0ata^$#NvY}nw-T;&5RuLB|NV=w%R+}8(^~= z^_s8}8&1}&GE0G~ldFqxwC}Tvc$g?XL&;ijP}druqY{F*LmT^PL`G+>IHnCLhB|Th zjF`vxN%=uh`&k;Xuev5vw?u6`1$IuLopM&mzOsH0_F|P1(PB}wQccE{$ylcfA*dTy z2bU0J3;_psLJUQKOpT8q*viK$Kjzd93Gg{(AX!Re(1FZ-i5KVQ0r-iWumAaM*Cmm= zvr5D<@e~s<_6Zw>Z(Rs~yEJ~g9W5ki2Man(9Ppk1&1p-j+J7jk&r4lD!UAol8;KuVI2FHyk&u-PeKadKZW z@kokoKs^yeIi@oCSulFgF@P}%Kj;(GIWZEyN11K23ca|buR-Psnl(`4Hb{zG;3RyzcYA&i^Z1O$Fr>D zhJE4{AaV<77d>w}9{Jc>Z0A=u>GB|C^Bd$eQT|L-X&P&Y6SH9hE%mL%ppQyZpzS&% zJv&SzG)*PcHg8BKn(o5fq>1O|>_}6y%E4@|3Fw!sJ-jT33c`xk3f6;>USLCGR;C+f z_l?+HiGU*GhG@pbarb3x;HEsWk}&x%(CA8W-Xv#CAz_d`RILKBF57 z;hNO&G2)|Bdz+)vz`v_k(L-`Q*>8O4{o8L$(&xKmJpRNZQ$kDYRH37L6OP*`MS73OZ=G$w9~kj0NP`S zp%B>J!E{-upeZ3#=es{xn=W7D|L9t?3`IpEG}c?Flck%ZAV;JrCyb2qk}x9Ey}ACvE$-vyMi zDP|_CP{hJ(T&R)i(~x&{1V6s~oWrzYudE(&nXhP-j1$)#b zSho9zs7n3F(@)l>Cdn;st*tNHa8f83G$b@6cm|rL?ycsL2>JoxvllWFz}R31c79oQ z=CIccmq1Q%%fo8qTlfa2_QF!-MTt|}F+H&U`T>BB7WZp*L=&a9hI@k*H~4%}4t>Yh z&adtD49p9oFHOcQN`~_GWev@O${>TWP}T&nVX>*D(7g+#XhtxT^|mc3pvE{)pB}Bd zb=9NZX|OkC_-xYrCn^DRDaXpYWQ88YZvzU4OkN$8Nhb(^e13~aZ&?O#xL|Afa{06UC>QJk^f7P2Kl!X83qyq+ zE}02Cq}c$Tq<`)4{}h&glDxo}e|Ag_GL@1QARd{S0{}{iI}~~@ zIUWS$3jlEekeWPrXA%(_JTjLLv>^vQQx8rLgMFp_`>i9_ZzmRwZ5lB6HroVvnrh++ zFGvtt1r!EvB)a`oe6FMW6!)kNsIN=*R3(IdK0WProXi$-Y8Agw?vlKzQD!Zd;G611 zwSk=5xsl|0v9D~SK`O`da38}`H zy;)c#L$OEu1+ma&2}T55iFm~T9;fMz1lb=+E?RD)$p2kkL@yoyNiRfQ1ZPr4HF`Kk zwfy2vSPy151#31RWHUQDKp{b9^GiJWuv$VxvD8{jMVIe_J$lu2!orUQ5%4$xO&&DV z8+8Y{>0zXtJOMewQ{&ihAj_MZPFZi?`+5SsS2$Y50zN17CzIw9ml9=e{1{-q>moGC zF_Cw8c{b4ncH9g3QUoQx;}3s@5hP{*<1-#Oah#+4jqK5=G*Zt$nS2Wwb)?&8ERX*h zOOpR7mj7vgeUe@Ov@5OXQrR=t>rE~Ai*Pa#)CzBh5hy$f+S8`_^wYRV8ZVdXKYNw8884$BS?&Pca<8}%iOpmYh|Ow4!j2m7Lfx9$=!1^UT1m_SSG1|t zkUM*HTL?n*R!CXu4jysn)dQdFWtv8=Qfaut*BsYj2RULnp`AzXj{=_C zWt>kQ{i50e+leEncePkQ2y=eMcf1(7@B~o@Uu8#C1;E0y(kf5#^LZ*32OGNNKRr8d zx(XKy8$PB%z8E~VLPn2VL7`$TT?a&2pSsBLUu8&8?PV0@ur?Z`2k~@q>Y1i6ri`fa z4}@wed6l)0k7Y*jx-XAg(chw~x~BsebI4EIJZEQOi>JpQUNt9X(LAWM+$A2SWQtqc z-XyWwmP~h`tqRevoVTtU%(P59NI-?_MNU3Rboi0B8(mg2o*0~CI8GqoqK8FM8`|=d zB2p0=E!r$nsk}K+8AFBBU`o%N(vHp8s9D%FwG2rZPpqf-Ozsc5ZDdAdYNd~;iTT7f zfjiN1TR^44kK)fwnwVhLfJ+e>hXMLkAm-*|q6AmT9JX}MOe5c>mfpLgqbd%@Y@Wk{ zrwMV0qhqe5G1~{ql6Nf*eXnY zr&!6+4T?|A-Wv}UU8T!*U|$=zh;3zj=ad&vVz+ec%U-&c{`!){3@6Lwnq!F=WMMq9 zDbZ7MzuFS{Jx$PfebTs6X-2xLQcLm2kJys=?%urQFYyTmgrZ|n=|5FQ0(4l7B$@Qr zPOxpmdzif%#rjVrq27je=AZ2pQ)!hN>|UfuROG(|UzDbCU!aI(0jr7jS2&?c+=zgw z=E)NpRc~jS7gUEO^wWyNCVv7jleKh$^bmT2$A%A4bfT*c&k0(ieN>|Tw~F-?`pLpX zMugZ=K9?2Ty4Bk;*nkE@l?(j< zeGc_iwo&P;g*PQcbK4Tcr@fNrsM=Hf$_+2?MU`{`OXk1vZIH%loAH&8->tQ3L(Xj5 z0!mYulIkn6UZlx$fvMeJcUO<=Zyt%sJc$zu{y`8#CR%vbo_c8iy>>e=l^8Jf+?hNrw zqX%6?Kbmfd?TkrE63=WhMXZoVkVi0o*wPi^N0vSaP~m@+FqP@B`ZGpS!=RIFNi}$1 zZLn`QI8QM^p-Zc{ZfH@4A%}G9a#apZ=;3mvHr(5hv87tLZ3Kz4n3~95%0u0rGJC+z zs>PgBY+aS?wJ5tj=d0uu$qd;n(%BD;gqLP!`_} zH0gnB!x3D@U>s>L?!jGeEW)tE5f#)HdTR@CWd8(Fnkfh%St&XDrV;pvyAdH@6Lijn z*JLJ+n*sP z(iSn#Pi0sEmfz7(i&>4;ir~oT#$o^ijs8aw^3A+zbHt&R6j!{EdIBRCrGQ6gOQHE# zGn{fHMmI+gQ7u<0iLO^h(2wyg(%@>U$;gMFeWy7te1U=$@*vUe=U~l6{AQS77zqb+ zqq*N5V1viSLxm1+Lq!j9caL)wKXsla<&&oFdc6vBxdcuD1vM+>bo(DpLT(T*bypvB z)h-Krjod(nZJp!PFiu+#Vb_Hu-AUZ3leWp8Z_RRBg3v1U(KM&*nPpBR6Wrm+kBo$l zk#buT!R*l+HfaYw$8vO+#S4T@^B(O3_hsW;84#prfMrorgdq&MByUI+drvrhUC7`_ zbYWfb0N}#OQM<+w_t2aC4l9(w>i7zz;LCE0~^p#v= z;lzBDkuUT)ez8n(ie^jGqD?6vTJmTeVofWzk6*C+pa4+GrlKd0OI``z8H@ZZxYy-H zWJydGrKXm*(jxkCe^Zl@ESea+VOFV9TRj@bwH3$3edJ~XT$@E`KU_k4$nTIO-lct8J8tMf6d|Xc-FaJ=NPq|3a9+Uerh!X<5R{FE-CaVCU54Nje=% zrCZYGXtejeVXn!dXe-C5SBVy`bUml>1=GxbDMxCjMJ$*t+!^IjcP?US(1J@dArLpZ<$x_qLPuk z?UI!Wxrk5|#dZhfgr_>}%Q8s|(WTl+DKopvY^g@@CZ@IaRfG%7un+C^H)ir1?v(Hk zDRW%cMk3^ajrI6yYO1{B8C2OG*qMSrfxAhh6P(ZxEq}2zLg}Ysq?ckO_u>Gu(l6i* z!3q$Z_F;UdL6)7v(`hh^fGHKgwsAHB;0{2r7CA%U85o<(DCl$?~J z!(+Q60%4IC77c1#3xS$k%T(AF$Cic@gj(VL;(6W?rz!m^G zrp0v{{67KUJbWtpNXj7O{zcEMgHd4)PYl zvPoR7vq8GLWqzVi3Bkn=LI6#PtB#>9$5{e=B>m&ocx{QRgNJdh>$KI*d}}mUbr~)F z#W90rczd|JCNeIP&fk$ZF(MtZ!2B{%x`ln8%x0}7iOgi(0hR7SSDOZbqojY%U>?4; z&z)Z{OzZeoH`(0ulrS|Egif#6J?Fay*Wo))Gd>sMXy!GJf|am6Vh8BPt{urUv~?%S z5S;?lH+O>E5RlO8A2^VSP}g3xnZDnRiTL7J&u&EpqzWS8A*I+eOtkCsLp@pv=@?<>NGiskB4jERuz|QsKeq)O07HPdhmP`n zf5~6TX^X$38aW`l9;NQUG8ImfYLn~8#BX3?SDz-QcQ-Y%0>+r0Uu_gB(>TQ>I^F$4 z^GSn7o&4#K)e+1_#7l z?cTC@S%y$Y)3zu6yYFbpg9PzBR0-(1Rc^w|2G<}b)L#Xt1siBjbuxP9N|}v#v?M*@8`!4&zN#CI`T<(( zjepz3lxG(j4b??NE@xkl9hj?RPNN?#*9pG8gEOMmc~%&RS56oS<^bXm+!KJE0*zqXcLCUPDWi%hf8m-j<=XRn2OMb<*h3A zH9v8~iG?^Eug3)gb?LFLW=LdO(XZ&S9t3FikNCd9Zz|F~8W8Z;EF2wiVA!lcrGMMf zQL)e-ttXx(FtRE96t7%RA9gB*U$LBjhs!W8h3~0e7t0SB?2DQfZl}kQE-BFCVmV}^ zy&q3)S(h1>=fOW4LFoWwB|1^L0@0~hd_;Zke_!QSP%yUrb(9eD;2BkjpZ|+&8 zgHSrt%Xv+!8Kqc+hV1B>I#39CoK!wp)@W=R4Ojhi$BXblH34x1(PlG&5rb^l2y!7n z;J42wv3~u_3|vF(~3%P)+8gp9nvy$ zeHNa4NQU`lt@1keBxP=cCV_1B>p&@_sAH`Gi8jF~6s*|AP>Tj>;+b5729}+*bTj5A zyzfg$lfibWZ#sJf4!}@+JrkB;y$YL}h3i^RtA88hLo^EOB)fv$M~(Z^>yn?Qsd4%T z`}+LxlVnc$VAH3gTiZ+)DBjkdk#uX*cLxydyEpGbrv%scosXmiU&OSy9MIBhDMGBa zj|qTkJU%iAtWYAyv`#FG!*-;Zq%GLldB;M9y3Gn8As|LJKbN`|(t08(c^f<$IEY^e`co`;+{uAeIL^0HtzaK=M7Kp>$Xn zIntM$u~so1-&J7;1cOFVf{X0y21%a|w@39<(BP|Qx@45{r=d_++zDYDUn552M?b7o zT>Q20o^Mi)b!`bVtY72tr2DB|4o9is#A%I4)sk`zN$-!I9d_~RrGZ)#Yi)7*3a*#- zeSJ>&VKgliE}%AZF6;^wun0%uKrvF5M#zoCWzIB$?kNgEQwz1e$Fl^^rQkXs8Ou$x zW=QgCiwSBIC8A8|`N{ZqgxQm3-MT>GxMNkRy8~Dg;33=0=nWv8%Yok;f!`~EE1~s_ zHcMOp1vQme(zyi->0Lsu0P}4M4n#HI;W0SDDpzzYHi^4Tt$xZ%Helah2tO{b9=tPa z4?(e`GgtHy&uigX-ll(`oT$*g0)rwd9 z_`?USk}TK${t2#epO1gfe*T}n=KqoiMgGT05NRM^#V*uU+Hr5lfXYT#Pv8uqEw0d# zer5uiNe#kX4a0R@^QW!@$zEzs4?2<6WXA0j>(*v@aA!HZY;?L;^5>zYP*xxNx+Qqg#0#E{RWtIp$(D%V zrpn`fFO(S4JjzzhpQM}A^7Uh&WwVNl@Yg*$8*;9D(Si1MTlwa79BzHwLK8yE;TpF4 zV+BT?ZJTlUNVO@oG~s@MkdQ$Q-j)*8Qy{^monjxflHAF>@eHF5qjkfw3?*#1oPtG$ z%2_?<6T~J*4+`ehB$bdqX`;Y*3|%E=^T!D!`%n(xOUH7Y8%s82UrPeC^ROZ(BX+&x z!oNC-OcEH3&@XIIU6$FjC-B_FyWGE}i$6&Qe+m3w#614&um41N5Bx_Jkf=#? zmNbyZ7sqeCo|4qRAeX2?%#>Uw4KHEQ4pusT&HyJBEMAn9B#bIanyU?oqgjJvc$U}` z497f2n(I;h6>8U+C@_erVkFIe<>=h{^6jE->gi=`>jxl9g!QfqVxDY%E=ssQ{2==k zu2jD*T+#d;{(^y{L_cg_aoYa830>G+>4yrVu|viJZ2{6$i4j{=WXjC7D8`0Z5qh0$ zhVmP5gNLkYbN-$@W-_Bd5XIU}5F?PgTM=VG6gzN94!QXXopRNsPvK8)mN#wU#dz;fX%}0h4zb-PB zQKu=qh)r9`+Tkb<&ML_*fyKHK*$LXudc}hMfEzYVSDx%TaD)XWegs!76zqPgIl5=2 z(xk4G)y6cKWrgjPPYpL?8!p+kelK~`z)Dmc#2c>h)m)Zj*D5f}{!*g9$pcG>ndD2} zY?d7n2B2=aIy;#L0HV7L$`#~L`Ri0-e^qR54-#O;ST03_1~5g$j{L>P>}Ch zrgLeUgL+d7_E=7b)h4e8kwoRf)r_DRWgo<%%r_9s(p}3P7jrvsFU1Ni#gs}X_P;lh zwt?ex-xRAR3^YX3LU=KA6Xh=-=ZI!LbCH+6EES7ND9}_$oC*}&e~`>WhF_CZ3|-Kc^9ytX<63R8Q)7QN_-$mu3lt_uh7 z6w4=QiG{s4YaqgAi{GTn7N%RPc=tYVIr#1T;VRr7xO@~w>&V^F$FdvbG1y1;p13|# z00-71V7kAjb6!8dUxc%FspZ{)xgD=C5zK^hsbQU;qrSdJpR-ZO zG5Je73y0|i=6Zdy?fCT4JUb6S{}5pJEmVr})LN&H(_^giOxi*sI7?^FLYwXmCe(oi z)k?>n4Nf6}0AKoYPmgZ40yHBgu$bAU4T*k8NJ2j@GgE&`A zo48{{m)Fju5V-zj`@;rILXTMn!wLce(GMj4+-8S7kwK|BUtllyJnc~L>SFth8db&Y zIc$q+GLxM3gN)6SK#@aSLWh%SdDrA)nunK8kt{cN(0^fizGqcUMQeP7MvqQ;uqim@ z_H*@~L(Z5K(*;W5soAPtO>(4|NrLK+X|LTo+{%_vM z#@dp~#nK{DLDGJW38rID*}_%KNJ7quEi+1-K968Ap@Py?qD4vyHAF+!M8pS}NA~$a z^Qx~HL1^g+4o^Em)& z2ED-9v@bY<=XTV}XZw4M7J{J^$c5el^A*+XfS_M1X18?2U0t#ugh$0;;s6zieN8Ev zoeW`2J?C?mRb?vj#hi1A3LDCBG$ZIFel+0cKS!0K?n{$lLbCXGxpi&hrSzZ!(pWd& zY`!mYRy@My*G{8&OhUK}S2yOz5hyy6Hjl?ZA#xfLn`#F^n(4Fpx+(({Um$#2r~6i2 z*VqZ!*J$~5GZZp`s<)=_Do8@3aES}d@SHcv1k&WS2sW*K9m98t0Dli1PWc8YBfSz` zGd#3qVZWSWG6mJ0<6@wWJCBIW0URf|*-)~3CBhIZ*H0UKFQqgi7*EAemN@uV?M}T2EtqM7-ioq(p13BwDi*d+jrd) zAsyYaa zlV#a_FsZCqz8RO(Y5pPLHe79^x61tfjq<@ew3l`fpCQSh2kWwVV}KWCu@roGk;KDx zCm|?L;U2t6dSVUYv~0@UmW&{-z4viZ5it5Y)NLC9cw2GX6dV&4N1&oM%sF`KSr0JoL*~2yFMh@kZ0RgP7J5 zJSEVPtS9~A+-@OTDza(HYH(R{p3&$ntV(1r_nN)N)1)imV9k%uAX~S$+Z!XGFvHWk zeapEuvdbUdif8-ltit#+-nFzZ$iIQ-q3{=j#AnvG{VC=4?}117|90noVup>Oor9^N zJ?8ircpnZ7&rF9lZA?Qh*a?1&rnpH?+iN$0RAhLm#KI>hQQw_)-6)qQB9(%|x>>gX zC(V`Ih7w>EOM=_sr3Yi%BQ0m)nS|_mZioi0;D8VHK#C=bQ1cvRg;b*1Dj%yW-YqAb z7suFph|zn1d$_;GO`L+(_4-eu%a0|2>h}3z{5~K5{^KHl{`C`Bss9D6{~)d9rvQV+ z{|fK^+kE+7m*LfSFm=*(FtxV&rxul8lbV-7&@?t;`%15<1Ju3^1$zR?H$bk%w@b*8 z@+tIm)g5oh0y#iOXo58!$+T)+_2_(ujXF0F}LOI z(R>aJs6Us-&GIRb zr>54(QngT@@zjX%>Rjlpl4tZ6un>8rGIIq~StHqmqq#WKxTCWw+o5NH5pd&LN?C2Q zd7nLVKC%Tw1hM>~`T&8El7%pM1Yx|9stDhG)<(5IYLrz1((tELe{0z?)RTd|r>NUh zIbnfHc{AgfYBh&?M^jv?&O%{X?7r1`LfM!OQ%0ph0^5)1@*%U5H-dq3#l0sCW0W%i z`gKd+h^LNUQVzZ06wOojm)Ng28kk+4Gs!(Uc@Z_mi)ptXuGHw5YRdKHTXfty826Rn z3|%Li$2^ILhy~li7t&5V>-JU0Po-@q3kGu%Q(iOqY0|>n-yHU3r)B$TG1;PyS;DX| zJC5N|q|OPa+pHZv2hbOr``>8{+l&-%o>}k79bah1xoaT+H>P9cIG;d@6ozPOO;J{u zBQSz%y4|8gF!t9NZvAMr-@nO9UE=&AEa&8%PbX#xm5&(eJ3^>|M$I@{fstxbkPuQV zOYFjXd-Cx?f*lS@E$XLdLFb<&i2ngU75D}n*I-b~k1-gCV#k#F8pq-nPP;!JEO2AK zOG4E!Okb{4Hl7sxuKuJ$zou7KZpZpQDYMqMeZ!2Q%0dnG`b_yuauqk`SNl%#Y zsT6ooKTjBL=9#}pY&2-gDkW}SR6u2>V4keDm73aZkfGF=nbdkNTk&K5c_0GSuJRT5 zH!kqR!IDIN_E?YpiVOd3E8xGb@ZW|f|EzM^KNL64zCOMRzjhCE4HN))bmU3~g8pN0 zM_=4lj8mYXgvI(mlrAy&$WRFG?r6GAQWS-dl){Hk8>6EPcjL|9tiyACd0~t((f;b( z-qIjOs53Msl={j$&y#u-x`ywU_H&0)W91-Ny1|h2yHd}-(&6|g!`Zzslu2liHTn-i zH2G$;utyzM@-E5krVs_YYU@@u(xq=O5x|zBXzYwj=Bckq>Yurkt2T>KvVldN8F1~? z*Aup)StNsWi_mR@;|%g7BF94ckrm}jQE!DG)KST0Nsb@ryj5+SQ*fhExG!_w(lb!U zDU2}!y*@!eefM2%#v;+<)M=Qyzzn>gqD$ovtw`#dW$Hah9Re5*bs^KjSa%Arh9asv z`_ePnnWCwr^{;^UC`l9Y4Bv3%MC7ybyom&E5RhX~@wsttXc9emXxU>iGNmfz#slBO zG{8Xe>TZ70<3GM$oqGHwdv$g=?35J_TpgyoaatRHNuUGLaGGk=Z zoS{kZdGJpvNroBsHvl_mZytCkFy!|y-U!#@)gtmt6`yk|sq{ylpRP6B$;e#*?E-VY zfr{ve9I~~A`z3LX5K|N!P18Cw_*mdUD~qt$Hq_g)Q|88@5pGo|WWgK>Js@PepSZeLY`Hy zoVdPXKD_ioJn;xZXzFPn7i zQgWL}v0fJ{hCO!xjeGac=Z7i6#3t@sPBaU7wn?T&m>pm+qtalZDoj`wE44vceAkx? zN=+ZUZximFGSSP7t64(23-Em{)`BU!gQlce_XXqEYo`RgIxS zOdE@zxD>tIj*H5#}3ExEmjibAI+$kM?daFuQT@<3jZCeLeS#-|jhI&iUgB0ymcb#zaAGhsilF8N>^^Hs zjxa$Rf-qZ8HHSSXlC(=kN55|zfQ1|vO;R~Q7>pcWhEO*wIjp#WvXMwm4Jzq*G;|zL z;Z*8c=ot6>)32TyY-DN){G%Z8v0wqGLY)sht?vB~?wjjNsQdko(D2`$ul)=6`5a9x z4E}`)iHhp>YYH&$QSmB`rOPFI8YcF(b4VD$i+6kw1kDU35Ww*W7;v*m;TAtyN0;M- z-3Zho1;| z(w&sJL7>KL8$k#Nr$BHdQ$!V$}>5N`14Ym!NcoFC8u4feWEin-GKN2JdpWLS4&s|c0gb&W7R#X^MlcUsY95!#X=RCw5FX@pC3KVKE zYEd8gia14NR$8LeGBF|0V6_qoC~eYeSmqXs{s0foHAoD{rI@`N=jTUb93vYuC=M3} zF18I0$0At9xjyeWr_eOeiXgF*?+2zU1ximjP9R06VP1bAJ6`ADgx!B2(6rP}Uo-hD z*9?|#{Y0I9)>Z1c%;d*sMyg=WSP9?H$~{xxqS1Q7819BNfHU(_D-llhw@d&qF}0cFgeI_q;0Zt2bA{mt3MzH-0uKYkew6Pn)pAttKI=zfJm|_5 zNx~U_KFlSZ#gG{>={rxg>?|b`S3YZ_heXPzo!yna7aE`07j9K6y4CO{6Zt3$?+VfA ze!8h9_&rh+vfqzAM$Z>B;CP+a1^Fg^{(IB}XAoTXvu?r6H$Qbzj?6ySUSvl70O)f5 z-fs(S;y+g19r$6 zlQSU@oMDq!n_WY2sa4pS9cz<4-u=$UI!9_YN3`QQcGEf5*`Lg7l|AG4I^w%< zUq)l^Xl7-h^QMY}HPu%2OPhqxo_(#f2Fxq5tma5-{YzNme7eugdm*uOzHKP$z3b5J zuwE#|W*+}AS^c4@N-;fgHr)KlV=04lWw)-x)9N=G-vYgLzR|cHV%vl=@Adx$qWdPA z#r#^Mw^1$SQvHrs-Zf&sfo?cvA$;=HP;-#?enpIS8& zj?C#qS26ZaQy<=2-tS{0?^j#?)?YZHAM}^QTv4mWnsN5@AT?8>ccEyt!*=K@Ll)9$ z9d^wi)vuJGD|cEU8N+~UrUYUU>lP<;Wg%H<*JE;qs94fZtI5za*E?uw&W<~5j+zO%HA1p7@dh+h9yZr8#{Dd} zGDlsiO>WVemt0`UI}D|wJ`E~cnO|P%p4)Ev5*2Y)_)|*cSb~6BnbC@nrr4bLMNJK zGYz-M?x3+|jyld2TX%|6Y&oNMW8sDVl&VvcgScf=ZeV)YO? z(XXei1ssbwr~&^{BYBInI4>HY!pz+h{PFfKF9h{5b#XO9+>QcEN`&h;92jh380>*- zklqpq0dG7Mkk~w^cRDpH1u;{CVk|UVfE<>06xL1@OtXGdOgwq^wK?vvMBdgCn56YRzooqNHv#cJg{JM$OSE1xPl~+@5l=2 z4+SPH+79bGz?Le^n97XwX$>sp-GZ`%aemG;mD`OdPJ2FnpSnaUN;V*uV#}*|aBxH( zR0{mD#STj1%!M?hx}(9n5N0nTLo_8i=#AteA-I8=GR@QL<9v_t@NjAiJiy49tb~dRWN)% z{OTZ>pHdB4}yGovN1PK`y4y*yMUf? zJ;80I+89c6F#xt}*9VrJBtPzqUe22bcN6OJoAnK6EQBHqpo>?*%wLNeLM7(1L8F_z z(K{-kAB*RA!42@X^yyN*s)D+yGWY)wY~SDO;(IUK?-I&9<6vD!^42E#keBYRivK`* zx}B$Wr3<27+(;TxKXf6OZ|-Wi2ElmBmJ>($vFltE^L_Snpzy8`OOLavV+ZS7 z00Aho3doYU{5HSVDZbX#o}Ff=L`PmuCsgD8g?yBJPN(JFQ=_bi+RHtv=SxQC2IUKr zWQTsv6+hP_F0LumhtHKZ{JSjX>vf}>nfzRq+cT~Esr&O4zWFKf>Fanryye2(VIk*2 z7`Mt?SImd<&4*CtmaAPY<-2j({ruj|2k$%g$Op3H`{4-r!lU%Gl8Ufg-UAG@o=|BD z>?JFe?qGYJw@T`VoE;fPnKxs30Csp_oe&)56`2-!@jEIou zF{gm?=z?<^v2iaamd3=MLH8c6o>lI?Me`84@~w-o{}6jhy4xLWF7YVVkG+v6o1~lt z6(KYgAwY_k5xeXt!$tLpw?D+mxn%|~?$2|I1n9p(@?R=Pep5+ZD_vtlOG7J%|Hu-z z-QS&UAx*{#Sv%(olx4 z)%e}6dBYU? zX~Za%LX}51mCB7SiOARxWxdRS`ikpu)fI^_c1~F^^{gkuI$4jisg6NEFA5@xY^ui-L%QK8IzBTp- z&Cawd)C{dDZkGNe<-~O478?Yo{mE>PCF)#Q?!mwswF8gZ%#KIZx!4`rc5T-O$wWn^mXX!ob}{rSW}*VO7iv>_AaB(3LoU_8y)nZT%^ zOjiL9$_~hF1t|%>}IOE$z4N0?E#YVPI5m{Nr(B)ZMXm%4>nZQ+5 zbkHlB;6}u2u?zg{uGE5tg+}+d?f3%qd6yy{eDwP-QG@}uOf8vA*-BULZjLjA!6wMH z?BguQ>HwmHvy~>^n(q*trfdLns#7W1`rnes%$qd_4d24W+1bY$_%+%TTI_$G-L5OI z(Tj659C2(A2Yo%=80dggkDyLowG+Aa3R3&{<5ik=>Zt$r*?VyOYisGhox%NA@8S1? zvNP3l{L~Em=iZX2X@Q`KF!V9!*bs<^*mL4! z0^(%6n7Sfn{%giqe>a?Zu-}<67LH&BMW3egq^$F_jLTf_bu0D6$;s(hkIDUKrv2s9 z#x0|>*Ym@f^_PrpcTtRP4Y(Iu)=;T-qP?()&jNrLc1QzIdEik9ZplV-d{YANo1%rb z2`^UoM20EfI*guZh#{^6Dl@RP6vuj;tVr&fI|;Zhfe!dfTtt(B3Y`U*WRTiCK|YaH zDY;o?Hkx>g>dR!t|1YFf$aGWzUef9{)HU1X}C`R@wP+ z;Cg@+I|1X=sd&(70wvZ0yc$*sr&|OOm@u`Oc_DAO!3dpr+QG5kCL+y`%41U)>=~#H z)V#LTch+xAR#dZ%mVC_hBX+jDbyS}=3(N}iRY->l;>c5-wIiyFmOJQqqa}olUF8R1 zr(s6>Vf_epdxgA9NTX4v*TqPVwlm!BihSCIOnz#SS0&d;gKss64KjzRbfol!ES}0h zyywwtKQl&DW;5)yXxZrBWEZ5>w98QqGH0&QDYB4RZP6S`d#O zc^wUUX+xnj7d&g#R?ibVukMFUfO7{b!n*rfxWBwqHb9&9Y z_rd=6rQNu$_o1C>+TDqlr^#nu+$?jt#ifyC0nvSaMPl>ij`&~hE!lZm!ZcxjUud3 zkU8WJ8xasbqN$MWPWgjt*5qDCjE2g=a2c8^MDng{;-g0Nn=@ZYpdY4If`Z_UNb`4k z0jeFO#9q)g1zF+Im1B!M7u^#nrqOeI`%I1g>U?aY$%P5O&+lSbM(X5uv+rUS8FFK| zRpePm-o9XO z9_{zU>UcqG4=EA7$1)S6x##LG%{~0(mOyb?PIi5md`K1Zu)z0A?x~OJ?#LYdeA@qS zgIu@ut=LaFGUvZ>hCX$!@AwX(9>PM-@D8R{oqf?Ad|}w$n*mn#-9R^rjQL+AOeAJ+ ziVIG2o!H|mZ6uX+;OFcru`(ZljFgqwc_Onng@w;^%6~GVOg!udG5IXx@A&lo0=Xg? zy30$yRk8NkenA-Rh$&?u%?G=Ew-yxe53SVf|$qFMRr{ z*I<;MOK^f;urPKv8vS`MdQ$ZH;?aLurGA+iRrt*7-i5;EQj z0CPDkg;=MTAz5Kl;}l5(9~G|!i6jZ#I%g#jOhl#Gat*$s)H5fUCt7O&ojF40TYKQM zBYVLX8YpI8WpdDWGyuiqtne;05tS010PuGtV~s!c!8$O>jX7+%vYJo{bv_;vDi(8w zf*htN`m7@401Xe#%uh+Q-9X$TN6=H2c%>ere7lO3R{xY0PdV~qjK!}pZpAQ$25T+1 zShQ;mPE896sl3@4Aa|3pnKGAhpHt@4jKDne33cnBhrbDPZ7G(mgv!LQw6;-vn>253 zVmf#l>7a*P0_Fxb>E2dWTp1Y#4J0s5jQwZ8w{&R66cghJf7bQdokNJ~PQingYI*&O z#<+5M`)}*aW!niGi=%^88`1>Wbfsa#dg-WsTgFd3GA2q@ZC&>2nN`E~wycytIa$Uj zk?6bm=5YIF-XiPZyi4%^f(pH9+NU4DElKY*y8W)1eg zIP}8C3_~G^&8y0j8XsI(;_gNuY?3Faktdj!Cy14Y9q-&{yhE4ylboSB%gN++prBV! ziuF{GlRU`H+gYfcv%36^{R4Rk^)jCCKN?tIN6j~anzq_NsHz=kBVIC{--;Ni7lIPG z;3j6UO~(!o7&86Xj~T7obmCVC`$?x^CfS$UfP3sHI@(sCU&~D)JvS!oiqTl}k1xK{ z77%|{*>hJ5Uy8qAYn*+fuZf-1!f8jj*;L4~^~X;NBORrzCidn({$xo3v>f(0_%8TI zjIAAYR}O}SvQ?%swM%Zduj2-eR<4sJhPszqQ zO8TCt&Rp)EJ{)vy%4qw1L;$1%W{9|{sj@z-&Bnk#kC}&1xBC&YDw?Z ziwExB|;xB2zbO?4><&~$N2YazM;{$q0+cxD?qsY8>0TQap0?xd%%fn-=#Ap@PHXp zQ95Z(%mPUB|B zLs|xmM)f)eEU$3-Iu)}NvK)H!b@&zt>%4^p>uRtTguv<7&6R!vRiddzmskt%V1dJ! z`37R`Zsb$9zUN?mHE;8$AN?mDrfdJIXpQUK{Ui#5Ii* zg0=)XpVuT#tNrONFB|Udd;+_h9AuSQ?NalKPKYdy`+{+B;xb9K#^{Ew>NgZ6J#pX0y(Ui*Km z{{I2nXgT~NpbTghM~^KOPvDbb$y>tPf{}@bLfV%p$}53`-fTYCk8SiCzf%O~?$l06 zQz#Z(B}Iyj@UP}HVx#O!c{Mi(-HhFgt-ZhBd??=$?JJJ@TA_@3{b8{f2{|^R6>P}L zydxOe{E7-7XBl79YzEB7nx|MROjJYFHgZxYU}4p;g+Kiq$}5&JPO~vBK~Xn3inzRi zuE8UrsvL|7#yJVpt!mHJQw7Wt}i84!-Zm;@xwGvOYui0 zfyj^jP|0Y#tQ0SX1TU0Pi=%2{I^tD!E+rYNOkCdnh0vq~A5{hMqsQMUn5;$~kA?NnUZJmFfq7@;t zJG#}LzEY=WmnyeLwA%P&9dfZ=`Q3Oh@YusRVS{k~r|J-qG@B}&M2Mj;+wcg;iC;3> zVj`>}YhyOcxTSwvvt(xWu%N7XRcLO^DAh7VRaU8^uKOS4ggZ_So9P2NQG@^g|0dcy z`TPT${_no{DeA+jP!a%t5tO_LBB+biUKk3&Z7Z-z!EbN!j8^AA3np@zD6{R68DyT<^-)!GCfE~ymwvP?4=;SvqBYnsLlhzg&yvR6M{D3XNd9e-Ac zGp#OIQ~KWG{idj^53Kr^y%uVz9cfrcqcf#y?`JxN({`pv z3F^cMbMi=TPL$9<=7FErN_TSOXbL14)1$iRJ`1;WP#R{Sd zltR+eaNE%r(!Zd8@R6CWXi&D)>A#FJr7b-z?f;?6{1>nh3RF?+`@qT!kW%y| zF#hZo<iZYMIZO(V*H&f^==Jl^WV09YTd^!k%EdQb1kxz_tuAV9b?0GVt44z23QAkp2dzrT zmzrS22xqwC>BEW9j{~8Y;xr%Og;M(<=c^~DHdk0uO)NBPi5dToFO;~PJ6QTy*LH33 z`8gwLA=h7(9fxI_w*T%^i5WE8#mv`m9Ngaula3Hsx+{r&R~!Esj*2aUy~R#k-5}}t zm*Ds);uh{kdKSpzk9<5iH5{A70}{^66#-t4w=%x@vaAq5~vaoUWNAEVFja#-?wIi>aXByeU`XGa`;F zLZ$0?A!j97C;yR{Le!hpseWWg`Cl{iFVLp+hY99?z^4yV@Bi5>l{7z^%f#di#t? zeoSs*%GG1Ke3j)qkoRk53@)SnyWuyu1>!g{&;rw1AefOgH5Ag5FYR*Z(373OQDEz* z`QSFpQQb_k%q3Ucd@C{P$it#{>q>bgFylizM&;BcwT3+tOIaKG-O6Eb*Q{m?MoQ0U z%3HYEUq&XqvTZv$y5(?2ox!EsYWq*CUfJC2ke> z=$;v%P%uKvdbHqJ=Sf7)akMOe1a}XgnQIYX25jo~wJ z(r0T*=r=%qEjFt#E6L zM6W2GP<`m%lDc{)O($oI;Id9o10ek*3(YkoNzy7~yViGDjprflFY-BtA59bqWOSk!U$ zm)gS|KW)`mZ{17ua`lH_M3=_B^)K#l*+;*wWimu0XJ>c{2?}uf!Y^1MG3=tbkR)p<4Z0rUX@=#{EkuZJF_qo5gSam{Ku=%eIE7|*Abn?4KqaD|)EN5i^@sg{WP59eqTy5^z z;7CzqxO!aIA%O*w{-kp@~UN|MrDZ|P%_I24AU?yBP;7UX)hkA{#ip7bi@i( z-xHuKx#PPF4D*yfb}!YW%t%v-=J<`@z-R1T7hrg{;aryqS_GNhTB&?=slzeljyEJ~ z=Zy#9!>mJ*L!Zs#?!RyEbU`*2h4_8;WbR{;>3BCk!b0gOy@eDHNtTVU-4xbjmb)rV z6|yWjnEL)0V^_9TnX2@+L$O>g&0n9y2GcD(L_epCrt4I^td=y`*yE{eH@eBXj5;%4L9?IX zRz(HRo;D{<;#*Sbuyeiq{;D@}mQ<3a_q@cT!>HBo zU1l9vKkmD~-)QU}qnB?~^wF&uEq8Rhj`&rT!badYPr=FCEwHN47H>iMH>ADAL<{M? z_zF%(Ak$pCLMF9(CerG>B8e-NB|na*W;Y9X;*F_xjNkh+R?`d<-^%Sg!?@z&A|saC z=?H%?EtaX3@gO7iaG)!e19q3L3xY(`TW>H#D@#VB|3%Pv02cP@{_2ric&MIBFNqMR zS}l0-hhfUgImd`)1Gppm<2z0NK>mnauTD@2+(V1Pn> z!T@VyWs)DZ*gwNKtg??M(HCL=Ybvi|W=fNe3XlD>UKAPH`NL|7)_KTBEHrEq(9Z(C5@`697yDUbyw;iY z^Dfk{Udmqsn2wrM0W(#p_a97jta7;{wPHK`PI!?w^u|9TA)k(A9cF~Tx}8C8uKv>xp03z6Pj z=|YqFGv{qC$dczpje4Wj!aLB=<2#2Rp^v>K#Jqv&uDJ@GyziXe|3m5MgR(E^_$UQ8 z|61m$|9gz!AAN_W<^N!FglhcPURp1M_EnEMedNclQ&Bt3Kt55VFnA78p5MAsJG)b= zBk|{sT*?Y_kGb5_ywhN^tq-BcvLm_1TzDIq^+nsm+VJb^-8p>FAm~LG>`MT7!b&KL zr2F7J`HY&|`$9^(6s3ZW&eD2J=|1f~O_}_nIGUqyCnVYA#;huX{oMlK5u-h9k_z;# zz_h$a2>t0JPJdDAuTbW$Mfo{4JY1t2BfPG0uaRyCIzMIH?I$R94l#d2;f@@WYFa39 z8kjXgP3W4*@0)M7oDwz&18tL&t5hC3J_?4R3)Er>y^+x_vYyeC{nK%*`%pvzzWuU6 zHHzd+G7o`cNL6KMe`8;@^J|Wox^zw~OJq(}qzAVddJW7H+%SGz5pzUkdcOG`lQ59M znVpEo-+t__M>Om|7*`6{O=zU8>jy(=^WX=M)G!c=K8-1_y6g* z_g^#Pk017*a4P@EsdYaBYgn58&vli1{ytgb`wx#doh^r*m;Rqe4Y3sz@2jyT6SL0@ zWQuFj?G89Ig}9nE%Hw%iur=h@5;1L!$ite*m744x}r(_zu10mA`^K=_JAmZmLQSl zfzw>4$U}qmNCUDxl3G$`-)PXpc$&ih7!gBkrJ+cOO!abr~I)(ytDjicE zS%W;uo*Oih>{=a!1I%CKyW^HUX!zy=FCXemZ{Hymt-lF|&%jIgN6fV4O%%HS0+QX= zeP}{%(@;mUlUV^LRH8p*W5|l#DayXn8=;(-C$mD{xhSRvw@1(5)2ru;Zkz9x<#OLC z0DoYWjJ};{+M)w>f}Xj%0^yRsDCz|3r;g;p76)BdiW{MxxWUvw-uWmZOAx3X>jM|R zUK7n5t39FSDd#mJB!9bgEd+l4Q>Vv$!F)&HTU9j3=v$R9MV-77671BODcrZQ3 ztNBb>We(YPYIF=u$XlAbpYdCoj_vcq(44-_r%$&pI;)jIyK`{!jV)t+j? zh1-dzhb2pZ3DrwDcpM~wn!sk@3QDraZM^`!0mCL#G9LXVX0k)F7<#fCL!c-v(Li?^G3|{ z=Aq`h(}ViyyNDZ^=(`e0`$KvA2CX$mm#Og^6trrtui9>{Sg&kZT^v|B&TN&N>_T{F z2JtkmBvq!Q@K%~ce}!x?=eH}B&0~6qiZ-5#KLyVKK!u>3a;;#y8#>=~+4R)oI!%x% z*=H4_D%s-DILiE(`zuLbP5E?pvd?PicPAKAob28|- z$u?t0HAa7HjbiB6#C0o%)|!ziMobZe6R;=(NhO|ckCfwBZ;xc-NVWa~B)X1V2t=M| zgo=E=#$6VoJxn+Lb75rvHm^_ttVok>stvr9dyC;*(p8+%**{bYNep;&ewKOx0pOBC zJ-gz_3gE(lPg~}6B0n!E&f%s?5YA=E#3XOp5H-)OMwpA`Fq(208x6j^vN8Tjxo$C) z&4gQVSF{EWWB87h3~KwnGB&RICr0&e?;?m;&6+cb{IoAoyVkV!GO1WcTro=CKwS|@ zp1@q`5@nFze=x0BM_++X-Vw}^I{v2B8b&UGjvXKVMT4Y56i?HE6m-MjkKYKJEGijF z?-}=86c(Z;)mKWfJsWS#cB?SXd{>XqIFKhIyM;ML3h%%G8WsQk^&SSK7TiqSSSoG+ zxiXt40==R*l>_U51FDqpLu=&86G7Lf0NF_xz_0jD@djzbtjJCoLpWf8G9~;l8d>u4 zkyhYVl=2+l9pFK1-|mq>wZZpUAK z3u$A2-W$Y9T;3bZ%4A;t++V1b+PpWomCL+0$d%l@H`tZUJQCP*e9)i-6I`#jGXN8T zAOuPhHvcPt93lj*555n*4*~;19Z}j6@JUj!}lcZ30l-$1ZC zPyoDO5NZKxL^C-n)HIs3AAm&M5T$@BLP^{m%7r0fg1kNG2&sT5;)2{a=m@a@FJgn7 z6?z(8`ZM57{1%=A0xS;rCXNEf0RsjC`o#^=c8~x%!T4xqFcFpFhNwG)04fPX<-`(UqdsajSv!FL)>8ncztVy2Qvd6 zf?LtSZ{(y997JGZ0D7=D0@x66BR&Ry#U24mP6~NN9}!B9`&AcZhXbG_E{tZz5MfDf zMxFz4MIEtEo&!|}1)e3(fvm#>H;`+8)kWPA0N9BOqZa_c`hZjMD)>4`X^e;%a$|@( zM6eZrEqDpaj48r_+!(5k1dIk?`{oS`t|T{xuEPSKl5arNA%h(OPQl*D;8pSs$U1m% z2l;)lH#+!*Toj@X9UM+B3U$R1p(g$XX@?8&BJl-n2O@$^oEYYcCZbmS3+fILU^Dm; z4NL*p{Kk*60}l`jenbRMlE(%;!h&nb1E8;jBE-aB5qH=Cf#3L%cJL#1$)h0gA>iX7 zEZoB(w8*;=ipl;SL5M<#1wjHJ%3y#5c}U`)g0O?g#d(5GAb22Dq4`PjXvJBAxFBqy zvk-ysTg*Z25Z2IH&_MJp!=PsfR0u*SZYU7S6ign2I9JdC1Pg>dR2ICms5ny)G6X9O z2z3fBkEKTj;v8ZH+8v@5KaZ-11|l1R74`^a3O0{PoG<7CLIlDW>K5t<)tNw?Ea(@+ z8^kj-3Isj^JAw&&4Q*?Q&H&@mz0EYXzVg4n`}5P)Sa zY027`s-Z>ejGRg(DgX98pE-%s5^h%+)lyc{X9C|w zdU^)I`QTKPgC{GKYnZKUK z-1vj0cRKtBfW@C0 zvpja0gTCDjjUn#q-0F%jcTEckiDg|NfkI;zRuiXw2`nGuh|F1L&4csd!Uu7r3$`04 zVk_zgtI7R&3S2lv)Yga-6R@hC9ntDq1-J=^N03UF3wh)@^)I|9k`kY^bCZwIAlJ^LsAS^fqGS(4Q}EcV}|4)@&3TIM%z9ZICAvC z9L8IC6bY1QV0rK9-+rr78gfzgj3lDi1GOFdwQ|W#f_mt-8U=vOb8Y*dbgUB%z_7F$ zbG6x_Nvx!K0S}V(q27g23jgc^U!t6>Qe4=LD^fxE-ahPgzfalZS|>iquyko~-r893 zErLgWZ2eTNTftYR6y;_mdUP7zU2Nqv*#dDkG{l$>sc8XKj9=?!HC& zSCbG|Pt^bmcW_a2f<6+)yG85>KNu7wMCbGxP->QyK;%dvzzH&J0m}a56$|Aau2gf)M|IAs7 zaM~ib^TR2H(DS24*7I6&jc2hjNgGO}5~hx>A~32eTiM-e1q{nZ6(=x4CH2_Eidj-< zJb;a~xYRGRQ*{8bsWoR&*^+(U7Uh(Y^xV&fF)YsyF-4SeeK@Lte#C;fBS1{i!F7HDqQTz%6M({s^7-k4Z{+QN)EXfnsDRb4V-jOBm2LIsc% z+EgrE^>&?`zaSX|W?tAwo=PE8@?}UNf5nBl*D;Zlo#Rj|c~h;sC;Fz;rPWZi?Bggx z-04m%EEITDWVk1G8S^wP0K07S&CT_igvPLISeKZ5ho7&0n+*c_(hG4ei<*{iy=lIh6xp~cqF%IFD}oOAFa~>-$8l?P zldDYyb+_@|dKy%9o9bgsL><8mDy!xJO>`;qJ8_i!-#EFeb($4}@&HgB=22O>k$D`Deidl7%+%WUq;nCk7n?UG|o#srDm#3qI zs0J0VdP&)E~7;md7?7}=>i`AvZ4T2&^*JZ23~a~=k2aor3U zNXQriBW<QyIJewL!tlOIhqFoxpA2f`4QA0R{V68t1E24|NpT5>=dL_ipzF2S+oTe9$kPPxN3)V>R~OCEQbWG zsIs_MzsOu)gIde{N6TvnZmWa@>GT)7GWA;WgVyJEGvPX6ov1hz@6zNR5*6VB;7KJ^ zeEaOMhB`239+37e^SaG@NHa7nZ)jy(N2&dM@JD<`p5Qu_##&_wA`P0STg|0ZFF&zK z!wS$kR6$;1Bo$=|OAP}l;X2XDbm0>Y=24`Ewdzrp;K?XAhf(>GxnWlWVaN*6*_nk1 zRmT-3WA_FkZ|Oqh->@e7^z$i43ko1}F$wj(DYFv^{}Ak-WdFo!=PI-auLl&qS-ni> zSIHkxLyMMXVMdi$;X4PJaEKBY4~0X11~y+Ic6hRu;ycF^&aqxrz+i6FyRHKP8pDD_ ze`uO2a#9In_72b$m|vrizPXncDNiqIX$h2)lX;k}ojR@ILSuga#q(WJy1wVWoPHQRO7JC)n7QB7+g8C%qmK=Y` zYWSlNJ9ZVb#5SFz1R2RNn&mxT+Z9)nm}E8gX-RbcYr(7Shml6yCPL+83UuqS&@?Qz z69v6LmCR^naw?gu!do_b0&)R=xEMmXm`znniWk4#d+mkRmOJG#!8SeNE;sahfiZM( zjUB?{Dv-8M9XhtxWlo0f*J@BDn{pilbX2*}i!Sfv+4xlYz(Xt7lIgVagG$cL@2L;V zsnm!@B%}78fef-?B(;fQG@^Fp?8mc#?^e@OI7W913|Fbl(!SiKWj^HsT4!9}SsYPN_O0>TbN}!}pvEyNVXP8s zrWD2>LuyE>{2l0mma3J0TPqx6Y%xkSfcP4GHq;vYXa5Ig-mo+>V09$qD|Rn~Hpjf2 z6$rCNSgKZ0fNeXvgJ_FJb9i?-j8iAw`iQ|dz9G5u49I%&m!BE6D}$7K4$f9es7MXaJRXkwNU%_Q*PZ2~jB6 z?x<2WeRcVoA88c6jH_ccFPK{I47i`h0-vqs9N7DtCszx)s>gPxlODguc*S`E5c9Bt(jI(B*ub(`v{Dv;$QR z&pMD6;rpbh=;6)+y!ov6jF2cLBl=QKs#9>qLsJHTMsXkTlmRBURNFdG zn`x5Z+2{Ew%r{nla?0Qs4}ThOhaY#ww~%Ai?;<8$CtoEs05aHq;4Wf~_zc1csizZy zhwCUH_i9lfn=gZ;jg5MPs#9XzsC7bMP)C=a52Oq$KUW{Ih&{vGpQ03j{73>$9iddHXnS)g$@4$+j3$;rup&{31 zp1z_-uRqZHdSbcl?_PAK*`Aiw5p+boG2xJ?J#VsI$|;I}p6C#emT57m2mRhk?lrP; zNb*>G4#i*Iht>WSqcR`8*rT9Q)Tz!3o!4fVn6u^ac1Id@40>p!Ik@=&hQ6bJD4E_? zAV;F}942{;os(e_Xjg8H|GfW5$g61r}rz}6}J4yKZ1`}IR463f)>A?mjeKZ{5q z`QmGJf}ZUWRYYfs#<5(K53JtAYUNRNsu}&2k^fUZ$d`Xp-&SXJf~l?iK(YI`;jx}+ zmE^{xyc^!Bf0XnEP}P(7EhIAex~W9yV&nRVP{%#{IO{_JI3)#>qdtKV-^Dp97INfO z?D1}LRCuekf)q0{DidyXN-3pAHD4qf@o;O!@uMVTRA%KFpGAmMJXtTeFIgWTLnGZb zh|#Tp8}TcHmr*c4i(awK(%l(Hm1lKusDFa9!#}uvd^lU0eMN+ZE`v8?YoA}*3S=mO zW|`CXyewcfi{s9mYN{Pb*bCy%?y>%9sZBpm45Im^+F&eZH&A&~ulz+D0}i&W8o}71 z7Z31C{Pu%u{*|Jr(F3*mM&5Rg_`#?CJRcOXCCRCj(8!G()1=G7lZDH1_;cdq>`U;X zf!h$JH?)zR=K)Y!C>=z9_r(>zp-wnPHIm;e$}xg z>)Tm#IluVfoIH05XA4kWlmtipLK|GzAhYYxqTW>2mR#&GOFt{ZWoA`ko>?;?+&tc6 z=;c+m%5aFrgO%yw71jUnPTi?=T4brLWgTJNsqJOT7-r); z%X0^4GrSGb(dj{R;`|))%pquY)t=EcbG-K#{F1*|#5_nUNiIFSOrP|Ehm)QU&#ixL z<4}F#++UQJ=-~F9{hn{^!U$HX~sL|Ae4$1pDoo>^D?>J#Ni+lQ+y zrIpt^K2BR1TfRA*U)f-JMt@mxGU94BTcOMWC!;Jp$pugiI6-ovutFm!wauu}=Xt1> zpxYLs4V-Ye<*s%w#b7CkSdYNf9z) zo|}yYGnBhj+Qa%4hptGe$=X|NgiIDI7V@wvWzm(3CG4R#qGN}p!N`W23CSOU8n zrQR^Bd}0#&L-I#vrb;{K@K)(A; z5oUw*cSoA#fg;`hX=Y5hu|$x?L1y2;h ztS_b39q}-e9p@Is(lVVO!>+}-a$j4yiVn{{u+*Ee8p8-8+>1#?; zVFs-@>lQdbJ;ktMjnqNHi!Mp>WlSR-h z8M+(P^?e8lvSX!4&maWTDUfpMN{RL+zjX;PVmjk zraCMy8TUw>93lKC2 z(V2T5T8v#}q3Eqn3rxq$RIfTUzZQJql2YbYTOVJmKA^B@M3po(HqTToP9CBfk7vg>OKBs#=A zB$rRR1bXME8%cS~G7Iy4;0ZingeYq6*;Ax93=hD@QMwoy+cN3O0(b*t|}B?dKRDd`f4itn}QndSs$vmAYAQqq(L zz)M}lapgtr_g7U(0WKc<)tgv#lVae9PeWe->?T$EF-C>?U?SdX@}xSg<{!oU69YK zo{2>AFj9EuKGL{V6*~B1Xjh6S>k~s{Fd9D3@3nlG^`7gXRuj-@Ai-=g)s^$FJJ@vF zn8bHbx8jbF>;7+?v{cHD6N z4NbcI?mp>m?FTFlOhwbzXsm^KK9OnDONcMHDLfiRk(9gSYB6W;w)&Tz8Js=0So! zF1ZA~6JcqlwDpXXL_WOS$*N+c6bOISVd%3q+uU1oxb67=);HGe>4x6G=c$7Bd{Wxy z=qTicUzdvZUXWSdC8QppQRWOy+?eP$_sF<;y7No};+R*nV$cm%`6!Q^*|RqN3-0{r zP8Ku@Zkxjia$7buqz7z|!uEqWaUmmx5qn)GR7+EbB~P;EdkXR`p-;5s5IJrVS1ggB zXisQ1LlJltU)f<)+BJ^79-%Tlm=N;{IY*HP1KA3qM2y#%DlqtdnkH_di$GeK_YWagN$>C86iXc+=vS{4n zf((oUzf9C2WA&o?uq+5;P-bQq1P;!S;kmi@L_f3Spmr76LPQ zWxTcEv;~R{TkeU)6p9*(!7z}&jg14OT5Br4!A#XL_^;>IXB_=_=CSJ`uGxdHPN^;? zc*xY&x3FY|;C>qvOQ!v}KSN%L;HZJOM#EUe!DF!_oR3=b9G{tT%Q$ylad22nmmcs0 zk2|)euJ&8@`SRE^95Ab`Iq=eeO9E!MbZW$pg7&XtaG~e3KsQAVad)FiHgLTOu6Xn1 zEJI!HVizj%ZdA`}LX7})G`qtCEU%4DuGAO_umVrRNh$U{;--dy;jeZ-FH^ie>UctI z8fR)hl8&lp(k%hL%hO1B%T51y^-bhon|&T9`U=f87D1ah*z`~PJ z%x9zYYhcfHemMZf@Lsq3QlMJ8T%gW)HT~K^ldG_GUjWTAz<3LUFIT>bIkO%$rq4}; zi6a*V_0W#Zy@^DV>a@&O?llD zllEu1?(99AH9p();P+RvtvAUXY5YDu5fRNayP%{sB{2U*Ye(QzAUs+0DJ?1a;E}ru zvp94nk)xQPS2we6L)nz-=fnp%^H^le%Z~Gxleh8Mm$uLXkJD0Asg84eJesk#teo3m zQY&)Y{O)@iZ)Zg0wjDvyQRrAW>KBH9FW8)g44+4#GRH?!s69jL`vwjr?NE@(uxyJB zO?LRT+JH6=JG@#p-{S2h9a6rhne7;Tw|N}<&7C@LrM?iqzsvl)q1Qfm22Bb3OhziI zQAcpe-6qnh%(`iqkhWT$Jd#ijbNmYz&M2F<;L09;NCacriAn~qUF>YR;fw@UWl#3E z8pGg6SF96@NeR9~nn901C*mL6Q^oh#?aH(5&XP z&a$%PfBUi`-5Fw^w9(Hs0NL{=9w#WxQ5*It53J+r$o;aiCw|m5EMpbNpBA_`B^X3D zMV>iev>{_unov|W7j)?xDFA{9VyL{FVa9<6qUbrtEA zc1_T!YJRm)X!8a33Zn?{dY8tO6Qne*o;v!LjqGHw->9vcDs(DM43^SvF{6j)b^6u+tm2{u>8%>(M9f zU-i|S=L_9W3mDalsDtzQ12(P%jmoYJS6LOD#dBfp(ujG|*fAkDmdYD@znDjDO(qNL zYD*73yt;<)MJ=5Mw}pD&^QH_!q^&j=4?-ZxJF}TqQugQx6%m_7m-F&`i?u7ytP2I4 zvZrkoGM3`!VlqkpF|RiaO#66Fh(qZy((MWF5TRX+i)cA|=yOZ4zO0UcGhXJPNipZx zK-15Gh3q8eDS8~0!_S#G->>BHZ zeH@9|CR4PvvxINLl($vVdovppJ86)wZ}jXo+UK~#=%qwTri~`u{4!sul{V z7V@bUqN^5?shUHmn#-5lplGr_q`?)ebQ+$|>}c8GhZ_86qmS! zx)u*|>*LnnrCy;ob5hhtDZ8_&KW7n zmO4vj|DsLEoyTqloAR0r#$|>VlBcLBYmtX2%73-!I4bQP5le4nOK<5)Z{y`pGZj_# ziLFX6e%{jPVrYr0!mIDMpOVOp5bLDG$LvUz4qabu2`n1OSNSx8+Qz-wi8?WnDA%Fi zhSsUD+3Xwen!G=@x-=A%$nJd79}=^jXE`)C)-sw9D%OWhT)QxtOxN}dFU77-{qeGs zBfRG6roE0vW5Nn!ui9fBW=kUrP)$>3juz?A9>95Ow$qc{Qq&ye(b#BH^*djCwI=y4 z5npZS_k<$8v20`zivErs_^Zvdh05OAYSOB$P@!Ac%H#oU-@hbFBfZVfI#2_ZvWUP; zy)Uj~4>hMc?zmL{6zINerpoYOU#@f$POOi-61Aiq4>5jw^nu2-B zLDUu?E!C*q-c%eYS?2C#=ZBCHT8J>)FB7d{1`Cximsn~D?FkuY6*mqL6$i+S0~E#q z(&GU6ae$aOKnkTy#72er&wNJ2zmF7k8xiJR+f|6iwgIxV9G|tun3!8u_C7S+r0TOH zMzA3MxMom&p%`;)Pu-_%(V#ISPvxLc5Fl3&z*Z0-Qt*XOy|M9PspkqrO0%?HSh%=mIsTiqMRC3)UR&zR$R6AE% zhz1=~ntaySPC5hkHr&IWvj3;_H8^eSq(Ux(m~lr=rWV@D$&6yI_##nXoQq#twwU>{ z0gb7w={ikqF;hzOH|OY8$rmZh&1$80=gHbbab<*^EKWx%rJ244r&im>{*ey=&kmZ2lSQb!zb%dQ0>szdqBSf^k()#ttc%msH5; zORZMikv~@4QAjAgEPFpcGru(7FyA)sqFH_$?OAf0=~>~a?f*rHjWsjtHg~cNy_u$$ zhIxLYnJ$Pn{5J1AP3vI%S|1`JhcV82c;-(3$kWwes6|e0llPou3GybS&5f#`T zSYfDU%*vn2KcRA1=Z@+Z9heX8-Td~dAJ@R3W+dv$w73KoJ*=!*Yuca5EU7;lN)*@2@Aki1tgPApD!Q~J z-DJ@ZsHi{6NAdD<+*GKnu^^G73?!GRyoC{riyt1@TA&PrABo$ zKdvb%uGef9DpS(Z_F^Bq1^r$xX8N0;c+RD55~SzUMd84LX-ak=S(_;mfu0)O%&ftf znA%|4b?xe16NsNfX)>6fBG*JEILS9wvZg8+evv|bF71aV%wW?@?asGyVE8Ys1RCfE z*Z(DdQg~wJ=JgscI4=-)Cbi-^=fL36=$c1NE`OSElpDh3M`uF4GiH*0dE_$M0%5;) zjGe$#h!fGRW}3;I&LEU$J&-GFzm_`1@k?1$3Rdnm3^t4#ohW5_M7C>(wzld8>-ZZ6 ztNKd?8?UpvB#Wi;(=w!!q~|zR_-B@BLr!HJ$+_%_r<{88QIZiy>2M>`1*)r7!)~&DP-7s zte|D&fPIzgQRzMkO142yVNEe1-t=;fjd4u@><;7!o#|leSPR5h&#BOtaYRnt1zQGA zORKWpnI3S(&u~_Bx~r6}2?Z%r25{*B4=qOnbmyHGSbR2kCbsyd+&ffSHk}qct+Khc zHu+Q(Hu)G47t-G;X)radE8;KfDVUJ~>}xYM!_mLmH!-KLpVJ*WZu%~%eO^X8^p4k? z&yi;-1ZfOq>__A)O0o2H=jI)u#OtXA;E7wXqBQWf%&+r_<}@?;J)Y@-(e+*p$FmO( zXGY>0hOedAN!r?fBz)7QQP2{4q%5SzF9v5Z?ux4T(E(T7j^bnJ++S6}&b zaGCjK6~pS?Mje`EK)U2Px7A1CTD1LUcLc(5*KH}HF<}PE;8?D>2aS0M@3^g)?AY$( z_^04-u8bLVuE$G;|W6?8M^>cQ-5nM!hUe8>BBm~xwP(( zxTg&Cf0fgr*kQ2NkVyhA`1ITn58R_ZbSaD7k0b*%#sfcV4B3>#h{sTg5y}LL#X;b- zSCX2$#;Mx1{eIMaCAVQ`oKOcAm?8lV&vmU3G66Q7Ci-Jq02^591zwlp+COCJQrr6a zBisN&-_UESf=b6f3jn9UlxwaKLqB|wKVgW8pRi;r#lReEyid#FT4RvRxf9Kr@EFTB z9nBj#JF;)bj}PapDc^f(-e0~T^^HN&IP>$;Aar%fEgme>%|Z1el@88VYSXXL9V!ARx|yO^KOb@^X$4ynjnCL-gxH`0`d6h6 zKN%F`wXA4I_Eyj#QXEm8vP_Fuj>NvQnP2V$#N~&x)Ka*gMF@ubtQje?QTM5tVgKV8 z!Fd~s!}ZfYRkHwL0xY7$TZ`R}$^IBhUuUek?BTuR*JGwMa~eVR-1k4$ z!+I;*&DpC6n=co=&oSF9;06g8l2�d^RYa`eMiiVuMpA6#*kL;Th>y=0lk<>7Low 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%0DpnI>oGyHEu!WQPHcDD(>B>ID6gHDjS7k0^ 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

    ;ICL-J-yg=Y?18dq<(^%aR$ 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 z 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�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 z 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 %<(wzQm5 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 Date: Thu, 19 Mar 2015 22:06:30 -0700 Subject: [PATCH 089/111] Work on puzzle solver --- .../approvals/lite/util/ObjectUtils.java | 197 ++++++++-------- .../section08tdd/PuzzleBoard.java | 216 +++++++++++++++++- .../section08tdd/PuzzleBoardTest.java | 60 +++++ .../section08tdd/PuzzleSolver.java | 145 +++++++++++- .../section08tdd/Tile.java | 68 +++--- .../section08tdd/TileMove.java | 21 ++ 6 files changed, 565 insertions(+), 142 deletions(-) create mode 100644 src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleBoardTest.java create mode 100644 src/main/java/org/teachingkidsprogramming/section08tdd/TileMove.java diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/ObjectUtils.java b/src/main/java/org/teachingextensions/approvals/lite/util/ObjectUtils.java index 844e16b..2717aa5 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/ObjectUtils.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/ObjectUtils.java @@ -1,118 +1,135 @@ package org.teachingextensions.approvals.lite.util; +import java.awt.Image; import java.lang.reflect.Array; import java.lang.reflect.Method; +import java.net.URL; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import javax.swing.ImageIcon; + /** * A static class of convenience functions for Manipulating objects */ public class ObjectUtils { - /** - * A convenience function to check if two objects are equal. - * - * @param s1 The first object - * @param s2 The second object - * @return true if Equal. - */ - public static boolean isEqual(Object s1, Object s2) { - return s1 == s2 || (s1 != null) && s1.equals(s2); - } + /** + * A convenience function to check if two objects are equal. + * + * @param s1 + * The first object + * @param s2 + * The second object + * @return true if Equal. + */ + public static boolean isEqual(Object s1, Object s2) { + return s1 == s2 || (s1 != null) && s1.equals(s2); + } - public static boolean isThisInstanceOfThat(Class thiz, Class that) { - return that.isAssignableFrom(thiz); - } + public static boolean isThisInstanceOfThat(Class thiz, Class that) { + return that.isAssignableFrom(thiz); + } - public static Error throwAsError(Throwable t) throws Error { - if (t instanceof RuntimeException) { - throw (RuntimeException) t; - } else if (t instanceof Error) { - throw (Error) t; - } else { - throw new Error(t); - } + public static Error throwAsError(Throwable t) throws Error { + if (t instanceof RuntimeException) { + throw (RuntimeException) t; + } else if (t instanceof Error) { + throw (Error) t; + } else { + throw new Error(t); } + } - /** - * @param from the source array - * @param methodName the filter method - * @return a filtered array - */ - public static Object[] extractArray(Object[] from, String methodName) { - try { - if (from == null || from.length == 0) { - return new Object[0]; - } - Method method = getGreatestCommonDenominator(from, methodName); - Object[] array; - if (Object.class.isAssignableFrom(method.getReturnType())) { - array = (Object[]) Array.newInstance(method.getReturnType(), - from.length); - } else { - array = (Object[]) Array.newInstance( - ClassUtils.getWrapperClass(method.getReturnType()), - from.length); - } - for (int i = 0; i < from.length; i++) { - array[i] = method.invoke(from[i], (Object[]) null); - } - return array; - } catch (Exception e) { - MySystem.warning(e); - throw ObjectUtils.throwAsError(e); - } + /** + * @param from + * the source array + * @param methodName + * the filter method + * @return a filtered array + */ + public static Object[] extractArray(Object[] from, String methodName) { + try { + if (from == null || from.length == 0) { + return new Object[0]; + } + Method method = getGreatestCommonDenominator(from, methodName); + Object[] array; + if (Object.class.isAssignableFrom(method.getReturnType())) { + array = (Object[]) Array.newInstance(method.getReturnType(), + from.length); + } else { + array = (Object[]) Array.newInstance( + ClassUtils.getWrapperClass(method.getReturnType()), from.length); + } + for (int i = 0; i < from.length; i++) { + array[i] = method.invoke(from[i], (Object[]) null); + } + return array; + } catch (Exception e) { + MySystem.warning(e); + throw ObjectUtils.throwAsError(e); } + } - public static Method getGreatestCommonDenominator(Object[] from, - String methodName) throws SecurityException, NoSuchMethodException { - List> classes = new ArrayList<>(); - ArrayUtils.addArray(classes, getAllCastableClasses(from[0])); - for (Object o : from) { - for (int i = classes.size() - 1; i >= 0; i--) { - Class clazz = classes.get(i); - if (!isThisInstanceOfThat(o.getClass(), clazz) - || !ClassUtils.hasMethod(clazz, methodName)) { - classes.remove(i); - } - } + public static Method getGreatestCommonDenominator(Object[] from, + String methodName) throws SecurityException, NoSuchMethodException { + List> classes = new ArrayList<>(); + ArrayUtils.addArray(classes, getAllCastableClasses(from[0])); + for (Object o : from) { + for (int i = classes.size() - 1; i >= 0; i--) { + Class clazz = classes.get(i); + if (!isThisInstanceOfThat(o.getClass(), clazz) + || !ClassUtils.hasMethod(clazz, methodName)) { + classes.remove(i); } - return classes.size() == 0 ? null : ArrayUtils.getLast(classes) - .getMethod(methodName, (Class[]) null); + } } + return classes.size() == 0 ? null : ArrayUtils.getLast(classes).getMethod( + methodName, (Class[]) null); + } - private static Class[] getAllCastableClasses(Object object) { - Class clazz = object.getClass(); - ArrayList list = new ArrayList<>(); - while (clazz != null) { - list.add(clazz); - ArrayUtils.addArray(list, clazz.getInterfaces()); - clazz = clazz.getSuperclass(); - } - Class[] found = list.toArray(new Class[list.size()]); - ArrayUtils.toReverseArray(found); - return found; + private static Class[] getAllCastableClasses(Object object) { + Class clazz = object.getClass(); + ArrayList list = new ArrayList<>(); + while (clazz != null) { + list.add(clazz); + ArrayUtils.addArray(list, clazz.getInterfaces()); + clazz = clazz.getSuperclass(); } + Class[] found = list.toArray(new Class[list.size()]); + ArrayUtils.toReverseArray(found); + return found; + } - public static void assertInstance(Class classes[], Object object) { - if (object == null) { - throw new NullPointerException("Expected Object of Type " - + Arrays.asList(extractArray(classes, "getName")) - + " but was null"); - } - for (Class aClass : classes) { - if (ClassUtils.getWrapperClass(aClass).isInstance(object)) { - return; - } - } - throw new IllegalArgumentException("Expected Object of Type " - + Arrays.asList(extractArray(classes, "getName")) + " but got " - + object.getClass().getName()); + public static void assertInstance(Class classes[], Object object) { + if (object == null) { + throw new NullPointerException("Expected Object of Type " + + Arrays.asList(extractArray(classes, "getName")) + " but was null"); + } + for (Class aClass : classes) { + if (ClassUtils.getWrapperClass(aClass).isInstance(object)) { + return; + } } + throw new IllegalArgumentException("Expected Object of Type " + + Arrays.asList(extractArray(classes, "getName")) + " but got " + + object.getClass().getName()); + } - public static String getClassName(Object o) { - return o == null ? "null" : o.getClass().getName(); + public static String getClassName(Object o) { + return o == null ? "null" : o.getClass().getName(); + } + + public static Image loadImage(Class type, String name) { + URL resource = type.getResource(name); + if (resource == null) { + resource = type.getClassLoader().getResource(name); + } + if (resource == null) { + throw new IllegalStateException("Could not find image: " + name); } + return new ImageIcon(resource).getImage(); + } } \ No newline at end of file diff --git a/src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleBoard.java b/src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleBoard.java index 9656e71..d478aa7 100644 --- a/src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleBoard.java +++ b/src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleBoard.java @@ -1,23 +1,56 @@ package org.teachingkidsprogramming.section08tdd; -import org.teachingextensions.logo.PenColors; - -import javax.swing.*; -import java.awt.*; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Image; +import java.awt.Point; import java.util.ArrayList; +import java.util.Collections; import java.util.List; +import javax.swing.JPanel; + +import org.teachingextensions.approvals.lite.util.ObjectUtils; +import org.teachingextensions.logo.PenColors; + public class PuzzleBoard extends JPanel { - private static final long serialVersionUID = -3592444274530147326L; - private List tiles; - private List positions; + private static final String completed = "Batgirl.png"; + private static final long serialVersionUID = -3592444274530147326L; + private final List tiles; + private final List positions; + private boolean done; public PuzzleBoard() { this.positions = createPositions(); - this.tiles = createTiles(this.positions); + this.tiles = createTiles(shuffled(this.positions)); + } - private static List createPositions() { + public PuzzleBoard(List positions, List tiles) { + this.positions = new ArrayList<>(positions.size()); + for (int i = 0; i < positions.size(); i++) { + Point p = positions.get(i); + this.positions.add(i, new Point(p)); + } + + this.tiles = new ArrayList<>(tiles.size()); + for (int i = 0; i < tiles.size(); i++) { + Tile t = tiles.get(i); + this.tiles.add(i, new Tile(t)); + } + } + + public PuzzleBoard(PuzzleBoard puzzle) { + this(puzzle.positions, puzzle.tiles); + } + + private static List shuffled(List positions) { + List s = new ArrayList<>(positions); + Collections.shuffle(s); + return s; + } + + public static List createPositions() { ArrayList p = new ArrayList<>(9); Point point; for (int i = 0; i < 9; i++) { @@ -33,7 +66,7 @@ private static List createPositions() { return p; } - private static List createTiles(List positions) { + public static List createTiles(List positions) { ArrayList t = new ArrayList<>(9); for (int i = 0; i < 8; i++) { t.add(new Tile(i, positions.get(i))); @@ -46,7 +79,19 @@ protected void paintComponent(Graphics g) { super.paintComponent(g); drawBorder(g); drawField(g); - drawTiles(g); + if (!this.done) { + drawTiles(g); + } else { + drawReward(g); + } + } + + private void drawReward(Graphics g) { + Image image = ObjectUtils.loadImage(this.getClass(), completed); + Graphics2D g2d = (Graphics2D) g.create(); + g2d.drawImage(image, this.positions.get(0).x, this.positions.get(0).y, 376, + 376, null); + g2d.dispose(); } private void drawTiles(Graphics g) { @@ -74,4 +119,151 @@ public Tile getPiece(int i) { public List getPositions() { return new ArrayList<>(positions); } -} \ No newline at end of file + + public boolean isSorted() { + return countMisplaced() == 0; + } + + private int countMisplaced() { + int misplaced = 0; + for (int i = 0; i < 8; i++) { + Tile tile = this.tiles.get(i); + Point point = this.positions.get(i); + if (!tile.isAt(point)) { + misplaced++; + } + } + return misplaced; + } + + public void finish() { + this.done = true; + } + + public List getTiles() { + return new ArrayList<>(this.tiles); + } + + /** + * A move is valid if the target is the board's blank square + * + * @param move + * the move to check + * @return true if the move is valid + */ + public boolean isValidMove(TileMove move) { + Point blank = findBlank(); + return blank == this.positions.get(move.getTarget()); + } + + private Point findBlank() { + for (Point point : positions) { + if (!anyTileIsAt(point)) { + return point; + } + } + + return null; + } + + private boolean anyTileIsAt(Point point) { + for (Tile tile : tiles) { + if (tile.isAt(point)) { + return true; + } + } + + return false; + } + + /** + * Create a copy of the board then use the provided move to update it + * + * @param move + * the move to perform on the puzzle copy + * @return The updated copy of the board + */ + public PuzzleBoard useMove(TileMove move) { + PuzzleBoard c = new PuzzleBoard(this); + + Tile s = c.getPieceFromPosition(move.getSource()); + s.moveTo(c.positions.get(move.getTarget())); + s.teleport(); + + return c; + } + + /** + * Estimate the cost of solving the puzzle if this is the next step in the + * solution. + * + * @param history + * All the steps we have already visited. + * @return The estimated cost + */ + public int estimateCost(List history) { + + // see + // https://jdanger.com/solving-8-puzzle-with-artificial-intelligence.html + // for ruby implementation + + // We know the actual cost will be at least 1, because we must + // make at least one move to get to this board. + int cost = 1; + + // Each tile that is in the wrong position will require at least + // one move to get it in the right position (and possibly more than + // 1). So add 1 to the estimate for every misplaced tile. + cost += this.countMisplaced(); + + // If we have visited this board before, then we are actually + // going backward. We will need at least one more move after + // this one to move forward to the solution. So add one more move + // to the estimate for every time we have visited this board. + cost += this.timesVisited(history); + + return cost; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + + PuzzleBoard that = (PuzzleBoard) o; + + if (!tiles.equals(that.tiles)) + return false; + + return true; + } + + @Override + public int hashCode() { + return tiles.hashCode(); + } + + private int timesVisited(List history) { + int visited = 0; + for (PuzzleBoard puzzleBoard : history) { + if (this.equals(puzzleBoard)) { + visited++; + } + } + + return visited; + } + + public Tile getPieceFromPosition(int source) { + Point position = this.positions.get(source); + for (Tile tile : this.tiles) { + if (tile.isAt(position)) { + return tile; + } + } + + return null; + } +} diff --git a/src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleBoardTest.java b/src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleBoardTest.java new file mode 100644 index 0000000..8c48591 --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleBoardTest.java @@ -0,0 +1,60 @@ +package org.teachingkidsprogramming.section08tdd; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import java.awt.Point; +import java.util.List; + +import org.junit.Test; + +public class PuzzleBoardTest { + + @Test + public void defaultNotSortedTest() { + PuzzleBoard b = new PuzzleBoard(); + assertTrue(!b.isSorted()); + } + + @Test + public void notSortedTest() { + List positions = PuzzleBoard.createPositions(); + List tiles = PuzzleBoard.createTiles(positions); + + Tile t = tiles.get(7); + t.moveTo(positions.get(8)); + t.teleport(); + + PuzzleBoard b = new PuzzleBoard(positions, tiles); + assertTrue(!b.isSorted()); + } + + @Test + public void sortedTest() { + PuzzleBoard b = getSolvedBoard(); + assertTrue(b.isSorted()); + } + + private PuzzleBoard getSolvedBoard() { + List positions = PuzzleBoard.createPositions(); + List tiles = PuzzleBoard.createTiles(positions); + + PuzzleBoard b = new PuzzleBoard(positions, tiles); + return b; + } + + @Test + public void validMoveTest() { + PuzzleBoard b = getSolvedBoard(); + TileMove move = new TileMove(7, 8); + assertTrue(b.isValidMove(move)); + } + + @Test + public void invalidMoveTest() { + PuzzleBoard b = getSolvedBoard(); + TileMove move = new TileMove(0, 1); + assertFalse(b.isValidMove(move)); + } + +} diff --git a/src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleSolver.java b/src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleSolver.java index 2007553..1916dce 100644 --- a/src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleSolver.java +++ b/src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleSolver.java @@ -1,35 +1,158 @@ package org.teachingkidsprogramming.section08tdd; -import javax.swing.*; -import java.awt.*; +import java.awt.Point; +import java.util.ArrayList; +import java.util.List; + +import javax.swing.SwingUtilities; public class PuzzleSolver implements Runnable { - private PuzzleBoard board; + private final PuzzleBoard board; + private final List history = new ArrayList<>(); public PuzzleSolver(PuzzleBoard board) { this.board = board; } + @Override public void run() { final PuzzleBoard b = this.board; - Point target = b.getPositions().get(8); + while (b.isVisible()) { SwingUtilities.invokeLater(new Runnable() { + @Override public void run() { b.repaint(); } }); - Tile piece = b.getPiece(7); - if (!piece.isMovingTo(target)) { - piece.moveTo(target); - } - if (!piece.isAt(target)) { - piece.step(); - } + + update(b); + try { Thread.sleep(10); } catch (InterruptedException e) { } } } + + private void update(final PuzzleBoard puzzle) { + + boolean done = animate(puzzle); + if (!done) { + return; + } + + if (puzzle.isSorted()) { + puzzle.finish(); + return; + } + + solve(puzzle); + } + + private void solve(PuzzleBoard puzzle) { + this.copyToHistory(puzzle); + + int mininumCost = Integer.MAX_VALUE; + TileMove min = null; + // create a list of all moves that are possible + List moves = createMoves(); + for (TileMove tileMove : moves) { + // discard if the move is invalid from this state + if (!puzzle.isValidMove(tileMove)) { + continue; + } + + // otherwise apply the move to generate a new board + PuzzleBoard next = puzzle.useMove(tileMove); + // estimate the cost to reach the goal by going through the new board + int estimate = estimateSolvingCost(next, this.history); + + // if the cost is the smallest we've seen so far + if (estimate < mininumCost) { + // remember the move and the cost + mininumCost = estimate; + min = tileMove; + } + + } + + // execute the remembered move: + // tell the piece to move to the target + if (min != null) { + Point target = puzzle.getPositions().get(min.getTarget()); + Tile piece = puzzle.getPieceFromPosition(min.getSource()); + if (!piece.isMovingTo(target)) { + piece.moveTo(target); + } + } + } + + private int estimateSolvingCost(PuzzleBoard next, List history) { + return next.estimateCost(new ArrayList<>(history)); + } + + // 0: can move down (to #3) or right (to #1) + // 1: can move left (to #0), down (to #4), or right (to #2) + // 2: can move left (to #1) or down (to #5) + // 3: can move up (to #0), right (to #4), or down (to #6) + // 4: can move up (to #1), right (to #5), down (to #7) or left (to #3) + // 5: can move up (to #2), down (to #8), or left (to #4) + // 6: can move up (to #3) or right (to #7) + // 7: can move up (to #4), right (to #8) or left (to #6) + // 8: can move up (to #5) or left (to #7) + private List createMoves() { + List moves = new ArrayList<>(); + moves.add(new TileMove(0, 3)); + moves.add(new TileMove(0, 1)); + moves.add(new TileMove(1, 0)); + moves.add(new TileMove(1, 4)); + moves.add(new TileMove(1, 2)); + moves.add(new TileMove(2, 1)); + moves.add(new TileMove(2, 5)); + moves.add(new TileMove(3, 0)); + moves.add(new TileMove(3, 4)); + moves.add(new TileMove(3, 6)); + moves.add(new TileMove(4, 1)); + moves.add(new TileMove(4, 5)); + moves.add(new TileMove(4, 7)); + moves.add(new TileMove(4, 3)); + moves.add(new TileMove(5, 2)); + moves.add(new TileMove(5, 8)); + moves.add(new TileMove(5, 4)); + moves.add(new TileMove(6, 3)); + moves.add(new TileMove(6, 7)); + moves.add(new TileMove(7, 4)); + moves.add(new TileMove(7, 8)); + moves.add(new TileMove(7, 6)); + moves.add(new TileMove(8, 5)); + moves.add(new TileMove(8, 7)); + return moves; + } + + private void copyToHistory(PuzzleBoard puzzle) { + this.history.add(new PuzzleBoard(puzzle)); + } + + private boolean animate(PuzzleBoard puzzle) { + List tiles = puzzle.getTiles(); + for (Tile tile : tiles) { + if (!tile.isAtTarget()) { + tile.step(); + return false; + } + } + return true; + } + + private static void animationDemo(final PuzzleBoard puzzle) { + Point target = puzzle.getPositions().get(8); + Tile piece = puzzle.getPiece(7); + if (!piece.isMovingTo(target)) { + piece.moveTo(target); + } + if (!piece.isAt(target)) { + piece.step(); + } + } } diff --git a/src/main/java/org/teachingkidsprogramming/section08tdd/Tile.java b/src/main/java/org/teachingkidsprogramming/section08tdd/Tile.java index 289bd66..4af1748 100644 --- a/src/main/java/org/teachingkidsprogramming/section08tdd/Tile.java +++ b/src/main/java/org/teachingkidsprogramming/section08tdd/Tile.java @@ -1,43 +1,40 @@ package org.teachingkidsprogramming.section08tdd; -import javax.swing.*; -import java.awt.*; -import java.net.URL; +import java.awt.Graphics2D; +import java.awt.Image; +import java.awt.Point; + +import org.teachingextensions.approvals.lite.util.ObjectUtils; public class Tile { - private final static String[] resources = {"Batgirl1a.png", - "Batgirl1b.png", - "Batgirl1c.png", - "Batgirl2a.png", - "Batgirl2b.png", - "Batgirl2c.png", - "Batgirl3a.png", - "Batgirl3b.png", - "Batgirl3c.png"}; - private final static int width = 122; - private final static int height = 122; - private Image image; - private Point position; - private Point target; + private final static String[] resources = { "Batgirl1a.png", "Batgirl1b.png", + "Batgirl1c.png", "Batgirl2a.png", "Batgirl2b.png", "Batgirl2c.png", + "Batgirl3a.png", "Batgirl3b.png", "Batgirl3c.png" }; + private final static int width = 122; + private final static int height = 122; + private Image image; + private Point position; + private Point target; + private int imageIdx; public Tile(int imageIdx, Point position) { - this.position = new Point(position.x, position.y); - URL resource = this.getClass().getResource(resources[imageIdx]); - if (resource == null) { - resource = this.getClass().getClassLoader().getResource(resources[imageIdx]); - } - if (resource == null) { - throw new IllegalStateException("Could not find tile image"); - } - this.image = new ImageIcon(resource).getImage(); + this.imageIdx = imageIdx; + this.position = new Point(position); + this.image = ObjectUtils.loadImage(this.getClass(), resources[imageIdx]); + } + + public Tile(Tile t) { + this(t.imageIdx, new Point(t.position)); } public void paint(Graphics2D g2d) { - g2d.drawImage(this.image, this.position.x, this.position.y, width, height, null); + g2d.drawImage(this.image, this.position.x, this.position.y, width, height, + null); } public boolean isAt(Point point) { - return this.position.x == point.x && this.position.y == point.y; + return point == null + || (this.position.x == point.x && this.position.y == point.y); } public void moveTo(Point target) { @@ -45,7 +42,8 @@ public void moveTo(Point target) { } public boolean isMovingTo(Point target) { - return this.target != null && this.target.x == target.x && this.target.y == target.y; + return this.target != null && this.target.x == target.x + && this.target.y == target.y; } public void step() { @@ -75,4 +73,16 @@ private int stepHorizontal(int size) { } return this.position.x; } + + public void teleport() { + + if (this.target != null && !this.isAt(this.target)) { + this.position = new Point(this.target.x, this.target.y); + } + + } + + public boolean isAtTarget() { + return this.isAt(this.target); + } } diff --git a/src/main/java/org/teachingkidsprogramming/section08tdd/TileMove.java b/src/main/java/org/teachingkidsprogramming/section08tdd/TileMove.java new file mode 100644 index 0000000..0add2ad --- /dev/null +++ b/src/main/java/org/teachingkidsprogramming/section08tdd/TileMove.java @@ -0,0 +1,21 @@ +package org.teachingkidsprogramming.section08tdd; + +public class TileMove { + + private final int source; + private final int target; + + public TileMove(int source, int target) { + this.source = source; + this.target = target; + } + + public int getSource() { + return this.source; + } + + public int getTarget() { + return this.target; + } + +} From f00e9ae0e1126347f40837f2f81f279c26c6fc69 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Fri, 20 Mar 2015 11:05:00 -0700 Subject: [PATCH 090/111] Distance calculations --- .../section08tdd/PuzzleBoard.java | 66 +++++++-------- .../section08tdd/PuzzleSolver.java | 26 +++++- .../section08tdd/Tile.java | 37 +++++---- .../logo/tests}/PuzzleBoardTest.java | 14 ++-- .../logo/tests/PuzzleSolverTest.java | 83 +++++++++++++++++++ .../logo/tests/TileTest.java | 19 +++++ 6 files changed, 187 insertions(+), 58 deletions(-) rename src/{main/java/org/teachingkidsprogramming/section08tdd => test/java/org/teachingextensions/logo/tests}/PuzzleBoardTest.java (73%) create mode 100644 src/test/java/org/teachingextensions/logo/tests/PuzzleSolverTest.java create mode 100644 src/test/java/org/teachingextensions/logo/tests/TileTest.java diff --git a/src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleBoard.java b/src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleBoard.java index d478aa7..83e8988 100644 --- a/src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleBoard.java +++ b/src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleBoard.java @@ -1,24 +1,21 @@ package org.teachingkidsprogramming.section08tdd; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.Image; -import java.awt.Point; +import org.teachingextensions.approvals.lite.util.ObjectUtils; +import org.teachingextensions.logo.PenColors; + +import javax.swing.*; +import java.awt.*; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.List; -import javax.swing.JPanel; - -import org.teachingextensions.approvals.lite.util.ObjectUtils; -import org.teachingextensions.logo.PenColors; - public class PuzzleBoard extends JPanel { private static final String completed = "Batgirl.png"; private static final long serialVersionUID = -3592444274530147326L; - private final List tiles; - private final List positions; - private boolean done; + private final List tiles; + private final Point[] positions; + private boolean done; public PuzzleBoard() { this.positions = createPositions(); @@ -26,11 +23,10 @@ public PuzzleBoard() { } - public PuzzleBoard(List positions, List tiles) { - this.positions = new ArrayList<>(positions.size()); - for (int i = 0; i < positions.size(); i++) { - Point p = positions.get(i); - this.positions.add(i, new Point(p)); + public PuzzleBoard(Point[] positions, List tiles) { + this.positions = new Point[positions.length]; + for (int i = 0; i < positions.length; i++) { + this.positions[i] = new Point(positions[i]); } this.tiles = new ArrayList<>(tiles.size()); @@ -44,14 +40,14 @@ public PuzzleBoard(PuzzleBoard puzzle) { this(puzzle.positions, puzzle.tiles); } - private static List shuffled(List positions) { - List s = new ArrayList<>(positions); + private static List shuffled(Point[] positions) { + List s = Arrays.asList(positions); Collections.shuffle(s); return s; } - public static List createPositions() { - ArrayList p = new ArrayList<>(9); + public static Point[] createPositions() { + Point[] p = new Point[9]; Point point; for (int i = 0; i < 9; i++) { if (i < 3) { @@ -61,7 +57,7 @@ public static List createPositions() { } else { point = new Point(289, 35 + (127 * (i - 6))); } - p.add(point); + p[i] = point; } return p; } @@ -74,6 +70,10 @@ public static List createTiles(List positions) { return t; } + public static List createTiles(Point[] positions) { + return createTiles(Arrays.asList(positions)); + } + @Override protected void paintComponent(Graphics g) { super.paintComponent(g); @@ -89,7 +89,7 @@ protected void paintComponent(Graphics g) { private void drawReward(Graphics g) { Image image = ObjectUtils.loadImage(this.getClass(), completed); Graphics2D g2d = (Graphics2D) g.create(); - g2d.drawImage(image, this.positions.get(0).x, this.positions.get(0).y, 376, + g2d.drawImage(image, this.positions[0].x, this.positions[0].y, 376, 376, null); g2d.dispose(); } @@ -117,7 +117,7 @@ public Tile getPiece(int i) { } public List getPositions() { - return new ArrayList<>(positions); + return Arrays.asList(positions); } public boolean isSorted() { @@ -128,7 +128,7 @@ private int countMisplaced() { int misplaced = 0; for (int i = 0; i < 8; i++) { Tile tile = this.tiles.get(i); - Point point = this.positions.get(i); + Point point = this.positions[i]; if (!tile.isAt(point)) { misplaced++; } @@ -148,12 +148,12 @@ public List getTiles() { * A move is valid if the target is the board's blank square * * @param move - * the move to check + * the move to check * @return true if the move is valid */ public boolean isValidMove(TileMove move) { Point blank = findBlank(); - return blank == this.positions.get(move.getTarget()); + return blank == this.positions[move.getTarget()]; } private Point findBlank() { @@ -180,14 +180,14 @@ private boolean anyTileIsAt(Point point) { * Create a copy of the board then use the provided move to update it * * @param move - * the move to perform on the puzzle copy + * the move to perform on the puzzle copy * @return The updated copy of the board */ public PuzzleBoard useMove(TileMove move) { PuzzleBoard c = new PuzzleBoard(this); Tile s = c.getPieceFromPosition(move.getSource()); - s.moveTo(c.positions.get(move.getTarget())); + s.moveTo(c.positions[move.getTarget()]); s.teleport(); return c; @@ -198,7 +198,7 @@ public PuzzleBoard useMove(TileMove move) { * solution. * * @param history - * All the steps we have already visited. + * All the steps we have already visited. * @return The estimated cost */ public int estimateCost(List history) { @@ -234,10 +234,8 @@ public boolean equals(Object o) { PuzzleBoard that = (PuzzleBoard) o; - if (!tiles.equals(that.tiles)) - return false; + return tiles.equals(that.tiles); - return true; } @Override @@ -257,7 +255,7 @@ private int timesVisited(List history) { } public Tile getPieceFromPosition(int source) { - Point position = this.positions.get(source); + Point position = this.positions[source]; for (Tile tile : this.tiles) { if (tile.isAt(position)) { return tile; diff --git a/src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleSolver.java b/src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleSolver.java index 1916dce..5ae24fa 100644 --- a/src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleSolver.java +++ b/src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleSolver.java @@ -1,13 +1,12 @@ package org.teachingkidsprogramming.section08tdd; -import java.awt.Point; +import javax.swing.*; +import java.awt.*; import java.util.ArrayList; import java.util.List; -import javax.swing.SwingUtilities; - public class PuzzleSolver implements Runnable { - private final PuzzleBoard board; + private final PuzzleBoard board; private final List history = new ArrayList<>(); public PuzzleSolver(PuzzleBoard board) { @@ -155,4 +154,23 @@ private static void animationDemo(final PuzzleBoard puzzle) { piece.step(); } } + + public static int distance(Point start, Point end) { + return Math.abs(start.x - end.x) + Math.abs(start.y - end.y); + } + + public static int distance(PuzzleBoard start, PuzzleBoard end) { + int result = 0; + for (Tile tile : start.getTiles()) { + // tile has a position index of its goal + int goalIndex = tile.getCorrectPositionIndex(); + // get the goal position + Point goal = start.getPositions().get(goalIndex); + // tile has a current position + Point position = tile.getPosition(); + // sum the distances + result += distance(position, goal); + } + return result; + } } diff --git a/src/main/java/org/teachingkidsprogramming/section08tdd/Tile.java b/src/main/java/org/teachingkidsprogramming/section08tdd/Tile.java index 4af1748..86a680e 100644 --- a/src/main/java/org/teachingkidsprogramming/section08tdd/Tile.java +++ b/src/main/java/org/teachingkidsprogramming/section08tdd/Tile.java @@ -1,30 +1,31 @@ package org.teachingkidsprogramming.section08tdd; -import java.awt.Graphics2D; -import java.awt.Image; -import java.awt.Point; - import org.teachingextensions.approvals.lite.util.ObjectUtils; +import java.awt.*; + public class Tile { - private final static String[] resources = { "Batgirl1a.png", "Batgirl1b.png", + private final static String[] resources = {"Batgirl1a.png", "Batgirl1b.png", "Batgirl1c.png", "Batgirl2a.png", "Batgirl2b.png", "Batgirl2c.png", - "Batgirl3a.png", "Batgirl3b.png", "Batgirl3c.png" }; + "Batgirl3a.png", "Batgirl3b.png", "Batgirl3c.png"}; + private final static int width = 122; private final static int height = 122; - private Image image; - private Point position; - private Point target; - private int imageIdx; - public Tile(int imageIdx, Point position) { - this.imageIdx = imageIdx; + private Image image; + private Point position; + private Point target; + private int correctPositionIndex; + + // TODO: point should be a current position index maybe? + public Tile(int correctPosition, Point position) { + this.correctPositionIndex = correctPosition; this.position = new Point(position); - this.image = ObjectUtils.loadImage(this.getClass(), resources[imageIdx]); + this.image = ObjectUtils.loadImage(this.getClass(), resources[correctPosition]); } public Tile(Tile t) { - this(t.imageIdx, new Point(t.position)); + this(t.correctPositionIndex, new Point(t.position)); } public void paint(Graphics2D g2d) { @@ -85,4 +86,12 @@ public void teleport() { public boolean isAtTarget() { return this.isAt(this.target); } + + public int getCorrectPositionIndex() { + return correctPositionIndex; + } + + public Point getPosition() { + return position; + } } diff --git a/src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleBoardTest.java b/src/test/java/org/teachingextensions/logo/tests/PuzzleBoardTest.java similarity index 73% rename from src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleBoardTest.java rename to src/test/java/org/teachingextensions/logo/tests/PuzzleBoardTest.java index 8c48591..7c33fe5 100644 --- a/src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleBoardTest.java +++ b/src/test/java/org/teachingextensions/logo/tests/PuzzleBoardTest.java @@ -1,4 +1,4 @@ -package org.teachingkidsprogramming.section08tdd; +package org.teachingextensions.logo.tests; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; @@ -7,6 +7,9 @@ import java.util.List; import org.junit.Test; +import org.teachingkidsprogramming.section08tdd.PuzzleBoard; +import org.teachingkidsprogramming.section08tdd.Tile; +import org.teachingkidsprogramming.section08tdd.TileMove; public class PuzzleBoardTest { @@ -18,11 +21,11 @@ public void defaultNotSortedTest() { @Test public void notSortedTest() { - List positions = PuzzleBoard.createPositions(); + Point[] positions = PuzzleBoard.createPositions(); List tiles = PuzzleBoard.createTiles(positions); Tile t = tiles.get(7); - t.moveTo(positions.get(8)); + t.moveTo(positions[8]); t.teleport(); PuzzleBoard b = new PuzzleBoard(positions, tiles); @@ -36,11 +39,10 @@ public void sortedTest() { } private PuzzleBoard getSolvedBoard() { - List positions = PuzzleBoard.createPositions(); + Point[] positions = PuzzleBoard.createPositions(); List tiles = PuzzleBoard.createTiles(positions); - PuzzleBoard b = new PuzzleBoard(positions, tiles); - return b; + return new PuzzleBoard(positions, tiles); } @Test diff --git a/src/test/java/org/teachingextensions/logo/tests/PuzzleSolverTest.java b/src/test/java/org/teachingextensions/logo/tests/PuzzleSolverTest.java new file mode 100644 index 0000000..2f9e8be --- /dev/null +++ b/src/test/java/org/teachingextensions/logo/tests/PuzzleSolverTest.java @@ -0,0 +1,83 @@ +package org.teachingextensions.logo.tests; + +import org.junit.Test; +import org.teachingkidsprogramming.section08tdd.PuzzleBoard; +import org.teachingkidsprogramming.section08tdd.PuzzleSolver; +import org.teachingkidsprogramming.section08tdd.Tile; + +import java.awt.*; +import java.util.List; + +import static org.junit.Assert.assertEquals; + +/** + * Created by james on 3/20/15. + */ +public class PuzzleSolverTest { + @Test + public void manhattanDistanceFromOneToZeroTest() { + Point start = new Point(1, 0); + Point end = new Point(0, 0); + int distance = PuzzleSolver.distance(start, end); + assertEquals(1, distance); + } + + @Test + public void manhattanDistanceFromTwoToZeroTest() { + Point start = new Point(2, 0); + Point end = new Point(0, 0); + int distance = PuzzleSolver.distance(start, end); + assertEquals(2, distance); + } + + @Test + public void manhattanDistanceFromFourToZeroTest() { + Point start = new Point(1, 1); + Point end = new Point(0, 0); + int distance = PuzzleSolver.distance(start, end); + assertEquals(2, distance); + } + + @Test + public void manhattanDistanceFromSixToTwoTest() { + Point start = new Point(0, 2); + Point end = new Point(2, 0); + int distance = PuzzleSolver.distance(start, end); + assertEquals(4, distance); + } + + @Test + public void manhattanDistanceFromEightToZeroTest() { + Point start = new Point(2, 2); + Point end = new Point(0, 0); + int distance = PuzzleSolver.distance(start, end); + assertEquals(4, distance); + } + + @Test + public void distanceFromSolvedToSolved() { + PuzzleBoard solved = getSolvedPuzzle(); + assertEquals(0, PuzzleSolver.distance(solved, solved)); + } + + private PuzzleBoard getSolvedPuzzle() { + Point[] positions = PuzzleBoard.createPositions(); + List tiles = PuzzleBoard.createTiles(positions); + return new PuzzleBoard(positions, tiles); + } + + @Test + public void distanceForPuzzleWithOneMisplacedTile() { + Point[] positions = PuzzleBoard.createPositions(); + + // swap 7 and 8 + Point p = positions[8]; + positions[8] = positions[7]; + positions[7] = p; + + List tiles = PuzzleBoard.createTiles(positions); + PuzzleBoard b = new PuzzleBoard(PuzzleBoard.createPositions(), tiles); + int expected = PuzzleSolver.distance(positions[8], positions[7]); + assertEquals(expected, PuzzleSolver.distance(b, getSolvedPuzzle())); + } +} diff --git a/src/test/java/org/teachingextensions/logo/tests/TileTest.java b/src/test/java/org/teachingextensions/logo/tests/TileTest.java new file mode 100644 index 0000000..13684c0 --- /dev/null +++ b/src/test/java/org/teachingextensions/logo/tests/TileTest.java @@ -0,0 +1,19 @@ +package org.teachingextensions.logo.tests; + +import org.junit.Test; +import org.teachingkidsprogramming.section08tdd.Tile; + +import java.awt.*; + +import static org.junit.Assert.assertEquals; + +/** + * Created by james on 3/20/15. + */ +public class TileTest { + @Test + public void tileShouldKnowWhereItBelongs(){ + Tile t = new Tile(0, new Point(0, 0)); + assertEquals(0, t.getCorrectPositionIndex()); + } +} From 937b74a49f9c65646b5fab02e62ecf15c40b1d07 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Fri, 20 Mar 2015 14:01:02 -0700 Subject: [PATCH 091/111] distance to goal --- .../section08tdd/PuzzleSolver.java | 15 +++----- .../logo/tests/PuzzleSolverTest.java | 37 ++++++++++++++++++- 2 files changed, 41 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleSolver.java b/src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleSolver.java index 5ae24fa..30b3320 100644 --- a/src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleSolver.java +++ b/src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleSolver.java @@ -29,7 +29,7 @@ public void run() { try { Thread.sleep(10); - } catch (InterruptedException e) { + } catch (InterruptedException ignored) { } } } @@ -52,7 +52,7 @@ private void update(final PuzzleBoard puzzle) { private void solve(PuzzleBoard puzzle) { this.copyToHistory(puzzle); - int mininumCost = Integer.MAX_VALUE; + int minimumCost = Integer.MAX_VALUE; TileMove min = null; // create a list of all moves that are possible List moves = createMoves(); @@ -68,9 +68,9 @@ private void solve(PuzzleBoard puzzle) { int estimate = estimateSolvingCost(next, this.history); // if the cost is the smallest we've seen so far - if (estimate < mininumCost) { + if (estimate < minimumCost) { // remember the move and the cost - mininumCost = estimate; + minimumCost = estimate; min = tileMove; } @@ -144,6 +144,7 @@ private boolean animate(PuzzleBoard puzzle) { return true; } + @SuppressWarnings("UnusedDeclaration") private static void animationDemo(final PuzzleBoard puzzle) { Point target = puzzle.getPositions().get(8); Tile piece = puzzle.getPiece(7); @@ -159,16 +160,12 @@ public static int distance(Point start, Point end) { return Math.abs(start.x - end.x) + Math.abs(start.y - end.y); } - public static int distance(PuzzleBoard start, PuzzleBoard end) { + public static int distance(PuzzleBoard start) { int result = 0; for (Tile tile : start.getTiles()) { - // tile has a position index of its goal int goalIndex = tile.getCorrectPositionIndex(); - // get the goal position Point goal = start.getPositions().get(goalIndex); - // tile has a current position Point position = tile.getPosition(); - // sum the distances result += distance(position, goal); } return result; diff --git a/src/test/java/org/teachingextensions/logo/tests/PuzzleSolverTest.java b/src/test/java/org/teachingextensions/logo/tests/PuzzleSolverTest.java index 2f9e8be..487911e 100644 --- a/src/test/java/org/teachingextensions/logo/tests/PuzzleSolverTest.java +++ b/src/test/java/org/teachingextensions/logo/tests/PuzzleSolverTest.java @@ -57,7 +57,7 @@ public void manhattanDistanceFromEightToZeroTest() { @Test public void distanceFromSolvedToSolved() { PuzzleBoard solved = getSolvedPuzzle(); - assertEquals(0, PuzzleSolver.distance(solved, solved)); + assertEquals(0, PuzzleSolver.distance(solved)); } private PuzzleBoard getSolvedPuzzle() { @@ -78,6 +78,39 @@ public void distanceForPuzzleWithOneMisplacedTile() { List tiles = PuzzleBoard.createTiles(positions); PuzzleBoard b = new PuzzleBoard(PuzzleBoard.createPositions(), tiles); int expected = PuzzleSolver.distance(positions[8], positions[7]); - assertEquals(expected, PuzzleSolver.distance(b, getSolvedPuzzle())); + assertEquals(expected, PuzzleSolver.distance(b)); + } + + @Test + public void distanceForPuzzleWithSeveralMisplacedTiles() { + Point[] positions = PuzzleBoard.createPositions(); + + positions = swap(positions, 7, 8); + positions = swap(positions, 1, 4); + positions = swap(positions, 6, 2); + + List tiles = PuzzleBoard.createTiles(positions); + + // cost of swaps + int expected = PuzzleSolver.distance(positions[8], positions[7]) + + PuzzleSolver.distance(positions[1], positions[4]) + + PuzzleSolver.distance(positions[6], positions[2]); + + // each swap requires 2 tiles to move + expected *= 2; + + // except the blank + expected -= PuzzleSolver.distance(positions[8], positions[7]); + + + PuzzleBoard b = new PuzzleBoard(PuzzleBoard.createPositions(), tiles); + assertEquals(expected, PuzzleSolver.distance(b)); + } + + private Point[] swap(Point[] positions, int i, int j) { + Point p = positions[i]; + positions[i] = positions[j]; + positions[j] = p; + return positions; } } From 99a37f1924df8be12450938499655914b1db1526 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Fri, 20 Mar 2015 18:52:55 -0700 Subject: [PATCH 092/111] cost, equality --- .../section08tdd/PuzzleBoard.java | 97 +++++++++---------- .../section08tdd/PuzzleSolver.java | 32 +++--- .../section08tdd/Tile.java | 24 +++++ .../logo/tests/PuzzleBoardTest.java | 38 ++++++++ .../logo/tests/PuzzleSolverTest.java | 40 ++++++-- 5 files changed, 160 insertions(+), 71 deletions(-) diff --git a/src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleBoard.java b/src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleBoard.java index 83e8988..4d51474 100644 --- a/src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleBoard.java +++ b/src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleBoard.java @@ -13,17 +13,26 @@ public class PuzzleBoard extends JPanel { private static final String completed = "Batgirl.png"; private static final long serialVersionUID = -3592444274530147326L; - private final List tiles; - private final Point[] positions; - private boolean done; + private final List tiles; + private final Point[] positions; + private final List history; + private boolean done; public PuzzleBoard() { this.positions = createPositions(); this.tiles = createTiles(shuffled(this.positions)); - + this.history = new ArrayList<>(); } public PuzzleBoard(Point[] positions, List tiles) { + this(positions, tiles, new ArrayList()); + } + + public PuzzleBoard(PuzzleBoard puzzle) { + this(puzzle.positions, puzzle.tiles, puzzle.history); + } + + public PuzzleBoard(Point[] positions, List tiles, List history) { this.positions = new Point[positions.length]; for (int i = 0; i < positions.length; i++) { this.positions[i] = new Point(positions[i]); @@ -34,14 +43,18 @@ public PuzzleBoard(Point[] positions, List tiles) { Tile t = tiles.get(i); this.tiles.add(i, new Tile(t)); } - } - public PuzzleBoard(PuzzleBoard puzzle) { - this(puzzle.positions, puzzle.tiles); + if (history == null) history = new ArrayList<>(); + + this.history = new ArrayList<>(history.size()); + for (int i = 0; i < history.size(); i++) { + PuzzleBoard b = history.get(i); + this.history.add(i, new PuzzleBoard(b)); + } } - private static List shuffled(Point[] positions) { - List s = Arrays.asList(positions); + public static List shuffled(Point[] positions) { + List s = new ArrayList<>(Arrays.asList(positions)); Collections.shuffle(s); return s; } @@ -189,42 +202,11 @@ public PuzzleBoard useMove(TileMove move) { Tile s = c.getPieceFromPosition(move.getSource()); s.moveTo(c.positions[move.getTarget()]); s.teleport(); + c.history.add(new PuzzleBoard(this)); return c; } - /** - * Estimate the cost of solving the puzzle if this is the next step in the - * solution. - * - * @param history - * All the steps we have already visited. - * @return The estimated cost - */ - public int estimateCost(List history) { - - // see - // https://jdanger.com/solving-8-puzzle-with-artificial-intelligence.html - // for ruby implementation - - // We know the actual cost will be at least 1, because we must - // make at least one move to get to this board. - int cost = 1; - - // Each tile that is in the wrong position will require at least - // one move to get it in the right position (and possibly more than - // 1). So add 1 to the estimate for every misplaced tile. - cost += this.countMisplaced(); - - // If we have visited this board before, then we are actually - // going backward. We will need at least one more move after - // this one to move forward to the solution. So add one more move - // to the estimate for every time we have visited this board. - cost += this.timesVisited(history); - - return cost; - } - @Override public boolean equals(Object o) { if (this == o) @@ -234,7 +216,7 @@ public boolean equals(Object o) { PuzzleBoard that = (PuzzleBoard) o; - return tiles.equals(that.tiles); + return this.toString().equals(that.toString()); } @@ -243,17 +225,6 @@ public int hashCode() { return tiles.hashCode(); } - private int timesVisited(List history) { - int visited = 0; - for (PuzzleBoard puzzleBoard : history) { - if (this.equals(puzzleBoard)) { - visited++; - } - } - - return visited; - } - public Tile getPieceFromPosition(int source) { Point position = this.positions[source]; for (Tile tile : this.tiles) { @@ -264,4 +235,24 @@ public Tile getPieceFromPosition(int source) { return null; } + + public List getHistory() { + return new ArrayList<>(this.history); + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("[ "); + for(Tile t : this.tiles){ + builder.append(t.toString()).append(", "); + } + builder.append("]"); + + return builder.toString(); + } + + public boolean isVisited() { + return this.history.contains(this); + } } diff --git a/src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleSolver.java b/src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleSolver.java index 30b3320..4ea5dee 100644 --- a/src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleSolver.java +++ b/src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleSolver.java @@ -7,7 +7,6 @@ public class PuzzleSolver implements Runnable { private final PuzzleBoard board; - private final List history = new ArrayList<>(); public PuzzleSolver(PuzzleBoard board) { this.board = board; @@ -50,7 +49,6 @@ private void update(final PuzzleBoard puzzle) { } private void solve(PuzzleBoard puzzle) { - this.copyToHistory(puzzle); int minimumCost = Integer.MAX_VALUE; TileMove min = null; @@ -64,8 +62,14 @@ private void solve(PuzzleBoard puzzle) { // otherwise apply the move to generate a new board PuzzleBoard next = puzzle.useMove(tileMove); + + // see if we have visited this board before: + if (next.isVisited()){ + continue; + } + // estimate the cost to reach the goal by going through the new board - int estimate = estimateSolvingCost(next, this.history); + int estimate = estimateCost(next); // if the cost is the smallest we've seen so far if (estimate < minimumCost) { @@ -87,10 +91,6 @@ private void solve(PuzzleBoard puzzle) { } } - private int estimateSolvingCost(PuzzleBoard next, List history) { - return next.estimateCost(new ArrayList<>(history)); - } - // 0: can move down (to #3) or right (to #1) // 1: can move left (to #0), down (to #4), or right (to #2) // 2: can move left (to #1) or down (to #5) @@ -129,10 +129,6 @@ private List createMoves() { return moves; } - private void copyToHistory(PuzzleBoard puzzle) { - this.history.add(new PuzzleBoard(puzzle)); - } - private boolean animate(PuzzleBoard puzzle) { List tiles = puzzle.getTiles(); for (Tile tile : tiles) { @@ -160,7 +156,7 @@ public static int distance(Point start, Point end) { return Math.abs(start.x - end.x) + Math.abs(start.y - end.y); } - public static int distance(PuzzleBoard start) { + public static int estimateRemainingMoves(PuzzleBoard start) { int result = 0; for (Tile tile : start.getTiles()) { int goalIndex = tile.getCorrectPositionIndex(); @@ -170,4 +166,16 @@ public static int distance(PuzzleBoard start) { } return result; } + + public static int estimateCost(PuzzleBoard board) { + // The cost of this solving the puzzle using this is at least the number of moves it took to get to this + // board + int cost = board.getHistory().size(); + + // We estimate that the cost of solving the puzzle from here will be related to the number of moves needed + // to get the tiles into the right positions, so we add the estimate to the actual cost + cost += estimateRemainingMoves(board); + + return cost; + } } diff --git a/src/main/java/org/teachingkidsprogramming/section08tdd/Tile.java b/src/main/java/org/teachingkidsprogramming/section08tdd/Tile.java index 86a680e..33f37cc 100644 --- a/src/main/java/org/teachingkidsprogramming/section08tdd/Tile.java +++ b/src/main/java/org/teachingkidsprogramming/section08tdd/Tile.java @@ -55,6 +55,24 @@ public void step() { this.position = new Point(x, y); } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Tile tile = (Tile) o; + + return correctPositionIndex == tile.correctPositionIndex && position.equals(tile.position); + + } + + @Override + public int hashCode() { + int result = position.hashCode(); + result = 31 * result + correctPositionIndex; + return result; + } + private int stepVertical(int size) { if (this.position.y < this.target.y) { return this.position.y + size; @@ -63,6 +81,7 @@ private int stepVertical(int size) { return this.position.y - size; } return this.position.y; + } private int stepHorizontal(int size) { @@ -94,4 +113,9 @@ public int getCorrectPositionIndex() { public Point getPosition() { return position; } + + @Override + public String toString() { + return "{ " + this.position.x + ", " + this.position.y + " }"; + } } diff --git a/src/test/java/org/teachingextensions/logo/tests/PuzzleBoardTest.java b/src/test/java/org/teachingextensions/logo/tests/PuzzleBoardTest.java index 7c33fe5..9230164 100644 --- a/src/test/java/org/teachingextensions/logo/tests/PuzzleBoardTest.java +++ b/src/test/java/org/teachingextensions/logo/tests/PuzzleBoardTest.java @@ -1,9 +1,13 @@ package org.teachingextensions.logo.tests; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.awt.Point; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; import java.util.List; import org.junit.Test; @@ -59,4 +63,38 @@ public void invalidMoveTest() { assertFalse(b.isValidMove(move)); } + @Test + public void toStringTest(){ + assertEquals("[ { 35, 35 }, { 35, 162 }, { 35, 289 }, { 162, 35 }, { 162, 162 }, { 162, 289 }, { 289, 35 }, { 289, 162 }, ]", getSolvedBoard().toString()); + } + + @Test + public void equalityTest(){ + Point[] positions = PuzzleBoard.createPositions(); + List tiles = PuzzleBoard.createTiles(positions); + PuzzleBoard a = new PuzzleBoard(positions, tiles); + List history = new ArrayList<>(); + history.add(a); + PuzzleBoard b = new PuzzleBoard(positions, tiles, history); + assertTrue(a.equals(b)); + } + + @Test + public void inequalityTest(){ + Point[] positions = PuzzleBoard.createPositions(); + List tiles = PuzzleBoard.createTiles(positions); + PuzzleBoard a = new PuzzleBoard(positions, tiles); + + List history = new ArrayList<>(); + history.add(a); + + Point[] locations = PuzzleBoard.createPositions(); + Point[] array = new Point[locations.length]; + List l = PuzzleBoard.shuffled(locations); + l.toArray(array); + List t = PuzzleBoard.createTiles(l); + PuzzleBoard b = new PuzzleBoard(PuzzleBoard.createPositions(), t, history); + assertFalse(a.equals(b)); + } + } diff --git a/src/test/java/org/teachingextensions/logo/tests/PuzzleSolverTest.java b/src/test/java/org/teachingextensions/logo/tests/PuzzleSolverTest.java index 487911e..79aaa2f 100644 --- a/src/test/java/org/teachingextensions/logo/tests/PuzzleSolverTest.java +++ b/src/test/java/org/teachingextensions/logo/tests/PuzzleSolverTest.java @@ -6,6 +6,7 @@ import org.teachingkidsprogramming.section08tdd.Tile; import java.awt.*; +import java.util.ArrayList; import java.util.List; import static org.junit.Assert.assertEquals; @@ -56,14 +57,14 @@ public void manhattanDistanceFromEightToZeroTest() { @Test public void distanceFromSolvedToSolved() { - PuzzleBoard solved = getSolvedPuzzle(); - assertEquals(0, PuzzleSolver.distance(solved)); + PuzzleBoard solved = getSolvedPuzzle(null); + assertEquals(0, PuzzleSolver.estimateRemainingMoves(solved)); } - private PuzzleBoard getSolvedPuzzle() { + private PuzzleBoard getSolvedPuzzle(List history) { Point[] positions = PuzzleBoard.createPositions(); List tiles = PuzzleBoard.createTiles(positions); - return new PuzzleBoard(positions, tiles); + return new PuzzleBoard(positions, tiles, history); } @Test @@ -78,7 +79,7 @@ public void distanceForPuzzleWithOneMisplacedTile() { List tiles = PuzzleBoard.createTiles(positions); PuzzleBoard b = new PuzzleBoard(PuzzleBoard.createPositions(), tiles); int expected = PuzzleSolver.distance(positions[8], positions[7]); - assertEquals(expected, PuzzleSolver.distance(b)); + assertEquals(expected, PuzzleSolver.estimateRemainingMoves(b)); } @Test @@ -104,7 +105,34 @@ public void distanceForPuzzleWithSeveralMisplacedTiles() { PuzzleBoard b = new PuzzleBoard(PuzzleBoard.createPositions(), tiles); - assertEquals(expected, PuzzleSolver.distance(b)); + assertEquals(expected, PuzzleSolver.estimateRemainingMoves(b)); + } + + @Test + public void solutionHasNoCostTest() { + PuzzleBoard b = getSolvedPuzzle(null); + assertEquals(0, PuzzleSolver.estimateCost(b)); + } + + @Test + public void solutionHasHistoryCost() { + PuzzleBoard b = getSolvedPuzzle(null); + List history = new ArrayList<>(); + history.add(b); + history.add(b); + history.add(b); + PuzzleBoard c = getSolvedPuzzle(history); + assertEquals(3, PuzzleSolver.estimateCost(c)); + } + + @Test + public void unsolvedPuzzleHasMovementCost() { + Point[] positions = PuzzleBoard.createPositions(); + positions = swap(positions, 7, 8); + List tiles = PuzzleBoard.createTiles(positions); + + PuzzleBoard board = new PuzzleBoard(PuzzleBoard.createPositions(), tiles); + assertEquals(127, PuzzleSolver.estimateCost(board)); } private Point[] swap(Point[] positions, int i, int j) { From 7264159bdf510a0030fa9ce384d5d07700db0358 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Sat, 21 Mar 2015 12:20:26 -0700 Subject: [PATCH 093/111] Porting ruby implementation --- .../approvals/lite/Approvals.java | 113 ++++++++++-------- .../approvals/lite/util/ArrayUtils.java | 104 ++++++++-------- .../org/teachingextensions/logo/Puzzle.java | 49 ++++++++ .../teachingextensions/logo/PuzzleState.java | 26 ++++ .../logo/PuzzleStateTest.java | 19 +++ ...est.state_has_move_directions.approved.txt | 7 ++ .../teachingextensions/logo/PuzzleTest.java | 84 +++++++++++++ 7 files changed, 298 insertions(+), 104 deletions(-) create mode 100644 src/main/java/org/teachingextensions/logo/Puzzle.java create mode 100644 src/main/java/org/teachingextensions/logo/PuzzleState.java create mode 100644 src/test/java/org/teachingextensions/logo/PuzzleStateTest.java create mode 100644 src/test/java/org/teachingextensions/logo/PuzzleStateTest.state_has_move_directions.approved.txt create mode 100644 src/test/java/org/teachingextensions/logo/PuzzleTest.java diff --git a/src/main/java/org/teachingextensions/approvals/lite/Approvals.java b/src/main/java/org/teachingextensions/approvals/lite/Approvals.java index 8326498..8765d74 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/Approvals.java +++ b/src/main/java/org/teachingextensions/approvals/lite/Approvals.java @@ -14,67 +14,76 @@ import java.util.Arrays; public class Approvals { - public static void verify(String response) throws Exception { - verify(new ApprovalTextWriter(response, "txt"), FileTypes.Text); - } + public static void verify(String response) throws Exception { + verify(new ApprovalTextWriter(response, "txt"), FileTypes.Text); + } - public static void verifyAll(String header, T[] values, - Function1 f1) { - verifyAll(header, Arrays.asList(values), f1); - } + public static void verifyAll(String header, T[] values) { + Approvals.verifyAll(header, Arrays.asList(values), new Function1() { + @Override + public String call(T i) { + return i + ""; + } + }); + } - public static void verifyAll(String header, Iterable array, - Function1 f1) { - String text = formatHeader(header) + ArrayUtils.toString(array, f1); - verify(new ApprovalTextWriter(text, "txt"), FileTypes.Text); - } + public static void verifyAll(String header, T[] values, + Function1 f1) { + verifyAll(header, Arrays.asList(values), f1); + } - private static String formatHeader(String header) { - return StringUtils.isEmpty(header) ? "" : header + "\r\n\r\n\r\n"; - } + public static void verifyAll(String header, Iterable array, + Function1 f1) { + String text = formatHeader(header) + ArrayUtils.toString(array, f1); + verify(new ApprovalTextWriter(text, "txt"), FileTypes.Text); + } - public static void verifyHtml(String response) throws Exception { - verify(new ApprovalTextWriter(response, "html"), FileTypes.Html); - } + private static String formatHeader(String header) { + return StringUtils.isEmpty(header) ? "" : header + "\r\n\r\n\r\n"; + } - public static void verify(BufferedImage bufferedImage) { - verify(new ImageApprovalWriter(bufferedImage), FileTypes.Image); - } + public static void verifyHtml(String response) throws Exception { + verify(new ApprovalTextWriter(response, "html"), FileTypes.Html); + } - public static void verify(ApprovalWriter writer, ApprovalNamer namer, - ApprovalFailureReporter reporter) { - verify(new FileApprover(writer, namer), reporter); - } + public static void verify(BufferedImage bufferedImage) { + verify(new ImageApprovalWriter(bufferedImage), FileTypes.Image); + } - public static void verify(ApprovalWriter writer, String fileType) { - verify(writer, createApprovalNamer(), ReporterFactory.get(fileType)); - } + public static void verify(ApprovalWriter writer, ApprovalNamer namer, + ApprovalFailureReporter reporter) { + verify(new FileApprover(writer, namer), reporter); + } + + public static void verify(ApprovalWriter writer, String fileType) { + verify(writer, createApprovalNamer(), ReporterFactory.get(fileType)); + } - public static void verify(FileApprover approver, - ApprovalFailureReporter reporter) { - try { - if (!approver.approve()) { - boolean passed = false; - if (reporter instanceof ApprovalFailureOverrider) { - passed = approver - .askToChangeReceivedToApproved((ApprovalFailureOverrider) reporter); - } - if (!passed) { - approver.reportFailure(reporter); - approver.fail(); - } else { - approver.cleanUpAfterSuccess(reporter); - } - } else { - approver.cleanUpAfterSuccess(reporter); - } - } catch (Exception e) { - throw ObjectUtils.throwAsError(e); + public static void verify(FileApprover approver, + ApprovalFailureReporter reporter) { + try { + if (!approver.approve()) { + boolean passed = false; + if (reporter instanceof ApprovalFailureOverrider) { + passed = approver + .askToChangeReceivedToApproved((ApprovalFailureOverrider) reporter); } + if (!passed) { + approver.reportFailure(reporter); + approver.fail(); + } else { + approver.cleanUpAfterSuccess(reporter); + } + } else { + approver.cleanUpAfterSuccess(reporter); + } + } catch (Exception e) { + throw ObjectUtils.throwAsError(e); } + } - public static ApprovalNamer createApprovalNamer() { - return new JUnitStackTraceNamer(); - } + public static ApprovalNamer createApprovalNamer() { + return new JUnitStackTraceNamer(); + } -} \ No newline at end of file +} diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/ArrayUtils.java b/src/main/java/org/teachingextensions/approvals/lite/util/ArrayUtils.java index 7f34890..fd06a1e 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/ArrayUtils.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/ArrayUtils.java @@ -8,68 +8,68 @@ * A static class of convenience methods for arrays and collections. */ public class ArrayUtils { - public static java.util.Collection addArray(java.util.Collection v, T array[]) { - if ((array == null) || (v == null)) { - return v; - } - Collections.addAll(v, array); - return v; + public static java.util.Collection addArray(java.util.Collection v, T array[]) { + if ((array == null) || (v == null)) { + return v; } + Collections.addAll(v, array); + return v; + } - public static String toString(T[] values, Function1 formatter) { - return toString(Arrays.asList(values), formatter); - } + public static String toString(T[] values, Function1 formatter) { + return toString(Arrays.asList(values), formatter); + } - public static String toString(Iterable values, Function1 formatter) { - StringBuilder b = new StringBuilder(); - for (T t : values) { - b.append(formatter.call(t)).append("\r\n"); - } - return b.toString(); + public static String toString(Iterable values, Function1 formatter) { + StringBuilder b = new StringBuilder(); + for (T t : values) { + b.append(formatter.call(t)).append("\r\n"); } + return b.toString(); + } - public static T[] toReverseArray(T[] array) { - for (int i = 0; i < array.length / 2; i++) { - T o1 = array[i]; - int end = array.length - i - 1; - T o2 = array[end]; - array[i] = o2; - array[end] = o1; - } - return array; + public static T[] toReverseArray(T[] array) { + for (int i = 0; i < array.length / 2; i++) { + T o1 = array[i]; + int end = array.length - i - 1; + T o2 = array[end]; + array[i] = o2; + array[end] = o1; } + return array; + } - public static boolean isEmpty(Object[] array) { - return ((array == null) || (array.length == 0)); - } + public static boolean isEmpty(Object[] array) { + return ((array == null) || (array.length == 0)); + } - public static T getFirst(T[] array, Comparator comparator) { - return get(array, comparator, true); - } + public static T getFirst(T[] array, Comparator comparator) { + return get(array, comparator, true); + } - private static T get(T[] array, Comparator sorter, boolean wantFirst) { - if (isEmpty(array)) { - return null; - } - T last = array[0]; - for (int i = 1; i < array.length; i++) { - int compare = sorter.compare(last, array[i]); - if ((wantFirst && compare > 0) || (!wantFirst && compare < 0)) { - last = array[i]; - } - } - return last; + private static T get(T[] array, Comparator sorter, boolean wantFirst) { + if (isEmpty(array)) { + return null; } - - public static T getLast(List list) { - return list.get(list.size() - 1); + T last = array[0]; + for (int i = 1; i < array.length; i++) { + int compare = sorter.compare(last, array[i]); + if ((wantFirst && compare > 0) || (!wantFirst && compare < 0)) { + last = array[i]; + } } + return last; + } - public static List combine(List list1, List list2) { - List all = new ArrayList<>(); - all.addAll(list1); - all.addAll(list2); - return all; - } + public static T getLast(List list) { + return list.get(list.size() - 1); + } + + public static List combine(List list1, List list2) { + List all = new ArrayList<>(); + all.addAll(list1); + all.addAll(list2); + return all; + } -} \ No newline at end of file +} diff --git a/src/main/java/org/teachingextensions/logo/Puzzle.java b/src/main/java/org/teachingextensions/logo/Puzzle.java new file mode 100644 index 0000000..30a2179 --- /dev/null +++ b/src/main/java/org/teachingextensions/logo/Puzzle.java @@ -0,0 +1,49 @@ +package org.teachingextensions.logo; + +import java.util.Arrays; + +/** + * A nine-puzzle + * + * @see Wikipedia + */ +public class Puzzle { + private static final int[] solution = {0, 1, 2, 3, 4, 5, 6, 7, 8}; + private static final int blank = 8; + private final int[] cells; + + public Puzzle(int[] cells) { + this.cells = cells; + } + + public boolean isSolved() { + for (int i = 0; i < solution.length; i++) { + if (solution[i] != cells[i]) { + return false; + } + } + return true; + } + + public int getBlankIndex() { + for (int i = 0; i < cells.length; i++) { + if (cells[i] == blank) { + return i; + } + } + return -1; + } + + /** + * Create a copy of the puzzle where the blank swapped with the value in the target position + * @param target move the blank to this location, and move the value from this location to the current blank location + * @return A copy of the puzzle with the blank and target swapped. + */ + public Puzzle swapBlank(int target) { + int[] copy = Arrays.copyOf(cells, cells.length); + int x = copy[target]; + copy[getBlankIndex()] = x; + copy[target] = 8; + return new Puzzle(copy); + } +} diff --git a/src/main/java/org/teachingextensions/logo/PuzzleState.java b/src/main/java/org/teachingextensions/logo/PuzzleState.java new file mode 100644 index 0000000..584e3ec --- /dev/null +++ b/src/main/java/org/teachingextensions/logo/PuzzleState.java @@ -0,0 +1,26 @@ +package org.teachingextensions.logo; + +/** + * Represents a node in the puzzle-solving graph. Keeps track of the current puzzle arrangement and the actions + * required to arrive at the current arrangement from the starting arrangement. + */ +public class PuzzleState { + public enum Directions { + Left(-1), Right(1), Up(-3), Down(3); + + private final int value; + + private Directions(int i) { + this.value = i; + } + + public int getValue() { + return value; + } + + @Override + public String toString() { + return "{" + super.toString() + " = " + value + '}'; + } + } +} diff --git a/src/test/java/org/teachingextensions/logo/PuzzleStateTest.java b/src/test/java/org/teachingextensions/logo/PuzzleStateTest.java new file mode 100644 index 0000000..9f0ddc9 --- /dev/null +++ b/src/test/java/org/teachingextensions/logo/PuzzleStateTest.java @@ -0,0 +1,19 @@ +package org.teachingextensions.logo; + +import org.junit.Test; +import org.teachingextensions.approvals.lite.Approvals; +import org.teachingextensions.approvals.lite.reporters.FileLauncherReporter; +import org.teachingextensions.approvals.lite.reporters.UseReporter; + +@UseReporter(FileLauncherReporter.class) +public class PuzzleStateTest { + + /** + * The state can tell you what moves are allowed from cell to cell + */ + @Test + public void state_has_move_directions(){ + StringBuilder b = new StringBuilder(); + Approvals.verifyAll("Directions", PuzzleState.Directions.values()); + } +} diff --git a/src/test/java/org/teachingextensions/logo/PuzzleStateTest.state_has_move_directions.approved.txt b/src/test/java/org/teachingextensions/logo/PuzzleStateTest.state_has_move_directions.approved.txt new file mode 100644 index 0000000..685f8f4 --- /dev/null +++ b/src/test/java/org/teachingextensions/logo/PuzzleStateTest.state_has_move_directions.approved.txt @@ -0,0 +1,7 @@ +Directions + + +{Left = -1} +{Right = 1} +{Up = -3} +{Down = 3} diff --git a/src/test/java/org/teachingextensions/logo/PuzzleTest.java b/src/test/java/org/teachingextensions/logo/PuzzleTest.java new file mode 100644 index 0000000..926eb80 --- /dev/null +++ b/src/test/java/org/teachingextensions/logo/PuzzleTest.java @@ -0,0 +1,84 @@ +package org.teachingextensions.logo; + +import org.junit.Test; + +import java.util.Arrays; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +public class PuzzleTest { + private static int[] getSolution() { + return new int[]{0, 1, 2, 3, 4, 5, 6, 7, 8}; + } + + private static int[] swap(int[] cells, int i, int j) { + int[] copy = Arrays.copyOf(cells, cells.length); + int x = copy[i]; + copy[i] = copy[j]; + copy[j] = x; + return copy; + } + + /** + * A puzzle has a solution + */ + @Test + public void puzzle_has_solution() { + int[] solved = getSolution(); + Puzzle p = new Puzzle(solved); + assertTrue(p.isSolved()); + } + + /** + * A puzzle might not be solved + */ + @Test + public void puzzle_not_solved() { + int[] cells = getSolution(); + cells = swap(cells, 3, 4); + Puzzle p = new Puzzle(cells); + assertFalse(p.isSolved()); + } + + /** + * A puzzle has a blank + */ + @Test + public void puzzle_has_blank(){ + Puzzle p = new Puzzle(getSolution()); + assertEquals(8, p.getBlankIndex()); + } + + /** + * Blank can be anywhere + */ + @Test + public void blank_can_be_anywhere(){ + int[] cells = swap(getSolution(), 8, 2); + Puzzle p = new Puzzle(cells); + assertEquals(2, p.getBlankIndex()); + } + + /** + * Puzzle can swap blank for you + */ + @Test + public void puzzle_can_swap_blank(){ + Puzzle p = new Puzzle(getSolution()); + Puzzle c = p.swapBlank(4); + assertEquals(4, c.getBlankIndex()); + } + + /** + * Puzzle can swap blank for you + */ + @Test + public void blank_swap_leaves_original_as_is(){ + Puzzle p = new Puzzle(getSolution()); + p.swapBlank(4); + assertEquals(8, p.getBlankIndex()); + } + +} From ee837f6c3d285966667270b93066e332e4f9689c Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Sat, 21 Mar 2015 17:14:50 -0700 Subject: [PATCH 094/111] Branch generation --- .../approvals/lite/Approvals.java | 7 +- .../macosx/BeyondCompareReporter.java | 16 +++ .../reporters/macosx/DiffMergeReporter.java | 14 +-- .../org/teachingextensions/logo/Puzzle.java | 5 + .../teachingextensions/logo/PuzzleState.java | 68 +++++++++- .../logo/PuzzleStateTest.java | 68 +++++++++- ...leStateTest.moves_from_center.approved.txt | 7 ++ ...ateTest.moves_from_top_center.approved.txt | 6 + ...tateTest.moves_from_top_right.approved.txt | 5 + ...tateTest.tells_you_next_moves.approved.txt | 5 + .../logo/tests/ColorGeneration.java | 118 +++++++----------- ...orGeneration.testHtmlDisplay.approved.html | 8 +- 12 files changed, 238 insertions(+), 89 deletions(-) create mode 100644 src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/BeyondCompareReporter.java create mode 100644 src/test/java/org/teachingextensions/logo/PuzzleStateTest.moves_from_center.approved.txt create mode 100644 src/test/java/org/teachingextensions/logo/PuzzleStateTest.moves_from_top_center.approved.txt create mode 100644 src/test/java/org/teachingextensions/logo/PuzzleStateTest.moves_from_top_right.approved.txt create mode 100644 src/test/java/org/teachingextensions/logo/PuzzleStateTest.tells_you_next_moves.approved.txt diff --git a/src/main/java/org/teachingextensions/approvals/lite/Approvals.java b/src/main/java/org/teachingextensions/approvals/lite/Approvals.java index 8765d74..48a982c 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/Approvals.java +++ b/src/main/java/org/teachingextensions/approvals/lite/Approvals.java @@ -19,12 +19,17 @@ public static void verify(String response) throws Exception { } public static void verifyAll(String header, T[] values) { - Approvals.verifyAll(header, Arrays.asList(values), new Function1() { + Approvals.verifyAll(header, Arrays.asList(values)); + } + + public static void verifyAll(String header, Iterable values) { + Approvals.verifyAll(header, values, new Function1() { @Override public String call(T i) { return i + ""; } }); + } public static void verifyAll(String header, T[] values, diff --git a/src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/BeyondCompareReporter.java b/src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/BeyondCompareReporter.java new file mode 100644 index 0000000..2454b44 --- /dev/null +++ b/src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/BeyondCompareReporter.java @@ -0,0 +1,16 @@ +package org.teachingextensions.approvals.lite.reporters.macosx; + +import org.teachingextensions.approvals.lite.reporters.GenericDiffReporter; + +import java.text.MessageFormat; + +public class BeyondCompareReporter extends GenericDiffReporter { + public static final BeyondCompareReporter INSTANCE = new BeyondCompareReporter(); + static final String DIFF_PROGRAM = "/usr/local/bin/bcompare"; + static final String MESSAGE = MessageFormat.format( + "Unable to find Beyond Compare at {0}", DIFF_PROGRAM); + + public BeyondCompareReporter() { + super(DIFF_PROGRAM, MESSAGE); + } +} diff --git a/src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/DiffMergeReporter.java b/src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/DiffMergeReporter.java index 8f7f725..adcad65 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/DiffMergeReporter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/DiffMergeReporter.java @@ -5,12 +5,12 @@ import java.text.MessageFormat; public class DiffMergeReporter extends GenericDiffReporter { - private static final String DIFF_PROGRAM = "/Applications/DiffMerge.app/Contents/MacOS/DiffMerge"; - static final String MESSAGE = MessageFormat.format("Unable to find DiffMerge at {0}", - DIFF_PROGRAM); - public static final DiffMergeReporter INSTANCE = new DiffMergeReporter(); + public static final DiffMergeReporter INSTANCE = new DiffMergeReporter(); + private static final String DIFF_PROGRAM = "/Applications/DiffMerge.app/Contents/MacOS/DiffMerge"; + static final String MESSAGE = MessageFormat.format("Unable to find DiffMerge at {0}", + DIFF_PROGRAM); - public DiffMergeReporter() { - super(DIFF_PROGRAM, GenericDiffReporter.STANDARD_ARGUMENTS, MESSAGE, GenericDiffReporter.TEXT_FILE_EXTENSIONS); - } + public DiffMergeReporter() { + super(DIFF_PROGRAM, GenericDiffReporter.STANDARD_ARGUMENTS, MESSAGE, GenericDiffReporter.TEXT_FILE_EXTENSIONS); + } } diff --git a/src/main/java/org/teachingextensions/logo/Puzzle.java b/src/main/java/org/teachingextensions/logo/Puzzle.java index 30a2179..468c1d4 100644 --- a/src/main/java/org/teachingextensions/logo/Puzzle.java +++ b/src/main/java/org/teachingextensions/logo/Puzzle.java @@ -46,4 +46,9 @@ public Puzzle swapBlank(int target) { copy[target] = 8; return new Puzzle(copy); } + + @Override + public String toString() { + return Arrays.toString(cells); + } } diff --git a/src/main/java/org/teachingextensions/logo/PuzzleState.java b/src/main/java/org/teachingextensions/logo/PuzzleState.java index 584e3ec..c9b8f1c 100644 --- a/src/main/java/org/teachingextensions/logo/PuzzleState.java +++ b/src/main/java/org/teachingextensions/logo/PuzzleState.java @@ -1,16 +1,80 @@ package org.teachingextensions.logo; +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + /** * Represents a node in the puzzle-solving graph. Keeps track of the current puzzle arrangement and the actions * required to arrive at the current arrangement from the starting arrangement. */ public class PuzzleState { - public enum Directions { + private final Puzzle puzzle; + private final Stack history; + + public PuzzleState(Puzzle puzzle) { + this(puzzle, new Stack()); + } + + public PuzzleState(Puzzle puzzle, Stack history) { + this.puzzle = puzzle; + this.history = history; + } + + public boolean isSolution() { + return puzzle.isSolved(); + } + + @Override + public String toString() { + StringBuilder b = new StringBuilder(); + if (!history.isEmpty()) { + b.append(history.peek()); + b.append(" to "); + } + + b.append(puzzle); + return b.toString(); + } + + + public List getBranches() { + List branches = new ArrayList<>(4); + int blank = puzzle.getBlankIndex(); + int x = blank % 3; + int y = blank / 3; + for (Direction d : Direction.values()) { + if (d == Direction.Left && x == 0) { + continue; + } + + if (d == Direction.Right && x == 2) { + continue; + } + + if (d == Direction.Up && y == 0) { + continue; + } + + if (d == Direction.Down && y == 2) { + continue; + } + + Stack h = new Stack<>(); + h.addAll(history); + h.push(d); + branches.add(new PuzzleState(puzzle.swapBlank(blank + d.getValue()), h)); + } + + return branches; + } + + public enum Direction { Left(-1), Right(1), Up(-3), Down(3); private final int value; - private Directions(int i) { + private Direction(int i) { this.value = i; } diff --git a/src/test/java/org/teachingextensions/logo/PuzzleStateTest.java b/src/test/java/org/teachingextensions/logo/PuzzleStateTest.java index 9f0ddc9..3081c2b 100644 --- a/src/test/java/org/teachingextensions/logo/PuzzleStateTest.java +++ b/src/test/java/org/teachingextensions/logo/PuzzleStateTest.java @@ -2,18 +2,76 @@ import org.junit.Test; import org.teachingextensions.approvals.lite.Approvals; -import org.teachingextensions.approvals.lite.reporters.FileLauncherReporter; import org.teachingextensions.approvals.lite.reporters.UseReporter; +import org.teachingextensions.approvals.lite.reporters.macosx.BeyondCompareReporter; -@UseReporter(FileLauncherReporter.class) +import static org.junit.Assert.assertTrue; + +@UseReporter(BeyondCompareReporter.class) public class PuzzleStateTest { + private static Puzzle getSolvedPuzzle() { + int[] solved = {0, 1, 2, 3, 4, 5, 6, 7, 8}; + return new Puzzle(solved); + } + + private static Puzzle getPuzzle(int blank) { + return getSolvedPuzzle().swapBlank(blank); + } + /** * The state can tell you what moves are allowed from cell to cell */ @Test - public void state_has_move_directions(){ - StringBuilder b = new StringBuilder(); - Approvals.verifyAll("Directions", PuzzleState.Directions.values()); + public void state_has_move_directions() { + Approvals.verifyAll("Directions", PuzzleState.Direction.values()); + } + + /** + * The state can tell you if it is a solution to the puzzle + */ + @Test + public void state_can_be_solution() { + Puzzle p = getSolvedPuzzle(); + PuzzleState s = new PuzzleState(p); + assertTrue(s.isSolution()); + } + + /** + * The state can tell you all possible next moves for its puzzle. + */ + @Test + public void tells_you_next_moves() { + PuzzleState s = new PuzzleState(getSolvedPuzzle()); + Approvals.verifyAll("Branches for " + s, s.getBranches()); + } + + /** + * Or we can see the next moves from the top right corner + */ + @Test + public void moves_from_top_right() { + Puzzle p = getPuzzle(2); + PuzzleState s = new PuzzleState(p); + Approvals.verifyAll("Branches for " + s, s.getBranches()); + } + + /** + * Or we can see the next moves from the center + */ + @Test + public void moves_from_center(){ + Puzzle p = getPuzzle(4); + PuzzleState s = new PuzzleState(p); + Approvals.verifyAll("Branches for " + s, s.getBranches()); + } + + /** + * Finally, lets see what moves we can do from top center. + */ + @Test + public void moves_from_top_center(){ + PuzzleState s = new PuzzleState(getPuzzle(1)); + Approvals.verifyAll("Branches for " + s, s.getBranches()); } } diff --git a/src/test/java/org/teachingextensions/logo/PuzzleStateTest.moves_from_center.approved.txt b/src/test/java/org/teachingextensions/logo/PuzzleStateTest.moves_from_center.approved.txt new file mode 100644 index 0000000..e36cfd3 --- /dev/null +++ b/src/test/java/org/teachingextensions/logo/PuzzleStateTest.moves_from_center.approved.txt @@ -0,0 +1,7 @@ +Branches for [0, 1, 2, 3, 8, 5, 6, 7, 4] + + +{Left = -1} to [0, 1, 2, 8, 3, 5, 6, 7, 4] +{Right = 1} to [0, 1, 2, 3, 5, 8, 6, 7, 4] +{Up = -3} to [0, 8, 2, 3, 1, 5, 6, 7, 4] +{Down = 3} to [0, 1, 2, 3, 7, 5, 6, 8, 4] diff --git a/src/test/java/org/teachingextensions/logo/PuzzleStateTest.moves_from_top_center.approved.txt b/src/test/java/org/teachingextensions/logo/PuzzleStateTest.moves_from_top_center.approved.txt new file mode 100644 index 0000000..d061279 --- /dev/null +++ b/src/test/java/org/teachingextensions/logo/PuzzleStateTest.moves_from_top_center.approved.txt @@ -0,0 +1,6 @@ +Branches for [0, 8, 2, 3, 4, 5, 6, 7, 1] + + +{Left = -1} to [8, 0, 2, 3, 4, 5, 6, 7, 1] +{Right = 1} to [0, 2, 8, 3, 4, 5, 6, 7, 1] +{Down = 3} to [0, 4, 2, 3, 8, 5, 6, 7, 1] diff --git a/src/test/java/org/teachingextensions/logo/PuzzleStateTest.moves_from_top_right.approved.txt b/src/test/java/org/teachingextensions/logo/PuzzleStateTest.moves_from_top_right.approved.txt new file mode 100644 index 0000000..1aa30f5 --- /dev/null +++ b/src/test/java/org/teachingextensions/logo/PuzzleStateTest.moves_from_top_right.approved.txt @@ -0,0 +1,5 @@ +Branches for [0, 1, 8, 3, 4, 5, 6, 7, 2] + + +{Left = -1} to [0, 8, 1, 3, 4, 5, 6, 7, 2] +{Down = 3} to [0, 1, 5, 3, 4, 8, 6, 7, 2] diff --git a/src/test/java/org/teachingextensions/logo/PuzzleStateTest.tells_you_next_moves.approved.txt b/src/test/java/org/teachingextensions/logo/PuzzleStateTest.tells_you_next_moves.approved.txt new file mode 100644 index 0000000..a6f08ab --- /dev/null +++ b/src/test/java/org/teachingextensions/logo/PuzzleStateTest.tells_you_next_moves.approved.txt @@ -0,0 +1,5 @@ +Branches for [0, 1, 2, 3, 4, 5, 6, 7, 8] + + +{Left = -1} to [0, 1, 2, 3, 4, 5, 6, 8, 7] +{Up = -3} to [0, 1, 2, 3, 4, 8, 6, 7, 5] diff --git a/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.java b/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.java index 0c0fcf1..ee83023 100644 --- a/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.java +++ b/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.java @@ -1,67 +1,70 @@ package org.teachingextensions.logo.tests; -import java.awt.Color; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.List; -import java.util.Map.Entry; - import junit.framework.TestCase; - import org.teachingextensions.approvals.lite.Approvals; import org.teachingextensions.approvals.lite.reporters.UseReporter; -import org.teachingextensions.approvals.lite.reporters.windows.TortoiseTextDiffReporter; - +import org.teachingextensions.approvals.lite.reporters.macosx.BeyondCompareReporter; import org.teachingextensions.approvals.lite.util.StringUtils; -import org.teachingextensions.approvals.lite.util.TestUtils; import org.teachingextensions.approvals.lite.util.Tuple; import org.teachingextensions.approvals.lite.util.io.FileUtils; import org.teachingextensions.approvals.lite.util.velocity.ContextAware.ContextAwareMap; import org.teachingextensions.approvals.lite.util.velocity.VelocityParser; -@UseReporter(TortoiseTextDiffReporter.class) -public class ColorGeneration extends TestCase -{ - public void testGeneration() throws Exception - { +import java.awt.*; +import java.util.*; +import java.util.List; +import java.util.Map.Entry; + +@UseReporter(BeyondCompareReporter.class) +public class ColorGeneration extends TestCase { + public static String getOtherColors(HashMap>> colors, String key, String color) { + String out = ""; + for (Entry>> entry : colors.entrySet()) { + if (!entry.getKey().equals(key)) { + if (containsColor(entry.getValue(), color)) { + out += entry.getKey() + ", "; + } + } + } + return out; + } + + private static boolean containsColor(List> value, String color) { + for (Tuple tuple : value) { + if (color.equals(tuple.getFirst())) { + return true; + } + } + return false; + } + + public void testGeneration() throws Exception { HashMap>> loadColors = loadColors(); Approvals.verify(generateColors(loadColors, "colors.java.template")); } - public void testHtmlDisplay() throws Exception - { + + public void testHtmlDisplay() throws Exception { HashMap>> loadColors = loadColors(); Approvals.verifyHtml(generateColors(loadColors, "colors.html")); } - public void ptestSortingDisplay() throws Exception - { - HashMap>> loadColors = loadColors(); - TestUtils.displayText(generateColors(loadColors, "colors.sorted.txt")); - } - private HashMap>> loadColors() - { - HashMap>> colors = new HashMap>>(); + + private HashMap>> loadColors() { + HashMap>> colors = new HashMap<>(); String[] split = FileUtils.readFromClassPath(getClass(), "colors.txt").split("\n"); String currentColor = ""; - for (String line : split) - { + for (String line : split) { String[] parts = StringUtils.stripWhiteSpace(line).split(" "); //System.out.println(line); - if (parts.length == 1) - { + if (parts.length == 1) { currentColor = parts[0]; - } - else - { + } else { add(colors, currentColor, parts[0], parts[1]); } } return colors; } - private String generateColors(HashMap>> colors, String template) - { + + private String generateColors(HashMap>> colors, String template) { ContextAwareMap aware = new ContextAwareMap("colors", colors); aware.put("finder", this); Object[] keys = colors.keySet().toArray(); @@ -69,46 +72,21 @@ private String generateColors(HashMap>> color aware.put("keys", keys); return VelocityParser.parseFromClassPath(this.getClass(), template, aware); } - public static String getOtherColors(HashMap>> colors, String key, String color) - { - String out = ""; - for (Entry>> entry : colors.entrySet()) - { - if (!entry.getKey().equals(key)) - { - if (containsColor(entry.getValue(), color)) - { - out += entry.getKey() + ", "; - } - } - } - return out; - } - private static boolean containsColor(List> value, String color) - { - for (Tuple tuple : value) - { - if (color.equals(tuple.getFirst())) { return true; } - } - return false; - } + private void add(HashMap>> colors, String colorGroup, String name, - String hexValue) - { + String hexValue) { List> list = colors.get(colorGroup); - if (list == null) - { - list = new ArrayList>(); + if (list == null) { + list = new ArrayList<>(); colors.put(colorGroup, list); } - list.add(new Tuple(name, hexValue)); + list.add(new Tuple<>(name, hexValue)); Collections.sort(list, new BrightnessComparator()); } - public class BrightnessComparator implements Comparator> - { + + public class BrightnessComparator implements Comparator> { @Override - public int compare(Tuple o1, Tuple o2) - { + public int compare(Tuple o1, Tuple o2) { Color c1 = Color.decode(o1.getSecond()); Color c2 = Color.decode(o2.getSecond()); Integer b1 = c1.getGreen() + c1.getRed() + c1.getBlue(); diff --git a/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.testHtmlDisplay.approved.html b/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.testHtmlDisplay.approved.html index 5ccdb7b..e54090a 100644 --- a/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.testHtmlDisplay.approved.html +++ b/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.testHtmlDisplay.approved.html @@ -397,7 +397,7 @@

- + @@ -405,7 +405,7 @@ - + @@ -539,7 +539,7 @@ - + @@ -551,7 +551,7 @@ - + From bde115d3e530001ffbd4615d2308877eeca1f44b Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Sat, 21 Mar 2015 20:36:10 -0700 Subject: [PATCH 095/111] Breadth First Player --- .../approvals/lite/Approvals.java | 3 ++ .../logo/BreadthFirstPlayer.java | 39 +++++++++++++++++++ .../teachingextensions/logo/PuzzleState.java | 8 ++++ .../logo/BreadthFirstPlayerTest.java | 34 ++++++++++++++++ ...layerTest.solve_longer_puzzle.approved.txt | 16 ++++++++ ...hFirstPlayerTest.solve_puzzle.approved.txt | 4 ++ 6 files changed, 104 insertions(+) create mode 100644 src/main/java/org/teachingextensions/logo/BreadthFirstPlayer.java create mode 100644 src/test/java/org/teachingextensions/logo/BreadthFirstPlayerTest.java create mode 100644 src/test/java/org/teachingextensions/logo/BreadthFirstPlayerTest.solve_longer_puzzle.approved.txt create mode 100644 src/test/java/org/teachingextensions/logo/BreadthFirstPlayerTest.solve_puzzle.approved.txt diff --git a/src/main/java/org/teachingextensions/approvals/lite/Approvals.java b/src/main/java/org/teachingextensions/approvals/lite/Approvals.java index 48a982c..aa47e78 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/Approvals.java +++ b/src/main/java/org/teachingextensions/approvals/lite/Approvals.java @@ -91,4 +91,7 @@ public static ApprovalNamer createApprovalNamer() { return new JUnitStackTraceNamer(); } + public static void verify(Object o) throws Exception { + Approvals.verify(o + ""); + } } diff --git a/src/main/java/org/teachingextensions/logo/BreadthFirstPlayer.java b/src/main/java/org/teachingextensions/logo/BreadthFirstPlayer.java new file mode 100644 index 0000000..f3e4e27 --- /dev/null +++ b/src/main/java/org/teachingextensions/logo/BreadthFirstPlayer.java @@ -0,0 +1,39 @@ +package org.teachingextensions.logo; + +import java.util.*; + +/** + * A player who solves puzzles using breadth-first search. + */ +public class BreadthFirstPlayer { + private final Puzzle puzzle; + private final Set visited = new HashSet<>(); + private final Queue frontier = new ArrayDeque<>(); + + public BreadthFirstPlayer(Puzzle puzzle) { + + this.puzzle = puzzle; + } + + public PuzzleState solve() { + PuzzleState state = new PuzzleState(this.puzzle); + do { + visited.add(state); + if (!state.isSolution()){ + this.search(state); + } + state = frontier.remove(); + } while (!state.isSolution()); + + return state; + } + + private void search(PuzzleState state) { + List branches = state.getBranches(); + for(PuzzleState b : branches){ + if (!visited.contains(b)){ + frontier.add(b); + } + } + } +} diff --git a/src/main/java/org/teachingextensions/logo/PuzzleState.java b/src/main/java/org/teachingextensions/logo/PuzzleState.java index c9b8f1c..ce6b29a 100644 --- a/src/main/java/org/teachingextensions/logo/PuzzleState.java +++ b/src/main/java/org/teachingextensions/logo/PuzzleState.java @@ -69,6 +69,14 @@ public List getBranches() { return branches; } + public Iterable getHistory() { + return this.history; + } + + public Puzzle getPuzzle() { + return this.puzzle; + } + public enum Direction { Left(-1), Right(1), Up(-3), Down(3); diff --git a/src/test/java/org/teachingextensions/logo/BreadthFirstPlayerTest.java b/src/test/java/org/teachingextensions/logo/BreadthFirstPlayerTest.java new file mode 100644 index 0000000..5179284 --- /dev/null +++ b/src/test/java/org/teachingextensions/logo/BreadthFirstPlayerTest.java @@ -0,0 +1,34 @@ +package org.teachingextensions.logo; + +import org.junit.Test; +import org.teachingextensions.approvals.lite.Approvals; +import org.teachingextensions.approvals.lite.reporters.UseReporter; +import org.teachingextensions.approvals.lite.reporters.macosx.BeyondCompareReporter; + +@UseReporter(BeyondCompareReporter.class) +public class BreadthFirstPlayerTest { + /** + * Produces a puzzle solution + */ + @Test + public void solve_puzzle() throws Exception { + int[] cells = {0, 1, 2, 3, 4, 5, 6, 8, 7}; + Puzzle p = new Puzzle(cells); + BreadthFirstPlayer b = new BreadthFirstPlayer(p); + PuzzleState s = b.solve(); + Approvals.verifyAll("Solve " + p, s.getHistory()); + } + + /** + * Solve longer puzzle + */ + @Test + public void solve_longer_puzzle() throws Exception { + int[] cells = {0, 1, 2, 3, 4, 8, 5, 6, 7}; + Puzzle p = new Puzzle(cells); + BreadthFirstPlayer b = new BreadthFirstPlayer(p); + + PuzzleState s = b.solve(); + Approvals.verifyAll("From " + p + " to " + s.getPuzzle(), s.getHistory()); + } +} diff --git a/src/test/java/org/teachingextensions/logo/BreadthFirstPlayerTest.solve_longer_puzzle.approved.txt b/src/test/java/org/teachingextensions/logo/BreadthFirstPlayerTest.solve_longer_puzzle.approved.txt new file mode 100644 index 0000000..fb4b824 --- /dev/null +++ b/src/test/java/org/teachingextensions/logo/BreadthFirstPlayerTest.solve_longer_puzzle.approved.txt @@ -0,0 +1,16 @@ +From [0, 1, 2, 3, 4, 8, 5, 6, 7] to [0, 1, 2, 3, 4, 5, 6, 7, 8] + + +{Down = 3} +{Left = -1} +{Left = -1} +{Up = -3} +{Right = 1} +{Down = 3} +{Right = 1} +{Up = -3} +{Left = -1} +{Left = -1} +{Down = 3} +{Right = 1} +{Right = 1} diff --git a/src/test/java/org/teachingextensions/logo/BreadthFirstPlayerTest.solve_puzzle.approved.txt b/src/test/java/org/teachingextensions/logo/BreadthFirstPlayerTest.solve_puzzle.approved.txt new file mode 100644 index 0000000..a560eb2 --- /dev/null +++ b/src/test/java/org/teachingextensions/logo/BreadthFirstPlayerTest.solve_puzzle.approved.txt @@ -0,0 +1,4 @@ +Solve [0, 1, 2, 3, 4, 5, 6, 8, 7] + + +{Right = 1} From 561b8243ab0eaae78f62bbcbc262b8dec74e815c Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Sun, 22 Mar 2015 07:17:51 -0700 Subject: [PATCH 096/111] Uniform cost player --- .../logo/BreadthFirstPlayer.java | 31 ++----------------- .../logo/PuzzlePlayerTest.java | 30 ++++++++++++++++++ .../teachingextensions/logo/PuzzleState.java | 17 +++++++++- .../logo/UniformCostPlayer.java | 15 +++++++++ .../logo/BreadthFirstPlayerTest.java | 22 ++++++------- .../logo/PuzzleStateTest.java | 28 +++++++++++++++-- .../logo/UniformCostPlayerTest.java | 29 +++++++++++++++++ ...layerTest.solve_longer_puzzle.approved.txt | 16 ++++++++++ ...rmCostPlayerTest.solve_puzzle.approved.txt | 4 +++ 9 files changed, 148 insertions(+), 44 deletions(-) create mode 100644 src/main/java/org/teachingextensions/logo/PuzzlePlayerTest.java create mode 100644 src/main/java/org/teachingextensions/logo/UniformCostPlayer.java create mode 100644 src/test/java/org/teachingextensions/logo/UniformCostPlayerTest.java create mode 100644 src/test/java/org/teachingextensions/logo/UniformCostPlayerTest.solve_longer_puzzle.approved.txt create mode 100644 src/test/java/org/teachingextensions/logo/UniformCostPlayerTest.solve_puzzle.approved.txt diff --git a/src/main/java/org/teachingextensions/logo/BreadthFirstPlayer.java b/src/main/java/org/teachingextensions/logo/BreadthFirstPlayer.java index f3e4e27..bd529b3 100644 --- a/src/main/java/org/teachingextensions/logo/BreadthFirstPlayer.java +++ b/src/main/java/org/teachingextensions/logo/BreadthFirstPlayer.java @@ -1,39 +1,14 @@ package org.teachingextensions.logo; -import java.util.*; +import java.util.ArrayDeque; /** * A player who solves puzzles using breadth-first search. */ -public class BreadthFirstPlayer { - private final Puzzle puzzle; - private final Set visited = new HashSet<>(); - private final Queue frontier = new ArrayDeque<>(); +public class BreadthFirstPlayer extends PuzzlePlayer { public BreadthFirstPlayer(Puzzle puzzle) { - - this.puzzle = puzzle; + super(puzzle, new ArrayDeque()); } - public PuzzleState solve() { - PuzzleState state = new PuzzleState(this.puzzle); - do { - visited.add(state); - if (!state.isSolution()){ - this.search(state); - } - state = frontier.remove(); - } while (!state.isSolution()); - - return state; - } - - private void search(PuzzleState state) { - List branches = state.getBranches(); - for(PuzzleState b : branches){ - if (!visited.contains(b)){ - frontier.add(b); - } - } - } } diff --git a/src/main/java/org/teachingextensions/logo/PuzzlePlayerTest.java b/src/main/java/org/teachingextensions/logo/PuzzlePlayerTest.java new file mode 100644 index 0000000..c14ce2e --- /dev/null +++ b/src/main/java/org/teachingextensions/logo/PuzzlePlayerTest.java @@ -0,0 +1,30 @@ +package org.teachingextensions.logo; + +import org.teachingextensions.approvals.lite.Approvals; + +/** + * Test a puzzle player + */ +public abstract class PuzzlePlayerTest { + + + protected void verifySolution() { + int[] cells = {0, 1, 2, 3, 4, 5, 6, 8, 7}; + Puzzle p = new Puzzle(cells); + PuzzlePlayer b = getPlayer(p); + PuzzleState s = b.solve(); + Approvals.verifyAll("Solve " + p, s.getHistory()); + } + + protected abstract PuzzlePlayer getPlayer(Puzzle puzzle); + + + protected void verifyLongSolution() { + int[] cells = {0, 1, 2, 3, 4, 8, 5, 6, 7}; + Puzzle p = new Puzzle(cells); + PuzzlePlayer b = getPlayer(p); + + PuzzleState s = b.solve(); + Approvals.verifyAll("From " + p + " to " + s.getPuzzle(), s.getHistory()); + } +} diff --git a/src/main/java/org/teachingextensions/logo/PuzzleState.java b/src/main/java/org/teachingextensions/logo/PuzzleState.java index ce6b29a..4179dc8 100644 --- a/src/main/java/org/teachingextensions/logo/PuzzleState.java +++ b/src/main/java/org/teachingextensions/logo/PuzzleState.java @@ -1,6 +1,7 @@ package org.teachingextensions.logo; import java.util.ArrayList; +import java.util.Comparator; import java.util.List; import java.util.Stack; @@ -8,7 +9,7 @@ * Represents a node in the puzzle-solving graph. Keeps track of the current puzzle arrangement and the actions * required to arrive at the current arrangement from the starting arrangement. */ -public class PuzzleState { +public class PuzzleState implements Comparator , Comparable{ private final Puzzle puzzle; private final Stack history; @@ -77,6 +78,20 @@ public Puzzle getPuzzle() { return this.puzzle; } + public int getActualCost() { + return this.history.size(); + } + + @Override + public int compare(PuzzleState o1, PuzzleState o2) { + return o1.getActualCost() - o2.getActualCost(); + } + + @Override + public int compareTo(PuzzleState o) { + return compare(this, o); + } + public enum Direction { Left(-1), Right(1), Up(-3), Down(3); diff --git a/src/main/java/org/teachingextensions/logo/UniformCostPlayer.java b/src/main/java/org/teachingextensions/logo/UniformCostPlayer.java new file mode 100644 index 0000000..8122924 --- /dev/null +++ b/src/main/java/org/teachingextensions/logo/UniformCostPlayer.java @@ -0,0 +1,15 @@ +package org.teachingextensions.logo; + +import java.util.PriorityQueue; + +/** + * Uniform cost player tries to pick the solution with the least number of steps. The player treats every step as + * if to costs the same as any other step. + */ +public class UniformCostPlayer extends PuzzlePlayer { + public UniformCostPlayer(Puzzle puzzle) { + super(puzzle, new PriorityQueue()); + } + + +} diff --git a/src/test/java/org/teachingextensions/logo/BreadthFirstPlayerTest.java b/src/test/java/org/teachingextensions/logo/BreadthFirstPlayerTest.java index 5179284..0f3c026 100644 --- a/src/test/java/org/teachingextensions/logo/BreadthFirstPlayerTest.java +++ b/src/test/java/org/teachingextensions/logo/BreadthFirstPlayerTest.java @@ -1,22 +1,23 @@ package org.teachingextensions.logo; import org.junit.Test; -import org.teachingextensions.approvals.lite.Approvals; import org.teachingextensions.approvals.lite.reporters.UseReporter; import org.teachingextensions.approvals.lite.reporters.macosx.BeyondCompareReporter; @UseReporter(BeyondCompareReporter.class) -public class BreadthFirstPlayerTest { +public class BreadthFirstPlayerTest extends PuzzlePlayerTest { + + @Override + protected PuzzlePlayer getPlayer(Puzzle puzzle) { + return new BreadthFirstPlayer(puzzle); + } + /** * Produces a puzzle solution */ @Test public void solve_puzzle() throws Exception { - int[] cells = {0, 1, 2, 3, 4, 5, 6, 8, 7}; - Puzzle p = new Puzzle(cells); - BreadthFirstPlayer b = new BreadthFirstPlayer(p); - PuzzleState s = b.solve(); - Approvals.verifyAll("Solve " + p, s.getHistory()); + verifySolution(); } /** @@ -24,11 +25,6 @@ public void solve_puzzle() throws Exception { */ @Test public void solve_longer_puzzle() throws Exception { - int[] cells = {0, 1, 2, 3, 4, 8, 5, 6, 7}; - Puzzle p = new Puzzle(cells); - BreadthFirstPlayer b = new BreadthFirstPlayer(p); - - PuzzleState s = b.solve(); - Approvals.verifyAll("From " + p + " to " + s.getPuzzle(), s.getHistory()); + verifyLongSolution(); } } diff --git a/src/test/java/org/teachingextensions/logo/PuzzleStateTest.java b/src/test/java/org/teachingextensions/logo/PuzzleStateTest.java index 3081c2b..fe798f6 100644 --- a/src/test/java/org/teachingextensions/logo/PuzzleStateTest.java +++ b/src/test/java/org/teachingextensions/logo/PuzzleStateTest.java @@ -5,6 +5,9 @@ import org.teachingextensions.approvals.lite.reporters.UseReporter; import org.teachingextensions.approvals.lite.reporters.macosx.BeyondCompareReporter; +import java.util.Stack; + +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @UseReporter(BeyondCompareReporter.class) @@ -60,7 +63,7 @@ public void moves_from_top_right() { * Or we can see the next moves from the center */ @Test - public void moves_from_center(){ + public void moves_from_center() { Puzzle p = getPuzzle(4); PuzzleState s = new PuzzleState(p); Approvals.verifyAll("Branches for " + s, s.getBranches()); @@ -70,8 +73,29 @@ public void moves_from_center(){ * Finally, lets see what moves we can do from top center. */ @Test - public void moves_from_top_center(){ + public void moves_from_top_center() { PuzzleState s = new PuzzleState(getPuzzle(1)); Approvals.verifyAll("Branches for " + s, s.getBranches()); } + + /** + * The actual cost is zero when there is no history + */ + @Test + public void actual_cost() { + PuzzleState s = new PuzzleState(getSolvedPuzzle()); + assertEquals(0, s.getActualCost()); + } + + /** + * The actual cost is the number of steps in the the history + */ + @Test + public void actual_cost_is_actual_steps() { + Stack history = new Stack<>(); + history.add(PuzzleState.Direction.Right); + history.add(PuzzleState.Direction.Right); + PuzzleState s = new PuzzleState(getSolvedPuzzle(), history); + assertEquals(2, s.getActualCost()); + } } diff --git a/src/test/java/org/teachingextensions/logo/UniformCostPlayerTest.java b/src/test/java/org/teachingextensions/logo/UniformCostPlayerTest.java new file mode 100644 index 0000000..55767b6 --- /dev/null +++ b/src/test/java/org/teachingextensions/logo/UniformCostPlayerTest.java @@ -0,0 +1,29 @@ +package org.teachingextensions.logo; + +import org.junit.Test; +import org.teachingextensions.approvals.lite.reporters.UseReporter; +import org.teachingextensions.approvals.lite.reporters.macosx.BeyondCompareReporter; + +@UseReporter(BeyondCompareReporter.class) +public class UniformCostPlayerTest extends PuzzlePlayerTest { + @Override + protected PuzzlePlayer getPlayer(Puzzle puzzle) { + return new UniformCostPlayer(puzzle); + } + + /** + * Produces a puzzle solution + */ + @Test + public void solve_puzzle() throws Exception { + verifySolution(); + } + + /** + * Solve longer puzzle + */ + @Test + public void solve_longer_puzzle() throws Exception { + verifyLongSolution(); + } +} diff --git a/src/test/java/org/teachingextensions/logo/UniformCostPlayerTest.solve_longer_puzzle.approved.txt b/src/test/java/org/teachingextensions/logo/UniformCostPlayerTest.solve_longer_puzzle.approved.txt new file mode 100644 index 0000000..fb4b824 --- /dev/null +++ b/src/test/java/org/teachingextensions/logo/UniformCostPlayerTest.solve_longer_puzzle.approved.txt @@ -0,0 +1,16 @@ +From [0, 1, 2, 3, 4, 8, 5, 6, 7] to [0, 1, 2, 3, 4, 5, 6, 7, 8] + + +{Down = 3} +{Left = -1} +{Left = -1} +{Up = -3} +{Right = 1} +{Down = 3} +{Right = 1} +{Up = -3} +{Left = -1} +{Left = -1} +{Down = 3} +{Right = 1} +{Right = 1} diff --git a/src/test/java/org/teachingextensions/logo/UniformCostPlayerTest.solve_puzzle.approved.txt b/src/test/java/org/teachingextensions/logo/UniformCostPlayerTest.solve_puzzle.approved.txt new file mode 100644 index 0000000..a560eb2 --- /dev/null +++ b/src/test/java/org/teachingextensions/logo/UniformCostPlayerTest.solve_puzzle.approved.txt @@ -0,0 +1,4 @@ +Solve [0, 1, 2, 3, 4, 5, 6, 8, 7] + + +{Right = 1} From 01092117215593f48b3faeb528af4638043a2b85 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Sun, 22 Mar 2015 07:18:01 -0700 Subject: [PATCH 097/111] . --- .../teachingextensions/logo/PuzzlePlayer.java | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 src/main/java/org/teachingextensions/logo/PuzzlePlayer.java diff --git a/src/main/java/org/teachingextensions/logo/PuzzlePlayer.java b/src/main/java/org/teachingextensions/logo/PuzzlePlayer.java new file mode 100644 index 0000000..78cb08f --- /dev/null +++ b/src/main/java/org/teachingextensions/logo/PuzzlePlayer.java @@ -0,0 +1,56 @@ +package org.teachingextensions.logo; + +import java.util.HashSet; +import java.util.List; +import java.util.Queue; +import java.util.Set; + +/** + * A player solves puzzles using a certain style. + */ +public abstract class PuzzlePlayer { + private final Puzzle puzzle; + private final Set visited = new HashSet<>(); + private final Queue frontier; + + public PuzzlePlayer(Puzzle puzzle, Queue frontier) { + this.puzzle = puzzle; + this.frontier = frontier; + } + + protected Set getVisited() { + return visited; + } + + protected Queue getFrontier() { + return frontier; + } + + protected Puzzle getPuzzle() { + return puzzle; + } + + public PuzzleState solve() { + PuzzleState state = new PuzzleState(this.getPuzzle()); + do { + getVisited().add(state); + if (!state.isSolution()) { + this.search(state); + state = getFrontier().remove(); + }else{ + continue; + } + } while (!state.isSolution()); + + return state; + } + + protected void search(PuzzleState state) { + List branches = state.getBranches(); + for (PuzzleState b : branches) { + if (!getVisited().contains(b)) { + getFrontier().add(b); + } + } + } +} From 3d7912cd5847e31c9a46dcc0db2d162791edc005 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Sun, 22 Mar 2015 07:51:24 -0700 Subject: [PATCH 098/111] Equality checks --- .../org/teachingextensions/logo/Puzzle.java | 30 ++++++++++++---- .../teachingextensions/logo/PuzzlePlayer.java | 2 -- .../teachingextensions/logo/PuzzleState.java | 18 +++++++++- .../logo/BreadthFirstPlayerTest.java | 14 ++++++++ ...PlayerTest.solve_jumbo_puzzle.approved.txt | 25 +++++++++++++ .../logo/PuzzleStateTest.java | 35 +++++++++++++++++-- .../teachingextensions/logo/PuzzleTest.java | 32 +++++++++++++---- 7 files changed, 138 insertions(+), 18 deletions(-) create mode 100644 src/test/java/org/teachingextensions/logo/BreadthFirstPlayerTest.solve_jumbo_puzzle.approved.txt diff --git a/src/main/java/org/teachingextensions/logo/Puzzle.java b/src/main/java/org/teachingextensions/logo/Puzzle.java index 468c1d4..77b11f9 100644 --- a/src/main/java/org/teachingextensions/logo/Puzzle.java +++ b/src/main/java/org/teachingextensions/logo/Puzzle.java @@ -16,6 +16,27 @@ public Puzzle(int[] cells) { this.cells = cells; } + @Override + public int hashCode() { + return Arrays.hashCode(cells); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Puzzle puzzle = (Puzzle) o; + + return Arrays.equals(cells, puzzle.cells); + + } + + @Override + public String toString() { + return Arrays.toString(cells); + } + public boolean isSolved() { for (int i = 0; i < solution.length; i++) { if (solution[i] != cells[i]) { @@ -36,7 +57,9 @@ public int getBlankIndex() { /** * Create a copy of the puzzle where the blank swapped with the value in the target position - * @param target move the blank to this location, and move the value from this location to the current blank location + * + * @param target + * move the blank to this location, and move the value from this location to the current blank location * @return A copy of the puzzle with the blank and target swapped. */ public Puzzle swapBlank(int target) { @@ -46,9 +69,4 @@ public Puzzle swapBlank(int target) { copy[target] = 8; return new Puzzle(copy); } - - @Override - public String toString() { - return Arrays.toString(cells); - } } diff --git a/src/main/java/org/teachingextensions/logo/PuzzlePlayer.java b/src/main/java/org/teachingextensions/logo/PuzzlePlayer.java index 78cb08f..cb9750a 100644 --- a/src/main/java/org/teachingextensions/logo/PuzzlePlayer.java +++ b/src/main/java/org/teachingextensions/logo/PuzzlePlayer.java @@ -37,8 +37,6 @@ public PuzzleState solve() { if (!state.isSolution()) { this.search(state); state = getFrontier().remove(); - }else{ - continue; } } while (!state.isSolution()); diff --git a/src/main/java/org/teachingextensions/logo/PuzzleState.java b/src/main/java/org/teachingextensions/logo/PuzzleState.java index 4179dc8..dc8ee2c 100644 --- a/src/main/java/org/teachingextensions/logo/PuzzleState.java +++ b/src/main/java/org/teachingextensions/logo/PuzzleState.java @@ -88,10 +88,26 @@ public int compare(PuzzleState o1, PuzzleState o2) { } @Override - public int compareTo(PuzzleState o) { + public int compareTo( PuzzleState o) { return compare(this, o); } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + PuzzleState that = (PuzzleState) o; + + return puzzle.equals(that.puzzle); + + } + + @Override + public int hashCode() { + return puzzle.hashCode(); + } + public enum Direction { Left(-1), Right(1), Up(-3), Down(3); diff --git a/src/test/java/org/teachingextensions/logo/BreadthFirstPlayerTest.java b/src/test/java/org/teachingextensions/logo/BreadthFirstPlayerTest.java index 0f3c026..baa79f7 100644 --- a/src/test/java/org/teachingextensions/logo/BreadthFirstPlayerTest.java +++ b/src/test/java/org/teachingextensions/logo/BreadthFirstPlayerTest.java @@ -1,6 +1,7 @@ package org.teachingextensions.logo; import org.junit.Test; +import org.teachingextensions.approvals.lite.Approvals; import org.teachingextensions.approvals.lite.reporters.UseReporter; import org.teachingextensions.approvals.lite.reporters.macosx.BeyondCompareReporter; @@ -27,4 +28,17 @@ public void solve_puzzle() throws Exception { public void solve_longer_puzzle() throws Exception { verifyLongSolution(); } + + /** + * Solve jumbo puzzle + */ + @Test + public void solve_jumbo_puzzle() throws Exception { + int[] cells = {8, 0, 1, 2, 3, 4, 5, 6, 7}; + Puzzle p = new Puzzle(cells); + PuzzlePlayer b = getPlayer(p); + + PuzzleState s = b.solve(); + Approvals.verifyAll("From " + p + " to " + s.getPuzzle(), s.getHistory()); + } } diff --git a/src/test/java/org/teachingextensions/logo/BreadthFirstPlayerTest.solve_jumbo_puzzle.approved.txt b/src/test/java/org/teachingextensions/logo/BreadthFirstPlayerTest.solve_jumbo_puzzle.approved.txt new file mode 100644 index 0000000..19d9dd5 --- /dev/null +++ b/src/test/java/org/teachingextensions/logo/BreadthFirstPlayerTest.solve_jumbo_puzzle.approved.txt @@ -0,0 +1,25 @@ +From [8, 0, 1, 2, 3, 4, 5, 6, 7] to [0, 1, 2, 3, 4, 5, 6, 7, 8] + + +{Right = 1} +{Down = 3} +{Left = -1} +{Down = 3} +{Right = 1} +{Right = 1} +{Up = -3} +{Left = -1} +{Left = -1} +{Down = 3} +{Right = 1} +{Up = -3} +{Up = -3} +{Right = 1} +{Down = 3} +{Down = 3} +{Left = -1} +{Left = -1} +{Up = -3} +{Right = 1} +{Right = 1} +{Down = 3} diff --git a/src/test/java/org/teachingextensions/logo/PuzzleStateTest.java b/src/test/java/org/teachingextensions/logo/PuzzleStateTest.java index fe798f6..8c2f28f 100644 --- a/src/test/java/org/teachingextensions/logo/PuzzleStateTest.java +++ b/src/test/java/org/teachingextensions/logo/PuzzleStateTest.java @@ -7,8 +7,7 @@ import java.util.Stack; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; +import static org.junit.Assert.*; @UseReporter(BeyondCompareReporter.class) public class PuzzleStateTest { @@ -98,4 +97,36 @@ public void actual_cost_is_actual_steps() { PuzzleState s = new PuzzleState(getSolvedPuzzle(), history); assertEquals(2, s.getActualCost()); } + + /** + * Is not equal to another state when the puzzles are different + */ + @Test + public void not_equal_to_state_with_different_puzzle() { + PuzzleState a = new PuzzleState(getSolvedPuzzle()); + PuzzleState b = new PuzzleState(getPuzzle(2)); + assertNotEquals(a, b); + } + + /** + * Is equal to another state when the puzzles are the same + */ + @Test + public void equal_to_state_with_same_puzzle() { + PuzzleState a = new PuzzleState(getPuzzle(1)); + PuzzleState b = new PuzzleState(getPuzzle(1)); + assertTrue(a.equals(b)); + } + + /** + * Is equal to state with same puzzle even when history differs + */ + @Test + public void equal_even_with_different_history() { + Stack history = new Stack<>(); + history.add(PuzzleState.Direction.Right); + PuzzleState a = new PuzzleState(getPuzzle(3), history); + PuzzleState b = new PuzzleState(getPuzzle(3)); + assertEquals(a, b); + } } diff --git a/src/test/java/org/teachingextensions/logo/PuzzleTest.java b/src/test/java/org/teachingextensions/logo/PuzzleTest.java index 926eb80..b7cf8bf 100644 --- a/src/test/java/org/teachingextensions/logo/PuzzleTest.java +++ b/src/test/java/org/teachingextensions/logo/PuzzleTest.java @@ -4,9 +4,7 @@ import java.util.Arrays; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.junit.Assert.*; public class PuzzleTest { private static int[] getSolution() { @@ -46,7 +44,7 @@ public void puzzle_not_solved() { * A puzzle has a blank */ @Test - public void puzzle_has_blank(){ + public void puzzle_has_blank() { Puzzle p = new Puzzle(getSolution()); assertEquals(8, p.getBlankIndex()); } @@ -55,7 +53,7 @@ public void puzzle_has_blank(){ * Blank can be anywhere */ @Test - public void blank_can_be_anywhere(){ + public void blank_can_be_anywhere() { int[] cells = swap(getSolution(), 8, 2); Puzzle p = new Puzzle(cells); assertEquals(2, p.getBlankIndex()); @@ -65,7 +63,7 @@ public void blank_can_be_anywhere(){ * Puzzle can swap blank for you */ @Test - public void puzzle_can_swap_blank(){ + public void puzzle_can_swap_blank() { Puzzle p = new Puzzle(getSolution()); Puzzle c = p.swapBlank(4); assertEquals(4, c.getBlankIndex()); @@ -75,10 +73,30 @@ public void puzzle_can_swap_blank(){ * Puzzle can swap blank for you */ @Test - public void blank_swap_leaves_original_as_is(){ + public void blank_swap_leaves_original_as_is() { Puzzle p = new Puzzle(getSolution()); p.swapBlank(4); assertEquals(8, p.getBlankIndex()); } + /** + * Puzzle is not equal to a puzzle with different cells. + */ + @Test + public void different_cells_means_different_puzzle() { + Puzzle a = new Puzzle(getSolution()); + Puzzle b = new Puzzle(swap(getSolution(), 8, 2)); + assertNotEquals(a, b); + } + + /** + * Puzzle is equal to a puzzle with the same cells. + */ + @Test + public void same_cells_means_same_puzzle() { + Puzzle a = new Puzzle(swap(getSolution(), 8, 3)); + Puzzle b = new Puzzle(swap(getSolution(), 8, 3)); + assertEquals(a, b); + } + } From bd1693fd965dcf52ff182f2d51089b9f57775148 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Sun, 22 Mar 2015 09:55:02 -0700 Subject: [PATCH 099/111] A Star Player --- .../logo/AStarEstimator.java | 15 ++++ .../teachingextensions/logo/AStarPlayer.java | 13 ++++ .../org/teachingextensions/logo/Puzzle.java | 61 +++++++++++++--- .../teachingextensions/logo/PuzzleState.java | 37 +++++----- .../logo/AStarPlayerTest.java | 44 ++++++++++++ ...PlayerTest.solve_jumbo_puzzle.approved.txt | 25 +++++++ ...layerTest.solve_longer_puzzle.approved.txt | 16 +++++ .../AStarPlayerTest.solve_puzzle.approved.txt | 4 ++ .../logo/PuzzlePlayerTest.java | 0 .../logo/PuzzleStateTest.java | 20 ++++++ ...Test.get_coordinates_for_cell.approved.txt | 7 ++ ...t.get_distances_between_cells.approved.txt | 7 ++ ...t_distances_between_positions.approved.txt | 7 ++ .../teachingextensions/logo/PuzzleTest.java | 70 +++++++++++++++++++ 14 files changed, 301 insertions(+), 25 deletions(-) create mode 100644 src/main/java/org/teachingextensions/logo/AStarEstimator.java create mode 100644 src/main/java/org/teachingextensions/logo/AStarPlayer.java create mode 100644 src/test/java/org/teachingextensions/logo/AStarPlayerTest.java create mode 100644 src/test/java/org/teachingextensions/logo/AStarPlayerTest.solve_jumbo_puzzle.approved.txt create mode 100644 src/test/java/org/teachingextensions/logo/AStarPlayerTest.solve_longer_puzzle.approved.txt create mode 100644 src/test/java/org/teachingextensions/logo/AStarPlayerTest.solve_puzzle.approved.txt rename src/{main => test}/java/org/teachingextensions/logo/PuzzlePlayerTest.java (100%) create mode 100644 src/test/java/org/teachingextensions/logo/PuzzleTest.get_coordinates_for_cell.approved.txt create mode 100644 src/test/java/org/teachingextensions/logo/PuzzleTest.get_distances_between_cells.approved.txt create mode 100644 src/test/java/org/teachingextensions/logo/PuzzleTest.get_distances_between_positions.approved.txt diff --git a/src/main/java/org/teachingextensions/logo/AStarEstimator.java b/src/main/java/org/teachingextensions/logo/AStarEstimator.java new file mode 100644 index 0000000..8c99232 --- /dev/null +++ b/src/main/java/org/teachingextensions/logo/AStarEstimator.java @@ -0,0 +1,15 @@ +package org.teachingextensions.logo; + +import java.util.Comparator; + +public class AStarEstimator implements Comparator { + + @Override + public int compare(PuzzleState left, PuzzleState right) { + return costOf(left) - costOf(right); + } + + private int costOf(PuzzleState state) { + return state.getActualCost() + state.getEstimatedCost(); + } +} diff --git a/src/main/java/org/teachingextensions/logo/AStarPlayer.java b/src/main/java/org/teachingextensions/logo/AStarPlayer.java new file mode 100644 index 0000000..ef85bf3 --- /dev/null +++ b/src/main/java/org/teachingextensions/logo/AStarPlayer.java @@ -0,0 +1,13 @@ +package org.teachingextensions.logo; + +import java.util.PriorityQueue; + +/** + * A player who solves puzzles using the A* strategy will not only take into account the known cost of a reaching + * a puzzle state, but also estimates the remaining cost to the goal. + */ +public class AStarPlayer extends PuzzlePlayer { + public AStarPlayer(Puzzle puzzle) { + super(puzzle, new PriorityQueue<>(1, new AStarEstimator())); + } +} diff --git a/src/main/java/org/teachingextensions/logo/Puzzle.java b/src/main/java/org/teachingextensions/logo/Puzzle.java index 77b11f9..85ba1a6 100644 --- a/src/main/java/org/teachingextensions/logo/Puzzle.java +++ b/src/main/java/org/teachingextensions/logo/Puzzle.java @@ -1,5 +1,6 @@ package org.teachingextensions.logo; +import java.awt.*; import java.util.Arrays; /** @@ -8,14 +9,50 @@ * @see Wikipedia */ public class Puzzle { - private static final int[] solution = {0, 1, 2, 3, 4, 5, 6, 7, 8}; - private static final int blank = 8; + private static final int blank = 8; private final int[] cells; public Puzzle(int[] cells) { this.cells = cells; } + /** + * Gives the position of the cell as it would appear on a 3x3 board. + * + * @param cell + * The cell to get the position for. + * @return The position of the cell. + */ + public static Point getPosition(int cell) { + return new Point(cell % 3, cell / 3); + } + + /** + * Calculate the Manhattan Distance between two positions. + * + * @param start + * The starting position. + * @param end + * The ending position. + * @return The distance between the two positions. + */ + public static int getDistance(Point start, Point end) { + return Math.abs(start.x - end.x) + Math.abs(start.y - end.y); + } + + /** + * Calculate the Manhattan Distance between two cells by first converting them to positions. + * + * @param start + * The starting cell + * @param end + * The ending cell + * @return The distance between the cells. + */ + public static int getDistance(int start, int end) { + return getDistance(getPosition(start), getPosition(end)); + } + @Override public int hashCode() { return Arrays.hashCode(cells); @@ -38,12 +75,7 @@ public String toString() { } public boolean isSolved() { - for (int i = 0; i < solution.length; i++) { - if (solution[i] != cells[i]) { - return false; - } - } - return true; + return getDistanceToGoal() == 0; } public int getBlankIndex() { @@ -69,4 +101,17 @@ public Puzzle swapBlank(int target) { copy[target] = 8; return new Puzzle(copy); } + + /** + * Calculate the distance between the goal by summing the distance between each cell and its goal. + * + * @return The distance to the goal. + */ + public int getDistanceToGoal() { + int distance = 0; + for (int i = 0; i < cells.length; i++) { + distance += getDistance(i, cells[i]); + } + return distance; + } } diff --git a/src/main/java/org/teachingextensions/logo/PuzzleState.java b/src/main/java/org/teachingextensions/logo/PuzzleState.java index dc8ee2c..9742c22 100644 --- a/src/main/java/org/teachingextensions/logo/PuzzleState.java +++ b/src/main/java/org/teachingextensions/logo/PuzzleState.java @@ -9,7 +9,7 @@ * Represents a node in the puzzle-solving graph. Keeps track of the current puzzle arrangement and the actions * required to arrive at the current arrangement from the starting arrangement. */ -public class PuzzleState implements Comparator , Comparable{ +public class PuzzleState implements Comparator, Comparable { private final Puzzle puzzle; private final Stack history; @@ -26,19 +26,6 @@ public boolean isSolution() { return puzzle.isSolved(); } - @Override - public String toString() { - StringBuilder b = new StringBuilder(); - if (!history.isEmpty()) { - b.append(history.peek()); - b.append(" to "); - } - - b.append(puzzle); - return b.toString(); - } - - public List getBranches() { List branches = new ArrayList<>(4); int blank = puzzle.getBlankIndex(); @@ -88,10 +75,15 @@ public int compare(PuzzleState o1, PuzzleState o2) { } @Override - public int compareTo( PuzzleState o) { + public int compareTo(PuzzleState o) { return compare(this, o); } + @Override + public int hashCode() { + return puzzle.hashCode(); + } + @Override public boolean equals(Object o) { if (this == o) return true; @@ -104,8 +96,19 @@ public boolean equals(Object o) { } @Override - public int hashCode() { - return puzzle.hashCode(); + public String toString() { + StringBuilder b = new StringBuilder(); + if (!history.isEmpty()) { + b.append(history.peek()); + b.append(" to "); + } + + b.append(puzzle); + return b.toString(); + } + + public int getEstimatedCost() { + return puzzle.getDistanceToGoal(); } public enum Direction { diff --git a/src/test/java/org/teachingextensions/logo/AStarPlayerTest.java b/src/test/java/org/teachingextensions/logo/AStarPlayerTest.java new file mode 100644 index 0000000..365f67b --- /dev/null +++ b/src/test/java/org/teachingextensions/logo/AStarPlayerTest.java @@ -0,0 +1,44 @@ +package org.teachingextensions.logo; + +import org.junit.Test; +import org.teachingextensions.approvals.lite.Approvals; +import org.teachingextensions.approvals.lite.reporters.UseReporter; +import org.teachingextensions.approvals.lite.reporters.macosx.BeyondCompareReporter; + +@UseReporter(BeyondCompareReporter.class) +public class AStarPlayerTest extends PuzzlePlayerTest { + + @Override + protected PuzzlePlayer getPlayer(Puzzle puzzle) { + return new AStarPlayer(puzzle); + } + + /** + * Produces a puzzle solution + */ + @Test + public void solve_puzzle() throws Exception { + verifySolution(); + } + + /** + * Solve longer puzzle + */ + @Test + public void solve_longer_puzzle() throws Exception { + verifyLongSolution(); + } + + /** + * Solve jumbo puzzle + */ + @Test + public void solve_jumbo_puzzle() throws Exception { + int[] cells = {8, 0, 1, 2, 3, 4, 5, 6, 7}; + Puzzle p = new Puzzle(cells); + PuzzlePlayer b = getPlayer(p); + + PuzzleState s = b.solve(); + Approvals.verifyAll("From " + p + " to " + s.getPuzzle(), s.getHistory()); + } +} diff --git a/src/test/java/org/teachingextensions/logo/AStarPlayerTest.solve_jumbo_puzzle.approved.txt b/src/test/java/org/teachingextensions/logo/AStarPlayerTest.solve_jumbo_puzzle.approved.txt new file mode 100644 index 0000000..19d9dd5 --- /dev/null +++ b/src/test/java/org/teachingextensions/logo/AStarPlayerTest.solve_jumbo_puzzle.approved.txt @@ -0,0 +1,25 @@ +From [8, 0, 1, 2, 3, 4, 5, 6, 7] to [0, 1, 2, 3, 4, 5, 6, 7, 8] + + +{Right = 1} +{Down = 3} +{Left = -1} +{Down = 3} +{Right = 1} +{Right = 1} +{Up = -3} +{Left = -1} +{Left = -1} +{Down = 3} +{Right = 1} +{Up = -3} +{Up = -3} +{Right = 1} +{Down = 3} +{Down = 3} +{Left = -1} +{Left = -1} +{Up = -3} +{Right = 1} +{Right = 1} +{Down = 3} diff --git a/src/test/java/org/teachingextensions/logo/AStarPlayerTest.solve_longer_puzzle.approved.txt b/src/test/java/org/teachingextensions/logo/AStarPlayerTest.solve_longer_puzzle.approved.txt new file mode 100644 index 0000000..fb4b824 --- /dev/null +++ b/src/test/java/org/teachingextensions/logo/AStarPlayerTest.solve_longer_puzzle.approved.txt @@ -0,0 +1,16 @@ +From [0, 1, 2, 3, 4, 8, 5, 6, 7] to [0, 1, 2, 3, 4, 5, 6, 7, 8] + + +{Down = 3} +{Left = -1} +{Left = -1} +{Up = -3} +{Right = 1} +{Down = 3} +{Right = 1} +{Up = -3} +{Left = -1} +{Left = -1} +{Down = 3} +{Right = 1} +{Right = 1} diff --git a/src/test/java/org/teachingextensions/logo/AStarPlayerTest.solve_puzzle.approved.txt b/src/test/java/org/teachingextensions/logo/AStarPlayerTest.solve_puzzle.approved.txt new file mode 100644 index 0000000..a560eb2 --- /dev/null +++ b/src/test/java/org/teachingextensions/logo/AStarPlayerTest.solve_puzzle.approved.txt @@ -0,0 +1,4 @@ +Solve [0, 1, 2, 3, 4, 5, 6, 8, 7] + + +{Right = 1} diff --git a/src/main/java/org/teachingextensions/logo/PuzzlePlayerTest.java b/src/test/java/org/teachingextensions/logo/PuzzlePlayerTest.java similarity index 100% rename from src/main/java/org/teachingextensions/logo/PuzzlePlayerTest.java rename to src/test/java/org/teachingextensions/logo/PuzzlePlayerTest.java diff --git a/src/test/java/org/teachingextensions/logo/PuzzleStateTest.java b/src/test/java/org/teachingextensions/logo/PuzzleStateTest.java index 8c2f28f..98a3eda 100644 --- a/src/test/java/org/teachingextensions/logo/PuzzleStateTest.java +++ b/src/test/java/org/teachingextensions/logo/PuzzleStateTest.java @@ -108,6 +108,26 @@ public void not_equal_to_state_with_different_puzzle() { assertNotEquals(a, b); } + /** + * The estimated cost is zero when puzzle is solved. + */ + @Test + public void estimated_cost_is_zero_when_solved() { + PuzzleState s = new PuzzleState(getSolvedPuzzle()); + assertEquals(0, s.getEstimatedCost()); + } + + /** + * The estimated cost is the distance to goal when the puzzle is not solved. + */ + @Test + public void estimated_cost_is_goal_distance_when_unsolved() { + Puzzle p = getPuzzle(7); + p = p.swapBlank(4); + PuzzleState s = new PuzzleState(p); + assertEquals(p.getDistanceToGoal(), s.getEstimatedCost()); + } + /** * Is equal to another state when the puzzles are the same */ diff --git a/src/test/java/org/teachingextensions/logo/PuzzleTest.get_coordinates_for_cell.approved.txt b/src/test/java/org/teachingextensions/logo/PuzzleTest.get_coordinates_for_cell.approved.txt new file mode 100644 index 0000000..f662eab --- /dev/null +++ b/src/test/java/org/teachingextensions/logo/PuzzleTest.get_coordinates_for_cell.approved.txt @@ -0,0 +1,7 @@ +Positions + + +java.awt.Point[x=0,y=0] +java.awt.Point[x=1,y=1] +java.awt.Point[x=2,y=2] +java.awt.Point[x=1,y=0] diff --git a/src/test/java/org/teachingextensions/logo/PuzzleTest.get_distances_between_cells.approved.txt b/src/test/java/org/teachingextensions/logo/PuzzleTest.get_distances_between_cells.approved.txt new file mode 100644 index 0000000..3fd4b7e --- /dev/null +++ b/src/test/java/org/teachingextensions/logo/PuzzleTest.get_distances_between_cells.approved.txt @@ -0,0 +1,7 @@ +Distances + + +2 +4 +1 +3 diff --git a/src/test/java/org/teachingextensions/logo/PuzzleTest.get_distances_between_positions.approved.txt b/src/test/java/org/teachingextensions/logo/PuzzleTest.get_distances_between_positions.approved.txt new file mode 100644 index 0000000..3fd4b7e --- /dev/null +++ b/src/test/java/org/teachingextensions/logo/PuzzleTest.get_distances_between_positions.approved.txt @@ -0,0 +1,7 @@ +Distances + + +2 +4 +1 +3 diff --git a/src/test/java/org/teachingextensions/logo/PuzzleTest.java b/src/test/java/org/teachingextensions/logo/PuzzleTest.java index b7cf8bf..392947b 100644 --- a/src/test/java/org/teachingextensions/logo/PuzzleTest.java +++ b/src/test/java/org/teachingextensions/logo/PuzzleTest.java @@ -1,11 +1,17 @@ package org.teachingextensions.logo; import org.junit.Test; +import org.teachingextensions.approvals.lite.Approvals; +import org.teachingextensions.approvals.lite.reporters.UseReporter; +import org.teachingextensions.approvals.lite.reporters.macosx.BeyondCompareReporter; +import java.awt.*; +import java.util.ArrayList; import java.util.Arrays; import static org.junit.Assert.*; +@UseReporter(BeyondCompareReporter.class) public class PuzzleTest { private static int[] getSolution() { return new int[]{0, 1, 2, 3, 4, 5, 6, 7, 8}; @@ -99,4 +105,68 @@ public void same_cells_means_same_puzzle() { assertEquals(a, b); } + /** + * Puzzle can tell you the game coordinates of a cell + */ + @Test + public void get_coordinates_for_cell() throws Exception { + ArrayList positions = new ArrayList<>(); + positions.add(Puzzle.getPosition(0)); + positions.add(Puzzle.getPosition(4)); + positions.add(Puzzle.getPosition(8)); + positions.add(Puzzle.getPosition(1)); + Approvals.verifyAll("Positions", positions); + } + + /** + * Puzzle can tell you the distance between two coordinates + */ + @Test + public void get_distances_between_positions() { + Point[] positions = new Point[4]; + positions[0] = Puzzle.getPosition(0); + positions[1] = Puzzle.getPosition(4); + positions[2] = Puzzle.getPosition(8); + positions[3] = Puzzle.getPosition(1); + ArrayList distances = new ArrayList<>(); + distances.add(Puzzle.getDistance(positions[0], positions[1])); + distances.add(Puzzle.getDistance(positions[0], positions[2])); + distances.add(Puzzle.getDistance(positions[1], positions[3])); + distances.add(Puzzle.getDistance(positions[3], positions[2])); + Approvals.verifyAll("Distances", distances); + } + + /** + * Puzzle can automatically convert cells to positions for you + */ + @Test + public void get_distances_between_cells() { + ArrayList distances = new ArrayList<>(); + distances.add(Puzzle.getDistance(0, 4)); + distances.add(Puzzle.getDistance(0, 8)); + distances.add(Puzzle.getDistance(4, 1)); + distances.add(Puzzle.getDistance(1, 8)); + Approvals.verifyAll("Distances", distances); + } + + /** + * Solved puzzle is at the goal. + */ + @Test + public void distance_to_solution_is_zero_when_solved() { + Puzzle p = new Puzzle(getSolution()); + assertEquals(0, p.getDistanceToGoal()); + } + + /** + * Unsolved puzzle is the sum of the distances for each cell + */ + @Test + public void sum_of_cell_distances_is_distance_to_goal() { + int[] cells = swap(getSolution(), 7, 8); + cells = swap(cells, 8, 5); + Puzzle p = new Puzzle(cells); + assertEquals(4, p.getDistanceToGoal()); + } + } From a6ce01aa67a0d894b6d5a547d5fa323f26bd89b8 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Sun, 22 Mar 2015 20:38:08 -0700 Subject: [PATCH 100/111] Working Puzzle --- .gitignore | 1 + .../approvals/lite/Approvals.java | 7 + .../org/teachingextensions/logo/Puzzle.java | 4 + .../logo/PuzzleAnimation.java | 64 +++++ .../teachingextensions/logo/PuzzleBoard.java | 100 +++++++ .../teachingextensions/logo/PuzzlePlayer.java | 3 + .../logo}/PuzzleWindow.java | 12 +- .../org/teachingextensions/logo/Tile.java | 67 +++++ .../org/teachingextensions/logo/TileMove.java | 23 ++ .../logo/utils/TortoiseUtils.java | 45 ++- .../windows/ProgramWindow.java | 102 ++++--- .../section08tdd/PuzzleBoard.java | 258 ------------------ .../section08tdd/PuzzleSolver.java | 173 +----------- .../section08tdd/SimplePuzzle.java | 44 ++- .../section08tdd/Tile.java | 121 -------- .../section08tdd/TileMove.java | 21 -- .../logo/PuzzleBoardTest.java | 32 +++ ...BoardTest.show_initial_puzzle.approved.png | Bin 0 -> 105949 bytes ...oardTest.show_provided_puzzle.approved.png | Bin 0 -> 105874 bytes .../logo/tests/PuzzleBoardTest.java | 100 ------- .../logo/tests/PuzzleSolverTest.java | 144 ---------- .../logo/tests/TileTest.java | 19 -- .../logo/tests/TurtleUtils.java | 6 +- 23 files changed, 419 insertions(+), 927 deletions(-) create mode 100644 src/main/java/org/teachingextensions/logo/PuzzleAnimation.java create mode 100644 src/main/java/org/teachingextensions/logo/PuzzleBoard.java rename src/main/java/org/{teachingkidsprogramming/section08tdd => teachingextensions/logo}/PuzzleWindow.java (57%) create mode 100644 src/main/java/org/teachingextensions/logo/Tile.java create mode 100644 src/main/java/org/teachingextensions/logo/TileMove.java delete mode 100644 src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleBoard.java delete mode 100644 src/main/java/org/teachingkidsprogramming/section08tdd/Tile.java delete mode 100644 src/main/java/org/teachingkidsprogramming/section08tdd/TileMove.java create mode 100644 src/test/java/org/teachingextensions/logo/PuzzleBoardTest.java create mode 100644 src/test/java/org/teachingextensions/logo/PuzzleBoardTest.show_initial_puzzle.approved.png create mode 100644 src/test/java/org/teachingextensions/logo/PuzzleBoardTest.show_provided_puzzle.approved.png delete mode 100644 src/test/java/org/teachingextensions/logo/tests/PuzzleBoardTest.java delete mode 100644 src/test/java/org/teachingextensions/logo/tests/PuzzleSolverTest.java delete mode 100644 src/test/java/org/teachingextensions/logo/tests/TileTest.java diff --git a/.gitignore b/.gitignore index c95ef18..dfaed2e 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,4 @@ settings.xml TeachingKidsProgramming.Source.Java.iml *.orig +*.received.* \ No newline at end of file diff --git a/src/main/java/org/teachingextensions/approvals/lite/Approvals.java b/src/main/java/org/teachingextensions/approvals/lite/Approvals.java index aa47e78..cc2427a 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/Approvals.java +++ b/src/main/java/org/teachingextensions/approvals/lite/Approvals.java @@ -8,8 +8,10 @@ import org.teachingextensions.approvals.lite.util.StringUtils; import org.teachingextensions.approvals.lite.util.lambda.Function1; import org.teachingextensions.approvals.lite.writers.ApprovalTextWriter; +import org.teachingextensions.approvals.lite.writers.ComponentApprovalWriter; import org.teachingextensions.approvals.lite.writers.ImageApprovalWriter; +import java.awt.*; import java.awt.image.BufferedImage; import java.util.Arrays; @@ -51,6 +53,11 @@ public static void verifyHtml(String response) throws Exception { verify(new ApprovalTextWriter(response, "html"), FileTypes.Html); } + public static void verify(Component component) { + BufferedImage image = ComponentApprovalWriter.drawComponent(component); + Approvals.verify(image); + } + public static void verify(BufferedImage bufferedImage) { verify(new ImageApprovalWriter(bufferedImage), FileTypes.Image); } diff --git a/src/main/java/org/teachingextensions/logo/Puzzle.java b/src/main/java/org/teachingextensions/logo/Puzzle.java index 85ba1a6..0f77795 100644 --- a/src/main/java/org/teachingextensions/logo/Puzzle.java +++ b/src/main/java/org/teachingextensions/logo/Puzzle.java @@ -114,4 +114,8 @@ public int getDistanceToGoal() { } return distance; } + + public int[] getCells() { + return Arrays.copyOf(cells, cells.length); + } } diff --git a/src/main/java/org/teachingextensions/logo/PuzzleAnimation.java b/src/main/java/org/teachingextensions/logo/PuzzleAnimation.java new file mode 100644 index 0000000..083303a --- /dev/null +++ b/src/main/java/org/teachingextensions/logo/PuzzleAnimation.java @@ -0,0 +1,64 @@ +package org.teachingextensions.logo; + +import javax.swing.*; + +/** + * Animates a puzzle from its initial state to its solution. + */ +public class PuzzleAnimation implements Runnable { + private final PuzzleBoard board; + + public PuzzleAnimation(PuzzleBoard board) { + this.board = board; + } + + private static void update(PuzzleBoard board) { + boolean done = animate(board); + if(!done){ + return; + } + + moveNextTile(board); + } + + private static void moveNextTile(PuzzleBoard board) { + if (board.hasMoves()){ + TileMove move = board.getNextMove(); + board.swap(move.getStart(), move.getEnd()); + } + } + + private static boolean animate(PuzzleBoard board) { + Tile[] tiles = board.getTiles(); + for (Tile tile : tiles){ + if(tile != null && !tile.isAtTarget()){ + tile.step(); + return false; + } + } + + return true; + } + + @Override + public void run() { + while (board.isVisible()) { + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + board.repaint(); + } + }); + + update(board); + + try { + Thread.sleep(10); + } catch (InterruptedException ignored) { + } + + } + } + + +} diff --git a/src/main/java/org/teachingextensions/logo/PuzzleBoard.java b/src/main/java/org/teachingextensions/logo/PuzzleBoard.java new file mode 100644 index 0000000..5f054de --- /dev/null +++ b/src/main/java/org/teachingextensions/logo/PuzzleBoard.java @@ -0,0 +1,100 @@ +package org.teachingextensions.logo; + +import javax.swing.*; +import java.awt.*; +import java.util.ArrayDeque; +import java.util.Arrays; +import java.util.Queue; + +/** + * Draws and animates a 9-puzzle + */ +public class PuzzleBoard extends JPanel { + private final static int blank = 8; + private final Tile[] tiles; + private final Queue solution; + + public PuzzleBoard(Puzzle puzzle, PuzzleState solution) { + super(); + this.solution = createSolution(solution, puzzle); + this.tiles = createTiles(puzzle.getCells()); + } + + private static Queue createSolution(PuzzleState solution, Puzzle puzzle) { + if (solution == null) { + return new ArrayDeque<>(); + } + + int i = puzzle.getBlankIndex(); + Queue moves = new ArrayDeque<>(); + for (PuzzleState.Direction d : solution.getHistory()) { + int m = d.getValue(); + TileMove move = new TileMove(i + m, i); + moves.add(move); + i = move.getStart(); + } + return moves; + } + + private static Tile[] createTiles(int[] cells) { + Tile[] t = new Tile[9]; + for (int i = 0; i < 9; i++) { + if (cells[i] == blank) { + continue; + } + + t[i] = new Tile(i, cells[i]); + } + return t; + } + + private static void drawBorder(Graphics g) { + g.setColor(PenColors.Blues.DarkBlue); + g.fillRect(20, 20, 410, 410); + } + + private static void drawField(Graphics g) { + g.setColor(PenColors.Blues.SkyBlue); + g.fillRect(30, 30, 386, 386); + } + + private static void drawTiles(Graphics g, Tile[] tiles) { + Graphics2D g2d = (Graphics2D) g.create(); + for (Tile tile : tiles) { + if (tile == null) { + continue; + } + tile.paint(g2d); + } + g2d.dispose(); + } + + @Override + protected void paintComponent(Graphics g) { + super.paintComponent(g); + drawBorder(g); + drawField(g); + drawTiles(g, tiles); + } + + public Tile[] getTiles() { + return Arrays.copyOf(tiles, tiles.length); + } + + public boolean hasMoves() { + return !solution.isEmpty(); + } + + public TileMove getNextMove() { + return solution.isEmpty() ? null : solution.remove(); + } + + public void swap(int start, int end) { + Point p = Tile.getPosition(end); + Tile tile = tiles[start]; + tile.moveTo(p); + tiles[start] = null; + tiles[end] = tile; + + } +} diff --git a/src/main/java/org/teachingextensions/logo/PuzzlePlayer.java b/src/main/java/org/teachingextensions/logo/PuzzlePlayer.java index cb9750a..3911f51 100644 --- a/src/main/java/org/teachingextensions/logo/PuzzlePlayer.java +++ b/src/main/java/org/teachingextensions/logo/PuzzlePlayer.java @@ -36,6 +36,9 @@ public PuzzleState solve() { getVisited().add(state); if (!state.isSolution()) { this.search(state); + if (getFrontier().isEmpty()){ + throw new IllegalStateException("Cannot solve puzzle."); + } state = getFrontier().remove(); } } while (!state.isSolution()); diff --git a/src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleWindow.java b/src/main/java/org/teachingextensions/logo/PuzzleWindow.java similarity index 57% rename from src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleWindow.java rename to src/main/java/org/teachingextensions/logo/PuzzleWindow.java index 55b8a59..79b0461 100644 --- a/src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleWindow.java +++ b/src/main/java/org/teachingextensions/logo/PuzzleWindow.java @@ -1,14 +1,20 @@ -package org.teachingkidsprogramming.section08tdd; +package org.teachingextensions.logo; import org.teachingextensions.windows.ProgramWindow; import java.awt.*; +/** + * A program window for a 9-puzzle + */ public class PuzzleWindow extends ProgramWindow { public PuzzleWindow() { super("Puzzle"); this.setLayout(new BorderLayout()); } - private static final long serialVersionUID = -1526978082665818880L; -} \ No newline at end of file + public PuzzleWindow(PuzzleBoard board) { + this(); + this.add(board); + } +} diff --git a/src/main/java/org/teachingextensions/logo/Tile.java b/src/main/java/org/teachingextensions/logo/Tile.java new file mode 100644 index 0000000..38dc991 --- /dev/null +++ b/src/main/java/org/teachingextensions/logo/Tile.java @@ -0,0 +1,67 @@ +package org.teachingextensions.logo; + +import org.teachingextensions.approvals.lite.util.ObjectUtils; + +import java.awt.*; + +/** + * A tile is a square on the board with an image on it. + */ +public class Tile { + private static final String[] resources = { + "Batgirl1a.png", "Batgirl2a.png", "Batgirl3a.png", + "Batgirl1b.png", "Batgirl2b.png", "Batgirl3b.png", + "Batgirl1c.png", "Batgirl2c.png", "Batgirl3c.png" + }; + + private static final Point origin = new Point(35, 35); + + private final Image image; + private final Dimension dimension = new Dimension(122, 122); + private Point position; + private Point target; + + public Tile(int cell, int image) { + this.position = getPosition(cell); + this.image = getImage(image); + } + + public static Point getPosition(int cell) { + Point offset = Puzzle.getPosition(cell); + return new Point(origin.x + (127 * offset.x), origin.y + (127 * offset.y)); + } + + private static Image getImage(int image) { + return ObjectUtils.loadImage(Tile.class, resources[image]); + } + + private static int stepTowardGoal(int current, int goal) { + if (current < goal) { + return current + 1; + } + if (goal < current) { + return current - 1; + } + return current; + } + + public void paint(Graphics2D g2d) { + g2d.drawImage(this.image, this.position.x, this.position.y, this.dimension.width, this.dimension.height, + null); + } + + public boolean isAtTarget() { + return target == null || + (target.x == position.x && target.y == position.y); + } + + public void step() { + int x = stepTowardGoal(position.x, target.x); + int y = stepTowardGoal(position.y, target.y); + this.position = new Point(x, y); + } + + public void moveTo(Point goal) { + target = goal; + } +} diff --git a/src/main/java/org/teachingextensions/logo/TileMove.java b/src/main/java/org/teachingextensions/logo/TileMove.java new file mode 100644 index 0000000..a1d3758 --- /dev/null +++ b/src/main/java/org/teachingextensions/logo/TileMove.java @@ -0,0 +1,23 @@ +package org.teachingextensions.logo; + +/** + * Describes a tile swap. + */ +public class TileMove { + private final int start; + private final int end; + + public TileMove(int start, int end) { + + this.start = start; + this.end = end; + } + + public int getStart() { + return start; + } + + public int getEnd() { + return end; + } +} diff --git a/src/main/java/org/teachingextensions/logo/utils/TortoiseUtils.java b/src/main/java/org/teachingextensions/logo/utils/TortoiseUtils.java index 2eef2e6..a04775e 100644 --- a/src/main/java/org/teachingextensions/logo/utils/TortoiseUtils.java +++ b/src/main/java/org/teachingextensions/logo/utils/TortoiseUtils.java @@ -2,56 +2,49 @@ import org.teachingextensions.approvals.lite.Approvals; import org.teachingextensions.approvals.lite.namer.ApprovalResults; -import org.teachingextensions.logo.Turtle; - import org.teachingextensions.approvals.lite.util.ObjectUtils; +import org.teachingextensions.logo.Turtle; -public class TortoiseUtils -{ +public class TortoiseUtils { private static Turtle TURTLE = new Turtle(); + /** * Captures an image of the result of your program and displays it to you */ - public static void verify() - { - try - { + public static void verify() { + try { Approvals.verify(TURTLE.getImage()); - } - catch (Exception e) - { + } catch (Exception e) { throw ObjectUtils.throwAsError(e); - } - finally - { + } finally { TortoiseUtils.resetTurtle(); } } - public static void resetTurtle() - { + + public static void resetTurtle() { TURTLE = new Turtle(); } - public static void setOrientation(int x, int y, int angle) - { + + public static void setOrientation(int x, int y, int angle) { TURTLE.setX(x); TURTLE.setY(y); TURTLE.setAngleInDegrees(angle); } - public static Turtle getTurtle() - { + + public static Turtle getTurtle() { return TURTLE; } - public static void setTurtle(Turtle turtle) - { + + public static void setTurtle(Turtle turtle) { TortoiseUtils.TURTLE = turtle; } - public static void verifyForOs() - { + + public static void verifyForOs() { ApprovalResults.UniqueForOs(); verify(); } - public static void writeMessage(String string, int x, int y) - { + + public static void writeMessage(String string, int x, int y) { TURTLE.setX(x); TURTLE.setY(y); TURTLE.print(string); diff --git a/src/main/java/org/teachingextensions/windows/ProgramWindow.java b/src/main/java/org/teachingextensions/windows/ProgramWindow.java index dff657e..1335f8d 100644 --- a/src/main/java/org/teachingextensions/windows/ProgramWindow.java +++ b/src/main/java/org/teachingextensions/windows/ProgramWindow.java @@ -1,78 +1,72 @@ package org.teachingextensions.windows; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.util.ArrayList; - -import javax.swing.JFrame; -import javax.swing.JPanel; - +import org.teachingextensions.approvals.lite.util.FrameCloser; +import org.teachingextensions.approvals.lite.util.WindowUtils; import org.teachingextensions.logo.ImageBackground; import org.teachingextensions.logo.Paintable; import org.teachingextensions.logo.PenColors; import org.teachingextensions.logo.VirtualProctorWeb; -import org.teachingextensions.approvals.lite.util.FrameCloser; -import org.teachingextensions.approvals.lite.util.WindowUtils; +import javax.swing.*; +import java.awt.*; +import java.util.ArrayList; /** * A window image Program Window * allows you to change the color of the background and more... */ -@SuppressWarnings({ "serial" }) +@SuppressWarnings({"serial"}) public class ProgramWindow extends JPanel { - public ArrayList additional = new ArrayList(); + public ArrayList additional = new ArrayList<>(); - public ProgramWindow(String title) { - this(); - JFrame frame = new JFrame(title); - frame.getContentPane().add(this); - ProgramWindow.createStandardFrame(frame); - } + public ProgramWindow(String title) { + this(); + JFrame frame = new JFrame(title); + frame.getContentPane().add(this); + ProgramWindow.createStandardFrame(frame); + } - public ProgramWindow() { - setPreferredSize(new Dimension(627, 442)); - setColor(PenColors.Whites.White); - } + public ProgramWindow() { + setPreferredSize(new Dimension(627, 442)); + setColor(PenColors.Whites.White); + } - public static void createStandardFrame(JFrame frame) { - WindowUtils - .testFrame(frame, new VirtualProctorWeb(), new FrameCloser()); - } + public static void createStandardFrame(JFrame frame) { + WindowUtils + .testFrame(frame, new VirtualProctorWeb(), new FrameCloser()); + } - @Override - public void paint(Graphics g) { - super.paint(g); - for (Paintable p : additional) { - p.paint((Graphics2D) g, this); - } - } + @Override + public void paint(Graphics g) { + super.paint(g); + for (Paintable p : additional) { + p.paint((Graphics2D) g, this); + } + } - public void setColor(Color backgroundColor) { - setBackground(backgroundColor); - } + public void setColor(Color backgroundColor) { + setBackground(backgroundColor); + } - public void addPaintable(Paintable additional) { - this.additional.add(additional); - repaint(); - } + public void addPaintable(Paintable additional) { + this.additional.add(additional); + repaint(); + } - public void removePaintable() { - additional.clear(); - repaint(); - } + public void removePaintable() { + additional.clear(); + repaint(); + } - public void addMouseRightClickListener(MouseRightClickListener listener) { - addMouseListener(new RightClickMouseAdapter(listener)); - } + public void addMouseRightClickListener(MouseRightClickListener listener) { + addMouseListener(new RightClickMouseAdapter(listener)); + } - public void addMouseLeftClickListener(MouseLeftClickListener listener) { - addMouseListener(new LeftClickMouseAdapter(listener)); - } + public void addMouseLeftClickListener(MouseLeftClickListener listener) { + addMouseListener(new LeftClickMouseAdapter(listener)); + } - public void setBackgroundImage(String url) { - addPaintable(new ImageBackground(url)); - } + public void setBackgroundImage(String url) { + addPaintable(new ImageBackground(url)); + } } diff --git a/src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleBoard.java b/src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleBoard.java deleted file mode 100644 index 4d51474..0000000 --- a/src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleBoard.java +++ /dev/null @@ -1,258 +0,0 @@ -package org.teachingkidsprogramming.section08tdd; - -import org.teachingextensions.approvals.lite.util.ObjectUtils; -import org.teachingextensions.logo.PenColors; - -import javax.swing.*; -import java.awt.*; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -public class PuzzleBoard extends JPanel { - private static final String completed = "Batgirl.png"; - private static final long serialVersionUID = -3592444274530147326L; - private final List tiles; - private final Point[] positions; - private final List history; - private boolean done; - - public PuzzleBoard() { - this.positions = createPositions(); - this.tiles = createTiles(shuffled(this.positions)); - this.history = new ArrayList<>(); - } - - public PuzzleBoard(Point[] positions, List tiles) { - this(positions, tiles, new ArrayList()); - } - - public PuzzleBoard(PuzzleBoard puzzle) { - this(puzzle.positions, puzzle.tiles, puzzle.history); - } - - public PuzzleBoard(Point[] positions, List tiles, List history) { - this.positions = new Point[positions.length]; - for (int i = 0; i < positions.length; i++) { - this.positions[i] = new Point(positions[i]); - } - - this.tiles = new ArrayList<>(tiles.size()); - for (int i = 0; i < tiles.size(); i++) { - Tile t = tiles.get(i); - this.tiles.add(i, new Tile(t)); - } - - if (history == null) history = new ArrayList<>(); - - this.history = new ArrayList<>(history.size()); - for (int i = 0; i < history.size(); i++) { - PuzzleBoard b = history.get(i); - this.history.add(i, new PuzzleBoard(b)); - } - } - - public static List shuffled(Point[] positions) { - List s = new ArrayList<>(Arrays.asList(positions)); - Collections.shuffle(s); - return s; - } - - public static Point[] createPositions() { - Point[] p = new Point[9]; - Point point; - for (int i = 0; i < 9; i++) { - if (i < 3) { - point = new Point(35, 35 + (127 * i)); - } else if (i < 6) { - point = new Point(162, 35 + (127 * (i - 3))); - } else { - point = new Point(289, 35 + (127 * (i - 6))); - } - p[i] = point; - } - return p; - } - - public static List createTiles(List positions) { - ArrayList t = new ArrayList<>(9); - for (int i = 0; i < 8; i++) { - t.add(new Tile(i, positions.get(i))); - } - return t; - } - - public static List createTiles(Point[] positions) { - return createTiles(Arrays.asList(positions)); - } - - @Override - protected void paintComponent(Graphics g) { - super.paintComponent(g); - drawBorder(g); - drawField(g); - if (!this.done) { - drawTiles(g); - } else { - drawReward(g); - } - } - - private void drawReward(Graphics g) { - Image image = ObjectUtils.loadImage(this.getClass(), completed); - Graphics2D g2d = (Graphics2D) g.create(); - g2d.drawImage(image, this.positions[0].x, this.positions[0].y, 376, - 376, null); - g2d.dispose(); - } - - private void drawTiles(Graphics g) { - Graphics2D g2d = (Graphics2D) g.create(); - for (Tile tile : tiles) { - tile.paint(g2d); - } - g2d.dispose(); - } - - private void drawField(Graphics g) { - g.setColor(PenColors.Blues.SkyBlue); - g.fillRect(30, 30, 386, 386); - } - - private void drawBorder(Graphics g) { - g.setColor(PenColors.Blues.DarkBlue); - g.fillRect(20, 20, 410, 410); - } - - public Tile getPiece(int i) { - return this.tiles.get(i); - } - - public List getPositions() { - return Arrays.asList(positions); - } - - public boolean isSorted() { - return countMisplaced() == 0; - } - - private int countMisplaced() { - int misplaced = 0; - for (int i = 0; i < 8; i++) { - Tile tile = this.tiles.get(i); - Point point = this.positions[i]; - if (!tile.isAt(point)) { - misplaced++; - } - } - return misplaced; - } - - public void finish() { - this.done = true; - } - - public List getTiles() { - return new ArrayList<>(this.tiles); - } - - /** - * A move is valid if the target is the board's blank square - * - * @param move - * the move to check - * @return true if the move is valid - */ - public boolean isValidMove(TileMove move) { - Point blank = findBlank(); - return blank == this.positions[move.getTarget()]; - } - - private Point findBlank() { - for (Point point : positions) { - if (!anyTileIsAt(point)) { - return point; - } - } - - return null; - } - - private boolean anyTileIsAt(Point point) { - for (Tile tile : tiles) { - if (tile.isAt(point)) { - return true; - } - } - - return false; - } - - /** - * Create a copy of the board then use the provided move to update it - * - * @param move - * the move to perform on the puzzle copy - * @return The updated copy of the board - */ - public PuzzleBoard useMove(TileMove move) { - PuzzleBoard c = new PuzzleBoard(this); - - Tile s = c.getPieceFromPosition(move.getSource()); - s.moveTo(c.positions[move.getTarget()]); - s.teleport(); - c.history.add(new PuzzleBoard(this)); - - return c; - } - - @Override - public boolean equals(Object o) { - if (this == o) - return true; - if (o == null || getClass() != o.getClass()) - return false; - - PuzzleBoard that = (PuzzleBoard) o; - - return this.toString().equals(that.toString()); - - } - - @Override - public int hashCode() { - return tiles.hashCode(); - } - - public Tile getPieceFromPosition(int source) { - Point position = this.positions[source]; - for (Tile tile : this.tiles) { - if (tile.isAt(position)) { - return tile; - } - } - - return null; - } - - public List getHistory() { - return new ArrayList<>(this.history); - } - - @Override - public String toString() { - StringBuilder builder = new StringBuilder(); - builder.append("[ "); - for(Tile t : this.tiles){ - builder.append(t.toString()).append(", "); - } - builder.append("]"); - - return builder.toString(); - } - - public boolean isVisited() { - return this.history.contains(this); - } -} diff --git a/src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleSolver.java b/src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleSolver.java index 4ea5dee..e7d6223 100644 --- a/src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleSolver.java +++ b/src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleSolver.java @@ -1,181 +1,16 @@ package org.teachingkidsprogramming.section08tdd; -import javax.swing.*; -import java.awt.*; -import java.util.ArrayList; -import java.util.List; +import org.teachingextensions.logo.PuzzleBoard; +/** + * Solves the puzzle using a player, then animates the solution. + */ public class PuzzleSolver implements Runnable { - private final PuzzleBoard board; - public PuzzleSolver(PuzzleBoard board) { - this.board = board; } @Override public void run() { - final PuzzleBoard b = this.board; - - while (b.isVisible()) { - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - b.repaint(); - } - }); - - update(b); - - try { - Thread.sleep(10); - } catch (InterruptedException ignored) { - } - } - } - - private void update(final PuzzleBoard puzzle) { - - boolean done = animate(puzzle); - if (!done) { - return; - } - - if (puzzle.isSorted()) { - puzzle.finish(); - return; - } - - solve(puzzle); - } - - private void solve(PuzzleBoard puzzle) { - - int minimumCost = Integer.MAX_VALUE; - TileMove min = null; - // create a list of all moves that are possible - List moves = createMoves(); - for (TileMove tileMove : moves) { - // discard if the move is invalid from this state - if (!puzzle.isValidMove(tileMove)) { - continue; - } - - // otherwise apply the move to generate a new board - PuzzleBoard next = puzzle.useMove(tileMove); - - // see if we have visited this board before: - if (next.isVisited()){ - continue; - } - - // estimate the cost to reach the goal by going through the new board - int estimate = estimateCost(next); - - // if the cost is the smallest we've seen so far - if (estimate < minimumCost) { - // remember the move and the cost - minimumCost = estimate; - min = tileMove; - } - - } - - // execute the remembered move: - // tell the piece to move to the target - if (min != null) { - Point target = puzzle.getPositions().get(min.getTarget()); - Tile piece = puzzle.getPieceFromPosition(min.getSource()); - if (!piece.isMovingTo(target)) { - piece.moveTo(target); - } - } - } - - // 0: can move down (to #3) or right (to #1) - // 1: can move left (to #0), down (to #4), or right (to #2) - // 2: can move left (to #1) or down (to #5) - // 3: can move up (to #0), right (to #4), or down (to #6) - // 4: can move up (to #1), right (to #5), down (to #7) or left (to #3) - // 5: can move up (to #2), down (to #8), or left (to #4) - // 6: can move up (to #3) or right (to #7) - // 7: can move up (to #4), right (to #8) or left (to #6) - // 8: can move up (to #5) or left (to #7) - private List createMoves() { - List moves = new ArrayList<>(); - moves.add(new TileMove(0, 3)); - moves.add(new TileMove(0, 1)); - moves.add(new TileMove(1, 0)); - moves.add(new TileMove(1, 4)); - moves.add(new TileMove(1, 2)); - moves.add(new TileMove(2, 1)); - moves.add(new TileMove(2, 5)); - moves.add(new TileMove(3, 0)); - moves.add(new TileMove(3, 4)); - moves.add(new TileMove(3, 6)); - moves.add(new TileMove(4, 1)); - moves.add(new TileMove(4, 5)); - moves.add(new TileMove(4, 7)); - moves.add(new TileMove(4, 3)); - moves.add(new TileMove(5, 2)); - moves.add(new TileMove(5, 8)); - moves.add(new TileMove(5, 4)); - moves.add(new TileMove(6, 3)); - moves.add(new TileMove(6, 7)); - moves.add(new TileMove(7, 4)); - moves.add(new TileMove(7, 8)); - moves.add(new TileMove(7, 6)); - moves.add(new TileMove(8, 5)); - moves.add(new TileMove(8, 7)); - return moves; - } - - private boolean animate(PuzzleBoard puzzle) { - List tiles = puzzle.getTiles(); - for (Tile tile : tiles) { - if (!tile.isAtTarget()) { - tile.step(); - return false; - } - } - return true; - } - - @SuppressWarnings("UnusedDeclaration") - private static void animationDemo(final PuzzleBoard puzzle) { - Point target = puzzle.getPositions().get(8); - Tile piece = puzzle.getPiece(7); - if (!piece.isMovingTo(target)) { - piece.moveTo(target); - } - if (!piece.isAt(target)) { - piece.step(); - } - } - - public static int distance(Point start, Point end) { - return Math.abs(start.x - end.x) + Math.abs(start.y - end.y); - } - - public static int estimateRemainingMoves(PuzzleBoard start) { - int result = 0; - for (Tile tile : start.getTiles()) { - int goalIndex = tile.getCorrectPositionIndex(); - Point goal = start.getPositions().get(goalIndex); - Point position = tile.getPosition(); - result += distance(position, goal); - } - return result; - } - - public static int estimateCost(PuzzleBoard board) { - // The cost of this solving the puzzle using this is at least the number of moves it took to get to this - // board - int cost = board.getHistory().size(); - - // We estimate that the cost of solving the puzzle from here will be related to the number of moves needed - // to get the tiles into the right positions, so we add the estimate to the actual cost - cost += estimateRemainingMoves(board); - return cost; } } diff --git a/src/main/java/org/teachingkidsprogramming/section08tdd/SimplePuzzle.java b/src/main/java/org/teachingkidsprogramming/section08tdd/SimplePuzzle.java index 62785ae..63dd41d 100644 --- a/src/main/java/org/teachingkidsprogramming/section08tdd/SimplePuzzle.java +++ b/src/main/java/org/teachingkidsprogramming/section08tdd/SimplePuzzle.java @@ -1,29 +1,57 @@ package org.teachingkidsprogramming.section08tdd; +import org.teachingextensions.approvals.lite.util.MySystem; +import org.teachingextensions.logo.*; + import javax.swing.*; import java.awt.*; +import java.util.Arrays; +import java.util.Random; public class SimplePuzzle implements Runnable { public static void main(String[] args) { EventQueue.invokeLater(new SimplePuzzle()); } + private static int[] shuffled(int[] source) { + int[] copy = Arrays.copyOf(source, source.length); + Random rnd = new Random(); + for (int i = copy.length - 1; i > 0; i--) { + int index = rnd.nextInt(i + 1); + // Simple swap + int a = copy[index]; + copy[index] = copy[i]; + copy[i] = a; + } + return copy; + } + public void run() { this.setLookAndFeel(); - PuzzleBoard board = new PuzzleBoard(); - PuzzleWindow pw = new PuzzleWindow(); - pw.add(board); + +// int[] cells = {0, 1, 2, 3, 4, 5, 6, 7, 8}; +// int[] shuffled = shuffled(cells); + int[] shuffled = {5, 6, 2, 4, 1, 8, 7, 0, 3}; // known to be solvable + MySystem.message(Arrays.toString(shuffled)); + Puzzle puzzle = new Puzzle(shuffled); + PuzzlePlayer player = new AStarPlayer(puzzle); + PuzzleState solution = player.solve(); + + PuzzleBoard board = new PuzzleBoard(puzzle, solution); + PuzzleWindow pw = new PuzzleWindow(board); pw.setVisible(true); - new Thread(new PuzzleSolver(board)).start(); + new Thread(new PuzzleAnimation(board)).start(); } private void setLookAndFeel() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); - } catch (ClassNotFoundException ex) { - } catch (InstantiationException ex) { - } catch (IllegalAccessException ex) { - } catch (UnsupportedLookAndFeelException ex) { + } catch ( + ClassNotFoundException | + InstantiationException | + UnsupportedLookAndFeelException | + IllegalAccessException ignored + ) { } } } diff --git a/src/main/java/org/teachingkidsprogramming/section08tdd/Tile.java b/src/main/java/org/teachingkidsprogramming/section08tdd/Tile.java deleted file mode 100644 index 33f37cc..0000000 --- a/src/main/java/org/teachingkidsprogramming/section08tdd/Tile.java +++ /dev/null @@ -1,121 +0,0 @@ -package org.teachingkidsprogramming.section08tdd; - -import org.teachingextensions.approvals.lite.util.ObjectUtils; - -import java.awt.*; - -public class Tile { - private final static String[] resources = {"Batgirl1a.png", "Batgirl1b.png", - "Batgirl1c.png", "Batgirl2a.png", "Batgirl2b.png", "Batgirl2c.png", - "Batgirl3a.png", "Batgirl3b.png", "Batgirl3c.png"}; - - private final static int width = 122; - private final static int height = 122; - - private Image image; - private Point position; - private Point target; - private int correctPositionIndex; - - // TODO: point should be a current position index maybe? - public Tile(int correctPosition, Point position) { - this.correctPositionIndex = correctPosition; - this.position = new Point(position); - this.image = ObjectUtils.loadImage(this.getClass(), resources[correctPosition]); - } - - public Tile(Tile t) { - this(t.correctPositionIndex, new Point(t.position)); - } - - public void paint(Graphics2D g2d) { - g2d.drawImage(this.image, this.position.x, this.position.y, width, height, - null); - } - - public boolean isAt(Point point) { - return point == null - || (this.position.x == point.x && this.position.y == point.y); - } - - public void moveTo(Point target) { - this.target = new Point(target.x, target.y); - } - - public boolean isMovingTo(Point target) { - return this.target != null && this.target.x == target.x - && this.target.y == target.y; - } - - public void step() { - int size = 1; - - int x = stepHorizontal(size); - int y = stepVertical(size); - this.position = new Point(x, y); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - Tile tile = (Tile) o; - - return correctPositionIndex == tile.correctPositionIndex && position.equals(tile.position); - - } - - @Override - public int hashCode() { - int result = position.hashCode(); - result = 31 * result + correctPositionIndex; - return result; - } - - private int stepVertical(int size) { - if (this.position.y < this.target.y) { - return this.position.y + size; - } - if (this.target.y < this.position.y) { - return this.position.y - size; - } - return this.position.y; - - } - - private int stepHorizontal(int size) { - if (this.position.x < this.target.x) { - return this.position.x + size; - } - if (this.target.x < this.position.x) { - return this.position.x - size; - } - return this.position.x; - } - - public void teleport() { - - if (this.target != null && !this.isAt(this.target)) { - this.position = new Point(this.target.x, this.target.y); - } - - } - - public boolean isAtTarget() { - return this.isAt(this.target); - } - - public int getCorrectPositionIndex() { - return correctPositionIndex; - } - - public Point getPosition() { - return position; - } - - @Override - public String toString() { - return "{ " + this.position.x + ", " + this.position.y + " }"; - } -} diff --git a/src/main/java/org/teachingkidsprogramming/section08tdd/TileMove.java b/src/main/java/org/teachingkidsprogramming/section08tdd/TileMove.java deleted file mode 100644 index 0add2ad..0000000 --- a/src/main/java/org/teachingkidsprogramming/section08tdd/TileMove.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.teachingkidsprogramming.section08tdd; - -public class TileMove { - - private final int source; - private final int target; - - public TileMove(int source, int target) { - this.source = source; - this.target = target; - } - - public int getSource() { - return this.source; - } - - public int getTarget() { - return this.target; - } - -} diff --git a/src/test/java/org/teachingextensions/logo/PuzzleBoardTest.java b/src/test/java/org/teachingextensions/logo/PuzzleBoardTest.java new file mode 100644 index 0000000..4e14b0a --- /dev/null +++ b/src/test/java/org/teachingextensions/logo/PuzzleBoardTest.java @@ -0,0 +1,32 @@ +package org.teachingextensions.logo; + +import org.junit.Test; +import org.teachingextensions.approvals.lite.Approvals; +import org.teachingextensions.approvals.lite.reporters.FileLauncherReporter; +import org.teachingextensions.approvals.lite.reporters.UseReporter; + +@UseReporter(FileLauncherReporter.class) +public class PuzzleBoardTest { + /** + * A puzzle board shows the initial puzzle. + */ + @Test + public void show_initial_puzzle() throws Exception { + int[] cells = {0, 1, 2, 3, 4, 5, 6, 7, 8}; + PuzzleBoard board = new PuzzleBoard(new Puzzle(cells), null); + PuzzleWindow window = new PuzzleWindow(); + window.add(board); + Approvals.verify(window); + } + + /** + * A puzzle board shows the provided puzzle + */ + @Test + public void show_provided_puzzle() throws Exception { + int[] cells = {0, 1, 2, 3, 4, 5, 6, 8, 7}; + PuzzleBoard board = new PuzzleBoard(new Puzzle(cells), null); + PuzzleWindow window = new PuzzleWindow(board); + Approvals.verify(window); + } +} diff --git a/src/test/java/org/teachingextensions/logo/PuzzleBoardTest.show_initial_puzzle.approved.png b/src/test/java/org/teachingextensions/logo/PuzzleBoardTest.show_initial_puzzle.approved.png new file mode 100644 index 0000000000000000000000000000000000000000..bf8681fd2775babe65f8e923d61b02e919c2aad5 GIT binary patch literal 105949 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%0AI;B>z( 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 F?jKmt=WPH0 literal 0 HcmV?d00001 diff --git a/src/test/java/org/teachingextensions/logo/PuzzleBoardTest.show_provided_puzzle.approved.png b/src/test/java/org/teachingextensions/logo/PuzzleBoardTest.show_provided_puzzle.approved.png new file mode 100644 index 0000000000000000000000000000000000000000..c42980f7e3b069b6715e1399863cab4c7d4923b9 GIT binary patch literal 105874 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 &o_^y#Eidi& z%S%Pev*Ta;3vY+h(Opjkzj;Mx4)!SR9oz+$^Z4u_W_G%wm{qMkeU#0>(Q~p$n$Yh0 z5sy;^-B7}*Ior2b^4eCuyBN%DuQeEAii>t5y_kswi=kXDG-J=N$PPGs~ndavGNuNZ$LO+7+aZU zEg4Bg(Kik$RTndnVo^SOry$AuBNvv(fwL5#i$y`WJ6$LGmYWl@1t8fa=!C5`5qEU7 z#h$vEZ5GD9X;a$!RWFDKs}aO@OPeuY=|EQ~$YAeqqH!fOp%P(}mS_|I#@ zA#$7X<_-JGVA<&PpO06Z4L#Mpr_!86^sF2A*gLTFNB)ax zdUn|LIOE;jgzG~(X1=?fC}wA85k@t0c@dJ#hZcpC{sBjn6Io@0L~?UFjh|{kp>5Ba z&RT}0lUU)ZQXDENDkW@IrE{OiUGo$gX39UrCu@|Chs#?;7p{H(V5C8uHg=;=u_{?E z71v8I%5Za7L&5!{X;;g^Y3qGqI~rsFq-fyyhHvDOHYa+Qau(}C^{|uB*qo zu7WI!ODO&i`F(JHd~ZvhJ1e$r;+f9-+k%~pwMV?Qb+M$fvT&{IHAA*0INg=xS5&}| z`QOlb9@iJ-%r*f6bRIm{y{bP{c(%DI{9Zd$vN|2I;<9?E)jvG`R;iG;{EPZt!H zeD%BUJlf5lqfXR2Ey!i0s|O*MCc;~zeMXO}m8&5qUg+{PyROHHTbJn27jkO*^>t!8 zx(T3lMc8L=)r4&-rC&D(k{{>x<(MnycFb}p1hb|FoS2qL5*T{R_-4h#%{*D-ZHnP8 z=iS8V>xcVNa7SZXMwabWpyC^0L6$lA{o(Ilt8)x#wdD}g z$fCjz01QWbOYFyNIQ6Fer)<1s4Norz=v!QTl1?Ybx0*tDEMBG<$Mo7|o2xS5H+{Vh zw#Rr>)o}9YXE75F#O3M|`Q9MHDBm*5%ozN}5g)~zQBSYRcPZ7hmV!cR4XGzoJP#yo z1WsM{HeAhKpD@D=TdC8yc3NxsSd-Az_|AI|B_FN>Dz)#0J@@WdUT$8P9^_#!abZwOo`h%vHLnxP(>|6c1VkfVSE*adaTo{;$%&TQ&S-6w{Kg2blSX1>j_9k+ zdb2dG`GdoSW7vIkLMAWh5>=TpB{xhSN_Nre-ki+##<#$IY`eZ+7_*e@9|tb5DH_7H z$&xBj9rYnNQ=|IFtl^jD(V&9uS3BFLKPL@UI2b@)f4|67Wc9S!@LSC1=JR;&eh!@I z1&dGWuDkPrqiXqSZ@!Y|*1CB`XZ^Z)4mKZJL)b{C03}y`gUh64cD7q}T8bt*ThIo;(vIfgZnGFV}NLXjQhDLHpda@(6C=-A)T$TdvKD+n+#pA{$xV&jIZK_e+!@6NX=o|OkzmOLK@ zFWCfEGeyo$j*+V$?5oE5>9MD@;ps90Z`iQ}-i`60#bBjK^m|^5-{pIX{!@zC#3zQ` z6#oTgq6K$twYx*xo6lk*S{Lcn4%Ql%-JNfl#&rckiOPe_E7*dSVmR7oXA;dpYW|^1 zz!um$7)O%vFXOnVxq^dQ(!Otwje(ijJi5kx?=T#vcG6xksZ#6fWo4>*=CN3-K<5aX z?}Rvs${ja&F-)hb&usc8t0o~ICz$%qviQWlcJoAhj7FQvCMNDprjptp=s^`&j*U=i zHC;-!{qU#v&lkfg>R|~{3v|?b84kcFzjRK2zWxdCTK9|iZKCqZDjxiE3zkD@Ttq8+ z@OwTvLKQ6|1yW`x^0i^`a{6Xo*IT5+6HB_9fiKLu;sJ~J(#ZqURdbRJMToxv<^Fmd z>k^BhvJ)(JwF7ao1Sr+3c*b0$`qPU3QXh@9-~O+<(u~oVhUy3m34~eJrCi&$RbYkO z{_JDoh&PW*%iqIv&Q#|Fl_cWcIdjnvC6A@VUbsUSIY&e{Zww_KCptxJZS7 z%gE7_@%m$AUSoOkVVb7GDnyJka@>GzQ$D-FLVVRF$P05P8H6 z)t`J7C#WlltR9<$p8%f(8q*ZybpdcB>?-*wy|%>kp2>*ykIEw~!zD}2F0f>tKV~Vh6U~L=y_Sku%mMt`jP$%G`hQ~?Sj!rS8m|JmD%v*{kg(&clTTL z%&)Z{N82n*$!DW%s}~&ZW@ZQ=`rim+C3V@`7Er8Fp$_9 zor`ARCdCxxhJ7p%`-?e#V`&YUuACOT^+HNTVY~{l0K0~ypPw1Mudfl&^W7%L%XO;} z%xyk-%dV;-=VKIVu+b_1(cyW)0&CV7`}CSLf16kc*yToIrroGS=ZQ#a#WPKk#Yp-o zQ!)L07nKt#XBs(_)KCUrhQ)BDJlEGr?7U>5I@eH?16f)a$i;cMLS=cq1li|Oj9qwL zyo{sZ)J8-O1UGb>u?|Yr(F*7LPvT0^>LP9004@wIsd<}*^VnlZ>F{Mm84B;l?9({@ zk1aW~vQkWr9c^6r7Cih2ApIamY$x+}Ut%bQKIab|1VD-MdjV2?X%Z6hnBC9emtuiROj0Y1Lg z0PlXmL>Fa7m{?khrtoMH6?A$PO#8vtol(_s8CBxbUq*`TX~L|-poNhgrOR)!8u zZ|%S?#>ek=Ds#Hq>HvQq0?A>`YQ^XC^Q!S3V-F7xd=I;2$SY;8>k?I=O$D0rq^=M} zrEkHSYJ|hsgbzdx4MH+cPYeXtAt^@x^aCnv>~|UF(ihOMLoy7<1LXs*FA5~0=#^<(TZ-`&aJ_CY ztps-p2ns}C68@Q|)*%6gcQP+uc7+z4e?<_owb-Wmbh`isA&X*v!g6I>${Y=^{YT!6k!gR!G$5uzzvHp zlFpKQ*hh)*UqFc(91FDl-r}@HRi)P@0*|H+#z&Jtp6@lR^#o;g7C%H}a;agV?JYoX z>=)ApCKyi8NKWpKbHJOkoJqN zJi;N(2qttsZ8NWSN;<*Ix&VWjjw+KlRESffAy&TJe|xbNQih>wgep2&m659C4Kjax zZ$s{zo+;#IDq9{(%4;hN(w4Ym$b8@SDSh@;ai0ir^WCjCv843-FO@&reO~Kjeb$h$`^~OI5OaHt%2zt7{-+>tilgwKkFT@)aVUzW0ZlNiYzNwNweqYFE zMG@5LnRaPjOWP-Dw(Q8VF)iP$5(sdL(I#-<8x}c=t4u*HVO>{M2o?{(S0gmRCy&7@ z&lB(=JX|p?yTFZsA5W-O4X3!sqw(M*J0%NftN&cv(G=mhqH3P6EP>7MFq|9hZ>kV8 zdiZnMmJ~k80=f|S#}B#-NO?5=r($g5Q~%M7OThqmtYEalGXP&xhhccMg39RAnfo)v z?h2E5%KVA&uRUr#5wbVnVYrbp`#WG7h}**F>v5li+1z8Pg*)r z_}38{Vs*NV$e@^<&=KRdlf*DcILTYpa6KNW zg}$&cN6imSyG6-vZr!iKj@tPz>?R3w{d{gd`Ci%MJfFTW!8cGwcL~HrQnxA9(9cU> znl%g^l}h((1Pc0F_Q%?E%gAgQ?%}18nYekpY1;F!pqq^lQp37lAY=&f-f)4tkmdy z@cbX%IN}1Ks$-jueM`o+qu0juJO540Ue@GbWaWqQ&m z#pJQuseIrGcIwG>@Vmmm-y_2Xn|W`HDX8Vk{z!RP4BKm>QY3e=mj(y`$Q#OV9m5dH z(mKQ}F(>bDdc`bA8rVh%r@@wD$``er6&&7*c$kbloraWw=9;aS%*j4V{hMw9Bm zKdb@1SD0a_#^*5v|JMNg?fROiESPLKg`e3_hRLE1pdm%I3Zd%DoyEVsM8$vz?OkK=Ah)&0f;AaFNmceXj?(Ftha(3Oa;&5 z5Z;v4a*cw$F0~i3Y;qaNdYb@mJL~F6{9LREo_Bj}pB}@h_irZ&cOT)bMQvUcszp$C zv1$I=bz9wBr3htwP2CdN9GZTRW7&x;xQm-6Ta!mF3zW*lXjxDdd$gKjO*F`-tZK0z zvq^OOGcrp0L4gBZZKGtWu#&RC##*TNeuED+yX!Vq_ zR_4bU8EO3#A`)zAGGyDw+xBe+ZY>f*H||@sthDb+E$|W&Gs8QcMCcgkguxcPDk}4N zRb8>h{ee`-Nl-xBqssZ}COog^2peHdYRvPHBXrCUrJ#$n-Lykr(#68RzE#)Y< z{W%sttTp53+ZjN=l1Cc)_@eCLgjC;P5o8W4alIW+Z~a)4{IO4;!uw<4#ETWURZY(9i85 zMe&~Ah_IH%jCvVO@;pn?qC{5!K`rADm>_-y*J%Kf&*^d(uB8MUU9@<5%oK$E$>t67 z^E7~$%L}T|Cn&W~OC`=^birl;p*BOsm?W@sT4EK9UZqdU$*+tnIi*yu5D5LAh?r?u zoc3A#cF58`pFeu;PFWpCU98+2V?k-Nr^uS0@wU8%Pe)Fw|Bs3lRIwEL-P*-Eh6-QB z7KIXTYh6t|hS?TF5&_+EMD7Q>B5-(D0*iVXl5m{onF}$>bxuxXmW~7e%%1)9uMqd| zB&S$bVVpJr3H-Dm?fl!{cxDpaaq8g~BiN^9S&7<94n4PS6I zHEg=ovQ77-chQhKv-*5f%mUKHA(+%kZazbMQ%=k&^VS&`6R9Uod#ZdG13Z4p)4*r+ z-{Hm0?d5|&$KMp_7Cg6gn!zjqfXYMv5kCY zl(fFzpmIl=@dFtaEqFeK3)?}|!`_kOF;ASNUO_!-oP%H>|?&Guk+0y`s2|}aOWbC!A zf8Q*cc+tSGS7nF+b|l+@M!ZTqn5E%5C=puUHc=~`u@MjB3hJmOTVZfWNY)SjgNt1d z{w+);GOJga?j{Wb0#b1O6<8rga!*9{R;)zwKRKp;g9u6wu%fPFA_s`mnQWgzNt=U^ z4{bPQI{Y_jCl{fUYB?Tya%Klv)TYvB36Lty?qyh5pK(8SVq!dMgZ$Vm2S=W*1E$K{ ze12OkYeimBTG;5Qyt?+c)I~fAFgP#nm_r%MRLMgDeM#$(hPMZ7v8fLsrCtL_ldbSM zI??pl1ky>0}X{Fy|IUi~QEzx7uarv2gvLT}IsMSwa0E`hz4S zP_5vgnW;Afo)RP?TU%kBVfeEY@DFE(&-8JBy_FY(2jTs0iFZ#|^7!X>?XNCn(ggiJ zsL5p))IZ+p-=-z1FU|v{@Ga%F;$(O)(2X^>O6Kf(C9<3j7C&vYs+@~T(bDO*uddsjreJE zLh|7Rli(sBa~d``XzOicC1?tdlgt$W>sW)f@v1aC!}x$SRjB(Gm3NC<7oPawI{g_U zsr3329{54N?8(!CtI;Eisgm9w+T^k-5Bu7Q2wF;c7HY9b%OlezvxUG~p|G-NK!TTy za!I&w>8J?$eQzBN&43-y)IS|Yhb`d1S|aT#-}MJIo0LzYrLKMQip z)Z#U{mC03+&RfN5#rxdc!RJ$AuLZfGfgjOPA$plwK{%kg0|z;>tW&A{Wf@%o&KS}9 zYu^mI8YonN-PH`&+{atm-6Z3K94bhlmV@C&REkL0CyU4Vfpg|G5)-Ka`Vj36-kH~K=X>AX^t zPQb1)K_v~kzENlZm$4N~mURwSJaXk=4yhg?XsZzyU^h$@NNV<0#@GXT)~LAmcX=)I ztGLdd2jQ7EMdoRS56Qu!gkCGN$oo$pC`dPuN!?oF^(DT2`=;=oCVBJq`@B4!DznO= zmWhcd)kvDHxd^2&@z$}^vEvpcBb(V5?6YTI-CD0&OTRV8(fN6( zzFpbX;|Urm?tzR_x`GQI|LA-r^W)(~w*-Ih)?I!5N2guOHaqJF^KSE~nVI-buR1-2 zlk+A!p1um%7y9vc5WOUFB_@Ow%;u3Aem~(BF;|N-CA>POID}c*7NHp`z3kMWbR@2k z0+ryxcL{s#PnX+@IE0n7@uFz9DOTu`)!kTWl^%6$mI&A>L_!2DGj$&VQ6dJdL+^Cf zo7MXZMgiS`9?2=A&)JRdN3NU-#KOM~*wG~>482ChZBz2}E*J^{KI$mkKC3v5C**Cu zq5VCH=<+aY#Py?9nZRuKGtKmiPNuGk^4KDws(i7ApfGa@uTx?v?vuW-KI8EeYjFWW zbx|&>6J1kXuI!toKeVph;_#r}dV;0Qwf|v(GEf9Xgh^vA;f-G)-UT8$d&%Qq(HZ}d z3r~N!VDjb_f4}iWU|S6^D0!w=(8_Cj{WnbpuXne=(>jB+ohErbk<@y7GI6Y*pCN(v zDa(iz0&NRtx7N!^KTAhvtE8_`2Rs08&^mV#=+?|J`sZ4$C)Kn(Ln84c()za2pc7PePUVJ_E zMDOtg?P7}~WrJ!E3$$y|%75agxF(saIqFgY)Gn~;J5V)vM4v^K%F9y5-Y*=;WK$Bz zP9)6hrS^)c3j7;WC(+R}l|;6oZRZCFX>7*bSiBIs2~^33%huz_h*)i_gXq`JNA1VE z*uDN#;C(yhdiSK`dCVxALC#-o8ld#>@G9X)vXu&bKGfM3%R+|D9Y_ zd1COxp+UnODZRiu$X=~vF~CuB#B`=BBO`~ZxSSx5{=~&aF+$}q{FfDLSZBd2fh5IR zY`kBZG1R%2hWfuCnNwTjf*^0;z5X=wXYp1H)TO;V`R;G45kf>xCO{A^SK{|J^>0A! zpmEg0{fyB)L_dlzv0_*=?>=3WS++O{@&bVwaTTTGD`>rVH{tyFZ=(VBhph=^Wd$7b z^WVzYBIb+58or0S+vqdVL-HokN{z9`maHbALi~~@U%q@uCV0DR_!{(=*13C3m&x!rkMu{>XpE`^ z7BFbzUo+NVamtyL-w-EWgfXPrIsGcfWV}3p3fqwDps1;~?OgwOyVBwn*ug&cD!J{+ z(MO6vn^2D~JumRn=oHv(;Wgtan+5X1mz_q*egprS8xxC>(b+C_v~@1L0c-WQH&bL| zUWx)sTP>@osJIV3of_RFBnPaUtlK}DXJT5H>T6iEM#8S;4d~`yim<{^t_^8ugZM=! zEIG}pOjTI-U~S*V)0K)f6D0&Ur)3;9X6Eb$qp0+OyYz~q#z?O31K(%qvZWbT`Y-+md{{%#q9iY7_E`v zUg8XcqKW6MmaBc8h~X9FOUCN<9GJXwn7Fro7cgY(IFGL0)Bv)K^M(Ih10~Dop~%Gr z+FYeqOSzniqya9k_f@?D*9aH>>?V{Ojh|onbUHfuzUlJzmi7Jm6`ADZEKyIEG1zSo zo=kj6=xFinDV$Z{h5o<7%ru$}ZHwcEihE-!_eKY4)l^p+Vye~ZQrQA!9}VhStNSknu)uOHr*cfOpn&))mD_lL9o zYp->jBb5mD#k3Q1-aUxn{|jHDiy0;s9)AOJ-a4k{}LhQ$v7H{ftqaM55*^_O8|1~9=s>`0nYS0 zs~K2ApgsD!C51iHVh9o&8F2%vb`Jr3ipv@jx!Wt6+#pZJJ9L} ziaF=+(Dv0Sx;iP;q4BRP)`HT@wiTUrKqmNl7Yakz>(XKW({pXvcVG-o4RI(qhx-~PiJaH8 zRi^i3`O(R<;1^{!d}Ea%Db*=R{J2WK5I0~pEiro@Z^e2C;NMy4hwfp3i0s}4%24H5fZi9Yn#M_u(yAIxqzdLfUc4ejAW%-%}#hx zDM!6D*kYYXruy;C?!bP20-IzO790o~(-~Dh2z)FYrZ#Zy;E5Mtf32%xcb3?+x`7t+ zNc{F%cQV4c(qc%^?7nZwwRZ-9EY7?}cbf3OzB+%hKBikJIj=GA_`s!^ele}JI-oIU zm`QCM$mMJ-&#Y3|K$3RDjb{BC;Qr;7J7JIAFNOq?EcJD-{45yTD4$J;Oo_?z(=k8Z zJ>-%Bi`Pw%XRAmw%7{Uu6FSgH9xT)9dYDSdPUE+p&eo>|(&(OVd)zmaV!Nb~U)LEi z8b}iW`C6ErLM8&#TxX$u5f%f$qcX{{oVHz#U$WyeAoVSaHI;{RT zsC2)vB7PV=yt3L_=xvP7wew#j;sNJwgHkg(*RAg6y?8nyvQn0|)h?r2EM|U_$?jg%9vpdN^ChIQbR&L;A4ID{F%CJ@9G|zOk1=!#1=~ZMZx>> ztISY}KybSWS@$Miqd`#(94(5K(gdkfNYvk?JcERw+Um=yd>GuEqJ-~`7`>|o6+ZO>w=*o35Z zv^g>$iZ*4HYG%(Q^LZ^-ezdpb*Bd^O0+VI}!)+*QoT#xtcc~mHY`UwPj7Qme7uHSm z#!%J_Qw#Q7K*%|m&KJpa8abufZu3c&QP*W-vJ`~>nMTdnn)&uP*q=g)A#T;P1 zS=}Eq-QHN0-|Z&LY5kDTuDn;zTK%>&{Vt<197iq6!oG-?VBuaTJW<} zAVmvKKLu--z{)@GLaVR^vk*EjKzMJmYi#py$Qgy~^^IqB1m1)YtJ8&_&W)JW`b?f6j7~5J4sx_dbr9Dz8ONzfZDk zm9`M+a_D{D>L&Ph=Ib6m=i?M_kS_+5Jewg3e*&95{JgRs^mObi{OaBM?{~U*y|7LtR bcy<8bd3d|vgUXj_9`3qsY++Ps;27~A3ga6@ literal 0 HcmV?d00001 diff --git a/src/test/java/org/teachingextensions/logo/tests/PuzzleBoardTest.java b/src/test/java/org/teachingextensions/logo/tests/PuzzleBoardTest.java deleted file mode 100644 index 9230164..0000000 --- a/src/test/java/org/teachingextensions/logo/tests/PuzzleBoardTest.java +++ /dev/null @@ -1,100 +0,0 @@ -package org.teachingextensions.logo.tests; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -import java.awt.Point; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -import org.junit.Test; -import org.teachingkidsprogramming.section08tdd.PuzzleBoard; -import org.teachingkidsprogramming.section08tdd.Tile; -import org.teachingkidsprogramming.section08tdd.TileMove; - -public class PuzzleBoardTest { - - @Test - public void defaultNotSortedTest() { - PuzzleBoard b = new PuzzleBoard(); - assertTrue(!b.isSorted()); - } - - @Test - public void notSortedTest() { - Point[] positions = PuzzleBoard.createPositions(); - List tiles = PuzzleBoard.createTiles(positions); - - Tile t = tiles.get(7); - t.moveTo(positions[8]); - t.teleport(); - - PuzzleBoard b = new PuzzleBoard(positions, tiles); - assertTrue(!b.isSorted()); - } - - @Test - public void sortedTest() { - PuzzleBoard b = getSolvedBoard(); - assertTrue(b.isSorted()); - } - - private PuzzleBoard getSolvedBoard() { - Point[] positions = PuzzleBoard.createPositions(); - List tiles = PuzzleBoard.createTiles(positions); - - return new PuzzleBoard(positions, tiles); - } - - @Test - public void validMoveTest() { - PuzzleBoard b = getSolvedBoard(); - TileMove move = new TileMove(7, 8); - assertTrue(b.isValidMove(move)); - } - - @Test - public void invalidMoveTest() { - PuzzleBoard b = getSolvedBoard(); - TileMove move = new TileMove(0, 1); - assertFalse(b.isValidMove(move)); - } - - @Test - public void toStringTest(){ - assertEquals("[ { 35, 35 }, { 35, 162 }, { 35, 289 }, { 162, 35 }, { 162, 162 }, { 162, 289 }, { 289, 35 }, { 289, 162 }, ]", getSolvedBoard().toString()); - } - - @Test - public void equalityTest(){ - Point[] positions = PuzzleBoard.createPositions(); - List tiles = PuzzleBoard.createTiles(positions); - PuzzleBoard a = new PuzzleBoard(positions, tiles); - List history = new ArrayList<>(); - history.add(a); - PuzzleBoard b = new PuzzleBoard(positions, tiles, history); - assertTrue(a.equals(b)); - } - - @Test - public void inequalityTest(){ - Point[] positions = PuzzleBoard.createPositions(); - List tiles = PuzzleBoard.createTiles(positions); - PuzzleBoard a = new PuzzleBoard(positions, tiles); - - List history = new ArrayList<>(); - history.add(a); - - Point[] locations = PuzzleBoard.createPositions(); - Point[] array = new Point[locations.length]; - List l = PuzzleBoard.shuffled(locations); - l.toArray(array); - List t = PuzzleBoard.createTiles(l); - PuzzleBoard b = new PuzzleBoard(PuzzleBoard.createPositions(), t, history); - assertFalse(a.equals(b)); - } - -} diff --git a/src/test/java/org/teachingextensions/logo/tests/PuzzleSolverTest.java b/src/test/java/org/teachingextensions/logo/tests/PuzzleSolverTest.java deleted file mode 100644 index 79aaa2f..0000000 --- a/src/test/java/org/teachingextensions/logo/tests/PuzzleSolverTest.java +++ /dev/null @@ -1,144 +0,0 @@ -package org.teachingextensions.logo.tests; - -import org.junit.Test; -import org.teachingkidsprogramming.section08tdd.PuzzleBoard; -import org.teachingkidsprogramming.section08tdd.PuzzleSolver; -import org.teachingkidsprogramming.section08tdd.Tile; - -import java.awt.*; -import java.util.ArrayList; -import java.util.List; - -import static org.junit.Assert.assertEquals; - -/** - * Created by james on 3/20/15. - */ -public class PuzzleSolverTest { - @Test - public void manhattanDistanceFromOneToZeroTest() { - Point start = new Point(1, 0); - Point end = new Point(0, 0); - int distance = PuzzleSolver.distance(start, end); - assertEquals(1, distance); - } - - @Test - public void manhattanDistanceFromTwoToZeroTest() { - Point start = new Point(2, 0); - Point end = new Point(0, 0); - int distance = PuzzleSolver.distance(start, end); - assertEquals(2, distance); - } - - @Test - public void manhattanDistanceFromFourToZeroTest() { - Point start = new Point(1, 1); - Point end = new Point(0, 0); - int distance = PuzzleSolver.distance(start, end); - assertEquals(2, distance); - } - - @Test - public void manhattanDistanceFromSixToTwoTest() { - Point start = new Point(0, 2); - Point end = new Point(2, 0); - int distance = PuzzleSolver.distance(start, end); - assertEquals(4, distance); - } - - @Test - public void manhattanDistanceFromEightToZeroTest() { - Point start = new Point(2, 2); - Point end = new Point(0, 0); - int distance = PuzzleSolver.distance(start, end); - assertEquals(4, distance); - } - - @Test - public void distanceFromSolvedToSolved() { - PuzzleBoard solved = getSolvedPuzzle(null); - assertEquals(0, PuzzleSolver.estimateRemainingMoves(solved)); - } - - private PuzzleBoard getSolvedPuzzle(List history) { - Point[] positions = PuzzleBoard.createPositions(); - List tiles = PuzzleBoard.createTiles(positions); - return new PuzzleBoard(positions, tiles, history); - } - - @Test - public void distanceForPuzzleWithOneMisplacedTile() { - Point[] positions = PuzzleBoard.createPositions(); - - // swap 7 and 8 - Point p = positions[8]; - positions[8] = positions[7]; - positions[7] = p; - - List tiles = PuzzleBoard.createTiles(positions); - PuzzleBoard b = new PuzzleBoard(PuzzleBoard.createPositions(), tiles); - int expected = PuzzleSolver.distance(positions[8], positions[7]); - assertEquals(expected, PuzzleSolver.estimateRemainingMoves(b)); - } - - @Test - public void distanceForPuzzleWithSeveralMisplacedTiles() { - Point[] positions = PuzzleBoard.createPositions(); - - positions = swap(positions, 7, 8); - positions = swap(positions, 1, 4); - positions = swap(positions, 6, 2); - - List tiles = PuzzleBoard.createTiles(positions); - - // cost of swaps - int expected = PuzzleSolver.distance(positions[8], positions[7]) + - PuzzleSolver.distance(positions[1], positions[4]) + - PuzzleSolver.distance(positions[6], positions[2]); - - // each swap requires 2 tiles to move - expected *= 2; - - // except the blank - expected -= PuzzleSolver.distance(positions[8], positions[7]); - - - PuzzleBoard b = new PuzzleBoard(PuzzleBoard.createPositions(), tiles); - assertEquals(expected, PuzzleSolver.estimateRemainingMoves(b)); - } - - @Test - public void solutionHasNoCostTest() { - PuzzleBoard b = getSolvedPuzzle(null); - assertEquals(0, PuzzleSolver.estimateCost(b)); - } - - @Test - public void solutionHasHistoryCost() { - PuzzleBoard b = getSolvedPuzzle(null); - List history = new ArrayList<>(); - history.add(b); - history.add(b); - history.add(b); - PuzzleBoard c = getSolvedPuzzle(history); - assertEquals(3, PuzzleSolver.estimateCost(c)); - } - - @Test - public void unsolvedPuzzleHasMovementCost() { - Point[] positions = PuzzleBoard.createPositions(); - positions = swap(positions, 7, 8); - List tiles = PuzzleBoard.createTiles(positions); - - PuzzleBoard board = new PuzzleBoard(PuzzleBoard.createPositions(), tiles); - assertEquals(127, PuzzleSolver.estimateCost(board)); - } - - private Point[] swap(Point[] positions, int i, int j) { - Point p = positions[i]; - positions[i] = positions[j]; - positions[j] = p; - return positions; - } -} diff --git a/src/test/java/org/teachingextensions/logo/tests/TileTest.java b/src/test/java/org/teachingextensions/logo/tests/TileTest.java deleted file mode 100644 index 13684c0..0000000 --- a/src/test/java/org/teachingextensions/logo/tests/TileTest.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.teachingextensions.logo.tests; - -import org.junit.Test; -import org.teachingkidsprogramming.section08tdd.Tile; - -import java.awt.*; - -import static org.junit.Assert.assertEquals; - -/** - * Created by james on 3/20/15. - */ -public class TileTest { - @Test - public void tileShouldKnowWhereItBelongs(){ - Tile t = new Tile(0, new Point(0, 0)); - assertEquals(0, t.getCorrectPositionIndex()); - } -} diff --git a/src/test/java/org/teachingextensions/logo/tests/TurtleUtils.java b/src/test/java/org/teachingextensions/logo/tests/TurtleUtils.java index 3358f30..1f4e357 100644 --- a/src/test/java/org/teachingextensions/logo/tests/TurtleUtils.java +++ b/src/test/java/org/teachingextensions/logo/tests/TurtleUtils.java @@ -2,11 +2,9 @@ import org.teachingextensions.logo.Turtle; -public class TurtleUtils -{ +public class TurtleUtils { - public static Turtle getTurtle() - { + public static Turtle getTurtle() { Turtle turtle = new Turtle(); turtle.setSpeed(Turtle.TEST_SPEED); return turtle; From 15f12a803530863965a59a51358c24f8e1e91cf7 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Mon, 23 Mar 2015 16:56:07 -0700 Subject: [PATCH 101/111] Moved unicorn to maven resource folder --- .../logo => main/resources}/Unicorn.png | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{org/teachingextensions/logo => main/resources}/Unicorn.png (100%) diff --git a/src/org/teachingextensions/logo/Unicorn.png b/src/main/resources/Unicorn.png similarity index 100% rename from src/org/teachingextensions/logo/Unicorn.png rename to src/main/resources/Unicorn.png From d5357054154a4ee08269b3f5aab295f61422c73d Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Mon, 23 Mar 2015 17:32:01 -0700 Subject: [PATCH 102/111] Cleanup warnings --- .../lite/reporters/MultipleExceptions.java | 44 +- .../lite/util/FormattedException.java | 11 +- .../approvals/lite/util/ObjectUtils.java | 92 +---- .../approvals/lite/util/ParserCommons.java | 32 +- .../approvals/lite/util/StringUtils.java | 350 ++++++++-------- .../approvals/lite/util/io/FileUtils.java | 179 ++++---- .../util/persistence/SavingException.java | 1 + .../lite/util/servlets/InvokerServlet.java | 122 +++--- .../lite/util/servlets/ValidationError.java | 126 +++--- .../lite/util/velocity/TestableUberspect.java | 382 ++++++++++-------- .../lite/util/velocity/VelocityParser.java | 135 ++++--- .../util/velocity/VelocityParsingError.java | 27 +- .../logo/ImageBackground.java | 24 +- .../teachingextensions/logo/PuzzleBoard.java | 13 +- .../teachingextensions/logo/PuzzleWindow.java | 6 +- .../setup/CommandLineUtils.java | 18 +- .../setup/MacThumbDriveInstaller.java | 40 +- .../recipes/completed/ConnectTheDots.java | 5 +- .../section08tdd/PuzzleSolver.java | 16 - .../approvals/lite/util/ObjectUtilsTest.java | 22 - .../logo/PuzzleBoardTest.java | 6 +- 21 files changed, 811 insertions(+), 840 deletions(-) delete mode 100644 src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleSolver.java delete mode 100644 src/test/java/org/teachingextensions/approvals/lite/util/ObjectUtilsTest.java diff --git a/src/main/java/org/teachingextensions/approvals/lite/reporters/MultipleExceptions.java b/src/main/java/org/teachingextensions/approvals/lite/reporters/MultipleExceptions.java index 9df58a2..97bf2a3 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/reporters/MultipleExceptions.java +++ b/src/main/java/org/teachingextensions/approvals/lite/reporters/MultipleExceptions.java @@ -3,29 +3,33 @@ import java.util.ArrayList; public class MultipleExceptions extends RuntimeException { - public MultipleExceptions(ArrayList exceptions) { - super(getText(exceptions), exceptions.get(0)); - } + private static final long serialVersionUID = 1464454338264847972L; + + public MultipleExceptions(ArrayList exceptions) { + super(getText(exceptions), exceptions.get(0)); + } - public static void rethrowExceptions(ArrayList exceptions) throws Exception { - if (exceptions.size() != 0) { - if (exceptions.size() == 0) { - Throwable t = exceptions.get(0); - if (t instanceof Exception) { - throw ((Exception) t); - } - throw (Error) t; - } else { - throw new MultipleExceptions(exceptions); - } + public static void rethrowExceptions(ArrayList exceptions) + throws Exception { + if (exceptions.size() != 0) { + if (exceptions.size() == 0) { + Throwable t = exceptions.get(0); + if (t instanceof Exception) { + throw ((Exception) t); } + throw (Error) t; + } else { + throw new MultipleExceptions(exceptions); + } } + } - private static String getText(ArrayList exceptions) { - StringBuilder b = new StringBuilder("Multiple Exceptions Thrown:"); - for (int i = 0; i < exceptions.size(); i++) { - b.append(String.format("\n #%s): %s", i + 1, exceptions.get(i).getMessage())); - } - return b.toString(); + private static String getText(ArrayList exceptions) { + StringBuilder b = new StringBuilder("Multiple Exceptions Thrown:"); + for (int i = 0; i < exceptions.size(); i++) { + b.append(String.format("\n #%s): %s", i + 1, exceptions.get(i) + .getMessage())); } + return b.toString(); + } } diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/FormattedException.java b/src/main/java/org/teachingextensions/approvals/lite/util/FormattedException.java index 38bf9c9..3744d72 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/FormattedException.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/FormattedException.java @@ -1,10 +1,11 @@ package org.teachingextensions.approvals.lite.util; - public class FormattedException extends RuntimeException { - public FormattedException(String string, Object... params) { - super(String.format(string, params)); - MySystem.variable(this.getMessage()); - } + private static final long serialVersionUID = -4388436150197314047L; + + public FormattedException(String string, Object... params) { + super(String.format(string, params)); + MySystem.variable(this.getMessage()); + } } diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/ObjectUtils.java b/src/main/java/org/teachingextensions/approvals/lite/util/ObjectUtils.java index 2717aa5..e296588 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/ObjectUtils.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/ObjectUtils.java @@ -1,14 +1,8 @@ package org.teachingextensions.approvals.lite.util; -import java.awt.Image; -import java.lang.reflect.Array; -import java.lang.reflect.Method; +import javax.swing.*; +import java.awt.*; import java.net.URL; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import javax.swing.ImageIcon; /** * A static class of convenience functions for Manipulating objects @@ -28,8 +22,8 @@ public static boolean isEqual(Object s1, Object s2) { return s1 == s2 || (s1 != null) && s1.equals(s2); } - public static boolean isThisInstanceOfThat(Class thiz, Class that) { - return that.isAssignableFrom(thiz); + public static boolean isThisInstanceOfThat(Class type, Class that) { + return that.isAssignableFrom(type); } public static Error throwAsError(Throwable t) throws Error { @@ -42,82 +36,6 @@ public static Error throwAsError(Throwable t) throws Error { } } - /** - * @param from - * the source array - * @param methodName - * the filter method - * @return a filtered array - */ - public static Object[] extractArray(Object[] from, String methodName) { - try { - if (from == null || from.length == 0) { - return new Object[0]; - } - Method method = getGreatestCommonDenominator(from, methodName); - Object[] array; - if (Object.class.isAssignableFrom(method.getReturnType())) { - array = (Object[]) Array.newInstance(method.getReturnType(), - from.length); - } else { - array = (Object[]) Array.newInstance( - ClassUtils.getWrapperClass(method.getReturnType()), from.length); - } - for (int i = 0; i < from.length; i++) { - array[i] = method.invoke(from[i], (Object[]) null); - } - return array; - } catch (Exception e) { - MySystem.warning(e); - throw ObjectUtils.throwAsError(e); - } - } - - public static Method getGreatestCommonDenominator(Object[] from, - String methodName) throws SecurityException, NoSuchMethodException { - List> classes = new ArrayList<>(); - ArrayUtils.addArray(classes, getAllCastableClasses(from[0])); - for (Object o : from) { - for (int i = classes.size() - 1; i >= 0; i--) { - Class clazz = classes.get(i); - if (!isThisInstanceOfThat(o.getClass(), clazz) - || !ClassUtils.hasMethod(clazz, methodName)) { - classes.remove(i); - } - } - } - return classes.size() == 0 ? null : ArrayUtils.getLast(classes).getMethod( - methodName, (Class[]) null); - } - - private static Class[] getAllCastableClasses(Object object) { - Class clazz = object.getClass(); - ArrayList list = new ArrayList<>(); - while (clazz != null) { - list.add(clazz); - ArrayUtils.addArray(list, clazz.getInterfaces()); - clazz = clazz.getSuperclass(); - } - Class[] found = list.toArray(new Class[list.size()]); - ArrayUtils.toReverseArray(found); - return found; - } - - public static void assertInstance(Class classes[], Object object) { - if (object == null) { - throw new NullPointerException("Expected Object of Type " - + Arrays.asList(extractArray(classes, "getName")) + " but was null"); - } - for (Class aClass : classes) { - if (ClassUtils.getWrapperClass(aClass).isInstance(object)) { - return; - } - } - throw new IllegalArgumentException("Expected Object of Type " - + Arrays.asList(extractArray(classes, "getName")) + " but got " - + object.getClass().getName()); - } - public static String getClassName(Object o) { return o == null ? "null" : o.getClass().getName(); } @@ -132,4 +50,4 @@ public static Image loadImage(Class type, String name) { } return new ImageIcon(resource).getImage(); } -} \ No newline at end of file +} diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/ParserCommons.java b/src/main/java/org/teachingextensions/approvals/lite/util/ParserCommons.java index ba2ac9a..3d09573 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/ParserCommons.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/ParserCommons.java @@ -3,25 +3,25 @@ import java.util.List; public class ParserCommons { - public static ParserCommons INSTANCE = new ParserCommons(); + public static ParserCommons INSTANCE = new ParserCommons(); - public static Class getClass(String clazz) throws ClassNotFoundException { - return Class.forName(clazz); - } + public static Class getClass(String clazz) throws ClassNotFoundException { + return Class.forName(clazz); + } - public static Object getNull() { - return null; - } + public static Object getNull() { + return null; + } - public static int getArrayLength(Object[] array) { - return array == null ? 0 : array.length; - } + public static int getArrayLength(Object[] array) { + return array == null ? 0 : array.length; + } - public static Object get(Object[] array, int index) { - return getArrayLength(array) > index ? array[index] : null; - } + public static Object get(Object[] array, int index) { + return getArrayLength(array) > index ? array[index] : null; + } - public static Object get(List list, int index) { - return list == null ? null : list.get(index); - } + public static Object get(List list, int index) { + return list == null ? null : list.get(index); + } } \ No newline at end of file diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/StringUtils.java b/src/main/java/org/teachingextensions/approvals/lite/util/StringUtils.java index a3fcce0..378de23 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/StringUtils.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/StringUtils.java @@ -9,199 +9,207 @@ * A static class of convenience functions for database access */ public class StringUtils { - public static final String NEW_LINE = System.getProperty("line.separator"); + public static final String NEW_LINE = System.getProperty("line.separator"); - public static String stripWhiteSpace(String text) { - return stripWhiteSpace(text, false); - } + public static String stripWhiteSpace(String text) { + return stripWhiteSpace(text, false); + } - public static String padNumber(long number, int digits) { - String text = "" + number; - while (text.length() < digits) { - text = "0" + text; - } - return text; + public static String padNumber(long number, int digits) { + String text = "" + number; + while (text.length() < digits) { + text = "0" + text; } + return text; + } - public static String padNumber(int number, int digits) { - return padNumber((long) number, digits); - } + public static String padNumber(int number, int digits) { + return padNumber((long) number, digits); + } - public static String stripWhiteSpace(String text, boolean all) { - StringBuilder newText = new StringBuilder(); - boolean whitespace = false; - int num = text.length(); - char whiteSpaceChar = ' '; - boolean atStart = true; - for (int i = 0; i < num; i++) { - char c = text.charAt(i); - switch (c) { - case '\r': - case '\n': - whiteSpaceChar = '\n'; - whitespace = true; - break; - case '\t': - case ' ': - whitespace = true; - break; - default: - if (whitespace && atStart) { - whitespace = false; - } - if (whitespace) { - whitespace = false; - newText.append(all ? '_' : whiteSpaceChar); - whiteSpaceChar = ' '; - } - atStart = false; - newText.append(c); - break; - } + public static String stripWhiteSpace(String text, boolean all) { + StringBuilder newText = new StringBuilder(); + boolean whitespace = false; + int num = text.length(); + char whiteSpaceChar = ' '; + boolean atStart = true; + for (int i = 0; i < num; i++) { + char c = text.charAt(i); + switch (c) { + case '\r': + case '\n': + whiteSpaceChar = '\n'; + whitespace = true; + break; + case '\t': + case ' ': + whitespace = true; + break; + default: + if (whitespace && atStart) { + whitespace = false; } - return newText.toString(); + if (whitespace) { + whitespace = false; + newText.append(all ? '_' : whiteSpaceChar); + whiteSpaceChar = ' '; + } + atStart = false; + newText.append(c); + break; + } } + return newText.toString(); + } - public static String stripNonNumeric(String number, boolean allowDecimal, boolean allowNegative) { - boolean allowExponential = allowDecimal; - boolean afterE = false; - if (number == null) { - return ""; + public static String stripNonNumeric(String number, boolean allowDecimal, + boolean allowNegative) { + boolean allowExponential = allowDecimal; + boolean afterE = false; + if (number == null) { + return ""; + } + StringBuilder result = new StringBuilder(); + for (int i = 0; i < number.length(); i++) { + char c = number.charAt(i); + switch (c) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + result.append(c); + afterE = false; + break; + case '-': + if (allowNegative || afterE) { + result.append(c); + allowNegative = false; } - StringBuilder result = new StringBuilder(); - for (int i = 0; i < number.length(); i++) { - char c = number.charAt(i); - switch (c) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - result.append(c); - afterE = false; - break; - case '-': - if (allowNegative || afterE) { - result.append(c); - allowNegative = false; - } - break; - case '.': - if (allowDecimal) { - result.append(c); - allowDecimal = false; - } - afterE = false; - break; - case 'e': - case 'E': - if (allowExponential) { - result.append(c); - allowExponential = false; - } - afterE = true; - break; - default: - break; - } + break; + case '.': + if (allowDecimal) { + result.append(c); + allowDecimal = false; } - return result.toString(); + afterE = false; + break; + case 'e': + case 'E': + if (allowExponential) { + result.append(c); + allowExponential = false; + } + afterE = true; + break; + default: + break; + } } + return result.toString(); + } - /** - * A convenience function to check that a String has at least 1 character. - * - * @param string The string in question - * @return true if Non Zero. - */ - public static boolean isNonZero(String string) { - return string != null && string.trim().length() > 0; - } + /** + * A convenience function to check that a String has at least 1 character. + * + * @param string + * The string in question + * @return true if Non Zero. + */ + public static boolean isNonZero(String string) { + return string != null && string.trim().length() > 0; + } - public static boolean isEmpty(String string) { - return !isNonZero(string); - } + public static boolean isEmpty(String string) { + return !isNonZero(string); + } - /** - * A convenience function to turn a vector of String objects into an Array - * of the String objects. - * - * @param vectorOf a Vector of String objects - * @return the array of String. - * @throws Error if an element of vectorOf is not a String object. - */ - public static String[] toArray(java.util.Collection vectorOf) { - if (vectorOf == null) { - return new String[0]; - } - String array[] = new String[vectorOf.size()]; - java.util.Iterator iterator = vectorOf.iterator(); - int i = 0; - while (iterator.hasNext()) { - String rowObject = iterator.next(); - if (rowObject != null) { - array[i++] = rowObject; - } else { - throw new Error("toArray[" + i + "] is not an instance of String but a " - + ObjectUtils.getClassName(null)); - } - } - return array; + /** + * A convenience function to turn a vector of String objects into an Array of + * the String objects. + * + * @param vectorOf + * a Vector of String objects + * @return the array of String. + * @throws Error + * if an element of vectorOf is not a String object. + */ + public static String[] toArray(java.util.Collection vectorOf) { + if (vectorOf == null) { + return new String[0]; } - - public static String toString(String name, T[] array) { - StringBuilder buffer = new StringBuilder(); - name = (name == null ? "array" : name); - if (array == null || array.length == 0) { - buffer.append(name).append(".length = 0"); - } else { - int maxPadding = ("" + array.length).length(); - for (int i = 0; i < array.length; i++) { - buffer.append(name).append("[").append(padNumber(i, maxPadding)).append("] = ").append(array[i]).append("\r\n"); - } - } - return buffer.toString(); + String array[] = new String[vectorOf.size()]; + java.util.Iterator iterator = vectorOf.iterator(); + int i = 0; + while (iterator.hasNext()) { + String rowObject = iterator.next(); + if (rowObject != null) { + array[i++] = rowObject; + } else { + throw new Error("toArray[" + i + + "] is not an instance of String but a " + + ObjectUtils.getClassName(null)); + } } + return array; + } - public static String toString(String name, Iterable array) { - StringBuilder buffer = new StringBuilder(); - name = (name == null ? "array" : name); - if (array != null) { - int count = 0; - for (T t : array) { - buffer.append(name).append("[").append(count).append("] = ").append(arrayStringHelper(t)).append("\r\n"); - count++; - } - } - if (buffer.length() == 0) { - buffer.append(name).append(".length = 0"); - } - return buffer.toString(); + public static String toString(String name, T[] array) { + StringBuilder buffer = new StringBuilder(); + name = (name == null ? "array" : name); + if (array == null || array.length == 0) { + buffer.append(name).append(".length = 0"); + } else { + int maxPadding = ("" + array.length).length(); + for (int i = 0; i < array.length; i++) { + buffer.append(name).append("[").append(padNumber(i, maxPadding)) + .append("] = ").append(array[i]).append("\r\n"); + } } + return buffer.toString(); + } - public static String arrayStringHelper(Object o) { - if (o == null) { - return "null"; - } - return o.getClass().isArray() ? Arrays.toString((Object[]) o) : o.toString(); + public static String toString(String name, Iterable array) { + StringBuilder buffer = new StringBuilder(); + name = (name == null ? "array" : name); + if (array != null) { + int count = 0; + for (T t : array) { + buffer.append(name).append("[").append(count).append("] = ") + .append(arrayStringHelper(t)).append("\r\n"); + count++; + } + } + if (buffer.length() == 0) { + buffer.append(name).append(".length = 0"); } + return buffer.toString(); + } - public static InputStream convertToInputStream(String string) { - return new ByteArrayInputStream(string.getBytes()); + public static String arrayStringHelper(Object o) { + if (o == null) { + return "null"; } + return o.getClass().isArray() ? Arrays.toString((Object[]) o) : o + .toString(); + } - public static String toString(Map map) { - StringBuilder b = new StringBuilder(); - Object keySet[] = map.keySet().toArray(); - Arrays.sort(keySet); - for (Object key : keySet) { - b.append(String.format("%s : %s \r\n", key, map.get(key))); - } - return b.toString(); + public static InputStream convertToInputStream(String string) { + return new ByteArrayInputStream(string.getBytes()); + } + + public static String toString(Map map) { + StringBuilder b = new StringBuilder(); + Object keySet[] = map.keySet().toArray(); + Arrays.sort(keySet); + for (Object key : keySet) { + b.append(String.format("%s : %s \r\n", key, map.get(key))); } + return b.toString(); + } } \ No newline at end of file diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/io/FileUtils.java b/src/main/java/org/teachingextensions/approvals/lite/util/io/FileUtils.java index 8a2b03f..c716f81 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/io/FileUtils.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/io/FileUtils.java @@ -1,113 +1,126 @@ package org.teachingextensions.approvals.lite.util.io; +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileFilter; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.ArrayList; + import org.teachingextensions.approvals.lite.util.ArrayUtils; import org.teachingextensions.approvals.lite.util.Asserts; import org.teachingextensions.approvals.lite.util.ObjectUtils; -import java.io.*; -import java.util.ArrayList; - /** * A static class of convenience functions for Files */ public class FileUtils { - public static String readFromClassPath(Class clazz, String string) { - final InputStream resourceAsStream = clazz.getClassLoader().getResourceAsStream(string); - if (resourceAsStream == null) { - String message = String.format("Could not find %s from %s", string, clazz.getName()); - throw new RuntimeException(message); - } - return FileUtils.readStream(resourceAsStream); + public static String readFromClassPath(Class clazz, String string) { + final InputStream resourceAsStream = clazz.getClassLoader() + .getResourceAsStream(string); + if (resourceAsStream == null) { + String message = String.format("Could not find %s from %s", string, + clazz.getName()); + throw new RuntimeException(message); } + return FileUtils.readStream(resourceAsStream); + } - public static File[] getRecursiveFileList(File directory) { - return getRecursiveFileList(directory, new SimpleFileFilter()); - } + public static File[] getRecursiveFileList(File directory) { + return getRecursiveFileList(directory, new SimpleFileFilter()); + } - public static File[] getRecursiveFileList(File directory, FileFilter filter) { - ArrayList list = new ArrayList<>(); - if (!directory.isDirectory()) { - throw new Error("File is not a directory: " + directory.getName()); - } - File directories[] = directory.listFiles(new SimpleDirectoryFilter()); - for (File directory1 : directories) { - ArrayUtils.addArray(list, getRecursiveFileList(directory1, filter)); - } - File files[] = directory.listFiles(filter); - ArrayUtils.addArray(list, files); - return list.toArray(new File[list.size()]); + public static File[] getRecursiveFileList(File directory, FileFilter filter) { + ArrayList list = new ArrayList<>(); + if (!directory.isDirectory()) { + throw new Error("File is not a directory: " + directory.getName()); } - - public static void writeFile(File file, String text) throws IOException { - Asserts.assertNotNull("Writing to file: " + file, text); - file.getCanonicalFile().getParentFile().mkdirs(); - BufferedWriter out = new BufferedWriter(new FileWriter(file)); - out.write(text); - out.close(); + File directories[] = directory.listFiles(new SimpleDirectoryFilter()); + for (File directory1 : directories) { + ArrayUtils.addArray(list, getRecursiveFileList(directory1, filter)); } + File files[] = directory.listFiles(filter); + ArrayUtils.addArray(list, files); + return list.toArray(new File[list.size()]); + } - public static void writeFileQuietly(File file, String text) { - try { - writeFile(file, text); - } catch (IOException e) { - ObjectUtils.throwAsError(e); - } - } + public static void writeFile(File file, String text) throws IOException { + Asserts.assertNotNull("Writing to file: " + file, text); + file.getCanonicalFile().getParentFile().mkdirs(); + BufferedWriter out = new BufferedWriter(new FileWriter(file)); + out.write(text); + out.close(); + } - public static String readFile(String absolutePath) throws IOException { - return readFile(new File(absolutePath)); + public static void writeFileQuietly(File file, String text) { + try { + writeFile(file, text); + } catch (IOException e) { + ObjectUtils.throwAsError(e); } + } - public static String readFile(File file) throws IOException { - BufferedReader in = new BufferedReader(new FileReader(file)); - return readBuffer(in); - } + public static String readFile(String absolutePath) throws IOException { + return readFile(new File(absolutePath)); + } - public static String readBuffer(BufferedReader in) throws IOException { - StringBuilder string = new StringBuilder(); - while (in.ready()) { - string.append(in.readLine()); - string.append("\n"); - } - in.close(); - return string.toString(); - } + public static String readFile(File file) throws IOException { + BufferedReader in = new BufferedReader(new FileReader(file)); + return readBuffer(in); + } - public static String readFileWithSuppressedExceptions(File databaseFile) { - try { - return FileUtils.readFile(databaseFile); - } catch (FileNotFoundException e) { - throw new RuntimeException("Invalid file '" + databaseFile.getAbsolutePath() + "'", e); - } catch (IOException e) { - throw new RuntimeException(e); - } + public static String readBuffer(BufferedReader in) throws IOException { + StringBuilder string = new StringBuilder(); + while (in.ready()) { + string.append(in.readLine()); + string.append("\n"); } + in.close(); + return string.toString(); + } - public static String getExtensionWithDot(String filename) { - int p = filename.lastIndexOf('.'); - return filename.substring(p); + public static String readFileWithSuppressedExceptions(File databaseFile) { + try { + return FileUtils.readFile(databaseFile); + } catch (FileNotFoundException e) { + throw new RuntimeException("Invalid file '" + + databaseFile.getAbsolutePath() + "'", e); + } catch (IOException e) { + throw new RuntimeException(e); } + } - public static void createIfNeeded(String file) throws IOException { - File f = new File(file); - if (!f.exists()) { - writeFile(f, ""); - } - } + public static String getExtensionWithDot(String filename) { + int p = filename.lastIndexOf('.'); + return filename.substring(p); + } - public static String readStream(InputStream resourceAsStream) { - BufferedReader reader = new BufferedReader(new InputStreamReader(resourceAsStream)); - String resource = null; - try { - resource = FileUtils.readBuffer(reader); - } catch (IOException e) { - ObjectUtils.throwAsError(e); - } - return resource; + public static void createIfNeeded(String file) throws IOException { + File f = new File(file); + if (!f.exists()) { + writeFile(f, ""); } + } - public static boolean isNonEmptyFile(String approved) { - File file = new File(approved); - return file.exists() && file.length() > 0; + public static String readStream(InputStream resourceAsStream) { + BufferedReader reader = new BufferedReader(new InputStreamReader( + resourceAsStream)); + String resource = null; + try { + resource = FileUtils.readBuffer(reader); + } catch (IOException e) { + ObjectUtils.throwAsError(e); } + return resource; + } + + public static boolean isNonEmptyFile(String approved) { + File file = new File(approved); + return file.exists() && file.length() > 0; + } } \ No newline at end of file diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/persistence/SavingException.java b/src/main/java/org/teachingextensions/approvals/lite/util/persistence/SavingException.java index d6566c9..c4fda0b 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/persistence/SavingException.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/persistence/SavingException.java @@ -1,4 +1,5 @@ package org.teachingextensions.approvals.lite.util.persistence; public class SavingException extends RuntimeException { + private static final long serialVersionUID = -2338891777546763779L; } diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/servlets/InvokerServlet.java b/src/main/java/org/teachingextensions/approvals/lite/util/servlets/InvokerServlet.java index aaf3ed6..43a848e 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/servlets/InvokerServlet.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/servlets/InvokerServlet.java @@ -17,83 +17,91 @@ * limitations under the License. */ -import org.teachingextensions.approvals.lite.util.MySystem; -import org.teachingextensions.approvals.lite.util.ObjectUtils; +import java.io.IOException; +import java.util.HashMap; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.util.HashMap; + +import org.teachingextensions.approvals.lite.util.MySystem; +import org.teachingextensions.approvals.lite.util.ObjectUtils; /** - * The default servlet-invoking servlet for most web applications, - * used to serve requests to servlets that have not been registered - * in the web application deployment descriptor. + * The default servlet-invoking servlet for most web applications, used to serve + * requests to servlets that have not been registered in the web application + * deployment descriptor. * * @author Craig R. McClanahan * @version $Revision$ $Date$ */ public final class InvokerServlet extends HttpServlet { - HashMap servlets = new HashMap<>(); - private String mask; + private static final long serialVersionUID = 7573882633420881472L; + HashMap servlets = new HashMap<>(); + private String mask; - public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { - serveRequest(request, response); - } + @Override + public void doGet(HttpServletRequest request, HttpServletResponse response) + throws IOException, ServletException { + serveRequest(request, response); + } - public void doHead(HttpServletRequest request, HttpServletResponse response) throws IOException, - ServletException { - serveRequest(request, response); - } + @Override + public void doHead(HttpServletRequest request, HttpServletResponse response) + throws IOException, ServletException { + serveRequest(request, response); + } - public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, - ServletException { - serveRequest(request, response); - } + @Override + public void doPost(HttpServletRequest request, HttpServletResponse response) + throws IOException, ServletException { + serveRequest(request, response); + } - /** - * Initialize this servlet. - */ - public void init() throws ServletException { - mask = getServletConfig().getInitParameter("mask"); - MySystem.variable("Mask", mask); - } + /** + * Initialize this servlet. + */ + @Override + public void init() throws ServletException { + mask = getServletConfig().getInitParameter("mask"); + MySystem.variable("Mask", mask); + } - public void destroy() { - for (HttpServlet servlet : servlets.values()) { - servlet.destroy(); - } - super.destroy(); + @Override + public void destroy() { + for (HttpServlet servlet : servlets.values()) { + servlet.destroy(); } + super.destroy(); + } - public void serveRequest(HttpServletRequest request, HttpServletResponse response) throws IOException, - ServletException { - String pathInfo = request.getPathInfo(); - String servletClass = pathInfo.substring(1); - int slash = servletClass.indexOf('/'); - if (slash >= 0) { - servletClass = servletClass.substring(0, slash); - } + public void serveRequest(HttpServletRequest request, + HttpServletResponse response) throws IOException, ServletException { + String pathInfo = request.getPathInfo(); + String servletClass = pathInfo.substring(1); + int slash = servletClass.indexOf('/'); + if (slash >= 0) { + servletClass = servletClass.substring(0, slash); + } - if (!servletClass.startsWith(mask)) { - response.sendError(HttpServletResponse.SC_NOT_FOUND, servletClass); - return; - } - HttpServlet servlet; - synchronized (this) { - servlet = servlets.get(servletClass); - if (servlet == null) { - try { - servlet = (HttpServlet) Class.forName(servletClass).newInstance(); - servlet.init(getServletConfig()); - } catch (Throwable e) { - ObjectUtils.throwAsError(e); - } - servlets.put(servletClass, servlet); - } + if (!servletClass.startsWith(mask)) { + response.sendError(HttpServletResponse.SC_NOT_FOUND, servletClass); + return; + } + HttpServlet servlet; + synchronized (this) { + servlet = servlets.get(servletClass); + if (servlet == null) { + try { + servlet = (HttpServlet) Class.forName(servletClass).newInstance(); + servlet.init(getServletConfig()); + } catch (Throwable e) { + ObjectUtils.throwAsError(e); } - servlet.service(request, response); + servlets.put(servletClass, servlet); + } } + servlet.service(request, response); + } } diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/servlets/ValidationError.java b/src/main/java/org/teachingextensions/approvals/lite/util/servlets/ValidationError.java index a2db618..73238e6 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/servlets/ValidationError.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/servlets/ValidationError.java @@ -1,84 +1,86 @@ package org.teachingextensions.approvals.lite.util.servlets; -import org.teachingextensions.approvals.lite.util.StringUtils; - import java.util.HashMap; import java.util.HashSet; +import org.teachingextensions.approvals.lite.util.StringUtils; + public class ValidationError extends RuntimeException { - private static final long serialVersionUID = 7940285202708976073L; - private HashMap errors = new HashMap<>(); - private HashSet assertions = null; - - public ValidationError(Enum enumerations[]) { - this.assertions = new HashSet<>(); - for (Enum e : enumerations) { - this.assertions.add(e.toString()); - } + private static final long serialVersionUID = 7940285202708976073L; + private HashMap errors = new HashMap<>(); + private HashSet assertions = null; + + public ValidationError(Enum enumerations[]) { + this.assertions = new HashSet<>(); + for (Enum e : enumerations) { + this.assertions.add(e.toString()); } - - public String getMessage() { - return toString(); + } + + @Override + public String getMessage() { + return toString(); + } + + @Override + public String toString() { + return "Validation(s) failed " + errors.keySet().toString() + " - " + + errors.values().toString(); + } + + public void set(Enum assertion, boolean isOk, String errorDescription) { + setError(assertion.toString(), !isOk, errorDescription); + } + + public void setError(String assertion, boolean isError, + String errorDescription) { + if (isError && !StringUtils.isNonZero(errorDescription)) { + throw new Error("You can not use empty error descriptions"); } - - public String toString() { - return "Validation(s) failed " + errors.keySet().toString() + " - " - + errors.values().toString(); + assertValidAssertion(assertion); + if (isError) { + errors.put(assertion, errorDescription); + } else { + errors.remove(assertion); } + } - public void set(Enum assertion, boolean isOk, String errorDescription) { - setError(assertion.toString(), !isOk, errorDescription); - } + public ValidationError add(String prefix, int index, ValidationError error) { + return add(getPrefixForIndex(prefix, index), error); + } - public void setError(String assertion, boolean isError, - String errorDescription) { - if (isError && !StringUtils.isNonZero(errorDescription)) { - throw new Error("You can not use empty error descriptions"); - } - assertValidAssertion(assertion); - if (isError) { - errors.put(assertion, errorDescription); - } else { - errors.remove(assertion); - } - } + public static String getPrefixForIndex(String prefix, int index) { + return prefix + "[" + index + "]"; + } - public ValidationError add(String prefix, int index, ValidationError error) { - return add(getPrefixForIndex(prefix, index), error); - } + public ValidationError add(String prefix, ValidationError error) { + prefix = StringUtils.isEmpty(prefix) ? "" : (prefix + "."); + String[] assertions = StringUtils.toArray(error.assertions); - public static String getPrefixForIndex(String prefix, int index) { - return prefix + "[" + index + "]"; + for (String assertion : assertions) { + this.assertions.add(prefix + assertion); } - public ValidationError add(String prefix, ValidationError error) { - prefix = StringUtils.isEmpty(prefix) ? "" : (prefix + "."); - String[] assertions = StringUtils.toArray(error.assertions); - - for (String assertion : assertions) { - this.assertions.add(prefix + assertion); - } - - for (String key : error.errors.keySet()) { - errors.put(prefix + key, error.errors.get(key)); - } - - return this; + for (String key : error.errors.keySet()) { + errors.put(prefix + key, error.errors.get(key)); } - public boolean isOk() { - return errors.size() == 0; - } + return this; + } - private void assertValidAssertion(String assertion) { - if (!this.assertions.contains(assertion)) { - throw new Error("Assertion '" + assertion + "' not found from " - + assertions.toString()); - } - } + public boolean isOk() { + return errors.size() == 0; + } - public int size() { - return errors.size(); + private void assertValidAssertion(String assertion) { + if (!this.assertions.contains(assertion)) { + throw new Error("Assertion '" + assertion + "' not found from " + + assertions.toString()); } + } + + public int size() { + return errors.size(); + } } \ No newline at end of file diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/velocity/TestableUberspect.java b/src/main/java/org/teachingextensions/approvals/lite/util/velocity/TestableUberspect.java index a0e946d..f6aebf1 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/velocity/TestableUberspect.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/velocity/TestableUberspect.java @@ -1,5 +1,12 @@ package org.teachingextensions.approvals.lite.util.velocity; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Enumeration; +import java.util.Iterator; +import java.util.Map; + import org.apache.velocity.runtime.RuntimeLogger; import org.apache.velocity.runtime.parser.node.AbstractExecutor; import org.apache.velocity.runtime.parser.node.BooleanPropertyExecutor; @@ -7,12 +14,16 @@ import org.apache.velocity.runtime.parser.node.PropertyExecutor; import org.apache.velocity.util.ArrayIterator; import org.apache.velocity.util.EnumerationIterator; -import org.apache.velocity.util.introspection.*; +import org.apache.velocity.util.introspection.Info; +import org.apache.velocity.util.introspection.Introspector; +import org.apache.velocity.util.introspection.IntrospectorBase; +import org.apache.velocity.util.introspection.Uberspect; +import org.apache.velocity.util.introspection.UberspectLoggable; +import org.apache.velocity.util.introspection.VelMethod; +import org.apache.velocity.util.introspection.VelPropertyGet; +import org.apache.velocity.util.introspection.VelPropertySet; import org.teachingextensions.approvals.lite.util.ObjectUtils; -import java.lang.reflect.Method; -import java.util.*; - /** * Implementation of Uberspect to provide the default introspective * functionality of Velocity @@ -21,207 +32,234 @@ * @version $Id: UberspectImpl.java,v 1.2.4.1 2004/03/03 23:23:08 geirm Exp $ */ public class TestableUberspect implements Uberspect, UberspectLoggable { - /** - * the default Velocity introspector - */ - private static IntrospectorBase introspector; - private static Introspector introspectorWithLog; - private RuntimeLogger log; - /***********************************************************************/ - /** - * init - does nothing - we need to have setRuntimeLogger - * called before getting our introspector, as the default - * vel introspector depends upon it.; - */ - public void init() throws Exception { - } - - public void setRuntimeLogger(RuntimeLogger runtimeLogger) { - introspector = new IntrospectorBase(); - introspectorWithLog = new Introspector(runtimeLogger); - log = runtimeLogger; - } - - public Iterator getIterator(Object obj, Info i) throws Exception { - return getStandardIterator(obj, i); - } - - public static Iterator getStandardIterator(Object obj, Info i) { - if (obj.getClass().isArray()) { - return new ArrayIterator(obj); - } else if (obj instanceof Collection) { - return ((Collection) obj).iterator(); - } else if (obj instanceof Map) { - return ((Map) obj).values().iterator(); - } else if (obj instanceof Iterator) { - return ((Iterator) obj); - } else if (obj instanceof Enumeration) { - return new EnumerationIterator((Enumeration) obj); - } - throw new VelocityParsingError("Could not determine type of iterator in " + "#foreach loop ", i); - } + /** + * the default Velocity introspector + */ + private static IntrospectorBase introspector; + private static Introspector introspectorWithLog; + private RuntimeLogger log; - public VelMethod getMethod(Object obj, String methodName, Object[] args, Info i) throws Exception { - if (obj == null) { - throw new VelocityParsingError("tried " + getMethodText("null", methodName, args), i); - } - Method m = introspector.getMethod(obj.getClass(), methodName, args); - if (m == null) { - throw new VelocityParsingError("Method " + getMethodText(obj.getClass().getName(), methodName, args) + " does not exist.", i); - } - return new VelMethodImpl(m); + /***********************************************************************/ + /** + * init - does nothing - we need to have setRuntimeLogger called before + * getting our introspector, as the default vel introspector depends upon it.; + */ + @Override + public void init() throws Exception { + } + + @Override + public void setRuntimeLogger(RuntimeLogger runtimeLogger) { + introspector = new IntrospectorBase(); + introspectorWithLog = new Introspector(runtimeLogger); + log = runtimeLogger; + } + + @Override + public Iterator getIterator(Object obj, Info i) throws Exception { + return getStandardIterator(obj, i); + } + + public static Iterator getStandardIterator(Object obj, Info i) { + if (obj.getClass().isArray()) { + return new ArrayIterator(obj); + } else if (obj instanceof Collection) { + return ((Collection) obj).iterator(); + } else if (obj instanceof Map) { + return ((Map) obj).values().iterator(); + } else if (obj instanceof Iterator) { + return ((Iterator) obj); + } else if (obj instanceof Enumeration) { + return new EnumerationIterator((Enumeration) obj); } + throw new VelocityParsingError("Could not determine type of iterator in " + + "#foreach loop ", i); + } - public static String getMethodText(String className, String methodName, Object[] args) { - StringBuilder methodSignature = new StringBuilder(); - for (int i = 0; args != null && i < args.length; i++) { - methodSignature.append(ObjectUtils.getClassName(args[i])); - methodSignature.append(i == (args.length - 1) ? "" : ", "); - } - return className + "." + methodName + "(" + methodSignature + ") "; + @Override + public VelMethod getMethod(Object obj, String methodName, Object[] args, + Info i) throws Exception { + if (obj == null) { + throw new VelocityParsingError("tried " + + getMethodText("null", methodName, args), i); + } + Method m = introspector.getMethod(obj.getClass(), methodName, args); + if (m == null) { + throw new VelocityParsingError("Method " + + getMethodText(obj.getClass().getName(), methodName, args) + + " does not exist.", i); } + return new VelMethodImpl(m); + } - public VelPropertyGet getPropertyGet(Object obj, String identifier, Info i) throws Exception { - AbstractExecutor executor; - if (obj == null) { - throw new VelocityParsingError("tried " + getPropertyText("null", identifier), i); - } - Class type = obj.getClass(); - // trying getFoo() - executor = new PropertyExecutor(log, introspectorWithLog, type, identifier); - if (!executor.isAlive()) { - // trying get("foo") - executor = new GetExecutor(log, introspectorWithLog, type, identifier); - } - if (!executor.isAlive()) { - // trying isFoo() - executor = new BooleanPropertyExecutor(log, introspectorWithLog, type, identifier); - } - if (!executor.isAlive()) { - throw new VelocityParsingError("Did not find " + getPropertyText(obj.getClass().getName(), identifier), i); - } - return new VelGetterImpl(executor); + public static String getMethodText(String className, String methodName, + Object[] args) { + StringBuilder methodSignature = new StringBuilder(); + for (int i = 0; args != null && i < args.length; i++) { + methodSignature.append(ObjectUtils.getClassName(args[i])); + methodSignature.append(i == (args.length - 1) ? "" : ", "); } + return className + "." + methodName + "(" + methodSignature + ") "; + } - private String getPropertyText(String className, String identifier) { - return className + "." + identifier + " "; + @Override + public VelPropertyGet getPropertyGet(Object obj, String identifier, Info i) + throws Exception { + AbstractExecutor executor; + if (obj == null) { + throw new VelocityParsingError("tried " + + getPropertyText("null", identifier), i); + } + Class type = obj.getClass(); + // trying getFoo() + executor = new PropertyExecutor(log, introspectorWithLog, type, identifier); + if (!executor.isAlive()) { + // trying get("foo") + executor = new GetExecutor(log, introspectorWithLog, type, identifier); + } + if (!executor.isAlive()) { + // trying isFoo() + executor = new BooleanPropertyExecutor(log, introspectorWithLog, type, + identifier); } + if (!executor.isAlive()) { + throw new VelocityParsingError("Did not find " + + getPropertyText(obj.getClass().getName(), identifier), i); + } + return new VelGetterImpl(executor); + } + + private String getPropertyText(String className, String identifier) { + return className + "." + identifier + " "; + } - public VelPropertySet getPropertySet(Object obj, String identifier, Object arg, Info i) throws Exception { - Class type = obj.getClass(); - VelMethod vm = null; - try { + @Override + public VelPropertySet getPropertySet(Object obj, String identifier, + Object arg, Info i) throws Exception { + Class type = obj.getClass(); + VelMethod vm = null; + try { /* - * first, we introspect for the set setter method + * first, we introspect for the set setter method */ - Object[] params = {arg}; - try { - vm = getMethod(obj, "set" + identifier, params, i); - if (vm == null) { - throw new NoSuchMethodException(); - } - } catch (NoSuchMethodException e) { - StringBuilder sb = new StringBuilder("set"); - sb.append(identifier); - if (Character.isLowerCase(sb.charAt(3))) { - sb.setCharAt(3, Character.toUpperCase(sb.charAt(3))); - } else { - sb.setCharAt(3, Character.toLowerCase(sb.charAt(3))); - } - vm = getMethod(obj, sb.toString(), params, i); - if (vm == null) { - throw new NoSuchMethodException(); - } - } - } catch (NoSuchMethodException e) { + Object[] params = { arg }; + try { + vm = getMethod(obj, "set" + identifier, params, i); + if (vm == null) { + throw new NoSuchMethodException(); + } + } catch (NoSuchMethodException e) { + StringBuilder sb = new StringBuilder("set"); + sb.append(identifier); + if (Character.isLowerCase(sb.charAt(3))) { + sb.setCharAt(3, Character.toUpperCase(sb.charAt(3))); + } else { + sb.setCharAt(3, Character.toLowerCase(sb.charAt(3))); + } + vm = getMethod(obj, sb.toString(), params, i); + if (vm == null) { + throw new NoSuchMethodException(); + } + } + } catch (NoSuchMethodException e) { /* - * right now, we only support the Map interface + * right now, we only support the Map interface */ - if (Map.class.isAssignableFrom(type)) { - Object[] params = {new Object(), new Object()}; - vm = getMethod(obj, "put", params, i); - if (vm != null) - return new VelSetterImpl(vm, identifier); - } - } - return (vm != null) ? new VelSetterImpl(vm) : null; + if (Map.class.isAssignableFrom(type)) { + Object[] params = { new Object(), new Object() }; + vm = getMethod(obj, "put", params, i); + if (vm != null) + return new VelSetterImpl(vm, identifier); + } } + return (vm != null) ? new VelSetterImpl(vm) : null; + } - public static class VelMethodImpl implements VelMethod { - Method method = null; + public static class VelMethodImpl implements VelMethod { + Method method = null; - public VelMethodImpl(Method m) { - method = m; - } + public VelMethodImpl(Method m) { + method = m; + } - public Object invoke(Object o, Object[] params) throws Exception { - return method.invoke(o, params); - } + @Override + public Object invoke(Object o, Object[] params) throws Exception { + return method.invoke(o, params); + } - public boolean isCacheable() { - return true; - } + @Override + public boolean isCacheable() { + return true; + } - public String getMethodName() { - return method.getName(); - } + @Override + public String getMethodName() { + return method.getName(); + } - public Class getReturnType() { - return method.getReturnType(); - } + @Override + public Class getReturnType() { + return method.getReturnType(); } + } - public static class VelGetterImpl implements VelPropertyGet { - AbstractExecutor ae = null; + public static class VelGetterImpl implements VelPropertyGet { + AbstractExecutor ae = null; - public VelGetterImpl(AbstractExecutor exec) { - ae = exec; - } + public VelGetterImpl(AbstractExecutor exec) { + ae = exec; + } - public Object invoke(Object o) throws Exception { - return ae.execute(o); - } + @Override + public Object invoke(Object o) throws Exception { + return ae.execute(o); + } - public boolean isCacheable() { - return true; - } + @Override + public boolean isCacheable() { + return true; + } - public String getMethodName() { - return ae.getMethod().getName(); - } + @Override + public String getMethodName() { + return ae.getMethod().getName(); } + } - public static class VelSetterImpl implements VelPropertySet { - VelMethod vm = null; - String putKey = null; + public static class VelSetterImpl implements VelPropertySet { + VelMethod vm = null; + String putKey = null; - public VelSetterImpl(VelMethod velmethod) { - this.vm = velmethod; - } + public VelSetterImpl(VelMethod velmethod) { + this.vm = velmethod; + } - public VelSetterImpl(VelMethod velmethod, String key) { - this.vm = velmethod; - putKey = key; - } + public VelSetterImpl(VelMethod velmethod, String key) { + this.vm = velmethod; + putKey = key; + } - public Object invoke(Object o, Object value) throws Exception { - ArrayList al = new ArrayList<>(); - if (putKey != null) { - al.add(putKey); - al.add(value); - } else { - al.add(value); - } - return vm.invoke(o, al.toArray()); - } + @Override + public Object invoke(Object o, Object value) throws Exception { + ArrayList al = new ArrayList<>(); + if (putKey != null) { + al.add(putKey); + al.add(value); + } else { + al.add(value); + } + return vm.invoke(o, al.toArray()); + } - public boolean isCacheable() { - return true; - } + @Override + public boolean isCacheable() { + return true; + } - public String getMethodName() { - return vm.getMethodName(); - } + @Override + public String getMethodName() { + return vm.getMethodName(); } + } } diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/velocity/VelocityParser.java b/src/main/java/org/teachingextensions/approvals/lite/util/velocity/VelocityParser.java index 1c42063..159d224 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/velocity/VelocityParser.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/velocity/VelocityParser.java @@ -1,5 +1,10 @@ package org.teachingextensions.approvals.lite.util.velocity; +import java.io.StringWriter; +import java.io.Writer; +import java.util.Enumeration; +import java.util.Properties; + import org.apache.log4j.Level; import org.apache.log4j.LogManager; import org.apache.log4j.Logger; @@ -13,81 +18,89 @@ import org.teachingextensions.approvals.lite.util.ParserCommons; import org.teachingextensions.approvals.lite.util.io.FileUtils; -import java.io.StringWriter; -import java.io.Writer; -import java.util.Enumeration; -import java.util.Properties; - public class VelocityParser { - private static VelocityEngine currentEngine = null; + private static VelocityEngine currentEngine = null; - static { - for (Enumeration e = LogManager.getCurrentLoggers(); e.hasMoreElements(); ) { - ((Logger) e.nextElement()).setLevel(Level.OFF); - } + static { + for (Enumeration e = LogManager.getCurrentLoggers(); e.hasMoreElements();) { + ((Logger) e.nextElement()).setLevel(Level.OFF); } + } - public static String parseString(String template, ContextAware process) { - Properties props = new Properties(); - props.put("resource.loader", "class"); - props.put("class.resource.loader.class", StringResourceLoader.class.getName()); - props.put("velocimacro.context.localscope", "" + true); - props.put("runtime.introspector.uberspect", TestableUberspect.class.getName()); - props.put("velocimacro.permissions.allow.inline.local.scope", "" + true); - return parse(template, props, new ContextAware[]{process, Default.INSTANCE}); - } + public static String parseString(String template, ContextAware process) { + Properties props = new Properties(); + props.put("resource.loader", "class"); + props.put("class.resource.loader.class", + StringResourceLoader.class.getName()); + props.put("velocimacro.context.localscope", "" + true); + props.put("runtime.introspector.uberspect", + TestableUberspect.class.getName()); + props.put("velocimacro.permissions.allow.inline.local.scope", "" + true); + return parse(template, props, new ContextAware[] { process, + Default.INSTANCE }); + } - public static String parse(String template, Properties props, ContextAware[] process) { - StringWriter out = new StringWriter(); - parse(template, props, process, out); - return out.toString(); - } + public static String parse(String template, Properties props, + ContextAware[] process) { + StringWriter out = new StringWriter(); + parse(template, props, process, out); + return out.toString(); + } - public static Writer parse(String template, Properties props, ContextAware process[], Writer out) { - try { - props.put("directive.foreach.counter.initial.value", "0"); - props.put(RuntimeConstants.RUNTIME_LOG_LOGSYSTEM_CLASS, NullLogSystem.class.getName()); - VelocityEngine engine = initializeEngine(props); - VelocityContext context = new VelocityContext(); - Template velocityTemplate = engine.getTemplate(template); - for (ContextAware p : process) { - if (p != null) p.setupContext(context); - } - velocityTemplate.merge(context, out); - return out; - } catch (Exception e) { - throw ObjectUtils.throwAsError(e); - } + public static Writer parse(String template, Properties props, + ContextAware process[], Writer out) { + try { + props.put("directive.foreach.counter.initial.value", "0"); + props.put(RuntimeConstants.RUNTIME_LOG_LOGSYSTEM_CLASS, + NullLogSystem.class.getName()); + VelocityEngine engine = initializeEngine(props); + VelocityContext context = new VelocityContext(); + Template velocityTemplate = engine.getTemplate(template); + for (ContextAware p : process) { + if (p != null) + p.setupContext(context); + } + velocityTemplate.merge(context, out); + return out; + } catch (Exception e) { + throw ObjectUtils.throwAsError(e); } + } - public static synchronized VelocityEngine initializeEngine(Properties props) throws Exception { - if (currentEngine == null || isDifferentForProperties(props, currentEngine, new String[]{"resource.loader", "file.resource.loader.path"})) { - currentEngine = new VelocityEngine(); - currentEngine.init(props); - } - return currentEngine; + public static synchronized VelocityEngine initializeEngine(Properties props) + throws Exception { + if (currentEngine == null + || isDifferentForProperties(props, currentEngine, new String[] { + "resource.loader", "file.resource.loader.path" })) { + currentEngine = new VelocityEngine(); + currentEngine.init(props); } + return currentEngine; + } - private static boolean isDifferentForProperties(Properties props, VelocityEngine engine, String[] keys) { - for (String key : keys) { - if (!ObjectUtils.isEqual(props.get(key), engine.getProperty(key))) { - return true; - } - } - return false; + private static boolean isDifferentForProperties(Properties props, + VelocityEngine engine, String[] keys) { + for (String key : keys) { + if (!ObjectUtils.isEqual(props.get(key), engine.getProperty(key))) { + return true; + } } + return false; + } - public static class Default implements ContextAware { - public static ContextAware INSTANCE = new Default(); + public static class Default implements ContextAware { + public static ContextAware INSTANCE = new Default(); - public void setupContext(Context context) { - context.put("commons", ParserCommons.INSTANCE); - } + @Override + public void setupContext(Context context) { + context.put("commons", ParserCommons.INSTANCE); } + } - public static String parseFromClassPath(Class clazz, String string, ContextAware context) { - String resource = FileUtils.readFromClassPath(clazz, string); - return parseString(resource, context); - } + public static String parseFromClassPath(Class clazz, String string, + ContextAware context) { + String resource = FileUtils.readFromClassPath(clazz, string); + return parseString(resource, context); + } } diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/velocity/VelocityParsingError.java b/src/main/java/org/teachingextensions/approvals/lite/util/velocity/VelocityParsingError.java index 0f37d08..65bf671 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/velocity/VelocityParsingError.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/velocity/VelocityParsingError.java @@ -4,20 +4,23 @@ public class VelocityParsingError extends Error { - private String message; - private transient Info info; + private static final long serialVersionUID = -6815526646140474951L; + private String message; + private transient Info info; - public VelocityParsingError(String message, Info info) { - this.message = message; - this.info = info; - } + public VelocityParsingError(String message, Info info) { + this.message = message; + this.info = info; + } - public String getMessage() { - return message + " " + getInfoText(info); - } + @Override + public String getMessage() { + return message + " " + getInfoText(info); + } - public static String getInfoText(Info i) { - return " at [" + i.getLine() + "," + i.getColumn() + "]" + " in template " + i.getTemplateName(); - } + public static String getInfoText(Info i) { + return " at [" + i.getLine() + "," + i.getColumn() + "]" + " in template " + + i.getTemplateName(); + } } diff --git a/src/main/java/org/teachingextensions/logo/ImageBackground.java b/src/main/java/org/teachingextensions/logo/ImageBackground.java index fb44a20..9fa6c4d 100644 --- a/src/main/java/org/teachingextensions/logo/ImageBackground.java +++ b/src/main/java/org/teachingextensions/logo/ImageBackground.java @@ -2,7 +2,6 @@ import java.awt.Graphics2D; import java.awt.Image; -import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.net.URL; @@ -11,27 +10,22 @@ import org.teachingextensions.approvals.lite.util.ObjectUtils; -public class ImageBackground implements Paintable -{ +public class ImageBackground implements Paintable { private BufferedImage image; - public ImageBackground(String uri) - { - try - { + + public ImageBackground(String uri) { + try { URL url = new URL(uri); image = ImageIO.read(url); - } - catch (Throwable e) - { + } catch (Throwable e) { throw ObjectUtils.throwAsError(e); } } + @Override - public void paint(Graphics2D g, JPanel caller) - { - Rectangle bounds = g.getClipBounds(); + public void paint(Graphics2D g, JPanel caller) { Image img = image; - g.drawImage(img, 0, 0, caller.getWidth(), caller.getHeight(), 0, 0, img.getWidth(null), img.getHeight(null), - null); + g.drawImage(img, 0, 0, caller.getWidth(), caller.getHeight(), 0, 0, + img.getWidth(null), img.getHeight(null), null); } } diff --git a/src/main/java/org/teachingextensions/logo/PuzzleBoard.java b/src/main/java/org/teachingextensions/logo/PuzzleBoard.java index 5f054de..2707c4b 100644 --- a/src/main/java/org/teachingextensions/logo/PuzzleBoard.java +++ b/src/main/java/org/teachingextensions/logo/PuzzleBoard.java @@ -1,16 +1,20 @@ package org.teachingextensions.logo; -import javax.swing.*; -import java.awt.*; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Point; import java.util.ArrayDeque; import java.util.Arrays; import java.util.Queue; +import javax.swing.JPanel; + /** * Draws and animates a 9-puzzle */ public class PuzzleBoard extends JPanel { - private final static int blank = 8; + private static final long serialVersionUID = -2008156268412728375L; + private final static int blank = 8; private final Tile[] tiles; private final Queue solution; @@ -20,7 +24,8 @@ public PuzzleBoard(Puzzle puzzle, PuzzleState solution) { this.tiles = createTiles(puzzle.getCells()); } - private static Queue createSolution(PuzzleState solution, Puzzle puzzle) { + private static Queue createSolution(PuzzleState solution, + Puzzle puzzle) { if (solution == null) { return new ArrayDeque<>(); } diff --git a/src/main/java/org/teachingextensions/logo/PuzzleWindow.java b/src/main/java/org/teachingextensions/logo/PuzzleWindow.java index 79b0461..4d96496 100644 --- a/src/main/java/org/teachingextensions/logo/PuzzleWindow.java +++ b/src/main/java/org/teachingextensions/logo/PuzzleWindow.java @@ -1,13 +1,15 @@ package org.teachingextensions.logo; -import org.teachingextensions.windows.ProgramWindow; +import java.awt.BorderLayout; -import java.awt.*; +import org.teachingextensions.windows.ProgramWindow; /** * A program window for a 9-puzzle */ public class PuzzleWindow extends ProgramWindow { + private static final long serialVersionUID = 5190374287165209356L; + public PuzzleWindow() { super("Puzzle"); this.setLayout(new BorderLayout()); diff --git a/src/main/java/org/teachingextensions/setup/CommandLineUtils.java b/src/main/java/org/teachingextensions/setup/CommandLineUtils.java index bacad17..37fab17 100644 --- a/src/main/java/org/teachingextensions/setup/CommandLineUtils.java +++ b/src/main/java/org/teachingextensions/setup/CommandLineUtils.java @@ -4,17 +4,13 @@ import org.teachingextensions.approvals.lite.util.ObjectUtils; -public class CommandLineUtils -{ - public static void launch(String commandLine, String... formattingArguments) - { - try - { - String command = String.format(commandLine, (Object[]) formattingArguments); - Process exec = Runtime.getRuntime().exec(command); - } - catch (IOException e) - { +public class CommandLineUtils { + public static void launch(String commandLine, String... formattingArguments) { + try { + String command = String.format(commandLine, + (Object[]) formattingArguments); + Runtime.getRuntime().exec(command); + } catch (IOException e) { ObjectUtils.throwAsError(e); } } diff --git a/src/main/java/org/teachingextensions/setup/MacThumbDriveInstaller.java b/src/main/java/org/teachingextensions/setup/MacThumbDriveInstaller.java index 5f9c4d3..e322ea9 100644 --- a/src/main/java/org/teachingextensions/setup/MacThumbDriveInstaller.java +++ b/src/main/java/org/teachingextensions/setup/MacThumbDriveInstaller.java @@ -8,44 +8,44 @@ import org.teachingextensions.approvals.lite.util.ObjectUtils; import org.teachingextensions.approvals.lite.util.io.ZipUtils; -public class MacThumbDriveInstaller -{ - public void install() throws Exception - { +public class MacThumbDriveInstaller { + public void install() throws Exception { installEclipse(); installWorkspace(); launch(); } - private void launch() - { + + private void launch() { String command = "java -jar TKP_Launcher.jar"; - try - { - Process exec = Runtime.getRuntime().exec(command, null, - new File(getDesktop().getAbsolutePath() + "/TeachingKidsProgramming.Java-master")); - } - catch (IOException e) - { + try { + Runtime.getRuntime().exec( + command, + null, + new File(getDesktop().getAbsolutePath() + + "/TeachingKidsProgramming.Java-master")); + } catch (IOException e) { ObjectUtils.throwAsError(e); } } - private void installWorkspace() throws IOException - { + + private void installWorkspace() throws IOException { File zipFile = new File("./TeachingKidsProgramming.Java-master.zip"); File unzipTo = getDesktop(); System.out.println("Unzip to " + unzipTo); ZipUtils.doUnzip(unzipTo, zipFile); } - public File getDesktop() - { + + public File getDesktop() { File homeDirectory = FileSystemView.getFileSystemView().getHomeDirectory(); File unzipTo = new File(homeDirectory.getAbsolutePath() + "/Desktop"); return unzipTo; } - private void installEclipse() throws Exception - { + + private void installEclipse() throws Exception { File installDir = new File("/Applications/Eclipse"); - if (installDir.exists()) { return; } + if (installDir.exists()) { + return; + } ZipUtils.doUnzip(new File("/Applications"), new File("./eclipse-mac.zip")); } } diff --git a/src/main/java/org/teachingkidsprogramming/recipes/completed/ConnectTheDots.java b/src/main/java/org/teachingkidsprogramming/recipes/completed/ConnectTheDots.java index 154b8a2..f51a9d9 100644 --- a/src/main/java/org/teachingkidsprogramming/recipes/completed/ConnectTheDots.java +++ b/src/main/java/org/teachingkidsprogramming/recipes/completed/ConnectTheDots.java @@ -15,7 +15,7 @@ public class ConnectTheDots implements MouseRightClickListener, MouseLeftClickLi public static void main(String[] args) { //Create new a 'Connect the Dots' object. - ConnectTheDots dots = new ConnectTheDots(); + new ConnectTheDots(); } public ConnectTheDots() { @@ -31,7 +31,8 @@ public ConnectTheDots() prepareColorPalette(); } private static void prepareColorPalette() - { // ------------- Recipe for prepareColorPalette (HINT: Use PenColors) + { + // ------------- Recipe for prepareColorPalette (HINT: Use PenColors) // // Add red to the color wheel ColorWheel.addColor(PenColors.Reds.Red); diff --git a/src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleSolver.java b/src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleSolver.java deleted file mode 100644 index e7d6223..0000000 --- a/src/main/java/org/teachingkidsprogramming/section08tdd/PuzzleSolver.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.teachingkidsprogramming.section08tdd; - -import org.teachingextensions.logo.PuzzleBoard; - -/** - * Solves the puzzle using a player, then animates the solution. - */ -public class PuzzleSolver implements Runnable { - public PuzzleSolver(PuzzleBoard board) { - } - - @Override - public void run() { - - } -} diff --git a/src/test/java/org/teachingextensions/approvals/lite/util/ObjectUtilsTest.java b/src/test/java/org/teachingextensions/approvals/lite/util/ObjectUtilsTest.java deleted file mode 100644 index cad1f6e..0000000 --- a/src/test/java/org/teachingextensions/approvals/lite/util/ObjectUtilsTest.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.teachingextensions.approvals.lite.util; - -import junit.framework.TestCase; - -import java.lang.reflect.Method; -import java.util.ArrayList; - -public class ObjectUtilsTest extends TestCase { - public void testGreatestCommonDenominator() throws Exception { - Method gcd = ObjectUtils.getGreatestCommonDenominator(new Object[]{"this", new ArrayList<>()}, "getClass"); - assertEquals(Object.class, gcd.getDeclaringClass()); - } - - /** - * ******************************************************************** - */ - public static void main(String[] args) { - junit.textui.TestRunner.run(ObjectUtilsTest.class); - } - /***********************************************************************/ - /***********************************************************************/ -} diff --git a/src/test/java/org/teachingextensions/logo/PuzzleBoardTest.java b/src/test/java/org/teachingextensions/logo/PuzzleBoardTest.java index 4e14b0a..9de8bef 100644 --- a/src/test/java/org/teachingextensions/logo/PuzzleBoardTest.java +++ b/src/test/java/org/teachingextensions/logo/PuzzleBoardTest.java @@ -1,18 +1,20 @@ package org.teachingextensions.logo; +import org.junit.Ignore; import org.junit.Test; import org.teachingextensions.approvals.lite.Approvals; import org.teachingextensions.approvals.lite.reporters.FileLauncherReporter; import org.teachingextensions.approvals.lite.reporters.UseReporter; @UseReporter(FileLauncherReporter.class) +@Ignore public class PuzzleBoardTest { /** * A puzzle board shows the initial puzzle. */ @Test public void show_initial_puzzle() throws Exception { - int[] cells = {0, 1, 2, 3, 4, 5, 6, 7, 8}; + int[] cells = { 0, 1, 2, 3, 4, 5, 6, 7, 8 }; PuzzleBoard board = new PuzzleBoard(new Puzzle(cells), null); PuzzleWindow window = new PuzzleWindow(); window.add(board); @@ -24,7 +26,7 @@ public void show_initial_puzzle() throws Exception { */ @Test public void show_provided_puzzle() throws Exception { - int[] cells = {0, 1, 2, 3, 4, 5, 6, 8, 7}; + int[] cells = { 0, 1, 2, 3, 4, 5, 6, 8, 7 }; PuzzleBoard board = new PuzzleBoard(new Puzzle(cells), null); PuzzleWindow window = new PuzzleWindow(board); Approvals.verify(window); From 4889d7d691a03f05be03a7a968bf7b82954daeeb Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Mon, 23 Mar 2015 19:44:03 -0700 Subject: [PATCH 103/111] Cleanup warnings --- .settings/org.eclipse.jdt.core.prefs | 284 ++++++++++++++++++ .settings/org.eclipse.jdt.ui.prefs | 3 + .../quizzes/graders/AdLibsQuizGrader.java | 230 +++++++------- .../section02methods/DeepDive02Variables.java | 1 + .../section02methods/TriangleShell.java | 37 +-- .../section03ifs/DeepDive03Ifs.java | 1 + .../section05recursion/TurtleTree.java | 1 + .../DeepDive06ModelViewController.java | 1 + .../section07events/DeepDive07Events.java | 1 + .../section08tdd/DeepDive08TDD.java | 1 + .../section08tdd/SimplePuzzle.java | 60 ++-- .../DeepDive09exceptions.java | 3 +- .../approvals/lite/ReportInjectionTest.java | 4 +- .../approvals/lite/ReporterFactoryTest.java | 4 +- .../approvals/lite/util/TupleTest.java | 9 +- .../velocity/VelocityNullArgumentTest.java | 10 +- .../simpleparser/tests/ParserTest.java | 1 + .../recipes/quizzes/tests/HousesQuizTest.java | 2 + .../recipes/quizzes/tests/TreeQuizTest.java | 2 + 19 files changed, 482 insertions(+), 173 deletions(-) create mode 100644 .settings/org.eclipse.jdt.ui.prefs diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs index ec4300d..19db9b1 100644 --- a/.settings/org.eclipse.jdt.core.prefs +++ b/.settings/org.eclipse.jdt.core.prefs @@ -3,3 +3,287 @@ org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 org.eclipse.jdt.core.compiler.compliance=1.7 org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning org.eclipse.jdt.core.compiler.source=1.7 +org.eclipse.jdt.core.formatter.align_type_members_on_columns=true +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=2 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_assignment=0 +org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_if=52 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=48 +org.eclipse.jdt.core.formatter.alignment_for_enum_constants=18 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=82 +org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 +org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80 +org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=64 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=2 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=64 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16 +org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_after_package=1 +org.eclipse.jdt.core.formatter.blank_lines_before_field=0 +org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 +org.eclipse.jdt.core.formatter.blank_lines_before_imports=0 +org.eclipse.jdt.core.formatter.blank_lines_before_member_type=0 +org.eclipse.jdt.core.formatter.blank_lines_before_method=0 +org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=0 +org.eclipse.jdt.core.formatter.blank_lines_before_package=0 +org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 +org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 +org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_block=next_line +org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line +org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false +org.eclipse.jdt.core.formatter.comment.format_block_comments=false +org.eclipse.jdt.core.formatter.comment.format_header=false +org.eclipse.jdt.core.formatter.comment.format_html=true +org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=false +org.eclipse.jdt.core.formatter.comment.format_line_comments=false +org.eclipse.jdt.core.formatter.comment.format_source_code=true +org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true +org.eclipse.jdt.core.formatter.comment.indent_root_tags=true +org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert +org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert +org.eclipse.jdt.core.formatter.comment.line_length=80 +org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true +org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true +org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false +org.eclipse.jdt.core.formatter.compact_else_if=true +org.eclipse.jdt.core.formatter.continuation_indentation=2 +org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 +org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off +org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on +org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=true +org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true +org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_empty_lines=false +org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true +org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true +org.eclipse.jdt.core.formatter.indentation.size=4 +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert +org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=insert +org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert +org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert +org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert +org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert +org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.join_lines_in_comments=true +org.eclipse.jdt.core.formatter.join_wrapped_lines=true +org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false +org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false +org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false +org.eclipse.jdt.core.formatter.lineSplit=115 +org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false +org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 +org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=0 +org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=false +org.eclipse.jdt.core.formatter.tabulation.char=space +org.eclipse.jdt.core.formatter.tabulation.size=2 +org.eclipse.jdt.core.formatter.use_on_off_tags=false +org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false +org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true +org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true +org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true diff --git a/.settings/org.eclipse.jdt.ui.prefs b/.settings/org.eclipse.jdt.ui.prefs new file mode 100644 index 0000000..0279f72 --- /dev/null +++ b/.settings/org.eclipse.jdt.ui.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +formatter_profile=_Spun +formatter_settings_version=12 diff --git a/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/AdLibsQuizGrader.java b/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/AdLibsQuizGrader.java index f34c930..569638b 100644 --- a/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/AdLibsQuizGrader.java +++ b/src/main/java/org/teachingkidsprogramming/recipes/quizzes/graders/AdLibsQuizGrader.java @@ -12,118 +12,120 @@ import org.teachingkidsprogramming.recipes.quizzes.graders.AdLibsQuizAdapter.Pieces; public class AdLibsQuizGrader implements Paintable { - private static class Model { - public String three; - - public Model(String three) { - this.three = three; - } - } - - private boolean[] answers; - public static int TURTLE_SPEED = 9; - private AdLibsQuizAdapter quiz; - - private void displayScreen() { - QuizUtils.prepareScoringScreen(answers, this, TURTLE_SPEED); - } - - public void grade(AdLibsQuizAdapter quiz) { - this.quiz = quiz; - answers = new boolean[] { grade1You(), grade2Won(), grade3The(), - grade4Game() }; - displayScreen(); - } - - public void paint(Graphics2D g, JPanel caller) { - QuizUtils.displayScores(g, 300, answers); - Tortoise.hide(); - drawRewardShape(g); - } - - public void drawRewardShape(Graphics2D g) { - drawYou(g); - drawWin(g); - drawThe(g); - drawGame(g); - } - - private void drawGame(Graphics2D g) { - quiz.template4 = ""; - Pieces pieces = new Pieces(); - quiz.question4(pieces); - pieces.middle = "am"; - String word = Parser.parse(quiz.template4, pieces); - drawWord(g, word, 0, 4, true); - } - - private void drawThe(Graphics2D g) { - quiz.word3 = ""; - Pieces model = new Pieces(); - model.middle = "H"; - quiz.question3("T{middle}E", model); - drawWord(g, quiz.word3, 3, 2, false); - } - - private void drawWin(Graphics2D g) { - quiz.word2 = "WO"; - quiz.question2("n"); - drawWord(g, quiz.word2, 1, 0, false); - } - - private void drawWord(Graphics2D g, String word, int x, int y, - boolean horizontal) { - char[] letters = word.toUpperCase().toCharArray(); - int dx = horizontal ? 1 : 0; - int dy = horizontal ? 0 : 1; - for (int i = 0; i < letters.length; i++) { - char c = letters[i]; - drawLetter(getPosition(x + dx * i), getPosition(y + dy * i), c, g); - } - } - - private int getPosition(int i) { - return 100 + i * 53; - } - - private void drawYou(Graphics2D g) { - quiz.word1 = "NOT"; - quiz.question1("y", "u"); - drawWord(g, quiz.word1, 0, 1, true); - } - - private void drawLetter(int x, int y, char c, Graphics2D g) { - g.setColor(PenColors.Browns.BurlyWood); - g.drawRect(x, y, 50, 50); - g.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 36)); - int charWidth = g.getFontMetrics().charWidth(c); - int charHeight = g.getFontMetrics().getAscent(); - int textY = y + (40 - charHeight) / 2 + charHeight; - int textX = x + (50 - charWidth) / 2; - g.drawString("" + c, textX, textY); - } - - private boolean grade1You() { - quiz.word1 = "fake"; - quiz.question1("f", "o"); - return "foo".equals(quiz.word1); - } - - private boolean grade2Won() { - quiz.word2 = "passe"; - quiz.question2("d"); - return "passed".equals(quiz.word2); - } - - private boolean grade3The() { - quiz.word3 = "fake"; - quiz.question3("12{three}4", new Model("3")); - return "1234".equals(quiz.word3); - } - - private boolean grade4Game() { - quiz.template4 = "fake"; - quiz.question4(new Pieces()); - return "g{middle}e".equals(quiz.template4); - } + private static class Model { + @SuppressWarnings("unused") + public String three; + + public Model(String three) { + this.three = three; + } + } + + private boolean[] answers; + public static int TURTLE_SPEED = 9; + private AdLibsQuizAdapter quiz; + + private void displayScreen() { + QuizUtils.prepareScoringScreen(answers, this, TURTLE_SPEED); + } + + public void grade(AdLibsQuizAdapter quiz) { + this.quiz = quiz; + answers = new boolean[] { grade1You(), grade2Won(), grade3The(), + grade4Game() }; + displayScreen(); + } + + @Override + public void paint(Graphics2D g, JPanel caller) { + QuizUtils.displayScores(g, 300, answers); + Tortoise.hide(); + drawRewardShape(g); + } + + public void drawRewardShape(Graphics2D g) { + drawYou(g); + drawWin(g); + drawThe(g); + drawGame(g); + } + + private void drawGame(Graphics2D g) { + quiz.template4 = ""; + Pieces pieces = new Pieces(); + quiz.question4(pieces); + pieces.middle = "am"; + String word = Parser.parse(quiz.template4, pieces); + drawWord(g, word, 0, 4, true); + } + + private void drawThe(Graphics2D g) { + quiz.word3 = ""; + Pieces model = new Pieces(); + model.middle = "H"; + quiz.question3("T{middle}E", model); + drawWord(g, quiz.word3, 3, 2, false); + } + + private void drawWin(Graphics2D g) { + quiz.word2 = "WO"; + quiz.question2("n"); + drawWord(g, quiz.word2, 1, 0, false); + } + + private void drawWord(Graphics2D g, String word, int x, int y, + boolean horizontal) { + char[] letters = word.toUpperCase().toCharArray(); + int dx = horizontal ? 1 : 0; + int dy = horizontal ? 0 : 1; + for (int i = 0; i < letters.length; i++) { + char c = letters[i]; + drawLetter(getPosition(x + dx * i), getPosition(y + dy * i), c, g); + } + } + + private int getPosition(int i) { + return 100 + i * 53; + } + + private void drawYou(Graphics2D g) { + quiz.word1 = "NOT"; + quiz.question1("y", "u"); + drawWord(g, quiz.word1, 0, 1, true); + } + + private void drawLetter(int x, int y, char c, Graphics2D g) { + g.setColor(PenColors.Browns.BurlyWood); + g.drawRect(x, y, 50, 50); + g.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 36)); + int charWidth = g.getFontMetrics().charWidth(c); + int charHeight = g.getFontMetrics().getAscent(); + int textY = y + (40 - charHeight) / 2 + charHeight; + int textX = x + (50 - charWidth) / 2; + g.drawString("" + c, textX, textY); + } + + private boolean grade1You() { + quiz.word1 = "fake"; + quiz.question1("f", "o"); + return "foo".equals(quiz.word1); + } + + private boolean grade2Won() { + quiz.word2 = "passe"; + quiz.question2("d"); + return "passed".equals(quiz.word2); + } + + private boolean grade3The() { + quiz.word3 = "fake"; + quiz.question3("12{three}4", new Model("3")); + return "1234".equals(quiz.word3); + } + + private boolean grade4Game() { + quiz.template4 = "fake"; + quiz.question4(new Pieces()); + return "g{middle}e".equals(quiz.template4); + } } diff --git a/src/main/java/org/teachingkidsprogramming/section02methods/DeepDive02Variables.java b/src/main/java/org/teachingkidsprogramming/section02methods/DeepDive02Variables.java index 4ff99ae..f7b515e 100644 --- a/src/main/java/org/teachingkidsprogramming/section02methods/DeepDive02Variables.java +++ b/src/main/java/org/teachingkidsprogramming/section02methods/DeepDive02Variables.java @@ -5,6 +5,7 @@ import org.junit.Test; @Ignore +@SuppressWarnings("unused") public class DeepDive02Variables { // How to do deep dive: diff --git a/src/main/java/org/teachingkidsprogramming/section02methods/TriangleShell.java b/src/main/java/org/teachingkidsprogramming/section02methods/TriangleShell.java index 1bc49b8..0081208 100644 --- a/src/main/java/org/teachingkidsprogramming/section02methods/TriangleShell.java +++ b/src/main/java/org/teachingkidsprogramming/section02methods/TriangleShell.java @@ -1,26 +1,27 @@ package org.teachingkidsprogramming.section02methods; -public class TriangleShell -{ +@SuppressWarnings("unused") +public class TriangleShell { private static int length; - public static void main(String[] args) - { - // Show the tortoise --#1 - // Make the tortoise go as fast as possible --#6 - // Do the following 60 times --#7.1 - // Change the pen color of the line the tortoise draws to a random color --#9 - // Increase the current length of the side by 4 pixels --#8 + + public static void main(String[] args) { + // Show the tortoise --#1 + // Make the tortoise go as fast as possible --#6 + // Do the following 60 times --#7.1 + // Change the pen color of the line the tortoise draws to a random color + // --#9 + // Increase the current length of the side by 4 pixels --#8 // - // drawTriangle (recipe below) --#5.1 - // ------------- Recipe for drawTriangle --#5.2 - // Do the following 3 times --#3.1 - // Move the tortoise the current length of a side --#4 - // Turn the tortoise 1/3rd of 360 degrees --#2 - // Repeat --#3.2 - // ------------- End of drawTriangle recipe --#5.3 + // drawTriangle (recipe below) --#5.1 + // ------------- Recipe for drawTriangle --#5.2 + // Do the following 3 times --#3.1 + // Move the tortoise the current length of a side --#4 + // Turn the tortoise 1/3rd of 360 degrees --#2 + // Repeat --#3.2 + // ------------- End of drawTriangle recipe --#5.3 // - // Turn the tortoise 1/60th of 360 degrees to the right --#10 - // Repeat --#7.2 + // Turn the tortoise 1/60th of 360 degrees to the right --#10 + // Repeat --#7.2 } // Related Videos: // Sub recipe-> Method : http://youtu.be/C6fnqjceVcs diff --git a/src/main/java/org/teachingkidsprogramming/section03ifs/DeepDive03Ifs.java b/src/main/java/org/teachingkidsprogramming/section03ifs/DeepDive03Ifs.java index 08d5062..d63e0e9 100644 --- a/src/main/java/org/teachingkidsprogramming/section03ifs/DeepDive03Ifs.java +++ b/src/main/java/org/teachingkidsprogramming/section03ifs/DeepDive03Ifs.java @@ -5,6 +5,7 @@ import org.junit.Test; @Ignore +@SuppressWarnings("unused") public class DeepDive03Ifs { // How to do deep dive: diff --git a/src/main/java/org/teachingkidsprogramming/section05recursion/TurtleTree.java b/src/main/java/org/teachingkidsprogramming/section05recursion/TurtleTree.java index acece26..d6459bb 100644 --- a/src/main/java/org/teachingkidsprogramming/section05recursion/TurtleTree.java +++ b/src/main/java/org/teachingkidsprogramming/section05recursion/TurtleTree.java @@ -5,6 +5,7 @@ public class TurtleTree { + @SuppressWarnings("unused") public static void main(String[] args) { // Make the tortoise go as fast as possible --#10 diff --git a/src/main/java/org/teachingkidsprogramming/section06modelviewcontroller/DeepDive06ModelViewController.java b/src/main/java/org/teachingkidsprogramming/section06modelviewcontroller/DeepDive06ModelViewController.java index 3fa1897..1b4955a 100644 --- a/src/main/java/org/teachingkidsprogramming/section06modelviewcontroller/DeepDive06ModelViewController.java +++ b/src/main/java/org/teachingkidsprogramming/section06modelviewcontroller/DeepDive06ModelViewController.java @@ -8,6 +8,7 @@ import org.junit.Test; import org.teachingextensions.logo.Tortoise; +@SuppressWarnings("unused") public class DeepDive06ModelViewController { // How to do deep dive: diff --git a/src/main/java/org/teachingkidsprogramming/section07events/DeepDive07Events.java b/src/main/java/org/teachingkidsprogramming/section07events/DeepDive07Events.java index b82be92..15a6900 100644 --- a/src/main/java/org/teachingkidsprogramming/section07events/DeepDive07Events.java +++ b/src/main/java/org/teachingkidsprogramming/section07events/DeepDive07Events.java @@ -10,6 +10,7 @@ import org.teachingextensions.logo.Turtle; import org.teachingextensions.logo.Turtle.Animals; +@SuppressWarnings("unused") public class DeepDive07Events { // How to do deep dive: diff --git a/src/main/java/org/teachingkidsprogramming/section08tdd/DeepDive08TDD.java b/src/main/java/org/teachingkidsprogramming/section08tdd/DeepDive08TDD.java index d87d2eb..a46128e 100644 --- a/src/main/java/org/teachingkidsprogramming/section08tdd/DeepDive08TDD.java +++ b/src/main/java/org/teachingkidsprogramming/section08tdd/DeepDive08TDD.java @@ -7,6 +7,7 @@ import org.teachingextensions.logo.Tortoise; //This deepdive is in progress! +@SuppressWarnings("unused") public class DeepDive08TDD { // How to do deep dive: diff --git a/src/main/java/org/teachingkidsprogramming/section08tdd/SimplePuzzle.java b/src/main/java/org/teachingkidsprogramming/section08tdd/SimplePuzzle.java index 63dd41d..cb70517 100644 --- a/src/main/java/org/teachingkidsprogramming/section08tdd/SimplePuzzle.java +++ b/src/main/java/org/teachingkidsprogramming/section08tdd/SimplePuzzle.java @@ -1,22 +1,34 @@ package org.teachingkidsprogramming.section08tdd; -import org.teachingextensions.approvals.lite.util.MySystem; -import org.teachingextensions.logo.*; - -import javax.swing.*; -import java.awt.*; +import java.awt.EventQueue; import java.util.Arrays; import java.util.Random; -public class SimplePuzzle implements Runnable { - public static void main(String[] args) { +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +import org.teachingextensions.approvals.lite.util.MySystem; +import org.teachingextensions.logo.AStarPlayer; +import org.teachingextensions.logo.Puzzle; +import org.teachingextensions.logo.PuzzleAnimation; +import org.teachingextensions.logo.PuzzleBoard; +import org.teachingextensions.logo.PuzzlePlayer; +import org.teachingextensions.logo.PuzzleState; +import org.teachingextensions.logo.PuzzleWindow; + +public class SimplePuzzle implements Runnable +{ + public static void main(String[] args) + { EventQueue.invokeLater(new SimplePuzzle()); } - - private static int[] shuffled(int[] source) { + @SuppressWarnings("unused") + private static int[] shuffled(int[] source) + { int[] copy = Arrays.copyOf(source, source.length); Random rnd = new Random(); - for (int i = copy.length - 1; i > 0; i--) { + for (int i = copy.length - 1; i > 0; i--) + { int index = rnd.nextInt(i + 1); // Simple swap int a = copy[index]; @@ -25,33 +37,31 @@ private static int[] shuffled(int[] source) { } return copy; } - - public void run() { + @Override + public void run() + { this.setLookAndFeel(); - -// int[] cells = {0, 1, 2, 3, 4, 5, 6, 7, 8}; -// int[] shuffled = shuffled(cells); + // int[] cells = {0, 1, 2, 3, 4, 5, 6, 7, 8}; + // int[] shuffled = shuffled(cells); int[] shuffled = {5, 6, 2, 4, 1, 8, 7, 0, 3}; // known to be solvable MySystem.message(Arrays.toString(shuffled)); Puzzle puzzle = new Puzzle(shuffled); PuzzlePlayer player = new AStarPlayer(puzzle); PuzzleState solution = player.solve(); - PuzzleBoard board = new PuzzleBoard(puzzle, solution); PuzzleWindow pw = new PuzzleWindow(board); pw.setVisible(true); new Thread(new PuzzleAnimation(board)).start(); } - - private void setLookAndFeel() { - try { + private void setLookAndFeel() + { + try + { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); - } catch ( - ClassNotFoundException | - InstantiationException | - UnsupportedLookAndFeelException | - IllegalAccessException ignored - ) { + } + catch (ClassNotFoundException | InstantiationException | UnsupportedLookAndFeelException + | IllegalAccessException ignored) + { } } } diff --git a/src/main/java/org/teachingkidsprogramming/section09exceptions/DeepDive09exceptions.java b/src/main/java/org/teachingkidsprogramming/section09exceptions/DeepDive09exceptions.java index ccea26a..bdf0db4 100644 --- a/src/main/java/org/teachingkidsprogramming/section09exceptions/DeepDive09exceptions.java +++ b/src/main/java/org/teachingkidsprogramming/section09exceptions/DeepDive09exceptions.java @@ -3,10 +3,10 @@ import org.junit.Assert; import org.junit.Ignore; import org.junit.Test; - import org.teachingextensions.approvals.lite.util.FormattedException; @Ignore +@SuppressWarnings("unused") public class DeepDive09exceptions { // How to do deep dive: @@ -147,6 +147,7 @@ private Chain createChain() } private static class _____ extends Exception { + private static final long serialVersionUID = 7013264013388843231L; public _____(String message, Exception originalException) { super(message, originalException); diff --git a/src/test/java/org/teachingextensions/approvals/lite/ReportInjectionTest.java b/src/test/java/org/teachingextensions/approvals/lite/ReportInjectionTest.java index fc56b80..520ef75 100644 --- a/src/test/java/org/teachingextensions/approvals/lite/ReportInjectionTest.java +++ b/src/test/java/org/teachingextensions/approvals/lite/ReportInjectionTest.java @@ -1,10 +1,10 @@ package org.teachingextensions.approvals.lite; import junit.framework.TestCase; + import org.teachingextensions.approvals.lite.reporters.QuietReporter; import org.teachingextensions.approvals.lite.reporters.UseReporter; - @UseReporter(QuietReporter.class) public class ReportInjectionTest extends TestCase { @@ -21,7 +21,7 @@ public boolean askToChangeReceivedToApproved(String received, String approved) t return true; } } - private static Class called = null; + private static Class called = null; @UseReporter(MyReporter.class) public void testOverrideReporterByParameter() throws Exception { diff --git a/src/test/java/org/teachingextensions/approvals/lite/ReporterFactoryTest.java b/src/test/java/org/teachingextensions/approvals/lite/ReporterFactoryTest.java index 56c5d94..cc12981 100644 --- a/src/test/java/org/teachingextensions/approvals/lite/ReporterFactoryTest.java +++ b/src/test/java/org/teachingextensions/approvals/lite/ReporterFactoryTest.java @@ -1,10 +1,10 @@ package org.teachingextensions.approvals.lite; import junit.framework.TestCase; + import org.teachingextensions.approvals.lite.reporters.DiffReporter; import org.teachingextensions.approvals.lite.reporters.QuietReporter; - public class ReporterFactoryTest extends TestCase { public void testReporters() throws Exception @@ -13,7 +13,7 @@ public void testReporters() throws Exception assertEquals(DiffReporter.class, getClassFor("html")); assertEquals(QuietReporter.class, getClassFor("other")); } - private Class getClassFor(String type) + private Class getClassFor(String type) { return ReporterFactory.get(type).getClass(); } diff --git a/src/test/java/org/teachingextensions/approvals/lite/util/TupleTest.java b/src/test/java/org/teachingextensions/approvals/lite/util/TupleTest.java index cfd795e..c2fedba 100644 --- a/src/test/java/org/teachingextensions/approvals/lite/util/TupleTest.java +++ b/src/test/java/org/teachingextensions/approvals/lite/util/TupleTest.java @@ -4,9 +4,10 @@ public class TupleTest extends TestCase { - public void test() { - Tuple tupleOne = new Tuple<>("foo", 1); - assertEquals("string first", "foo", tupleOne.getFirst()); - assertEquals("integer second", 1, tupleOne.getSecond()); + public void test() + { + Tuple tupleOne = new Tuple<>("foo", 1); + assertEquals("string first", "foo", tupleOne.getFirst()); + assertEquals("integer second", 1, (int) tupleOne.getSecond()); } } diff --git a/src/test/java/org/teachingextensions/approvals/lite/util/velocity/VelocityNullArgumentTest.java b/src/test/java/org/teachingextensions/approvals/lite/util/velocity/VelocityNullArgumentTest.java index 62e5a74..a72edb1 100644 --- a/src/test/java/org/teachingextensions/approvals/lite/util/velocity/VelocityNullArgumentTest.java +++ b/src/test/java/org/teachingextensions/approvals/lite/util/velocity/VelocityNullArgumentTest.java @@ -1,30 +1,26 @@ package org.teachingextensions.approvals.lite.util.velocity; import junit.framework.TestCase; + import org.apache.velocity.context.Context; public class VelocityNullArgumentTest extends TestCase implements ContextAware { - /***********************************************************************/ public void testOverloadedMethodFound() throws Exception { } - /***********************************************************************/ + @Override public void setupContext(Context context) { context.put("object", this); context.put("nullValue", null); } - /***********************************************************************/ - public static String getClass(Class c) + public static String getClass(Class c) { return c == null ? "you got null" : c.getName(); } - /***********************************************************************/ public static String getClass(String c) { return c == null ? "you got null" : c.getClass().getName(); } - /***********************************************************************/ - /***********************************************************************/ } diff --git a/src/test/java/org/teachingextensions/simpleparser/tests/ParserTest.java b/src/test/java/org/teachingextensions/simpleparser/tests/ParserTest.java index 1c06210..ecb1909 100644 --- a/src/test/java/org/teachingextensions/simpleparser/tests/ParserTest.java +++ b/src/test/java/org/teachingextensions/simpleparser/tests/ParserTest.java @@ -8,6 +8,7 @@ import org.teachingextensions.simpleparser.Parser; @UseReporter(DiffReporter.class) +@SuppressWarnings("unused") public class ParserTest extends TestCase { private int a = 1; diff --git a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/HousesQuizTest.java b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/HousesQuizTest.java index 530c0b1..07fcb22 100644 --- a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/HousesQuizTest.java +++ b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/HousesQuizTest.java @@ -14,6 +14,7 @@ @UseReporter({DelayedClipboardReporter.class, FileLauncherReporter.class}) public class HousesQuizTest extends TestCase { + @SuppressWarnings("unused") public static class HousesCorrectQuiz extends HousesQuizAdapter { private void small() @@ -59,6 +60,7 @@ public void testCorrect() throws Exception new HousesQuizGrader().grade(new HousesCorrectQuiz()); TortoiseUtils.verifyForOs(); } + @SuppressWarnings("unused") public static class HousesIncorrectQuiz extends HousesQuizAdapter { private int length; diff --git a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/TreeQuizTest.java b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/TreeQuizTest.java index ad3912c..bbe311f 100644 --- a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/TreeQuizTest.java +++ b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/TreeQuizTest.java @@ -13,6 +13,7 @@ @UseReporter({DelayedClipboardReporter.class, DiffReporter.class}) public class TreeQuizTest extends TestCase { + @SuppressWarnings("unused") public static class TreeCorrectQuiz extends TreeQuizAdapter { // Sub question1 @@ -50,6 +51,7 @@ public void testCorrect() throws Exception new TreeQuizGrader().grade(new TreeCorrectQuiz()); TortoiseUtils.verifyForOs(); } + @SuppressWarnings("unused") public static class TreeIncorrectQuiz extends TreeQuizAdapter { // Sub question1 From 0baf2f4e54322e49bf26e6054e9a5efd1bc3c6a1 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Mon, 30 Mar 2015 09:25:26 -0700 Subject: [PATCH 104/111] Merges --- .../org/teachingextensions/logo/Tile.java | 82 +++--- .../recipes/inDevelopment/SpiderWebQuiz.java | 0 .../section08tdd/SimplePuzzle.java | 2 - .../approvals/lite/ApprovalApprover.java | 11 - .../lite/ApprovalFailureOverrider.java | 6 - .../lite/ApprovalFailureReporter.java | 5 - .../lite/ApprovalReporterWithCleanUp.java | 5 - .../approvals/lite/ApprovalWriter.java | 10 - .../approvals/lite/Approvals.java | 104 ------- .../approvals/lite/FileApprover.java | 57 ---- .../approvals/lite/ReporterFactory.java | 93 ------ .../approvals/lite/namer/ApprovalNamer.java | 7 - .../approvals/lite/namer/ApprovalResults.java | 7 - .../lite/namer/JUnitStackTraceNamer.java | 70 ----- .../approvals/lite/namer/NamerFactory.java | 20 -- .../lite/namer/OsEnvironmentLabeller.java | 10 - .../lite/reporters/ClipboardReporter.java | 41 --- .../reporters/DelayedClipboardReporter.java | 30 -- .../lite/reporters/DiffReporter.java | 12 - .../reporters/EnvironmentAwareReporter.java | 7 - .../lite/reporters/FileLauncherReporter.java | 16 -- .../lite/reporters/FirstWorkingReporter.java | 29 -- .../lite/reporters/GenericDiffReporter.java | 84 ------ .../lite/reporters/ImageReporter.java | 12 - .../lite/reporters/ImageWebReporter.java | 26 -- .../lite/reporters/JunitReporter.java | 29 -- .../lite/reporters/MultiReporter.java | 31 -- .../lite/reporters/MultipleExceptions.java | 35 --- .../lite/reporters/QuietReporter.java | 15 - .../approvals/lite/reporters/UseReporter.java | 11 - .../macosx/BeyondCompareReporter.java | 16 -- .../reporters/macosx/DiffMergeReporter.java | 16 -- .../macosx/KaleidoscopeDiffReporter.java | 22 -- .../reporters/macosx/MacDiffReporter.java | 11 - .../reporters/macosx/P4MergeReporter.java | 24 -- .../lite/reporters/macosx/TkDiffReporter.java | 16 -- .../windows/BeyondCompareReporter.java | 16 -- .../windows/TortoiseDiffReporter.java | 11 - .../windows/TortoiseImageDiffReporter.java | 12 - .../windows/TortoiseTextDiffReporter.java | 20 -- .../reporters/windows/WinMergeReporter.java | 17 -- .../windows/WindowsDiffReporter.java | 11 - .../approvals/lite/util/ArrayUtils.java | 75 ----- .../approvals/lite/util/Asserts.java | 19 -- .../approvals/lite/util/ClassUtils.java | 84 ------ .../approvals/lite/util/DateDifference.java | 97 ------- .../approvals/lite/util/DateUtils.java | 58 ---- .../lite/util/FormattedException.java | 11 - .../approvals/lite/util/FrameCloser.java | 18 -- .../lite/util/LambdaThreadLauncher.java | 23 -- .../approvals/lite/util/MySystem.java | 191 ------------- .../lite/util/NotImplementedException.java | 10 - .../approvals/lite/util/NumberUtils.java | 62 ---- .../approvals/lite/util/ObjectUtils.java | 53 ---- .../approvals/lite/util/ParserCommons.java | 27 -- .../lite/util/SearchingFileFilter.java | 47 ---- .../lite/util/StackTraceReflectionResult.java | 29 -- .../approvals/lite/util/StringUtils.java | 215 -------------- .../approvals/lite/util/SystemUtils.java | 10 - .../approvals/lite/util/TestUtils.java | 76 ----- .../approvals/lite/util/ThreadLauncher.java | 33 --- .../approvals/lite/util/ThreadUtils.java | 11 - .../approvals/lite/util/Tuple.java | 24 -- .../approvals/lite/util/WindowUtils.java | 49 ---- .../approvals/lite/util/io/FileUtils.java | 126 --------- .../lite/util/io/SimpleDirectoryFilter.java | 25 -- .../lite/util/io/SimpleFileFilter.java | 23 -- .../lite/util/io/StackElementSelector.java | 5 - .../approvals/lite/util/io/ZipUtils.java | 82 ------ .../approvals/lite/util/lambda/Action0.java | 5 - .../approvals/lite/util/lambda/Function0.java | 5 - .../approvals/lite/util/lambda/Function1.java | 5 - .../approvals/lite/util/lambda/Query.java | 18 -- .../lite/util/persistence/Saver.java | 6 - .../util/persistence/SavingException.java | 5 - .../lite/util/servlets/InvokerServlet.java | 107 ------- .../lite/util/servlets/ValidationError.java | 86 ------ .../lite/util/velocity/ContextAware.java | 28 -- .../util/velocity/StringResourceLoader.java | 60 ---- .../lite/util/velocity/TestableUberspect.java | 265 ------------------ .../lite/util/velocity/VelocityParser.java | 106 ------- .../util/velocity/VelocityParsingError.java | 26 -- .../lite/writers/ApprovalTextWriter.java | 32 --- .../lite/writers/ComponentApprovalWriter.java | 48 ---- .../lite/writers/ImageApprovalWriter.java | 31 -- .../approvals/lite/writers/Writer.java | 6 - .../logo/AStarEstimator.java | 15 - .../teachingextensions/logo/AStarPlayer.java | 13 - src/org/teachingextensions/logo/Puzzle.java | 121 -------- .../logo/PuzzleAnimation.java | 64 ----- .../teachingextensions/logo/PuzzleBoard.java | 105 ------- .../teachingextensions/logo/PuzzlePlayer.java | 57 ---- .../teachingextensions/logo/PuzzleState.java | 132 --------- .../teachingextensions/logo/PuzzleWindow.java | 22 -- src/org/teachingextensions/logo/Tile.java | 67 ----- src/org/teachingextensions/logo/TileMove.java | 23 -- .../logo/UniformCostPlayer.java | 15 - .../section08tdd/SimplePuzzle.java | 68 ----- 98 files changed, 41 insertions(+), 4042 deletions(-) rename src/{ => main/java}/org/teachingkidsprogramming/recipes/inDevelopment/SpiderWebQuiz.java (100%) delete mode 100644 src/org/teachingextensions/approvals/lite/ApprovalApprover.java delete mode 100644 src/org/teachingextensions/approvals/lite/ApprovalFailureOverrider.java delete mode 100644 src/org/teachingextensions/approvals/lite/ApprovalFailureReporter.java delete mode 100644 src/org/teachingextensions/approvals/lite/ApprovalReporterWithCleanUp.java delete mode 100644 src/org/teachingextensions/approvals/lite/ApprovalWriter.java delete mode 100644 src/org/teachingextensions/approvals/lite/Approvals.java delete mode 100644 src/org/teachingextensions/approvals/lite/FileApprover.java delete mode 100644 src/org/teachingextensions/approvals/lite/ReporterFactory.java delete mode 100644 src/org/teachingextensions/approvals/lite/namer/ApprovalNamer.java delete mode 100644 src/org/teachingextensions/approvals/lite/namer/ApprovalResults.java delete mode 100644 src/org/teachingextensions/approvals/lite/namer/JUnitStackTraceNamer.java delete mode 100644 src/org/teachingextensions/approvals/lite/namer/NamerFactory.java delete mode 100644 src/org/teachingextensions/approvals/lite/namer/OsEnvironmentLabeller.java delete mode 100644 src/org/teachingextensions/approvals/lite/reporters/ClipboardReporter.java delete mode 100644 src/org/teachingextensions/approvals/lite/reporters/DelayedClipboardReporter.java delete mode 100644 src/org/teachingextensions/approvals/lite/reporters/DiffReporter.java delete mode 100644 src/org/teachingextensions/approvals/lite/reporters/EnvironmentAwareReporter.java delete mode 100644 src/org/teachingextensions/approvals/lite/reporters/FileLauncherReporter.java delete mode 100644 src/org/teachingextensions/approvals/lite/reporters/FirstWorkingReporter.java delete mode 100644 src/org/teachingextensions/approvals/lite/reporters/GenericDiffReporter.java delete mode 100644 src/org/teachingextensions/approvals/lite/reporters/ImageReporter.java delete mode 100644 src/org/teachingextensions/approvals/lite/reporters/ImageWebReporter.java delete mode 100644 src/org/teachingextensions/approvals/lite/reporters/JunitReporter.java delete mode 100644 src/org/teachingextensions/approvals/lite/reporters/MultiReporter.java delete mode 100644 src/org/teachingextensions/approvals/lite/reporters/MultipleExceptions.java delete mode 100644 src/org/teachingextensions/approvals/lite/reporters/QuietReporter.java delete mode 100644 src/org/teachingextensions/approvals/lite/reporters/UseReporter.java delete mode 100644 src/org/teachingextensions/approvals/lite/reporters/macosx/BeyondCompareReporter.java delete mode 100644 src/org/teachingextensions/approvals/lite/reporters/macosx/DiffMergeReporter.java delete mode 100644 src/org/teachingextensions/approvals/lite/reporters/macosx/KaleidoscopeDiffReporter.java delete mode 100644 src/org/teachingextensions/approvals/lite/reporters/macosx/MacDiffReporter.java delete mode 100644 src/org/teachingextensions/approvals/lite/reporters/macosx/P4MergeReporter.java delete mode 100644 src/org/teachingextensions/approvals/lite/reporters/macosx/TkDiffReporter.java delete mode 100644 src/org/teachingextensions/approvals/lite/reporters/windows/BeyondCompareReporter.java delete mode 100644 src/org/teachingextensions/approvals/lite/reporters/windows/TortoiseDiffReporter.java delete mode 100644 src/org/teachingextensions/approvals/lite/reporters/windows/TortoiseImageDiffReporter.java delete mode 100644 src/org/teachingextensions/approvals/lite/reporters/windows/TortoiseTextDiffReporter.java delete mode 100644 src/org/teachingextensions/approvals/lite/reporters/windows/WinMergeReporter.java delete mode 100644 src/org/teachingextensions/approvals/lite/reporters/windows/WindowsDiffReporter.java delete mode 100644 src/org/teachingextensions/approvals/lite/util/ArrayUtils.java delete mode 100644 src/org/teachingextensions/approvals/lite/util/Asserts.java delete mode 100644 src/org/teachingextensions/approvals/lite/util/ClassUtils.java delete mode 100644 src/org/teachingextensions/approvals/lite/util/DateDifference.java delete mode 100644 src/org/teachingextensions/approvals/lite/util/DateUtils.java delete mode 100644 src/org/teachingextensions/approvals/lite/util/FormattedException.java delete mode 100644 src/org/teachingextensions/approvals/lite/util/FrameCloser.java delete mode 100644 src/org/teachingextensions/approvals/lite/util/LambdaThreadLauncher.java delete mode 100644 src/org/teachingextensions/approvals/lite/util/MySystem.java delete mode 100644 src/org/teachingextensions/approvals/lite/util/NotImplementedException.java delete mode 100644 src/org/teachingextensions/approvals/lite/util/NumberUtils.java delete mode 100644 src/org/teachingextensions/approvals/lite/util/ObjectUtils.java delete mode 100644 src/org/teachingextensions/approvals/lite/util/ParserCommons.java delete mode 100644 src/org/teachingextensions/approvals/lite/util/SearchingFileFilter.java delete mode 100644 src/org/teachingextensions/approvals/lite/util/StackTraceReflectionResult.java delete mode 100644 src/org/teachingextensions/approvals/lite/util/StringUtils.java delete mode 100644 src/org/teachingextensions/approvals/lite/util/SystemUtils.java delete mode 100644 src/org/teachingextensions/approvals/lite/util/TestUtils.java delete mode 100644 src/org/teachingextensions/approvals/lite/util/ThreadLauncher.java delete mode 100644 src/org/teachingextensions/approvals/lite/util/ThreadUtils.java delete mode 100644 src/org/teachingextensions/approvals/lite/util/Tuple.java delete mode 100644 src/org/teachingextensions/approvals/lite/util/WindowUtils.java delete mode 100644 src/org/teachingextensions/approvals/lite/util/io/FileUtils.java delete mode 100644 src/org/teachingextensions/approvals/lite/util/io/SimpleDirectoryFilter.java delete mode 100644 src/org/teachingextensions/approvals/lite/util/io/SimpleFileFilter.java delete mode 100644 src/org/teachingextensions/approvals/lite/util/io/StackElementSelector.java delete mode 100644 src/org/teachingextensions/approvals/lite/util/io/ZipUtils.java delete mode 100644 src/org/teachingextensions/approvals/lite/util/lambda/Action0.java delete mode 100644 src/org/teachingextensions/approvals/lite/util/lambda/Function0.java delete mode 100644 src/org/teachingextensions/approvals/lite/util/lambda/Function1.java delete mode 100644 src/org/teachingextensions/approvals/lite/util/lambda/Query.java delete mode 100644 src/org/teachingextensions/approvals/lite/util/persistence/Saver.java delete mode 100644 src/org/teachingextensions/approvals/lite/util/persistence/SavingException.java delete mode 100644 src/org/teachingextensions/approvals/lite/util/servlets/InvokerServlet.java delete mode 100644 src/org/teachingextensions/approvals/lite/util/servlets/ValidationError.java delete mode 100644 src/org/teachingextensions/approvals/lite/util/velocity/ContextAware.java delete mode 100644 src/org/teachingextensions/approvals/lite/util/velocity/StringResourceLoader.java delete mode 100644 src/org/teachingextensions/approvals/lite/util/velocity/TestableUberspect.java delete mode 100644 src/org/teachingextensions/approvals/lite/util/velocity/VelocityParser.java delete mode 100644 src/org/teachingextensions/approvals/lite/util/velocity/VelocityParsingError.java delete mode 100644 src/org/teachingextensions/approvals/lite/writers/ApprovalTextWriter.java delete mode 100644 src/org/teachingextensions/approvals/lite/writers/ComponentApprovalWriter.java delete mode 100644 src/org/teachingextensions/approvals/lite/writers/ImageApprovalWriter.java delete mode 100644 src/org/teachingextensions/approvals/lite/writers/Writer.java delete mode 100644 src/org/teachingextensions/logo/AStarEstimator.java delete mode 100644 src/org/teachingextensions/logo/AStarPlayer.java delete mode 100644 src/org/teachingextensions/logo/Puzzle.java delete mode 100644 src/org/teachingextensions/logo/PuzzleAnimation.java delete mode 100644 src/org/teachingextensions/logo/PuzzleBoard.java delete mode 100644 src/org/teachingextensions/logo/PuzzlePlayer.java delete mode 100644 src/org/teachingextensions/logo/PuzzleState.java delete mode 100644 src/org/teachingextensions/logo/PuzzleWindow.java delete mode 100644 src/org/teachingextensions/logo/Tile.java delete mode 100644 src/org/teachingextensions/logo/TileMove.java delete mode 100644 src/org/teachingextensions/logo/UniformCostPlayer.java delete mode 100644 src/org/teachingkidsprogramming/section08tdd/SimplePuzzle.java diff --git a/src/main/java/org/teachingextensions/logo/Tile.java b/src/main/java/org/teachingextensions/logo/Tile.java index 38dc991..4eac054 100644 --- a/src/main/java/org/teachingextensions/logo/Tile.java +++ b/src/main/java/org/teachingextensions/logo/Tile.java @@ -1,67 +1,67 @@ package org.teachingextensions.logo; -import org.teachingextensions.approvals.lite.util.ObjectUtils; +import java.awt.Dimension; +import java.awt.Graphics2D; +import java.awt.Image; +import java.awt.Point; -import java.awt.*; +import org.teachingextensions.approvals.lite.util.ObjectUtils; /** * A tile is a square on the board with an image on it. */ -public class Tile { - private static final String[] resources = { - "Batgirl1a.png", "Batgirl2a.png", "Batgirl3a.png", - "Batgirl1b.png", "Batgirl2b.png", "Batgirl3b.png", - "Batgirl1c.png", "Batgirl2c.png", "Batgirl3c.png" - }; - - private static final Point origin = new Point(35, 35); - - private final Image image; - private final Dimension dimension = new Dimension(122, 122); - private Point position; - private Point target; - - public Tile(int cell, int image) { +public class Tile +{ + private static final String[] resources = {"Batgirl1a.png", + "Batgirl2a.png", + "Batgirl3a.png", + "Batgirl1b.png", + "Batgirl2b.png", + "Batgirl3b.png", + "Batgirl1c.png", + "Batgirl2c.png", + "Batgirl3c.png" }; + private static final Point origin = new Point(35, 35); + private final Image image; + private final Dimension dimension = new Dimension(122, 122); + private Point position; + private Point target; + public Tile(int cell, int image) + { this.position = getPosition(cell); this.image = getImage(image); } - - public static Point getPosition(int cell) { + public static Point getPosition(int cell) + { Point offset = Puzzle.getPosition(cell); return new Point(origin.x + (127 * offset.x), origin.y + (127 * offset.y)); } - - private static Image getImage(int image) { + private static Image getImage(int image) + { return ObjectUtils.loadImage(Tile.class, resources[image]); } - - private static int stepTowardGoal(int current, int goal) { - if (current < goal) { - return current + 1; - } - if (goal < current) { - return current - 1; - } + private static int stepTowardGoal(int current, int goal) + { + if (current < goal) { return current + 1; } + if (goal < current) { return current - 1; } return current; } - - public void paint(Graphics2D g2d) { - g2d.drawImage(this.image, this.position.x, this.position.y, this.dimension.width, this.dimension.height, - null); + public void paint(Graphics2D g2d) + { + g2d.drawImage(this.image, this.position.x, this.position.y, this.dimension.width, this.dimension.height, null); } - - public boolean isAtTarget() { - return target == null || - (target.x == position.x && target.y == position.y); + public boolean isAtTarget() + { + return target == null || (target.x == position.x && target.y == position.y); } - - public void step() { + public void step() + { int x = stepTowardGoal(position.x, target.x); int y = stepTowardGoal(position.y, target.y); this.position = new Point(x, y); } - - public void moveTo(Point goal) { + public void moveTo(Point goal) + { target = goal; } } diff --git a/src/org/teachingkidsprogramming/recipes/inDevelopment/SpiderWebQuiz.java b/src/main/java/org/teachingkidsprogramming/recipes/inDevelopment/SpiderWebQuiz.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/inDevelopment/SpiderWebQuiz.java rename to src/main/java/org/teachingkidsprogramming/recipes/inDevelopment/SpiderWebQuiz.java diff --git a/src/main/java/org/teachingkidsprogramming/section08tdd/SimplePuzzle.java b/src/main/java/org/teachingkidsprogramming/section08tdd/SimplePuzzle.java index cb70517..a13c265 100644 --- a/src/main/java/org/teachingkidsprogramming/section08tdd/SimplePuzzle.java +++ b/src/main/java/org/teachingkidsprogramming/section08tdd/SimplePuzzle.java @@ -7,7 +7,6 @@ import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; -import org.teachingextensions.approvals.lite.util.MySystem; import org.teachingextensions.logo.AStarPlayer; import org.teachingextensions.logo.Puzzle; import org.teachingextensions.logo.PuzzleAnimation; @@ -44,7 +43,6 @@ public void run() // int[] cells = {0, 1, 2, 3, 4, 5, 6, 7, 8}; // int[] shuffled = shuffled(cells); int[] shuffled = {5, 6, 2, 4, 1, 8, 7, 0, 3}; // known to be solvable - MySystem.message(Arrays.toString(shuffled)); Puzzle puzzle = new Puzzle(shuffled); PuzzlePlayer player = new AStarPlayer(puzzle); PuzzleState solution = player.solve(); diff --git a/src/org/teachingextensions/approvals/lite/ApprovalApprover.java b/src/org/teachingextensions/approvals/lite/ApprovalApprover.java deleted file mode 100644 index 41cf25b..0000000 --- a/src/org/teachingextensions/approvals/lite/ApprovalApprover.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.teachingextensions.approvals.lite; - -public interface ApprovalApprover { - boolean approve() throws Exception; - - public void cleanUpAfterSuccess(ApprovalFailureReporter reporter) throws Exception; - - void fail(); - - void reportFailure(ApprovalFailureReporter reporter) throws Exception; -} diff --git a/src/org/teachingextensions/approvals/lite/ApprovalFailureOverrider.java b/src/org/teachingextensions/approvals/lite/ApprovalFailureOverrider.java deleted file mode 100644 index 02fe5d5..0000000 --- a/src/org/teachingextensions/approvals/lite/ApprovalFailureOverrider.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.teachingextensions.approvals.lite; - - -public interface ApprovalFailureOverrider extends ApprovalFailureReporter { - public boolean askToChangeReceivedToApproved(String received, String approved) throws Exception; -} diff --git a/src/org/teachingextensions/approvals/lite/ApprovalFailureReporter.java b/src/org/teachingextensions/approvals/lite/ApprovalFailureReporter.java deleted file mode 100644 index 7f648b7..0000000 --- a/src/org/teachingextensions/approvals/lite/ApprovalFailureReporter.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.teachingextensions.approvals.lite; - -public interface ApprovalFailureReporter { - public void report(String received, String approved) throws Exception; -} diff --git a/src/org/teachingextensions/approvals/lite/ApprovalReporterWithCleanUp.java b/src/org/teachingextensions/approvals/lite/ApprovalReporterWithCleanUp.java deleted file mode 100644 index 1015490..0000000 --- a/src/org/teachingextensions/approvals/lite/ApprovalReporterWithCleanUp.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.teachingextensions.approvals.lite; - -public interface ApprovalReporterWithCleanUp { - public void cleanUp(String received, String approved) throws Exception; -} diff --git a/src/org/teachingextensions/approvals/lite/ApprovalWriter.java b/src/org/teachingextensions/approvals/lite/ApprovalWriter.java deleted file mode 100644 index 4b94c2a..0000000 --- a/src/org/teachingextensions/approvals/lite/ApprovalWriter.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.teachingextensions.approvals.lite; - - -public interface ApprovalWriter { - public String writeReceivedFile(String received) throws Exception; - - public String getReceivedFilename(String base); - - public String getApprovalFilename(String base); -} diff --git a/src/org/teachingextensions/approvals/lite/Approvals.java b/src/org/teachingextensions/approvals/lite/Approvals.java deleted file mode 100644 index cc2427a..0000000 --- a/src/org/teachingextensions/approvals/lite/Approvals.java +++ /dev/null @@ -1,104 +0,0 @@ -package org.teachingextensions.approvals.lite; - -import org.teachingextensions.approvals.lite.ReporterFactory.FileTypes; -import org.teachingextensions.approvals.lite.namer.ApprovalNamer; -import org.teachingextensions.approvals.lite.namer.JUnitStackTraceNamer; -import org.teachingextensions.approvals.lite.util.ArrayUtils; -import org.teachingextensions.approvals.lite.util.ObjectUtils; -import org.teachingextensions.approvals.lite.util.StringUtils; -import org.teachingextensions.approvals.lite.util.lambda.Function1; -import org.teachingextensions.approvals.lite.writers.ApprovalTextWriter; -import org.teachingextensions.approvals.lite.writers.ComponentApprovalWriter; -import org.teachingextensions.approvals.lite.writers.ImageApprovalWriter; - -import java.awt.*; -import java.awt.image.BufferedImage; -import java.util.Arrays; - -public class Approvals { - public static void verify(String response) throws Exception { - verify(new ApprovalTextWriter(response, "txt"), FileTypes.Text); - } - - public static void verifyAll(String header, T[] values) { - Approvals.verifyAll(header, Arrays.asList(values)); - } - - public static void verifyAll(String header, Iterable values) { - Approvals.verifyAll(header, values, new Function1() { - @Override - public String call(T i) { - return i + ""; - } - }); - - } - - public static void verifyAll(String header, T[] values, - Function1 f1) { - verifyAll(header, Arrays.asList(values), f1); - } - - public static void verifyAll(String header, Iterable array, - Function1 f1) { - String text = formatHeader(header) + ArrayUtils.toString(array, f1); - verify(new ApprovalTextWriter(text, "txt"), FileTypes.Text); - } - - private static String formatHeader(String header) { - return StringUtils.isEmpty(header) ? "" : header + "\r\n\r\n\r\n"; - } - - public static void verifyHtml(String response) throws Exception { - verify(new ApprovalTextWriter(response, "html"), FileTypes.Html); - } - - public static void verify(Component component) { - BufferedImage image = ComponentApprovalWriter.drawComponent(component); - Approvals.verify(image); - } - - public static void verify(BufferedImage bufferedImage) { - verify(new ImageApprovalWriter(bufferedImage), FileTypes.Image); - } - - public static void verify(ApprovalWriter writer, ApprovalNamer namer, - ApprovalFailureReporter reporter) { - verify(new FileApprover(writer, namer), reporter); - } - - public static void verify(ApprovalWriter writer, String fileType) { - verify(writer, createApprovalNamer(), ReporterFactory.get(fileType)); - } - - public static void verify(FileApprover approver, - ApprovalFailureReporter reporter) { - try { - if (!approver.approve()) { - boolean passed = false; - if (reporter instanceof ApprovalFailureOverrider) { - passed = approver - .askToChangeReceivedToApproved((ApprovalFailureOverrider) reporter); - } - if (!passed) { - approver.reportFailure(reporter); - approver.fail(); - } else { - approver.cleanUpAfterSuccess(reporter); - } - } else { - approver.cleanUpAfterSuccess(reporter); - } - } catch (Exception e) { - throw ObjectUtils.throwAsError(e); - } - } - - public static ApprovalNamer createApprovalNamer() { - return new JUnitStackTraceNamer(); - } - - public static void verify(Object o) throws Exception { - Approvals.verify(o + ""); - } -} diff --git a/src/org/teachingextensions/approvals/lite/FileApprover.java b/src/org/teachingextensions/approvals/lite/FileApprover.java deleted file mode 100644 index 97cef41..0000000 --- a/src/org/teachingextensions/approvals/lite/FileApprover.java +++ /dev/null @@ -1,57 +0,0 @@ -package org.teachingextensions.approvals.lite; - -import junit.framework.TestCase; -import org.teachingextensions.approvals.lite.namer.ApprovalNamer; -import org.teachingextensions.approvals.lite.namer.NamerFactory; -import org.teachingextensions.approvals.lite.util.ObjectUtils; -import org.teachingextensions.approvals.lite.util.io.FileUtils; - -import java.io.File; -import java.io.IOException; - -public class FileApprover implements ApprovalApprover { - private File received; - private File approved; - private final ApprovalWriter writter; - - public FileApprover(ApprovalWriter writter, ApprovalNamer namer) { - this.writter = writter; - String base = String.format("%s%s%s", namer.getSourceFilePath(), namer.getApprovalName(), - NamerFactory.getAndClearAdditionalInformation()); - received = new File(writter.getReceivedFilename(base)); - approved = new File(writter.getApprovalFilename(base)); - } - - public boolean approve() throws Exception { - received = new File(writter.writeReceivedFile(received.getAbsolutePath())); - return approveTextFile(received, approved); - } - - public void cleanUpAfterSuccess(ApprovalFailureReporter reporter) throws Exception { - received.delete(); - if (reporter instanceof ApprovalReporterWithCleanUp) { - ((ApprovalReporterWithCleanUp) reporter).cleanUp(received.getAbsolutePath(), approved.getAbsolutePath()); - } - } - - public void reportFailure(ApprovalFailureReporter reporter) throws Exception { - reporter.report(received.getAbsolutePath(), approved.getAbsolutePath()); - } - - public void fail() { - TestCase.assertEquals("Failed Approval", approved.getAbsolutePath(), received.getAbsolutePath()); - } - - public static boolean approveTextFile(File expected, File actual) throws IOException { - if (!expected.exists() || !actual.exists()) { - return false; - } - String t1 = FileUtils.readFile(expected); - String t2 = FileUtils.readFile(actual); - return ObjectUtils.isEqual(t1, t2); - } - - public boolean askToChangeReceivedToApproved(ApprovalFailureOverrider reporter) throws Exception { - return reporter.askToChangeReceivedToApproved(received.getAbsolutePath(), approved.getAbsolutePath()); - } -} diff --git a/src/org/teachingextensions/approvals/lite/ReporterFactory.java b/src/org/teachingextensions/approvals/lite/ReporterFactory.java deleted file mode 100644 index 01ddfba..0000000 --- a/src/org/teachingextensions/approvals/lite/ReporterFactory.java +++ /dev/null @@ -1,93 +0,0 @@ -package org.teachingextensions.approvals.lite; - -import org.teachingextensions.approvals.lite.reporters.*; -import org.teachingextensions.approvals.lite.util.ClassUtils; - -import java.lang.annotation.Annotation; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public class ReporterFactory { - private static HashMap> reporters = new HashMap<>(); - - public static class FileTypes { - public static final String Text = "txt"; - public static final String Html = "html"; - public static final String Excel = "csv"; - public static final String File = "file"; - public static final String Image = "png"; - private static final String Default = "default"; - } - - static { - setupReporters(); - } - - public static ApprovalFailureReporter get(String string) { - ApprovalFailureReporter returned = getFromAnnotation(); - returned = tryFor(returned, reporters.get(string)); - returned = tryFor(returned, reporters.get(FileTypes.Default)); - return returned; - } - - public static ApprovalFailureReporter getFromAnnotation() { - UseReporter reporter = getAnnotationFromStackTrace(UseReporter.class); - return reporter == null ? null : getReporter(reporter); - } - - private static ApprovalFailureReporter getReporter(UseReporter reporter) { - Class[] classes = reporter.value(); - List reporters = new ArrayList<>(); - for (Class clazz : classes) { - ApprovalFailureReporter instance = ClassUtils.create(clazz); - reporters.add(instance); - } - return reporters.size() == 1 ? reporters.get(0) : new MultiReporter(reporters); - } - - private static T getAnnotationFromStackTrace(Class annotationClass) { - StackTraceElement[] trace = Thread.currentThread().getStackTrace(); - for (StackTraceElement stack : trace) { - Method method = null; - Class clazz = null; - try { - String methodName = stack.getMethodName(); - clazz = Class.forName(stack.getClassName()); - method = clazz.getMethod(methodName, (Class[]) null); - } catch (Exception e) { - //ignore - } - T annotation = null; - if (method != null) { - annotation = method.getAnnotation(annotationClass); - } - if (annotation != null) { - return annotation; - } - annotation = clazz != null ? clazz.getAnnotation(annotationClass) : null; - if (annotation != null) { - return annotation; - } - } - return null; - } - - private static ApprovalFailureReporter tryFor(ApprovalFailureReporter returned, - Class trying) { - if (returned == null && trying != null) { - return ClassUtils.create(trying); - } - return returned; - } - - private static void setupReporters() { - reporters.put(FileTypes.Text, DiffReporter.class); - reporters.put(FileTypes.Html, DiffReporter.class); - reporters.put(FileTypes.Excel, FileLauncherReporter.class); - reporters.put(FileTypes.File, FileLauncherReporter.class); - reporters.put(FileTypes.Image, ImageReporter.class); - reporters.put(FileTypes.Default, QuietReporter.class); - } -} diff --git a/src/org/teachingextensions/approvals/lite/namer/ApprovalNamer.java b/src/org/teachingextensions/approvals/lite/namer/ApprovalNamer.java deleted file mode 100644 index 22c2b77..0000000 --- a/src/org/teachingextensions/approvals/lite/namer/ApprovalNamer.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.teachingextensions.approvals.lite.namer; - -public interface ApprovalNamer { - String getApprovalName(); - - String getSourceFilePath(); -} diff --git a/src/org/teachingextensions/approvals/lite/namer/ApprovalResults.java b/src/org/teachingextensions/approvals/lite/namer/ApprovalResults.java deleted file mode 100644 index aadce2c..0000000 --- a/src/org/teachingextensions/approvals/lite/namer/ApprovalResults.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.teachingextensions.approvals.lite.namer; - -public class ApprovalResults { - public static void UniqueForOs() { - NamerFactory.asMachineSpecificTest(new OsEnvironmentLabeller()); - } -} diff --git a/src/org/teachingextensions/approvals/lite/namer/JUnitStackTraceNamer.java b/src/org/teachingextensions/approvals/lite/namer/JUnitStackTraceNamer.java deleted file mode 100644 index 7421eeb..0000000 --- a/src/org/teachingextensions/approvals/lite/namer/JUnitStackTraceNamer.java +++ /dev/null @@ -1,70 +0,0 @@ -package org.teachingextensions.approvals.lite.namer; - -import junit.framework.TestCase; -import org.junit.Test; -import org.teachingextensions.approvals.lite.util.ObjectUtils; -import org.teachingextensions.approvals.lite.util.StackTraceReflectionResult; -import org.teachingextensions.approvals.lite.util.TestUtils; -import org.teachingextensions.approvals.lite.util.io.StackElementSelector; - -import java.io.File; -import java.lang.reflect.Method; - -public class JUnitStackTraceNamer implements ApprovalNamer { - private StackTraceReflectionResult info; - - public JUnitStackTraceNamer() { - info = TestUtils.getCurrentFileForMethod(new JUnit3StackSelector()); - } - - @Override - public String getApprovalName() { - return String.format("%s.%s", info.getClassName(), info.getMethodName()); - } - - @Override - public String getSourceFilePath() { - return info.getSourceFile().getAbsolutePath() + File.separator; - } - /**************************************************************/ - /* INNER CLASSES */ - - /** - * ********************************************************** - */ - public static class JUnit3StackSelector implements StackElementSelector { - @Override - public StackTraceElement selectElement(StackTraceElement[] trace) throws Exception { - boolean inTestCase = false; - for (int i = 0; i < trace.length; i++) { - if (isTestCase(trace[i])) { - inTestCase = true; - } else if (inTestCase) { - return trace[i - 1]; - } - } - throw new RuntimeException("Could not find Junit TestCase you are running"); - } - - private boolean isTestCase(StackTraceElement element) throws ClassNotFoundException { - String fullClassName = element.getClassName(); - Class clazz = Class.forName(fullClassName); - boolean junit3 = ObjectUtils.isThisInstanceOfThat(clazz, TestCase.class); - if (!junit3) { - junit3 = isTestAttribute(clazz, element.getMethodName()); - } - return junit3; - } - - private boolean isTestAttribute(Class clazz, String methodName) throws ClassNotFoundException, SecurityException { - Method method; - try { - method = clazz.getMethod(methodName); - } catch (Throwable e) { - return false; - } - - return method.isAnnotationPresent(Test.class); - } - } -} diff --git a/src/org/teachingextensions/approvals/lite/namer/NamerFactory.java b/src/org/teachingextensions/approvals/lite/namer/NamerFactory.java deleted file mode 100644 index 3c2fd9f..0000000 --- a/src/org/teachingextensions/approvals/lite/namer/NamerFactory.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.teachingextensions.approvals.lite.namer; - -import org.teachingextensions.approvals.lite.util.lambda.Function0; - -public class NamerFactory { - private static String additionalInformation; - - public static String getAndClearAdditionalInformation() { - if (additionalInformation == null) { - return ""; - } - String out = "." + additionalInformation; - additionalInformation = null; - return out; - } - - public static void asMachineSpecificTest(Function0 environmentLabeller) { - additionalInformation = environmentLabeller.call(); - } -} diff --git a/src/org/teachingextensions/approvals/lite/namer/OsEnvironmentLabeller.java b/src/org/teachingextensions/approvals/lite/namer/OsEnvironmentLabeller.java deleted file mode 100644 index 7ffbfbb..0000000 --- a/src/org/teachingextensions/approvals/lite/namer/OsEnvironmentLabeller.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.teachingextensions.approvals.lite.namer; - -import org.teachingextensions.approvals.lite.util.lambda.Function0; - -public class OsEnvironmentLabeller implements Function0 { - @Override - public String call() { - return System.getProperty("os.name").replace(' ', '_'); - } -} diff --git a/src/org/teachingextensions/approvals/lite/reporters/ClipboardReporter.java b/src/org/teachingextensions/approvals/lite/reporters/ClipboardReporter.java deleted file mode 100644 index 681fc0b..0000000 --- a/src/org/teachingextensions/approvals/lite/reporters/ClipboardReporter.java +++ /dev/null @@ -1,41 +0,0 @@ -package org.teachingextensions.approvals.lite.reporters; - -import org.teachingextensions.approvals.lite.util.SystemUtils; -import org.teachingextensions.approvals.lite.util.WindowUtils; - -import java.awt.*; -import java.io.File; - -/** - * A reporter which creates the command to accept the received - * file as the approve file and copies it to the clipboard:
- * move received.txt approved.txt - */ -public class ClipboardReporter implements EnvironmentAwareReporter { - @Override - public void report(String received, String approved) throws Exception { - WindowUtils.copyToClipBoard(getCommandLine(received, approved), false); - } - - public static String getCommandLine(String received, String approved) { - File r = new File(received); - File a = new File(approved); - return ClipboardReporter.getAcceptApprovalText(r.getAbsolutePath(), a.getAbsolutePath()); - } - - /** - * The clipboard will not be available in a headless environment. - */ - @Override - public boolean isWorkingInThisEnvironment(String forFile) { - return !GraphicsEnvironment.isHeadless(); - } - - public static String getAcceptApprovalText(String received, String approved) { - if (SystemUtils.isWindowsEnvironment()) { - return String.format("move /Y \"%s\" \"%s\"", received, approved); - } else { - return String.format("mv %s %s", received, approved); - } - } -} diff --git a/src/org/teachingextensions/approvals/lite/reporters/DelayedClipboardReporter.java b/src/org/teachingextensions/approvals/lite/reporters/DelayedClipboardReporter.java deleted file mode 100644 index cfea6aa..0000000 --- a/src/org/teachingextensions/approvals/lite/reporters/DelayedClipboardReporter.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.teachingextensions.approvals.lite.reporters; - -import org.teachingextensions.approvals.lite.util.StringUtils; -import org.teachingextensions.approvals.lite.util.WindowUtils; - -import java.awt.*; - -/** - * A reporter which creates the command to accept the received - * file as the approve file and copies it to the clipboard:
- * move received.txt approved.txt - */ -public class DelayedClipboardReporter implements EnvironmentAwareReporter { - private static StringBuffer text = new StringBuffer(); - - @Override - public void report(String received, String approved) throws Exception { - String commandLine = ClipboardReporter.getCommandLine(received, approved); - text.append(commandLine).append(StringUtils.NEW_LINE); - WindowUtils.copyToClipBoard(text.toString(), false); - } - - /** - * The clipboard will not be available in a headless environment. - */ - @Override - public boolean isWorkingInThisEnvironment(String forFile) { - return !GraphicsEnvironment.isHeadless(); - } -} diff --git a/src/org/teachingextensions/approvals/lite/reporters/DiffReporter.java b/src/org/teachingextensions/approvals/lite/reporters/DiffReporter.java deleted file mode 100644 index 77f0056..0000000 --- a/src/org/teachingextensions/approvals/lite/reporters/DiffReporter.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.teachingextensions.approvals.lite.reporters; - -import org.teachingextensions.approvals.lite.reporters.macosx.MacDiffReporter; -import org.teachingextensions.approvals.lite.reporters.windows.WindowsDiffReporter; - -public class DiffReporter extends FirstWorkingReporter { - public static final DiffReporter INSTANCE = new DiffReporter(); - - public DiffReporter() { - super(WindowsDiffReporter.INSTANCE, MacDiffReporter.INSTANCE, JunitReporter.INSTANCE, QuietReporter.INSTANCE); - } -} diff --git a/src/org/teachingextensions/approvals/lite/reporters/EnvironmentAwareReporter.java b/src/org/teachingextensions/approvals/lite/reporters/EnvironmentAwareReporter.java deleted file mode 100644 index 40e2a41..0000000 --- a/src/org/teachingextensions/approvals/lite/reporters/EnvironmentAwareReporter.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.teachingextensions.approvals.lite.reporters; - -import org.teachingextensions.approvals.lite.ApprovalFailureReporter; - -public interface EnvironmentAwareReporter extends ApprovalFailureReporter { - boolean isWorkingInThisEnvironment(String forFile); -} diff --git a/src/org/teachingextensions/approvals/lite/reporters/FileLauncherReporter.java b/src/org/teachingextensions/approvals/lite/reporters/FileLauncherReporter.java deleted file mode 100644 index cf1b50c..0000000 --- a/src/org/teachingextensions/approvals/lite/reporters/FileLauncherReporter.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.teachingextensions.approvals.lite.reporters; - - -import org.teachingextensions.approvals.lite.ApprovalFailureReporter; -import org.teachingextensions.approvals.lite.util.TestUtils; -import org.teachingextensions.approvals.lite.util.io.FileUtils; - -public class FileLauncherReporter implements ApprovalFailureReporter { - @Override - public void report(String received, String approved) throws Exception { - if (FileUtils.isNonEmptyFile(approved)) { - TestUtils.displayFile(approved); - } - TestUtils.displayFile(received); - } -} diff --git a/src/org/teachingextensions/approvals/lite/reporters/FirstWorkingReporter.java b/src/org/teachingextensions/approvals/lite/reporters/FirstWorkingReporter.java deleted file mode 100644 index 599ebf4..0000000 --- a/src/org/teachingextensions/approvals/lite/reporters/FirstWorkingReporter.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.teachingextensions.approvals.lite.reporters; - -public class FirstWorkingReporter implements EnvironmentAwareReporter { - private final EnvironmentAwareReporter[] reporters; - - public FirstWorkingReporter(EnvironmentAwareReporter... reporters) { - this.reporters = reporters; - } - - @Override - public void report(String received, String approved) throws Exception { - for (EnvironmentAwareReporter reporter : reporters) { - if (reporter.isWorkingInThisEnvironment(received)) { - reporter.report(received, approved); - return; - } - } - } - - @Override - public boolean isWorkingInThisEnvironment(String forFile) { - for (EnvironmentAwareReporter reporter : reporters) { - if (reporter.isWorkingInThisEnvironment(forFile)) { - return true; - } - } - return false; - } -} diff --git a/src/org/teachingextensions/approvals/lite/reporters/GenericDiffReporter.java b/src/org/teachingextensions/approvals/lite/reporters/GenericDiffReporter.java deleted file mode 100644 index 2855c8c..0000000 --- a/src/org/teachingextensions/approvals/lite/reporters/GenericDiffReporter.java +++ /dev/null @@ -1,84 +0,0 @@ -package org.teachingextensions.approvals.lite.reporters; - -import org.teachingextensions.approvals.lite.util.ThreadUtils; -import org.teachingextensions.approvals.lite.util.io.FileUtils; - -import java.io.File; -import java.io.IOException; -import java.util.Arrays; -import java.util.List; - -public class GenericDiffReporter implements EnvironmentAwareReporter { - public static final String STANDARD_ARGUMENTS = "%s %s"; - public static boolean REPORT_MISSING_FILES = false; - protected String diffProgram; - protected String arguments; - protected String diffProgramNotFoundMessage; - private List validExtensions; - public static List TEXT_FILE_EXTENSIONS = Arrays.asList(".txt", ".csv", ".htm", ".html", ".xml", - ".eml", ".java", ".css", ".js"); - public static List IMAGE_FILE_EXTENSIONS = Arrays.asList(".png", ".gif", ".jpg", ".jpeg", ".bmp", - ".tif", ".tiff"); - - public GenericDiffReporter(String diffProgram, String diffProgramNotFoundMessage) { - this(diffProgram, STANDARD_ARGUMENTS, diffProgramNotFoundMessage); - } - - private GenericDiffReporter(String diffProgram, String argumentsFormat, String diffProgramNotFoundMessage) { - this(diffProgram, argumentsFormat, diffProgramNotFoundMessage, TEXT_FILE_EXTENSIONS); - } - - public GenericDiffReporter(String diffProgram, String argumentsFormat, String diffProgramNotFoundMessage, - List validFileExtensions) { - this.diffProgram = diffProgram; - this.arguments = argumentsFormat; - this.diffProgramNotFoundMessage = diffProgramNotFoundMessage; - validExtensions = validFileExtensions; - } - - @Override - public void report(String received, String approved) throws Exception { - if (!isWorkingInThisEnvironment(received)) { - throw new RuntimeException(diffProgramNotFoundMessage); - } - FileUtils.createIfNeeded(approved); - launch(received, approved); - } - - private void launch(String received, String approved) throws IOException { - ProcessBuilder builder = new ProcessBuilder(getCommandLine(received, approved)); - builder.start(); - ThreadUtils.sleep(500); //Give program time to start - } - - public String[] getCommandLine(String received, String approved) { - String[] p = arguments.split(" "); - String r = String.format(p[0], received); - String a = String.format(p[1], approved); - String[] commands = new String[]{diffProgram, r, a}; - System.out.println(Arrays.toString(commands)); - return commands; - } - - @Override - public boolean isWorkingInThisEnvironment(String forFile) { - return checkFileExists() && isFileExtensionHandled(forFile); - } - - public boolean checkFileExists() { - boolean exists = new File(diffProgram).exists(); - if (REPORT_MISSING_FILES && !exists) { - System.out.println(String.format("%s can't find '%s'", this.getClass().getSimpleName(), diffProgram)); - } - return exists; - } - - public boolean isFileExtensionHandled(String forFile) { - return isFileExtensionValid(forFile, validExtensions); - } - - public static boolean isFileExtensionValid(String forFile, List validExtensionsWithDot) { - String extensionWithDot = FileUtils.getExtensionWithDot(forFile); - return validExtensionsWithDot.contains(extensionWithDot); - } -} diff --git a/src/org/teachingextensions/approvals/lite/reporters/ImageReporter.java b/src/org/teachingextensions/approvals/lite/reporters/ImageReporter.java deleted file mode 100644 index 2aeea3c..0000000 --- a/src/org/teachingextensions/approvals/lite/reporters/ImageReporter.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.teachingextensions.approvals.lite.reporters; - -import org.teachingextensions.approvals.lite.reporters.macosx.KaleidoscopeDiffReporter; -import org.teachingextensions.approvals.lite.reporters.windows.BeyondCompareReporter; -import org.teachingextensions.approvals.lite.reporters.windows.TortoiseImageDiffReporter; - -public class ImageReporter extends FirstWorkingReporter { - public ImageReporter() { - super(TortoiseImageDiffReporter.INSTANCE, BeyondCompareReporter.INSTANCE, KaleidoscopeDiffReporter.INSTANCE, - ImageWebReporter.INSTANCE, QuietReporter.INSTANCE); - } -} diff --git a/src/org/teachingextensions/approvals/lite/reporters/ImageWebReporter.java b/src/org/teachingextensions/approvals/lite/reporters/ImageWebReporter.java deleted file mode 100644 index e22ca92..0000000 --- a/src/org/teachingextensions/approvals/lite/reporters/ImageWebReporter.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.teachingextensions.approvals.lite.reporters; - -import org.teachingextensions.approvals.lite.util.TestUtils; - -import java.awt.*; - -public class ImageWebReporter implements EnvironmentAwareReporter { - public static final ImageWebReporter INSTANCE = new ImageWebReporter(); - - @Override - public void report(String received, String approved) throws Exception { - String text = "
 
MediumVioletRedPurples, Reds, Reds, Purples,
DeepPink
PaleVioletRedPurples, Reds, Reds, Purples,
Fuchsia
MediumVioletRedPurples, Pinks, Pinks, Purples,
IndianRed
PaleVioletRedPurples, Pinks, Pinks, Purples,
Salmon
approvedreceived
%s
to approve : copy clipboard to command window
%s"; - String moveText = ClipboardReporter.getAcceptApprovalText(received, approved); - text = String.format(text, approved, received, received, moveText); - TestUtils.displayHtml(text); - } - - /** - * We assume any environment that is not headless will have a web browser to display the image in a web page. - */ - @Override - public boolean isWorkingInThisEnvironment(String forFile) { - return !GraphicsEnvironment.isHeadless() - && GenericDiffReporter.isFileExtensionValid(forFile, GenericDiffReporter.IMAGE_FILE_EXTENSIONS); - } -} diff --git a/src/org/teachingextensions/approvals/lite/reporters/JunitReporter.java b/src/org/teachingextensions/approvals/lite/reporters/JunitReporter.java deleted file mode 100644 index 64c3cd6..0000000 --- a/src/org/teachingextensions/approvals/lite/reporters/JunitReporter.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.teachingextensions.approvals.lite.reporters; - -import junit.framework.TestCase; -import org.teachingextensions.approvals.lite.util.io.FileUtils; - -import java.io.File; - -public class JunitReporter implements EnvironmentAwareReporter { - public static final JunitReporter INSTANCE = new JunitReporter(); - - @Override - public void report(String received, String approved) throws Exception { - String aText = new File(approved).exists() ? FileUtils.readFile(approved) : ""; - String rText = FileUtils.readFile(received); - String approveCommand = "To approve run : " + ClipboardReporter.getAcceptApprovalText(received, approved); - System.out.println(approveCommand); - TestCase.assertEquals(aText, rText); - } - - @Override - public boolean isWorkingInThisEnvironment(String forFile) { - try { - TestCase.assertTrue(true); - } catch (Throwable t) { - return false; - } - return GenericDiffReporter.isFileExtensionValid(forFile, GenericDiffReporter.TEXT_FILE_EXTENSIONS); - } -} \ No newline at end of file diff --git a/src/org/teachingextensions/approvals/lite/reporters/MultiReporter.java b/src/org/teachingextensions/approvals/lite/reporters/MultiReporter.java deleted file mode 100644 index 6e0019c..0000000 --- a/src/org/teachingextensions/approvals/lite/reporters/MultiReporter.java +++ /dev/null @@ -1,31 +0,0 @@ -package org.teachingextensions.approvals.lite.reporters; - -import org.teachingextensions.approvals.lite.ApprovalFailureReporter; - -import java.util.ArrayList; -import java.util.Collection; - -public class MultiReporter implements ApprovalFailureReporter { - private final Collection reporters; - - public MultiReporter(Collection reporters) { - this.reporters = reporters; - } - - @Override - public void report(String received, String approved) throws Exception { - ArrayList exceptions = new ArrayList<>(); - for (ApprovalFailureReporter reporter : reporters) { - try { - reporter.report(received, approved); - } catch (Throwable t) { - exceptions.add(t); - } - } - MultipleExceptions.rethrowExceptions(exceptions); - } - - public ApprovalFailureReporter[] getReporters() { - return reporters.toArray(new ApprovalFailureReporter[0]); - } -} diff --git a/src/org/teachingextensions/approvals/lite/reporters/MultipleExceptions.java b/src/org/teachingextensions/approvals/lite/reporters/MultipleExceptions.java deleted file mode 100644 index 97bf2a3..0000000 --- a/src/org/teachingextensions/approvals/lite/reporters/MultipleExceptions.java +++ /dev/null @@ -1,35 +0,0 @@ -package org.teachingextensions.approvals.lite.reporters; - -import java.util.ArrayList; - -public class MultipleExceptions extends RuntimeException { - private static final long serialVersionUID = 1464454338264847972L; - - public MultipleExceptions(ArrayList exceptions) { - super(getText(exceptions), exceptions.get(0)); - } - - public static void rethrowExceptions(ArrayList exceptions) - throws Exception { - if (exceptions.size() != 0) { - if (exceptions.size() == 0) { - Throwable t = exceptions.get(0); - if (t instanceof Exception) { - throw ((Exception) t); - } - throw (Error) t; - } else { - throw new MultipleExceptions(exceptions); - } - } - } - - private static String getText(ArrayList exceptions) { - StringBuilder b = new StringBuilder("Multiple Exceptions Thrown:"); - for (int i = 0; i < exceptions.size(); i++) { - b.append(String.format("\n #%s): %s", i + 1, exceptions.get(i) - .getMessage())); - } - return b.toString(); - } -} diff --git a/src/org/teachingextensions/approvals/lite/reporters/QuietReporter.java b/src/org/teachingextensions/approvals/lite/reporters/QuietReporter.java deleted file mode 100644 index 992d97f..0000000 --- a/src/org/teachingextensions/approvals/lite/reporters/QuietReporter.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.teachingextensions.approvals.lite.reporters; - -public class QuietReporter implements EnvironmentAwareReporter { - public static final QuietReporter INSTANCE = new QuietReporter(); - - @Override - public void report(String received, String approved) throws Exception { - System.out.println(ClipboardReporter.getAcceptApprovalText(received, approved)); - } - - @Override - public boolean isWorkingInThisEnvironment(String forFile) { - return true; - } -} diff --git a/src/org/teachingextensions/approvals/lite/reporters/UseReporter.java b/src/org/teachingextensions/approvals/lite/reporters/UseReporter.java deleted file mode 100644 index bc4901e..0000000 --- a/src/org/teachingextensions/approvals/lite/reporters/UseReporter.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.teachingextensions.approvals.lite.reporters; - -import org.teachingextensions.approvals.lite.ApprovalFailureReporter; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; - -@Retention(RetentionPolicy.RUNTIME) -public @interface UseReporter { - Class[] value(); -} diff --git a/src/org/teachingextensions/approvals/lite/reporters/macosx/BeyondCompareReporter.java b/src/org/teachingextensions/approvals/lite/reporters/macosx/BeyondCompareReporter.java deleted file mode 100644 index 2454b44..0000000 --- a/src/org/teachingextensions/approvals/lite/reporters/macosx/BeyondCompareReporter.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.teachingextensions.approvals.lite.reporters.macosx; - -import org.teachingextensions.approvals.lite.reporters.GenericDiffReporter; - -import java.text.MessageFormat; - -public class BeyondCompareReporter extends GenericDiffReporter { - public static final BeyondCompareReporter INSTANCE = new BeyondCompareReporter(); - static final String DIFF_PROGRAM = "/usr/local/bin/bcompare"; - static final String MESSAGE = MessageFormat.format( - "Unable to find Beyond Compare at {0}", DIFF_PROGRAM); - - public BeyondCompareReporter() { - super(DIFF_PROGRAM, MESSAGE); - } -} diff --git a/src/org/teachingextensions/approvals/lite/reporters/macosx/DiffMergeReporter.java b/src/org/teachingextensions/approvals/lite/reporters/macosx/DiffMergeReporter.java deleted file mode 100644 index adcad65..0000000 --- a/src/org/teachingextensions/approvals/lite/reporters/macosx/DiffMergeReporter.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.teachingextensions.approvals.lite.reporters.macosx; - -import org.teachingextensions.approvals.lite.reporters.GenericDiffReporter; - -import java.text.MessageFormat; - -public class DiffMergeReporter extends GenericDiffReporter { - public static final DiffMergeReporter INSTANCE = new DiffMergeReporter(); - private static final String DIFF_PROGRAM = "/Applications/DiffMerge.app/Contents/MacOS/DiffMerge"; - static final String MESSAGE = MessageFormat.format("Unable to find DiffMerge at {0}", - DIFF_PROGRAM); - - public DiffMergeReporter() { - super(DIFF_PROGRAM, GenericDiffReporter.STANDARD_ARGUMENTS, MESSAGE, GenericDiffReporter.TEXT_FILE_EXTENSIONS); - } -} diff --git a/src/org/teachingextensions/approvals/lite/reporters/macosx/KaleidoscopeDiffReporter.java b/src/org/teachingextensions/approvals/lite/reporters/macosx/KaleidoscopeDiffReporter.java deleted file mode 100644 index 3768b10..0000000 --- a/src/org/teachingextensions/approvals/lite/reporters/macosx/KaleidoscopeDiffReporter.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.teachingextensions.approvals.lite.reporters.macosx; - -import org.teachingextensions.approvals.lite.reporters.GenericDiffReporter; -import org.teachingextensions.approvals.lite.util.ArrayUtils; - -import java.text.MessageFormat; -import java.util.List; - -public class KaleidoscopeDiffReporter extends GenericDiffReporter { - private static final String DIFF_PROGRAM = "/Applications/Kaleidoscope.app/Contents/MacOS/ksdiff"; - static final String MESSAGE = MessageFormat - .format("Unable to find Kaleidoscope at {0}", - DIFF_PROGRAM); - private static List fileTypes = ArrayUtils.combine( - GenericDiffReporter.IMAGE_FILE_EXTENSIONS, - GenericDiffReporter.TEXT_FILE_EXTENSIONS); - public static final KaleidoscopeDiffReporter INSTANCE = new KaleidoscopeDiffReporter(); - - public KaleidoscopeDiffReporter() { - super(DIFF_PROGRAM, GenericDiffReporter.STANDARD_ARGUMENTS, MESSAGE, fileTypes); - } -} diff --git a/src/org/teachingextensions/approvals/lite/reporters/macosx/MacDiffReporter.java b/src/org/teachingextensions/approvals/lite/reporters/macosx/MacDiffReporter.java deleted file mode 100644 index 9ab699e..0000000 --- a/src/org/teachingextensions/approvals/lite/reporters/macosx/MacDiffReporter.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.teachingextensions.approvals.lite.reporters.macosx; - -import org.teachingextensions.approvals.lite.reporters.FirstWorkingReporter; - -public class MacDiffReporter extends FirstWorkingReporter { - public static final MacDiffReporter INSTANCE = new MacDiffReporter(); - - public MacDiffReporter() { - super(DiffMergeReporter.INSTANCE, KaleidoscopeDiffReporter.INSTANCE, P4MergeReporter.INSTANCE, TkDiffReporter.INSTANCE); - } -} diff --git a/src/org/teachingextensions/approvals/lite/reporters/macosx/P4MergeReporter.java b/src/org/teachingextensions/approvals/lite/reporters/macosx/P4MergeReporter.java deleted file mode 100644 index 83f6386..0000000 --- a/src/org/teachingextensions/approvals/lite/reporters/macosx/P4MergeReporter.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.teachingextensions.approvals.lite.reporters.macosx; - -import org.teachingextensions.approvals.lite.reporters.GenericDiffReporter; -import org.teachingextensions.approvals.lite.util.ArrayUtils; - -import java.text.MessageFormat; -import java.util.List; - -public class P4MergeReporter extends GenericDiffReporter { - private static final String DIFF_PROGRAM = "/Applications/p4merge.app/Contents/MacOS/p4merge"; - public static final String MESSAGE = MessageFormat - .format( - "Unable to find P4Merge at {0}" - + "\nYou can install P4Merge " - + "at http://www.perforce.com/downloads/Perforce/20-User#10", - DIFF_PROGRAM); - private static List fileTypes = ArrayUtils.combine(GenericDiffReporter.IMAGE_FILE_EXTENSIONS, - GenericDiffReporter.TEXT_FILE_EXTENSIONS); - public static final P4MergeReporter INSTANCE = new P4MergeReporter(); - - public P4MergeReporter() { - super(DIFF_PROGRAM, GenericDiffReporter.STANDARD_ARGUMENTS, P4MergeReporter.MESSAGE, fileTypes); - } -} diff --git a/src/org/teachingextensions/approvals/lite/reporters/macosx/TkDiffReporter.java b/src/org/teachingextensions/approvals/lite/reporters/macosx/TkDiffReporter.java deleted file mode 100644 index d545454..0000000 --- a/src/org/teachingextensions/approvals/lite/reporters/macosx/TkDiffReporter.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.teachingextensions.approvals.lite.reporters.macosx; - -import org.teachingextensions.approvals.lite.reporters.GenericDiffReporter; - -import java.text.MessageFormat; - -public class TkDiffReporter extends GenericDiffReporter { - private static final String DIFF_PROGRAM = "/Applications/TkDiff.app/Contents/MacOS/tkdiff"; - static final String MESSAGE = MessageFormat.format("Unable to find TkDiffMerge at {0}", - DIFF_PROGRAM); - public static final TkDiffReporter INSTANCE = new TkDiffReporter(); - - public TkDiffReporter() { - super(DIFF_PROGRAM, GenericDiffReporter.STANDARD_ARGUMENTS, MESSAGE, GenericDiffReporter.TEXT_FILE_EXTENSIONS); - } -} diff --git a/src/org/teachingextensions/approvals/lite/reporters/windows/BeyondCompareReporter.java b/src/org/teachingextensions/approvals/lite/reporters/windows/BeyondCompareReporter.java deleted file mode 100644 index e5a83c8..0000000 --- a/src/org/teachingextensions/approvals/lite/reporters/windows/BeyondCompareReporter.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.teachingextensions.approvals.lite.reporters.windows; - -import org.teachingextensions.approvals.lite.reporters.GenericDiffReporter; - -import java.text.MessageFormat; - -public class BeyondCompareReporter extends GenericDiffReporter { - public static final BeyondCompareReporter INSTANCE = new BeyondCompareReporter(); - static final String DIFF_PROGRAM = "C:\\Program Files\\Beyond Compare 3\\BCompare.exe"; - static final String MESSAGE = MessageFormat.format( - "Unable to find Beyond Compare at {0}", DIFF_PROGRAM); - - public BeyondCompareReporter() { - super(DIFF_PROGRAM, MESSAGE); - } -} diff --git a/src/org/teachingextensions/approvals/lite/reporters/windows/TortoiseDiffReporter.java b/src/org/teachingextensions/approvals/lite/reporters/windows/TortoiseDiffReporter.java deleted file mode 100644 index f8fe295..0000000 --- a/src/org/teachingextensions/approvals/lite/reporters/windows/TortoiseDiffReporter.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.teachingextensions.approvals.lite.reporters.windows; - -import org.teachingextensions.approvals.lite.reporters.FirstWorkingReporter; - -public class TortoiseDiffReporter extends FirstWorkingReporter { - public static final TortoiseDiffReporter INSTANCE = new TortoiseDiffReporter(); - - public TortoiseDiffReporter() { - super(TortoiseTextDiffReporter.INSTANCE, TortoiseImageDiffReporter.INSTANCE); - } -} diff --git a/src/org/teachingextensions/approvals/lite/reporters/windows/TortoiseImageDiffReporter.java b/src/org/teachingextensions/approvals/lite/reporters/windows/TortoiseImageDiffReporter.java deleted file mode 100644 index 1036eb2..0000000 --- a/src/org/teachingextensions/approvals/lite/reporters/windows/TortoiseImageDiffReporter.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.teachingextensions.approvals.lite.reporters.windows; - -import org.teachingextensions.approvals.lite.reporters.GenericDiffReporter; - -public class TortoiseImageDiffReporter extends GenericDiffReporter { - public static final TortoiseImageDiffReporter INSTANCE = new TortoiseImageDiffReporter(); - - public TortoiseImageDiffReporter() { - super("C:\\Program Files\\TortoiseSVN\\bin\\TortoiseIDiff.exe", "/left:%s /right:%s", - TortoiseTextDiffReporter.MESSAGE, GenericDiffReporter.IMAGE_FILE_EXTENSIONS); - } -} diff --git a/src/org/teachingextensions/approvals/lite/reporters/windows/TortoiseTextDiffReporter.java b/src/org/teachingextensions/approvals/lite/reporters/windows/TortoiseTextDiffReporter.java deleted file mode 100644 index fda4bb4..0000000 --- a/src/org/teachingextensions/approvals/lite/reporters/windows/TortoiseTextDiffReporter.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.teachingextensions.approvals.lite.reporters.windows; - -import org.teachingextensions.approvals.lite.reporters.GenericDiffReporter; - -import java.text.MessageFormat; - -public class TortoiseTextDiffReporter extends GenericDiffReporter { - public static final TortoiseTextDiffReporter INSTANCE = new TortoiseTextDiffReporter(); - static final String DIFF_PROGRAM = "C:\\Program Files\\TortoiseSVN\\bin\\TortoiseMerge.exe"; - static final String MESSAGE = MessageFormat - .format( - "Unable to find TortoiseMerge at {0}" - + "\nYou can install TortoiseMerge as part " - + "of TortoiseSVN at http://tortisesvn.tigris.org", - DIFF_PROGRAM); - - public TortoiseTextDiffReporter() { - super(DIFF_PROGRAM, MESSAGE); - } -} diff --git a/src/org/teachingextensions/approvals/lite/reporters/windows/WinMergeReporter.java b/src/org/teachingextensions/approvals/lite/reporters/windows/WinMergeReporter.java deleted file mode 100644 index 2182b2c..0000000 --- a/src/org/teachingextensions/approvals/lite/reporters/windows/WinMergeReporter.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.teachingextensions.approvals.lite.reporters.windows; - -import org.teachingextensions.approvals.lite.reporters.GenericDiffReporter; - -import java.text.MessageFormat; - -public class WinMergeReporter extends GenericDiffReporter { - public static final WinMergeReporter INSTANCE = new WinMergeReporter(); - static final String DIFF_PROGRAM = "C:\\Program Files\\WinMerge\\WinMergeU.exe"; - static final String MESSAGE = MessageFormat.format("Unable to find WinMerge at {0}" - + "\nYou can install it at http://winmerge.org/", - DIFF_PROGRAM); - - public WinMergeReporter() { - super(DIFF_PROGRAM, MESSAGE); - } -} diff --git a/src/org/teachingextensions/approvals/lite/reporters/windows/WindowsDiffReporter.java b/src/org/teachingextensions/approvals/lite/reporters/windows/WindowsDiffReporter.java deleted file mode 100644 index 5dbcc73..0000000 --- a/src/org/teachingextensions/approvals/lite/reporters/windows/WindowsDiffReporter.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.teachingextensions.approvals.lite.reporters.windows; - -import org.teachingextensions.approvals.lite.reporters.FirstWorkingReporter; - -public class WindowsDiffReporter extends FirstWorkingReporter { - public static final WindowsDiffReporter INSTANCE = new WindowsDiffReporter(); - - public WindowsDiffReporter() { - super(TortoiseDiffReporter.INSTANCE, BeyondCompareReporter.INSTANCE, WinMergeReporter.INSTANCE); - } -} diff --git a/src/org/teachingextensions/approvals/lite/util/ArrayUtils.java b/src/org/teachingextensions/approvals/lite/util/ArrayUtils.java deleted file mode 100644 index fd06a1e..0000000 --- a/src/org/teachingextensions/approvals/lite/util/ArrayUtils.java +++ /dev/null @@ -1,75 +0,0 @@ -package org.teachingextensions.approvals.lite.util; - -import org.teachingextensions.approvals.lite.util.lambda.Function1; - -import java.util.*; - -/** - * A static class of convenience methods for arrays and collections. - */ -public class ArrayUtils { - public static java.util.Collection addArray(java.util.Collection v, T array[]) { - if ((array == null) || (v == null)) { - return v; - } - Collections.addAll(v, array); - return v; - } - - public static String toString(T[] values, Function1 formatter) { - return toString(Arrays.asList(values), formatter); - } - - public static String toString(Iterable values, Function1 formatter) { - StringBuilder b = new StringBuilder(); - for (T t : values) { - b.append(formatter.call(t)).append("\r\n"); - } - return b.toString(); - } - - public static T[] toReverseArray(T[] array) { - for (int i = 0; i < array.length / 2; i++) { - T o1 = array[i]; - int end = array.length - i - 1; - T o2 = array[end]; - array[i] = o2; - array[end] = o1; - } - return array; - } - - public static boolean isEmpty(Object[] array) { - return ((array == null) || (array.length == 0)); - } - - public static T getFirst(T[] array, Comparator comparator) { - return get(array, comparator, true); - } - - private static T get(T[] array, Comparator sorter, boolean wantFirst) { - if (isEmpty(array)) { - return null; - } - T last = array[0]; - for (int i = 1; i < array.length; i++) { - int compare = sorter.compare(last, array[i]); - if ((wantFirst && compare > 0) || (!wantFirst && compare < 0)) { - last = array[i]; - } - } - return last; - } - - public static T getLast(List list) { - return list.get(list.size() - 1); - } - - public static List combine(List list1, List list2) { - List all = new ArrayList<>(); - all.addAll(list1); - all.addAll(list2); - return all; - } - -} diff --git a/src/org/teachingextensions/approvals/lite/util/Asserts.java b/src/org/teachingextensions/approvals/lite/util/Asserts.java deleted file mode 100644 index a7aea34..0000000 --- a/src/org/teachingextensions/approvals/lite/util/Asserts.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.teachingextensions.approvals.lite.util; - -public class Asserts { - - public static T assertNotNull(String label, T o) { - if (o == null) { - throw new NullPointerException(label + " was null"); - } - return o; - } - - public static void equals(String label, double expected, double actual, double precision) { - if (!NumberUtils.equals(expected, actual, precision)) { - throw new IllegalStateException(label + " " - + expected + "!=" + actual); - } - } - -} diff --git a/src/org/teachingextensions/approvals/lite/util/ClassUtils.java b/src/org/teachingextensions/approvals/lite/util/ClassUtils.java deleted file mode 100644 index addbc78..0000000 --- a/src/org/teachingextensions/approvals/lite/util/ClassUtils.java +++ /dev/null @@ -1,84 +0,0 @@ -package org.teachingextensions.approvals.lite.util; - -import java.io.File; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -public class ClassUtils { - - public static Class getWrapperClass(Class primitiveType) { - if (boolean.class.equals(primitiveType)) { - return Boolean.class; - } else if (float.class.equals(primitiveType)) { - return Float.class; - } else if (long.class.equals(primitiveType)) { - return Long.class; - } else if (int.class.equals(primitiveType)) { - return Integer.class; - } else if (short.class.equals(primitiveType)) { - return Short.class; - } else if (byte.class.equals(primitiveType)) { - return Byte.class; - } else if (double.class.equals(primitiveType)) { - return Double.class; - } else if (char.class.equals(primitiveType)) { - return Character.class; - } else { - return primitiveType; - } - } - - public static boolean hasMethod(Class clazz, String methodName, Class... parameterTypes) { - try { - return clazz.getMethod(methodName, parameterTypes) != null; - } catch (SecurityException e) { - throw ObjectUtils.throwAsError(e); - } catch (NoSuchMethodException e) { - return false; - } - } - - public static File getSourceDirectory(Class clazz) { - final String name = clazz.getName(); - String[] split = name.split("\\."); - split[split.length - 1] = split[split.length - 1] + ".java"; - File found = find(new File("."), Arrays.asList(split)); - if (found == null) { - throw new FormattedException("Didn't find %s under %s", name, new File(".")); - } - return found.getParentFile(); - } - - public static File find(File file, List matches) { - ArrayList copy = new ArrayList<>(); - copy.addAll(matches); - copy.add(0, "*"); - return find2(file, copy); - } - - public static File find2(File file, List matches) { - SearchingFileFilter searchingFileFilter = new SearchingFileFilter(matches); - File[] listFiles = file.listFiles(searchingFileFilter); - for (File file2 : listFiles) { - if (file2.isDirectory()) { - File found = find2(file2, searchingFileFilter.getSubset(file2.getName())); - if (found != null) { - return found; - } - } else { - return file2; - } - } - return null; - } - - public static T create(Class clazz) { - try { - return clazz.newInstance(); - } catch (Exception e) { - throw ObjectUtils.throwAsError(e); - } - } - -} diff --git a/src/org/teachingextensions/approvals/lite/util/DateDifference.java b/src/org/teachingextensions/approvals/lite/util/DateDifference.java deleted file mode 100644 index de34017..0000000 --- a/src/org/teachingextensions/approvals/lite/util/DateDifference.java +++ /dev/null @@ -1,97 +0,0 @@ -package org.teachingextensions.approvals.lite.util; - -import java.util.Calendar; - -public class DateDifference { - public static final String MILLISECONDS = "milliseconds"; - public static final String SECONDS = "seconds"; - public static final String MINUTES = "minutes"; - public static final String HOURS = "hours"; - public static final String DAYS = "days"; - public static final String WEEKS = "weeks"; - public static final String MONTHS = "months"; - public static final String YEARS = "years"; - public static String TIME_UNITS[] = {YEARS, MONTHS, WEEKS, DAYS, HOURS, MINUTES, SECONDS, MILLISECONDS}; - // assumes a 30 day month - private static int TIME_SCALE[] = {Calendar.YEAR, Calendar.MONTH, Calendar.WEEK_OF_YEAR, Calendar.DATE, Calendar.HOUR, Calendar.MINUTE, Calendar.SECOND, Calendar.MILLISECOND}; - private static long DIVIDERS[] = {1000 * 60 * 60 * 24 * 365L, 1000 * 60 * 60 * 24 * 30L, 1000 * 60 * 60 * 24 * 7L, 1000 * 60 * 60 * 24L, 1000 * 60 * 60L, 1000 * 60L, 1000L, 1L}; - - private long milli; - - public DateDifference(long timeDifference) { - this.milli = timeDifference; - } - - public static long getAbsoluteDifference(int unit, long time) { - return time / DIVIDERS[getTimeScaleIndex(unit)]; - } - - public static long getRemainingDifference(int wantedUnit, int roundTo, long time) { - int wantedIndex = getTimeScaleIndex(wantedUnit); - int roundToIndex = getTimeScaleIndex(roundTo); - if (wantedIndex < roundToIndex) { - throw new Error("Can't round with a smaller Unit.[" + TIME_UNITS[wantedIndex] + ", " + TIME_UNITS[roundToIndex] + "]"); - } - return (time % DIVIDERS[roundToIndex]) / DIVIDERS[wantedIndex]; - } - - /** - * @return the index in TIME_SCALE[] of the largest Unit to be > 0 - */ - private int getMaximumTimeUnit() { - int i = 0; - while ((i < DIVIDERS.length) && (milli < DIVIDERS[i])) { - i++; - } - return i; - } - - /** - * Finds the index for a Calendar.DATE ect. - * - * @param calendarTime the time scale to find - * @return the index in TIME_SCALE[] - */ - public static int getTimeScaleIndex(int calendarTime) { - int i = 0; - while (calendarTime != TIME_SCALE[i]) { - i++; - } - return i; - } - - private static long getStandardRoundedTime(int unitIndex, boolean forceAbsolute, long time) { - if (unitIndex == 0 || forceAbsolute) { - return getAbsoluteDifference(TIME_SCALE[unitIndex], time); - } else { - return getRemainingDifference(TIME_SCALE[unitIndex], TIME_SCALE[unitIndex - 1], time); - } - } - - public String getTimeText(int amount, int maxUnit, int minUnit, String nowText, String agoText, String units[]) { - if (amount == 0) { - throw new Error("getTimeText() requires amount > 0"); - } - maxUnit = getTimeScaleIndex(maxUnit); - minUnit = getTimeScaleIndex(minUnit); - int realMax = getMaximumTimeUnit(); - String timeText = nowText; - if (realMax < maxUnit) { - realMax = maxUnit; - } - if (realMax <= minUnit) { - timeText = ""; - long remainingTime = this.milli; - for (int i = realMax; i < (realMax + amount) && (i <= minUnit); i++) { - long time = getStandardRoundedTime(i, i == realMax, remainingTime); - remainingTime -= time * DIVIDERS[i]; - timeText += time + " " + units[(time == 1) ? i * 2 : i * 2 + 1] + ", "; - } - timeText = timeText.substring(0, timeText.length() - 2); - if ((agoText != null) && (agoText.length() > 0)) { - timeText += " " + agoText; - } - } - return timeText; - } -} \ No newline at end of file diff --git a/src/org/teachingextensions/approvals/lite/util/DateUtils.java b/src/org/teachingextensions/approvals/lite/util/DateUtils.java deleted file mode 100644 index bf6cc98..0000000 --- a/src/org/teachingextensions/approvals/lite/util/DateUtils.java +++ /dev/null @@ -1,58 +0,0 @@ -package org.teachingextensions.approvals.lite.util; - -import java.util.Calendar; -import java.util.Date; -import java.util.GregorianCalendar; - -public class DateUtils { - private static int TIME_SCALE[] = {Calendar.YEAR, - Calendar.MONTH, - Calendar.DATE, - Calendar.HOUR_OF_DAY, - Calendar.HOUR, - Calendar.MINUTE, - Calendar.SECOND, - Calendar.MILLISECOND}; - - public static Calendar setSignificantDigit(Calendar calendar, int smallestUnits) { - boolean removeOn = false; - for (int i : TIME_SCALE) { - if (removeOn) { - if (i == Calendar.DATE) { - // Work around since this is broke - calendar.set(i, 1); - } else if (i == Calendar.HOUR_OF_DAY) { - // Work around since this is broke - calendar.set(i, 0); - } else { - calendar.clear(i); - } - } - if (i == smallestUnits) { - removeOn = true; - } - } - return calendar; - } - - public static void main(String args[]) { - MySystem.variable("Calendar.DATE = " + Calendar.DATE); - MySystem.variable("Year", setSignificantDigit(new GregorianCalendar(), Calendar.YEAR).getTime()); - MySystem.variable("Month", setSignificantDigit(new GregorianCalendar(), Calendar.MONTH).getTime()); - MySystem.variable("Day", setSignificantDigit(new GregorianCalendar(), Calendar.DAY_OF_MONTH).getTime()); - MySystem.variable("Hour", setSignificantDigit(new GregorianCalendar(), Calendar.HOUR).getTime()); - MySystem.variable("Minute", setSignificantDigit(new GregorianCalendar(), Calendar.MINUTE).getTime()); - MySystem.variable("End Of Day", rollToEndOfDay(new Date()).getTime()); - } - - public static GregorianCalendar rollToEndOfDay(Date date) { - GregorianCalendar gregorianCalendar = new GregorianCalendar(); - gregorianCalendar.setTime(date); - gregorianCalendar.set(Calendar.HOUR_OF_DAY, 23); - gregorianCalendar.set(Calendar.MINUTE, 59); - gregorianCalendar.set(Calendar.SECOND, 59); - gregorianCalendar.set(Calendar.MILLISECOND, 999); - return gregorianCalendar; - } - -} \ No newline at end of file diff --git a/src/org/teachingextensions/approvals/lite/util/FormattedException.java b/src/org/teachingextensions/approvals/lite/util/FormattedException.java deleted file mode 100644 index 3744d72..0000000 --- a/src/org/teachingextensions/approvals/lite/util/FormattedException.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.teachingextensions.approvals.lite.util; - -public class FormattedException extends RuntimeException { - - private static final long serialVersionUID = -4388436150197314047L; - - public FormattedException(String string, Object... params) { - super(String.format(string, params)); - MySystem.variable(this.getMessage()); - } -} diff --git a/src/org/teachingextensions/approvals/lite/util/FrameCloser.java b/src/org/teachingextensions/approvals/lite/util/FrameCloser.java deleted file mode 100644 index ed785b4..0000000 --- a/src/org/teachingextensions/approvals/lite/util/FrameCloser.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.teachingextensions.approvals.lite.util; - -public class FrameCloser extends java.awt.event.WindowAdapter { - /** - * ******************************************************************* - */ - public void windowClosing(java.awt.event.WindowEvent e) { - e.getWindow().dispose(); - } - - /** - * ******************************************************************* - */ - public void windowClosed(java.awt.event.WindowEvent e) { - System.exit(0); - } - /***********************************************************************/ -} \ No newline at end of file diff --git a/src/org/teachingextensions/approvals/lite/util/LambdaThreadLauncher.java b/src/org/teachingextensions/approvals/lite/util/LambdaThreadLauncher.java deleted file mode 100644 index 719de22..0000000 --- a/src/org/teachingextensions/approvals/lite/util/LambdaThreadLauncher.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.teachingextensions.approvals.lite.util; - -import org.teachingextensions.approvals.lite.util.lambda.Action0; - -public class LambdaThreadLauncher implements Runnable { - private final Action0 function; - - public LambdaThreadLauncher(Action0 function) { - this.function = function; - new Thread(this).start(); - } - - @Override - public void run() { - try { - long delay = 0; - Thread.sleep(delay); - function.call(); - } catch (Throwable t) { - MySystem.warning("Caught throwable exception ", t); - } - } -} diff --git a/src/org/teachingextensions/approvals/lite/util/MySystem.java b/src/org/teachingextensions/approvals/lite/util/MySystem.java deleted file mode 100644 index e1da420..0000000 --- a/src/org/teachingextensions/approvals/lite/util/MySystem.java +++ /dev/null @@ -1,191 +0,0 @@ -package org.teachingextensions.approvals.lite.util; - -import java.io.PrintWriter; -import java.util.Vector; - -/** - * A class for printing comments in a standardized format. - * - * @author Llewellyn - * @version 2.0 - */ -public class MySystem { - public static boolean event = true; - public static boolean variable = true; - public static int hourGlass = 0; - private static long lastTime = System.currentTimeMillis(); - private static PrintWriter SYSTEM_OUT_WRITER = new PrintWriter(System.out, true); - - private static void clearHourGlass() { - if (hourGlass > 0) { - System.out.println(""); - hourGlass = 0; - } - } - - private static String getIndent() { - - return ""; - } - - private static String timeStamp() { - clearHourGlass(); - String text; - long current = System.currentTimeMillis(); - java.text.DateFormat df = java.text.DateFormat.getDateTimeInstance(); - text = "[" + df.format(new java.util.Date(current)) + " ~" + padNumber(current - lastTime) + "ms]" - + getIndent(); - lastTime = current; - return text; - } - - private static String padNumber(long number) { - String text = "" + number; - while (text.length() < 6) { - text = "0" + text; - } - return text; - } - - private static String indentMessage(String message) { - Vector v = new Vector<>(); - int place = 0; - while ((place = message.indexOf('\n', place + 1)) != -1) { - v.addElement(place); - } - if (v.size() == 0) { - // no '\n' - return message; - } - String theIndention = getIndent(); - StringBuilder buffer = new StringBuilder(message); - for (int i = (v.size() - 1); i >= 0; i--) { - int template = v.elementAt(i); - buffer.insert(template + 1, theIndention); - } - return buffer.toString(); - } - - /** - * Prints to screen any variable information to be viewed. - * - * @param statement The statement to print - */ - public synchronized static void variable(String statement) { - variable(statement, SYSTEM_OUT_WRITER); - } - - public synchronized static void variable(String statement, PrintWriter out) { - if (!variable) { - return; - } - out.println(timeStamp() + "*=>" + statement); - } - - /** - * Prints to screen any variable information to be viewed. - * - * @param name The value's name - * @param value The value to print - */ - public synchronized static void variable(String name, Object value) { - if (!variable) { - return; - } - System.out.println(timeStamp() + "*=> " + name + " = '" + (value == null ? null : value.toString()) + "'"); - } - - /** - * Prints to screen any messages to be viewed. - * - * @param Statement The statement to print - */ - public synchronized static void message(String Statement) { - System.out.println(timeStamp() + indentMessage(Statement)); - } - - /** - * Prints to screen any events to be viewed. - * - * @param Statement The statement to print - */ - public static void event(String Statement) { - if (!event) { - return; - } - System.out.println(timeStamp() + "*--" + Statement); - } - - /** - * Prints to screen any warnings to be viewed. - * - * @param statement The statement to print - */ - public synchronized static void warning(String statement) { - warning(statement, null); - } - - /** - * Prints to screen any warnings to be viewed. - * - * @param throwable The throwable to print - */ - public synchronized static void warning(Throwable throwable) { - warning(null, throwable); - } - - /** - * Prints to screen any warnings to be viewed. - * - * @param statement The statement to print - * @param throwable A throwable instance with error information - */ - public synchronized static void warning(String statement, Throwable throwable) { - warning(statement, throwable, null); - } - - public synchronized static void warning(String statement, Throwable throwable, PrintWriter out) { - clearHourGlass(); - dualPrintln("******************************************************************************************", out); - dualPrintln(timeStamp(), out); - if (statement != null) { - dualPrintln(statement, out); - } - printFullTrace(throwable, false, out); - if (throwable instanceof OutOfMemoryError) { - dumpMemory(out); - } - dualPrintln("******************************************************************************************", out); - } - - private static void dualPrintln(String string, PrintWriter out) { - System.out.println(string); - if (out != null) { - out.println(string); - } - } - - private static void printFullTrace(Throwable throwable, boolean causedBy, PrintWriter out) { - if (throwable != null) { - dualPrintln((causedBy ? "Caused by : " : "") + throwable.getMessage(), out); - throwable.printStackTrace(); - if (out != null) { - throwable.printStackTrace(out); - } - if (throwable.getCause() != null) { - printFullTrace(throwable.getCause(), true, out); - } - } - } - - public static void dumpMemory(PrintWriter out) { - System.gc(); - java.text.NumberFormat format = java.text.NumberFormat.getNumberInstance(); - long freeMemory = Runtime.getRuntime().freeMemory(); - long totalMemory = Runtime.getRuntime().totalMemory(); - long usedMemory = totalMemory - freeMemory; - String statement = "Memory [total, used, free] = [" + format.format(totalMemory) + " , " - + format.format(usedMemory) + " , " + format.format(freeMemory) + "]"; - variable(statement, out); - } -} diff --git a/src/org/teachingextensions/approvals/lite/util/NotImplementedException.java b/src/org/teachingextensions/approvals/lite/util/NotImplementedException.java deleted file mode 100644 index 6d8ed69..0000000 --- a/src/org/teachingextensions/approvals/lite/util/NotImplementedException.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.teachingextensions.approvals.lite.util; - -public class NotImplementedException extends Exception { - - /** - * - */ - private static final long serialVersionUID = 5269165537235260411L; - -} diff --git a/src/org/teachingextensions/approvals/lite/util/NumberUtils.java b/src/org/teachingextensions/approvals/lite/util/NumberUtils.java deleted file mode 100644 index 40b7f4e..0000000 --- a/src/org/teachingextensions/approvals/lite/util/NumberUtils.java +++ /dev/null @@ -1,62 +0,0 @@ -package org.teachingextensions.approvals.lite.util; - -import java.util.Random; - -/** - * A static class of convenience functions for Manipulating numbers - */ -public class NumberUtils { - public static Random RANDOM = new Random(); - - /** - * Loads an int from a String. - * - * @param i a string with an integer in it - * @param defaultValue value to use when no integer can be found in the string - * @return the integer found in the string - */ - public static int load(String i, int defaultValue) { - return load(i, defaultValue, true); - } - - /** - * Loads an int from a String. - * - * @param i a string with an integer in it - * @param defaultValue value to use when no integer can be found in the string - * @param stripNonNumeric true if non-numeric characters should be removed from the string - * @return the integer found in the string - */ - public static int load(String i, int defaultValue, boolean stripNonNumeric) { - try { - i = stripNonNumeric ? StringUtils.stripNonNumeric(i, true, true) - : i; - defaultValue = Integer.parseInt(i); - } catch (Exception ignored) { - } - return defaultValue; - } - - public static boolean equals(double one, double two, double delta) { - double actualDelta = one - two; - return (-delta < actualDelta) && (actualDelta < delta); - } - - /** - * randomly chooses a number between the minimum and maximum - *
Example: - * {@code int grade = NumberUtils.getRandomInt(1,100);}
- * - * @param minimum The lowest possible value (inclusive) - * @param maximum The highest possible value (inclusive) - * @return the random number - */ - public static int getRandomInt(int minimum, int maximum) { - int diff = maximum - minimum; - if (diff == 0) { - return maximum; - } else { - return RANDOM.nextInt(diff) + minimum; - } - } -} \ No newline at end of file diff --git a/src/org/teachingextensions/approvals/lite/util/ObjectUtils.java b/src/org/teachingextensions/approvals/lite/util/ObjectUtils.java deleted file mode 100644 index e296588..0000000 --- a/src/org/teachingextensions/approvals/lite/util/ObjectUtils.java +++ /dev/null @@ -1,53 +0,0 @@ -package org.teachingextensions.approvals.lite.util; - -import javax.swing.*; -import java.awt.*; -import java.net.URL; - -/** - * A static class of convenience functions for Manipulating objects - */ -public class ObjectUtils { - - /** - * A convenience function to check if two objects are equal. - * - * @param s1 - * The first object - * @param s2 - * The second object - * @return true if Equal. - */ - public static boolean isEqual(Object s1, Object s2) { - return s1 == s2 || (s1 != null) && s1.equals(s2); - } - - public static boolean isThisInstanceOfThat(Class type, Class that) { - return that.isAssignableFrom(type); - } - - public static Error throwAsError(Throwable t) throws Error { - if (t instanceof RuntimeException) { - throw (RuntimeException) t; - } else if (t instanceof Error) { - throw (Error) t; - } else { - throw new Error(t); - } - } - - public static String getClassName(Object o) { - return o == null ? "null" : o.getClass().getName(); - } - - public static Image loadImage(Class type, String name) { - URL resource = type.getResource(name); - if (resource == null) { - resource = type.getClassLoader().getResource(name); - } - if (resource == null) { - throw new IllegalStateException("Could not find image: " + name); - } - return new ImageIcon(resource).getImage(); - } -} diff --git a/src/org/teachingextensions/approvals/lite/util/ParserCommons.java b/src/org/teachingextensions/approvals/lite/util/ParserCommons.java deleted file mode 100644 index 3d09573..0000000 --- a/src/org/teachingextensions/approvals/lite/util/ParserCommons.java +++ /dev/null @@ -1,27 +0,0 @@ -package org.teachingextensions.approvals.lite.util; - -import java.util.List; - -public class ParserCommons { - public static ParserCommons INSTANCE = new ParserCommons(); - - public static Class getClass(String clazz) throws ClassNotFoundException { - return Class.forName(clazz); - } - - public static Object getNull() { - return null; - } - - public static int getArrayLength(Object[] array) { - return array == null ? 0 : array.length; - } - - public static Object get(Object[] array, int index) { - return getArrayLength(array) > index ? array[index] : null; - } - - public static Object get(List list, int index) { - return list == null ? null : list.get(index); - } -} \ No newline at end of file diff --git a/src/org/teachingextensions/approvals/lite/util/SearchingFileFilter.java b/src/org/teachingextensions/approvals/lite/util/SearchingFileFilter.java deleted file mode 100644 index f2bbb1d..0000000 --- a/src/org/teachingextensions/approvals/lite/util/SearchingFileFilter.java +++ /dev/null @@ -1,47 +0,0 @@ -package org.teachingextensions.approvals.lite.util; - -import java.io.File; -import java.io.FilenameFilter; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -public class SearchingFileFilter implements FilenameFilter { - private final List matches; - - public SearchingFileFilter(List matches) { - this.matches = matches; - } - - public SearchingFileFilter(String... matches) { - ArrayList m = new ArrayList<>(); - m.addAll(Arrays.asList(matches)); - this.matches = m; - } - - public boolean accept(File dir, String name) { - boolean directory = new File(dir, name).isDirectory(); - return accept(name, directory); - } - - public boolean accept(String name, boolean directory) { - if (name.startsWith(".")) { - return false; - } - if (matches.get(0).equals("*")) { - return directory || name.equals(matches.get(1)); - } - return name.equals(matches.get(0)); - } - - public List getSubset(String file2) { - if (matches.get(0).equals("*")) { - if (matches.get(1).equals(file2)) { - return matches.subList(2, matches.size()); - } else { - return matches; - } - } - return matches.subList(1, matches.size()); - } -} diff --git a/src/org/teachingextensions/approvals/lite/util/StackTraceReflectionResult.java b/src/org/teachingextensions/approvals/lite/util/StackTraceReflectionResult.java deleted file mode 100644 index 80aa072..0000000 --- a/src/org/teachingextensions/approvals/lite/util/StackTraceReflectionResult.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.teachingextensions.approvals.lite.util; - -import java.io.File; - -public class StackTraceReflectionResult { - - private final File sourceFile; - private final String className; - private final String methodName; - - public StackTraceReflectionResult(File sourceFile, String className, String methodName) { - this.sourceFile = sourceFile; - this.className = className; - this.methodName = methodName; - } - - public File getSourceFile() { - return sourceFile; - } - - public String getClassName() { - return className; - } - - public String getMethodName() { - return methodName; - } - -} diff --git a/src/org/teachingextensions/approvals/lite/util/StringUtils.java b/src/org/teachingextensions/approvals/lite/util/StringUtils.java deleted file mode 100644 index 378de23..0000000 --- a/src/org/teachingextensions/approvals/lite/util/StringUtils.java +++ /dev/null @@ -1,215 +0,0 @@ -package org.teachingextensions.approvals.lite.util; - -import java.io.ByteArrayInputStream; -import java.io.InputStream; -import java.util.Arrays; -import java.util.Map; - -/** - * A static class of convenience functions for database access - */ -public class StringUtils { - public static final String NEW_LINE = System.getProperty("line.separator"); - - public static String stripWhiteSpace(String text) { - return stripWhiteSpace(text, false); - } - - public static String padNumber(long number, int digits) { - String text = "" + number; - while (text.length() < digits) { - text = "0" + text; - } - return text; - } - - public static String padNumber(int number, int digits) { - return padNumber((long) number, digits); - } - - public static String stripWhiteSpace(String text, boolean all) { - StringBuilder newText = new StringBuilder(); - boolean whitespace = false; - int num = text.length(); - char whiteSpaceChar = ' '; - boolean atStart = true; - for (int i = 0; i < num; i++) { - char c = text.charAt(i); - switch (c) { - case '\r': - case '\n': - whiteSpaceChar = '\n'; - whitespace = true; - break; - case '\t': - case ' ': - whitespace = true; - break; - default: - if (whitespace && atStart) { - whitespace = false; - } - if (whitespace) { - whitespace = false; - newText.append(all ? '_' : whiteSpaceChar); - whiteSpaceChar = ' '; - } - atStart = false; - newText.append(c); - break; - } - } - return newText.toString(); - } - - public static String stripNonNumeric(String number, boolean allowDecimal, - boolean allowNegative) { - boolean allowExponential = allowDecimal; - boolean afterE = false; - if (number == null) { - return ""; - } - StringBuilder result = new StringBuilder(); - for (int i = 0; i < number.length(); i++) { - char c = number.charAt(i); - switch (c) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - result.append(c); - afterE = false; - break; - case '-': - if (allowNegative || afterE) { - result.append(c); - allowNegative = false; - } - break; - case '.': - if (allowDecimal) { - result.append(c); - allowDecimal = false; - } - afterE = false; - break; - case 'e': - case 'E': - if (allowExponential) { - result.append(c); - allowExponential = false; - } - afterE = true; - break; - default: - break; - } - } - return result.toString(); - } - - /** - * A convenience function to check that a String has at least 1 character. - * - * @param string - * The string in question - * @return true if Non Zero. - */ - public static boolean isNonZero(String string) { - return string != null && string.trim().length() > 0; - } - - public static boolean isEmpty(String string) { - return !isNonZero(string); - } - - /** - * A convenience function to turn a vector of String objects into an Array of - * the String objects. - * - * @param vectorOf - * a Vector of String objects - * @return the array of String. - * @throws Error - * if an element of vectorOf is not a String object. - */ - public static String[] toArray(java.util.Collection vectorOf) { - if (vectorOf == null) { - return new String[0]; - } - String array[] = new String[vectorOf.size()]; - java.util.Iterator iterator = vectorOf.iterator(); - int i = 0; - while (iterator.hasNext()) { - String rowObject = iterator.next(); - if (rowObject != null) { - array[i++] = rowObject; - } else { - throw new Error("toArray[" + i - + "] is not an instance of String but a " - + ObjectUtils.getClassName(null)); - } - } - return array; - } - - public static String toString(String name, T[] array) { - StringBuilder buffer = new StringBuilder(); - name = (name == null ? "array" : name); - if (array == null || array.length == 0) { - buffer.append(name).append(".length = 0"); - } else { - int maxPadding = ("" + array.length).length(); - for (int i = 0; i < array.length; i++) { - buffer.append(name).append("[").append(padNumber(i, maxPadding)) - .append("] = ").append(array[i]).append("\r\n"); - } - } - return buffer.toString(); - } - - public static String toString(String name, Iterable array) { - StringBuilder buffer = new StringBuilder(); - name = (name == null ? "array" : name); - if (array != null) { - int count = 0; - for (T t : array) { - buffer.append(name).append("[").append(count).append("] = ") - .append(arrayStringHelper(t)).append("\r\n"); - count++; - } - } - if (buffer.length() == 0) { - buffer.append(name).append(".length = 0"); - } - return buffer.toString(); - } - - public static String arrayStringHelper(Object o) { - if (o == null) { - return "null"; - } - return o.getClass().isArray() ? Arrays.toString((Object[]) o) : o - .toString(); - } - - public static InputStream convertToInputStream(String string) { - return new ByteArrayInputStream(string.getBytes()); - } - - public static String toString(Map map) { - StringBuilder b = new StringBuilder(); - Object keySet[] = map.keySet().toArray(); - Arrays.sort(keySet); - for (Object key : keySet) { - b.append(String.format("%s : %s \r\n", key, map.get(key))); - } - return b.toString(); - } -} \ No newline at end of file diff --git a/src/org/teachingextensions/approvals/lite/util/SystemUtils.java b/src/org/teachingextensions/approvals/lite/util/SystemUtils.java deleted file mode 100644 index a646929..0000000 --- a/src/org/teachingextensions/approvals/lite/util/SystemUtils.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.teachingextensions.approvals.lite.util; - -import java.io.File; - -public class SystemUtils { - public static boolean isWindowsEnvironment() { - return "\\".equals(File.separator); - } - -} diff --git a/src/org/teachingextensions/approvals/lite/util/TestUtils.java b/src/org/teachingextensions/approvals/lite/util/TestUtils.java deleted file mode 100644 index bb90aa4..0000000 --- a/src/org/teachingextensions/approvals/lite/util/TestUtils.java +++ /dev/null @@ -1,76 +0,0 @@ -package org.teachingextensions.approvals.lite.util; - -import org.teachingextensions.approvals.lite.util.io.FileUtils; -import org.teachingextensions.approvals.lite.util.io.StackElementSelector; - -import java.io.File; -import java.io.IOException; - - -public class TestUtils { - - public static void displayHtml(String htmlOutput) throws IOException, - InterruptedException { - displayHtml(null, ".html", htmlOutput, 3); - } - - public static void displayHtmlFile(String fileName) throws IOException { - displayFile(fileName); - } - - public static void displayHtmlFile(File file) throws IOException { - if (!file.exists()) { - return; - } - displayHtmlFile(file.getAbsolutePath()); - } - - public static void displayHtml(String outputFile, String fileExtension, String htmlOutput, int secondsTimeout) - throws IOException, InterruptedException { - File file = (outputFile == null) ? File.createTempFile("temp", fileExtension) : new File(outputFile); - FileUtils.writeFile(file, htmlOutput); - displayHtmlFile(file); - Thread.sleep(secondsTimeout * 1000); - if (outputFile == null) { - file.deleteOnExit(); - } - } - - public static void displayText(String output) throws IOException, InterruptedException { - displayHtml(null, ".txt", output, 3); - } - - public static void displayFile(String fileName) { - String cmd; - if (File.separatorChar == '\\') { - cmd = "cmd /C start \"Needed Title\" \"%s\" /B"; - } else { - cmd = "open %s"; - } - try { - cmd = String.format(cmd, fileName); - Runtime.getRuntime().exec(cmd); - Thread.sleep(2000); - } catch (Exception e) { - throw ObjectUtils.throwAsError(e); - } - } - - public static StackTraceReflectionResult getCurrentFileForMethod(StackElementSelector stackElementSelector) - throws Error { - try { - StackTraceElement trace[] = new Error().getStackTrace(); - StackTraceElement element = stackElementSelector.selectElement(trace); - return getInfo(element); - } catch (Throwable t) { - throw ObjectUtils.throwAsError(t); - } - } - - private static StackTraceReflectionResult getInfo(StackTraceElement element) throws ClassNotFoundException { - String fullClassName = element.getClassName(); - String className = fullClassName.substring(fullClassName.lastIndexOf(".") + 1); - File dir = ClassUtils.getSourceDirectory(Class.forName(fullClassName)); - return new StackTraceReflectionResult(dir, className, element.getMethodName()); - } -} \ No newline at end of file diff --git a/src/org/teachingextensions/approvals/lite/util/ThreadLauncher.java b/src/org/teachingextensions/approvals/lite/util/ThreadLauncher.java deleted file mode 100644 index 6b224b4..0000000 --- a/src/org/teachingextensions/approvals/lite/util/ThreadLauncher.java +++ /dev/null @@ -1,33 +0,0 @@ -package org.teachingextensions.approvals.lite.util; - -import org.teachingextensions.approvals.lite.util.lambda.Action0; - -import java.lang.reflect.Method; - -public class ThreadLauncher implements Runnable { - private Object object = null; - private Object[] objectParams = null; - private Method method = null; - private long delay; - - public ThreadLauncher(Object object, Method method, Object[] objectParams, long delay) { - this.delay = delay; - this.object = object; - this.method = method; - this.objectParams = objectParams; - new Thread(this).start(); - } - - public void run() { - try { - Thread.sleep(delay); - method.invoke(object, objectParams); - } catch (Throwable t) { - MySystem.warning("Caught throwable exception ", t); - } - } - - public static void launch(Action0 action) { - new LambdaThreadLauncher(action); - } -} diff --git a/src/org/teachingextensions/approvals/lite/util/ThreadUtils.java b/src/org/teachingextensions/approvals/lite/util/ThreadUtils.java deleted file mode 100644 index 815e30c..0000000 --- a/src/org/teachingextensions/approvals/lite/util/ThreadUtils.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.teachingextensions.approvals.lite.util; - -public class ThreadUtils { - public static void sleep(long millis) { - try { - Thread.sleep(millis); - } catch (Exception e) { - // ignore - } - } -} diff --git a/src/org/teachingextensions/approvals/lite/util/Tuple.java b/src/org/teachingextensions/approvals/lite/util/Tuple.java deleted file mode 100644 index 7b608bf..0000000 --- a/src/org/teachingextensions/approvals/lite/util/Tuple.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.teachingextensions.approvals.lite.util; - -public class Tuple { - private final H first; - private final K second; - - public Tuple(H first, K second) { - this.first = first; - this.second = second; - } - - public H getFirst() { - return first; - } - - public K getSecond() { - return second; - } - - @Override - public String toString() { - return String.format("<%s,%s>", first, second); - } -} diff --git a/src/org/teachingextensions/approvals/lite/util/WindowUtils.java b/src/org/teachingextensions/approvals/lite/util/WindowUtils.java deleted file mode 100644 index 1d57cee..0000000 --- a/src/org/teachingextensions/approvals/lite/util/WindowUtils.java +++ /dev/null @@ -1,49 +0,0 @@ -package org.teachingextensions.approvals.lite.util; - -import javax.swing.*; -import java.awt.*; -import java.awt.event.WindowAdapter; - -public class WindowUtils { - public static void centerWindow(java.awt.Window window) { - Dimension d = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); - Dimension w = window.getSize(); - int dx = (int) w.getWidth(); - int dy = (int) w.getHeight(); - int x = (int) ((d.getWidth() - dx) / 2); - int y = (int) ((d.getHeight() - dy) / 2); - MySystem.variable(" size (" + x + "," + y + "," + dx + "," + dy + ")"); - window.setBounds(x, y, dx, dy + 1); - } - - public static void testFrame(JFrame frame) { - testFrame(frame, true); - } - - public static void copyToClipBoard(String code, boolean displayMessage) { - java.awt.datatransfer.StringSelection selection = new java.awt.datatransfer.StringSelection(code); - java.awt.Frame frame = new java.awt.Frame(); - frame.getToolkit().getSystemClipboard().setContents(selection, selection); - if (displayMessage) { - JOptionPane.showMessageDialog(null, "Code copied to Clipboard", "Finished", JOptionPane.INFORMATION_MESSAGE); - } - frame.dispose(); - } - - public static void testFrame(JFrame frame, boolean closeOnExit) { - if (closeOnExit) { - testFrame(frame, new FrameCloser()); - } else { - testFrame(frame); - } - } - - public static void testFrame(JFrame frame, WindowAdapter... array) { - frame.pack(); - for (WindowAdapter closer : array) { - frame.addWindowListener(closer); - } - WindowUtils.centerWindow(frame); - frame.setVisible(true); - } -} \ No newline at end of file diff --git a/src/org/teachingextensions/approvals/lite/util/io/FileUtils.java b/src/org/teachingextensions/approvals/lite/util/io/FileUtils.java deleted file mode 100644 index c716f81..0000000 --- a/src/org/teachingextensions/approvals/lite/util/io/FileUtils.java +++ /dev/null @@ -1,126 +0,0 @@ -package org.teachingextensions.approvals.lite.util.io; - -import java.io.BufferedReader; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileFilter; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.util.ArrayList; - -import org.teachingextensions.approvals.lite.util.ArrayUtils; -import org.teachingextensions.approvals.lite.util.Asserts; -import org.teachingextensions.approvals.lite.util.ObjectUtils; - -/** - * A static class of convenience functions for Files - */ -public class FileUtils { - public static String readFromClassPath(Class clazz, String string) { - final InputStream resourceAsStream = clazz.getClassLoader() - .getResourceAsStream(string); - if (resourceAsStream == null) { - String message = String.format("Could not find %s from %s", string, - clazz.getName()); - throw new RuntimeException(message); - } - return FileUtils.readStream(resourceAsStream); - } - - public static File[] getRecursiveFileList(File directory) { - return getRecursiveFileList(directory, new SimpleFileFilter()); - } - - public static File[] getRecursiveFileList(File directory, FileFilter filter) { - ArrayList list = new ArrayList<>(); - if (!directory.isDirectory()) { - throw new Error("File is not a directory: " + directory.getName()); - } - File directories[] = directory.listFiles(new SimpleDirectoryFilter()); - for (File directory1 : directories) { - ArrayUtils.addArray(list, getRecursiveFileList(directory1, filter)); - } - File files[] = directory.listFiles(filter); - ArrayUtils.addArray(list, files); - return list.toArray(new File[list.size()]); - } - - public static void writeFile(File file, String text) throws IOException { - Asserts.assertNotNull("Writing to file: " + file, text); - file.getCanonicalFile().getParentFile().mkdirs(); - BufferedWriter out = new BufferedWriter(new FileWriter(file)); - out.write(text); - out.close(); - } - - public static void writeFileQuietly(File file, String text) { - try { - writeFile(file, text); - } catch (IOException e) { - ObjectUtils.throwAsError(e); - } - } - - public static String readFile(String absolutePath) throws IOException { - return readFile(new File(absolutePath)); - } - - public static String readFile(File file) throws IOException { - BufferedReader in = new BufferedReader(new FileReader(file)); - return readBuffer(in); - } - - public static String readBuffer(BufferedReader in) throws IOException { - StringBuilder string = new StringBuilder(); - while (in.ready()) { - string.append(in.readLine()); - string.append("\n"); - } - in.close(); - return string.toString(); - } - - public static String readFileWithSuppressedExceptions(File databaseFile) { - try { - return FileUtils.readFile(databaseFile); - } catch (FileNotFoundException e) { - throw new RuntimeException("Invalid file '" - + databaseFile.getAbsolutePath() + "'", e); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - public static String getExtensionWithDot(String filename) { - int p = filename.lastIndexOf('.'); - return filename.substring(p); - } - - public static void createIfNeeded(String file) throws IOException { - File f = new File(file); - if (!f.exists()) { - writeFile(f, ""); - } - } - - public static String readStream(InputStream resourceAsStream) { - BufferedReader reader = new BufferedReader(new InputStreamReader( - resourceAsStream)); - String resource = null; - try { - resource = FileUtils.readBuffer(reader); - } catch (IOException e) { - ObjectUtils.throwAsError(e); - } - return resource; - } - - public static boolean isNonEmptyFile(String approved) { - File file = new File(approved); - return file.exists() && file.length() > 0; - } -} \ No newline at end of file diff --git a/src/org/teachingextensions/approvals/lite/util/io/SimpleDirectoryFilter.java b/src/org/teachingextensions/approvals/lite/util/io/SimpleDirectoryFilter.java deleted file mode 100644 index be0e6af..0000000 --- a/src/org/teachingextensions/approvals/lite/util/io/SimpleDirectoryFilter.java +++ /dev/null @@ -1,25 +0,0 @@ -package org.teachingextensions.approvals.lite.util.io; - -import java.io.File; - -public class SimpleDirectoryFilter - implements java.io.FileFilter { - /** - * ******************************************************************** - */ - public SimpleDirectoryFilter() { - } - - /** - * ******************************************************************* - */ - - public boolean accept(File pathname) { - String name = pathname.getName().toLowerCase(); - boolean accept; - accept = !(name.equals(".") || name.equals("..")) && pathname.isDirectory(); - return accept; - } - /************************************************************************/ - /************************************************************************/ -} \ No newline at end of file diff --git a/src/org/teachingextensions/approvals/lite/util/io/SimpleFileFilter.java b/src/org/teachingextensions/approvals/lite/util/io/SimpleFileFilter.java deleted file mode 100644 index cb6a039..0000000 --- a/src/org/teachingextensions/approvals/lite/util/io/SimpleFileFilter.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.teachingextensions.approvals.lite.util.io; - -import java.io.File; - -public class SimpleFileFilter implements java.io.FileFilter { - /** - * ******************************************************************** - */ - public SimpleFileFilter() { - } - - /** - * ******************************************************************* - */ - public boolean accept(File pathname) { - String name = pathname.getName().toLowerCase(); - boolean accept; - accept = !(name.equals(".") || name.equals("..")) && !pathname.isDirectory(); - return accept; - } - /************************************************************************/ - /************************************************************************/ -} \ No newline at end of file diff --git a/src/org/teachingextensions/approvals/lite/util/io/StackElementSelector.java b/src/org/teachingextensions/approvals/lite/util/io/StackElementSelector.java deleted file mode 100644 index 08fa8ee..0000000 --- a/src/org/teachingextensions/approvals/lite/util/io/StackElementSelector.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.teachingextensions.approvals.lite.util.io; - -public interface StackElementSelector { - public abstract StackTraceElement selectElement(StackTraceElement[] trace) throws Exception; -} \ No newline at end of file diff --git a/src/org/teachingextensions/approvals/lite/util/io/ZipUtils.java b/src/org/teachingextensions/approvals/lite/util/io/ZipUtils.java deleted file mode 100644 index 590b42f..0000000 --- a/src/org/teachingextensions/approvals/lite/util/io/ZipUtils.java +++ /dev/null @@ -1,82 +0,0 @@ -package org.teachingextensions.approvals.lite.util.io; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.zip.ZipEntry; -import java.util.zip.ZipInputStream; -import java.util.zip.ZipOutputStream; - -/** - * A static class of convenience functions for Files - */ -public class ZipUtils { - public static File zipDirectory(String directory, String zipFileName) throws IOException { - return zipDirectory(new File(directory), new File(zipFileName)); - } - - public static File zipDirectory(File directory, File zipFileName) throws IOException { - return doCreateZipFile(FileUtils.getRecursiveFileList(directory), zipFileName); - } - - public static File doCreateZipFile(File[] files, File zipFile) throws IOException { - byte[] buf = new byte[1024]; - zipFile.getParentFile().mkdirs(); - FileOutputStream fileOut = new FileOutputStream(zipFile); - ZipOutputStream out = new ZipOutputStream(fileOut); - // Compress the files - for (File file : files) { - FileInputStream in = new FileInputStream(file); - out.putNextEntry(new ZipEntry(file.getName())); - // Transfer bytes from the file to the ZIP file - int len; - while ((len = in.read(buf)) > 0) { - out.write(buf, 0, len); - } - // Complete the entry - out.closeEntry(); - in.close(); - } - // Complete the ZIP file - out.close(); - fileOut.close(); - return zipFile; - } - - public static File[] doUnzip(File destination, File zipFile) throws IOException { - ArrayList list = new ArrayList<>(); - byte[] buf = new byte[1024]; - FileInputStream fileIn = new FileInputStream(zipFile); - ZipInputStream in = new ZipInputStream(fileIn); - // DeCompress the files - ZipEntry entry = in.getNextEntry(); - while (entry != null) { - File file = new File(destination, entry.getName()); - if (entry.isDirectory()) { - file.mkdirs(); - } else { - list.add(file); - FileOutputStream out = new FileOutputStream(file); - // Transfer bytes from the file to the ZIP file - int len; - while ((len = in.read(buf)) > 0) { - out.write(buf, 0, len); - } - // Complete the entry - in.closeEntry(); - out.close(); - } - entry = in.getNextEntry(); - } - // Complete the ZIP file - in.close(); - fileIn.close(); - return list.toArray(new File[0]); - } - - public static void main(String args[]) throws IOException { - zipDirectory("c:\\t", "c:\\t\\t.zip"); - } -} \ No newline at end of file diff --git a/src/org/teachingextensions/approvals/lite/util/lambda/Action0.java b/src/org/teachingextensions/approvals/lite/util/lambda/Action0.java deleted file mode 100644 index ab1c59d..0000000 --- a/src/org/teachingextensions/approvals/lite/util/lambda/Action0.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.teachingextensions.approvals.lite.util.lambda; - -public interface Action0 { - public void call(); -} diff --git a/src/org/teachingextensions/approvals/lite/util/lambda/Function0.java b/src/org/teachingextensions/approvals/lite/util/lambda/Function0.java deleted file mode 100644 index 646167b..0000000 --- a/src/org/teachingextensions/approvals/lite/util/lambda/Function0.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.teachingextensions.approvals.lite.util.lambda; - -public interface Function0 { - public Out call(); -} diff --git a/src/org/teachingextensions/approvals/lite/util/lambda/Function1.java b/src/org/teachingextensions/approvals/lite/util/lambda/Function1.java deleted file mode 100644 index 8e86cfb..0000000 --- a/src/org/teachingextensions/approvals/lite/util/lambda/Function1.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.teachingextensions.approvals.lite.util.lambda; - -public interface Function1 { - public Out call(In i); -} diff --git a/src/org/teachingextensions/approvals/lite/util/lambda/Query.java b/src/org/teachingextensions/approvals/lite/util/lambda/Query.java deleted file mode 100644 index 6c7216d..0000000 --- a/src/org/teachingextensions/approvals/lite/util/lambda/Query.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.teachingextensions.approvals.lite.util.lambda; - -import java.util.ArrayList; -import java.util.List; - -public class Query { - - public static List where(In[] list, Function1 predicate) { - ArrayList out = new ArrayList<>(); - for (In i : list) { - if (predicate.call(i)) { - out.add(i); - } - } - return out; - } - -} diff --git a/src/org/teachingextensions/approvals/lite/util/persistence/Saver.java b/src/org/teachingextensions/approvals/lite/util/persistence/Saver.java deleted file mode 100644 index 77f1ec4..0000000 --- a/src/org/teachingextensions/approvals/lite/util/persistence/Saver.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.teachingextensions.approvals.lite.util.persistence; - - -public interface Saver { - public T save(T save) throws SavingException; -} diff --git a/src/org/teachingextensions/approvals/lite/util/persistence/SavingException.java b/src/org/teachingextensions/approvals/lite/util/persistence/SavingException.java deleted file mode 100644 index c4fda0b..0000000 --- a/src/org/teachingextensions/approvals/lite/util/persistence/SavingException.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.teachingextensions.approvals.lite.util.persistence; - -public class SavingException extends RuntimeException { - private static final long serialVersionUID = -2338891777546763779L; -} diff --git a/src/org/teachingextensions/approvals/lite/util/servlets/InvokerServlet.java b/src/org/teachingextensions/approvals/lite/util/servlets/InvokerServlet.java deleted file mode 100644 index 43a848e..0000000 --- a/src/org/teachingextensions/approvals/lite/util/servlets/InvokerServlet.java +++ /dev/null @@ -1,107 +0,0 @@ -package org.teachingextensions.approvals.lite.util.servlets; - -/* - * 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. - */ - -import java.io.IOException; -import java.util.HashMap; - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.teachingextensions.approvals.lite.util.MySystem; -import org.teachingextensions.approvals.lite.util.ObjectUtils; - -/** - * The default servlet-invoking servlet for most web applications, used to serve - * requests to servlets that have not been registered in the web application - * deployment descriptor. - * - * @author Craig R. McClanahan - * @version $Revision$ $Date$ - */ -public final class InvokerServlet extends HttpServlet { - private static final long serialVersionUID = 7573882633420881472L; - HashMap servlets = new HashMap<>(); - private String mask; - - @Override - public void doGet(HttpServletRequest request, HttpServletResponse response) - throws IOException, ServletException { - serveRequest(request, response); - } - - @Override - public void doHead(HttpServletRequest request, HttpServletResponse response) - throws IOException, ServletException { - serveRequest(request, response); - } - - @Override - public void doPost(HttpServletRequest request, HttpServletResponse response) - throws IOException, ServletException { - serveRequest(request, response); - } - - /** - * Initialize this servlet. - */ - @Override - public void init() throws ServletException { - mask = getServletConfig().getInitParameter("mask"); - MySystem.variable("Mask", mask); - } - - @Override - public void destroy() { - for (HttpServlet servlet : servlets.values()) { - servlet.destroy(); - } - super.destroy(); - } - - public void serveRequest(HttpServletRequest request, - HttpServletResponse response) throws IOException, ServletException { - String pathInfo = request.getPathInfo(); - String servletClass = pathInfo.substring(1); - int slash = servletClass.indexOf('/'); - if (slash >= 0) { - servletClass = servletClass.substring(0, slash); - } - - if (!servletClass.startsWith(mask)) { - response.sendError(HttpServletResponse.SC_NOT_FOUND, servletClass); - return; - } - HttpServlet servlet; - synchronized (this) { - servlet = servlets.get(servletClass); - if (servlet == null) { - try { - servlet = (HttpServlet) Class.forName(servletClass).newInstance(); - servlet.init(getServletConfig()); - } catch (Throwable e) { - ObjectUtils.throwAsError(e); - } - servlets.put(servletClass, servlet); - } - } - servlet.service(request, response); - } -} diff --git a/src/org/teachingextensions/approvals/lite/util/servlets/ValidationError.java b/src/org/teachingextensions/approvals/lite/util/servlets/ValidationError.java deleted file mode 100644 index 73238e6..0000000 --- a/src/org/teachingextensions/approvals/lite/util/servlets/ValidationError.java +++ /dev/null @@ -1,86 +0,0 @@ -package org.teachingextensions.approvals.lite.util.servlets; - -import java.util.HashMap; -import java.util.HashSet; - -import org.teachingextensions.approvals.lite.util.StringUtils; - -public class ValidationError extends RuntimeException { - private static final long serialVersionUID = 7940285202708976073L; - private HashMap errors = new HashMap<>(); - private HashSet assertions = null; - - public ValidationError(Enum enumerations[]) { - this.assertions = new HashSet<>(); - for (Enum e : enumerations) { - this.assertions.add(e.toString()); - } - } - - @Override - public String getMessage() { - return toString(); - } - - @Override - public String toString() { - return "Validation(s) failed " + errors.keySet().toString() + " - " - + errors.values().toString(); - } - - public void set(Enum assertion, boolean isOk, String errorDescription) { - setError(assertion.toString(), !isOk, errorDescription); - } - - public void setError(String assertion, boolean isError, - String errorDescription) { - if (isError && !StringUtils.isNonZero(errorDescription)) { - throw new Error("You can not use empty error descriptions"); - } - assertValidAssertion(assertion); - if (isError) { - errors.put(assertion, errorDescription); - } else { - errors.remove(assertion); - } - } - - public ValidationError add(String prefix, int index, ValidationError error) { - return add(getPrefixForIndex(prefix, index), error); - } - - public static String getPrefixForIndex(String prefix, int index) { - return prefix + "[" + index + "]"; - } - - public ValidationError add(String prefix, ValidationError error) { - prefix = StringUtils.isEmpty(prefix) ? "" : (prefix + "."); - String[] assertions = StringUtils.toArray(error.assertions); - - for (String assertion : assertions) { - this.assertions.add(prefix + assertion); - } - - for (String key : error.errors.keySet()) { - errors.put(prefix + key, error.errors.get(key)); - } - - return this; - } - - public boolean isOk() { - return errors.size() == 0; - } - - private void assertValidAssertion(String assertion) { - if (!this.assertions.contains(assertion)) { - throw new Error("Assertion '" + assertion + "' not found from " - + assertions.toString()); - } - } - - public int size() { - return errors.size(); - } - -} \ No newline at end of file diff --git a/src/org/teachingextensions/approvals/lite/util/velocity/ContextAware.java b/src/org/teachingextensions/approvals/lite/util/velocity/ContextAware.java deleted file mode 100644 index b724012..0000000 --- a/src/org/teachingextensions/approvals/lite/util/velocity/ContextAware.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.teachingextensions.approvals.lite.util.velocity; - -import org.apache.velocity.context.Context; - -import java.util.HashMap; -import java.util.Map.Entry; - -public interface ContextAware { - public void setupContext(Context context); - - public static class ContextAwareMap implements ContextAware { - HashMap add = new HashMap<>(); - - public ContextAwareMap(String key, Object object) { - put(key, object); - } - - public void put(String key, Object object) { - add.put(key, object); - } - - public void setupContext(Context context) { - for (Entry entry : add.entrySet()) { - context.put(entry.getKey(), entry.getValue()); - } - } - } -} diff --git a/src/org/teachingextensions/approvals/lite/util/velocity/StringResourceLoader.java b/src/org/teachingextensions/approvals/lite/util/velocity/StringResourceLoader.java deleted file mode 100644 index 3b4f812..0000000 --- a/src/org/teachingextensions/approvals/lite/util/velocity/StringResourceLoader.java +++ /dev/null @@ -1,60 +0,0 @@ -package org.teachingextensions.approvals.lite.util.velocity; - -/* - * Copyright 2001-2002,2004 The Apache Software Foundation. - * - * 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. - */ - -import org.apache.commons.collections.ExtendedProperties; -import org.apache.velocity.exception.ResourceNotFoundException; -import org.apache.velocity.runtime.resource.Resource; -import org.apache.velocity.runtime.resource.loader.ResourceLoader; -import org.teachingextensions.approvals.lite.util.StringUtils; - -import java.io.InputStream; - -/** - * This is a simple resource loader that loads the string as a template - */ -public class StringResourceLoader extends ResourceLoader { - /** - * ******************************************************************* - */ - public boolean isSourceModified(Resource resource) { - return true; - } - - /** - * ******************************************************************* - */ - public long getLastModified(Resource resource) { - return 0; - } - - /** - * ******************************************************************* - */ - public synchronized InputStream getResourceStream(String name) throws ResourceNotFoundException { - return StringUtils.convertToInputStream(name); - } - - /** - * ******************************************************************* - */ - public void init(ExtendedProperties arg0) { -// My_System.event("initialize"); - } - /***********************************************************************/ - /***********************************************************************/ -} diff --git a/src/org/teachingextensions/approvals/lite/util/velocity/TestableUberspect.java b/src/org/teachingextensions/approvals/lite/util/velocity/TestableUberspect.java deleted file mode 100644 index f6aebf1..0000000 --- a/src/org/teachingextensions/approvals/lite/util/velocity/TestableUberspect.java +++ /dev/null @@ -1,265 +0,0 @@ -package org.teachingextensions.approvals.lite.util.velocity; - -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Enumeration; -import java.util.Iterator; -import java.util.Map; - -import org.apache.velocity.runtime.RuntimeLogger; -import org.apache.velocity.runtime.parser.node.AbstractExecutor; -import org.apache.velocity.runtime.parser.node.BooleanPropertyExecutor; -import org.apache.velocity.runtime.parser.node.GetExecutor; -import org.apache.velocity.runtime.parser.node.PropertyExecutor; -import org.apache.velocity.util.ArrayIterator; -import org.apache.velocity.util.EnumerationIterator; -import org.apache.velocity.util.introspection.Info; -import org.apache.velocity.util.introspection.Introspector; -import org.apache.velocity.util.introspection.IntrospectorBase; -import org.apache.velocity.util.introspection.Uberspect; -import org.apache.velocity.util.introspection.UberspectLoggable; -import org.apache.velocity.util.introspection.VelMethod; -import org.apache.velocity.util.introspection.VelPropertyGet; -import org.apache.velocity.util.introspection.VelPropertySet; -import org.teachingextensions.approvals.lite.util.ObjectUtils; - -/** - * Implementation of Uberspect to provide the default introspective - * functionality of Velocity - * - * @author Geir Magnusson Jr. - * @version $Id: UberspectImpl.java,v 1.2.4.1 2004/03/03 23:23:08 geirm Exp $ - */ -public class TestableUberspect implements Uberspect, UberspectLoggable { - /** - * the default Velocity introspector - */ - private static IntrospectorBase introspector; - private static Introspector introspectorWithLog; - private RuntimeLogger log; - - /***********************************************************************/ - /** - * init - does nothing - we need to have setRuntimeLogger called before - * getting our introspector, as the default vel introspector depends upon it.; - */ - @Override - public void init() throws Exception { - } - - @Override - public void setRuntimeLogger(RuntimeLogger runtimeLogger) { - introspector = new IntrospectorBase(); - introspectorWithLog = new Introspector(runtimeLogger); - log = runtimeLogger; - } - - @Override - public Iterator getIterator(Object obj, Info i) throws Exception { - return getStandardIterator(obj, i); - } - - public static Iterator getStandardIterator(Object obj, Info i) { - if (obj.getClass().isArray()) { - return new ArrayIterator(obj); - } else if (obj instanceof Collection) { - return ((Collection) obj).iterator(); - } else if (obj instanceof Map) { - return ((Map) obj).values().iterator(); - } else if (obj instanceof Iterator) { - return ((Iterator) obj); - } else if (obj instanceof Enumeration) { - return new EnumerationIterator((Enumeration) obj); - } - throw new VelocityParsingError("Could not determine type of iterator in " - + "#foreach loop ", i); - } - - @Override - public VelMethod getMethod(Object obj, String methodName, Object[] args, - Info i) throws Exception { - if (obj == null) { - throw new VelocityParsingError("tried " - + getMethodText("null", methodName, args), i); - } - Method m = introspector.getMethod(obj.getClass(), methodName, args); - if (m == null) { - throw new VelocityParsingError("Method " - + getMethodText(obj.getClass().getName(), methodName, args) - + " does not exist.", i); - } - return new VelMethodImpl(m); - } - - public static String getMethodText(String className, String methodName, - Object[] args) { - StringBuilder methodSignature = new StringBuilder(); - for (int i = 0; args != null && i < args.length; i++) { - methodSignature.append(ObjectUtils.getClassName(args[i])); - methodSignature.append(i == (args.length - 1) ? "" : ", "); - } - return className + "." + methodName + "(" + methodSignature + ") "; - } - - @Override - public VelPropertyGet getPropertyGet(Object obj, String identifier, Info i) - throws Exception { - AbstractExecutor executor; - if (obj == null) { - throw new VelocityParsingError("tried " - + getPropertyText("null", identifier), i); - } - Class type = obj.getClass(); - // trying getFoo() - executor = new PropertyExecutor(log, introspectorWithLog, type, identifier); - if (!executor.isAlive()) { - // trying get("foo") - executor = new GetExecutor(log, introspectorWithLog, type, identifier); - } - if (!executor.isAlive()) { - // trying isFoo() - executor = new BooleanPropertyExecutor(log, introspectorWithLog, type, - identifier); - } - if (!executor.isAlive()) { - throw new VelocityParsingError("Did not find " - + getPropertyText(obj.getClass().getName(), identifier), i); - } - return new VelGetterImpl(executor); - } - - private String getPropertyText(String className, String identifier) { - return className + "." + identifier + " "; - } - - @Override - public VelPropertySet getPropertySet(Object obj, String identifier, - Object arg, Info i) throws Exception { - Class type = obj.getClass(); - VelMethod vm = null; - try { - /* - * first, we introspect for the set setter method - */ - Object[] params = { arg }; - try { - vm = getMethod(obj, "set" + identifier, params, i); - if (vm == null) { - throw new NoSuchMethodException(); - } - } catch (NoSuchMethodException e) { - StringBuilder sb = new StringBuilder("set"); - sb.append(identifier); - if (Character.isLowerCase(sb.charAt(3))) { - sb.setCharAt(3, Character.toUpperCase(sb.charAt(3))); - } else { - sb.setCharAt(3, Character.toLowerCase(sb.charAt(3))); - } - vm = getMethod(obj, sb.toString(), params, i); - if (vm == null) { - throw new NoSuchMethodException(); - } - } - } catch (NoSuchMethodException e) { - /* - * right now, we only support the Map interface - */ - if (Map.class.isAssignableFrom(type)) { - Object[] params = { new Object(), new Object() }; - vm = getMethod(obj, "put", params, i); - if (vm != null) - return new VelSetterImpl(vm, identifier); - } - } - return (vm != null) ? new VelSetterImpl(vm) : null; - } - - public static class VelMethodImpl implements VelMethod { - Method method = null; - - public VelMethodImpl(Method m) { - method = m; - } - - @Override - public Object invoke(Object o, Object[] params) throws Exception { - return method.invoke(o, params); - } - - @Override - public boolean isCacheable() { - return true; - } - - @Override - public String getMethodName() { - return method.getName(); - } - - @Override - public Class getReturnType() { - return method.getReturnType(); - } - } - - public static class VelGetterImpl implements VelPropertyGet { - AbstractExecutor ae = null; - - public VelGetterImpl(AbstractExecutor exec) { - ae = exec; - } - - @Override - public Object invoke(Object o) throws Exception { - return ae.execute(o); - } - - @Override - public boolean isCacheable() { - return true; - } - - @Override - public String getMethodName() { - return ae.getMethod().getName(); - } - } - - public static class VelSetterImpl implements VelPropertySet { - VelMethod vm = null; - String putKey = null; - - public VelSetterImpl(VelMethod velmethod) { - this.vm = velmethod; - } - - public VelSetterImpl(VelMethod velmethod, String key) { - this.vm = velmethod; - putKey = key; - } - - @Override - public Object invoke(Object o, Object value) throws Exception { - ArrayList al = new ArrayList<>(); - if (putKey != null) { - al.add(putKey); - al.add(value); - } else { - al.add(value); - } - return vm.invoke(o, al.toArray()); - } - - @Override - public boolean isCacheable() { - return true; - } - - @Override - public String getMethodName() { - return vm.getMethodName(); - } - } - -} diff --git a/src/org/teachingextensions/approvals/lite/util/velocity/VelocityParser.java b/src/org/teachingextensions/approvals/lite/util/velocity/VelocityParser.java deleted file mode 100644 index 159d224..0000000 --- a/src/org/teachingextensions/approvals/lite/util/velocity/VelocityParser.java +++ /dev/null @@ -1,106 +0,0 @@ -package org.teachingextensions.approvals.lite.util.velocity; - -import java.io.StringWriter; -import java.io.Writer; -import java.util.Enumeration; -import java.util.Properties; - -import org.apache.log4j.Level; -import org.apache.log4j.LogManager; -import org.apache.log4j.Logger; -import org.apache.velocity.Template; -import org.apache.velocity.VelocityContext; -import org.apache.velocity.app.VelocityEngine; -import org.apache.velocity.context.Context; -import org.apache.velocity.runtime.RuntimeConstants; -import org.apache.velocity.runtime.log.NullLogSystem; -import org.teachingextensions.approvals.lite.util.ObjectUtils; -import org.teachingextensions.approvals.lite.util.ParserCommons; -import org.teachingextensions.approvals.lite.util.io.FileUtils; - -public class VelocityParser { - private static VelocityEngine currentEngine = null; - - static { - for (Enumeration e = LogManager.getCurrentLoggers(); e.hasMoreElements();) { - ((Logger) e.nextElement()).setLevel(Level.OFF); - } - } - - public static String parseString(String template, ContextAware process) { - Properties props = new Properties(); - props.put("resource.loader", "class"); - props.put("class.resource.loader.class", - StringResourceLoader.class.getName()); - props.put("velocimacro.context.localscope", "" + true); - props.put("runtime.introspector.uberspect", - TestableUberspect.class.getName()); - props.put("velocimacro.permissions.allow.inline.local.scope", "" + true); - return parse(template, props, new ContextAware[] { process, - Default.INSTANCE }); - } - - public static String parse(String template, Properties props, - ContextAware[] process) { - StringWriter out = new StringWriter(); - parse(template, props, process, out); - return out.toString(); - } - - public static Writer parse(String template, Properties props, - ContextAware process[], Writer out) { - try { - props.put("directive.foreach.counter.initial.value", "0"); - props.put(RuntimeConstants.RUNTIME_LOG_LOGSYSTEM_CLASS, - NullLogSystem.class.getName()); - VelocityEngine engine = initializeEngine(props); - VelocityContext context = new VelocityContext(); - Template velocityTemplate = engine.getTemplate(template); - for (ContextAware p : process) { - if (p != null) - p.setupContext(context); - } - velocityTemplate.merge(context, out); - return out; - } catch (Exception e) { - throw ObjectUtils.throwAsError(e); - } - } - - public static synchronized VelocityEngine initializeEngine(Properties props) - throws Exception { - if (currentEngine == null - || isDifferentForProperties(props, currentEngine, new String[] { - "resource.loader", "file.resource.loader.path" })) { - currentEngine = new VelocityEngine(); - currentEngine.init(props); - } - return currentEngine; - } - - private static boolean isDifferentForProperties(Properties props, - VelocityEngine engine, String[] keys) { - for (String key : keys) { - if (!ObjectUtils.isEqual(props.get(key), engine.getProperty(key))) { - return true; - } - } - return false; - } - - public static class Default implements ContextAware { - public static ContextAware INSTANCE = new Default(); - - @Override - public void setupContext(Context context) { - context.put("commons", ParserCommons.INSTANCE); - } - } - - public static String parseFromClassPath(Class clazz, String string, - ContextAware context) { - String resource = FileUtils.readFromClassPath(clazz, string); - return parseString(resource, context); - } - -} diff --git a/src/org/teachingextensions/approvals/lite/util/velocity/VelocityParsingError.java b/src/org/teachingextensions/approvals/lite/util/velocity/VelocityParsingError.java deleted file mode 100644 index 65bf671..0000000 --- a/src/org/teachingextensions/approvals/lite/util/velocity/VelocityParsingError.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.teachingextensions.approvals.lite.util.velocity; - -import org.apache.velocity.util.introspection.Info; - -public class VelocityParsingError extends Error { - - private static final long serialVersionUID = -6815526646140474951L; - private String message; - private transient Info info; - - public VelocityParsingError(String message, Info info) { - this.message = message; - this.info = info; - } - - @Override - public String getMessage() { - return message + " " + getInfoText(info); - } - - public static String getInfoText(Info i) { - return " at [" + i.getLine() + "," + i.getColumn() + "]" + " in template " - + i.getTemplateName(); - } - -} diff --git a/src/org/teachingextensions/approvals/lite/writers/ApprovalTextWriter.java b/src/org/teachingextensions/approvals/lite/writers/ApprovalTextWriter.java deleted file mode 100644 index 2933671..0000000 --- a/src/org/teachingextensions/approvals/lite/writers/ApprovalTextWriter.java +++ /dev/null @@ -1,32 +0,0 @@ -package org.teachingextensions.approvals.lite.writers; - -import org.teachingextensions.approvals.lite.ApprovalWriter; -import org.teachingextensions.approvals.lite.util.io.FileUtils; - -import java.io.File; - -public class ApprovalTextWriter implements ApprovalWriter { - private final String text; - private final String fileExtensionWithoutDot; - - public ApprovalTextWriter(String text, String fileExtensionWithoutDot) { - this.text = text; - this.fileExtensionWithoutDot = fileExtensionWithoutDot; - } - - @Override - public String writeReceivedFile(String received) throws Exception { - FileUtils.writeFile(new File(received), text); - return received; - } - - @Override - public String getApprovalFilename(String base) { - return base + Writer.approved + "." + fileExtensionWithoutDot; - } - - @Override - public String getReceivedFilename(String base) { - return base + Writer.received + "." + fileExtensionWithoutDot; - } -} diff --git a/src/org/teachingextensions/approvals/lite/writers/ComponentApprovalWriter.java b/src/org/teachingextensions/approvals/lite/writers/ComponentApprovalWriter.java deleted file mode 100644 index df1e8a6..0000000 --- a/src/org/teachingextensions/approvals/lite/writers/ComponentApprovalWriter.java +++ /dev/null @@ -1,48 +0,0 @@ -package org.teachingextensions.approvals.lite.writers; - -import org.teachingextensions.approvals.lite.ApprovalWriter; - -import javax.swing.*; -import java.awt.*; -import java.awt.image.BufferedImage; - -public class ComponentApprovalWriter implements ApprovalWriter { - private ImageApprovalWriter image = null; - - public ComponentApprovalWriter(Component c) { - BufferedImage image = drawComponent(c); - this.image = new ImageApprovalWriter(image); - } - - public static BufferedImage drawComponent(Component c) { - validateComponent(c); - BufferedImage image = new BufferedImage(c.getWidth(), c.getHeight(), BufferedImage.TYPE_INT_ARGB); - Graphics g = image.createGraphics(); - c.paint(g); - g.dispose(); - return image; - } - - private static void validateComponent(Component c) { - if (!c.isValid()) { - JFrame frame = new JFrame(); - frame.getContentPane().add(c); - frame.pack(); - } - } - - @Override - public String getApprovalFilename(String base) { - return image.getApprovalFilename(base); - } - - @Override - public String getReceivedFilename(String base) { - return image.getReceivedFilename(base); - } - - @Override - public String writeReceivedFile(String filename) throws Exception { - return image.writeReceivedFile(filename); - } -} diff --git a/src/org/teachingextensions/approvals/lite/writers/ImageApprovalWriter.java b/src/org/teachingextensions/approvals/lite/writers/ImageApprovalWriter.java deleted file mode 100644 index de6764c..0000000 --- a/src/org/teachingextensions/approvals/lite/writers/ImageApprovalWriter.java +++ /dev/null @@ -1,31 +0,0 @@ -package org.teachingextensions.approvals.lite.writers; - -import org.teachingextensions.approvals.lite.ApprovalWriter; - -import javax.imageio.ImageIO; -import java.awt.image.BufferedImage; -import java.io.File; - -public class ImageApprovalWriter implements ApprovalWriter { - private final BufferedImage image; - - public ImageApprovalWriter(BufferedImage image) { - this.image = image; - } - - @Override - public String writeReceivedFile(String received) throws Exception { - ImageIO.write(image, "png", new File(received)); - return received; - } - - @Override - public String getApprovalFilename(String base) { - return base + Writer.approved + ".png"; - } - - @Override - public String getReceivedFilename(String base) { - return base + Writer.received + ".png"; - } -} diff --git a/src/org/teachingextensions/approvals/lite/writers/Writer.java b/src/org/teachingextensions/approvals/lite/writers/Writer.java deleted file mode 100644 index 2026b4a..0000000 --- a/src/org/teachingextensions/approvals/lite/writers/Writer.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.teachingextensions.approvals.lite.writers; - -public interface Writer { - final static String received = ".received"; - final static String approved = ".approved"; -} diff --git a/src/org/teachingextensions/logo/AStarEstimator.java b/src/org/teachingextensions/logo/AStarEstimator.java deleted file mode 100644 index 8c99232..0000000 --- a/src/org/teachingextensions/logo/AStarEstimator.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.teachingextensions.logo; - -import java.util.Comparator; - -public class AStarEstimator implements Comparator { - - @Override - public int compare(PuzzleState left, PuzzleState right) { - return costOf(left) - costOf(right); - } - - private int costOf(PuzzleState state) { - return state.getActualCost() + state.getEstimatedCost(); - } -} diff --git a/src/org/teachingextensions/logo/AStarPlayer.java b/src/org/teachingextensions/logo/AStarPlayer.java deleted file mode 100644 index ef85bf3..0000000 --- a/src/org/teachingextensions/logo/AStarPlayer.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.teachingextensions.logo; - -import java.util.PriorityQueue; - -/** - * A player who solves puzzles using the A* strategy will not only take into account the known cost of a reaching - * a puzzle state, but also estimates the remaining cost to the goal. - */ -public class AStarPlayer extends PuzzlePlayer { - public AStarPlayer(Puzzle puzzle) { - super(puzzle, new PriorityQueue<>(1, new AStarEstimator())); - } -} diff --git a/src/org/teachingextensions/logo/Puzzle.java b/src/org/teachingextensions/logo/Puzzle.java deleted file mode 100644 index 0f77795..0000000 --- a/src/org/teachingextensions/logo/Puzzle.java +++ /dev/null @@ -1,121 +0,0 @@ -package org.teachingextensions.logo; - -import java.awt.*; -import java.util.Arrays; - -/** - * A nine-puzzle - * - * @see Wikipedia - */ -public class Puzzle { - private static final int blank = 8; - private final int[] cells; - - public Puzzle(int[] cells) { - this.cells = cells; - } - - /** - * Gives the position of the cell as it would appear on a 3x3 board. - * - * @param cell - * The cell to get the position for. - * @return The position of the cell. - */ - public static Point getPosition(int cell) { - return new Point(cell % 3, cell / 3); - } - - /** - * Calculate the Manhattan Distance between two positions. - * - * @param start - * The starting position. - * @param end - * The ending position. - * @return The distance between the two positions. - */ - public static int getDistance(Point start, Point end) { - return Math.abs(start.x - end.x) + Math.abs(start.y - end.y); - } - - /** - * Calculate the Manhattan Distance between two cells by first converting them to positions. - * - * @param start - * The starting cell - * @param end - * The ending cell - * @return The distance between the cells. - */ - public static int getDistance(int start, int end) { - return getDistance(getPosition(start), getPosition(end)); - } - - @Override - public int hashCode() { - return Arrays.hashCode(cells); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - Puzzle puzzle = (Puzzle) o; - - return Arrays.equals(cells, puzzle.cells); - - } - - @Override - public String toString() { - return Arrays.toString(cells); - } - - public boolean isSolved() { - return getDistanceToGoal() == 0; - } - - public int getBlankIndex() { - for (int i = 0; i < cells.length; i++) { - if (cells[i] == blank) { - return i; - } - } - return -1; - } - - /** - * Create a copy of the puzzle where the blank swapped with the value in the target position - * - * @param target - * move the blank to this location, and move the value from this location to the current blank location - * @return A copy of the puzzle with the blank and target swapped. - */ - public Puzzle swapBlank(int target) { - int[] copy = Arrays.copyOf(cells, cells.length); - int x = copy[target]; - copy[getBlankIndex()] = x; - copy[target] = 8; - return new Puzzle(copy); - } - - /** - * Calculate the distance between the goal by summing the distance between each cell and its goal. - * - * @return The distance to the goal. - */ - public int getDistanceToGoal() { - int distance = 0; - for (int i = 0; i < cells.length; i++) { - distance += getDistance(i, cells[i]); - } - return distance; - } - - public int[] getCells() { - return Arrays.copyOf(cells, cells.length); - } -} diff --git a/src/org/teachingextensions/logo/PuzzleAnimation.java b/src/org/teachingextensions/logo/PuzzleAnimation.java deleted file mode 100644 index 083303a..0000000 --- a/src/org/teachingextensions/logo/PuzzleAnimation.java +++ /dev/null @@ -1,64 +0,0 @@ -package org.teachingextensions.logo; - -import javax.swing.*; - -/** - * Animates a puzzle from its initial state to its solution. - */ -public class PuzzleAnimation implements Runnable { - private final PuzzleBoard board; - - public PuzzleAnimation(PuzzleBoard board) { - this.board = board; - } - - private static void update(PuzzleBoard board) { - boolean done = animate(board); - if(!done){ - return; - } - - moveNextTile(board); - } - - private static void moveNextTile(PuzzleBoard board) { - if (board.hasMoves()){ - TileMove move = board.getNextMove(); - board.swap(move.getStart(), move.getEnd()); - } - } - - private static boolean animate(PuzzleBoard board) { - Tile[] tiles = board.getTiles(); - for (Tile tile : tiles){ - if(tile != null && !tile.isAtTarget()){ - tile.step(); - return false; - } - } - - return true; - } - - @Override - public void run() { - while (board.isVisible()) { - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - board.repaint(); - } - }); - - update(board); - - try { - Thread.sleep(10); - } catch (InterruptedException ignored) { - } - - } - } - - -} diff --git a/src/org/teachingextensions/logo/PuzzleBoard.java b/src/org/teachingextensions/logo/PuzzleBoard.java deleted file mode 100644 index 2707c4b..0000000 --- a/src/org/teachingextensions/logo/PuzzleBoard.java +++ /dev/null @@ -1,105 +0,0 @@ -package org.teachingextensions.logo; - -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.Point; -import java.util.ArrayDeque; -import java.util.Arrays; -import java.util.Queue; - -import javax.swing.JPanel; - -/** - * Draws and animates a 9-puzzle - */ -public class PuzzleBoard extends JPanel { - private static final long serialVersionUID = -2008156268412728375L; - private final static int blank = 8; - private final Tile[] tiles; - private final Queue solution; - - public PuzzleBoard(Puzzle puzzle, PuzzleState solution) { - super(); - this.solution = createSolution(solution, puzzle); - this.tiles = createTiles(puzzle.getCells()); - } - - private static Queue createSolution(PuzzleState solution, - Puzzle puzzle) { - if (solution == null) { - return new ArrayDeque<>(); - } - - int i = puzzle.getBlankIndex(); - Queue moves = new ArrayDeque<>(); - for (PuzzleState.Direction d : solution.getHistory()) { - int m = d.getValue(); - TileMove move = new TileMove(i + m, i); - moves.add(move); - i = move.getStart(); - } - return moves; - } - - private static Tile[] createTiles(int[] cells) { - Tile[] t = new Tile[9]; - for (int i = 0; i < 9; i++) { - if (cells[i] == blank) { - continue; - } - - t[i] = new Tile(i, cells[i]); - } - return t; - } - - private static void drawBorder(Graphics g) { - g.setColor(PenColors.Blues.DarkBlue); - g.fillRect(20, 20, 410, 410); - } - - private static void drawField(Graphics g) { - g.setColor(PenColors.Blues.SkyBlue); - g.fillRect(30, 30, 386, 386); - } - - private static void drawTiles(Graphics g, Tile[] tiles) { - Graphics2D g2d = (Graphics2D) g.create(); - for (Tile tile : tiles) { - if (tile == null) { - continue; - } - tile.paint(g2d); - } - g2d.dispose(); - } - - @Override - protected void paintComponent(Graphics g) { - super.paintComponent(g); - drawBorder(g); - drawField(g); - drawTiles(g, tiles); - } - - public Tile[] getTiles() { - return Arrays.copyOf(tiles, tiles.length); - } - - public boolean hasMoves() { - return !solution.isEmpty(); - } - - public TileMove getNextMove() { - return solution.isEmpty() ? null : solution.remove(); - } - - public void swap(int start, int end) { - Point p = Tile.getPosition(end); - Tile tile = tiles[start]; - tile.moveTo(p); - tiles[start] = null; - tiles[end] = tile; - - } -} diff --git a/src/org/teachingextensions/logo/PuzzlePlayer.java b/src/org/teachingextensions/logo/PuzzlePlayer.java deleted file mode 100644 index 3911f51..0000000 --- a/src/org/teachingextensions/logo/PuzzlePlayer.java +++ /dev/null @@ -1,57 +0,0 @@ -package org.teachingextensions.logo; - -import java.util.HashSet; -import java.util.List; -import java.util.Queue; -import java.util.Set; - -/** - * A player solves puzzles using a certain style. - */ -public abstract class PuzzlePlayer { - private final Puzzle puzzle; - private final Set visited = new HashSet<>(); - private final Queue frontier; - - public PuzzlePlayer(Puzzle puzzle, Queue frontier) { - this.puzzle = puzzle; - this.frontier = frontier; - } - - protected Set getVisited() { - return visited; - } - - protected Queue getFrontier() { - return frontier; - } - - protected Puzzle getPuzzle() { - return puzzle; - } - - public PuzzleState solve() { - PuzzleState state = new PuzzleState(this.getPuzzle()); - do { - getVisited().add(state); - if (!state.isSolution()) { - this.search(state); - if (getFrontier().isEmpty()){ - throw new IllegalStateException("Cannot solve puzzle."); - } - state = getFrontier().remove(); - } - } while (!state.isSolution()); - - return state; - } - - protected void search(PuzzleState state) { - List branches = state.getBranches(); - for (PuzzleState b : branches) { - if (!getVisited().contains(b)) { - getFrontier().add(b); - } - } - } -} diff --git a/src/org/teachingextensions/logo/PuzzleState.java b/src/org/teachingextensions/logo/PuzzleState.java deleted file mode 100644 index 9742c22..0000000 --- a/src/org/teachingextensions/logo/PuzzleState.java +++ /dev/null @@ -1,132 +0,0 @@ -package org.teachingextensions.logo; - -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; -import java.util.Stack; - -/** - * Represents a node in the puzzle-solving graph. Keeps track of the current puzzle arrangement and the actions - * required to arrive at the current arrangement from the starting arrangement. - */ -public class PuzzleState implements Comparator, Comparable { - private final Puzzle puzzle; - private final Stack history; - - public PuzzleState(Puzzle puzzle) { - this(puzzle, new Stack()); - } - - public PuzzleState(Puzzle puzzle, Stack history) { - this.puzzle = puzzle; - this.history = history; - } - - public boolean isSolution() { - return puzzle.isSolved(); - } - - public List getBranches() { - List branches = new ArrayList<>(4); - int blank = puzzle.getBlankIndex(); - int x = blank % 3; - int y = blank / 3; - for (Direction d : Direction.values()) { - if (d == Direction.Left && x == 0) { - continue; - } - - if (d == Direction.Right && x == 2) { - continue; - } - - if (d == Direction.Up && y == 0) { - continue; - } - - if (d == Direction.Down && y == 2) { - continue; - } - - Stack h = new Stack<>(); - h.addAll(history); - h.push(d); - branches.add(new PuzzleState(puzzle.swapBlank(blank + d.getValue()), h)); - } - - return branches; - } - - public Iterable getHistory() { - return this.history; - } - - public Puzzle getPuzzle() { - return this.puzzle; - } - - public int getActualCost() { - return this.history.size(); - } - - @Override - public int compare(PuzzleState o1, PuzzleState o2) { - return o1.getActualCost() - o2.getActualCost(); - } - - @Override - public int compareTo(PuzzleState o) { - return compare(this, o); - } - - @Override - public int hashCode() { - return puzzle.hashCode(); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - PuzzleState that = (PuzzleState) o; - - return puzzle.equals(that.puzzle); - - } - - @Override - public String toString() { - StringBuilder b = new StringBuilder(); - if (!history.isEmpty()) { - b.append(history.peek()); - b.append(" to "); - } - - b.append(puzzle); - return b.toString(); - } - - public int getEstimatedCost() { - return puzzle.getDistanceToGoal(); - } - - public enum Direction { - Left(-1), Right(1), Up(-3), Down(3); - - private final int value; - - private Direction(int i) { - this.value = i; - } - - public int getValue() { - return value; - } - - @Override - public String toString() { - return "{" + super.toString() + " = " + value + '}'; - } - } -} diff --git a/src/org/teachingextensions/logo/PuzzleWindow.java b/src/org/teachingextensions/logo/PuzzleWindow.java deleted file mode 100644 index 4d96496..0000000 --- a/src/org/teachingextensions/logo/PuzzleWindow.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.teachingextensions.logo; - -import java.awt.BorderLayout; - -import org.teachingextensions.windows.ProgramWindow; - -/** - * A program window for a 9-puzzle - */ -public class PuzzleWindow extends ProgramWindow { - private static final long serialVersionUID = 5190374287165209356L; - - public PuzzleWindow() { - super("Puzzle"); - this.setLayout(new BorderLayout()); - } - - public PuzzleWindow(PuzzleBoard board) { - this(); - this.add(board); - } -} diff --git a/src/org/teachingextensions/logo/Tile.java b/src/org/teachingextensions/logo/Tile.java deleted file mode 100644 index 4eac054..0000000 --- a/src/org/teachingextensions/logo/Tile.java +++ /dev/null @@ -1,67 +0,0 @@ -package org.teachingextensions.logo; - -import java.awt.Dimension; -import java.awt.Graphics2D; -import java.awt.Image; -import java.awt.Point; - -import org.teachingextensions.approvals.lite.util.ObjectUtils; - -/** - * A tile is a square on the board with an image on it. - */ -public class Tile -{ - private static final String[] resources = {"Batgirl1a.png", - "Batgirl2a.png", - "Batgirl3a.png", - "Batgirl1b.png", - "Batgirl2b.png", - "Batgirl3b.png", - "Batgirl1c.png", - "Batgirl2c.png", - "Batgirl3c.png" }; - private static final Point origin = new Point(35, 35); - private final Image image; - private final Dimension dimension = new Dimension(122, 122); - private Point position; - private Point target; - public Tile(int cell, int image) - { - this.position = getPosition(cell); - this.image = getImage(image); - } - public static Point getPosition(int cell) - { - Point offset = Puzzle.getPosition(cell); - return new Point(origin.x + (127 * offset.x), origin.y + (127 * offset.y)); - } - private static Image getImage(int image) - { - return ObjectUtils.loadImage(Tile.class, resources[image]); - } - private static int stepTowardGoal(int current, int goal) - { - if (current < goal) { return current + 1; } - if (goal < current) { return current - 1; } - return current; - } - public void paint(Graphics2D g2d) - { - g2d.drawImage(this.image, this.position.x, this.position.y, this.dimension.width, this.dimension.height, null); - } - public boolean isAtTarget() - { - return target == null || (target.x == position.x && target.y == position.y); - } - public void step() - { - int x = stepTowardGoal(position.x, target.x); - int y = stepTowardGoal(position.y, target.y); - this.position = new Point(x, y); - } - public void moveTo(Point goal) - { - target = goal; - } -} diff --git a/src/org/teachingextensions/logo/TileMove.java b/src/org/teachingextensions/logo/TileMove.java deleted file mode 100644 index a1d3758..0000000 --- a/src/org/teachingextensions/logo/TileMove.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.teachingextensions.logo; - -/** - * Describes a tile swap. - */ -public class TileMove { - private final int start; - private final int end; - - public TileMove(int start, int end) { - - this.start = start; - this.end = end; - } - - public int getStart() { - return start; - } - - public int getEnd() { - return end; - } -} diff --git a/src/org/teachingextensions/logo/UniformCostPlayer.java b/src/org/teachingextensions/logo/UniformCostPlayer.java deleted file mode 100644 index 8122924..0000000 --- a/src/org/teachingextensions/logo/UniformCostPlayer.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.teachingextensions.logo; - -import java.util.PriorityQueue; - -/** - * Uniform cost player tries to pick the solution with the least number of steps. The player treats every step as - * if to costs the same as any other step. - */ -public class UniformCostPlayer extends PuzzlePlayer { - public UniformCostPlayer(Puzzle puzzle) { - super(puzzle, new PriorityQueue()); - } - - -} diff --git a/src/org/teachingkidsprogramming/section08tdd/SimplePuzzle.java b/src/org/teachingkidsprogramming/section08tdd/SimplePuzzle.java deleted file mode 100644 index 5818246..0000000 --- a/src/org/teachingkidsprogramming/section08tdd/SimplePuzzle.java +++ /dev/null @@ -1,68 +0,0 @@ -package org.teachingkidsprogramming.section08tdd; - -import java.awt.EventQueue; -import java.util.Arrays; -import java.util.Random; - -import javax.swing.UIManager; -import javax.swing.UnsupportedLookAndFeelException; - -import org.teachingextensions.logo.AStarPlayer; -import org.teachingextensions.logo.Puzzle; -import org.teachingextensions.logo.PuzzleAnimation; -import org.teachingextensions.logo.PuzzleBoard; -import org.teachingextensions.logo.PuzzlePlayer; -import org.teachingextensions.logo.PuzzleState; -import org.teachingextensions.logo.PuzzleWindow; - -import com.spun.util.MySystem; - -public class SimplePuzzle implements Runnable -{ - public static void main(String[] args) - { - EventQueue.invokeLater(new SimplePuzzle()); - } - @SuppressWarnings("unused") - private static int[] shuffled(int[] source) - { - int[] copy = Arrays.copyOf(source, source.length); - Random rnd = new Random(); - for (int i = copy.length - 1; i > 0; i--) - { - int index = rnd.nextInt(i + 1); - // Simple swap - int a = copy[index]; - copy[index] = copy[i]; - copy[i] = a; - } - return copy; - } - @Override - public void run() - { - this.setLookAndFeel(); - // int[] cells = {0, 1, 2, 3, 4, 5, 6, 7, 8}; - // int[] shuffled = shuffled(cells); - int[] shuffled = {5, 6, 2, 4, 1, 8, 7, 0, 3}; // known to be solvable - MySystem.message(Arrays.toString(shuffled)); - Puzzle puzzle = new Puzzle(shuffled); - PuzzlePlayer player = new AStarPlayer(puzzle); - PuzzleState solution = player.solve(); - PuzzleBoard board = new PuzzleBoard(puzzle, solution); - PuzzleWindow pw = new PuzzleWindow(board); - pw.setVisible(true); - new Thread(new PuzzleAnimation(board)).start(); - } - private void setLookAndFeel() - { - try - { - UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); - } - catch (ClassNotFoundException | InstantiationException | UnsupportedLookAndFeelException - | IllegalAccessException ignored) - { - } - } -} From 3a73873ebfb03bc55f85e0f808fdf74d5a2f7416 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Mon, 30 Mar 2015 21:07:33 -0700 Subject: [PATCH 105/111] Used loadImage utility --- .../org/teachingextensions/logo/MultiTurtlePanel.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/teachingextensions/logo/MultiTurtlePanel.java b/src/main/java/org/teachingextensions/logo/MultiTurtlePanel.java index 87f47e9..5216df2 100644 --- a/src/main/java/org/teachingextensions/logo/MultiTurtlePanel.java +++ b/src/main/java/org/teachingextensions/logo/MultiTurtlePanel.java @@ -11,9 +11,9 @@ import java.util.ArrayList; import java.util.List; -import javax.swing.ImageIcon; import javax.swing.JFrame; +import org.teachingextensions.approvals.lite.util.ObjectUtils; import org.teachingextensions.logo.Turtle.Animals; import org.teachingextensions.windows.ProgramWindow; @@ -98,6 +98,7 @@ private void paintTurtle(Graphics2D g) g.drawImage(image, move, null); } } + @Override public synchronized Image getImage() { if (image == null) @@ -106,6 +107,7 @@ public synchronized Image getImage() } return image; } + @Override public synchronized Animals getAnimal() { if (animal == null) @@ -120,17 +122,18 @@ public synchronized Animals getAnimal() * * @see Animals */ + @Override public synchronized void setAnimal(Animals animal) { this.animal = animal; - //image = new ImageIcon(this.getClass().getResource(animal + ".png")).getImage(); - image = new ImageIcon(this.getClass().getClassLoader() - .getResource("images/" + animal + ".png")).getImage(); + this.image = ObjectUtils.loadImage(MultiTurtlePanel.class, this.animal + ".png"); } + @Override public void setCursor(int cursor) { this.setCursor(Cursor.getPredefinedCursor(cursor)); } + @Override public void ___() { // blank for the DeepDive From ea8cfc1474f6fb0b944ad3ddc7ff6ddf4a72154f Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Tue, 31 Mar 2015 17:42:22 -0700 Subject: [PATCH 106/111] Cleanup, tests --- .../approvals/lite/Approvals.java | 107 +- .../macosx/BeyondCompareImageReporter.java | 18 + .../macosx/BeyondCompareReporter.java | 14 +- .../reporters/macosx/MacDiffReporter.java | 14 +- .../approvals/lite/util/StringUtils.java | 220 +-- .../lite/util/servlets/ValidationError.java | 29 +- .../util/velocity/StringResourceLoader.java | 60 - .../lite/util/velocity/VelocityParser.java | 106 -- .../org/teachingextensions/logo/Colors.java | 1557 ----------------- .../logo/MultiTurtlePanel.java | 181 +- .../teachingextensions/logo/PuzzleBoard.java | 83 +- .../org/teachingextensions/logo/Tile.java | 5 + .../org/teachingextensions/logo/TileMove.java | 8 + .../org/teachingextensions/logo/Turtle.java | 24 +- .../teachingextensions/logo/TurtlePanel.java | 78 +- .../recipes/completed/ManyAnimals.java | 8 +- .../approvals/lite/util/StringUtilsTest.java | 104 +- .../util/velocity/RunAllVelocityTests.java | 19 - .../util/velocity/VelocitySilentTest.java | 36 - .../util/velocity/VelocityTableNameTest.java | 26 - .../lite/util/velocity/VelocityTest.java | 60 - .../logo/MultiTurtlePanelTest.java | 102 ++ ...ultiTurtlePanelTest.testPaint.approved.png | Bin 0 -> 2000 bytes ...ePanelTest.testPaintNoTurtles.approved.png | Bin 0 -> 1157 bytes ...ePanelTest.testPaintOneTurtle.approved.png | Bin 0 -> 1863 bytes ...PanelTest.testPaintOneTurtle.approved.png+ | Bin 0 -> 1863 bytes ...Test.testPaintWithGhostTurtle.approved.png | Bin 0 -> 1863 bytes ...est.testPaintWithHiddenTurtle.approved.png | Bin 0 -> 1863 bytes ...elTest.testPaintWithTwoTurtle.approved.png | Bin 0 -> 2496 bytes ...TurtlePanelTest.testSetAnimal.approved.png | Bin 0 -> 1977 bytes ...estTwoTurtlesDrawBeforeAdding.approved.png | Bin 0 -> 4560 bytes ...est.testTwoTurtlesDrawWithOne.approved.png | Bin 0 -> 2639 bytes .../logo/PuzzleBoardTest.java | 57 +- ...BoardTest.show_initial_puzzle.approved.png | Bin 105949 -> 105737 bytes ...oardTest.show_provided_puzzle.approved.png | Bin 105874 -> 0 bytes ...eBoardTest.testCreateSolution.approved.txt | 4 + ...est.testCreateTwoStepSolution.approved.txt | 5 + .../PuzzleBoardTest.testSwap.approved.txt | 4 + .../logo/tests/ColorGeneration.java | 97 - ...olorGeneration.testGeneration.approved.txt | 859 --------- ...orGeneration.testHtmlDisplay.approved.html | 702 -------- 41 files changed, 583 insertions(+), 4004 deletions(-) create mode 100644 src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/BeyondCompareImageReporter.java delete mode 100644 src/main/java/org/teachingextensions/approvals/lite/util/velocity/StringResourceLoader.java delete mode 100644 src/main/java/org/teachingextensions/approvals/lite/util/velocity/VelocityParser.java delete mode 100644 src/main/java/org/teachingextensions/logo/Colors.java delete mode 100644 src/test/java/org/teachingextensions/approvals/lite/util/velocity/RunAllVelocityTests.java delete mode 100644 src/test/java/org/teachingextensions/approvals/lite/util/velocity/VelocitySilentTest.java delete mode 100644 src/test/java/org/teachingextensions/approvals/lite/util/velocity/VelocityTableNameTest.java delete mode 100644 src/test/java/org/teachingextensions/approvals/lite/util/velocity/VelocityTest.java create mode 100644 src/test/java/org/teachingextensions/logo/MultiTurtlePanelTest.java create mode 100644 src/test/java/org/teachingextensions/logo/MultiTurtlePanelTest.testPaint.approved.png create mode 100644 src/test/java/org/teachingextensions/logo/MultiTurtlePanelTest.testPaintNoTurtles.approved.png create mode 100644 src/test/java/org/teachingextensions/logo/MultiTurtlePanelTest.testPaintOneTurtle.approved.png create mode 100644 src/test/java/org/teachingextensions/logo/MultiTurtlePanelTest.testPaintOneTurtle.approved.png+ create mode 100644 src/test/java/org/teachingextensions/logo/MultiTurtlePanelTest.testPaintWithGhostTurtle.approved.png create mode 100644 src/test/java/org/teachingextensions/logo/MultiTurtlePanelTest.testPaintWithHiddenTurtle.approved.png create mode 100644 src/test/java/org/teachingextensions/logo/MultiTurtlePanelTest.testPaintWithTwoTurtle.approved.png create mode 100644 src/test/java/org/teachingextensions/logo/MultiTurtlePanelTest.testSetAnimal.approved.png create mode 100644 src/test/java/org/teachingextensions/logo/MultiTurtlePanelTest.testTwoTurtlesDrawBeforeAdding.approved.png create mode 100644 src/test/java/org/teachingextensions/logo/MultiTurtlePanelTest.testTwoTurtlesDrawWithOne.approved.png delete mode 100644 src/test/java/org/teachingextensions/logo/PuzzleBoardTest.show_provided_puzzle.approved.png create mode 100644 src/test/java/org/teachingextensions/logo/PuzzleBoardTest.testCreateSolution.approved.txt create mode 100644 src/test/java/org/teachingextensions/logo/PuzzleBoardTest.testCreateTwoStepSolution.approved.txt create mode 100644 src/test/java/org/teachingextensions/logo/PuzzleBoardTest.testSwap.approved.txt delete mode 100644 src/test/java/org/teachingextensions/logo/tests/ColorGeneration.java delete mode 100644 src/test/java/org/teachingextensions/logo/tests/ColorGeneration.testGeneration.approved.txt delete mode 100644 src/test/java/org/teachingextensions/logo/tests/ColorGeneration.testHtmlDisplay.approved.html diff --git a/src/main/java/org/teachingextensions/approvals/lite/Approvals.java b/src/main/java/org/teachingextensions/approvals/lite/Approvals.java index cc2427a..12ec89d 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/Approvals.java +++ b/src/main/java/org/teachingextensions/approvals/lite/Approvals.java @@ -1,5 +1,9 @@ package org.teachingextensions.approvals.lite; +import java.awt.Component; +import java.awt.image.BufferedImage; +import java.util.Arrays; + import org.teachingextensions.approvals.lite.ReporterFactory.FileTypes; import org.teachingextensions.approvals.lite.namer.ApprovalNamer; import org.teachingextensions.approvals.lite.namer.JUnitStackTraceNamer; @@ -11,94 +15,97 @@ import org.teachingextensions.approvals.lite.writers.ComponentApprovalWriter; import org.teachingextensions.approvals.lite.writers.ImageApprovalWriter; -import java.awt.*; -import java.awt.image.BufferedImage; -import java.util.Arrays; - -public class Approvals { - public static void verify(String response) throws Exception { +public class Approvals +{ + public static void verify(String response) throws Exception + { verify(new ApprovalTextWriter(response, "txt"), FileTypes.Text); } - - public static void verifyAll(String header, T[] values) { + public static void verifyAll(String header, T[] values) + { Approvals.verifyAll(header, Arrays.asList(values)); } - - public static void verifyAll(String header, Iterable values) { - Approvals.verifyAll(header, values, new Function1() { + public static void verifyAll(String header, Iterable values) + { + Approvals.verifyAll(header, values, new Function1() + { @Override - public String call(T i) { + public String call(T i) + { return i + ""; } }); - } - - public static void verifyAll(String header, T[] values, - Function1 f1) { + public static void verifyAll(String header, T[] values, Function1 f1) + { verifyAll(header, Arrays.asList(values), f1); } - - public static void verifyAll(String header, Iterable array, - Function1 f1) { + public static void verifyAll(String header, Iterable array, Function1 f1) + { String text = formatHeader(header) + ArrayUtils.toString(array, f1); verify(new ApprovalTextWriter(text, "txt"), FileTypes.Text); } - - private static String formatHeader(String header) { + private static String formatHeader(String header) + { return StringUtils.isEmpty(header) ? "" : header + "\r\n\r\n\r\n"; } - - public static void verifyHtml(String response) throws Exception { + public static void verifyHtml(String response) throws Exception + { verify(new ApprovalTextWriter(response, "html"), FileTypes.Html); } - - public static void verify(Component component) { - BufferedImage image = ComponentApprovalWriter.drawComponent(component); - Approvals.verify(image); + public static void verify(Component component) + { + Approvals.verify(new ComponentApprovalWriter(component), FileTypes.Image); } - - public static void verify(BufferedImage bufferedImage) { + public static void verify(BufferedImage bufferedImage) + { verify(new ImageApprovalWriter(bufferedImage), FileTypes.Image); } - - public static void verify(ApprovalWriter writer, ApprovalNamer namer, - ApprovalFailureReporter reporter) { + public static void verify(ApprovalWriter writer, ApprovalNamer namer, ApprovalFailureReporter reporter) + { verify(new FileApprover(writer, namer), reporter); } - - public static void verify(ApprovalWriter writer, String fileType) { + public static void verify(ApprovalWriter writer, String fileType) + { verify(writer, createApprovalNamer(), ReporterFactory.get(fileType)); } - - public static void verify(FileApprover approver, - ApprovalFailureReporter reporter) { - try { - if (!approver.approve()) { + public static void verify(FileApprover approver, ApprovalFailureReporter reporter) + { + try + { + if (!approver.approve()) + { boolean passed = false; - if (reporter instanceof ApprovalFailureOverrider) { - passed = approver - .askToChangeReceivedToApproved((ApprovalFailureOverrider) reporter); + if (reporter instanceof ApprovalFailureOverrider) + { + passed = approver.askToChangeReceivedToApproved((ApprovalFailureOverrider) reporter); } - if (!passed) { + if (!passed) + { approver.reportFailure(reporter); approver.fail(); - } else { + } + else + { approver.cleanUpAfterSuccess(reporter); } - } else { + } + else + { approver.cleanUpAfterSuccess(reporter); } - } catch (Exception e) { + } + catch (Exception e) + { throw ObjectUtils.throwAsError(e); } } - - public static ApprovalNamer createApprovalNamer() { + public static ApprovalNamer createApprovalNamer() + { return new JUnitStackTraceNamer(); } - - public static void verify(Object o) throws Exception { + public static void verify(Object o) throws Exception + { Approvals.verify(o + ""); } } diff --git a/src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/BeyondCompareImageReporter.java b/src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/BeyondCompareImageReporter.java new file mode 100644 index 0000000..cafa3ee --- /dev/null +++ b/src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/BeyondCompareImageReporter.java @@ -0,0 +1,18 @@ +package org.teachingextensions.approvals.lite.reporters.macosx; + +import org.teachingextensions.approvals.lite.reporters.GenericDiffReporter; + +import java.text.MessageFormat; + +public class BeyondCompareImageReporter extends GenericDiffReporter +{ + public static final BeyondCompareImageReporter INSTANCE = new BeyondCompareImageReporter(); + static final String DIFF_PROGRAM = "/usr/local/bin/bcompare"; + static final String MESSAGE = MessageFormat.format( + "Unable to find Beyond Compare at {0}", + DIFF_PROGRAM); + + public BeyondCompareImageReporter() { + super(DIFF_PROGRAM, STANDARD_ARGUMENTS, MESSAGE, IMAGE_FILE_EXTENSIONS); + } +} diff --git a/src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/BeyondCompareReporter.java b/src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/BeyondCompareReporter.java index 2454b44..294d949 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/BeyondCompareReporter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/BeyondCompareReporter.java @@ -4,13 +4,15 @@ import java.text.MessageFormat; -public class BeyondCompareReporter extends GenericDiffReporter { +public class BeyondCompareReporter extends GenericDiffReporter +{ public static final BeyondCompareReporter INSTANCE = new BeyondCompareReporter(); - static final String DIFF_PROGRAM = "/usr/local/bin/bcompare"; - static final String MESSAGE = MessageFormat.format( - "Unable to find Beyond Compare at {0}", DIFF_PROGRAM); - - public BeyondCompareReporter() { + static final String DIFF_PROGRAM = "/usr/local/bin/bcompare"; + static final String MESSAGE = MessageFormat.format( + "Unable to find Beyond Compare at {0}", DIFF_PROGRAM); + public BeyondCompareReporter() + { super(DIFF_PROGRAM, MESSAGE); } } + diff --git a/src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/MacDiffReporter.java b/src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/MacDiffReporter.java index 9ab699e..d3542a5 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/MacDiffReporter.java +++ b/src/main/java/org/teachingextensions/approvals/lite/reporters/macosx/MacDiffReporter.java @@ -2,10 +2,12 @@ import org.teachingextensions.approvals.lite.reporters.FirstWorkingReporter; -public class MacDiffReporter extends FirstWorkingReporter { - public static final MacDiffReporter INSTANCE = new MacDiffReporter(); - - public MacDiffReporter() { - super(DiffMergeReporter.INSTANCE, KaleidoscopeDiffReporter.INSTANCE, P4MergeReporter.INSTANCE, TkDiffReporter.INSTANCE); - } +public class MacDiffReporter extends FirstWorkingReporter +{ + public static final MacDiffReporter INSTANCE = new MacDiffReporter(); + public MacDiffReporter() + { + super(DiffMergeReporter.INSTANCE, KaleidoscopeDiffReporter.INSTANCE, P4MergeReporter.INSTANCE, + TkDiffReporter.INSTANCE, BeyondCompareReporter.INSTANCE, BeyondCompareImageReporter.INSTANCE); + } } diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/StringUtils.java b/src/main/java/org/teachingextensions/approvals/lite/util/StringUtils.java index 378de23..1934d6f 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/StringUtils.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/StringUtils.java @@ -1,69 +1,15 @@ package org.teachingextensions.approvals.lite.util; -import java.io.ByteArrayInputStream; -import java.io.InputStream; -import java.util.Arrays; -import java.util.Map; - /** * A static class of convenience functions for database access */ -public class StringUtils { +public final class StringUtils { public static final String NEW_LINE = System.getProperty("line.separator"); - public static String stripWhiteSpace(String text) { - return stripWhiteSpace(text, false); - } - - public static String padNumber(long number, int digits) { - String text = "" + number; - while (text.length() < digits) { - text = "0" + text; - } - return text; - } - - public static String padNumber(int number, int digits) { - return padNumber((long) number, digits); + private StringUtils() { } - public static String stripWhiteSpace(String text, boolean all) { - StringBuilder newText = new StringBuilder(); - boolean whitespace = false; - int num = text.length(); - char whiteSpaceChar = ' '; - boolean atStart = true; - for (int i = 0; i < num; i++) { - char c = text.charAt(i); - switch (c) { - case '\r': - case '\n': - whiteSpaceChar = '\n'; - whitespace = true; - break; - case '\t': - case ' ': - whitespace = true; - break; - default: - if (whitespace && atStart) { - whitespace = false; - } - if (whitespace) { - whitespace = false; - newText.append(all ? '_' : whiteSpaceChar); - whiteSpaceChar = ' '; - } - atStart = false; - newText.append(c); - break; - } - } - return newText.toString(); - } - - public static String stripNonNumeric(String number, boolean allowDecimal, - boolean allowNegative) { + public static String stripNonNumeric(String number, boolean allowDecimal, boolean allowNegative) { boolean allowExponential = allowDecimal; boolean afterE = false; if (number == null) { @@ -73,42 +19,42 @@ public static String stripNonNumeric(String number, boolean allowDecimal, for (int i = 0; i < number.length(); i++) { char c = number.charAt(i); switch (c) { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - result.append(c); - afterE = false; - break; - case '-': - if (allowNegative || afterE) { - result.append(c); - allowNegative = false; - } - break; - case '.': - if (allowDecimal) { - result.append(c); - allowDecimal = false; - } - afterE = false; - break; - case 'e': - case 'E': - if (allowExponential) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': result.append(c); - allowExponential = false; - } - afterE = true; - break; - default: - break; + afterE = false; + break; + case '-': + if (allowNegative || afterE) { + result.append(c); + allowNegative = false; + } + break; + case '.': + if (allowDecimal) { + result.append(c); + allowDecimal = false; + } + afterE = false; + break; + case 'e': + case 'E': + if (allowExponential) { + result.append(c); + allowExponential = false; + } + afterE = true; + break; + default: + break; } } return result.toString(); @@ -118,98 +64,14 @@ public static String stripNonNumeric(String number, boolean allowDecimal, * A convenience function to check that a String has at least 1 character. * * @param string - * The string in question + * The string in question * @return true if Non Zero. */ public static boolean isNonZero(String string) { - return string != null && string.trim().length() > 0; + return string != null && 0 < string.trim().length(); } public static boolean isEmpty(String string) { return !isNonZero(string); } - - /** - * A convenience function to turn a vector of String objects into an Array of - * the String objects. - * - * @param vectorOf - * a Vector of String objects - * @return the array of String. - * @throws Error - * if an element of vectorOf is not a String object. - */ - public static String[] toArray(java.util.Collection vectorOf) { - if (vectorOf == null) { - return new String[0]; - } - String array[] = new String[vectorOf.size()]; - java.util.Iterator iterator = vectorOf.iterator(); - int i = 0; - while (iterator.hasNext()) { - String rowObject = iterator.next(); - if (rowObject != null) { - array[i++] = rowObject; - } else { - throw new Error("toArray[" + i - + "] is not an instance of String but a " - + ObjectUtils.getClassName(null)); - } - } - return array; - } - - public static String toString(String name, T[] array) { - StringBuilder buffer = new StringBuilder(); - name = (name == null ? "array" : name); - if (array == null || array.length == 0) { - buffer.append(name).append(".length = 0"); - } else { - int maxPadding = ("" + array.length).length(); - for (int i = 0; i < array.length; i++) { - buffer.append(name).append("[").append(padNumber(i, maxPadding)) - .append("] = ").append(array[i]).append("\r\n"); - } - } - return buffer.toString(); - } - - public static String toString(String name, Iterable array) { - StringBuilder buffer = new StringBuilder(); - name = (name == null ? "array" : name); - if (array != null) { - int count = 0; - for (T t : array) { - buffer.append(name).append("[").append(count).append("] = ") - .append(arrayStringHelper(t)).append("\r\n"); - count++; - } - } - if (buffer.length() == 0) { - buffer.append(name).append(".length = 0"); - } - return buffer.toString(); - } - - public static String arrayStringHelper(Object o) { - if (o == null) { - return "null"; - } - return o.getClass().isArray() ? Arrays.toString((Object[]) o) : o - .toString(); - } - - public static InputStream convertToInputStream(String string) { - return new ByteArrayInputStream(string.getBytes()); - } - - public static String toString(Map map) { - StringBuilder b = new StringBuilder(); - Object keySet[] = map.keySet().toArray(); - Arrays.sort(keySet); - for (Object key : keySet) { - b.append(String.format("%s : %s \r\n", key, map.get(key))); - } - return b.toString(); - } -} \ No newline at end of file +} diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/servlets/ValidationError.java b/src/main/java/org/teachingextensions/approvals/lite/util/servlets/ValidationError.java index 73238e6..34664f6 100644 --- a/src/main/java/org/teachingextensions/approvals/lite/util/servlets/ValidationError.java +++ b/src/main/java/org/teachingextensions/approvals/lite/util/servlets/ValidationError.java @@ -1,10 +1,10 @@ package org.teachingextensions.approvals.lite.util.servlets; +import org.teachingextensions.approvals.lite.util.StringUtils; + import java.util.HashMap; import java.util.HashSet; -import org.teachingextensions.approvals.lite.util.StringUtils; - public class ValidationError extends RuntimeException { private static final long serialVersionUID = 7940285202708976073L; private HashMap errors = new HashMap<>(); @@ -45,29 +45,6 @@ public void setError(String assertion, boolean isError, } } - public ValidationError add(String prefix, int index, ValidationError error) { - return add(getPrefixForIndex(prefix, index), error); - } - - public static String getPrefixForIndex(String prefix, int index) { - return prefix + "[" + index + "]"; - } - - public ValidationError add(String prefix, ValidationError error) { - prefix = StringUtils.isEmpty(prefix) ? "" : (prefix + "."); - String[] assertions = StringUtils.toArray(error.assertions); - - for (String assertion : assertions) { - this.assertions.add(prefix + assertion); - } - - for (String key : error.errors.keySet()) { - errors.put(prefix + key, error.errors.get(key)); - } - - return this; - } - public boolean isOk() { return errors.size() == 0; } @@ -83,4 +60,4 @@ public int size() { return errors.size(); } -} \ No newline at end of file +} diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/velocity/StringResourceLoader.java b/src/main/java/org/teachingextensions/approvals/lite/util/velocity/StringResourceLoader.java deleted file mode 100644 index 3b4f812..0000000 --- a/src/main/java/org/teachingextensions/approvals/lite/util/velocity/StringResourceLoader.java +++ /dev/null @@ -1,60 +0,0 @@ -package org.teachingextensions.approvals.lite.util.velocity; - -/* - * Copyright 2001-2002,2004 The Apache Software Foundation. - * - * 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. - */ - -import org.apache.commons.collections.ExtendedProperties; -import org.apache.velocity.exception.ResourceNotFoundException; -import org.apache.velocity.runtime.resource.Resource; -import org.apache.velocity.runtime.resource.loader.ResourceLoader; -import org.teachingextensions.approvals.lite.util.StringUtils; - -import java.io.InputStream; - -/** - * This is a simple resource loader that loads the string as a template - */ -public class StringResourceLoader extends ResourceLoader { - /** - * ******************************************************************* - */ - public boolean isSourceModified(Resource resource) { - return true; - } - - /** - * ******************************************************************* - */ - public long getLastModified(Resource resource) { - return 0; - } - - /** - * ******************************************************************* - */ - public synchronized InputStream getResourceStream(String name) throws ResourceNotFoundException { - return StringUtils.convertToInputStream(name); - } - - /** - * ******************************************************************* - */ - public void init(ExtendedProperties arg0) { -// My_System.event("initialize"); - } - /***********************************************************************/ - /***********************************************************************/ -} diff --git a/src/main/java/org/teachingextensions/approvals/lite/util/velocity/VelocityParser.java b/src/main/java/org/teachingextensions/approvals/lite/util/velocity/VelocityParser.java deleted file mode 100644 index 159d224..0000000 --- a/src/main/java/org/teachingextensions/approvals/lite/util/velocity/VelocityParser.java +++ /dev/null @@ -1,106 +0,0 @@ -package org.teachingextensions.approvals.lite.util.velocity; - -import java.io.StringWriter; -import java.io.Writer; -import java.util.Enumeration; -import java.util.Properties; - -import org.apache.log4j.Level; -import org.apache.log4j.LogManager; -import org.apache.log4j.Logger; -import org.apache.velocity.Template; -import org.apache.velocity.VelocityContext; -import org.apache.velocity.app.VelocityEngine; -import org.apache.velocity.context.Context; -import org.apache.velocity.runtime.RuntimeConstants; -import org.apache.velocity.runtime.log.NullLogSystem; -import org.teachingextensions.approvals.lite.util.ObjectUtils; -import org.teachingextensions.approvals.lite.util.ParserCommons; -import org.teachingextensions.approvals.lite.util.io.FileUtils; - -public class VelocityParser { - private static VelocityEngine currentEngine = null; - - static { - for (Enumeration e = LogManager.getCurrentLoggers(); e.hasMoreElements();) { - ((Logger) e.nextElement()).setLevel(Level.OFF); - } - } - - public static String parseString(String template, ContextAware process) { - Properties props = new Properties(); - props.put("resource.loader", "class"); - props.put("class.resource.loader.class", - StringResourceLoader.class.getName()); - props.put("velocimacro.context.localscope", "" + true); - props.put("runtime.introspector.uberspect", - TestableUberspect.class.getName()); - props.put("velocimacro.permissions.allow.inline.local.scope", "" + true); - return parse(template, props, new ContextAware[] { process, - Default.INSTANCE }); - } - - public static String parse(String template, Properties props, - ContextAware[] process) { - StringWriter out = new StringWriter(); - parse(template, props, process, out); - return out.toString(); - } - - public static Writer parse(String template, Properties props, - ContextAware process[], Writer out) { - try { - props.put("directive.foreach.counter.initial.value", "0"); - props.put(RuntimeConstants.RUNTIME_LOG_LOGSYSTEM_CLASS, - NullLogSystem.class.getName()); - VelocityEngine engine = initializeEngine(props); - VelocityContext context = new VelocityContext(); - Template velocityTemplate = engine.getTemplate(template); - for (ContextAware p : process) { - if (p != null) - p.setupContext(context); - } - velocityTemplate.merge(context, out); - return out; - } catch (Exception e) { - throw ObjectUtils.throwAsError(e); - } - } - - public static synchronized VelocityEngine initializeEngine(Properties props) - throws Exception { - if (currentEngine == null - || isDifferentForProperties(props, currentEngine, new String[] { - "resource.loader", "file.resource.loader.path" })) { - currentEngine = new VelocityEngine(); - currentEngine.init(props); - } - return currentEngine; - } - - private static boolean isDifferentForProperties(Properties props, - VelocityEngine engine, String[] keys) { - for (String key : keys) { - if (!ObjectUtils.isEqual(props.get(key), engine.getProperty(key))) { - return true; - } - } - return false; - } - - public static class Default implements ContextAware { - public static ContextAware INSTANCE = new Default(); - - @Override - public void setupContext(Context context) { - context.put("commons", ParserCommons.INSTANCE); - } - } - - public static String parseFromClassPath(Class clazz, String string, - ContextAware context) { - String resource = FileUtils.readFromClassPath(clazz, string); - return parseString(resource, context); - } - -} diff --git a/src/main/java/org/teachingextensions/logo/Colors.java b/src/main/java/org/teachingextensions/logo/Colors.java deleted file mode 100644 index 748d9cd..0000000 --- a/src/main/java/org/teachingextensions/logo/Colors.java +++ /dev/null @@ -1,1557 +0,0 @@ -package org.teachingextensions.logo; - -import java.awt.Color; -import java.util.Random; - -/** - * A color wheel - * Every color under the - * rainbow, - * and different ways to get them. - * - * - * Use PenColors - * @deprecated use {@link PenColors} instead. - */ -@Deprecated -public class Colors -{ - public static class Blues - { - /** - * The color Navy - * - * - * - * - *
 
- **/ - public static final Color Navy = Color.decode("#000080"); - /** - * The color DarkBlue - * - * - * - * - *
 
- **/ - public static final Color DarkBlue = Color.decode("#00008B"); - /** - * The color MidnightBlue - * - * - * - * - *
 
- **/ - public static final Color MidnightBlue = Color.decode("#191970"); - /** - * The color MediumBlue - * - * - * - * - *
 
- **/ - public static final Color MediumBlue = Color.decode("#0000CD"); - /** - * The color Blue - * - * - * - * - *
 
- **/ - public static final Color Blue = Color.decode("#0000FF"); - /** - * The color Teal - * - * - * - * - *
 
- **/ - public static final Color Teal = Color.decode("#008080"); - /** - * The color DarkSlateBlue - * - * - * - * - *
 
- **/ - public static final Color DarkSlateBlue = Color.decode("#483D8B"); - /** - * The color DarkCyan - * - * - * - * - *
 
- **/ - public static final Color DarkCyan = Color.decode("#008B8B"); - /** - * The color SteelBlue - * - * - * - * - *
 
- **/ - public static final Color SteelBlue = Color.decode("#4682B4"); - /** - * The color RoyalBlue - * - * - * - * - *
 
- **/ - public static final Color RoyalBlue = Color.decode("#4169E1"); - /** - * The color SlateBlue - * - * - * - * - *
 
- **/ - public static final Color SlateBlue = Color.decode("#6A5ACD"); - /** - * The color CadetBlue - * - * - * - * - *
 
- **/ - public static final Color CadetBlue = Color.decode("#5F9EA0"); - /** - * The color DarkTurquoise - * - * - * - * - *
 
- **/ - public static final Color DarkTurquoise = Color.decode("#00CED1"); - /** - * The color DodgerBlue - * - * - * - * - *
 
- **/ - public static final Color DodgerBlue = Color.decode("#1E90FF"); - /** - * The color DeepSkyBlue - * - * - * - * - *
 
- **/ - public static final Color DeepSkyBlue = Color.decode("#00BFFF"); - /** - * The color MediumSlateBlue - * - * - * - * - *
 
- **/ - public static final Color MediumSlateBlue = Color.decode("#7B68EE"); - /** - * The color MediumTurquoise - * - * - * - * - *
 
- **/ - public static final Color MediumTurquoise = Color.decode("#48D1CC"); - /** - * The color CornflowerBlue - * - * - * - * - *
 
- **/ - public static final Color CornflowerBlue = Color.decode("#6495ED"); - /** - * The color Turquoise - * - * - * - * - *
 
- **/ - public static final Color Turquoise = Color.decode("#40E0D0"); - /** - * The color Aqua - * - * - * - * - *
 
- **/ - public static final Color Aqua = Color.decode("#00FFFF"); - /** - * The color Cyan - * - * - * - * - *
 
- **/ - public static final Color Cyan = Color.decode("#00FFFF"); - /** - * The color SkyBlue - * - * - * - * - *
 
- **/ - public static final Color SkyBlue = Color.decode("#87CEEB"); - /** - * The color LightSkyBlue - * - * - * - * - *
 
- **/ - public static final Color LightSkyBlue = Color.decode("#87CEFA"); - /** - * The color Aquamarine - * - * - * - * - *
 
- **/ - public static final Color Aquamarine = Color.decode("#7FFFD4"); - /** - * The color LightSteelBlue - * - * - * - * - *
 
- **/ - public static final Color LightSteelBlue = Color.decode("#B0C4DE"); - /** - * The color LightBlue - * - * - * - * - *
 
- **/ - public static final Color LightBlue = Color.decode("#ADD8E6"); - /** - * The color PowderBlue - * - * - * - * - *
 
- **/ - public static final Color PowderBlue = Color.decode("#B0E0E6"); - /** - * The color PaleTurquoise - * - * - * - * - *
 
- **/ - public static final Color PaleTurquoise = Color.decode("#AFEEEE"); - /** - * The color LightCyan - * - * - * - * - *
 
- **/ - public static final Color LightCyan = Color.decode("#E0FFFF"); - /** - * The color AliceBlue - * - * - * - * - *
 
- **/ - public static final Color AliceBlue = Color.decode("#F0F8FF"); - /** - * The color Azure - * - * - * - * - *
 
- **/ - public static final Color Azure = Color.decode("#F0FFFF"); - } - public static class Browns - { - /** - * The color Maroon - * - * - * - * - *
 
- **/ - public static final Color Maroon = Color.decode("#800000"); - /** - * The color SaddleBrown - * - * - * - * - *
 
- **/ - public static final Color SaddleBrown = Color.decode("#8B4513"); - /** - * The color Brown - * - * - * - * - *
 
- **/ - public static final Color Brown = Color.decode("#A52A2A"); - /** - * The color Sienna - * - * - * - * - *
 
- **/ - public static final Color Sienna = Color.decode("#A0522D"); - /** - * The color DarkGoldenrod - * - * - * - * - *
 
- **/ - public static final Color DarkGoldenrod = Color.decode("#B8860B"); - /** - * The color Chocolate - * - * - * - * - *
 
- **/ - public static final Color Chocolate = Color.decode("#D2691E"); - /** - * The color Peru - * - * - * - * - *
 
- **/ - public static final Color Peru = Color.decode("#CD853F"); - /** - * The color Goldenrod - * - * - * - * - *
 
- **/ - public static final Color Goldenrod = Color.decode("#DAA520"); - /** - * The color RosyBrown - * - * - * - * - *
 
- **/ - public static final Color RosyBrown = Color.decode("#BC8F8F"); - /** - * The color SandyBrown - * - * - * - * - *
 
- **/ - public static final Color SandyBrown = Color.decode("#F4A460"); - /** - * The color Tan - * - * - * - * - *
 
- **/ - public static final Color Tan = Color.decode("#D2B48C"); - /** - * The color BurlyWood - * - * - * - * - *
 
- **/ - public static final Color BurlyWood = Color.decode("#DEB887"); - /** - * The color Wheat - * - * - * - * - *
 
- **/ - public static final Color Wheat = Color.decode("#F5DEB3"); - /** - * The color NavajoWhite - * - * - * - * - *
 
- **/ - public static final Color NavajoWhite = Color.decode("#FFDEAD"); - /** - * The color Bisque - * - * - * - * - *
 
- **/ - public static final Color Bisque = Color.decode("#FFE4C4"); - /** - * The color BlanchedAlmond - * - * - * - * - *
 
- **/ - public static final Color BlanchedAlmond = Color.decode("#FFEBCD"); - /** - * The color Cornsilk - * - * - * - * - *
 
- **/ - public static final Color Cornsilk = Color.decode("#FFF8DC"); - } - public static class Grays - { - /** - * The color Black - * - * - * - * - *
 
- **/ - public static final Color Black = Color.decode("#000000"); - /** - * The color DarkSlateGray - * - * - * - * - *
 
- **/ - public static final Color DarkSlateGray = Color.decode("#2F4F4F"); - /** - * The color DimGray - * - * - * - * - *
 
- **/ - public static final Color DimGray = Color.decode("#696969"); - /** - * The color Gray - * - * - * - * - *
 
- **/ - public static final Color Gray = Color.decode("#808080"); - /** - * The color SlateGray - * - * - * - * - *
 
- **/ - public static final Color SlateGray = Color.decode("#708090"); - /** - * The color LightSlateGray - * - * - * - * - *
 
- **/ - public static final Color LightSlateGray = Color.decode("#778899"); - /** - * The color DarkGray - * - * - * - * - *
 
- **/ - public static final Color DarkGray = Color.decode("#A9A9A9"); - /** - * The color Silver - * - * - * - * - *
 
- **/ - public static final Color Silver = Color.decode("#C0C0C0"); - /** - * The color LightGray - * - * - * - * - *
 
- **/ - public static final Color LightGray = Color.decode("#D3D3D3"); - /** - * The color Gainsboro - * - * - * - * - *
 
- **/ - public static final Color Gainsboro = Color.decode("#DCDCDC"); - } - public static class Greens - { - /** - * The color DarkGreen - * - * - * - * - *
 
- **/ - public static final Color DarkGreen = Color.decode("#006400"); - /** - * The color Green - * - * - * - * - *
 
- **/ - public static final Color Green = Color.decode("#008000"); - /** - * The color ForestGreen - * - * - * - * - *
 
- **/ - public static final Color ForestGreen = Color.decode("#228B22"); - /** - * The color DarkOliveGreen - * - * - * - * - *
 
- **/ - public static final Color DarkOliveGreen = Color.decode("#556B2F"); - /** - * The color Lime - * - * - * - * - *
 
- **/ - public static final Color Lime = Color.decode("#00FF00"); - /** - * The color Olive - * - * - * - * - *
 
- **/ - public static final Color Olive = Color.decode("#808000"); - /** - * The color Teal - * - * - * - * - *
 
- **/ - public static final Color Teal = Color.decode("#008080"); - /** - * The color SeaGreen - * - * - * - * - *
 
- **/ - public static final Color SeaGreen = Color.decode("#2E8B57"); - /** - * The color DarkCyan - * - * - * - * - *
 
- **/ - public static final Color DarkCyan = Color.decode("#008B8B"); - /** - * The color OliveDrab - * - * - * - * - *
 
- **/ - public static final Color OliveDrab = Color.decode("#6B8E23"); - /** - * The color LimeGreen - * - * - * - * - *
 
- **/ - public static final Color LimeGreen = Color.decode("#32CD32"); - /** - * The color MediumSeaGreen - * - * - * - * - *
 
- **/ - public static final Color MediumSeaGreen = Color.decode("#3CB371"); - /** - * The color LawnGreen - * - * - * - * - *
 
- **/ - public static final Color LawnGreen = Color.decode("#7CFC00"); - /** - * The color LightSeaGreen - * - * - * - * - *
 
- **/ - public static final Color LightSeaGreen = Color.decode("#20B2AA"); - /** - * The color Chartreuse - * - * - * - * - *
 
- **/ - public static final Color Chartreuse = Color.decode("#7FFF00"); - /** - * The color SpringGreen - * - * - * - * - *
 
- **/ - public static final Color SpringGreen = Color.decode("#00FF7F"); - /** - * The color MediumSpringGreen - * - * - * - * - *
 
- **/ - public static final Color MediumSpringGreen = Color.decode("#00FA9A"); - /** - * The color YellowGreen - * - * - * - * - *
 
- **/ - public static final Color YellowGreen = Color.decode("#9ACD32"); - /** - * The color DarkTurquoise - * - * - * - * - *
 
- **/ - public static final Color DarkTurquoise = Color.decode("#00CED1"); - /** - * The color DarkSeaGreen - * - * - * - * - *
 
- **/ - public static final Color DarkSeaGreen = Color.decode("#8FBC8F"); - /** - * The color GreenYellow - * - * - * - * - *
 
- **/ - public static final Color GreenYellow = Color.decode("#ADFF2F"); - /** - * The color MediumAquamarine - * - * - * - * - *
 
- **/ - public static final Color MediumAquamarine = Color.decode("#66CDAA"); - /** - * The color MediumTurquoise - * - * - * - * - *
 
- **/ - public static final Color MediumTurquoise = Color.decode("#48D1CC"); - /** - * The color Turquoise - * - * - * - * - *
 
- **/ - public static final Color Turquoise = Color.decode("#40E0D0"); - /** - * The color LightGreen - * - * - * - * - *
 
- **/ - public static final Color LightGreen = Color.decode("#90EE90"); - /** - * The color PaleGreen - * - * - * - * - *
 
- **/ - public static final Color PaleGreen = Color.decode("#98FB98"); - /** - * The color Aquamarine - * - * - * - * - *
 
- **/ - public static final Color Aquamarine = Color.decode("#7FFFD4"); - /** - * The color PaleTurquoise - * - * - * - * - *
 
- **/ - public static final Color PaleTurquoise = Color.decode("#AFEEEE"); - } - public static class Oranges - { - /** - * The color OrangeRed - * - * - * - * - *
 
- **/ - public static final Color OrangeRed = Color.decode("#FF4500"); - /** - * The color DarkOrange - * - * - * - * - *
 
- **/ - public static final Color DarkOrange = Color.decode("#FF8C00"); - /** - * The color Orange - * - * - * - * - *
 
- **/ - public static final Color Orange = Color.decode("#FFA500"); - /** - * The color Tomato - * - * - * - * - *
 
- **/ - public static final Color Tomato = Color.decode("#FF6347"); - /** - * The color Coral - * - * - * - * - *
 
- **/ - public static final Color Coral = Color.decode("#FF7F50"); - /** - * The color LightSalmon - * - * - * - * - *
 
- **/ - public static final Color LightSalmon = Color.decode("#FFA07A"); - } - public static class Pinks - { - /** - * The color MediumVioletRed - * - * - * - * - *
 
- **/ - public static final Color MediumVioletRed = Color.decode("#C71585"); - /** - * The color DeepPink - * - * - * - * - *
 
- **/ - public static final Color DeepPink = Color.decode("#FF1493"); - /** - * The color PaleVioletRed - * - * - * - * - *
 
- **/ - public static final Color PaleVioletRed = Color.decode("#DB7093"); - /** - * The color Fuchsia - * - * - * - * - *
 
- **/ - public static final Color Fuchsia = Color.decode("#FF00FF"); - /** - * The color HotPink - * - * - * - * - *
 
- **/ - public static final Color HotPink = Color.decode("#FF69B4"); - /** - * The color LightPink - * - * - * - * - *
 
- **/ - public static final Color LightPink = Color.decode("#FFB6C1"); - /** - * The color Pink - * - * - * - * - *
 
- **/ - public static final Color Pink = Color.decode("#FFC0CB"); - } - public static class Purples - { - /** - * The color Indigo - * - * - * - * - *
 
- **/ - public static final Color Indigo = Color.decode("#4B0082"); - /** - * The color Purple - * - * - * - * - *
 
- **/ - public static final Color Purple = Color.decode("#800080"); - /** - * The color DarkSlateBlue - * - * - * - * - *
 
- **/ - public static final Color DarkSlateBlue = Color.decode("#483D8B"); - /** - * The color DarkMagenta - * - * - * - * - *
 
- **/ - public static final Color DarkMagenta = Color.decode("#8B008B"); - /** - * The color MediumVioletRed - * - * - * - * - *
 
- **/ - public static final Color MediumVioletRed = Color.decode("#C71585"); - /** - * The color DarkViolet - * - * - * - * - *
 
- **/ - public static final Color DarkViolet = Color.decode("#9400D3"); - /** - * The color SlateBlue - * - * - * - * - *
 
- **/ - public static final Color SlateBlue = Color.decode("#6A5ACD"); - /** - * The color BlueViolet - * - * - * - * - *
 
- **/ - public static final Color BlueViolet = Color.decode("#8A2BE2"); - /** - * The color DarkOrchid - * - * - * - * - *
 
- **/ - public static final Color DarkOrchid = Color.decode("#9932CC"); - /** - * The color MediumSlateBlue - * - * - * - * - *
 
- **/ - public static final Color MediumSlateBlue = Color.decode("#7B68EE"); - /** - * The color RosyBrown - * - * - * - * - *
 
- **/ - public static final Color RosyBrown = Color.decode("#BC8F8F"); - /** - * The color MediumPurple - * - * - * - * - *
 
- **/ - public static final Color MediumPurple = Color.decode("#9370DB"); - /** - * The color PaleVioletRed - * - * - * - * - *
 
- **/ - public static final Color PaleVioletRed = Color.decode("#DB7093"); - /** - * The color MediumOrchid - * - * - * - * - *
 
- **/ - public static final Color MediumOrchid = Color.decode("#BA55D3"); - /** - * The color Fuchsia - * - * - * - * - *
 
- **/ - public static final Color Fuchsia = Color.decode("#FF00FF"); - /** - * The color Magenta - * - * - * - * - *
 
- **/ - public static final Color Magenta = Color.decode("#FF00FF"); - /** - * The color Orchid - * - * - * - * - *
 
- **/ - public static final Color Orchid = Color.decode("#DA70D6"); - /** - * The color Plum - * - * - * - * - *
 
- **/ - public static final Color Plum = Color.decode("#DDA0DD"); - /** - * The color Violet - * - * - * - * - *
 
- **/ - public static final Color Violet = Color.decode("#EE82EE"); - /** - * The color Thistle - * - * - * - * - *
 
- **/ - public static final Color Thistle = Color.decode("#D8BFD8"); - /** - * The color Lavender - * - * - * - * - *
 
- **/ - public static final Color Lavender = Color.decode("#E6E6FA"); - } - public static class Reds - { - /** - * The color DarkRed - * - * - * - * - *
 
- **/ - public static final Color DarkRed = Color.decode("#8B0000"); - /** - * The color FireBrick - * - * - * - * - *
 
- **/ - public static final Color FireBrick = Color.decode("#B22222"); - /** - * The color Red - * - * - * - * - *
 
- **/ - public static final Color Red = Color.decode("#FF0000"); - /** - * The color Crimson - * - * - * - * - *
 
- **/ - public static final Color Crimson = Color.decode("#DC143C"); - /** - * The color OrangeRed - * - * - * - * - *
 
- **/ - public static final Color OrangeRed = Color.decode("#FF4500"); - /** - * The color MediumVioletRed - * - * - * - * - *
 
- **/ - public static final Color MediumVioletRed = Color.decode("#C71585"); - /** - * The color IndianRed - * - * - * - * - *
 
- **/ - public static final Color IndianRed = Color.decode("#CD5C5C"); - /** - * The color Tomato - * - * - * - * - *
 
- **/ - public static final Color Tomato = Color.decode("#FF6347"); - /** - * The color PaleVioletRed - * - * - * - * - *
 
- **/ - public static final Color PaleVioletRed = Color.decode("#DB7093"); - /** - * The color Salmon - * - * - * - * - *
 
- **/ - public static final Color Salmon = Color.decode("#FA8072"); - /** - * The color LightCoral - * - * - * - * - *
 
- **/ - public static final Color LightCoral = Color.decode("#F08080"); - /** - * The color DarkSalmon - * - * - * - * - *
 
- **/ - public static final Color DarkSalmon = Color.decode("#E9967A"); - /** - * The color LightSalmon - * - * - * - * - *
 
- **/ - public static final Color LightSalmon = Color.decode("#FFA07A"); - } - public static class Whites - { - /** - * The color AntiqueWhite - * - * - * - * - *
 
- **/ - public static final Color AntiqueWhite = Color.decode("#FAEBD7"); - /** - * The color MistyRose - * - * - * - * - *
 
- **/ - public static final Color MistyRose = Color.decode("#FFE4E1"); - /** - * The color Beige - * - * - * - * - *
 
- **/ - public static final Color Beige = Color.decode("#F5F5DC"); - /** - * The color Linen - * - * - * - * - *
 
- **/ - public static final Color Linen = Color.decode("#FAF0E6"); - /** - * The color OldLace - * - * - * - * - *
 
- **/ - public static final Color OldLace = Color.decode("#FDF5E6"); - /** - * The color Honeydew - * - * - * - * - *
 
- **/ - public static final Color Honeydew = Color.decode("#F0FFF0"); - /** - * The color WhiteSmoke - * - * - * - * - *
 
- **/ - public static final Color WhiteSmoke = Color.decode("#F5F5F5"); - /** - * The color Seashell - * - * - * - * - *
 
- **/ - public static final Color Seashell = Color.decode("#FFF5EE"); - /** - * The color LavenderBlush - * - * - * - * - *
 
- **/ - public static final Color LavenderBlush = Color.decode("#FFF0F5"); - /** - * The color AliceBlue - * - * - * - * - *
 
- **/ - public static final Color AliceBlue = Color.decode("#F0F8FF"); - /** - * The color FloralWhite - * - * - * - * - *
 
- **/ - public static final Color FloralWhite = Color.decode("#FFFAF0"); - /** - * The color MintCream - * - * - * - * - *
 
- **/ - public static final Color MintCream = Color.decode("#F5FFFA"); - /** - * The color Azure - * - * - * - * - *
 
- **/ - public static final Color Azure = Color.decode("#F0FFFF"); - /** - * The color Ivory - * - * - * - * - *
 
- **/ - public static final Color Ivory = Color.decode("#FFFFF0"); - /** - * The color GhostWhite - * - * - * - * - *
 
- **/ - public static final Color GhostWhite = Color.decode("#F8F8FF"); - /** - * The color Snow - * - * - * - * - *
 
- **/ - public static final Color Snow = Color.decode("#FFFAFA"); - /** - * The color White - * - * - * - * - *
 
- **/ - public static final Color White = Color.decode("#FFFFFF"); - } - public static class Yellows - { - /** - * The color DarkGoldenrod - * - * - * - * - *
 
- **/ - public static final Color DarkGoldenrod = Color.decode("#B8860B"); - /** - * The color Goldenrod - * - * - * - * - *
 
- **/ - public static final Color Goldenrod = Color.decode("#DAA520"); - /** - * The color Gold - * - * - * - * - *
 
- **/ - public static final Color Gold = Color.decode("#FFD700"); - /** - * The color DarkKhaki - * - * - * - * - *
 
- **/ - public static final Color DarkKhaki = Color.decode("#BDB76B"); - /** - * The color Yellow - * - * - * - * - *
 
- **/ - public static final Color Yellow = Color.decode("#FFFF00"); - /** - * The color Khaki - * - * - * - * - *
 
- **/ - public static final Color Khaki = Color.decode("#F0E68C"); - /** - * The color PaleGoldenrod - * - * - * - * - *
 
- **/ - public static final Color PaleGoldenrod = Color.decode("#EEE8AA"); - /** - * The color PeachPuff - * - * - * - * - *
 
- **/ - public static final Color PeachPuff = Color.decode("#FFDAB9"); - /** - * The color Moccasin - * - * - * - * - *
 
- **/ - public static final Color Moccasin = Color.decode("#FFE4B5"); - /** - * The color PapayaWhip - * - * - * - * - *
 
- **/ - public static final Color PapayaWhip = Color.decode("#FFEFD5"); - /** - * The color LemonChiffon - * - * - * - * - *
 
- **/ - public static final Color LemonChiffon = Color.decode("#FFFACD"); - /** - * The color LightGoldenrodYellow - * - * - * - * - *
 
- **/ - public static final Color LightGoldenrodYellow = Color.decode("#FAFAD2"); - /** - * The color LightYellow - * - * - * - * - *
 
- **/ - public static final Color LightYellow = Color.decode("#FFFFE0"); - } - private static Random RANDOM = new Random(); - public static Color darken(Color color) - { - int red = decrease(color.getRed(), 10); - int green = decrease(color.getGreen(), 10); - int blue = decrease(color.getBlue(), 10); - return new Color(red, green, blue); - } - private static int decrease(int amount, int decreaseBy) - { - return Math.max(0, amount - decreaseBy); - } - public static Color lighten(Color color) - { - int red = increase(color.getRed(), 10); - int green = increase(color.getGreen(), 10); - int blue = increase(color.getBlue(), 10); - return new Color(red, green, blue); - } - private static int increase(int amount, int increaseBy) - { - return Math.min(255, amount + increaseBy); - } - public static Color getRandomColor() - { - return new Color(RANDOM.nextInt(255), RANDOM.nextInt(255), RANDOM.nextInt(255)); - } - public static void mockRandom() - { - RANDOM.setSeed(5); - } - public static int calculateTransparency(int percentTransparent) - { - int opacity = (percentTransparent * 255) / 100; - return (255 - opacity); - } - public static Color getTransparentVersion(Color color, int percentTransparency) - { - return new Color(color.getRed(), color.getGreen(), color.getBlue(), calculateTransparency(percentTransparency)); - } -} \ No newline at end of file diff --git a/src/main/java/org/teachingextensions/logo/MultiTurtlePanel.java b/src/main/java/org/teachingextensions/logo/MultiTurtlePanel.java index 5216df2..850cc12 100644 --- a/src/main/java/org/teachingextensions/logo/MultiTurtlePanel.java +++ b/src/main/java/org/teachingextensions/logo/MultiTurtlePanel.java @@ -1,91 +1,100 @@ package org.teachingextensions.logo; -import java.awt.BasicStroke; -import java.awt.Cursor; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.Image; -import java.awt.RenderingHints; +import org.teachingextensions.approvals.lite.util.ObjectUtils; +import org.teachingextensions.logo.Turtle.Animals; + +import java.awt.*; import java.awt.geom.AffineTransform; import java.awt.geom.Line2D; import java.util.ArrayList; import java.util.List; -import javax.swing.JFrame; - -import org.teachingextensions.approvals.lite.util.ObjectUtils; -import org.teachingextensions.logo.Turtle.Animals; -import org.teachingextensions.windows.ProgramWindow; - /** - * Use this window when you want to put more than one turtle on the same window + * Use this window when you want to put more than one turtle on the same window */ -@SuppressWarnings("serial") -public class MultiTurtlePanel extends TurtlePanel -{ - private List turtles; - private Image image; - private Animals animal; - public MultiTurtlePanel() - { - turtles = new ArrayList(); +public class MultiTurtlePanel extends TurtlePanel { + private static final long serialVersionUID = 1810849469483511849L; + private List turtles = new ArrayList(); + private Image image; + private Animals animal = Animals.Turtle; + + public MultiTurtlePanel() { + super("So Many Turtles"); + this.image = loadAnimal(); } + /** * Adds a turtle instance to a window - *
Example: {@code multiTurtlePanel.addTurtle(myTurtle)}
- * + *

Example: {@code multiTurtlePanel.addTurtle(myTurtle)}

+ * * @param turtle - * A turtle instance + * A turtle instance */ - public void addTurtle(Turtle turtle) - { + public void addTurtle(Turtle turtle) { + if (turtle == null) { + return; + } this.turtles.add(turtle); turtle.setPanel(this); } + + @Override + public void paint(Graphics g) { + Graphics2D g2d = configureGraphics2D(g); + paintLines(g2d); + paintTurtle(g2d); + g2d.dispose(); + } + + @Override + public synchronized Image getImage() { + return image; + } + /** - * Shows a window that can hold more than one turtle - *
Example: {@code multiTurtlePanel.showPanel( )}
- * + * Sets the Animal + *

Example: {@code multiTurtlePanel.setAnimal(animal)}

+ * + * @see Animals */ - public void showPanel() - { - JFrame frame = new JFrame("So Many Turtles"); - frame.getContentPane().add(this); - ProgramWindow.createStandardFrame(frame); - this.repaint(); - } @Override - public void paint(Graphics g) - { - super.paint(g); - paintLines((Graphics2D) g); - paintTurtle((Graphics2D) g); + public synchronized void setAnimal(Animals animal) { + this.animal = animal; + this.image = loadAnimal(); } - private void paintLines(Graphics2D g) - { - for (Turtle turtle : turtles) - { - if (turtle == null) { return; } - g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - g.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY); - g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE); - g.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE); - for (LineSegment l : turtle.getTrail()) - { - if (l != null) - { - g.setColor(l.getColor()); - g.setStroke(new BasicStroke(l.getWidth(), BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)); - g.draw(new Line2D.Double(l.getStart().x, l.getStart().y, l.getEnd().x, l.getEnd().y)); - } - } + + private Image loadAnimal() { + return ObjectUtils.loadImage(MultiTurtlePanel.class, this.animal + ".png"); + } + + private Graphics2D configureGraphics2D(Graphics g) { + Graphics2D g2d = (Graphics2D) g.create(); + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY); + g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE); + g2d.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE); + return g2d; + } + + private void paintLines(Graphics2D g2d) { + for (Turtle turtle : turtles) { + paintTrail(g2d, turtle.getTrail()); } } - private void paintTurtle(Graphics2D g) - { - for (Turtle turtle : turtles) - { - if (turtle == null || turtle.isHidden()) { return; } + + private void paintTrail(Graphics2D g2d, LineSegment[] trail) { + for (LineSegment l : trail) { + g2d.setColor(l.getColor()); + g2d.setStroke(new BasicStroke(l.getWidth(), BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)); + g2d.draw(new Line2D.Double(l.getStart().x, l.getStart().y, l.getEnd().x, l.getEnd().y)); + } + } + + private void paintTurtle(Graphics2D g) { + for (Turtle turtle : turtles) { + if (turtle.isHidden()) { + continue; + } Image image = getImage(); int xCenter = image.getWidth(null) / 2; int yCenter = image.getHeight(null) / 2; @@ -98,44 +107,8 @@ private void paintTurtle(Graphics2D g) g.drawImage(image, move, null); } } - @Override - public synchronized Image getImage() - { - if (image == null) - { - setAnimal(Animals.Turtle); - } - return image; - } - @Override - public synchronized Animals getAnimal() - { - if (animal == null) - { - setAnimal(Animals.Turtle); - } - return animal; - } - /** - * Sets the Animal - *
Example: {@code multiTurtlePanel.setAnimal(animal)}
- * - * @see Animals - */ - @Override - public synchronized void setAnimal(Animals animal) - { - this.animal = animal; - this.image = ObjectUtils.loadImage(MultiTurtlePanel.class, this.animal + ".png"); - } - @Override - public void setCursor(int cursor) - { - this.setCursor(Cursor.getPredefinedCursor(cursor)); - } - @Override - public void ___() - { - // blank for the DeepDive + + public int getTurtleCount() { + return this.turtles.size(); } } diff --git a/src/main/java/org/teachingextensions/logo/PuzzleBoard.java b/src/main/java/org/teachingextensions/logo/PuzzleBoard.java index 2707c4b..513f74c 100644 --- a/src/main/java/org/teachingextensions/logo/PuzzleBoard.java +++ b/src/main/java/org/teachingextensions/logo/PuzzleBoard.java @@ -9,30 +9,30 @@ import javax.swing.JPanel; +import org.teachingextensions.approvals.lite.util.StringUtils; + /** * Draws and animates a 9-puzzle */ -public class PuzzleBoard extends JPanel { +public class PuzzleBoard extends JPanel +{ private static final long serialVersionUID = -2008156268412728375L; private final static int blank = 8; private final Tile[] tiles; private final Queue solution; - - public PuzzleBoard(Puzzle puzzle, PuzzleState solution) { + public PuzzleBoard(Puzzle puzzle, PuzzleState solution) + { super(); this.solution = createSolution(solution, puzzle); this.tiles = createTiles(puzzle.getCells()); } - - private static Queue createSolution(PuzzleState solution, - Puzzle puzzle) { - if (solution == null) { - return new ArrayDeque<>(); - } - + public static Queue createSolution(PuzzleState solution, Puzzle puzzle) + { + if (solution == null) { return new ArrayDeque<>(); } int i = puzzle.getBlankIndex(); Queue moves = new ArrayDeque<>(); - for (PuzzleState.Direction d : solution.getHistory()) { + for (PuzzleState.Direction d : solution.getHistory()) + { int m = d.getValue(); TileMove move = new TileMove(i + m, i); moves.add(move); @@ -40,66 +40,79 @@ private static Queue createSolution(PuzzleState solution, } return moves; } - - private static Tile[] createTiles(int[] cells) { + private static Tile[] createTiles(int[] cells) + { Tile[] t = new Tile[9]; - for (int i = 0; i < 9; i++) { - if (cells[i] == blank) { + for (int i = 0; i < 9; i++) + { + if (cells[i] == blank) + { continue; } - t[i] = new Tile(i, cells[i]); } return t; } - - private static void drawBorder(Graphics g) { + private static void drawBorder(Graphics g) + { g.setColor(PenColors.Blues.DarkBlue); g.fillRect(20, 20, 410, 410); } - - private static void drawField(Graphics g) { + private static void drawField(Graphics g) + { g.setColor(PenColors.Blues.SkyBlue); g.fillRect(30, 30, 386, 386); } - - private static void drawTiles(Graphics g, Tile[] tiles) { + private static void drawTiles(Graphics g, Tile[] tiles) + { Graphics2D g2d = (Graphics2D) g.create(); - for (Tile tile : tiles) { - if (tile == null) { + for (Tile tile : tiles) + { + if (tile == null) + { continue; } tile.paint(g2d); } g2d.dispose(); } - @Override - protected void paintComponent(Graphics g) { + protected void paintComponent(Graphics g) + { super.paintComponent(g); drawBorder(g); drawField(g); drawTiles(g, tiles); } - - public Tile[] getTiles() { + public Tile[] getTiles() + { return Arrays.copyOf(tiles, tiles.length); } - - public boolean hasMoves() { + public boolean hasMoves() + { return !solution.isEmpty(); } - - public TileMove getNextMove() { + public TileMove getNextMove() + { return solution.isEmpty() ? null : solution.remove(); } - - public void swap(int start, int end) { + @Override + public String toString() + { + StringBuilder sb = new StringBuilder(); + sb.append("PuzzleBoard" + StringUtils.NEW_LINE); + for (int i = 0; i < tiles.length; i += 3) + { + sb.append(tiles[i] + ", " + tiles[i + 1] + ", " + tiles[i + 2] + StringUtils.NEW_LINE); + } + return sb.toString(); + } + public void swap(int start, int end) + { Point p = Tile.getPosition(end); Tile tile = tiles[start]; tile.moveTo(p); tiles[start] = null; tiles[end] = tile; - } } diff --git a/src/main/java/org/teachingextensions/logo/Tile.java b/src/main/java/org/teachingextensions/logo/Tile.java index 4eac054..85fdfb6 100644 --- a/src/main/java/org/teachingextensions/logo/Tile.java +++ b/src/main/java/org/teachingextensions/logo/Tile.java @@ -64,4 +64,9 @@ public void moveTo(Point goal) { target = goal; } + @Override + public String toString() + { + return "Tile{" + position.x + ", " + position.y + '}'; + } } diff --git a/src/main/java/org/teachingextensions/logo/TileMove.java b/src/main/java/org/teachingextensions/logo/TileMove.java index a1d3758..77e1297 100644 --- a/src/main/java/org/teachingextensions/logo/TileMove.java +++ b/src/main/java/org/teachingextensions/logo/TileMove.java @@ -13,6 +13,14 @@ public TileMove(int start, int end) { this.end = end; } + @Override + public String toString() { + return "TileMove{" + + "start=" + start + + ", end=" + end + + '}'; + } + public int getStart() { return start; } diff --git a/src/main/java/org/teachingextensions/logo/Turtle.java b/src/main/java/org/teachingextensions/logo/Turtle.java index 0bc2552..23ec699 100644 --- a/src/main/java/org/teachingextensions/logo/Turtle.java +++ b/src/main/java/org/teachingextensions/logo/Turtle.java @@ -1,21 +1,17 @@ package org.teachingextensions.logo; -import java.awt.Color; -import java.awt.Component; -import java.awt.Point; -import java.awt.image.BufferedImage; -import java.util.ArrayList; -import java.util.List; - -import javax.swing.JFrame; - -import org.teachingextensions.approvals.lite.writers.ComponentApprovalWriter; -import org.teachingextensions.approvals.lite.util.lambda.Action0; -import org.teachingextensions.windows.ProgramWindow; - import org.teachingextensions.approvals.lite.util.ThreadLauncher; +import org.teachingextensions.approvals.lite.util.lambda.Action0; import org.teachingextensions.approvals.lite.util.persistence.Saver; import org.teachingextensions.approvals.lite.util.persistence.SavingException; +import org.teachingextensions.approvals.lite.writers.ComponentApprovalWriter; +import org.teachingextensions.windows.ProgramWindow; + +import javax.swing.*; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.util.ArrayList; +import java.util.List; /** * A turtle drawing a line @@ -232,7 +228,7 @@ public static double getDeltaX(double i, double angleInDegrees2) } public LineSegment[] getTrail() { - return trail.toArray(new LineSegment[0]); + return trail.toArray(new LineSegment[trail.size()]); } public void setPenColor(Color color) { diff --git a/src/main/java/org/teachingextensions/logo/TurtlePanel.java b/src/main/java/org/teachingextensions/logo/TurtlePanel.java index df5844c..1f6777c 100644 --- a/src/main/java/org/teachingextensions/logo/TurtlePanel.java +++ b/src/main/java/org/teachingextensions/logo/TurtlePanel.java @@ -10,46 +10,49 @@ import java.net.URL; @SuppressWarnings("serial") -public class TurtlePanel extends ProgramWindow { - private Turtle turtle; - private Image image; +public class TurtlePanel extends ProgramWindow +{ + private Turtle turtle; + private Image image; private Animals animal; - - public TurtlePanel() { + public TurtlePanel() + { } - - public void setTurtle(Turtle turtle) { + public TurtlePanel(String string) + { + super(string); + } + public void setTurtle(Turtle turtle) + { this.turtle = turtle; } - @Override - public void paint(Graphics g) { + public void paint(Graphics g) + { super.paint(g); paintLines((Graphics2D) g); paintTurtle((Graphics2D) g); } - - private void paintLines(Graphics2D g) { - if (turtle == null) { - return; - } + private void paintLines(Graphics2D g) + { + if (turtle == null) { return; } g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY); g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE); g.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE); - for (LineSegment l : turtle.getTrail()) { - if (l != null) { + for (LineSegment l : turtle.getTrail()) + { + if (l != null) + { g.setColor(l.getColor()); g.setStroke(new BasicStroke(l.getWidth(), BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)); g.draw(new Line2D.Double(l.getStart().x, l.getStart().y, l.getEnd().x, l.getEnd().y)); } } } - - private void paintTurtle(Graphics2D g) { - if (turtle == null || turtle.isHidden()) { - return; - } + private void paintTurtle(Graphics2D g) + { + if (turtle == null || turtle.isHidden()) { return; } Image image = getImage(); int xCenter = image.getWidth(null) / 2; int yCenter = image.getHeight(null) / 2; @@ -61,39 +64,40 @@ private void paintTurtle(Graphics2D g) { move.concatenate(rotate); g.drawImage(image, move, null); } - - public synchronized Image getImage() { - if (image == null) { + public synchronized Image getImage() + { + if (image == null) + { setAnimal(Animals.Turtle); } return image; } - - public synchronized Animals getAnimal() { - if (animal == null) { + public synchronized Animals getAnimal() + { + if (animal == null) + { setAnimal(Animals.Turtle); } return animal; } - - public synchronized void setAnimal(Animals animal) { + public synchronized void setAnimal(Animals animal) + { this.animal = animal; String name = animal + ".png"; URL resource = this.getClass().getResource(name); - if (resource == null) { + if (resource == null) + { resource = this.getClass().getClassLoader().getResource(name); } - if (resource == null) { - throw new IllegalStateException("Could not find animal: " + name); - } + if (resource == null) { throw new IllegalStateException("Could not find animal: " + name); } image = new ImageIcon(resource).getImage(); } - - public void setCursor(int cursor) { + public void setCursor(int cursor) + { this.setCursor(Cursor.getPredefinedCursor(cursor)); } - - public void ___() { + public void ___() + { // blank for the DeepDive } } diff --git a/src/main/java/org/teachingkidsprogramming/recipes/completed/ManyAnimals.java b/src/main/java/org/teachingkidsprogramming/recipes/completed/ManyAnimals.java index 6b19fc9..e298eaf 100644 --- a/src/main/java/org/teachingkidsprogramming/recipes/completed/ManyAnimals.java +++ b/src/main/java/org/teachingkidsprogramming/recipes/completed/ManyAnimals.java @@ -1,10 +1,10 @@ package org.teachingkidsprogramming.recipes.completed; -import java.util.ArrayList; - import org.teachingextensions.logo.MultiTurtlePanel; import org.teachingextensions.logo.Turtle; +import java.util.ArrayList; + public class ManyAnimals { public ManyAnimals() @@ -13,12 +13,10 @@ public ManyAnimals() } //Create a container to hold your turtles HINT: Use ArrayList --#2.1 public ArrayList turtles = new ArrayList(); - //Create a window to show your turtles HINT: Use MultiTurtlePanel --#1.1 + //Create a window to show your turtles HINT: Use MultiTurtlePanel --#1 public MultiTurtlePanel mt = new MultiTurtlePanel(); private void showSomeTurtles() { - //Show your panel --#1.2 - mt.showPanel(); //Set the size to 100 --#5.4 int size = 100; //Add your three turtles HINT: FOR loop which 'does an action' --#2.2 diff --git a/src/test/java/org/teachingextensions/approvals/lite/util/StringUtilsTest.java b/src/test/java/org/teachingextensions/approvals/lite/util/StringUtilsTest.java index 194800d..4540ca3 100644 --- a/src/test/java/org/teachingextensions/approvals/lite/util/StringUtilsTest.java +++ b/src/test/java/org/teachingextensions/approvals/lite/util/StringUtilsTest.java @@ -1,15 +1,99 @@ package org.teachingextensions.approvals.lite.util; -import junit.framework.TestCase; -import org.teachingextensions.approvals.lite.Approvals; +import org.junit.Test; +import static org.junit.Assert.*; -public class StringUtilsTest extends TestCase { - - public void testWriteToString() throws Exception { - Approvals.verify(StringUtils.toString("things", new Object[]{1, null, "hi"})); - } - - /***********************************************************************/ - /***********************************************************************/ +public class StringUtilsTest +{ + @Test + public void testStripNonNumericFromNull() throws Exception + { + String s = StringUtils.stripNonNumeric(null, false, false); + assertEquals("", s); + } + @Test + public void testStripNonNumericAllAlpha() throws Exception + { + String s = StringUtils.stripNonNumeric("a", false, false); + assertEquals("", s); + } + @Test + public void testStripNonNumeric() throws Exception + { + String s = StringUtils.stripNonNumeric("a1", false, false); + assertEquals("1", s); + } + @Test + public void testStripNonNumericWithNegativeDisallowed() throws Exception + { + String s = StringUtils.stripNonNumeric("a-1", false, false); + assertEquals("1", s); + } + @Test + public void testStripNonNumericWithNegative() throws Exception + { + String s = StringUtils.stripNonNumeric("a-1", false, true); + assertEquals("-1", s); + } + @Test + public void testStripNonNumericWithDecimalDisallowed() throws Exception + { + String s = StringUtils.stripNonNumeric("a-1.0", false, false); + assertEquals("10", s); + } + @Test + public void testStripNonNumericWithDecimalAllowed() throws Exception + { + String s = StringUtils.stripNonNumeric("a-1.0", true, false); + assertEquals("1.0", s); + } + @Test + public void testStripNonNumericWithExponent() throws Exception + { + String s = StringUtils.stripNonNumeric("a-1.0e2", true, false); + assertEquals("1.0e2", s); + } + @Test + public void testStripNonNumericWithNegativeExponent() throws Exception + { + String s = StringUtils.stripNonNumeric("a-1.0e-2", true, false); + assertEquals("1.0e-2", s); + } + @Test + public void testStripNonNumericWithExponentDisallowed() throws Exception + { + String s = StringUtils.stripNonNumeric("a-1.0e2", false, false); + assertEquals("102", s); + } + @Test + public void testIsNullNonZero() throws Exception + { + assertFalse(StringUtils.isNonZero(null)); + } + @Test + public void testIsEmptyNonZero() throws Exception + { + assertFalse(StringUtils.isNonZero(" ")); + } + @Test + public void testIsNonZero() throws Exception + { + assertTrue(StringUtils.isNonZero(" a ")); + } + @Test + public void testNullIsEmpty() throws Exception + { + assertTrue(StringUtils.isEmpty(null)); + } + @Test + public void testEmptyIsEmpty() throws Exception + { + assertTrue(StringUtils.isEmpty(" ")); + } + @Test + public void testIsEmpty() throws Exception + { + assertFalse(StringUtils.isEmpty(" a ")); + } } diff --git a/src/test/java/org/teachingextensions/approvals/lite/util/velocity/RunAllVelocityTests.java b/src/test/java/org/teachingextensions/approvals/lite/util/velocity/RunAllVelocityTests.java deleted file mode 100644 index fcca943..0000000 --- a/src/test/java/org/teachingextensions/approvals/lite/util/velocity/RunAllVelocityTests.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.teachingextensions.approvals.lite.util.velocity; - -import junit.framework.Test; -import junit.framework.TestSuite; - -public class RunAllVelocityTests extends TestSuite -{ - /***********************************************************************/ - public static Test suite() throws InstantiationException, IllegalAccessException, ClassNotFoundException - { - TestSuite suite = new TestSuite("Test for com.spun"); - suite.addTest(new TestSuite(VelocitySilentTest.class)); - suite.addTest(new TestSuite(VelocityTest.class)); - suite.addTest(new TestSuite(VelocityNullSetTest.class)); - return suite; - } - /***********************************************************************/ - /***********************************************************************/ -} diff --git a/src/test/java/org/teachingextensions/approvals/lite/util/velocity/VelocitySilentTest.java b/src/test/java/org/teachingextensions/approvals/lite/util/velocity/VelocitySilentTest.java deleted file mode 100644 index 5abd34d..0000000 --- a/src/test/java/org/teachingextensions/approvals/lite/util/velocity/VelocitySilentTest.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.teachingextensions.approvals.lite.util.velocity; - -import junit.framework.TestCase; -import org.apache.velocity.context.Context; - -public class VelocitySilentTest - extends TestCase implements ContextAware { - /** - * ******************************************************************* - */ - public void testMethod() throws Exception { - assertEquals("", VelocityParser.parseString("$!main.toString()", this)); - } - - /** - * ******************************************************************* - */ - - /** - * ******************************************************************* - */ - public String toString() { - return null; - } - - /** - * ******************************************************************* - */ - public void setupContext(Context context) { - context.put("main", this); - context.put("nullValue", null); - } - -} -/***********************************************************************/ -/***********************************************************************/ diff --git a/src/test/java/org/teachingextensions/approvals/lite/util/velocity/VelocityTableNameTest.java b/src/test/java/org/teachingextensions/approvals/lite/util/velocity/VelocityTableNameTest.java deleted file mode 100644 index c7540df..0000000 --- a/src/test/java/org/teachingextensions/approvals/lite/util/velocity/VelocityTableNameTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.teachingextensions.approvals.lite.util.velocity; - -import junit.framework.TestCase; -import org.apache.velocity.context.Context; - -public class VelocityTableNameTest extends TestCase implements ContextAware -{ - /**********************77*************************************************/ - public void testWTF() throws Exception - { - String template = "${main.getObjectName()}Metadata.TABLE_NAME, "; - assertEquals("CompanyMetadata.TABLE_NAME, ", VelocityParser.parseString(template, this)); - } - /***********************************************************************/ - public String getObjectName() - { - return "Company"; - } - /***********************************************************************/ - public void setupContext(Context context) - { - context.put("main", this); - } - /***********************************************************************/ - /***********************************************************************/ -} diff --git a/src/test/java/org/teachingextensions/approvals/lite/util/velocity/VelocityTest.java b/src/test/java/org/teachingextensions/approvals/lite/util/velocity/VelocityTest.java deleted file mode 100644 index 221190e..0000000 --- a/src/test/java/org/teachingextensions/approvals/lite/util/velocity/VelocityTest.java +++ /dev/null @@ -1,60 +0,0 @@ -package org.teachingextensions.approvals.lite.util.velocity; - -import junit.framework.TestCase; -import org.apache.velocity.context.Context; - -public class VelocityTest extends TestCase implements ContextAware { - /** - * *******************77************************************************ - */ - public void testCodeWorks() throws Exception { - assertEquals(getClass().getName(), VelocityParser.parseString("$main.getClass().getName()", this)); - } - - public void testUnknownField() { - assertErrorThrown("$main.unknownField"); - } - - /** - * ******************************************************************* - */ - public void testUnknownFieldThenMethod() { - assertErrorThrown("$main.unknownField.someMethod()"); - } - - /** - * ******************************************************************* - */ - private void assertErrorThrown(String string) { - String result; - try { - result = VelocityParser.parseString(string, this); - } catch (Throwable t) { - return; - } - fail("parsing '" + string + "' did not fail but returned '" + result + "'"); - } - - /** - * ******************************************************************* - */ - public void testUnknownMethod() { - assertErrorThrown("$main.unknownMethod()"); - } - - /** - * ******************************************************************* - */ - public Object getNull() { - return null; - } - - /** - * ******************************************************************* - */ - public void setupContext(Context context) { - context.put("main", this); - } -} -/***********************************************************************/ -/***********************************************************************/ diff --git a/src/test/java/org/teachingextensions/logo/MultiTurtlePanelTest.java b/src/test/java/org/teachingextensions/logo/MultiTurtlePanelTest.java new file mode 100644 index 0000000..49750d9 --- /dev/null +++ b/src/test/java/org/teachingextensions/logo/MultiTurtlePanelTest.java @@ -0,0 +1,102 @@ +package org.teachingextensions.logo; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; +import org.teachingextensions.approvals.lite.Approvals; + +public class MultiTurtlePanelTest +{ + @Test + public void testPaintNoTurtles() + { + MultiTurtlePanel panel = new MultiTurtlePanel(); + Approvals.verify(panel); + } + @Test + public void testPaintOneTurtle() + { + MultiTurtlePanel panel = new MultiTurtlePanel(); + panel.addTurtle(new Turtle()); + Approvals.verify(panel); + } + @Test + public void testPaintWithGhostTurtle() + { + MultiTurtlePanel panel = new MultiTurtlePanel(); + panel.addTurtle(null); + panel.addTurtle(new Turtle()); + Approvals.verify(panel); + } + @Test + public void testPaintWithHiddenTurtle() + { + MultiTurtlePanel panel = new MultiTurtlePanel(); + Turtle hiddenTurtle = new Turtle(); + hiddenTurtle.hide(); + panel.addTurtle(hiddenTurtle); + panel.addTurtle(new Turtle()); + Approvals.verify(panel); + } + @Test + public void testPaintWithTwoTurtle() + { + MultiTurtlePanel panel = new MultiTurtlePanel(); + Turtle crouchingTurtle = new Turtle(); + crouchingTurtle.setX(35); + crouchingTurtle.setY(35); + panel.addTurtle(crouchingTurtle); + panel.addTurtle(new Turtle()); + Approvals.verify(panel); + } + @Test + public void testTwoTurtlesDrawBeforeAdding() + { + MultiTurtlePanel panel = new MultiTurtlePanel(); + Turtle turtle = new Turtle(); + turtle.setSpeed(Integer.MIN_VALUE); + turtle.move(100); + turtle.drawStar(50); + Turtle crouchingTurtle = new Turtle(); + crouchingTurtle.setSpeed(Integer.MIN_VALUE); + crouchingTurtle.setX(35); + crouchingTurtle.setY(35); + crouchingTurtle.drawStar(50); + panel.addTurtle(crouchingTurtle); + panel.addTurtle(turtle); + Approvals.verify(panel); + } + @Test + public void testPaint() + { + MultiTurtlePanel panel = new MultiTurtlePanel(); + panel.addTurtle(null); + Turtle turtle = new Turtle(); + panel.addTurtle(turtle); + turtle.setSpeed(10); + turtle.move(100); + Approvals.verify(panel); + } + @Test + public void testAddGhostTurtle() throws Exception + { + MultiTurtlePanel panel = new MultiTurtlePanel(); + panel.addTurtle(null); + assertEquals(0, panel.getTurtleCount()); + } + @Test + public void testAddTurtle() throws Exception + { + MultiTurtlePanel panel = new MultiTurtlePanel(); + panel.addTurtle(new Turtle()); + assertEquals(1, panel.getTurtleCount()); + } + @Test + public void testSetAnimal() throws Exception + { + MultiTurtlePanel panel = new MultiTurtlePanel(); + panel.addTurtle(new Turtle()); + panel.setAnimal(Turtle.Animals.ExplodedTurtle); + Approvals.verify(panel); + } +} diff --git a/src/test/java/org/teachingextensions/logo/MultiTurtlePanelTest.testPaint.approved.png b/src/test/java/org/teachingextensions/logo/MultiTurtlePanelTest.testPaint.approved.png new file mode 100644 index 0000000000000000000000000000000000000000..60c8933648f307030255c6557bc245c2238b8272 GIT binary patch literal 2000 zcmeAS@N?(olHy`uVBq!ia0y~yU@B%{VBF2Y1{7KGSlEk!fqlBCi(^Q|t+#i)^QVML z9Qe5W!tV<~3z>9tj|bhl)P3RQZo?){k5$uFb6%g3VB+ZPvuA=t^F)EW5*J!k)?BFF zUMGJsKjF|h7O~G3%eVd#Of%RYUo@%w-pumiu>W()&vgPV8U+-Ez>9$7^hI`iB>Z<} zU({I~Grc;Ejo|@nK(*>TKH1JWyJamudp=31Ew(W=W?;~7i`gL^X?suVsnxD1W`>4y z;bG6%)Rdm@@3Q%m`Q$-J%FgsO1_rAO(fLQWUS9tA^V{=_)svDRB$%|fwHNI$Jyp7M z``_B1xs}JxFfwep`6$We=0@dBVXse3|MuOC{n+Ek$f>jUN$#vlGm}o|fBxj_iEDpl zX1=Q5_uL`AI7MaCdi|nI%{t>|28P@#S4Dq5aD4Lj_uic)C5p?#`BO@hwN}3`OZ|H6 z;u^g(X{FUB;p=^#UwT!uZ`Y;5>@HU>fA_`SilJefluXaFpPwhbuMwzx;b9w| zw|9=Tf7Pa_=rgarCP(hwIp^xHiFbZ1whq51fBM%QmvwhLY$}a5*<`aZGTh3@)m?Wb z>*5>v?m4@+Sg-arj=U>#{?(nDu>1UJUz6j*^7T``9?b~5zHD<{o&x)^Q`t8&rlp@% zU~piUkdiue)wno%b)o#$q<72b{rP(ShRjv|ztM%?Z=HJf|HY|e9L8)67cvdY3zv!J z^q#%G>T2`9|4HlCoSQ1Td-Ca3TpL-{pkGzdQTt(VJ^( z9r@9Z-_(T3_otU8>b;&`^{@8qs|q281~cv15_<7{G5-xdT{sl7?%u8aTNxMS)L2}V zI^LgJTBm1T_x|LuYT?QacH4F`Ce_wzzc>SQZuQf>)f4&U-TcnHJ6)9=Z??`q?JF=k zUd7z}^Wp5foS3!Gi;@lb&%8N#ykGhKoz6G!%1k&J9HOT>H=m9y-n)0AbM+$23WIrH z-}leiBX!fldiPKHoke%|Y8O>(`u_97y>)48#cp1Hd?A6Mp)a6M!m?D$?)E>MDy2F( ziT?ek+}e#!eSPuqN9yn2pQ4XXVqhrQ_a~i!K>_H00bu#kVadQ?$j;C(gPFkrn2tcg zM`RcnlK8;F$f|(C$f`h^p{hW_FtebVVP=6<`2h_E*@Hz6&3YtNAXnkB9?6k}tcQ37 z=5{129L~&SL-9S59J=+m!wAiK5O)-eoDgXEzjQz2)S&b8`?->~fxPYM>gTe~DWM4f DoB!(H literal 0 HcmV?d00001 diff --git a/src/test/java/org/teachingextensions/logo/MultiTurtlePanelTest.testPaintNoTurtles.approved.png b/src/test/java/org/teachingextensions/logo/MultiTurtlePanelTest.testPaintNoTurtles.approved.png new file mode 100644 index 0000000000000000000000000000000000000000..a5c86b800e2b8344ac1489bb21c0093a69870224 GIT binary patch literal 1157 zcmeAS@N?(olHy`uVBq!ia0y~yU@B%{VBF2Y1{7KGSlEk!fyKwu#WAGf*4u-PKrx2H v3w{R2Ki~*u1aU^eXb6mkz-R~%8v-%R-_|oQikk183DV)|>gTe~DWM4fHOLj+ literal 0 HcmV?d00001 diff --git a/src/test/java/org/teachingextensions/logo/MultiTurtlePanelTest.testPaintOneTurtle.approved.png b/src/test/java/org/teachingextensions/logo/MultiTurtlePanelTest.testPaintOneTurtle.approved.png new file mode 100644 index 0000000000000000000000000000000000000000..8546cea59ac77e4a80612080d689edec6af5fd0c GIT binary patch literal 1863 zcmeAS@N?(olHy`uVBq!ia0y~yU@B%{VBF2Y1{7KGSlEk!ft}CO#WAGf*4sPY`JtgA z3=cwI{Js>lkV!Xp{n9N<`4?_aPht_CAfoFpJkRi8MpN629}0$S%8FKo3z$767Jl~o zYrp9KftHz^JnufeyBEU#uOWKUd+)GK=k3z{uVtja-yFsQv}zQLh5%_H@ZY%1?A77! zk6U(&ofS%rd6vS)@IW=7T6Z3=Z0DTa!j_*ipCr^8&pXM(aNx9}_&e7y|675_E?xzu z^lkf#jLZ!LE&rE3d3auleYw)C*H;Namw=@#Ed0l+x7Lom@6&M`YOG{ntY9xL>aLm_}jXm-5Ds$xBIj3Izj*Z+~ zYO=a}bL3sgvsYJN-nqqU{`&Pg&mSMR{(NumiMiH)-Psu~1U5Hc+*6?V=`O!AzwFBA zr{0DaKhE?I%kGZcTdA{p`}ECG_LHRR%buTNPmY{F`^47S6V?6QrfoIiV7TCzon5#! ztUK+0#FINu??%SXJNfEbMcDJ_n|~!5te*dCQ&qa+YJK<3yX@wE{mg7>5VkILapbjA z3JeF#3`|U>tWJM^Yk8skcC%vp?@#jUkEVs#f7@dS|zo z<@BD-zWOThfBo#8MONW{Z~XMqA3y3jE5mT0EHJ8PiuUE8wN}Nc2CKiPZT^*&A2vPh zwyVJXt&i^1gw5|sFD=x2J-zzh-n6UpSQr)@_7XfiReR!Vc~`lp8KY! z{Y~}Xn?bW}Z<;_G|N*+}`bV5MjKf_)IiSQ>MR$m7>+SAp~Wt~$( F695|~mN@_b literal 0 HcmV?d00001 diff --git a/src/test/java/org/teachingextensions/logo/MultiTurtlePanelTest.testPaintOneTurtle.approved.png+ b/src/test/java/org/teachingextensions/logo/MultiTurtlePanelTest.testPaintOneTurtle.approved.png+ new file mode 100644 index 0000000000000000000000000000000000000000..8546cea59ac77e4a80612080d689edec6af5fd0c GIT binary patch literal 1863 zcmeAS@N?(olHy`uVBq!ia0y~yU@B%{VBF2Y1{7KGSlEk!ft}CO#WAGf*4sPY`JtgA z3=cwI{Js>lkV!Xp{n9N<`4?_aPht_CAfoFpJkRi8MpN629}0$S%8FKo3z$767Jl~o zYrp9KftHz^JnufeyBEU#uOWKUd+)GK=k3z{uVtja-yFsQv}zQLh5%_H@ZY%1?A77! zk6U(&ofS%rd6vS)@IW=7T6Z3=Z0DTa!j_*ipCr^8&pXM(aNx9}_&e7y|675_E?xzu z^lkf#jLZ!LE&rE3d3auleYw)C*H;Namw=@#Ed0l+x7Lom@6&M`YOG{ntY9xL>aLm_}jXm-5Ds$xBIj3Izj*Z+~ zYO=a}bL3sgvsYJN-nqqU{`&Pg&mSMR{(NumiMiH)-Psu~1U5Hc+*6?V=`O!AzwFBA zr{0DaKhE?I%kGZcTdA{p`}ECG_LHRR%buTNPmY{F`^47S6V?6QrfoIiV7TCzon5#! ztUK+0#FINu??%SXJNfEbMcDJ_n|~!5te*dCQ&qa+YJK<3yX@wE{mg7>5VkILapbjA z3JeF#3`|U>tWJM^Yk8skcC%vp?@#jUkEVs#f7@dS|zo z<@BD-zWOThfBo#8MONW{Z~XMqA3y3jE5mT0EHJ8PiuUE8wN}Nc2CKiPZT^*&A2vPh zwyVJXt&i^1gw5|sFD=x2J-zzh-n6UpSQr)@_7XfiReR!Vc~`lp8KY! z{Y~}Xn?bW}Z<;_G|N*+}`bV5MjKf_)IiSQ>MR$m7>+SAp~Wt~$( F695|~mN@_b literal 0 HcmV?d00001 diff --git a/src/test/java/org/teachingextensions/logo/MultiTurtlePanelTest.testPaintWithGhostTurtle.approved.png b/src/test/java/org/teachingextensions/logo/MultiTurtlePanelTest.testPaintWithGhostTurtle.approved.png new file mode 100644 index 0000000000000000000000000000000000000000..8546cea59ac77e4a80612080d689edec6af5fd0c GIT binary patch literal 1863 zcmeAS@N?(olHy`uVBq!ia0y~yU@B%{VBF2Y1{7KGSlEk!ft}CO#WAGf*4sPY`JtgA z3=cwI{Js>lkV!Xp{n9N<`4?_aPht_CAfoFpJkRi8MpN629}0$S%8FKo3z$767Jl~o zYrp9KftHz^JnufeyBEU#uOWKUd+)GK=k3z{uVtja-yFsQv}zQLh5%_H@ZY%1?A77! zk6U(&ofS%rd6vS)@IW=7T6Z3=Z0DTa!j_*ipCr^8&pXM(aNx9}_&e7y|675_E?xzu z^lkf#jLZ!LE&rE3d3auleYw)C*H;Namw=@#Ed0l+x7Lom@6&M`YOG{ntY9xL>aLm_}jXm-5Ds$xBIj3Izj*Z+~ zYO=a}bL3sgvsYJN-nqqU{`&Pg&mSMR{(NumiMiH)-Psu~1U5Hc+*6?V=`O!AzwFBA zr{0DaKhE?I%kGZcTdA{p`}ECG_LHRR%buTNPmY{F`^47S6V?6QrfoIiV7TCzon5#! ztUK+0#FINu??%SXJNfEbMcDJ_n|~!5te*dCQ&qa+YJK<3yX@wE{mg7>5VkILapbjA z3JeF#3`|U>tWJM^Yk8skcC%vp?@#jUkEVs#f7@dS|zo z<@BD-zWOThfBo#8MONW{Z~XMqA3y3jE5mT0EHJ8PiuUE8wN}Nc2CKiPZT^*&A2vPh zwyVJXt&i^1gw5|sFD=x2J-zzh-n6UpSQr)@_7XfiReR!Vc~`lp8KY! z{Y~}Xn?bW}Z<;_G|N*+}`bV5MjKf_)IiSQ>MR$m7>+SAp~Wt~$( F695|~mN@_b literal 0 HcmV?d00001 diff --git a/src/test/java/org/teachingextensions/logo/MultiTurtlePanelTest.testPaintWithHiddenTurtle.approved.png b/src/test/java/org/teachingextensions/logo/MultiTurtlePanelTest.testPaintWithHiddenTurtle.approved.png new file mode 100644 index 0000000000000000000000000000000000000000..8546cea59ac77e4a80612080d689edec6af5fd0c GIT binary patch literal 1863 zcmeAS@N?(olHy`uVBq!ia0y~yU@B%{VBF2Y1{7KGSlEk!ft}CO#WAGf*4sPY`JtgA z3=cwI{Js>lkV!Xp{n9N<`4?_aPht_CAfoFpJkRi8MpN629}0$S%8FKo3z$767Jl~o zYrp9KftHz^JnufeyBEU#uOWKUd+)GK=k3z{uVtja-yFsQv}zQLh5%_H@ZY%1?A77! zk6U(&ofS%rd6vS)@IW=7T6Z3=Z0DTa!j_*ipCr^8&pXM(aNx9}_&e7y|675_E?xzu z^lkf#jLZ!LE&rE3d3auleYw)C*H;Namw=@#Ed0l+x7Lom@6&M`YOG{ntY9xL>aLm_}jXm-5Ds$xBIj3Izj*Z+~ zYO=a}bL3sgvsYJN-nqqU{`&Pg&mSMR{(NumiMiH)-Psu~1U5Hc+*6?V=`O!AzwFBA zr{0DaKhE?I%kGZcTdA{p`}ECG_LHRR%buTNPmY{F`^47S6V?6QrfoIiV7TCzon5#! ztUK+0#FINu??%SXJNfEbMcDJ_n|~!5te*dCQ&qa+YJK<3yX@wE{mg7>5VkILapbjA z3JeF#3`|U>tWJM^Yk8skcC%vp?@#jUkEVs#f7@dS|zo z<@BD-zWOThfBo#8MONW{Z~XMqA3y3jE5mT0EHJ8PiuUE8wN}Nc2CKiPZT^*&A2vPh zwyVJXt&i^1gw5|sFD=x2J-zzh-n6UpSQr)@_7XfiReR!Vc~`lp8KY! z{Y~}Xn?bW}Z<;_G|N*+}`bV5MjKf_)IiSQ>MR$m7>+SAp~Wt~$( F695|~mN@_b literal 0 HcmV?d00001 diff --git a/src/test/java/org/teachingextensions/logo/MultiTurtlePanelTest.testPaintWithTwoTurtle.approved.png b/src/test/java/org/teachingextensions/logo/MultiTurtlePanelTest.testPaintWithTwoTurtle.approved.png new file mode 100644 index 0000000000000000000000000000000000000000..d20d0a1154448647ee6101a6289a0f70b65298ab GIT binary patch literal 2496 zcmeHH`B&0;6#b+PwwSGFTyWH)V#-|7)Nsib#LCoZ5z{bfQA;s0-1nJIqvpamYDOw$ z9#dnnP)angP5p|ZHXhti$O$M(G{*(WZD{_5=7)ah{dmuL@4j=-y*J|*FZVU8j8*{v z)*LyEJ^_Fh34mn{D_|O=^4-Rx0IWAhmG+0z1||cI&kn zFX>c8F1tC{`9Jtjha{6utu4zc3qt_Vx5#fDd>$(u?9EMc&7^x`ZlNg4K;Q2j#Tg$f zyj%3obRv-FliuQMVQDbZB?P~&J)CPLxn*ag1G>(wUOf@nk^{wa%>(--A|r#$_p(!0 z6j&+0pF*HI6>oId;vgr*vX+{t+DVMzVTi|rnwn+DY2NG7V5f9|HzvHGm|$G;S|y7&1(nI8MB%QX@N{7@LZ`n z@Uo&G)`f*B*OcgLfk>>l(Nz86xOBFiN7$nZnrud6CAv?&-yfZL^|YZTj*;sjxZ!Ng zMc#GJc$VP6YB&?7p~~6mdEKL$BNjt1T;4qVDeL{h90JL7v+ooT77@P9Lk(Nfw#NtR zDwUzakGU=`cVOCpu)4ensyaEL?wN!#W`pp%7A=lIX3kX&{vWP`NTpj{N(h=r+<+4CRcq-gqD1f(?5-xz6gqMr9mV;|{W zwVktZf3H5L&Y-c)4D8p5igMeRXrO+3fM{t_(pgoY?Kf21u9yq(<3{bFW!m};8MYSC zPIBsO3ahQGWbay>CdFK+#A(4@Q*p=H{IO~K0*hT5R-N)gAS8xDUWm$O5sA1yTsaHtYT%Q=-?uj)6y9v7~u7v+DO2Ww*I3ovjJ=*3uMudHOKF0AiE3 ztQC06`N{>QR{DwAtD%S-(>BFR0(0q2ooz$x-9)(Q))wEW>w33BIL=Ri#E?8;!=+@7U`+Dv&S4&`tT-l5-9IsOEHXJGi1qqSgaF3w?_5X+j8=ZCQ%a?>db!JJGp~lmWeq?@o??m)F-LAL^w=GSs z{I1y;_B;LRsvDu#*zPhjyx9EN)n`w1+qSh|PcWwz+`gNWR_*tsY3;;pxw+G$-@SXX z&CPauc;dRd=Qf5ZFZb`yF;f=T?~5-HU|7)KrS$2U^GqYvb+FtF$cTV@Z z>F=lw7P0*GWRcCk*9mbtdGB&;3*uA0M$57=yjVO{JNa(())V@t8@_o-J}cwn|DLty z<{8`61=eA8=D&`3^u3!mQ(As@X>#(Bm7BuW_mx_4FkDCvR}u?bTyVTg>HC(bopn#v z-HG$vIc;Iynl($SrFWLSoKy2>A$##*N zuD-k~KWukIdt2U`h1Pd6pX^ln)cf=B&ZRe3EQ_9h(GuvF)qN6?*Lpf*zgFpQ3H|!v z*TX+0E9U)H%9HcHl==PI>Cmr!wwo?@avq<|!0_efy{ISL*-GW1iwi;vRxb}2^w!SGTy=iE zIrnb=*-#m#Yi`a~^z+Wm%CrSL1Yd|*%wl0!u;0z?QC8`-n8kuWtG4>ByL!rZuG_g- z`JGQz{w_YbnY;RWv-8BeJHKY%l{75;^h;1x-dz1Z6A#d?RekD_8KPH$R4#@0cALdfj;X(TOX+uP*oB`sny+!SyfYNXs*$s)tSp6tMs1pL8eg&$3f# Q`#`StboFyt=akR{0F7$bNB{r; literal 0 HcmV?d00001 diff --git a/src/test/java/org/teachingextensions/logo/MultiTurtlePanelTest.testTwoTurtlesDrawBeforeAdding.approved.png b/src/test/java/org/teachingextensions/logo/MultiTurtlePanelTest.testTwoTurtlesDrawBeforeAdding.approved.png new file mode 100644 index 0000000000000000000000000000000000000000..f82da953070add5b963780fcf04d07a13b18a19b GIT binary patch literal 4560 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 QtL>@}M#V<9?MwOkzi^Lm4FCWD literal 0 HcmV?d00001 diff --git a/src/test/java/org/teachingextensions/logo/PuzzleBoardTest.java b/src/test/java/org/teachingextensions/logo/PuzzleBoardTest.java index 9de8bef..be70e33 100644 --- a/src/test/java/org/teachingextensions/logo/PuzzleBoardTest.java +++ b/src/test/java/org/teachingextensions/logo/PuzzleBoardTest.java @@ -1,34 +1,71 @@ package org.teachingextensions.logo; -import org.junit.Ignore; +import java.util.Queue; +import java.util.Stack; + import org.junit.Test; import org.teachingextensions.approvals.lite.Approvals; -import org.teachingextensions.approvals.lite.reporters.FileLauncherReporter; +import org.teachingextensions.approvals.lite.reporters.ClipboardReporter; +import org.teachingextensions.approvals.lite.reporters.DiffReporter; import org.teachingextensions.approvals.lite.reporters.UseReporter; +import org.teachingextensions.logo.PuzzleState.Direction; -@UseReporter(FileLauncherReporter.class) -@Ignore -public class PuzzleBoardTest { +@UseReporter({DiffReporter.class, ClipboardReporter.class}) +public class PuzzleBoardTest +{ /** * A puzzle board shows the initial puzzle. */ @Test - public void show_initial_puzzle() throws Exception { - int[] cells = { 0, 1, 2, 3, 4, 5, 6, 7, 8 }; + public void show_initial_puzzle() throws Exception + { + int[] cells = {0, 1, 2, 3, 4, 5, 6, 7, 8}; PuzzleBoard board = new PuzzleBoard(new Puzzle(cells), null); PuzzleWindow window = new PuzzleWindow(); window.add(board); Approvals.verify(window); } - /** * A puzzle board shows the provided puzzle */ @Test - public void show_provided_puzzle() throws Exception { - int[] cells = { 0, 1, 2, 3, 4, 5, 6, 8, 7 }; + public void show_provided_puzzle() throws Exception + { + int[] cells = {0, 1, 2, 3, 4, 5, 6, 8, 7}; PuzzleBoard board = new PuzzleBoard(new Puzzle(cells), null); PuzzleWindow window = new PuzzleWindow(board); Approvals.verify(window); } + @Test + public void testCreateSolution() throws Exception + { + int[] cells = {0, 1, 2, 3, 4, 5, 6, 8, 7}; + Puzzle puzzle = new Puzzle(cells); + Stack history = new Stack<>(); + history.push(Direction.Right); + PuzzleState state = new PuzzleState(puzzle, history); + Queue moves = PuzzleBoard.createSolution(state, puzzle); + Approvals.verifyAll("Solution", moves); + } + @Test + public void testCreateTwoStepSolution() throws Exception + { + int[] cells = {0, 1, 2, 3, 8, 5, 6, 4, 7}; + Puzzle puzzle = new Puzzle(cells); + Stack history = new Stack<>(); + history.push(Direction.Down); + history.push(Direction.Right); + PuzzleState state = new PuzzleState(puzzle, history); + Queue moves = PuzzleBoard.createSolution(state, puzzle); + Approvals.verifyAll("Solution", moves); + } + @Test + public void testSwap() throws Exception + { + int[] cells = {0, 1, 2, 3, 4, 5, 6, 8, 7}; + Puzzle puzzle = new Puzzle(cells); + PuzzleBoard board = new PuzzleBoard(puzzle, null); + board.swap(8, 7); + Approvals.verify(board.toString()); + } } diff --git a/src/test/java/org/teachingextensions/logo/PuzzleBoardTest.show_initial_puzzle.approved.png b/src/test/java/org/teachingextensions/logo/PuzzleBoardTest.show_initial_puzzle.approved.png index bf8681fd2775babe65f8e923d61b02e919c2aad5..f2abf821fec01776af5a860b898dc68c39975fde 100644 GIT binary patch literal 105737 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 O0CPU==GbU|neZ=S0%?{2 literal 105949 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%0AI;B>z( zvUsz)7FcOy_@TZ5u98P0^mmgt@~+{EWu47$gj$PjlUnDM^YuyqF;N1H^A)W&1JWb+ zN8JRz0~o6Gzp)h_AolX}=y&5i`b;Ze8vvd`9AOs(6DxQi8OC5_y23tjun~fvOy=0DXJ3*hARgtroo@Q$_`{hH(pOf|I zCb{0ulx|N{&oXx3JGRUC-|S~q}1DQl9i3Lv_c!4Yy*a`Ekn@RC( zEiJ_tY$%^kXl91K*!0TrI{k9mU1qskH9+2AJh;r7FM#rN8>_juwR%+0)t0;};Dh3O zSFgPLnEyoba3=DMee^JCoS^#~{j){q-J^f0YP=BkesosZS1*)|AK&BI%NIqLa{62! zwl1KD^`+MHcWwn0U$fYM1&JE?;x)ob1O9O6?p+mw;Nw4d{aIb=ZVShr9M9u>`NieX z*!vkMT|EQXQ@UYLHq>T&_AMT~ElmwoeIH_(5gBex(%fBSW^Vnuo&rtQ7xT9OxcSQ8b1 zUBgLbi|>4Q{x!*)GRZBYH6K`|(`5B_>VvU;&f5bEG@pvD8Rl2}G-%z6IBctEx&L}C z^)r{+eB$*p>uIgxpx+l{Vl-C);)2_etYCj%XJU#!_V2I|Jr^40U0rD*dClO6UM3=~ z29yWbsO8=~tME%Pspd! zhJH%n${h;U+tZ>WmwcBCrUPJ@8)8as#)~9V+%i*d0<8uM(ph)6;0wogMe_D16khlH z+_2q4q^`Cbgva$?W9zpiY2j5^!XAHzIU*PeeCm8K7;m=$%UzW>V?47yQgE`tXr!lVAUW^Gpq2-Er zk+lC=e&M~-s|rm94eVXBcEOS9HO3qt9>KGUxRO7fS&|2PtocT-KJL*%cl@6S7F(am zK26QYc?dbZt<-Bt6fC`g^S`Fhsdt9s9M2S&wAVLU-B)xSc=G8Mza}a0@i>ITK3tSa zC5)utpi0ni=MF?XxZj=ZZiH@iR=J)%JwhJ`PI%0ZdkV29OQp$C2~JkT9R=OtNV=XK zmmUY*-x)#h@P=5#B>q0xVlEnj;3ynjCvSqy;jgErZ`u{dI0hUs78Mg&rwV& zP+Y5O)jOHPV(swRiCA&i)zPB$xf@!pI!vuB*_MpP_x_mF2v|Qmv%HK>M3hZ0(1lj} z)AbL_*VM-)F%zX%qt=HA{++IQPrhe#H-GABcP~`OgAH@Ml7#*D-rhj>3TH$bQAxB~ z0>Aj)X`d!zuukpaDhFc=-(}>9JY(U{dIWB4*bpt(;T|sjNQYft21!PzO)SPf7Ibz5 zr&az&i_7Da6?xu$?Rm0A&+j)+3hgkBpA<3lCVkj0b^PzaV#!KY?Eie|S6kkkUI(%j z6_aFCpW_Njsxy&O96{-OZ=aH?5BJUVwSvj!YdUIbq|nh|O@+IXR ztTjXf{&Ttx_x-n?7r#v}hbk<=tmFA5^T!>iBsxtYV@F+x58JuTyBG7U0Uic^nO~k~ z$-%5&?ghM0dg8?{Alhoi57iky*dmIkUovH{*)7N+{ozl}k)Lj^S!V&M5RfZ{UF7qNCu=yVGOS>&by}LG&-aTVi)x z3%Jl=+LO|2WfGJn9;Q-&nEs@;B!iEsNWsgSu-wrB=K&a|m`elYmFpWR2lJGmJcs0f z{8A3ItGac8+c(gs$1c<_A`dKRokL**YksH_N}c!(1UmtZ7p)3FrU}LN-n-kpte%p~ zCJqLPO?4C>%_+PEY5X$`$tn{R(NTgLZo>0-7sAdM<3h7(xOl%%mf1br(dv(F^qWp_ z%{8F>cpSFnTDU5ps;hIUscF3Ug-Ks#n=e*@`NM==u7aMAo7nemjPGvb-qKEwSJ~hD z2;t_IPaHNz4xgXLrx*;Fi;mXsR~k+5J#PnJd2a%asj|oua)-;hkPb&Jv6)$_s=6XCUk=;^%qCd-E_`e_49H3Rfcxn3|o& zh&P7heiF~;{gS6;loS3PmwBl|7=P$Qe$D z*G)of_(?H#o;TXV!{w{HqtI#Sg{HCz8Rn`E5QC@gXGGzI8Z)hPlX3~r@Ld1fO(NeQndDM z^1xE(c<1N1*h3uhi6tG&I`?(E+V*DRN*#7`JA)2{mzDa+m9M!CGVi(nV!8WL^38u~ zB!|E44}hfulYn44=0K2w_!=d`{;{OtM`aoNz{v|2*n|+O)m5d#Ck+iTb+=dwZu(eY zK7zIRvqpmEicGRzaCgfNSt;upAM(@X9P-_^{0`W%hV-k50YBoZ@4hiVdo3~(9dqe< zgjQ{>7g2}P7T(PYfq#Lr$bAya<0VI}?}{)(w4g%E)vxob z4m&46Ns0a!Pr5C#N5;J*Q_ z9704-H#F#U7}T0pR@Ojc9zRR0iO}t?S9dzw=E+Y8WML8+)`quE`qC72(iDE|-gq%L zP7HrYdC`{JJB9{_QS{pVQjJTC%cT47N(!dcKMDzTKnGj7)LQL1I1ks94AZuLd6Y8j zg@<`BbXvhzWpa~7X;yvX5NLwW7uW3apk4k>SK@f0A1>WoGr{B0rRgcw(6vG0%PW%l zOG+tN%+$ncZbLyvdwipcj=af!MdGa90=&F_G8r>S=V=I2nErh*P?g1=id9Mr&g>A_ zUG6-ZIQ^}$o!PGGay2>o3vmMcB*5o?372EG*<{WHyg`=xY@T$NBu{LFS-%5<8#~xx zH#vM<%!*bdpkG7S!=u5^s3uAbvj~1~oN~VA5$%3&3U;W{32-MyR!#NjuB;C-mqy;a zVy1-jDamFC5b%IrE98Gb50TL!5kNI?Ge0tnZF!ES6^&q{eI3bmUAhD5IC_Co6V<#` z6e6;{##7_)yT-sEb+c|d$+~aqJq{j@+~-6;G1$K1m+nMPYYonrEWt=MPJ5%P5PFGb zBB=J!EALO)7|rETd+yfodW&7b3?BBuA+osEwdo=fi^J9d(!3C2zR15MKfECwe%oFQoTm3s~_MMAx9Q7#mKLU7wO<8b9p)szc+eJ{D9;LS|6#$ zAI*pB?nm3a0S54`6vtMmboUKqDJaB%r&$va-g$Q?yfU@w-5vUH`8YY#HZJPqo@ly` zXlZQxbva9-+)+U#@`Y9=Z$eQ8L(JiPdX&3k@ID}lxIDq%TyTe`Y0fTi zH1mMot)JxWnh)F`kBiW2-;Y*$YK|Ff1>}A4_c%=~aV5j!bp`IvMEq`MxHF`S3Z?PB z=<`w7lT~$vPR9%GhpYqojQnCfK7SBATCo3+u_M?mh!7oav7jGg6%`ks3A~P+b9^JT zyJs6%O(rrXkKuYtSn*(!TU~PQrxe4-2J6khjRby7|M~Fb!dB|3u<)!*;j5P$N@{6h zho*w5_{nxnNvs&rRn;1EpL7+z-hs3`4Vk=j`Wy0st9`}g=WC;gd_KZAqZwFis+Qo5 zpOQEnK167YLZ&pzAve2Lq1yEn7R$V$FE)*xFPXGH*rGu4`ADnzF)tJhohzv-IqYT1;4#Ny&iOz(RU$nN z^TME{WzKGbWMdE1v+vFXt~jw+iuidvB23hyj&@%8#(ap2U$0hAojP3&2KNs}*+GuL zBa9IrfBA^jJO$I$c{uL&1wllp(JPP4iWs?&-r<_Eb8sM*by5=U69u+><%;Il-<>%p z)e#0U=+!WlM6G0hg+aMnJxUPrR;&sPk5__-i$h(xuIZLpSqeZt?%jdC5;`ItWM*Sg zUuQC%YwgbMF+w$KeU{PX7Qa0X$f0UnU7|?I57QY zZ8&8@ch8wE)J0sdKKO>;-xpPH@V9Kbi$_mtP>1VTFN+oL&rpYSl3+i^>A|&8eD5Dl zmzW1H;(#Hsuu>x{n)jrn_E7lJqC(!=KvjvA6H_HLK7bAJx^)NDbev{L=wiB3?^F0P zW9lPwyhBVVFAMa}o|~vD{5XGg5@56R#;9oO4HJI{2G%~Q*kXBTk^b*`E6G)_l38aG?wrXXt^89J=@iU}@VSkky#-4;rCm@8`A44SnYF#Lh zd~X}NA=@KNhDolNqrj4vXyj-uugU1LuI=|~r3w-#km}_s^!!1vjG-v|{lNP24?ndg zKMay#ND(Px()x5UqZM*|A6bX7niG!sSPo{z#+#|(&=HC+Fp^<|T0Hk36nvc)?`9kp z75Xab)@P27W}K`<^q7Zf@6P3UlMNRhUf|gM^V)cO-6t3R;8=Len*f=^72Kx8BbwCx z>f>>aei~SNOo=xKq8Jo>(2CItiVI9}{qsjuSvej#7e0eHGchobQbvnpfoNBJ`DW6! z4R~4f1?Amnv3klL3SF;yDQ^Uy-|CMGAy{79l>*bvppaD|R~T4~ZlNJm>1Y`{zpwPu zVoGL$uswHG9&Ra)P&{`(ONf3nt`%TN)cT!KEsi|-tY6W-pE@>=Hkz;Vay2nWINcmq zI$1*?h&wJC8NjdJIVoQ1LtU3!Ww}~#|C!VlUagJ?Cn8HVIDmSGO(fMcW&njA%d)s& zL%&)W6`*>1^AFeBwvxVx=M~$`z+Fu^n=^~eaHH<%Q%Y6c4Sw=Y(?=-%OqWQ%%3i%<*Ub=c zz=PzoVOl8XAWhbn2I9D3e6tL~vHo>5UHk(is)flYk%r@36V+0ZjWnLg^@r!_P~-h` z+)|YyP|Ef!x;Jw85@ljq=GRp09a0a7rS#-nHgpG;mmJt1n%L6Q-YQqHb5PKDV}*uF zi5baI{~p?!@fbusecF}9d%H-$6vMnX*ra&+r!U#HjR}=(4sR-VYSXDpFufX|G~_^1 zdROj=^82lwz_z^>Vqd;P(MDDF-Y0hy61_wT^?Zk5(~7xIV~c;BoXokmD|Io#*{7_o z&&{2v+>r6B6~ga?1a@zK*PlNA(RFoNDV-4cE?r+EME)*j)09`<9{1e&0@;Ir{QMLR z!SNaG{KXMG*@Np#M{=i&i}xT@o)1kf6n<}9a=w-kW@cmtB_^uzbsLCxFv@DpI7>-M z6)jc^Y1Kos1$}u*R@*ZjX6JiGRZDkQ%NTxY8-Pvrke2Cr*rf{?}O^H_n~3$4EX3(hz`WX$*L47!_qAe4o=E#=;vYKFJj30I%Sav;Zki(d^c-JM+jGy@|74hF!C{=+YBq`?C)(}HJ*0Czv zO_*v;=FD3)qeVT3UGUXb>O`{+`WU6|Ri$Aa#OuR9a$VbuSWmUu^fM5z#$9#;q6PkNeu5T)3j#jSa#l;z69sQ?6e9;aiT?gDuxXrO zZV!H|NCY2cFOjtNCZ8+tpx9{pb7ZLdbKZjfez+!xZqXdg+|<0}WzJ;1cLDKFE<-ee&%*%AE%H6NdGCm9L;q3sqPAQQU3E@ zU3yPU9c!6M=;KbjUw@E2Zi?NSa%p@{K$5+#vwYg-j{n?|9;#;CVL?s#Ido_n?_p=ziKkpGXaw+xD_>()ha*WeDpJ-9o; zCAho0H0}<;B?Q;t?(Pn0+}&M68kd~T_rBl0x6ZEfV^wu`(N$fnHOG8xj9FYnnHrQD zNA0T*4O9S*k88p)TneNl)d-_pY^EirF-6|~xZo35hd@8CI8{-k7p!6av3~gE+`fY# zRK*(l^9jD(aa)tO+lgrLdJ`#Cfal9FOL(S#-rTB?-tJs~4(Mst!1?ZxWkdDw(ayWk zS;Q~E4}FtasNlFJfRHe#r{~JfsZq{t!H59h)X4P}!yRnNz!~%_RAPBqdqM`rDecTPO6^cc%9d0zIC2_G@ z(lABkpt=Ao8M?Y|mp~Kx^KWOFBf22q_H*OQ0@txfv&HzqELkW%;NxtdH+Yl!%eUH( zK3;*TSW}T?F%M!#AoWogqsRGDO_9l9gt({--4VC@^@}iwg#9~Qec5iu1A!#kR8JiX zb4);wH)#*ub1bPQX$0%J{K?M-eJ^d7klZ|$u-a*C`p^XB#9j@*Z#{I=q4J}TRL_EC zB6T@6cqHL3T+|?DWS*omt$3_1cjtso+S#>7%;bM6%Z2{t z_~t0`t9XbEO&YXF1>>hr_|KAe`SpX5gVy)@DA)7w&tc(eQJxT9V}fIAb7&wGkZkC5 znpqQwQ`WW&b;J^mcQuG3kuWKvoeQ5ZBPq3+*~`m288$|-#wp?bTZ=P6_V{>#6Kig; zw0p5zC5Ts0Ku=a#TM+O%aS|FW=oOG0epl}5rEVbO2}X4>nNS@@$q%Y%n~cIxtuYUc z#sUZrj0ug$BFY6FL5_{f$({XsR{^V#ZEAH{usdj8U({soM$reNGnlI028?ff$&$N) z$Ol^#6O4d(mMe2d6Iem}@Jg4cHYsHCuxeRsTG3ZRz~m*zLr1mjzibMOBmSXRW>Rieq__2*M5 zLat|t8$^VnpqZ`oP2*vy%fi%s67 zL-O*-_;@G!c*wu`JdmNin+T08yO;5bh6@H|ghx+#MIWebL$W3jYJk_xxpZTyAbFqJFE1RjBImpT4 zBUdv7hn)a>Lmh;goqR*xZ^#T_njp!BiFrbKfSKj`7g2Flq%9ZlFmAXgjh=KwJqUd&j9m7SJj-Q4iSID@w3EHuM z)}QFJgPD}h37=nwf9M4}DFe*+`J--cOUB0Djjs>BYV>Ev2nM|gk@T;LNj*!AhsU@A`e(YNnu@a1H<9O*H5_*8^tX^@A@0yHgOx&xltmLQKd7~Y*l?>!*BV`d}v z0mmJdi{6HCC8#AA_Vf%tB&ml~CzCKZCzVe}J2PluEXa+^9X!xeiDfH*yt&DY!W{jF zl%GO)r%32Et5E^ovGTx=Ow;1)sd`>vHCRvi-zQ44EP^5iimX#~?A1!Ss{IDa`W%%3CF*U%M3ADqHquz`M0Mw|J$g_7N@ zAy#T3Uw2&s)dOcMcV&AWBJqN|vsF#)W#bO>0;cD(>$n()_OOj2#AxzXQ(;f@r4kpQ z@=pm)bUbzmv5XYOZn`&&iGFo3thr6X%H1p9tP4i2Zj$Spx%`Gy#G%Zi2 zkUN7P_*APm*K;QQ=}oce>D2ytj$%+#0aVY+E6SVSZ-%ZmkBqCu#kr?fzm@c4xmhz> zvD%$0sxtH0+B~hpMqSut0HNc)^fic52V3LpXgXn_-Po3D>L5iR7PVlonVvVk`$$^FAsJ+ z)pOD@5rfp5Wva8dt!+;d7y4kBn5xEBR`A^jt52E$bu_f_(qE1%&F+fH&BV;l_t4fd zKiswe!rIvOPi-zxL*vW4DqK!28S0(9s_yAfxi&kU4KK^NlQ00 zwZfKvt#?%_py_pIND7LNk7sWooS&N`cUR=BEEf z)A55LZT#Y+pM<`>q&3IWTzpg55|*0^=4db6Dt9FcbgNCt+{}6~YFk8d_fj3kW>nNz zlxBTBZX=e)#->UUBdR+|reJZE+oQ$&_y}pq(b1e907s;UD>ZUtTv)E$qr{zvArQ(^ zzjKglWS4JsT!~F6cT&mmbn|$?c7H7U2%dK*B%+6G)X+P<84U%7E0WXN_^#WAyt1Ci zX#IE>-fdcHNW(84^L0J`eXHZ)A3Gi()ffdDOs@gl@hlhqdY?FXq=#HG`9GYM)F6E@ zP@L1$f~Lf6gnRDjgI*pQLU`2RC3VTJ>4|3_1Kl;H(mI@2SNw-HfpI8!Y5zl^HUi~= zr)PH1z3gMFWo{7CshSv6Hs~rom-%T;LLe@U$S)FH2<+d3+)L4n=PF=%-EFF|hxQVF zFWN#k#4}^_cSB!QT=vP&!Gd&~Alhqif%x3m-+|e11H`<$Ov~l-G@|p>(uU3DwHRgt z%b46a0UBW4Z?DJ(h*&`LU;b7b)xP|h#=9C6ioFi~( zAU8Mn;0O-|Q$obN9~%~}rUn}W6IKWgg~sU*xwA*|?280k-|pu62?s96M&?2>r`3e^ z2^OhXJhzgut+_n+chZ9+LO4yP9dlvG9kSV!kj@7vPp80!1^^7L77r3CI<#kk^DXEa z?H$vf%_$x{)%l~Igc(9hi%kF*Bhg=VrY)Rl@9h3M#Fr_=@sK2B8r|_nDGu$SkN272eHfwV+&J+K;nz>2qE6=R)ZERrpfp`y=gT=b zb3Z5kk-|v<3|j{@WSaQ!$0xQ={?A@f89eePQz#g?oOH*--TIIDC=E1v=|kOA`t4Yz zb*CYShvS&6KUDBpiI4B3V?O?4e!PHb-6ZUC;KaG95`l9ZS9CiljCx|8<->=0Iw3X! z&HAx(f<0x!fM5)EXP9w+e~M3n*?tl@k4vON&uC#i(23nUbVAfKZhtA^Nx4F_D?RR95|BhTwZ++AVrFI?8jaV2wXLcF%UQ@t#6X}0`3jdfA3QhW=G(M@+3ujfftHey z22Ou%xTz}u=vj0(4 z71P+n79l7WBs;wVQAKh&zNP~wb);!-YJbms!41WIPLd%<%aoo<1J*bq#NCR$D0An@)P$7 z?KGl7Ru*th^Gzwv!O~v+dE>di&`e!4EgsLo&Zf@d_GS4*PSqXf)9fNmGYi8^aSQ`N zV=rxbx`_+SD4rDlZM*AhSe%qq^=(|xpA#5_|E(5_fUQll0aAB3zaJ)2^4-YV?zXU3 zwhksy)iA;?Ga=(wa7eCLC(IhbJtevrmUNJKsY~Ql`iFvCx}hR5A}o?dI8g5DeR|C# zytfGEQ0|NU1rqX~tjP8w>i;;l7tg90n{3!e`OCIlG7M!qn-0CE>(n{Nhty4Iw71_Z zfZd5~3_I~Iu0_tHu=TcoQT3=P3pIVa&YvvP_`Ea*uax{3hcRj{A^<^o?}VJ80zEx_ z9j9;xJ6L%YP)(a(3E0KP#D?kbj!ZJrhDl!+U^uP|2c0NFVs7?N{!BRdTXwLONN>M5 zKOmT>;G*OTqace;4NfQMcMECpALfC zlnQYRpwO6z91q%cM8xHJxxEGwcC|v`p2m2e*_F&K6mOulfCgB70gMJnl6rU;51S6J zO^_<+yk@Sh2gjvg@pbTqrf~SalU(%AEyY(|=JY8YNgaK^GPXLGWnmX_2HaC;R1>YF zuQjxBz+yQ-6A}<0RN_q)bPVS8$2I8t=o=xvdQ^O}x)OZpv|!0VUy6Xcuh51!%px`r3K~sIt;W*U7D$xb##mV3l9g7*1Kr)#i>J=ds8a{h+BtvXqM8Jg!-8^& zlJDH)Tx?n+*|{}gz}UNBX@YIZ^!YhUw$f6>$&rnpqp>T;&OW-f`Q>w%VaBefYaifr z%lfH!{L}Z%pk}v9J`Ko0Kg((qbQa)xc{sp|r@Kt$;0P|RhhP8-d<^<4f|O!D|U9WPBb5`_~9dm${RGm!>x*eMz^S)4IUmC`Af-O%*s!_gFvC%P}+0snXo zV67nY@yD;|AiFA+p<*fq&ggb~T-?(Pn>yayIHMjEkE*ERl>!w`aw?dRk8nv^&M?{n z?J2-Pbf`g}MBpa8Ju$exX6cNN^>1Qjcl)`(#_t2V!ak#UD6zYGxKMhwmxfp+y7r`^ zBlEVmqVsnCOx1c76nq<77r+LtDsI399eG?9GhjUX^lI}>hj_wISo7?OfbbjhnVlYU9Y|lV+ z6LjFa&?A+8!AcwW1@fv`Z%3QDSeLUqmX;_grOl9=?3)U6_GhP zn`O1M@D>&qb<*jzbu;GDA%*&tE#+0e!o}9U8i+LX$LnT7;L7aG3jE z7E+>#H#e&R{l5#)f9xuCWoWlW4bkS!PU8vFuYj{M@+!leQwJF2S4ETDgaIaW0KVx8 ztWO>9epg2mjMhEZx5t;*PFqF{r8IVo-m!AYu*9H^wG257%w2IE*rjIVjn?miBB$#rz11uQE@piW5iwTV z{bJ;N>p>w;tGDyJTVEesHsm7>AINlzj1HN1W9({j4Tv{n`sg3h zr#hV&azRW1xHW%fKSp?MY{|||BZe2=u5SMqJ#RF>cDr4jkhYBr2k<>W=#Ps?PAjEC zZ!@JiX$<(QX^C$yGu-40^jZ;RZ?$L0Em;iKH^J~HH-KkrF&7Nllz(aC53S%S8XQ+F zSMQ<6;$}9IgZ4#*0=Eh#>k5Pvgp*`s>I8* zbr8DiwR?P2xqo3UBz9$bNLB&(jjgn%SlXbYA~d(>TWoBssG=e&V7o0})F_(d1rnyS z5#PLiR7ZPlj|?fhJRGc)N_^s;p_b=>-eD^(-o#mGR+lN9N6p;KJUBFi>o_AnUBgu0 za)A6!g00^{2jaAbcM1MpC%8cP9Zsh|nvUmjOckrpjX$_`LV#S$rr@A@mGod!H#AF5 z{^oKCH)KH|sE#!Ukme~C#jAXGPi~*JSGI@~@emtSHDpm|4K^EcUvF;PSSdQf_*`Z= zaE^fB0;Dgn8=Z4I6s2{+xa?+!WzzKzlK-=9cI8k^Q%YA{T=cHwW1Fce<#Ps>Qsun` zn06ZG=fANhCqu*#s?M3X+rm{VD1?I+V4HkwK2nX0Fycv3DH14@cdxLPQ>g6V?T7~p zi9`s$zm-{u^72YQr`ROod3nJklErXLMZ6^+7mT!bz9gl@z^@2&CRLWAKf*;M@@z*B zjiZYD4UDJwqfRaIM7{dl2j>gF;Q%i2X*p;c=39bv{6Cgip6foo+f(~%7!`ra_{kjW zFzl|Hodm(b3rAeyf=bxP-HETzZg<6<;iD(ApDAuAyL!qQf~_oIL0y9ASM@GD30EQK zk)AW-%3#wB2ia!y75~xxmpFeeAv(1kdztB=+?Y{@IF|r--{u^adJ_fm$OFR1&6+i1 zayBZVaz64KdkbT02lJ)G-ok;zCMkw;9g~f5AJvN?2nCbyJ zG%**Nu1z`+y#0O-5Zer%ws1p6P`yD{&pk1|-ce}bjt9>%ra{Fu&K_Ecigj-i)k~S> zfcEE*PCm&BO==12_<3pEFa2h{G?P0sKb^wFT-_h>1{5jDt^Z|df%WNFr1NSjkj*U)IBTuY`%}z)9iigN5*pgrR|xb% z)f5yH__*Pj1J3jJpJs}PV9HxVMp|{=+&h9WY)Eavw5*vc%+@o^`L1PW{f-0{H$Wc) zS&&7t5gbKzfV`5*{N#B=oA{v>19$RkFn&PAV0OlYMs>_FP&1tmI*eKN2<+5{J^JF9 z+}T|$jAL+Ed;n$$Vp>k-J~QIRY{Z_X1ej^6u^vB7rVEl5(lP)YO_#!4W;m}(6xGxD zO;G+CVQ*=p`un`TdVhM&SSYD=2wZh+$|u&VU-ud3*~taC4BBC3_oDG93<=TcU4Avu zIPg_PlS*Ypz|NGWMD(SbT%>s?pyz9yke}hr;%!h$jBiXMZ)|prOJBijUcLG$Desg@ zj%{>fYfB;kP9Ikb9Z7q%+b7yz;26C>in;e!A*^YgFA>0Hqsmb5u;|3$YlH2dX zflFjiVF5~yke*b69ny{l+bCF`3`_4+^UD^V7C_Jfpf@CtM7&Vbp4eDm`WYC=8EN4T zY8{4yy2OL?R(&3Z4BMtcY64yed6T=sTI!5)H~8;=UR&R?k4?*!3@q9>3;M$zn$wC6 z29to=T3~YXYKlN@u*MbD(r24ZeJcYI3!vD(f$@w3;dkTnldx(zUV#k8qgod~mYnJz z9J~#60LyE@5*oW}Dtu6Lx4>%WbC9%g*awlks-Z ztZb3$$wp?Plu7 zif-ih%uDQrb&04FBwkNzSZ)J7i98HXnXg&szmWHg;S%Vjw8<%$f}$)SM<#Q)VZ&Bl z8rf+5$duZimpQjGbLA-X>#=Hvx>=4g4GaFYLRhf?f;%u7<@6JL9k%H?Sy^-G3uxO4=uVwbA~$jbt^4^n3BX z>MEks716ui8i@YG67k-KDn+sFr56A)T#|@&rW2N{b*N#xIqUO{j70WliM2*I((EyX zqP=EyvBE}pPbiU$U{aAF|H{Vk{snvxH9rEUWM(7$YP(lRa0V)DgjA4- z@6@9yR(xd64R?aD);;ZLf+ZGiHgDZ@tLGh5fX2eAfM|b8T;SJhGb?*LbioO4d{>&1 z?^Ilzuo9G5$tOfX9r0+V8QPEuyd(~Y+Jq-6WVnCyH%^ki@!DVyp^=Hs!#@PcIHBYE zFB#iAj0R|G?fA}~p4dW(pbiYJK*WOF$0W6&EMF^fDj2{O;BQg;|EWzzOh;j(O>50? zcT3D-o&H317Ai0fdZOu4v@&OhsPHsW{YNG>iF2DsxQ_(=@VJ@e_B0pMJct4GqFS(F z=_#Ie$l^dm0GOv$1`s;*OLvltY3PdQ>q_68u0b-bH9^1&;b`;w^B1ugpbRiiug=bc zffpb7&@$L>LjqVaa;`=nXy~PI=19;2W3aff9Q}mt=O;tMA?yi5#D~CT_irS&7aTqF zLEF&#;8^SWx>Rv{Z%6aOK}nFTra5zqBTp{ijae5osu#gtfT{QVcOve-iZgPevGhlFc!lBea%RYy@d5=ijL0-lB9X9WRO0$QV<@ zwCUm>ebv;b1Nx>7-RoK+dzhY=hNePUV{{fadW)T3*x#HxPy&PlGv5PLb|WKfeP+Kv zzQTmAQ;+TpBneG!TRL$5O)laR7c(*)wCROQ>zv^9X*Cyv+#Lu6Yw0yMZ2iA(+lE(s z^ij=4Ho_(@Iv@2MJT)M)HhP7UA$Y-b$Pz)0UM^w0l-HM$o=cNhJxX=E@AGI=^NY=0 z#(@^zD(v!PpG&!(%y`;2tlt1IgS%GDI)xnxeAU z^h{V)(euntc`5l3l+cB7viT77$bmUFvbm;$?%?eJoOhO^`(DTNs^W6F2vvi+I%784 zMYT^e)M`SA>DHAgVrfeM6s*N(lEgZMJrrgk+dB`gd4` z%=b7)N|^|3SR;Q;f3VoI}$v5R<`iJ)NT7i7UeqWL^`kOWP^6k;THj#z*>NXMHma5E2aVKD_h zZ=f_gYq)j~K`-M5@m?4*Y3CA8!O_vxwV^Q*LCbR@Dn6X`C*#+v4UIPEh+$PoK_|Mx zz>Vt2Ktn-!H=W%y@IZx5jzh3Lk$Cm}urE~$n6Ymb=HdtDi#Oopp#TiJ901d0!?U#V zTTgZ6m**>WYN1+&P$#>esUrK`1EFpLPGtK0U7_Z#Ss&4h;5JQdRr{a|3pV7 z%XU_UN494rs{^>IT!|d-UMapa)$#TG$xaLWbn|!=gBJ8TE2fjj%jb!4`>2%vMidJ_ zGc!1zMPybCYGkB@=?c^@s+R=^^CCLYr1DMZj#9={ERFYya>o}&DX7B`(r2pVjqP|UA9$C@BiV>(NosEbsDc0lccxWLiTqMVpJ@_ z`cyPW$a+*HE^R__qj`iDeX>ixUm@lE;X;jmN&Y&@-9CNS)g(hO(y3_xcdDQF*nNZVpKApIV&^2d~*fzY7!m{I7!%KAS-c*c;pw! zFRacT3TSXumwNXlFt8)D$MVyT4(`0wC8pIL0OQ z(2MvZ4y^ZKSf*TY7i;>I&FZXXfxp^a2dbSjayYmhj}AzCCIIeFUrAnGN^ABOP`-rXJ(hE<#Ao~MFO3o^B&pkjR+ON#5{cAE2Yip z$!;R=*S8O(Yj}lF0h?1J-`_USrr2keRVWz&^!Nm4N#(gy@*mjeRN&tnb7bar4Xi!# z+S3wFo9!TvNc2KNZGG$P*P&jU_$AUU@lL8&AtO#&!hUHwnAF!|m>2AX@L}3)Wj&;!WCT94enLJbGDj> zd{BA#qD_d0ii`&gUs-K5KJC)hX7@w`rt`xY;yBgvvlZGbeAW6-R39AO#d>_e=wZ#{ zY2{~zZNSo^Q}!G)Y)M?AVF@-se#B{aN#rbNttP>RSrs^V-26OnEq}yS~d1!y8_TT?3o(CmN6YX55P4D<$9mm{(_7-Fx>kHxy>+<4! zwOz6u@h&1`q+8WaOB8kh`@-^HR@&`JNyfDy{bs?6h1X6D#Zk2BePAdFJ>KFA-zhX znV5vtIUrgM^76Nb+p3pEbspUL5XD#WR{$V}gr6NZmN!knwRw z(xl@DTrAre!o0zqaa#tGq>L`(9j6BTE){|iu6?#u8u!kfYLO2-Mj`WR@3%Yj1+Rm*K!Ay0H8kWI1dIM>OZ#wae9(Vf zKoA?s0K7d4BKi4+j!mr*bXgdF9xx7=& zE+Ql48By^2lD@Cbh>B!aMUW{k&$Qm*ICq}V830$|dE}Hh|H`NXyuuMLg)JzUquph- zg}phI(310u0J%S1uDFk*;ps1@Ofln)TsMp3;GCKdjPUg8XD)#y@v92SwJtis7UuYZ zfx8T6+iBd1Nx6_s`J=hu$M8NLya07Aq*kPa86GC#_B^kZ?|6O6c&pR*C&=Me3D&$d`;TPH505}=+ z8ivXF7TVuuHnp`%!bEHUJ{kt@@t5AcCJp!_Ia`P$AAa+)MN}%L2&zk6(MGK!Lt$`O z&As&d&O$NQn7eLJj5gxp!>{7x*UL9aUDl3G?@1(z8VYk4`sdt4*&W$r?B9R zW&P1drInx6zj7UG7rfXc_s8Vrot7pp6vn0|@~ePuJHEq+>#=lH^bSDN{ge+B903H? zvawn++Hx84M`BBR?M*&Ue%g)JEX4{>Fq-isGV3D`5&rv>Co@CNxb6jYzWNaUL?n;` z+Ybf(yM`F}i+O_GKEbVO5UZ;zp>|Pt?cS0htyTzkH>g2o=USLT-OwTiWd+hWPoTl@ zl)mE}!~pv;i(t18VP&>wpM}udY`vz0k7fO-H!2xar$RfQqQSPsf52F8;SG=0epstf zcKL_~Z+zgZ6P^+zddD@9ZP0WvR)8UC$N)|c(J1yB}|1?Vn1g> z_%jG3tb|Z+Kg~r>k_9UGrVWWIjUY`Jq(F6I;mw@2t5Ntrga5Ouvn?0*oK!-xWu{PVh6T;pz*AOp8Aq$}q&qCbjc8X6d>K^2D4sPOH)^JYvGxeR zD)B)YIolcU5yoS&LEm&22o6lcCC^?x+bn<$lkW&(MHZfl^hbBhPoeg*ZVFe~^e3lq zBm~A}LC;%FL4Z?wIE^Ku8&#*|8w?H|cTqPkCY2vdxsN4J3e|_Vhkw8u7{LAQbNbKqmv{cng8iEZ1HT4ShJP;bH~wbD zl4QUYv&Irft1-G#=g)MNCC>kqfBzeX|NCcucY-aZqfCKA3J%Kf&jt+Umh~cyYV^Jq zg!W^={6+fl#AZ`IrGOxu82YSX$X1^xDBVs|ilPyvA49T~#)m8KOb0##J@o}{UZ!-1 zlNX5X3X9h8blF=eh49kBPF_^)aCb0)+jO@e5Zow)r)$##gi{7B$wnJyK#z-#_qV0_ zOsMRYo6S|i9n6Qp3_@_%YFuc|uTd}Hn{x|Vk6D6H1!JV1g|}Pt4xK(L|JMH`108Kh z{rmUg_g$!n*Tb>MYmC0Mc^DFS5O202_+?`hzQTN^WkP8`AH7$*8(B(N0tC%i^C$pfXTJlT=izozU<-b${1SfiqoW?UL{T|-kN6qW>H#@{}uVBu9=qM-0xnp01EWN^qxwqg!$C>s)Q}hX5>q-3P;HBN@iD zsnD=hGkTLf-#SY_ku|;=_zMyo8Cq?i#>jnSN4P|}y$bmS0n?9f0TiF2-=OZvo=Lr6 zrBv&TFto?2#$_a+#_Q`rKR2^(<`3uHT2DUt1xAE#oXUYik%VDUSe$4)V*8`L0y+g< za`*egYM@7Tf(`m<3lk5ht5ohli+FItYSZ`BW0tKW!xzB|hbpS1aWdsAq&I zSQWPOdMGaBuc3pI_HbP|amQHjZP;TnLc`g0p0MJNn^5-V9lgO?E0)srhJts7Y#pGV zn7`FYV8dkgsZNkAR}+u1cH~!{L=<0u#g$VUPVPeL4Epj^|2ElH!G_R!f%F%MQyW{T zUe)8X4+u*wt_^jm!Nosf73>{Ew}-+|;;si_69X#=c;>bYzPC0;{J`z zs<2i$UQ_kc(uqRHrEYLQr>E>%Iad@UC3v0wvsV9WFaC`;Jy(uykZo!@_{4w|KeBKL zNtCy*S4FiiP>spR7R4^W$SLbU+Wh>^a15-raG?ig=;gG1TcW0~(kGObt)Hjh^1&`v zB1JlkJ5`io2(AM#A`xxJr1qF4Ay(R+;ISe~to`qh;qw4esuy&CuozAw{NVq_wJZbEPWJK*Z0;NY2P0!CzTRs%eImQSY1y z%l}lSpj6PXDEpoB3aJG|2J5xI` zOAF#Aeg1n{XmL^)llF{@WyG_&Llta?;MQ6XG7ZVGguo00L=c3mq?r18a+8@n2DB8o z2}uTIL=32nt~m<1a)*2%a>8)#{n{SOIc85KAQav(myF{zQ*Q*+k!7W>%I7MluZw?U zs>J#}SOE?xF#_VuSO8Oz-}t;C>@#OV@0C$PLu5_V@#bS#m`G8qa8U{;&2lK5>NrTy z(!gN`jj?g7e zBK{?5+OE?J>D{9sK6g27@W+|>a|kSsr^mzh|8@a6!}Kz8()&sSTYdY#;4xSj#_iIE}M6~ z4oSUA-{d*2ztT*ed4)>~OX~9K>-_2W>L2kf9PHvdiOo&@35ST`SnGbQEk9=>_%Sah@4wxnB25j)gt*d3aHS!=dusY=KYXS9liCv`)_5{?+oLn#fw+%Ew?q>@r{VyoQ92I{1NDnj;@th2kz>*3l*van<>~4aZIuIT&$7&y|#g95WTyfpP zLBHEmX1s*;)dm=}0({k?ddZZu-h3GEiH#O@szHhl^c(ygwX4fLzrY-3zg6J(99HnO zS!WIaffV~_W`EAlOFLWM=zt9R{hkCjbR%?5zhiPQs`AB6h(!AX{P{>iNornf7?+uF z$tJ*RaP}~!%yFNvt-+Ia(NP~Ya^>7DHk?OmFo3itI(2_N3E|Opsdg1G`fGiD;FS+} zETD!alFjl1+?z2FGtX3_WA6GOuQY?s_=h2l#84ZW17m=>MAaxE5MC(AB$f4YJ>Sjh%tn4&qqa3f$AXkcgb{z z??6YtN0Ut=!39cv$)eD}uDvYF;&-yp$V2Iqx%xL}=4%9@>dK%_YQFTo={I1=p3P^- zw}Ha5vLK`6cL!p4$cww=4K|ykWpb=_RI)}zh$Y(Qf&prnK0RGka9+unj zkjYLx&Co{NkC)WPkcb#x&%Q}B_!FsjlW;8f(}ShEIu4f1IgxjWC1rexC&ZsS1K;D^ zo^~90yZx~=s(wZcRAKWcbrDCet}mne!}W4z4-LS_ix|b3U1h1^^qDDXhXoH~STO`S z=7O`w+qq1X9lkj4F7>%r2c#jR7T!!{F~N>TCE%v$g2)8c(~9$uq=I5s782UjlhE!K zmSW{hh{ddi(}gJw=ldPFij8lOcn|gk1E@C6RQ~1cM=e82KftrFBs})hiMX;aF71P) z&7Bj#9_fzw$TRzf%|wZeu08}XTmrs#04YK?8^ z+9){q6!T4f*tygiZ?lpv;zgs_?QjUw>-Nt|=XG60jsN9K8E8u&Dxc1yF5mRJyOl~R zPIe(3KV`+&w2H2qvT$VUbJCUoo$)pElD3%-IN=g7(v}9W7*@QW^4JpwO`MPko#;Cl&U{|y)X&+#qDXJXp+SICcZCSjhbmWqZsnyMqF-5i#4o0%&w#&HL z2nN!f;7-VivsCpQ?1V~RkGWKmb(KV730H0B(-tp&PiH)*L%Hqmczd5+NQEY3m$xia zX+`K-HG6SgN(3R9PPbfBgPBgRcwRr}no=@LoG0u1Q1tvkpZByrARbCMt~hnm zMBDQBC*)i69++DT)fdVd+**j$?B#%_#@uzYG5RoNb(uf6pXFj3*dV2k?b;%h*frVV zbf@}kx~fmb`WoeC=C~L;eskkY*}DXJ!s7?!&0`Z!vuCDC#EQr1(n4d!s0J1aT4xdY zI3$`{xM{eI)op?0>VJ;dM(JW6rT^Gptp_fNTm--1)tAQn!u`RwOTkS;T#reCP12Ps z?Jn!`@q}ACoRXeDq$Ql@BL!8MskkPEusWs7{PD``lboD3Ki*elOO=~*k|e=yyy8i+ zh`Dgea@$>m1s0Nox%NSuKj*!M^}=q}aYs#`yMXb zn@qqV=3hN-t#oQHH^CdgKOwiWBO~aG#k#J_+2X<%`HwnN>H-G8A}9ZJyc{09xH^$q zt!ShzJgqSrl~$?H8PSS7OqQGaXtF?+H3S`ycKY&_yLtSQSH#V>*Y{D@*lL;$4m>;H)*o`uc4IVNgTgN z?+aqvn%j~9Q7pvUp&Zg4-AzOqzAb92@zrBWv4#Fwn){-UgmT)P@L9)`B`XQrqtC1J zr*~rA#>Z!$9o9U>|MZ8B)n=e~ZC=pTwe$FqFpZb@kY1p09q=YY5CLp$bkV^NOd{bY z2CgG@@U@VxW~LO!2Y&PS&VoO92e9E)1LQTn@_BcJIs%97H$=bgf`3!kiL)HaSE&$U zT&5xEDhd4)!szWf!e4nTKUQF`DQ*Y9VheVldi1Pk-Qp%l9VWB6xz5U{vl7JZB}C5j z%Lb37uST+qoWwz=tgC{f6!qSc@Zk9Nj4Y-j`ySP#$-NCIfh~=7;A6tU7E8F_ zoJKp>qwNa48yGtLX=N*g*&y4(4dB!I+~z9v0;=A)e(2&&>tPumMD~tRe=IM7`s30Q z5g_C#Copm#769jHPE0YGQhcgAL5Fi%@JK3~@Y((?HGMvgAI+qOWj5Y5$q==t!&E8Y z)nf^h-_x45#-jMkaDVqoi;K{(-#cH${qX$cMrd1ZwafDj9&cJhqkA50Vdt_LB3OCU{}W*&EFum7EBr5bXMrkqFc4zbb#F*M;f>La=>w3)%(KTGaX?` z^6@~{!xa{9{;-D9Yj6+Z-u1_4D(|5sHO%T{L3V|Qigij%8zkzTCQRBfZ&&s-#e*VYK6BNLfb0V_PFLR|8jQS~zAq;Yt6Xe%?WDyQr@`Qr(PnVhn6K|Mf~TEJmFt;C|z9E1Vpo-6-9Du!FaM51X3^X@M@@`-Rsrkxj1;4t7I$Pu+%85 zswsP6WGn4r{-ba>opwCF^;4iG34o%Na9P~=(z<)me@R8DjM#=uFW~%sqLh4mX(-&2 zSMlJupVFb~=*QbYDM2sf2Yv6?^Tq7Yk7~+0VPGrkD>_XqEi0`RrvsK~_Y3-5Jblt} z9ruGXxiT^|rfbB3qdq#RB_VTF+|2k?EPr$>Gzr&2kV-jQscJdf0~m?~k~*_WCyuqd zvQjEurK;5c$5TjKqNe59k3Q@l7rgF4vY0O>0ux^xGrl%po(vx2wva z^O*N6=S}(Z6L8(0Wq)BYtugixF$bPJtKz9M5zA2jj{N93g~89wg+Pm!P+&%eBDIv+ z4(e)1*E#?{vsxD92(5=Uh}1fuCVha066r7MZbBxx{4sJB?)!5oIRoEK!#gXshcm)M z+w80LHC_R&@Lr=DYJK5J6|&?mpR$YM6s^m5k9ytnQe@iGNI>f2y*-~lpd>c9{5-wKmcEwOOekvh=0epdX1GdtU zZ19`E`^4g(4IuzqRM}wQac+Arwlja>Ah)WYSCmIycF~5VVtkyqxP2J+0k6GwRdFI$ zl)(f2Fsnh-N`}*ylXNug&E=%M$frW{ewmIsOTvop3jc?%w+xD-UDt)9KyZS4U~qSr zpo0z$!GpWIC%6p+26uP2!3i$G26uupXdqaye6!Zx>;3ASs&#&JRrlZSzU`9x$r}s1 zlwXh-$)3+v5QB#t6^E2rpQ#pg34g)tg5i`BU=@yIJ(x|Myt@)$2CLL7a2+PCRzWX8 zKLcIpL@kTV|AIoJ*MRh0-=I1kL!ooc{2>1AUEjSAzJG2IZ?R2QS4ZdjC=R`Nm&osH zejKY-U)de?YES90nCMrh8kIr9#uM~9#m1941M$>1G(MI`Xcq?x#xXro{6F!=DB9XZ zV2Hy$qT0nf_9{X%&Z=$J16(iN5Ye;RKc&D+ftNKcw#+n@+U2?ZVO?H4_930bING_x z-yX|Qq#cAPc{mz^mHtV9l>B&eGf!lWCP9==r-NX`b1`PLl(Nk(L4$G zimX0IM`@I*Ejo%$Pmg}>v>$JNdEl6bOz9SI*}@atkx%g_9iCs<{L;gV2l%C!;-5@) z_7|Gw$GeTEmfuTb28yFfa4!VK0TRp`DaSH4NVP7T zQ1Z=tKb~aqrA^Y)Z)vL$jOJ;Wo|T{@2|9tiH4~poIfs$4+)Zn0zGzT`_;=kyK=+Ml zvxcRlZVKN=(;hCA-ZJWJ&Olwy-*`)$htxe52BQiBSihl;?N7g|uGj;RQhu#OVpa!F?Je#po>8h;R zLe#y5vtXkp#oDe0X#2ekQ6kF!X`KG`@UJ{Im-f&T-*%`>%0NYpmkH=&P{VwKIe(J9 zgS}Oz>M%YS>L{i33C|(!QwZzvfyR>GPJKbHc)-RoF06}W=GiMmwJQ*HzQzyj&u^gm zasiAXS3DM~Q#|`4Jm1#EX@#@mt@oBBg3@y%Umq9pnE-E$r1!EHd-b;WjxQokR~HTq@jO{I2^7v);=IX53h z6KGUW<7a0RS=L5HC3I%uqVg1rN#W(K8LnSyD3>FC4D*OZ7))sDD4d7t7|#$yoZ-KemyMq?{eqTR5Bu24fghvzC{4@rqns zmnFD}o;ob-#}QbYmH=Na+@myb=f9-jvv#QX&o_9UFsrGFpe!2s#ZX-qc_<_U9I}4u zm%{uTdK0a0es@kU5gJBKCkbFf?j>bPW1ps(V3$RH^!9*7- zj5J($FjyvopgU~~n?FP{g1^6n!n4WDz|NkcI6=@4#a295vQ)b>?sCwq%)J){Z<2UG z*G+wSjY@#Ci}W;o33V?f9M;xcyE8ZDqS@{KN`2!L=(l+i#VkndPR0KEKpLS3MAZ=N zQ1VsJnyA!Q$P#77rBXNgcsUU2R1w|0OU57OTG02qv8~lO3v~Gvt&LvUmu};)?f_NP zUBz*8s$J8u5e1g#U(L3=--?I24vZAW_VN+UlM`e-UYN-i{vW?Dl2k_sf?H^@j zJ<*%0#nC4?7EumeH%ZY@Mz&`7ewn0L`|5_wW9vy@XsRzV+U2^px>N3M$8!0;j}gE` z#CU;|ba(MEqW70rriUMYUH^~j>sci06G}NsHiMX!K!?%!6(o!a@aSrhSVr2R8X9u| z4=;b-{^cRtD$?A-O>Wu;bkM#Ip z)Q7^1)Uem76wJg`UuRix{A4FTK>a zKhG~##M;R#Zcd9bi+#!_l=FX3Q`ba(`bL3o>3Ub=N(a}d2O(wCm?=j=#bermwB>hg z?XfvJN!we9QPjBx1*%d4TfaOJGWJ81Gx|k2tifEDKSmf`-rj1`%f#S5vPb7#>;Q6%_LqHWYmR;kwZPx#2SZ$2O|Bd<0Rg+cX) z=lEudKy@s9s?O|;OpnKe#-LhBZgY;Pai6U~qTeV48bdFbmiB$U=%o)SJipCH)Yih{ z%MkTZQHp1ZwZrU}6+Qlsd0;9JLe9m0kkmh|$=^LrLbg{*(bzBo*4u%1F7*iR7F;l) zhO+`_EeKfzSnePtauQNfD7>RyO1i#q;atgsyx%s%A?%DU*jMhq5j3-r@!}sqzbFP= z-qrATsQu}L33NSTFg-Nr!iuN!;3w4euFqJuZWr6; zoT5J_`<+TbFbKCy8Jn=2v0-J!Z$wxpA!=Lb@a@+OZj$_{JI`J8`(bO(6 zK3weL3tI5J8-_&YLH>37Cd&WU7UC2E&3a*ZVSSLS!NooUVi}+mNSebUv}$l8xzXmf zA->LHOXO&K_09FwRoVIU)+Yo-pd6szx3CmShJgW_ZWZI@TafbeD@;|ImLABS+ZYY^ z+biPgoY!S=UbjK*oWq-Qlm zvO{3Ii|rJyh=Yn{7gPQ?!X{F|P*f}Z#Xmg&U8V9;&Wot#j1f8Ua-ifa4P49o`T@G2`e|K%dlc|E_K zqI5z-r=^#zzItZE6mz~U#jB32E^RWTLaXIyAb!le;~R&IVjo2&sCBRbdr&)vEmt>2 zOi6A7=x19bGXmV$So@(;iuR{mAUz<>)-|qx?i^)Zh`Bp8S@7z1Mg%E?=5~yclYR&E zr`5Ic`gXNCBMtJ>3;3pmrXS?vF}}{1<0UY`Liz_oErj|$DB?haFsJv9gka<7Gb$@O}1eo zR>l=o2T_uuU^9%@-?(p-D|Bxd&rVllt<*htu4<~2es36@_#KE=jEROG74%-}#+1T50$lBmf5DvePEiW3MUkGLIe_3! ze<7_nhIgCNmrB}u4q$BMktp5^G81ZPS!%ZJ+cY$NAuQ%0&teM+OaY-nVOo`=;6u)@ zO%9Sk^Qja0c}2udVk@U_B5uvUAXFrjScCOm?Ph2WMiXj) z%)12rKR}lQNk%O?+C1mGOwH+ftYC6-n|!175VL=WGGK2B+9!tdUOf&%u0SfNk<)>J z+Ia#uC#6h+-V~!>v_bZB+yNg@mb)j)MCt%zGF9?g%9()0W-4+w_g=yc44d5M*L<02 zvn0&i{*ERR3BLQ03ypbGGMbYue1$$>kvbSGb^9u-ei2G9`U8hbTmR!G!CwlSb{O*x zNUV*?=4RBw`WD8hQg?(P4xru1jk>dcw1!ADQOH zQzQl|Is9z$v1|PVXV+Xdd*B{Ka6e}lYDnp)@qd7pw9+;VICO}fe@7lK0Vk6|#1vp! zDA}BJL7Qn-_zjOxIn&IPhm(*%RRZz;z*k-4>yPwuchTPh6e*V5Aec*HeTl(W$jj2>c^A@|;u(PV^ET6y zo>8#f*Ft!7pqYW~YS_&m-pc=!;-r)PFth3mm;@FfSwnLXI?xZty(Vd68b5->Z|0c* zoIsM7u+i`iv)yOLF@9+2Y)8>AlXuVvCw8VA2}y3Tv4}inVQFhydN^xs;K0xt5(D59 zY@PO0R0;i*Hsh$MbHaI3v?AfO^#g-5G=}ivc$uj^Gw2a(lb!bDY>#|#CR>occ5c)e zl7uM3{%tY9+i#sDr3UGcQZa@dxukU0#Mrj+vd=;!kHj|t-JuA?CqDUnl12*0RwBS} zy6LvGe|0^Z)PD+DR>awvS{v+@;Y6Cu})#8_X;mo|sW*m=3s5Aoi^zh`6 zAY_(0qUx)G{y#$4E50qQ?68N0QzZC(AE1eo{&s9|NLtlhNuaNgPt97IgSwxmppW0y zX^?KDRCkXE@<|y_HZ1gmeLvFuXLF}2!V6kjbdRCusP3lQY)2GgxXP-rT|^?5pK4oV zn=Ov3`o-fGgDyvK^Z_PtY`12Kw*rIq=J(*x2X@r+y^yvEC2N;2tlFLqaVWr6H?@-#u}xQb{|6y@R#)% z*!tQ!rLK0aZ6E90S(9~n```r6?&ZdR|LL!9J1~a+@QEHu{$>+6p3kr)4^Xq%ld&M6 zU}*SN;IHUJ=FCwfig83WJePbq;h$hS{p|+6Of|8T0uuJiZ}lN%y1tT0cLOlF-^$i^ zU}*{P%0y|njd?nOr93^|SH?)wbE@G9ku90=Q!`H$l8>L#6pa@NwpKO5XhJ}3*-R?F zstkTdG{jy|uK2_=>qO?^Tf5xPh&de6k=W$7GX@>9QTg(X(@VshcQkU9iW;o`g={W#4Gk~7az)GLvsTqydt;IK3I6T>>Y;MWKX_*EG-Zu}3fLz9blA`A+&#J-zagwyMdZ(HeW zMc!?03dYmZ$7$F!iV2u4Co*;EFZ@~g!8<0@CfhzQh{BGfRFFw7z0`at&#!;o*R`;I znBl~nb@Myl_V19l{g(V9S(o!h>DzVd{rFmvmi*EjR_9Hf9R+6bUFh$U4)D{jrApT9 zO9$rQ8o_L?YuT^G!nFLZQV9}(G5(vuer24i!+plJ6f8!R%{|MVLAZK5pxa8Nq5&>p zL(El)u+gdlk~X+vRw;oK|% zUEI~@`(N)&su?_0(FV}%<%Ng5dUK+(;nPVU5I>V+=(yx_RdPJWimM5yMOKNF1F1bqI)eI4xnoFA*j!)0#cZa7_$VM91%`|+K zX!SPbH^fQsq`DQTu`GfWUp=)Z1caX96>SH)2#HpY^u}nsrMV4egudI$+lsg}P}_o! zQj1iw77Hh+F?c#D@{{S$iSm4^`gd~&FJW~l^uTK0G{L5Li&;2ajr?=9BmfRA3Har; zd3M#PgKThNr(%_fyzN-Kbyao#X3cInHHYs!=6n^SNVwY+4D@T?A^5_4Gf_4)hfD83 zGQ$`@#Nc=+V>1a_%0E|170ZYzg#!=QF1lKi0+PA~wSozYeXd%0kd2cq5+1t)(u1-b z56EY`S$k@O?(Tkwx?PfK`}k=kBFch(6|Wz(!1lm$Td-<%hmqd1kZ-@CPsi+U#oH#Q zbyt7BC*@18<}jz7lDQf!X75kwkmAVJeZG>p<#im^ad26=%WHR6K7db!6msSLoW_8m zIH6mjN|UFTbskl4O<^|0+o*W2_r`$H{N5+B3Hg5p@gTwdZE7?4d>RC3&uAuP+Ryuy zZq&y$NLCk6yEG^xqcO6gl0b$FlCP)U<+HJmiIg39Ecfn#0vsq-Q1!#1`E@xPC}#_i zi9nC<&!g+`rExI^L!lJ5nt)6*IRy3MLwQvyiu($CxrZ|a3N3x>aKa(}{p*I4V;nRf z)}{hVOy^57i!zKvbY?AWw$3^|+wu~l1=cU15B@1}TIbh`*Ph)$xp>K?>c^5?V@ck3 z8oc8U{T0e5WS%BMxK(mjK@*Zg5IM~}nm_y}{qEBCtzrAOkOmVo_}8wW?Ak7a!YYVe z5t{NV=P_7j1?l~kUWC}y{FlXF7V#JEleO$Md@yfVAQ=c5oaZzg6q!puS$IA)HN4~E zR^G5fgm-sUB5b%Z(C=A0o2@P7QmO0JzS7D%*~(w=%1*zCh zOMB-5+8TpGss1HRM3dQ-lnl-pesRLtt%~ew^%@@QpYCnhdy~XrPq^4sUMwI%XE!N= zVytD5ik&IV){};s+a2Td!5;?`SW~Q(+Zh9TRvulRM|JS`FRKq>%{n?xDE&&YBCM~9 zOpn&o#8b4eFm!liEC1C~_RxC$i?09?0{fkt?R~Lsf2`)!ac^x^4GbXFr5@S%B9wNR z-&4r=UmJYHoKCx&lok^mMMt||(BI!gEfp+(yI`Be#d3##Nnmf_P83$98#WLrr+^Xz zRNp07K@jW2D2?~A~q`v{z(Jiwgm`@Kj1+=E8O5Q5WH1AeR5Yx{T&M5f@aOLJC z?{CZ7UvZ!=Ht?{LlUo%Ii=OEeO@Qyo zwq3J28*IjT^4NVHn{L)jYokTx`Vr z9UxzWAetygBQb=|Z!1ajW!YrsbuCk-raV=B_~P zz%Q_LE}MD6a@(jp+&O^4q<}=Ls+NW_m9KFGhg5+^MWCA@lqTDc>nG^btFX{}0ipt^ z;p^%TK=1~Itl#{;H|MvXXP84ojok#zY?W&pN;}MetkNmvGBP0lxz7S-* zv1sMokX{?z=_)E4QI(D~&QdoYK^m}+&MU)6SjzmSG+IgUc_OW4NxYC8KZuK9RrYSS z!V_~PErxWBWYla0*6Y+Bu> z$pf0H1OlZ_Duh*?&OdrcMRPBxx>c0sHwnJ$n|s*vuAG z>=E%n7x9x|XPVrSF?h31$%V-qw~=Id5ZSe_?Vi{DdInJ$){-mL0^Ld1MLP*oHFzfp zCC->mDuhULD?Ped{%lQi{&^h&Ii#QZk4GR+Fx;e?+->A zb)hBjEkcU@AN=M&LJ0(z^Dn~qXj625`>*`CjC80CHE5;j9VclBBd3TGsT<5BGcdkw zNv=9l?t(YrSU!#=Y7JXq%Z~47OypF6k0tEzW1RaQ1NYu<8e(on2xH-A)xGUOT7+CIBrr>aa$^uq`wTvoiMC+hYyM*IWk>5i;@97?JAg&?97Nb=j7v5B#v*1II&F{uPbuE@z>Y@cu972tFd;N%9%9d91R z?7sUt;#bKZc5~4?)3U&`xJaa^w>*8H7rw;D^o47aGLKxD8URXXg*r*T*hc2d2aA$y z1H{pc5@rpO8;4gn7IH#th1Twl2_pX|XNMmb!`(ZW zkc|n=VLRiRnwDpU^!%0ofpGx=si|QVDun6^2Or2_jU^P6<&LWi}b(>RW&m_qM24km1JAra7*oJ{||M-iqDTsD(<$bn8Y*}Uqv9Cba?&nY=&u|{qH|qlY z%o#HyIE7hCWj%N4q^AxlW&zpLG6UKFH5mlykIM`XeS7bQLzRhO-5lbhV39F{`(-GJ zD$pZ@c*_3GTPHpGV2~6haU2#_@$TX0H|#l*3EcPjpP!|ZK;#N)Ay0MP5%jFTq4*M3 z3X1xl05+fO#sY&rOc^EbLMmk_F-lma{Baigvll!(hEFUly=%+yM^`JI_#5);Tdp}* zKxT+FRCK<28kF3kS6qukv(rc#_UJroS2zGkwXtXO7pRu*g=_K>4A0JZ1TD>_r*8tQhQBc&<6}Zh) zG7A#19a712y`?K_@+@(y!EhN|*YDqW-NSPv4eip)U+Ca8w1JUL>9ynojV7EIMj;Ao zBK1?lF|GltADniHgvc(4XVjrH=^?_-mYdpRAeEv19e7es1G$c?#$i-s#|o}6+~0?( zTS-*X3yXYaD9f?QP{`#M7N?g4CK3UNazo2%9Ko|HjN{YFQ1P=RaZ&UCTxwTg^d9r} z7x@q=MuZ&+y+@j^%PXJ-0ek3KuwRNI3o!CfhU)9ZP3=@2-t6LD0 zO!Y6liIa}v5v^%;Y4uACYzh9}iHs5-;T;StI}%H)FM&5CA?vIhbF+#6n+u-U!ENHC zx|dcwSVGdagVH^C`E5r8r0r4frI!XnZD^BAUTr4j4S zkypQf@hby@)3rYGCSv1Qk@iP8wG{|EdFmJ(V)lqlxGTr`+8=Q?6V5vG_|W>SmL|jx z<$&7@lEv-CE)3cI1Od_tA_g*@hnxOjC6SS-Jm6bhkM0|UHU(6ZkV9~=tzIM?apVW@)!S@UgSNKSRaOgpoMCuw8= zWso$nop!#dBH8@e-&duW)|%vxudL$E3oFwvCBn_zl{>2qEHq4&5OAj7^{ML+Rkb1< z8U9$`rI)(5Saed{NWJYyzAlTf1V{`nykU~xhz(|amz0SeJYJ^4C~E(*WzshyC7uNF z7r2)shzfnk3&Rpz((mo-JE2A6AvB@$@NAMLB;`g;;yf^w$R>{!P>?<{GmE6yK2SU| z*Ps-YZj}!)oZysxlg%Uf*a^PnD2<{Z__Vx{CF`RPnC^V3e8V@mJCyQYGs0hldGD|M z8h{XA1_tW^>KSO#kxw3IHo>5LA$l$2z2d?6IpTvK!yzwu~#D!kD4AtI@}u@!$oMm#l`3 z0S8mCj{4{kEyEvoD*T{!l(0$yh=_mp2Vca=W@y97UBd7o*y}s4V}bQa;jfi~!-wko zI2+n2=HrI5`D=8^TXas@3wx$3FHNVr{7tWeQKV@1*~nKT(15qoHpKBAX62? z*JsrX%VbiQDMx1(l(3rOMoy=Z7bLjTuf7@~d_krd%o+hRPI<`O8d44QEz%k|I_ko9 z8t(O6`5)|X-SM~BJ#fVpMF*z7@r?8meYNzRTUejvsB)^PJl$}ejLK~xE8u0Dz(6_x~JLrgf?%HVil~ug@nLJ;*FG)=K9{1 z4=Q>y3ojK{+Ym@N{%JO1)1(v)rjxw>P?L-tC3_-HX)Leq*7+B#PGt_|$G)VE8@&8| z6Im(yW1FD1n>vCXokuTYU##y`z9WxB%2OgeD`aIHdy^N^aQwZ*r@ z5aHP{j2&mwn->aMJTC}afU~nRJUILv@X8ARwf8VuQKqT>kVN}-`rBE23mBw9#NSX& zZfflEpDsa^adgn_f)if3&9YWGk{@vpbFu478{pBUbPNZhinOU$Atb|s2WW@KjWXW8 zC0{7!_IEbgB*BWbciru=Mp<~q8oD2iqyA#H0ae@eGr;UeCkr^dQx)PEUf+1&*I$9N=-)VB&f+Z65wo-X%h+z8)sRou60Ns_h*o1mNJUSBM zs~efiEc}|}zyb{0J^+zyRmHpHlw8T0F)Q72mUtM7*5y?LM!Pc2NLC>K#aK}BcLG5G zHV%c_)A$@ox%!L15xkX3oh(AuK2U;T>cHWEpP!0{uQ1BFwS?1>5?Awt(nh^ogge{* z`5|&Yl6)ou0apJCoRAw@>rC-%>MX4E-i+H#uY92QDz1ALTS-GZJBynqC$llqKpS`G z?h|(0zcK;{qr1$N=4=x>u&>_FO~J6u0#0liY9XHHqjrq}*s3ZsrINZ08-3;bDZP|drK8n2L&ghr##xyC znsRMSbaIw72}16U{K{C!7PSaz+{(_$7knm0+C@W{e`@uzqx^E3E`JpKDUwJFhqc2( zwrVvGXZirIW9rHM><>98YAMQG!ATG*8rp^KX9z;%ijZY(YN!4@7?Zqj?j#b>%6BP| zm0q?1qw%hM@N=nuKgDL#+3NaU+@QQ9mwo={BHH{F^mlVmUe%u)Q~Yi*4cRHX=!+{& zs!_ACB!(`Xq+Yq?-Bqr$r0=t$6^ep=iZftA!4ME4r}^3IoaR((wu!#9h|1)BZ>mN_ zD%qhO80;0{PEQF`BuXbr41=I$8Lo{?juP{MFwITvUIsvr%xx@D=-td*t@9#Y&?{a- zxun@~JZ3%+GGF2S1$?;nnjZG%$0f1S$8zHL%yWs8O`DqzwuD}P*EH5AVG6tnU$Tk) zJv|(|KiM?7`JPmGX=W_vnaIXT@}KPfzt*AuC}5wBV*~~7ZpEee_i5H)H0=ncaNI#z zE^or6KB#q~LKMQwrS!maoKl8Dm6*854m9a2b?5V>P!~T`T%~W4c|2VB1Y1s)^z{W) zIcX$vLTSE-A)>x5aKEXcOSAxqC*J{g1yEFr#fnuoSg^py0}UhJurZHv!KC9cc;upB z3EWcP+D2NoL-*nsq+v%UIkyboy79g0?jfDAyei%P15j;r6-j0z3+;=)pI)9C+8$dO zWylrIViF?_=l&6)@!TPb1FPlr;G6G{{En%anHhDEIyvotBY@cDCzpesPy0&w!b1y| zJFrHH`0|S>JNh`9np$7ZK?Jk$2ovFKvfllTFDr$SuspOTWk(qCuBTEfFMbrKPUiNp zTdB-A9aPA?$${P9_$M#iS|Mh*S$t|5Mfqnx5rV%MiDciZM5>u@-)^vufB18CJdw3S zGn{gGR@{;3`%!TjK>zye>iJZ&Q8*ok9-mgWz;cyuEGDY&o_Mwl$j!c#xd6}?MqA={ zr*iWm{G_}5tvvm$QWZ}u3;6SAgLwOKj4j%3*~@x9prW4!Y8~JEzqp?jUXxF7e20Ar z?;!b!;iZwWZyIZ3w7@e|LO~am%WD(p$If!PuSf}X8`N~dB{|KDP-`JkTv?)SH`YLf zFQU3-EGPbx?VmGRKb__X8fD|+$ZnYgrEw#;DYmI_e>D?$`w4;%vwsz8h0e1L15CP9x`~R>& zmw~Ja;(jlZW6~-Ocw#|p#Niox0Qg$PJA_e+K$qK3V50OLFu7lez%$p?i&k-Mj8w&ZT z_ln^Fr2K>~THSQw{@&4?ldRLN-GZ(45%QXw8*?Xzx5z+JSNFuPR?>VW_s*QWANb7z zc$#fLlAkC|_phYguS7+lRzz8ii^LJIQ+UZBlP5cP{zl|i%j zIoxc@x^RYs(q`ZIxhc8Umn86Q+ZkNjgxnSDKVE#OFc5g96%#Sr{FC1$U`KPzw^kUl zb3Y!}$*Zui@g8uReTKI&Pwe(+SZ?e_na0mi5}tCCw$_ErSSTVeDRsumJX$i0@T_PI zURiO{BWf8!5UZzEw$6Rqcz3r6(wT80l=)^TR_FpJdk$<#2^94}-OOSvpk&wHe)yqv zwQVYRJ1f5#MfA8eM122zZ}T{8f#HL81H^Hf!NMQB>sH^9u}HXCIGPCN3D4XHNwlYs z=~Ith(2NmR9qewjroR3YiB&$D&c}|I-WM04#FR{1&)6-)xV;rHDtG<~@jZIPqErJRjOC%$uD!o<=*wYds1j8n`32m9}R`~J(aXs_NuAAo(+{{BW*VmA5 zza0rzRyN5aWSgbOT3ZmVJmiyH66te3?*1lBqq*e?Bm!SwbIZ@c_t&x3np4lMYPu4} z*^EQ|5F7W>I}W2PwxWY(t$*-!9sro z`__6>Sh7z{j?IB73j`c|wjaYUr6W?SVvh^EBk4w0hR{>!!gt|EZ;lWaTG2rh5GhazPn>^7UwItS?$b{EnwgE8`BRksR_vy^V2@mc z!{G60W-M=L>A{mw4}0m&jwsmL2>4q1%7gZQZR7t~$`CjIY8f>D#&MR$n8_L;Wugnv zo_LRicpLx8@(vyO`fg$8xn}e+fLgz-SN<*s&Y_7cq@^RX*0p1r5&0+AO$g6Nioi2R*~0AOot+fzCIFChj3X(M-qxN>+NHi9LJWr_dzvy zhw#vk$G&s@gYRFH2x@pSzeaDV2A)TL%$!lp-ME?=-uC3XGQoX)%8+g0Kwe*$EXw-M zc`#OXh(v5ZZKLjG_0jyR(?YE%0T4*5Q;rK`_GMjaPN%%AD!=#-7)qkFU>uDrL|a{n$N`KsoHJ!LI~flIz`>qPfuGIn$!5a}N--ry>RyE2 zUKh+~8)Ea0qz3!>eyCEBQt*Kis+ZoDO!PluGe4ut8>K%KrQ<7m&h^`YuB~kW%$ORUv(RYzuZ$ zNsamZu&!cNDd$BNC9BQ7Rr_Wir!Wh`%Qez>!=RD1WKnHT` z#Eu-k{e39U@Z-K^lh8CqrBLg1VhdQ_`PTEI`MDB_7&21{>xdxSCQAMWV? z5)wW2P`G)#%{ucXc2nqNgz6=w>Xio_a;h(VK8C~=qQy~SSx18&2?Cav6sznc??TC*VN5ryFZ~l8u)MPox^-(*%)3OQG+9E#Gtag=g|@5GZ0Z z^J&%+&byGOLtJCG@f*%!Vhk|H{A?QCC_ToWPdfYU_^1ob(+LL8z(W_ga#MIa5k%zL z#D2t87^f~`E6vbC7E5gGbiIvRySgg6NW02G{Ata9B&S!MT-hNZv_5tkaZCxj z4^zx&^5LoPO;pA%5y$Bgi?aL}&hBGr&(8hY;hGfr;r6>|C0jwQ-CnMi>}6Aw69|7c z1|qZ4XucPP7q5Vjj+r1)5FSh?n;|>%YV8CDk~mtC=g;~&rpmg9}k5}!kp zKsyAXxAC%a1+f%k)kKQW3-R=h^ntIC@$8zTLk;jREf=S@?^PfG7=MngN;c@NZ`i@@lXqL9S>C`mXi}wvuz48xIDp|Kp-%&HzK!@{a14NJ}=I0P2(3o3p0wu1da{?FZi8v6Pag zx^gjXuewr|)m1YeeLog^6DcR2mLcT75nT_c@y9~rL88*R8-5b!UAMAVMsn`oKEGV@ zJ10NEXL(U6C$9~q(PvAvA8lY6O|j6GCrhP?vl!-ed0(3Sw@qluYvDeR7$&APS#5S6 zbK8qv_c7^Z?w^SbyIL)Xq8a`lxfYVq0-XB%S=FMfp5pidxh~YN(v&ixVN#?7$`^FV z-Pe~fp}9}L65_kaaLMS0<$9hbkMHiTrywE<1R`9wD(Br_jk~XzM$^#lmvwr+1lE>*O6(AgjD!R}?-O3Y zxUmj*7LA6S%*jx>4mbQbfae>zgPC5Ihhe{g^+9_I73?EnLXt8S9QXwuYUW(WpChBF zvYF6jm9Ipqy>q>pN84OsM<_Gt&CY+;@p3aF=N@0#!VhKrG?3?$w0=>ej5??nwtdLH z|2@m03sISvbViRMeD|B@(J#?=5H0*^UcL#yjif)*>|U@Ik{)*9&Hz9nWbSfrnTddB z2neYoS~;Bi88sZ=<88v}Z+C)N1f`Jo9H_MWc!(=0O~Vuvh2W|25Tbv)=)b2rjn67n z!xvbrz`mzXl+mr?o$c5Ad(7@TeKH2ZUO6?!0)*{jT9f%`vg`A1r57_bIKH;7R5=EE z61UnsJI@Py?p8bR$FEYi1C5akk0<*M5Zv_f>dM8{skD~2;@P$jO%^p#8Pe2HQ$OB*+LkJgoceL8PgT)867a0G&FM| zNys+{oVnrQ#Uv222F78K&a$S(&dwgqNLSf06pRVbiwN=lS!cT-s$gI-c-vv9s2xEe z8 zRE+k2ywQPMok!N62W1C7tl$1(4-!0wQg($H2Rta>|KaZm4#KCRe~O80`?>gM_@`J^ zun6x1gunaa<=A|@@n5p1!Qb&Q-W`JHQ5|(nTx8*mJN~o7_8X&C3<<( z%@VJ>B3b0gi-UE~@|kFa&^h2{Bc^lT&F2z9Ygi3}RdU!k^m_z*R6Xs9?GJ?crIo2O z8r2z4~0y1^fWw`=$XVX zXSb%H$#e+rVzI3m5dc)-Wea0rkH)4;WLZkyNlPsltl=R&mE$(kD2QvZiurlSV-=F9Isr@Zm}$Il5? zyElkN831|Sd7#|x3FJ|6e0eh!bbj%#UHC*U8y;FUb(GN=RKEXPlwIyKUcnrYNp}EGhA@XB~Y&w6cmimc-hot zjDDV$Cje)aN6>$w@y>~<82E>CY zC|~u_DW+|CIkV^BFZ(`QuK4Xp8YF>!6RFl*lsn)RVX4aOc>146$eCf!S7d%Gc>VHm zE3aGnZfD!)@d=ESpA{&)HjXyjIZJKP6!yAt`mbrd13!d`LAx=gl;@{ckqNi5LqvHN zQ)9WCDTMShzp%;+32FZ9%OMj+kY;sInKw&k4PLn8UHWEU0#5ggMV{j!sr>)=daI~5*rjc_1qv-%+@THb z7Tk(E6n7|Y#ob%nDZ$;{-Jy7c2X_e?ti_%FdA7VK|JvVKa*(xhFzcRc=8_pHDZr~5 zRnChPCmba=Nix@YB~cW$#)?u!fD88jd!q>sZCW2XslV*W!t4TCyuKWe$=HO(o@@(`OWl}Gu8=`JO{>P59t*xtt8|{iw&p!P zX;9GVy6AL2)9$@kyR}ly-{E{Ia<<|9DRs*D=T$|#zGoN1)W?~MS9vg zzB{lm4e0wmzbJCc|zYDZh0)x9217 zal?#s&lk>`TKgjPXYaNdZN=MEZs=tv!K^E(-k+lzWj}XyCVvlCrVUXc`OS@a$`#6M zd3_;eZlpuEc9a7b@+R$?hTM|ESipYDBR3GLQ87*%5GN?kF5J+~hr znQOQ4?QI8*vz}hM>ClDFP8VNrULi*yUJ9+XwP6BQB`V@!+`L-oRE%U|7#To0sLzB) za==V8kw-rCR|GrfF?UScRs%`jD(6KI2c7VRtro{V)(AK+8f{Shj_z{0X!L}6O~g0r zUmM21@qnP|NDG?3;X-DTYF9^`o#LYBm@sj81D=bm8;PlqXssw~|2#Fuhc0B5{W&)unMzWfWQ20}UL z4m#f~CU*K<`~2EdSQHVK_cSB8byzRSTy)%uddqBcvtqy2Ci1&n|JLbc3wxzEKp3;u zScb0U>u`Fupp(ZGg+PzL;EiKeQSj>G_T6`TH=l=Btht%A?JaBM?G)L6mO|0Id~N|9 z^f_IVEf%whW2EP!aUwpJhKM~KooKBcP?+5#%K7#-hmU;)h3875bq&)S-p(1Ai#zk= z0lyq8eglKehWQ7aoilon%#MJ4f;E97m^fB(0)eq!GJk_Yf(5YOL1xnQi#+mUZ^kf! zUX`3DWJU)Od8n5GyrrMwPqL5}iGDt`tr0Z<1R zfMJ=j%J%%-rgDt;IoV6wY6}lmuAB!=n1-%8P}ytnnaOiXv3|0$=g(g2#)voWmaP?e zr0#i~*M^1v?h1|XeO7w7mZ5~w{qC07eC}uR+Bw^~IyxQsv)iuF6gVN!v^cLW{&T9j znYz6y;v;92VuuQwd|mq~`-)=G-c&wS>JUy8f1>JNUwFY%u@ZqVo>d_x)CXW18k)~G z-o$#V0%e}(?+LKtAwU1%FdKG9EmUttOzwL`-J;}SZ|34vN53O~GZ!BIk?spEvFq&v zDooxG!GoZ~hI1^gy8SY4Kl9I%IoBy$U5M#f`nIW`yCH5iGbc3tyEsS&Cem0Gi3|d; zAL)J?8$yeQ0EHP|7yb*R{ClGL*JzVJm?fTnX9gGL#kA!e^X`kg!W;}ThbHV?-A+Mw zOGDnbjv_zT_Ez02{t|p8KF!BJb=R5aa4e`N8_QrEJPidd({60)DjgGWe;ETgtaRGG zrE67zoNQ-%L3cm;+*~;eb#}))peLI+sJ`oNYautrt*7m7D8w*cpAEAb=7JUO;CcoA zedX^_Mbx^A1LKNrIM=a4&Svv~x}_xV+CJJrscg#W$O-|!ilivG^|CqgXUnCKv0ZHO zh2eJ(7TB@efma<^F zWEv80eyX4nv)5sgmD9VVv^sX3Ig$q3CMQy*q(e8VzHLA)WZd8KAT(5YC(KoBx6T_o z;WO#D`TJblCkg`!x)TbN^b^ap!COY%UHl$PuJ+v^aEiAy+>7fXwzp;99xeT+sp_eH z*Qgb=dMxhYK%l9monKQQxzgcNZ|#+pQl%3bS z(ob4l0LvE;>a0pRyFJ(vSKwiZoZr&1=Tu7NJ6{{6UCFc>gqU&(!;|%RrGClLpfEBX?_*D1jTfcE;>wh zaz=M*JI>;|-a5bhvC&&qjd%f2x*zyVCms}sNg^KYxF1e<%znwI9FtG9areh;@koMv zm%8R_tqMPL(2KJ2s46({tnO1-?S$=JpL$vSriX{3VD~tGO)}b83DM?R+>$vMIYgn; zhLQ^U9^TW?czMvL8WA!6tbWiDphY-y%82vW*Qw)CRl?nP%N#p9V;w|%Dk2Q;YA^uw zLegBWc)#rP?tG@kp_}x~4 zI%~ooVuM-IxDpR(?AWqsvJNWOFtYlzO+ik=7=G`^?dXpb*Gnkz&^IHpocnHoGwQ~9 zq|RAs)_Bs5B|cPY>V6o;k4ftOsr?V#8xau^^q@{QA!Y&QC^v|nq&^VOBt|-kA&i-o z^y%H}D20gd)l=GNFf&wE$%Qa{%btPAm7*2bs5E%Zv}@g=I2=)V0~6HCTm9BVE-ZWT zcYaZlBpx2Vn!h?%{4Y5wg;X=x=zP;xTVbBxOG-@I%K0r_pfxR~rVi^UwP;xk?F4l~ z#Q3+GHdYE0H8p>=$t?Q%X|7;zFHZ&1^{-bu z=QVgfYLXjVxXr+fbDME{dFKLNF@^u&*8f|4`~zbDnRH%s%;L6rJdgkGti;}{SI=-` z`?Wf3WO_c+QjD*cbf&VJ9AE6sW!Fg9xd7dZNgU_? zua&R0W{UF#)^e=#trjBQ>aWU7DY|c6cMD%7pBmn6ZN2So=y>gT_PbEKrFF}d)b7u$ z9TQB@mtY6Y?ih9t=JX4w0Er0xh|bhB5=gY_J6HLt#B1XI707Zc`9-%XMHtv7@raNTN%lBK0 zp{{_|leV=6Y$B+=S7uG86AdMUlt`sHT>7?Df{wSDbSQIp3DG;Yp4w%EZ?M9RonFXN z>7CQS+YRBSlja-}jx9fy&%S~8;g&=JY-f;`)i>~0n${6Q)A|*uv<$Fy!v{U22J?u< zp9H_D8y69pd7=PPRV2H&G_{o^pb&0AF@+Ov~%q-r5^x1BH5!cE;#z?kn8k+$itqQXn23n{hrqV1E=X8eFkR zB`(COmUJfw37LxKI{plEommKD9*^CHRAy$LuSt?uzYlapiRy9-Y(i(Nu`fPIS={!E zjoyt;aQuBzbU;|Tf4oTK zJcHpZ$`|NxbA*02ZcxHBa${E2oTK-IeW=W%<`{+>d|%&Gz=?KzggS_;`|;GVcCcr` zFXN11=zb{K&0Ceh0W%e%&SZPOW=<~LScQ;lDEK=R&Unw5WB7X%kZtk-KT#U##8Hkb zZp$3d9#&&O!A=!XMjJZe+6(hDxa8nA^_{}w=GSCw&9fP8M2Z~)*6o61xFX!(J=xJ~ z6WMs(PjV~Pc>41irVnm5AT8`K-2vp+UO;QOz@0lXem-NM42&Hr_0H0C+=9;rHQXxHIc2-6dA>)}z@DB0V!xL0palb7mHR zpU&a@7hf#1;rG+Wxaqy+&a@t%WC0(-k2LUvM;9~>qqKq`!>6wS=Z$jSMko)ijW%ZX zBsm893T#!(1D=?y#S`axWH=w`3{NMA(JC`x6WP(u%?v4LO>|qGor17Ss^zrmdPp}d zo5OALv`!fEz@+R-0)Du(71IBN5StCwPEP3{QrAmtI>XFP{y^h4uN%CYY<}f~8~Z+J zhLEj`bRix1<{cY>747UpDEHFx$~XIK&8E_P62VND!%w~v%Yx9lu5h~F% zyjjGw`E(zt=Ng=^oZvX8eJM!5W0F>9X#$Q6%vO^J2;+CSJ4Jr@p@@y`WbKypp`S`@ zvK)7pqACHvTpTW;m_v&(nV9%{aYzz`-t(7XKgcZT@_-_atG!VCvlBRetK3-bZ1@Z3 z@vps>&|k4f!DOsVC(39rbX)8aCceSN#zZ0aN)A0)E7w0)aLe(@_G}^6 z2uZC2KC?2DC@q*ju5OG)0ycSqa3#k;=b!!)X<4LdwAzk%7 zUm50kn0b)yYHkcRTJ8EQw0sTe74F6o?QMKh>tLT>d!`rTd5bxnX-5cc6oy^pZA7PY zqJU46Jc^EN)P&wC50~47%7lyMrrWL~n@3uYsfMdJOUIG~hY@7V9kR=)#q%>4t>eV` z*dZlH$FsN%ea>FHV49b<2M~>6FzRWh#-5>L$&*9oNDhMN45T^^-?mAX$%0wYx;RXV z(A1sB=;frd^!*GPtW5_;2!1G)e%B32#G~rDg?Ea7uTpJdIPzb)bddk?G8o(wBO|zo zzD2puYMBnZ0d%GzOe~4f3#|Z-&P_f?q7FA>o#mUO0d$Y+Vp(MRb>2qhD+ePlz z`;b!kJ zF5r1du%f^E3jozERa5OS3NP+i>AB*|1l$)fs=yS=_+wm_D`=SV)8#XwTgglu z@i|mn!0>eBSP%u)thC;?o+6n#rs!qn{ieG$A0wW-6n;gA%)n-}#DWzceh8p!lQ3-K z6ZQXo99n>2T&$eIXWw|pNvs_ozkgC3`C4>ksmk;z*KAvzBVje8(x7Zu@B^+Jkv!*2 z-3LN2dEER=g9a0ig^#tPP1joiUUJ6UtqrGl{;EQ{-CY$qIr>_$+PqC5gURjFbvSyk zSGxN%`2P9W>ShZiRSQ}kY5K4b`K~L_I%30M^IIwbTzx+Qeb>0A1V4g7M{3Qf89W~; zka0ykZMOJ1odJ~}upb2U; zK2)fm3ELN+^8(W2>=bMDVubd1Yw>F{bHn&`gbw#4=r-&9W1W{cKwV%uCqbWw?0y9_x?FQwuo962WS+jJ7+(NkIP@k z>onfoQhRUiyMTsF!sP-C*#Fq-&Qb~6c0Ij}dyuvdF2*Uy7wujFcL@m9ZQQx_Iy$Vq zU}}mr`Z7$5HGBT$b`U_3)$V6M7ZOukIE-V#&GwIm^ZUn4Z7a*vxF;Ee^{XQiv;ca!_xt?IT3cYsEPkTJw z={(myNZA>hpTD|w&HMuabNJYqA&Q8CRN`A{q2iIzHx@+oG;%7HIA(Pp!Jo$beVPsl zKj-U(A}9by$pk8z4#j13%@4VwoDzMqRN->c!Yik7%{0Jg`*(%#ERN6P+yVo21;EG> z+r}S-s`>rZ`QJ6LY^8`~EtQa(IJT3H>OT(H&~`?!dG9K4f(-!x&7xS;U?oZEA5zL! zsjk~|34bRN+Eqrt93WZ&blUJ>q3=4_dP*gH8mrHMdlTT%32xu5ituE3$<}rQVw{LPj#w5$h zDKSLB{IZ_H(&XlXvmQ;TuB(KBASYMUs<-`T7__`CCT>d`%c}cbFkV=W&F|(iElW>E zp!*GnODoz(-oEgaEIh^-&w>wMvJbeZh6+lk6G_}Dgioy*2iNYzANn6Wp1xWN!}kqa zV#b&gKuJ#!ccryFYXf4)*taTqbqrpT|guNWCKd*fEhfjM%i*d#drt(rl4 z1@!f22NHQ~yXkb1wraW7(9rj>Q(MNyAt%gijW3uIvF=8lTnOuNvbOc1;VD!JrMj8j zdL&~vX3h=C9S9^D zr?f;}OO+u-sk)dhH{kV@=q*kxdaMLxap_x4BzbiNjl}F25H(hDz(QF;Z& zM53>A1Az*B{wNOfGO)c$G~hi;^=z3L;a%97FkHXex+8jiI79Y3kj3h*uR&&u-Jex# zMhoX`ZW5gh@#p7R$#xhjGFI|$VQ=)N zqXzYIYGG`x#FSmy>!V-Z?_LWwsO^A{>p~DF%s7Pq%h7`^ro;CuhG=O+pjC~nY)xk? z(|4RPESW`-VD2=7&hJ{)n|OfVY{tzgDOG9xhl8jfeKU+0){ox4rY_vzspUF%6#LCa z%12Df!T~zv?J6&mkL1GM6ssPTMSGPzd4bmNxSMYa8fwy`n2vrJt0^zP8Iqj>m(Eog zOa>?7sBww^W@D}#6vvLA>4T|z-88bzR_l9CFD@%wc#=Iwb`;Zet-ZT-9)bkVxIx?Z!zYfqmd zi}vstNn)))ou!^w6mp5_e@2<3x$6_=P2tPA)Et4_NdG7JFcX=0_*2j)MmT9WJg;!+ zFk#T2{=8}}CBrQ+b23Ml!#+He7&@1`_47+ZA~Ll4@YY%`$J8(p)}MkPYESU7v35-% zoT&>ijRP}+YgR_Pr&t*VxC*7*npxgy>#M<>@`+^>Vys1{AH3pZAAp z{an?l;3LY8X=G>)CF3yK7%42k_;rqMmP{-B?r?kVt^Uy8$c|TrcCwfgizj$&)Ip_> zdj|988iM~f#YDA-x88KH2Ax5NqTL?uOupull)glfHPNlwd=^q=9&?+`+YH)p+~(S*OrWnHkz;LbAuny^pHPTtMm4^1<&wCS!YSX6 z;u4JSM2da|yviY2#xlZ~ECPxgW!zdBGzwQ%n~;Hx8ZUILlu1DF4y{PlG5kOg03Ln`M}%jX}<1^wG`Y7?^|RDv|0 ze6^MGdV8|`2)F@~aM5H?#8w=Vi*`7CeCb1@3o@f-YQ2p5P$?BZ81gDPg`lvxJ2p&a z*bDN#$^Ta5M1)i6Q6(Zx&^NM#&1k56Y!S9wY}b3Rl&%2u4?w14GbrA%V%yn@Y-~EH zySv5A{^0HVe3RYeuo^dgYX6A&WwRdF?c~Hei!YGF{ASX>!^@q3Zpsiq9M*Y5S;8WC zYkK>g$_+aH#-N=;LeTT~CovPu(CE$lu2)iw@+y)ZSSd?&L+B10_U2A^0Iqx&F8g{@r z{Ota#9F`{MJd80WS8E%OS5)T&BsWA7w1dyh#15d3tpY6|2AS8kmHZOEh>cN|{&;j%^X-Cp+T)j+iR9TZ;eLY>JkXG`oG z`iq|&Yb!>M6&PU-5@a=60x*N}H-bBwP5t@(k_9QqvxHj!GVO(^BO-I8b4lKr36Lh&}rjDa|QFG?m4hWIHrkfCLhhV7@x4qZf?hInZ;q ze|}%wfiW!=t{z}Ywj%GskQWc%Q!>b{ox!uN<1%mteVM6m9WhvusuqWY{^?61r|+a(487wM4sP-4()LiEmA zZ3p%>_zty{)u<5npk{0OiXY^gN5K~mw)-4RS88*cFtF6&$Y#IPj%e3vUz|+3VD{C8 z27@{I@;n8Uwc2WW?X%KhXH37}a=HWewOAu&?t_?MNDeq7qEDGKVRg=ayh_VWg& zjJ5DfMWuRSwIDc|1zq84NQ#?% zUpQ5UL+Y~D#3@38GDd#2HtO;OJ+lOLigvlWy$=kuLV4axz=YHJ7~pk)NN-h44Ib&A z^c1g*NzN~x4GAeFM34{SN+eU)>|I3x@e~8E(MZr4^{laWCb86-`2j#HWuv>gC2XbV z7FnQ9f4PQ8x(`s}I7-^CD^j}giAdH%y}B!{A3GT2hQcxt-GY@u={1p z@$Y5~9wUT~|tN*u$Y7!&5t#^K8jFl(fsHBdI)Q(<}L%YT)Ph(P#>*FiCALX}EkHlc9>b1AYfQ!3@zzxHU16;PJ{DKQQw@D#QQ3{8V%ytj{?GPNzLi9?5f>FC3_Z=Iti2M=NL#XUCkPi{ zGQimv?fGyNugBH)UBL6;>xc7pF+Z=O+#YwQS8Q>FkjrNquMU<3W%JB>x_NPz`!E4` zO0RYhHX=iucL1(50YbZ2xzmC9-7qVfD-*1u#g(h#9=N#Em?MkHC-$tBF@Lb=z3Gj>VBp#yUNQM;8XcxA zIA!PAZ^xthvqUOOL1j3t?!THv30rP-7numrB0}S_D!S6Ks83bl=1VkICF)|j!~`uZ zptVa4R$&16?P`}97Fa#A6O+6+8znv@$no(-VyVGOw0gA#mubPi=o~zMNKRC;ALlR! z1gcvYB32xcO27luluiu~Pe=<|&H^+>>%|pRj1O%Wk`pWI0#1>SejiB`j3~T&&7=l8 zD2|%uvAf=#)BUWSrO=JxT^4t#YNm&?g4$4KAVgbDTn`jpiR1EjZ{ipWJ}oBjaj=)L zp4y^RV(VLlGhMC&-gj%VBL2Qsyl2gHi3W;yd-Z^hb+Y)&J>?FA+=%P?gr*s$Af?&@ zG5)Dp3gIc@V8(M^s{bMxbz`fuVWqWh?`U`&hyYxcoZB1X+iD3LuNT&tQB|@Bd${?y z&+Vue3g+eacrgh`j?22tT!W~&l%jN2Ks!I<{OIhJc}Ki@{KW(m-O&X;u6!$!RdNH) z(lI{Vb9R_$yiiFzjLX?!a9dI+cc`7_fRX^nTsh^^iam>f%2O+JjHoq^F zO2;dOTZLmvsB01HdC+L6S0pZ1m<15gu@iQI5zZo9{7Uf~uf_i@Iy2PJIQ*5xO3Nu( z7>6!Z*jM&_$o50#`acx!iw>pQ42Xe_jj(vnVs2?JC}$%;Pl)}>*KQIcR^^95Z;hi< z$nO3P=UP!H%c;->Ex38dC0br?qt?-(aG}O1Aa1VP`aL2QlWdLH;znb{t_!sp?wB=r zkgr2vm4RUrt9D4r0B4nG219Qb>>yOWKKjp7`u9P@5H-L@^eGtXLwx0ibqGwdUV z(mAnCr<%>u1wq3Gki*t+NP}eKTLBEP#di`VlmD>%aHjwNwC(@&rch|ShYjf1wM|%1 zCC3(Hcr6`<+vaN($C@J?W3i4_&JE|v1;YqNY&cRJ@)LkqwIzvRxYas2mZjY3fZeFB zC1Zj-;Ww-XWjB!PVZ0npP#j)o9sm3%1>tR?Tj|*&Aj$$Ak&Su*W@&{f3=C28^RuUV zzIu>;ni!hDYn>u1=79Ef_1njS{Bs6_qb8wf2SO@7!<|ZIZ4mOWDi)Zp843!X#a?4Q70@<`D z+g;PkIKIfV>xXM3Mxi1o&(Ymm>sow&+pfXrN&3Dv9uTfIaqq0=5`^!8Z33bdN7C^^ z0<%Zs=F@vi6$x?fi@a;wA_7~ohaf1El4AqRSiOcSWB3c@6lfbUEzh+YbYq?Pt9LI2 z65dlP5W~vpe~p#SKyi{Z7ggD3ia?_zc-k83s^0jh@=UVGSzVOWBXSoSb_!Nl?$=m( zR_C8(H=#7SL<4XI5D784jH4qPOI5A3gBGW*lI`887D&*Z@+O^xGq0w$PyFiLSr_{5xtiFZh!np)u!l-NlZ6xHzuXDI|QmKoQ z5|JK?7AV&KV$2@e)H`47QBNx)Mo!PVyt_lwYGMjCogqZ-p%bn$rgN1gG|oO%gb;dr zB@U>fJ&rID>(Hk0x@2!#JBDaa1I{LK7yI_1c9OQd} z{xS9G5PVG-72Cu+7Q%oXp%%)GfQE=%;UpRA;Y9T3u+C_3t)}3W{jcT%6+Z)8g8Bth z{ZEDGv{lM2vz)yYh&8fDHzD~eHN~c#$mPSb@(Uq_zp9F*dlBc2s2T=)>E1{xzL~>L zqAIB62TM^6!RW7-WT}Gsi)PikR4}4>vgRtBD6$iGYp}J<@Rt8(Qn~i6)4*q?-ieoA zRIYkTcn1@5a9501k}{Iv4<(9f+$>BqAqT;Ge~Q78H}nh~6mmA{Nm)6ebK_+4W1~{i z$|4qf_<+*9w2LVD_PrEp#5x}nTrib~OF$N0jDQ@)gxzmFMYPNn$jpjdY-}t&<9KPz z91`_#JHwI(bxH}2>oYdJHDn|SWo z?H*Jz`_Yo+9?mXb^N0W^6P&+J{w&WEFpjR?#@L=fYiuL3aVla57h)XPf;eT|K^aV^ z2AfX)xrucs3cEF@ql$y*a*EU`v{1Je;N7R3s-p7$5REwOU(8QaRJq83zKmxJx|6uN z@*b{SkMY$95}uM#4okXYHy81#5?AJP`s2wro6PM_oA6CYR4Rb#OF0N-R-&wp%?MbV zcBf&(U%&oxQ)_*jKB6^F(S zPvNN9ry81=E&hg?8q8^EewJ{nHoe`K4F4VlIw_NNQS)~Z(rQUo z)t1A-tR>CcBbVZ9DTu96Z21zXB-Gtfohz6m8|ZHdz;g}swIqX!ft3SYzrJN-p3JY@ z!!)SL;#J=p1|#5-Pc(k9>PR2XhUicmk;y(QQ>7H^So3Lx8=Z^G+BVDlBPfEqCGK1^ zxai;tr;Ee2P%bOjRXuK-+csymu;+JYI>TI%$VNfWX>(&if|Mdv^&qT09`fW2v*|7F znNKBzb`_0v-X=WNtSUcCo?catU7N9gDWX+}M5~@W&0qSE0+T ziHE>gR7ja}b1l+%Z6z)+@aX;X>MY8iF<-&MMNf~d0Yu@ei_f$a$BG5y%lp%d*0J-2 zl7s0QmRJ(WVp82a+|on1r3MsIE4n1%)%->ovOI+&_+o}FPKtMKO=3dlDzt~z(}n$} z*!pUTyg1$qZ;}e|x4%RbxMaTGQx-<8#>R7;{;+J8Nm%FnNYB7ei@viLI;Wo!tb?7Y zX4HUv4!wkfVxGceG7lyofQ05Uun{rj-=@5hLn5760nn@){9Z~xa`W;?RO2IBIJ;0T3@@q+O+A?Yj)9X)~!1#Q*NKes7V??5s~ zLC51@DlhM$`=o^Axc(p^d4(9l?BUh3nA0ct|blltlQN!chxBv@9>fv!a5A*yTK(1&r85Icl zdBk~t%S52f4vojbKyH=b+SJ(uGr4n|zG3ilwSIUGknW*zZH}aJsO>F<4Sio2X6tvo z6OyLRE9%=6va1Rk_b}W}7lS75*&roAf6;`uWmiLY>dXEE!PCW=^3&qw$f2hS`L4g* z@LFXh(_yuHvR43Ke2ax{9bjE5cEcKo)HIiU_NmxN%5a}vaab2ZP*^ZD$)07$kk_qQ zo+jG}0cb1I@AHgRI?hf2DG0yUFUcPLktxs!$xX74lZ;~s8?Exec5_iSL?0?2@QzZE zm%sSH)u-U$EGk1P7i&X-S4vbav>FM-_6KEgl}0Zl&YK2_QA%K57OFIZIr^MkVv2O% z6GXL(3QgGJ#J6(u!E;_aG)R=r@Tl+CsBgPjMsI#7NZPXRH$b7Evk4W783cfq0_9wEZ;mr74#$%s+9E{+n!9lI zkJMpKhC)4cB?&K=8xDSM<`Em4i@}a(r+IrPD1^yM84??P;Iu#Zai!Oe6!UCDiR-}f&(*V)^}|o)D)O(zL;McRH=(l;`k_)D z*wQYT@zdK76F!LIx{;E#eFtmqYeNSXu=}c3WEp6oSiin|T2{XyODA`$1X~;LthOS* zw?pK6?xZ5L*U}T>m@5zy7~p{Rd@+f)LD)y<-&RaIg-J7e9xB2-C0n9bik$|_f6}rzpnC^1S#jK&XG1`R702` zGFPFZCBln~gkGIIR#AzXag9KpefVcBCYA9x0v-z4+>cBotF|bdiEVntCRK?7wC3Dj zw>m$L8bIi{iEl;0wq92W{Quss>?Sa#f%LCr2S$24Gr=`SLbgh-X24mwF|HFLbjiX^K}TwEP(F~bxx<{VynMp$ zQ|Xi>;<=V$k$|;s13nX%5|G4Bx_16ktN=cyyX6dTZPj2c#cE_=ulu)v$3d~DfpyKR z^VmHvPdlvco-P8F_#(*Ah9WxMh`MbOYO@34{4aIQ6mJ)lXt7!Xs(P&>LQ3OA%OVqO zU*olgh#dWeZzjP}T2XbY^!-W#pDCiV+kNy1NGbGWz4=(a;dE!9DhbRXXXVe<3^@pb znpAgV3AQaG^RxH_pN1p6JJ_jp=jW1hW5jFI5mw%sBO4@P{|??XDfkvK|9?Uz{uqc5 z4Fg!cf}}9R4REN)k+3^$BhFDum|wVPCpVlmZ%Z3KhFKdy#lXW5mp}tf8)KkHe>WM+ zM9*N6C&#&8adcE}X@WRvXII|PBT`gVffHIxlVqG0el-r1mzV#fYKfY>XI0SjAzClf z_6N~H5#G7!&yR%01d4#Qm4-(8N&8SnaVgv8w>G`01P4}T_Qtre(blWH5ara{ul>Ut z%6i(#u_LMT)5esPgS{dx!9DI?3`UzP@}feW=#&(Pg|#*1{p!MUZY`g};o5`@yO@D{ zPD=1><*K?{(+cJHy_Yg?=Z@(b>h6U%L=7_PtrCNof>9)U`j0~Y)xAPFJYCOnBHA9^ z4i@akCyYv$$6VVywn-+k_~R93M__XshD+_X{4Bp=KMOh-D_BP*wW@+=syWJTGOg)H z!ohx&T6^u*N;Mb?u4Zt|R?Q!jkwpR&6fueXRB7{?+g6iEwq7;bFkB!uOkV06hGiNo zdL$L99Zxwp#palAys;6QJI-2aEZjn|Daa$|Sp9o2m3MJw+?t_6NlzXqef~C8qgp%P zkk`@sQ~W&iIBxg|-t&S?Jc0J(O=f}h@c}}Oq*JWb#m-&}(^Ep@jQAUvt$lZ*-%XELg|eOPp)&HacY zf^DQ$H4$?4E!+j?Io|IdpA8?sw2LiZi$Il@|D@zz2iJ6NyAC$Di=R)JWk$#5_jWi7 zZ2rygtmwlpDi;@DHU?#+%K?s5V*_!{t)Sgd%swht8vNvZDklrg`CqkFY1*oBC;j5` zU|AU#TT~14qK|@1!7hW3nM~2;)yhx$Z(vCYB;jw*eUpTgv1c%$`lWl{nM@l-Bty;vPf)^$P0n)z^ z5DM;Jdznt3Eq<=#mG1iRj_NzG(eb>K^zMd~+?%4;< zLUjBcv)M(zsr)Hn@NB=3R|%hRaNZCy?Myzc_Ff0wv*U0Xh@sz%8=cZM*XHko%X<+9 zZC2x;T#?HLq31hpuid#|7dH(UmdTq%o^y<*o)$~!jl zljPc3$^_9IvNz4-gPS#R1B;6uW2dvTe_(4K_jf1k21L35xn|X>VXK*bM(l5z`+hJM zaF|@G@>z_&#dLNm0ne!NsXHU$f|N_%%)3RDjJ;?sb*IZu@rpWJpX^!A6+0;@^!Gt# znlw&jlPry~Vuu%Y*j5wCnyRE_ZC|gKe-^il(<{y%H&R1Azi*mit4kByHNRK(QQT@I zkh3x3A!>eql^OMM&)M(ylu>LtW$7?I!D&y&O=ZD;20rn{M^QGr?W@X>uQ;yG*hv|& zYHFYo<=V-StO*lCzKNrEK7{+@$)%>7>+kO}>(n`TRfY^T4Ta0p>-XHb-%s}}oZWt# z*c)Wf%+ji^Na`4+){qoe!*=Pr2ur#f8_z?Sgs}&AIGj9jTXkcGdo_=!`2~chjq`uT zZTYn|W83CxSV~4l62=uCKZ^@$mwQojL^8I!H6xmYz|MgO%GNwo_=6M=Cbb0peCCGX3}edJSqG!9;kk^x&= zi$WQ?^`55Y8X*|FB?4j?k*lQW1HbDO>v($SON_^3dg(Tt!`(fJY-DdVQ}fZP4x-un zsMw@U(ygaKBQ%Xyui!tOvfnE2`V+xUoMwiSDM5IimT$#8L4mY#ThZ?Gqq9_8g*7LYZi$jgA$B8&{GZ!W7i_a9z=fLI5)lTkbKgQ8-2jafJ zCO$a~+R^XW8yNBEqbrr!m9NAyTA!ou-RLCf@o`ghI5kF_s%A*coMqZNWobs^xEqDj^izWn9II@=UyW+kkk3m64bKU33Xe4MkUoMhbL(ZjG;J+|8bf#th z62T!em}WN4u}|b0!*4o{4Z-r5-Ljh+Q>p2FWy^hxt4$G(=zII?voTf^a87RKcWBxK zfI)@jkCz`aay$`B_4NghO(X9l2rgJ;q5c;-4rSb6i20d<#<*J`s(;4X#GPup`)Sa zvXNId-;2xm<@K8vOJhHgwKYy?&QF9`S9{Q~FN}zCC5ZkIbWA-E^ zG|kn=FpamgOuah63qhl7qSiJ$7yfm&=CagO^Uu90wyZ`ewWj)O+dW%vW+XWlXu)f& zwyI*BXs^D?p{$YPSE;K}A2gY1kjrDj^4q1+q*>(gn?YV4u7n0%zm?Mu?ScmcA1$g} z`HQObWNoHYz5n(bUR3U!I@t%yur^C?59fTmpSn!^vtOsML0%o)8eXw`P-s(&rO7;A z*||WGl*oW6w6+U+WKweSY*)TPzA#zIWfSy!!>*1yJ9}tk`!&y`GT?tpks6u3Q|G6ftN}k}1rb3nbP%K-%>ubB=MCGX z(j;&m*1nSsSHU{&T5jlFey9Ea6>g=`Y+!A;EmKP{L+x#arZqA}NDV_vhgfQ_qqZar zs!W4WN(D*n5i}ZWRBEe~3@WXfSWC3THrg6tVy6yEwG`_{7A87Bcd95OJ_4wHX|NhFNJ=5!whR^KBvl z{kxc9yt8a&D6dm7%E-p4k?X$n96d3V7yiPvIah1Js3qr6d-~4 zxAuXVfC|IaZP%)3{UHH{L~Tz6)*%8LmDz+XIt_qkC1}FnFIg_baT2%bbH$fra?A_Q z4oKE-J-PFAR~>wj9dFR>Olc7o(|4QJ1jp?M_EGq1gU0nyEC6-gP$6=deo4<;!HO>B zK5tMKPwtw7v5Is#=VsD~G2uLl5n~`Dr*1n!3GO01u%0ZG_^b1>#US$m$bJ1i!MHvQ zEsDGEn;snzEr`?p9Sr$eug%e25)&P!Tm@3~b2&L>w-g`H?-xU(+nK{KbdR0M`P3aR zoj*x(td)loN*>}2VpwO(B9ZyFY++`i&-Qg8kV4vT_*HJ4yp&bt0K6-R%;@ck5jWNt zFfr4T>hB^~A46oR#q*E~ccq!capKm#M?~)Fp~S`v6)nO87HjX z8;lg>we2Qi0y~;0iT+L7zfD~Av-{#}*u$Sn^koIDrx@C^FSC-Jss*slzs}VbIf|yd z8hd2wzQvrP$Fj;2o!{lkIt*Ef$EMV8RT!0%9n0Xew4IGuJzxlG4~fNU46xbPpbGeF zI?A*Zc^!>s*^h>$1qaMKWx%U=n0L6Va%uZd8~rDR>(r;;abH817QT%{6j!O9@5#9B zpEICdDOE6!&H;cPuQExN`V-vPSv{vNYxnP0;rmisV+7pa?Dy>TyiM!G^*?P=M=40r z6{23J980fNd4BYK zs85_jx<_O{{q39pg|NBU8h4SkBcr$?VB9>ML~44lgZ|>H}N8b$lXaW z_+hE6mQ@hdZh2X>wS@@D{b||tIBj@3KkLY0?t8{yn+ zl4`_LhLzGvS{p|;chr%JZ!F1sQQa?ypKlH+(iGeA{{ThEB&}Viok0b60WLeY{pQXd z-k`;oHG@uxopWrhk^7rl2=%m2lY-jSzq%E`B`f^!kXjOHlS{Ma(2 zeEEbgSq$NmFH7#G8{YE@*5uSHwZ*Du#k10MPT?0jj3F&QE8hdB;Ob+EyB2E>gcjfY<8$Bq_no_3m-Go)8mF=&!7$x zY}yaRHgIZfHGw4%lPIyKoF&u@0Du%7Ey0k`m|?)3&)o)pj5DmBqDDOLsHvef#^7xyzw?fL>BoG=3 zP?;L0v&FN3OMWr%E81nB3$M#-@rB3x$nkWX(dH%3;T1zoO%H64B)>{NvP6=Sl3&yc zbnaZonS(s}z$29aZ}jq8{6W6W=7SEY{ug9%)cHRghwOaHX}sPMr)io#pZ{M*es!?i zmy(~KJ9uF4r}LA;l+SnwJJ_WuKMp4TvvGK;e-ZmadqV9$Q`1IQNkzx_VQFS(`pm>L F?jKmt=WPH0 diff --git a/src/test/java/org/teachingextensions/logo/PuzzleBoardTest.show_provided_puzzle.approved.png b/src/test/java/org/teachingextensions/logo/PuzzleBoardTest.show_provided_puzzle.approved.png deleted file mode 100644 index c42980f7e3b069b6715e1399863cab4c7d4923b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 105874 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 &o_^y#Eidi& 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 bcy<8bd3d|vgUXj_9`3qsY++Ps;27~A3ga6@ diff --git a/src/test/java/org/teachingextensions/logo/PuzzleBoardTest.testCreateSolution.approved.txt b/src/test/java/org/teachingextensions/logo/PuzzleBoardTest.testCreateSolution.approved.txt new file mode 100644 index 0000000..e31d7d0 --- /dev/null +++ b/src/test/java/org/teachingextensions/logo/PuzzleBoardTest.testCreateSolution.approved.txt @@ -0,0 +1,4 @@ +Solution + + +TileMove{start=8, end=7} diff --git a/src/test/java/org/teachingextensions/logo/PuzzleBoardTest.testCreateTwoStepSolution.approved.txt b/src/test/java/org/teachingextensions/logo/PuzzleBoardTest.testCreateTwoStepSolution.approved.txt new file mode 100644 index 0000000..0f288f5 --- /dev/null +++ b/src/test/java/org/teachingextensions/logo/PuzzleBoardTest.testCreateTwoStepSolution.approved.txt @@ -0,0 +1,5 @@ +Solution + + +TileMove{start=7, end=4} +TileMove{start=8, end=7} diff --git a/src/test/java/org/teachingextensions/logo/PuzzleBoardTest.testSwap.approved.txt b/src/test/java/org/teachingextensions/logo/PuzzleBoardTest.testSwap.approved.txt new file mode 100644 index 0000000..2c9a030 --- /dev/null +++ b/src/test/java/org/teachingextensions/logo/PuzzleBoardTest.testSwap.approved.txt @@ -0,0 +1,4 @@ +PuzzleBoard +Tile{35, 35}, Tile{162, 35}, Tile{289, 35} +Tile{35, 162}, Tile{162, 162}, Tile{289, 162} +Tile{35, 289}, Tile{289, 289}, null diff --git a/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.java b/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.java deleted file mode 100644 index ee83023..0000000 --- a/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.java +++ /dev/null @@ -1,97 +0,0 @@ -package org.teachingextensions.logo.tests; - -import junit.framework.TestCase; -import org.teachingextensions.approvals.lite.Approvals; -import org.teachingextensions.approvals.lite.reporters.UseReporter; -import org.teachingextensions.approvals.lite.reporters.macosx.BeyondCompareReporter; -import org.teachingextensions.approvals.lite.util.StringUtils; -import org.teachingextensions.approvals.lite.util.Tuple; -import org.teachingextensions.approvals.lite.util.io.FileUtils; -import org.teachingextensions.approvals.lite.util.velocity.ContextAware.ContextAwareMap; -import org.teachingextensions.approvals.lite.util.velocity.VelocityParser; - -import java.awt.*; -import java.util.*; -import java.util.List; -import java.util.Map.Entry; - -@UseReporter(BeyondCompareReporter.class) -public class ColorGeneration extends TestCase { - public static String getOtherColors(HashMap>> colors, String key, String color) { - String out = ""; - for (Entry>> entry : colors.entrySet()) { - if (!entry.getKey().equals(key)) { - if (containsColor(entry.getValue(), color)) { - out += entry.getKey() + ", "; - } - } - } - return out; - } - - private static boolean containsColor(List> value, String color) { - for (Tuple tuple : value) { - if (color.equals(tuple.getFirst())) { - return true; - } - } - return false; - } - - public void testGeneration() throws Exception { - HashMap>> loadColors = loadColors(); - Approvals.verify(generateColors(loadColors, "colors.java.template")); - } - - public void testHtmlDisplay() throws Exception { - HashMap>> loadColors = loadColors(); - Approvals.verifyHtml(generateColors(loadColors, "colors.html")); - } - - private HashMap>> loadColors() { - HashMap>> colors = new HashMap<>(); - String[] split = FileUtils.readFromClassPath(getClass(), "colors.txt").split("\n"); - String currentColor = ""; - for (String line : split) { - String[] parts = StringUtils.stripWhiteSpace(line).split(" "); - //System.out.println(line); - if (parts.length == 1) { - currentColor = parts[0]; - } else { - add(colors, currentColor, parts[0], parts[1]); - } - } - return colors; - } - - private String generateColors(HashMap>> colors, String template) { - ContextAwareMap aware = new ContextAwareMap("colors", colors); - aware.put("finder", this); - Object[] keys = colors.keySet().toArray(); - Arrays.sort(keys); - aware.put("keys", keys); - return VelocityParser.parseFromClassPath(this.getClass(), template, aware); - } - - private void add(HashMap>> colors, String colorGroup, String name, - String hexValue) { - List> list = colors.get(colorGroup); - if (list == null) { - list = new ArrayList<>(); - colors.put(colorGroup, list); - } - list.add(new Tuple<>(name, hexValue)); - Collections.sort(list, new BrightnessComparator()); - } - - public class BrightnessComparator implements Comparator> { - @Override - public int compare(Tuple o1, Tuple o2) { - Color c1 = Color.decode(o1.getSecond()); - Color c2 = Color.decode(o2.getSecond()); - Integer b1 = c1.getGreen() + c1.getRed() + c1.getBlue(); - Integer b2 = c2.getGreen() + c2.getRed() + c2.getBlue(); - return b1.compareTo(b2); - } - } -} diff --git a/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.testGeneration.approved.txt b/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.testGeneration.approved.txt deleted file mode 100644 index c5d9e95..0000000 --- a/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.testGeneration.approved.txt +++ /dev/null @@ -1,859 +0,0 @@ -package org.teachingextensions.logo; - -import java.awt.Color; - -import org.teachingextensions.approvals.lite.util.NumberUtils; - -/** - * Every color under the - * rainbow, - * and different ways to get them. - */ - public class Colors -{ -public static class Blues - { - /** - * The color Navy - *
 
- **/ - public static final Color Navy = Color.decode("#000080"); - /** - * The color DarkBlue - *
 
- **/ - public static final Color DarkBlue = Color.decode("#00008B"); - /** - * The color MidnightBlue - *
 
- **/ - public static final Color MidnightBlue = Color.decode("#191970"); - /** - * The color MediumBlue - *
 
- **/ - public static final Color MediumBlue = Color.decode("#0000CD"); - /** - * The color Blue - *
 
- **/ - public static final Color Blue = Color.decode("#0000FF"); - /** - * The color Teal - *
 
- **/ - public static final Color Teal = Color.decode("#008080"); - /** - * The color DarkSlateBlue - *
 
- **/ - public static final Color DarkSlateBlue = Color.decode("#483D8B"); - /** - * The color DarkCyan - *
 
- **/ - public static final Color DarkCyan = Color.decode("#008B8B"); - /** - * The color SteelBlue - *
 
- **/ - public static final Color SteelBlue = Color.decode("#4682B4"); - /** - * The color RoyalBlue - *
 
- **/ - public static final Color RoyalBlue = Color.decode("#4169E1"); - /** - * The color SlateBlue - *
 
- **/ - public static final Color SlateBlue = Color.decode("#6A5ACD"); - /** - * The color CadetBlue - *
 
- **/ - public static final Color CadetBlue = Color.decode("#5F9EA0"); - /** - * The color DarkTurquoise - *
 
- **/ - public static final Color DarkTurquoise = Color.decode("#00CED1"); - /** - * The color DodgerBlue - *
 
- **/ - public static final Color DodgerBlue = Color.decode("#1E90FF"); - /** - * The color DeepSkyBlue - *
 
- **/ - public static final Color DeepSkyBlue = Color.decode("#00BFFF"); - /** - * The color MediumSlateBlue - *
 
- **/ - public static final Color MediumSlateBlue = Color.decode("#7B68EE"); - /** - * The color MediumTurquoise - *
 
- **/ - public static final Color MediumTurquoise = Color.decode("#48D1CC"); - /** - * The color CornflowerBlue - *
 
- **/ - public static final Color CornflowerBlue = Color.decode("#6495ED"); - /** - * The color Turquoise - *
 
- **/ - public static final Color Turquoise = Color.decode("#40E0D0"); - /** - * The color Aqua - *
 
- **/ - public static final Color Aqua = Color.decode("#00FFFF"); - /** - * The color Cyan - *
 
- **/ - public static final Color Cyan = Color.decode("#00FFFF"); - /** - * The color SkyBlue - *
 
- **/ - public static final Color SkyBlue = Color.decode("#87CEEB"); - /** - * The color LightSkyBlue - *
 
- **/ - public static final Color LightSkyBlue = Color.decode("#87CEFA"); - /** - * The color Aquamarine - *
 
- **/ - public static final Color Aquamarine = Color.decode("#7FFFD4"); - /** - * The color LightSteelBlue - *
 
- **/ - public static final Color LightSteelBlue = Color.decode("#B0C4DE"); - /** - * The color LightBlue - *
 
- **/ - public static final Color LightBlue = Color.decode("#ADD8E6"); - /** - * The color PowderBlue - *
 
- **/ - public static final Color PowderBlue = Color.decode("#B0E0E6"); - /** - * The color PaleTurquoise - *
 
- **/ - public static final Color PaleTurquoise = Color.decode("#AFEEEE"); - /** - * The color LightCyan - *
 
- **/ - public static final Color LightCyan = Color.decode("#E0FFFF"); - /** - * The color AliceBlue - *
 
- **/ - public static final Color AliceBlue = Color.decode("#F0F8FF"); - /** - * The color Azure - *
 
- **/ - public static final Color Azure = Color.decode("#F0FFFF"); - } - public static class Browns - { - /** - * The color Maroon - *
 
- **/ - public static final Color Maroon = Color.decode("#800000"); - /** - * The color SaddleBrown - *
 
- **/ - public static final Color SaddleBrown = Color.decode("#8B4513"); - /** - * The color Brown - *
 
- **/ - public static final Color Brown = Color.decode("#A52A2A"); - /** - * The color Sienna - *
 
- **/ - public static final Color Sienna = Color.decode("#A0522D"); - /** - * The color DarkGoldenrod - *
 
- **/ - public static final Color DarkGoldenrod = Color.decode("#B8860B"); - /** - * The color Chocolate - *
 
- **/ - public static final Color Chocolate = Color.decode("#D2691E"); - /** - * The color Peru - *
 
- **/ - public static final Color Peru = Color.decode("#CD853F"); - /** - * The color Goldenrod - *
 
- **/ - public static final Color Goldenrod = Color.decode("#DAA520"); - /** - * The color RosyBrown - *
 
- **/ - public static final Color RosyBrown = Color.decode("#BC8F8F"); - /** - * The color SandyBrown - *
 
- **/ - public static final Color SandyBrown = Color.decode("#F4A460"); - /** - * The color Tan - *
 
- **/ - public static final Color Tan = Color.decode("#D2B48C"); - /** - * The color BurlyWood - *
 
- **/ - public static final Color BurlyWood = Color.decode("#DEB887"); - /** - * The color Wheat - *
 
- **/ - public static final Color Wheat = Color.decode("#F5DEB3"); - /** - * The color NavajoWhite - *
 
- **/ - public static final Color NavajoWhite = Color.decode("#FFDEAD"); - /** - * The color Bisque - *
 
- **/ - public static final Color Bisque = Color.decode("#FFE4C4"); - /** - * The color BlanchedAlmond - *
 
- **/ - public static final Color BlanchedAlmond = Color.decode("#FFEBCD"); - /** - * The color Cornsilk - *
 
- **/ - public static final Color Cornsilk = Color.decode("#FFF8DC"); - } - public static class Grays - { - /** - * The color Black - *
 
- **/ - public static final Color Black = Color.decode("#000000"); - /** - * The color DarkSlateGray - *
 
- **/ - public static final Color DarkSlateGray = Color.decode("#2F4F4F"); - /** - * The color DimGray - *
 
- **/ - public static final Color DimGray = Color.decode("#696969"); - /** - * The color Gray - *
 
- **/ - public static final Color Gray = Color.decode("#808080"); - /** - * The color SlateGray - *
 
- **/ - public static final Color SlateGray = Color.decode("#708090"); - /** - * The color LightSlateGray - *
 
- **/ - public static final Color LightSlateGray = Color.decode("#778899"); - /** - * The color DarkGray - *
 
- **/ - public static final Color DarkGray = Color.decode("#A9A9A9"); - /** - * The color Silver - *
 
- **/ - public static final Color Silver = Color.decode("#C0C0C0"); - /** - * The color LightGray - *
 
- **/ - public static final Color LightGray = Color.decode("#D3D3D3"); - /** - * The color Gainsboro - *
 
- **/ - public static final Color Gainsboro = Color.decode("#DCDCDC"); - } - public static class Greens - { - /** - * The color DarkGreen - *
 
- **/ - public static final Color DarkGreen = Color.decode("#006400"); - /** - * The color Green - *
 
- **/ - public static final Color Green = Color.decode("#008000"); - /** - * The color ForestGreen - *
 
- **/ - public static final Color ForestGreen = Color.decode("#228B22"); - /** - * The color DarkOliveGreen - *
 
- **/ - public static final Color DarkOliveGreen = Color.decode("#556B2F"); - /** - * The color Lime - *
 
- **/ - public static final Color Lime = Color.decode("#00FF00"); - /** - * The color Olive - *
 
- **/ - public static final Color Olive = Color.decode("#808000"); - /** - * The color Teal - *
 
- **/ - public static final Color Teal = Color.decode("#008080"); - /** - * The color SeaGreen - *
 
- **/ - public static final Color SeaGreen = Color.decode("#2E8B57"); - /** - * The color DarkCyan - *
 
- **/ - public static final Color DarkCyan = Color.decode("#008B8B"); - /** - * The color OliveDrab - *
 
- **/ - public static final Color OliveDrab = Color.decode("#6B8E23"); - /** - * The color LimeGreen - *
 
- **/ - public static final Color LimeGreen = Color.decode("#32CD32"); - /** - * The color MediumSeaGreen - *
 
- **/ - public static final Color MediumSeaGreen = Color.decode("#3CB371"); - /** - * The color LawnGreen - *
 
- **/ - public static final Color LawnGreen = Color.decode("#7CFC00"); - /** - * The color LightSeaGreen - *
 
- **/ - public static final Color LightSeaGreen = Color.decode("#20B2AA"); - /** - * The color Chartreuse - *
 
- **/ - public static final Color Chartreuse = Color.decode("#7FFF00"); - /** - * The color SpringGreen - *
 
- **/ - public static final Color SpringGreen = Color.decode("#00FF7F"); - /** - * The color MediumSpringGreen - *
 
- **/ - public static final Color MediumSpringGreen = Color.decode("#00FA9A"); - /** - * The color YellowGreen - *
 
- **/ - public static final Color YellowGreen = Color.decode("#9ACD32"); - /** - * The color DarkTurquoise - *
 
- **/ - public static final Color DarkTurquoise = Color.decode("#00CED1"); - /** - * The color DarkSeaGreen - *
 
- **/ - public static final Color DarkSeaGreen = Color.decode("#8FBC8F"); - /** - * The color GreenYellow - *
 
- **/ - public static final Color GreenYellow = Color.decode("#ADFF2F"); - /** - * The color MediumAquamarine - *
 
- **/ - public static final Color MediumAquamarine = Color.decode("#66CDAA"); - /** - * The color MediumTurquoise - *
 
- **/ - public static final Color MediumTurquoise = Color.decode("#48D1CC"); - /** - * The color Turquoise - *
 
- **/ - public static final Color Turquoise = Color.decode("#40E0D0"); - /** - * The color LightGreen - *
 
- **/ - public static final Color LightGreen = Color.decode("#90EE90"); - /** - * The color PaleGreen - *
 
- **/ - public static final Color PaleGreen = Color.decode("#98FB98"); - /** - * The color Aquamarine - *
 
- **/ - public static final Color Aquamarine = Color.decode("#7FFFD4"); - /** - * The color PaleTurquoise - *
 
- **/ - public static final Color PaleTurquoise = Color.decode("#AFEEEE"); - } - public static class Oranges - { - /** - * The color OrangeRed - *
 
- **/ - public static final Color OrangeRed = Color.decode("#FF4500"); - /** - * The color DarkOrange - *
 
- **/ - public static final Color DarkOrange = Color.decode("#FF8C00"); - /** - * The color Orange - *
 
- **/ - public static final Color Orange = Color.decode("#FFA500"); - /** - * The color Tomato - *
 
- **/ - public static final Color Tomato = Color.decode("#FF6347"); - /** - * The color Coral - *
 
- **/ - public static final Color Coral = Color.decode("#FF7F50"); - /** - * The color LightSalmon - *
 
- **/ - public static final Color LightSalmon = Color.decode("#FFA07A"); - } - public static class Pinks - { - /** - * The color MediumVioletRed - *
 
- **/ - public static final Color MediumVioletRed = Color.decode("#C71585"); - /** - * The color DeepPink - *
 
- **/ - public static final Color DeepPink = Color.decode("#FF1493"); - /** - * The color PaleVioletRed - *
 
- **/ - public static final Color PaleVioletRed = Color.decode("#DB7093"); - /** - * The color Fuchsia - *
 
- **/ - public static final Color Fuchsia = Color.decode("#FF00FF"); - /** - * The color HotPink - *
 
- **/ - public static final Color HotPink = Color.decode("#FF69B4"); - /** - * The color LightPink - *
 
- **/ - public static final Color LightPink = Color.decode("#FFB6C1"); - /** - * The color Pink - *
 
- **/ - public static final Color Pink = Color.decode("#FFC0CB"); - } - public static class Purples - { - /** - * The color Indigo - *
 
- **/ - public static final Color Indigo = Color.decode("#4B0082"); - /** - * The color Purple - *
 
- **/ - public static final Color Purple = Color.decode("#800080"); - /** - * The color DarkSlateBlue - *
 
- **/ - public static final Color DarkSlateBlue = Color.decode("#483D8B"); - /** - * The color DarkMagenta - *
 
- **/ - public static final Color DarkMagenta = Color.decode("#8B008B"); - /** - * The color MediumVioletRed - *
 
- **/ - public static final Color MediumVioletRed = Color.decode("#C71585"); - /** - * The color DarkViolet - *
 
- **/ - public static final Color DarkViolet = Color.decode("#9400D3"); - /** - * The color SlateBlue - *
 
- **/ - public static final Color SlateBlue = Color.decode("#6A5ACD"); - /** - * The color BlueViolet - *
 
- **/ - public static final Color BlueViolet = Color.decode("#8A2BE2"); - /** - * The color DarkOrchid - *
 
- **/ - public static final Color DarkOrchid = Color.decode("#9932CC"); - /** - * The color MediumSlateBlue - *
 
- **/ - public static final Color MediumSlateBlue = Color.decode("#7B68EE"); - /** - * The color RosyBrown - *
 
- **/ - public static final Color RosyBrown = Color.decode("#BC8F8F"); - /** - * The color MediumPurple - *
 
- **/ - public static final Color MediumPurple = Color.decode("#9370DB"); - /** - * The color PaleVioletRed - *
 
- **/ - public static final Color PaleVioletRed = Color.decode("#DB7093"); - /** - * The color MediumOrchid - *
 
- **/ - public static final Color MediumOrchid = Color.decode("#BA55D3"); - /** - * The color Fuchsia - *
 
- **/ - public static final Color Fuchsia = Color.decode("#FF00FF"); - /** - * The color Magenta - *
 
- **/ - public static final Color Magenta = Color.decode("#FF00FF"); - /** - * The color Orchid - *
 
- **/ - public static final Color Orchid = Color.decode("#DA70D6"); - /** - * The color Plum - *
 
- **/ - public static final Color Plum = Color.decode("#DDA0DD"); - /** - * The color Violet - *
 
- **/ - public static final Color Violet = Color.decode("#EE82EE"); - /** - * The color Thistle - *
 
- **/ - public static final Color Thistle = Color.decode("#D8BFD8"); - /** - * The color Lavender - *
 
- **/ - public static final Color Lavender = Color.decode("#E6E6FA"); - } - public static class Reds - { - /** - * The color DarkRed - *
 
- **/ - public static final Color DarkRed = Color.decode("#8B0000"); - /** - * The color FireBrick - *
 
- **/ - public static final Color FireBrick = Color.decode("#B22222"); - /** - * The color Red - *
 
- **/ - public static final Color Red = Color.decode("#FF0000"); - /** - * The color Crimson - *
 
- **/ - public static final Color Crimson = Color.decode("#DC143C"); - /** - * The color OrangeRed - *
 
- **/ - public static final Color OrangeRed = Color.decode("#FF4500"); - /** - * The color MediumVioletRed - *
 
- **/ - public static final Color MediumVioletRed = Color.decode("#C71585"); - /** - * The color IndianRed - *
 
- **/ - public static final Color IndianRed = Color.decode("#CD5C5C"); - /** - * The color Tomato - *
 
- **/ - public static final Color Tomato = Color.decode("#FF6347"); - /** - * The color PaleVioletRed - *
 
- **/ - public static final Color PaleVioletRed = Color.decode("#DB7093"); - /** - * The color Salmon - *
 
- **/ - public static final Color Salmon = Color.decode("#FA8072"); - /** - * The color LightCoral - *
 
- **/ - public static final Color LightCoral = Color.decode("#F08080"); - /** - * The color DarkSalmon - *
 
- **/ - public static final Color DarkSalmon = Color.decode("#E9967A"); - /** - * The color LightSalmon - *
 
- **/ - public static final Color LightSalmon = Color.decode("#FFA07A"); - } - public static class Whites - { - /** - * The color AntiqueWhite - *
 
- **/ - public static final Color AntiqueWhite = Color.decode("#FAEBD7"); - /** - * The color MistyRose - *
 
- **/ - public static final Color MistyRose = Color.decode("#FFE4E1"); - /** - * The color Beige - *
 
- **/ - public static final Color Beige = Color.decode("#F5F5DC"); - /** - * The color Linen - *
 
- **/ - public static final Color Linen = Color.decode("#FAF0E6"); - /** - * The color OldLace - *
 
- **/ - public static final Color OldLace = Color.decode("#FDF5E6"); - /** - * The color Honeydew - *
 
- **/ - public static final Color Honeydew = Color.decode("#F0FFF0"); - /** - * The color WhiteSmoke - *
 
- **/ - public static final Color WhiteSmoke = Color.decode("#F5F5F5"); - /** - * The color Seashell - *
 
- **/ - public static final Color Seashell = Color.decode("#FFF5EE"); - /** - * The color LavenderBlush - *
 
- **/ - public static final Color LavenderBlush = Color.decode("#FFF0F5"); - /** - * The color AliceBlue - *
 
- **/ - public static final Color AliceBlue = Color.decode("#F0F8FF"); - /** - * The color FloralWhite - *
 
- **/ - public static final Color FloralWhite = Color.decode("#FFFAF0"); - /** - * The color MintCream - *
 
- **/ - public static final Color MintCream = Color.decode("#F5FFFA"); - /** - * The color Azure - *
 
- **/ - public static final Color Azure = Color.decode("#F0FFFF"); - /** - * The color Ivory - *
 
- **/ - public static final Color Ivory = Color.decode("#FFFFF0"); - /** - * The color GhostWhite - *
 
- **/ - public static final Color GhostWhite = Color.decode("#F8F8FF"); - /** - * The color Snow - *
 
- **/ - public static final Color Snow = Color.decode("#FFFAFA"); - /** - * The color White - *
 
- **/ - public static final Color White = Color.decode("#FFFFFF"); - } - public static class Yellows - { - /** - * The color DarkGoldenrod - *
 
- **/ - public static final Color DarkGoldenrod = Color.decode("#B8860B"); - /** - * The color Goldenrod - *
 
- **/ - public static final Color Goldenrod = Color.decode("#DAA520"); - /** - * The color Gold - *
 
- **/ - public static final Color Gold = Color.decode("#FFD700"); - /** - * The color DarkKhaki - *
 
- **/ - public static final Color DarkKhaki = Color.decode("#BDB76B"); - /** - * The color Yellow - *
 
- **/ - public static final Color Yellow = Color.decode("#FFFF00"); - /** - * The color Khaki - *
 
- **/ - public static final Color Khaki = Color.decode("#F0E68C"); - /** - * The color PaleGoldenrod - *
 
- **/ - public static final Color PaleGoldenrod = Color.decode("#EEE8AA"); - /** - * The color PeachPuff - *
 
- **/ - public static final Color PeachPuff = Color.decode("#FFDAB9"); - /** - * The color Moccasin - *
 
- **/ - public static final Color Moccasin = Color.decode("#FFE4B5"); - /** - * The color PapayaWhip - *
 
- **/ - public static final Color PapayaWhip = Color.decode("#FFEFD5"); - /** - * The color LemonChiffon - *
 
- **/ - public static final Color LemonChiffon = Color.decode("#FFFACD"); - /** - * The color LightGoldenrodYellow - *
 
- **/ - public static final Color LightGoldenrodYellow = Color.decode("#FAFAD2"); - /** - * The color LightYellow - *
 
- **/ - public static final Color LightYellow = Color.decode("#FFFFE0"); - } - } \ No newline at end of file diff --git a/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.testHtmlDisplay.approved.html b/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.testHtmlDisplay.approved.html deleted file mode 100644 index e54090a..0000000 --- a/src/test/java/org/teachingextensions/logo/tests/ColorGeneration.testHtmlDisplay.approved.html +++ /dev/null @@ -1,702 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Blues
Navy
DarkBlue
MidnightBlue
MediumBlue
Blue
TealGreens,
DarkSlateBluePurples,
DarkCyanGreens,
SteelBlue
RoyalBlue
SlateBluePurples,
CadetBlue
DarkTurquoiseGreens,
DodgerBlue
DeepSkyBlue
MediumSlateBluePurples,
MediumTurquoiseGreens,
CornflowerBlue
TurquoiseGreens,
Aqua
Cyan
SkyBlue
LightSkyBlue
AquamarineGreens,
LightSteelBlue
LightBlue
PowderBlue
PaleTurquoiseGreens,
LightCyan
AliceBlueWhites,
AzureWhites,
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Browns
Maroon
SaddleBrown
Brown
Sienna
DarkGoldenrodYellows,
Chocolate
Peru
GoldenrodYellows,
RosyBrownPurples,
SandyBrown
Tan
BurlyWood
Wheat
NavajoWhite
Bisque
BlanchedAlmond
Cornsilk
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Grays
Black
DarkSlateGray
DimGray
Gray
SlateGray
LightSlateGray
DarkGray
Silver
LightGray
Gainsboro
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Greens
DarkGreen
Green
ForestGreen
DarkOliveGreen
Lime
Olive
TealBlues,
SeaGreen
DarkCyanBlues,
OliveDrab
LimeGreen
MediumSeaGreen
LawnGreen
LightSeaGreen
Chartreuse
SpringGreen
MediumSpringGreen
YellowGreen
DarkTurquoiseBlues,
DarkSeaGreen
GreenYellow
MediumAquamarine
MediumTurquoiseBlues,
TurquoiseBlues,
LightGreen
PaleGreen
AquamarineBlues,
PaleTurquoiseBlues,
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Oranges
OrangeRedReds,
DarkOrange
Orange
TomatoReds,
Coral
LightSalmonReds,
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Pinks
MediumVioletRedReds, Purples,
DeepPink
PaleVioletRedReds, Purples,
FuchsiaPurples,
HotPink
LightPink
Pink
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Purples
Indigo
Purple
DarkSlateBlueBlues,
DarkMagenta
MediumVioletRedReds, Pinks,
DarkViolet
SlateBlueBlues,
BlueViolet
DarkOrchid
MediumSlateBlueBlues,
RosyBrownBrowns,
MediumPurple
PaleVioletRedReds, Pinks,
MediumOrchid
FuchsiaPinks,
Magenta
Orchid
Plum
Violet
Thistle
Lavender
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Reds
DarkRed
FireBrick
Red
Crimson
OrangeRedOranges,
MediumVioletRedPinks, Purples,
IndianRed
TomatoOranges,
PaleVioletRedPinks, Purples,
Salmon
LightCoral
DarkSalmon
LightSalmonOranges,
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Whites
AntiqueWhite
MistyRose
Beige
Linen
OldLace
Honeydew
WhiteSmoke
Seashell
LavenderBlush
AliceBlueBlues,
FloralWhite
MintCream
AzureBlues,
Ivory
GhostWhite
Snow
White
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Yellows
DarkGoldenrodBrowns,
GoldenrodBrowns,
Gold
DarkKhaki
Yellow
Khaki
PaleGoldenrod
PeachPuff
Moccasin
PapayaWhip
LemonChiffon
LightGoldenrodYellow
LightYellow
From 92423aa2ca6e974124489f0d597944ca362abc62 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Tue, 31 Mar 2015 17:42:34 -0700 Subject: [PATCH 107/111] . --- ...BoardTest.show_provided_puzzle.approved.png | Bin 0 -> 106126 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/test/java/org/teachingextensions/logo/PuzzleBoardTest.show_provided_puzzle.approved.png diff --git a/src/test/java/org/teachingextensions/logo/PuzzleBoardTest.show_provided_puzzle.approved.png b/src/test/java/org/teachingextensions/logo/PuzzleBoardTest.show_provided_puzzle.approved.png new file mode 100644 index 0000000000000000000000000000000000000000..36f107835a397ebe3ce20f8ff454758732a47707 GIT binary patch literal 106126 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
M!oL2jn3 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
    4C8?70GFXs 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 Date: Tue, 31 Mar 2015 20:24:02 -0700 Subject: [PATCH 108/111] Better batgirl images --- .../logo/MultiTurtlePanel.java | 90 +++++++++--------- .../teachingextensions/logo/PuzzleBoard.java | 19 ++-- .../windows/ProgramWindow.java | 76 +++++++++------ src/main/resources/Batgirl.png | Bin 93011 -> 128171 bytes src/main/resources/Batgirl1a.png | Bin 7198 -> 9139 bytes src/main/resources/Batgirl1b.png | Bin 10342 -> 11737 bytes src/main/resources/Batgirl1c.png | Bin 16121 -> 17877 bytes src/main/resources/Batgirl2a.png | Bin 7716 -> 9793 bytes src/main/resources/Batgirl2b.png | Bin 14391 -> 19513 bytes src/main/resources/Batgirl2c.png | Bin 17539 -> 24162 bytes src/main/resources/Batgirl3a.png | Bin 5027 -> 9007 bytes src/main/resources/Batgirl3b.png | Bin 5962 -> 9814 bytes src/main/resources/Batgirl3c.png | Bin 12267 -> 21057 bytes ...BoardTest.show_initial_puzzle.approved.png | Bin 105737 -> 191181 bytes ...oardTest.show_provided_puzzle.approved.png | Bin 106126 -> 191376 bytes 15 files changed, 101 insertions(+), 84 deletions(-) mode change 100644 => 100755 src/main/resources/Batgirl.png mode change 100644 => 100755 src/main/resources/Batgirl1a.png mode change 100644 => 100755 src/main/resources/Batgirl1b.png mode change 100644 => 100755 src/main/resources/Batgirl1c.png mode change 100644 => 100755 src/main/resources/Batgirl2a.png mode change 100644 => 100755 src/main/resources/Batgirl2b.png mode change 100644 => 100755 src/main/resources/Batgirl2c.png mode change 100644 => 100755 src/main/resources/Batgirl3a.png mode change 100644 => 100755 src/main/resources/Batgirl3b.png mode change 100644 => 100755 src/main/resources/Batgirl3c.png diff --git a/src/main/java/org/teachingextensions/logo/MultiTurtlePanel.java b/src/main/java/org/teachingextensions/logo/MultiTurtlePanel.java index 850cc12..3ca1fe6 100644 --- a/src/main/java/org/teachingextensions/logo/MultiTurtlePanel.java +++ b/src/main/java/org/teachingextensions/logo/MultiTurtlePanel.java @@ -1,28 +1,32 @@ package org.teachingextensions.logo; -import org.teachingextensions.approvals.lite.util.ObjectUtils; -import org.teachingextensions.logo.Turtle.Animals; - -import java.awt.*; +import java.awt.BasicStroke; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Image; import java.awt.geom.AffineTransform; import java.awt.geom.Line2D; import java.util.ArrayList; import java.util.List; +import org.teachingextensions.approvals.lite.util.ObjectUtils; +import org.teachingextensions.logo.Turtle.Animals; +import org.teachingextensions.windows.ProgramWindow; + /** * Use this window when you want to put more than one turtle on the same window */ -public class MultiTurtlePanel extends TurtlePanel { - private static final long serialVersionUID = 1810849469483511849L; - private List turtles = new ArrayList(); - private Image image; - private Animals animal = Animals.Turtle; - - public MultiTurtlePanel() { +public class MultiTurtlePanel extends TurtlePanel +{ + private static final long serialVersionUID = 1810849469483511849L; + private List turtles = new ArrayList(); + private Image image; + private Animals animal = Animals.Turtle; + public MultiTurtlePanel() + { super("So Many Turtles"); this.image = loadAnimal(); } - /** * Adds a turtle instance to a window *

    Example: {@code multiTurtlePanel.addTurtle(myTurtle)}

    @@ -30,27 +34,25 @@ public MultiTurtlePanel() { * @param turtle * A turtle instance */ - public void addTurtle(Turtle turtle) { - if (turtle == null) { - return; - } + public void addTurtle(Turtle turtle) + { + if (turtle == null) { return; } this.turtles.add(turtle); turtle.setPanel(this); } - @Override - public void paint(Graphics g) { - Graphics2D g2d = configureGraphics2D(g); + public void paint(Graphics g) + { + Graphics2D g2d = ProgramWindow.configureGraphics2D(g); paintLines(g2d); paintTurtle(g2d); g2d.dispose(); } - @Override - public synchronized Image getImage() { + public synchronized Image getImage() + { return image; } - /** * Sets the Animal *

    Example: {@code multiTurtlePanel.setAnimal(animal)}

    @@ -58,41 +60,37 @@ public synchronized Image getImage() { * @see Animals */ @Override - public synchronized void setAnimal(Animals animal) { + public synchronized void setAnimal(Animals animal) + { this.animal = animal; this.image = loadAnimal(); } - - private Image loadAnimal() { + private Image loadAnimal() + { return ObjectUtils.loadImage(MultiTurtlePanel.class, this.animal + ".png"); } - - private Graphics2D configureGraphics2D(Graphics g) { - Graphics2D g2d = (Graphics2D) g.create(); - g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY); - g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE); - g2d.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE); - return g2d; - } - - private void paintLines(Graphics2D g2d) { - for (Turtle turtle : turtles) { + private void paintLines(Graphics2D g2d) + { + for (Turtle turtle : turtles) + { paintTrail(g2d, turtle.getTrail()); } } - - private void paintTrail(Graphics2D g2d, LineSegment[] trail) { - for (LineSegment l : trail) { + private void paintTrail(Graphics2D g2d, LineSegment[] trail) + { + for (LineSegment l : trail) + { g2d.setColor(l.getColor()); g2d.setStroke(new BasicStroke(l.getWidth(), BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER)); g2d.draw(new Line2D.Double(l.getStart().x, l.getStart().y, l.getEnd().x, l.getEnd().y)); } } - - private void paintTurtle(Graphics2D g) { - for (Turtle turtle : turtles) { - if (turtle.isHidden()) { + private void paintTurtle(Graphics2D g) + { + for (Turtle turtle : turtles) + { + if (turtle.isHidden()) + { continue; } Image image = getImage(); @@ -107,8 +105,8 @@ private void paintTurtle(Graphics2D g) { g.drawImage(image, move, null); } } - - public int getTurtleCount() { + public int getTurtleCount() + { return this.turtles.size(); } } diff --git a/src/main/java/org/teachingextensions/logo/PuzzleBoard.java b/src/main/java/org/teachingextensions/logo/PuzzleBoard.java index 513f74c..c3f30b1 100644 --- a/src/main/java/org/teachingextensions/logo/PuzzleBoard.java +++ b/src/main/java/org/teachingextensions/logo/PuzzleBoard.java @@ -10,6 +10,7 @@ import javax.swing.JPanel; import org.teachingextensions.approvals.lite.util.StringUtils; +import org.teachingextensions.windows.ProgramWindow; /** * Draws and animates a 9-puzzle @@ -53,36 +54,36 @@ private static Tile[] createTiles(int[] cells) } return t; } - private static void drawBorder(Graphics g) + private static void drawBorder(Graphics2D g) { g.setColor(PenColors.Blues.DarkBlue); g.fillRect(20, 20, 410, 410); } - private static void drawField(Graphics g) + private static void drawField(Graphics2D g) { g.setColor(PenColors.Blues.SkyBlue); g.fillRect(30, 30, 386, 386); } - private static void drawTiles(Graphics g, Tile[] tiles) + private static void drawTiles(Graphics2D g, Tile[] tiles) { - Graphics2D g2d = (Graphics2D) g.create(); for (Tile tile : tiles) { if (tile == null) { continue; } - tile.paint(g2d); + tile.paint(g); } - g2d.dispose(); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); - drawBorder(g); - drawField(g); - drawTiles(g, tiles); + Graphics2D g2d = ProgramWindow.configureGraphics2D(g); + drawBorder(g2d); + drawField(g2d); + drawTiles(g2d, tiles); + g2d.dispose(); } public Tile[] getTiles() { diff --git a/src/main/java/org/teachingextensions/windows/ProgramWindow.java b/src/main/java/org/teachingextensions/windows/ProgramWindow.java index 1335f8d..d876659 100644 --- a/src/main/java/org/teachingextensions/windows/ProgramWindow.java +++ b/src/main/java/org/teachingextensions/windows/ProgramWindow.java @@ -1,5 +1,15 @@ package org.teachingextensions.windows; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.RenderingHints; +import java.util.ArrayList; + +import javax.swing.JFrame; +import javax.swing.JPanel; + import org.teachingextensions.approvals.lite.util.FrameCloser; import org.teachingextensions.approvals.lite.util.WindowUtils; import org.teachingextensions.logo.ImageBackground; @@ -7,66 +17,74 @@ import org.teachingextensions.logo.PenColors; import org.teachingextensions.logo.VirtualProctorWeb; -import javax.swing.*; -import java.awt.*; -import java.util.ArrayList; - /** * A window image Program Window * allows you to change the color of the background and more... */ @SuppressWarnings({"serial"}) -public class ProgramWindow extends JPanel { +public class ProgramWindow extends JPanel +{ public ArrayList additional = new ArrayList<>(); - - public ProgramWindow(String title) { + public ProgramWindow(String title) + { this(); JFrame frame = new JFrame(title); frame.getContentPane().add(this); ProgramWindow.createStandardFrame(frame); } - - public ProgramWindow() { + public ProgramWindow() + { setPreferredSize(new Dimension(627, 442)); setColor(PenColors.Whites.White); } - - public static void createStandardFrame(JFrame frame) { - WindowUtils - .testFrame(frame, new VirtualProctorWeb(), new FrameCloser()); + public static void createStandardFrame(JFrame frame) + { + WindowUtils.testFrame(frame, new VirtualProctorWeb(), new FrameCloser()); } - @Override - public void paint(Graphics g) { + public void paint(Graphics g) + { super.paint(g); - for (Paintable p : additional) { - p.paint((Graphics2D) g, this); + Graphics2D g2d = configureGraphics2D(g); + for (Paintable p : additional) + { + p.paint(g2d, this); } + g2d.dispose(); } - - public void setColor(Color backgroundColor) { + public void setColor(Color backgroundColor) + { setBackground(backgroundColor); } - - public void addPaintable(Paintable additional) { + public void addPaintable(Paintable additional) + { this.additional.add(additional); repaint(); } - - public void removePaintable() { + public void removePaintable() + { additional.clear(); repaint(); } - - public void addMouseRightClickListener(MouseRightClickListener listener) { + public void addMouseRightClickListener(MouseRightClickListener listener) + { addMouseListener(new RightClickMouseAdapter(listener)); } - - public void addMouseLeftClickListener(MouseLeftClickListener listener) { + public void addMouseLeftClickListener(MouseLeftClickListener listener) + { addMouseListener(new LeftClickMouseAdapter(listener)); } - - public void setBackgroundImage(String url) { + public void setBackgroundImage(String url) + { addPaintable(new ImageBackground(url)); } + public static Graphics2D configureGraphics2D(Graphics g) + { + Graphics2D g2d = (Graphics2D) g.create(); + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY); + g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE); + g2d.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE); + return g2d; + } } diff --git a/src/main/resources/Batgirl.png b/src/main/resources/Batgirl.png old mode 100644 new mode 100755 index 19f863f01c43ea7d684326b03de044fb6bc1a4c0..f08d92c13068b496e1fb8ed97a97e5f5e164ccb5 GIT binary patch literal 128171 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%0AM0Qrfi<=*w}iJ5ZE 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 literal 93011 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 }`G&BZJMoNeiu+mC$ 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 O0000CTbeH-v7~e^f+)2}cPqK1(j_fjB1j95 z-+6z$bKcCkbI;s6_m4aAnLGE)2a#Gu#%L`KMG`_9LJ$ZQD;au$KtyE!5qNwtm$3(dz^?a{ z1lsN50v3DfUe*CNU(9ndP9OBX#9;&OUkfI?pD?j5bQ+1S^PaaC8a}8Uq6j2 z3A71rQ!cP+MvFP6ezqEFNz7rW@_9K?$7E@NikSmmZ2LugQVftrGc)s zL_9~jgZ-MCx^Nr@Z4(n4|8L{O(z-ZM8TghYv~*V_0k#H^-g=*tCUyi}{yARn=U(oJ z!MJt)JG;AGUk2_DX58uVLqTiQaNOwmJ#O)|RpT=*7kZ0>;tc0nsY=1^!Lyp$Ghx0) za)Kl!aQJ0VvqWy*_pKA2xZ$8X?mKS@zxSkIT^s`CQUNu@OiM$&-J`<=JW!5;^V6ym z#~IhkMPuN=0S^|2j-fU~!r?GaDRX-Ij^*X$ml6^ZQc{uB(p zeYE`aMMf+-OqTZYa>s!>YT~$Lczpva9F8PO1e{ukAl`ItMu+p*@`PX=Ta!Cv-p4jn|0Nqa?ufkD#G@uwVWHUdJ*>+ih z=n2lWhUS$Hbjj-vX)baO<4FtGH)7%2=w!W@GeD(S@a*W}Jb&fpE3irxv9)z_ezXjL zPczIz7z?PeRV@;DYyL(+#)@$53@9fd-^*u;z)cBx%fcM`5Mbn+ZE-#CUE?$Ezo~Ht zU*1K&FWUPQ#{5br3WWsmM!GkfL|Tf_KD>3eu!CX!@Sx?+IN>3E;5izIB@kQf-0o1G z>xHUnZ1)5;biQy)I%8mfF@yyhIpG1UTragL#1J$-zprQoIH?{-T2kXdMHd%yHHsm! zaoX@GkDw4K^U+5LNm^1kPIk$`IQ&5IsD9kkwYe`|$ggWx)3DC|k3mRpMa`IJC{{k2 zwRtG~bGslEs%;~cmlri84{tjGxl83mS!(J09)2#1-2Ml7F$^tf!cN%{H~^XkuO^xO z7KKi{UFkmKj>c+Ebl1T;t}3Cuo}|zbR~rK+m{(9hNQcP_J5l*xK~hnW7!(;Si3tw1 zq!MreDc7DJbvT^ekQFYXF9=VJ6M7m-pTl_^HvYaDw%eb7UP}I=+C@2lwVTd5C?J5Z zNj@{nIu5jw>$N0$)ON1K4iFa*8sakMYxMed{tb9yTjRALl;)$!d)n^GAh647jur5H zwm~fXvPM3Ohs`5$Uz~E(-lp1QP+Xrl(oUVvsevk{Wp(pZ8a%6rQ!b-=T}5o0iroO= z4yXpxi3dPNiW(-cvb)7*9x!7jdYkBy(0$bXmK55a708ziF&v7U04DjtSO52L!jz8G zK=mu4s*i@j59i9W_`GOaX3XeonP-M7(MI_7qG2Tizn_IsuwaLlFBge*s?Zb4Vo6(i zz`aF!sO2*gNteX8^0+geYHod9AyqsIre3$DejZn#^h?6ujdof35#{TDgKI9fDn{E4 z6*<)ve5J4{AB3@X1n}2I968pEAND%gGkegP%*%OYdLT_(usRJM4yJ$*fZ)CFynY!d zLRd9F;1h6nUwG5QIGf+Synw9p;32e_K@3|+R9H+Hs451T|A}D9Fyf=0)NAZ&8YuHU zcCpk4{cGUm*)TKe6~=DQ+27uujqcfc?d}?jMKOdKMi*oQ!GYKL?5|EQ)U>6cW* zS@}y`1Mc@nj_83zi(UA+7!|2u-)E|Lffe;}FD*O*x@Xc9q`ZC9@;GCGM~HAf8MsQ9 z>$);rB|N)Uz(CF_+t9Lry{HK?bDBS+?k1~$bpv2EEqq&0X!Ex3vPTQ`4-R@1Y1Q6X z$8)05pVV~f!XBRlQ*qQd;lif8b5*Mcn< ztg&K+j;(9Rcny@N&M@PT$@XDm!nJINxJ?2xIhF*({l-tq0+0D`p;VXr6B@HiDeMqn zfVowpP`OX*NwIWo+j_&{QUa%sNyoF|5IIsE+QS5E?2_6Zjrgjf6t?m(<@sWqHnle_ zDmL_T$l>1ZNiogjT{}Debog8(S@zP47|pE_cEI&*Ajxr7>CdXSs`bx6*nVF9nJvh8h-N(~MT|19E)zirZN|(?<#8NXb?uNhr zeB)i1sU99|n(OU%o^vhYw19Wrw?Qq;q4R7UUo_Gk z2at?pHj^VAG^R4n4_f7_Q!d;@j)BKbPRM1I_^XBC^5>*^14aa^EQQ~AS&fyE$>&=F z2I@nf{TjUzXk(SepmS_!A0?3Bh%Ss!wW+ep<6uVUqS14fm_AyC?TJk5Lb&6ZY1t^JCB)@Yarz;%bOBc$XD;e9!yifQoRhto>_%N2 zFr}94pHX|2sC8=YEus>7$s{(I?$p<}EHJFB91Lx@U$Y5Jk--9@&C3GlM74}**N;qG z$hs6@-Rz&razbkV{p*oAV@ntFfDUP%tOY!QPzqdcbCAhVmrGYM+cWnUGo;u%`50Rk z>}B=2`qs^~5&A}P-26&1P@XykP)VKbz5_QgEC_*c>V6NNCU7D|hW`uK&+t&Ku<+kr@q~que@HFSExRz297J4=WC}FDnbvBMw;rceTz=X z>4+9XND@W{K|{W0J11yYdP&2j%LDwFVk5)Nm8*(NX=93-eS!0M8tzVJF;X~SjlhfRhUYGgFd zCzVAWs802U8>u%)@i#jxU=%8FDSTKJ%iG4p-DfIVuu-fs6Um2 zezUi&W~u%mK?HmqUKiox|2&@RFX>9ohLTrj^>q`@&bxU<(ovu=ebYx0RU=@%1a|h! zY!yZzWW7fjKceF-1>OoGhYcrt@jzXCkzZ+bsEJAg-Ew!E-oVpyZ+42vJXpf3TshdZ zDG=l*e6f_FzUg_`Xmp96=Tad27iOI&2I-X`FYqW>AF#zj48nXAFiK+^623Mz~LrDUt7FL%2kH(_`?#iCGa&TnHa;C}>QoxZsHPXEt&uGRKRgW@GvzOCX;0 zgOse2>_~k}l_>#Twtrj`dS0YZND?)9d~MAjwH5v+w8+*zDI9}xq|JT~CxpdNaTlkL z2!jbwI5VxFk=4VI+uR>u_CwC=95X)+CN)5?v890a;{^Y>4aPEw237|C5`@J%sI~h; zHck#-4*8r=Ig6nHTWfS&eTgZV0|G4xE8$`D#A1I2UA9U!PF%OF4IQ98yuz^-wQAKZ zpldgws+xW2uPZ%7;RLr)K$~2(rwom;wq@l^m*l5^&)~tu0`b(M>EA1EnLG8u;%$anK3WUTs01Z*+a*i9^+A)HEs)9Fz{WXTiK zVT*$sXWwg&$`lWqYK87b0V8C}=C|5;tCT~CAy~KeAG4woTFXQc7lP2P<}6kE zg-QPWL^tJ$VN9!FT3|6ymN&-@g#51j7y>9i-xC~hT6D0ru=phy0k_LiTu4Mv;u2gs-F3w(BiymS7!sSvnHlw*X?*kiG& zj)=wt9-(x`s6RO{S&n`e%P&!id;94Zj$P-m9h)8pV&OY_KCt2sW$qCxkmRN#qVG0l z8%z{QMAFX#*wgm&;EBWGNX+#+CN?zfr(*@n>L?SijIQ-F#b@4i#I9#c0z0H?l*q~c z`HnNfr>^gFohkAtdS+BsTq8PWWl@Kws@wJljO!xvUc!Wf9Ez}`+^H#kelQH?1!uOO zI?uP0RaBi#fx0*!^aubFX>S(Oqk*!6Y0v1H5wz%Z;?IOsbo~9PjHDjlE-@N^#J|eq z{OTafm|Ys*Bl~J#z17*}IC$oIwe_+%=U3oMHT~T{GoJEnymOi)@92^qh%B`zUvjM- zWHUPNsaK6Vf>IYQjn8ZH;t|!ej$_B8ns$s&RxXpdD@O*4t}3A8Kf!bJnFJa!SMYOq ze}IvJWg#kBF^5e0b$5u6E@SxC$q9A0c+)47z#Q=Fqw$A$qxpW#d~@U;{~j0pN#~OM z%Up2jVNso{l)4ttRZ3hKP7fw3h7~}%Cr-TZWqi=?D*Mm-u`?2elFR&zkogT}-JJP( zj8gn*fDBDbk2C=9kB9vU*1*8#L-}kBeO+>M?^;eT2A` zz-OI*Z0`3-3K~wp{gEkz7vPc-qR@}}<0pJJ4=qMP2GSDjU7PX`Avm|DU z6=CjCJ|6f?pku9vUnX=6tNgY5UT?h~Q}bhu>~c4eJaE>=mwc)`onM}eHL30px#NO# zI?*J5q+0LI5{1m*m5?&m9cX0=tDQrTr*4gz|i!7AuZ;;gifcuhsS|*V`S^04LdFZ4bSE*q8$0%}MXZnNhg;6XG zDH`0zJY3&}HFRi&quqTudpC^oYI7byRZ){o_wQaprBUp}zhiphgX8KAZP6U|@p5*A z2*J43v6b-5Z)J4gYn6|(+*kLN?Co>LofnDd^FFqag zIi|O;UyBI(S?fTD-7~w(|MEayJ0_?SgEB9V`zIzQYD@4>c!-gHBD5OCDewfwM5aHa zNqs}Mv|-|O|Bfwo#O#Fl_fX;=5<=#BI1l^Q2HrlJ^6VIijFoMTE3`q` zjpAq$xp8&)k8z@b#G8q%t>gMJ>d&4=o4Leu{+<)11xFnV?e;%Pj*g-qy%HSN-V!iY-~uV1Y191qP@ z-d&s?Pi%dclH-5iF%3MJ6go2L`@}CHFKroouE` zOx7p#^9L^|LsPsG+Rk}~BZ?9j{z3*?GSd23N>)Grcr}ArY_3&_U)!qG9 z0cOLqx%2LJ=cM@M%iya&e}_&kzu@<;AIFpqd(=AkI-N584H|hvNpZens@he-C|Y`F z_D#$Op6nfqF9zs~`hN&ReJR-?(V3Hf945*M9~FIyo%cOMGq2<3YVYZNibUjgVdvi4 z+>@;>dzh~ny=HL=*W&f>i}i&@x4f6Y?ZxH9zw@JY5wWeqrFQYf#r8jzP!pnk*-z8P zo42eB`w343OmwY`>fi$fewlk=*#RLEg%%O%f-$qMhl@oXpKNi%ZH8+8 z-R`+90nHw?PoF+L>I}KQxjdPvG=KUb?}a5qThUvD{^ocEGk3h_F3g!Vib9q%OvaDZ z=zld;-L(6-cqPnTm7|yV0RdRNHBJh}=xu9*c#rys%ggt4D!5_yNw}xL&GF66&A~#W z`O6@8rI#T$e)lCPC>5g={=iovmqG5$V>}G-{v-9z!j+M1u;A8D*NM;p;$IFoXkB4P zn)+<)EVJsx=E~WEk76nH!3$zU>lDZY%I|X2Oq`%t1}w6~kFgpEU2RI4Bt!65QMVb4 z39hao4)|>%67`anVvTz3epR}u@8OAwCd!gpF(C;D+B!fhMd_q+j7lWlI%@JM2t`x`{cu{AJmm zvDUb!Iq7GoUDbex^_4z`-3G8OI-f}FHbgESruhX(?ULBNiS&v8w3%A)Ef;uAz)<8v zn3n%LF(E#pw2yN}H;uZPPP@AWWV-)`$anPD=e!DTnW{d87P9IG$A6uc7#4M&@H98= zXn^8q<*N2uC4VT!z|f>)^iyw9Ig1uLE;@+EAR7(9egDe6vz-#80zLi=ntjm-O<>aj>eMppV3)!(bz6VtrMkca*6yhMnTL`(RfM&Fb<5-{$MimO=| zA3Kd~Xid54;sOYb>S@|^w5u+Mk+F9O_gap_+#_cfdhd0yy~nk77W=&I6#N4Wg}-%o zFZn_dCMRbn$uVjyMO9~x)(&Qki3@dq?2qHPS4PbD5feSRN}Rdr zfY+Vb!r?@IA9+3aC8a*`is3%-A}WKYa;(<(8{8c+gaotKjLqE4;d{o7nFZ;P3Y2aC znTD|xu!JnuB%H}{E|y71(*4vu-7+Uhc{P2)A#|odT=|LX>O)Jkc0t#h%9=+=q`Z|4 z6@N;Kei&f1v3u+%z}s(iUBQ(gsq=HFAi!BJ?uVjJMVwi~YRueE0L=5z;P>1I9}c2j zSQT2K!elU)M*nN^T27D+{whidgkB_?y<#omxZ_rqG* z!kR+b6THl6$_tf@`OhoV@KoA0!o*X1WCxpa_>O_4r=(E@YLGF}EmLz7qc8T4qwCi_ zVu&^59Oz(8Px7Z)JIp+M-{JHUHd@PZ=k<~>X#n#Xo43^mEQ9Z%hQ9gPnfTs`Ixw^k32 z-x${m8NPr>tEi?If5OGe`BQvz6U9FBD_@BzBU+{?)O&5k;;4CrS`L3Hux$NBh{I!F zI8Oe+;MYA&C`WQTW21HZ4SkS3JK%d*ov`UrDAwArr_R+Os%AZxysoD}B8PvrJsY=R zsbgszl)qT$+$B6YsV^LV-XDPXtHy3v&cX@YkX`4;&U+s|tJTHlL6ZE>madceT$OEZ zTWR)9Pi zSN{_M#PSAX-D|xY)%lu6f}cjpz}0+E8f@Jy)KmTxPk3Ldc$#vK(gP{`nS(4}7DIpj zDSom2kB}Z%?mfFX^%~RR;v(s&`GQ~aIm58 zd$Qhgi_y6e**KLyR2#8{`lcT~^Cr8))p~6s^YQd0TLgWNX}zf2m!LDJ2dit{^HY^; z3D=~p4nu1wKg&Tq+ojw@YbtFbJ*OOeh0~>lPbCh$V%g7s3nLhSzsEyQj2dT&>s)gQ zWOlnfw#G1l|&3<=4F_z`JXPG&8$a-$jE!Oz*a(U@VjueE2_Yu_Y$hmZlfd5%N zj1dQuCFBwWlN+6c+BXey{sO;6#~gu7^VKkZYnqS1BriH4+N zPCJUin-eZ+BRS(61T>ju7j3h-%@lR-O9em1ZhqmEcdA96c|XM3ub~h8!uhjg#Motl zjG*L*HcU_HjcJ>1nZWDfJ$n~Z2u7uv4r6xXPva5LI|Qnms&*sTAd+_LEW){oS(utm zQ45?XI%fmc-p2dAq5E3KD^fn5+Z^bto%^B`1-sRE8vdRT(yosROvS@hjio4alEqAXqv~unyuifV~wkI{qn|vO2beti0Q-XOhus2 zOAYSR43}E({^u(X3cHw3@N%sr_lP!o;#a@?sA`Z0j8p<2E_yQ><-9tzsyoG_zerzD z%c?7?>0l6f`QTyfyTBIl_c(fqKGEB-S0eA4V*fg;9+_p9zwe+r&E8hQ$h0{vXu`q@ zC0%w>M1P|4l$F9Aq1aibpK%njySI>>Ux|laMC8c3Zn?Xi+U%4!i1Ypn>>c1{EH87k zzbmOT0-D}F3l`kL6Ex@IjAg~Ep|jd+-AuQNawIl7m>fT-2-U!@;w)HvIFn|s^Xqqu z&(b?V=Y?N?bq4>kwHXVxo47r;a4HTmQ^hZCc|zs*k+aIQhmEODJ24q=pWe6=QA=UQaaw)5V-vX7m@0;OZt!k27eZ`hGiB=zUYrILzk?B&_1d&Vq zAlW=3$d}*%F|TXX_R(wJ9m{G^!AL$Y;?;qn61XXju?m#jyTRVBHfffm1M^dkVkoMo z71Ww)EftC{B`nP1Trj{MK7c!P9-7CZeN(&YH=6BZ0_}gHq8!TQ44TnZ~W%gY{f z;5DD?be@4neZgPmo1cn5PG=gbyd&c5Sp9dlXziS&U~A6eEpOm$W9e-xX6=U zynS!CPB*at delta 7116 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 CVKV;! diff --git a/src/main/resources/Batgirl1b.png b/src/main/resources/Batgirl1b.png old mode 100644 new mode 100755 index b43a459bb65102568e2654df2c36836f1a768352..ae5c30e130dbeb86c56a81e2656a68f7fcd431b2 GIT binary patch delta 11686 zcmZ8nbx<5nus$TnVTThSxCIHW!8zOshjS#jhu|D?IEMvy2!!CS!7Yab55e8t0|X23 z_|^O4RlV8j?U|nK-Kwpb`M&Pz9j$p|`baGeMLZxS5C8z+DJy|>o;B=0!9sn$KfV1` zpFmFxr?XJfQGYhF004oZ0KnbzRNx)};K2g`9J~hr#L@u(a+mB@ZSm&`40BaQFyQIG zE3czC>Dhw)Q9;4&S^w8y0D?Q#y5|nIi<0595r^nMLHWHL@bB4(>8`9UkGYCQOM=I< zC+Ua(-*cWWGH@FJ0LA%P5&(Nh?0W!!lR_CRqwBpe>VN39)t|EJuZyxrKA1tjTbhwz zIecDq-8--TN6@Cr@v(4A?y-MVS;Mho#6pEW8ARd!68E)2xI5LNFK-iANZTK+u^tNu`fj zulipvFE)LQK+*%~C#(-WIEF8<%GeoJd?A$|v1x_I1>(*GD)GSr{l662*30ee+MG(R zJseS6=Yw2a7rOxf9%x|sICgwkhHXnZsV&4Qu#qaXQ8J>Mp-w36N_$+-zhmC5#4GfM zA5PPJ{03bbV45Wgmez%w_W9D%catKrC@Lj=ULDR@ETT_c&)^Yi8@Q?WA~lPyCMrp0 zXY?p;pmUX1zLk-lmQCZ6Fakmn85#L@w<-oUN4}Ds%LYk9ssa37VPEJZcNI<6u+^&* zU)JMSN>0XqgrV)?aUc!G_oHg;2T*)p_(ea2Zl>h|zuD`Z^77KcWa?Ch=vZ!WMmHIK zedGkLN2C!U0A00SMm^#gtN?2J$SZYLAGE)e!GJ(Cj$p{-Yi#F^^LIcQHM-6%>KrH1^b277uS*_ z1smQ?;hm;?%g|ND(9}{}dutg9xTC!Vkjeo0*?P8Zfx=}}8TFU(eruxe`r__8FYg=8 zioOOyZ%5%jiQa?^bWsTMQVQW0$2=u_DdM_Lzg(|QM`2!5ud*!qVL}`PNwMSr+v{j=H^5%1Y&xt+~u{C;bSQIwPf+_ zDuD)Qm!Wi5H)#mW@JZ@E>)f=Y$@o}sC>Ug&4@0G=k2l}5d++zbIWU;O+<){4$Ft48 zmPObzYr=TfWq=C-WM=>dDk0X*NKQkHf&pN3tRP;8O0KH0RiX2_1vb4QbGLZGSh;1b zkXRHVI(nU}Aobx%(!bMiw5GEYb<}x*<4mM8v1gn(rX1 zs#`8C&7#D! z%dvB3S{oMgwVkSDqZm@=br*&@O$~FBsNS^42Eouyp>||t8UxXSe!!L4vrS;m@ocQ% zz1zdTx@prxx@NdD4-AozL70F@NJrrIr8KrfJ|f#^yPY0dty3yvUEq;GLA25viZ_k; z(qO{Vj_M_{roCHA(dw%*dLfYR2OJOXE_OBm1UEDz0TCbB0@2m0O{Bt7NBP_0Xr=qs z@#hRmMS|bE`+icxPymRU<@}CIOxd`4;cJAT$|_pY5F9ts6llQDPo#MEvDs}lXz|Tr zf6vGASjYR;23GwzG22Me72}bcvAlB^(#5u189%z1q6wiygU68K-1) zF3St1Q2T;b_%ISS1&i;@k6I*5|ZmeHRA_&{q|RF_>qK zZ#^#2Rl@yRe2PTVjeiAfme#OSq<%Tst2Xj1oOhM`(>VW1a3c?ESOepv1&I|?P#IK& z{n}p3!>wq(AK&(SU`u}X5rD+=&F=@&m4!)kfU1z8y3AHBn8_o%c=?HhHVjMK0r#Pz zLle?O>Mr>CtHTrm0;>K>M@00=lJ#7`+~tx|+YY{`$JOl=_o zfsUOHKrGmEQjTr6HVLuhTY!nsKdF zyyb(k(@z_4K~Yy*Ed}LqDaNkoi{D{uhiF>wnWQZlfKdG(bj*h{-&~a}gAY0uLCq;# zovcNbl+beCmQQsbwjdhG;R;K#i_Poprq|m-nZ~~x-!R)8m9YtubmqwsOIt}1!5P2G zTHW?zVwl$aZo7_;x(>T>GMxE7PyxotOm%yqH5%X*SMK?#am>a6oC1o>pmYuf4Xu^j z(W92w;zqs(O&7HrMzoz69m<0trfKUlDh{P^<9ggC4@RB@ z>rA;9o`uGWT&??ork`rik4*svwRQ@E;hJ1{rzm7qm0P(-&4XM}JR0`zf!dhmNrahb zD;u^`)=X~4RjJ0AGQ&~Js*IBv!8MMyELU;XZn~AK9~apdG0$K9J;*Fsg2N|t(Pz)7 zEw)h!D0yF_KweAE$;PP1T1C@(PvR8=dT{j2C@l&YDAT>;qekd)fB$^Muom+DT!VLR z%n>YHcRD&ax8>?USQh2(ASGh1`;w&b#df1zxYf{59aMd<_Hmqgon~yd&3ji$pLZ&B0sxK1gW@_|+pkxwsIv6h^_!OOe zhS2o0c34_rrVbZ%6j26hTX0@I9bFPmLhTw^gc?rOyLNfX-rV^w_PA|KX1_qQBsVOM>aBh&<+B5(3TufbdAH zuTTaf(J~j+ALp@13|sd->trE`&3n0}C~rYHp7nBj37?Cth51HVh55ngFW+|^I2A%V z!i4n7?=|O4+SFaHw_}7By+GXVV+b z$A3~pVD1hA>&}vqpce(1Syq~vsrL1HU+oY?5aOjXmYIl_N}9jKuhgA8$u}JSDmFfr z({sv9v0zSH$@;4=Lm038=;`v_7p`$HS{D@+7)-u`A2zp@c@tpO@?TNQaIx!;e1B*e zf?j+Z&90`(vbAz{U|qEA{vA(?ov_(ag40L-VH3qqiO zuZfv~+cRPm#F7T7gz60U7kP*FA7Is5ql57mScO2V4D8q6jG9;1<|PpyqdH+44(}Me zr9!?M@XwR>P?$Fl2W<|`kmA)ts8C6RiCPjg!XTnX?M|+!HiR5`*nz*oPisItgTkj?_C*84~?nC}2wIinaYw~OF`1=YZB4pbEmNk+8YgE;1%q%sFZw@%TebD+o$Pa&$8c6wHinr zk@(V*`--+^`Yj^i%>ClhG}r}C5Jx|@(*9jy*#TvlNqCgCe!31RonlcTxEyBSYj_xi z__?Ux%jk5c#@;#~bBNk-2XB+ocib>?H&?E1_BoaamEib{{g!j-`2azJhVjsi)irUM zgo#Y`;*Hq{=Vrjz)V5!br$1A6_6>-J;LA5a1WpuM(WT(6mX>VKcko>)T*gmgiAtSa& zV97qhk{w!gZQ1)xeU%Pb1+R@914?k+Nvr8U*zWTLWp;Eg#8O3|u9*sbcW?mcUw)gh zIdQr2f3v|cLK3MYADIc78d!i*3KH86DFim-*j$(cK%~i;cDkZFu?=4_P%4yxSR}U2 zVMkRh*k}gBb92VJ@Rc7&6_3Uz!#c6G84w*AZDfT`f=4VPKnpjYd%ZLzi6ue?Oo(Fl zX0b+2C41wJK!AEFYv6&G7@Q1o4bN54)x%DYs^xLy(s}7r0T~!bRHCvX_#~GGiMRs( z(jxrR?>;l6!KPmblZpU&nRU=XJ#*WsnwXOvTW(Hb-nKHpc@AcK>{s*?4UYh#q08XJs3?`PU^-N+VClL`#ZrMJ1B>fSO4dM~i;}e+@AS-j zZe+@|1sfB*Z-sH`t>J0qUO-$?O_Y%A$d8`P;@K!g-AncWqYQYIiW0*{5038ajBiGG z1Bb~U_mUP-I->BQ4hrXp5>NB69gL+9Ri!&eUZ9lL(jl~pf_+_bbGJbupWVcLdq~&x z?=hn}EEGiFTke%QLamgieECrCJ*4HL!P26BcvZ%C;( zMk!$yhc1u)cQ*(TDW@mF7S(G-N)6~vA(ZZ>FUL$PlA$PB3TmD8({Z4vR+rn<3?Zlx zd10KKevm*_I>rWohQ7q=iB@DVZ-{K1!C*}KNr9RW&$(BK@7^~$h7|-*M(OqCGF@s5 z3^s?4QqHNCz$(Z1c`VohbO=x>3ed~IOPjog-u6+| zt6z}(!^GO)@Gwmvv|TSF0~M%~m7s)(*@NUQS2qM;2_l0t8%Qm80V#L3~+BMOXFLSlUEPmupP=+KJ^4SZ2{sk5Cb1} zpcpALIDvh-`L_j=1{x?4uk)zReZ}Wb@JMO~h5Soh!j|v)q-+P06ZI-1j*(nca^Z-O z_7VnrkbBX4-$#!UswT^WsdnQ<&flbNB(g^KBTmfH@|M;XxWv9XOmuWwTGl$+d2sen z<~+LTopvaCLabn9Be1OXY$a{%oi-5zF=MEqKzPOkTcExfjCDgk41`<%m1&*ng98F( zP)6;Vwd@E#HvBLLye;{1p!Khp@WxwsY@TrE%wk~J_>7Br?1w+oG<@_#nrcxd84`Pa z@=joIyS|L9P(LLyvavsX-cfH02d=->Z(tGAI0Hg^4<#d7WO_ebLUNtKP^~4lJH?o9 zBo~9)!&{UO68aeN_H}S&e%&^E$?_L3MRAQBRMapmJ;t%<{+h;q9#O?W3cj64r9e<} zh%1dfyax@y4x*#VO6P2hY*foGnlb3Vb!1;LW^qW5EMNnkszL-DE3AYda4rtIyomT; zacrQagrKlMAOKNjdo(;gpeBiwZ@kj)(K01Ni%9WznoFZ;an^RMPWR1wb^CC-Uhl zS`64R5RZ@o{2J$VG}Bk)$=cptp46Tp(k{_GQNu8KcQ@^6<*;4qUf}!%f{~{{Hm{dy zqCo~#7ieNk44rus%7$UDc5-J-n9>v0H0sdKz)s2mF|Z(MPNY+Vll0&RXv+d*U26_P z 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 delta 10284 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 diff --git a/src/main/resources/Batgirl1c.png b/src/main/resources/Batgirl1c.png old mode 100644 new mode 100755 index b53eb50bf24782a9309a64cbf8b03b537b4a1104..b0c43a004b6906c34c6bc12f34d5accdfe7a8f42 GIT binary patch delta 17875 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 delta 16110 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 a|L*{{Q#*ZBCG*2JFGX23M76Ye*#7~={%0Bh delta 7638 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 M3+05YLHH*92XKwX#{d8T delta 14366 zcmV+(IN`^+m;twNA&F2a-6A}q< zNLh0L01FTR01FTSts}j4lSNBqlMGBFe>YP}L_t(|UUj?&bd%Sb@9nwYn(xlcmjLdP zt=@aLB-@hZ-h1yAgG~)BAtbbf-of;0zy=I%828=_Hob*TsA-UT%FH=4x&K$2IGmjO zc|B{dtyi+~Z~veAO2#25JT@>a#u5-_4GhOVAT$~eL!%PHW0GJ|@u{&%8DY_Jf58#a z{vqMSY{6l^{y`>-O>g!y`UYr?K5BzmXY!G2^lX8c$>+1}UknDr)6=Q}bak2P?DXEWsW3cr zp}9|Ue9zJ8eHb=Vr~Q9Zrv3*Ef17F3rcBz@sqatP6g=hhz7u|o>ogZPM~9He_~3{* zpkf2O=!7&_TyiEXCNUjX5>m5c5>uiRk|X0134CB!WI$*H%*)5$WC;YbN^jB{y}`^A z%XktAhsWjed2B9+$!1~2p2cC)Jw3qeMss&|b#ZidB1V}106fV&1y8v+e>=J1H+2R- zIRY>{IZq)riA~HAr}vxv1Ha>YV0Lt#0%litCkLWuL~L?=N>*BSVRA-ZQhIJmWROE@`lbzotHqW5X$9zp+G1W!FU2b;m68g zF+CWb1RH9@T-;opT)_91e|Zvkl9>QIySou=sEv&)o#ui^uG5@drV{2!?01>}!JOeo z?}HptyV0B-!sC-76H{VR($n$^le6;@GO`mhbFd+MSW;Flo`R+1Zve>pS<_Peyi2s6AI zzz~*T6Mitex;g$cFpQ}BM_@IjW(F`}f2KHpGm6}G8bp47%D=z& z{=Wg0s7>)td5_q;*o2w5_gmja+~T(fGcYpqim?Kopcc-Yi_P@X`RUoknYlA_3TEX` zp9{+^oSl_df{XZGSad=Pqz;dXM{e`>3-Gqt6j}pJrq)T68W=Vrxr!^2ilq{PNQkTk zY?9IdKgs+qfA&8!yCEWw_USZSfzE&gFboQld`4ma6D`cii2{a^yiMgWXbS@~6rN-z z3PWB<3e6K!^FWwaG^cRJd@yI{muBS5z!khWJ*NoC49w6OnH|P5Ev9%#7@!w9JCcoaxxZ@(N1}i{~Ji3rgnY&zzfCFf%=`7{Q#Fk(X6i0$})d zVj4U=6FQ@e!E7NRCWEil66j|Q^gFP%2??*zORS;Yo+uz_urI z0*`z)e-#A@Rm{}|E@(_eTg~A|*VMECO08A-Nau|T^hS%V{9Ef8hG9hwS zZZT-nvkGC@=N6QJ8J3niJ-2u^G8s6r!HO$baZHJ6IRK7N$w2jvh(#w84`wfekJ)53 znJoq{Z;ipE_VQ90405ejrcw$dViu3^*w{=G;vis?!B1sAyUySw zC7Pr$%DvxVCPv67f!{I%n7B6#!3pW$rL$ti-uP#Y@*2R4{t@NM`=RD3cF zw4`aV1P1zA0!(HrfW5peMjxx*+gocg!6XVfm^lJI6TXe8X0yNyzeU{!HdF-<=~alZ ze*_p0v63YJ*6ev3w3EyvlM!JFIf18u@dMrwnPQGf&V;XmDn1P@M<(e;(1BqOBpAFG zRSLj>#LGzCf^XxyU{Q(b5edm*af!jvv0-rup|SD4!9ljbFfX%J>tzP8x782KkQydc zB8N-3LII>E%!pVokf3SaR&W@9Q`z|E8jtvQHJcTPRE>7=??1mf` zjT)Ph1z`O4FuC``5)J}5kz%p2Z*frw{p4Bl2BTM)W&3|Yo#&;UmyZ4u-P0QgUP1RDUk^eRzQ++P2hnvS+Vf~LO3ZnUPDfYTqM8*jI?wF z7%O2W2Ie$)EWkiZf0#)Z4RY)$;FPTJs6;esVX?`famgXEN$_esjEqT!yfBQ@0iltg zMF$FUhzw?465SAcqM6I@vQwd&Omafu~xK8sxu(&xyf5fMPnaB&#U~$PP&Xi$~ zgiKj{3bn`NoRSuvNL6D>;e=G6LSdj1#|AJY1tb(E@?x(w`hXw6a*Y8xgIOe&!o4S% zDM~x!q_zYYHmTvessj5D%y=a(+7IP-10(?kBw+?H-4j3G-60}25zdJM8=H#4Lpds> z!$lZ2V8fNTe?;ma@B%Q0B_vHU+k(SE3!SkdXi=6SGPK18E7V39gPG_I-$p#kgFnLDyZ^xClkxZB; z4Nn31Ei<|Z)R>3_%HZM1+azNH7_`KYt`O>od{W7%a6lG_qee)$G}MN$@MNq2hUNxu zE0K3ne`n+{U@KJ`U?YtYsew(5!D7NlWD-aK;0oEpzy@XjzspRp@hq4LHh6#sV8Tp9 zCcu*-Q}G;=m=Z@hHe8qLu|Wu00t|lg5VZ=j2S&vCN5n$skmy9{92yZ%{22;k1vwtV zumK@xNyUQHI0E~PQ6I!Juo2P{shmhn3^fTxe{K>I0PwRoY{EnQmSDeY1o&M86(Ik> z3?smV84n$TqGChQCzIX-VxkDgVosu*8DQ8ThX;g4!`mk>28PAhf+MYg;h~W+{=s2E zVUbZ7BxB3ji2KNv$&~v<8V%BakY%Vli7Ngn4qgFb@{{ zf45nh`V~DG)J+0vz-H22=&r8FQ%rX^Pgh4bG}BYTOwIxu_&oS=UgW+4buYyg?l2Wo z7n%^dhbtY=Fx+7@lmfboLvS=^gCsCh*mf$ca9ykf9zjkv(3~`0RNb;m9TpWE5E2gT zkcepTV{Z!z1v5Gm#4u1nPT(Om_zAh%e_)bp^wixVv6v+gF!_9rNQ8|in}gq&x(#B_ zJ(MQk$0=am^l)?Ybf07O3vP)VVlGz?q7e}>e2 zsT3lEnJ1Bena*Un&@cr2o@U)W?RQb^7*Lze@^ELkInyXY;@$v;VMAgYuY7y&#RJDi zjZ^41X>=C?3TS!bix%CZTI0CM~ za5|{cXijh)E1FOY9>GxwI4?40!(aSDFkn$ffEos=iSi`X;UP5lu>~5ue=V4(MT)l} z4XHgi92$d(-`E8GA5OQrnp+sXdYNa2~%iqxZ45 zKSxJQQN9`y9!IiUM4Of99Ajy?m_5WYC#JGFD(Co}nlCjiC~f5S@vGps=a;KzLjX zVU(XUs7wx2;@HHiv0_hv?KdIpwfeU~iU7j^Pcf4|49zo`DRQVCj!pxO3Kh2`bzzTF zz*8j1@emhNvkF4vQe#qcQuAh{<t&I*c7icQPSE16H4Ikaw2e;DN&M*wX5eFciy z5)cfX!3>=d(!{9j&E`|uHBs1y|3>(5mHbBKGz;FsM_yTm!%Ab)ta~_yOVpD*cl3SdRS%3{z z{7i7BX641FWKgZEfBl_3Y!Kv7-rFw#X-ui}lB(4(nTAScB!`h-8Y)3*N+>$R$&Kzp z^Mrc?8v&23PTk^vrxhWNP3+xx#;K9KjT{DA1`CbdZ_JUgX>m!}(eW7}5tQo!5>%*9 zpu!$_U=9n5i-<@-XM%=|^kjGe>UMfg5qTRRB{QGgCnaxyf23sQ#-(M(q-DfrWW}Us zMx)zF%cS1fOwNsrNHFRxMy*+|F-c`AiAKj)Dnvq=P^zGDcvC$+-QnaSi7S)i=;rYr zsuJojI#avPgNGo24Qf*dLU%v27G zO9ya7Oln{#f2H$er%mb;44cTv#HgsG*o5@djC^u4G`nDCZt-jYr)3vXH^%MnX5|)@ z<`>V#LF7#@NzE-t$jV8~$xF)3$0j~KD={rAJT)yaIu;4s>KA0S1gexeU~>dwrCgy_ ztGPmfJ0g+K<%#)BHiJ&L*DdJj>48Xw0UNY91xji=fA%CZ!3Hx3;n?_gY=BMDA=Q@r zW)w3b6GpNWB9<^ulH)0gKQ<*IItdMSVp1snxN?BBwhy1zYX zsL!ZOs8uLhs8y&&;mUP-5AQqOUTSi$}Y&8F(<3A1S@FC?f$~j`PBP61v7Gs ze`aP+pP5xWGoz>&nx|#wr=;g(Ajo6lEdBw(G0_1rF)|--vB}6a=-fR8T%n4?mw7M+ zEUt*n7okMK5!rlP7s0RrGp;zh)12I>z6HQAlF9G|U>D>pcg$YX-erEPHqscwoy4fI*0y^Ul_QhPT7127fvc9Eel5)6+gM3#QzM$E8x#gMR_q

    SIXQ(hz>KJd&R~v;PLNsxrM@pvf9&0Q@$~U4 z)n^7z9Ba9P@;lu`~fb2zjk9UDlib?cl=9XsXmm+S9XU#30w;;b{Hu72N2TLI@qCFwIFeWw6 z+donuRw<+!ol>9V7qU3Fpmx{JiP}>yhdZA1UcmZvu3R2sFFWcVwbegtt-Ie`bGz}}&4#LLbti{U9U7}SalNgf<;0O? zvu8wEEk0_cM5V%5f-=SzOQ-^cD&_9ZW-$ooq~RGbBcG8lCPp#)N5qFy&1Oa-l38-v zq>)0En3TgHc!ssNH{FM z)nLkri(Ot)bawlO-jjzeRv(|JK7O^n@>*TxtqWB*&YuR@_4?Bf8qdD$Zv3jZ`APfv z$F1j|_q052Z@6A_y8r05>$T-$rw=vm-q?P$Y^=7je{##(SqaewqnAh~rxKe`f;gvc zC-Qjc&E5ru!LgCUz)Z5&q&b8{C)+})w;>obgq!@8KgH9#Yb;nJoogvst0~Y}&J_v20V*?#)HHSwS{GsZ@@XCX%bst8;i7$=OrHVBKu_t)qb zrY4nrxbXDaPir?UKfQeZiH~MhuU>Fw`P`OGYtOI!?DWdzP20A&ly|3T^wbQn(9fs4Zc&I=p2dMKRgmt1n*tL6<_~QA6p2_8W-?rq#*gpp z-M_#8;K9B_2Rjb#Y1+5_{O&Eae`TAhcdk3PVe!z}1N+vku$sO6147K!02J-_9i0%m ze_+N64Sn$z=FeKLqlR>;}Wc4egTnj{$Vk2 z2a6@x%N$_x4GxJ-lN$XP0&jspV-ShvCr2Fmbk>noADrB}>fFH{J;(Q*e_6kxdFRH< zRVOE^D(`i69$LF$dP2%4OI9yixi&aCA-yy&H6NKF%Nl6$3kyt&O^yxL-&g z%E(+dqjXtXR_*4U{l^bpI$P0us0=@1VS*>Gm+9=YA9J4>GK4!7E?ZVz?rSoOIVM@@5;=)8lB z!67PdUyCg?I4H`;*Jci|Sb`!Si`pD$MX;UNAn*5-UMJZ`#x2)+rw7Us;YsZH6JzF{s zY#%;#VC3xK!Ba=O4wvy?^{>vdJfR(-N%@xlXJw+{`B{^jq# z?%aPaJfX0?|4Luqr9)-q1sOAPb7vLIUTpM_{BZf&?ymkFf9uvq`TAO=l3=wW%BWvc zntx=~(vzQkT({}7jy+p?4(=SQJTP3bf9%Ae8#N~eD-NulSHfbjgQ-N5XfW!*OztHR z_lC&CtN+M+ulel2$-Vd6&%YTRI=FqSTB%YReT@NO9HCUJF&YdOmCmYGo7gM?hb`c+ zxH5@UB;;bafAu!&_myUpFP&4pdClp~8(NMXx!h1Ua_ZQ~i39f=YrYxkIlpbgXT=5M zZ7p|i-JZC4=hdJ8d(+;EfS8Occb>j{{$oRBb5dwpa$0`={Kb~o%*>e|)Sho{yU?_G z`KLw6aTb{f2%n@as1%bQwK*X4;);-N-C8G z#l$6MW%^i54(R;pjq_KXizUp>+?enhI zV@nt9f0|R;Ret!@ts57IM=svHedp`f>vr!8Pt7PhTJh0GE19kwzNcu}%Fokg&J4{g zn)UIjox2Z|@7sT13TYHs(m-0yAbJFxH2q6O`{cYZrI@?fxktf%Yw%NJifeKvmeMq1(Y=&alW6=x3~ ze?7fm@h6LxuZ%A$@QzO0y7y4^*_zs;$BwN1{N(yI8UB_eUsKJljf1C;^&j7lG&Xc> z@5Rc)H|kDaI(O`L&FRZ$j!e{7Y*?{G?d26peP$q4EEbYGM_{IaQJL+{Ce;2TbML_e zH(SpC?b+SOgKaOz+gHwCX!S)mnwM2je~^+Mmz12Eo3|i3CIMreLTfNtt#Y--#l?;3 z?kVL6cYU&Gpt_><*#54HBUhVhAM~_+H9pjH;_#^zEB@>H_18lKcQ4d`cV+y$ySE&MNt!aPiU=n>N)pTxhDQs@lF|ZBgO8f3WZz zZ|_wFc{SVDkDe|ct~fM&{J`a^@;goEp7u9A=sAyM{zXgeKuvipzN5sWM#sn76oRMF+ zATc$~Xt8jma)ZSWCkIP6Esl)J)#(>SMD6=vLBq~XSE^54uc^Fx?&R(BXYRJt-0P~lf7*EJMq}N@ zn#zh@>#RO{bb+xs(>X%9TBZUsd>eB$VSZbv{@J&0b=N-{X?t~T@YmN*kM7%U(8~CH zu8%D+Fd{A^zXX$0X70@RgjBu3j9?av#mHf7CXY?$OZjU0G{=IZ#O|t!k?NCoI_iG9 zKYo9-?W-?F2WroCoH*KbfAmnto?Z1DHni<38$MOlfAY+g{_%&`@4bBd^3mPL!+j%l zXX+{r94{|BynXSwn>+6^Ihx>Bk)8tT7q{OHY5*`O9#P-grWxkj><9 zJh>u{j7|4^?|=Qv`Xvh<4D}3Fm5u1l@ZQgwN z)8%C!F5A9j#k%<)e{K1A<*{wM%eU{r=F{T2pBBzunw2v@F?C65*7}mUyB9AxyliRB zme2c7?3t)La`nRT8_lO~ww%7*R&}?t`c~_itM$h*Y1i!C;cxVci%;?e! zXnN3g;o8~Ck@7=Vs?T1jtM5E^eByNNxeeQPe6VEa!jJZUykh^-%Oa`mB zcaX(D!WtUm9T=vwSdBJ6k=n?Us+mISkEQrR0hh~0e^j`-Ohb>u<#HYW?cZe##{8U| zhVt^qmo7b;n0PiZ{Ai%_Nl)vSosBnZ&J2_v?mm8G;Pk2M)#oNoRib}xE8EqzZ|}(Q z@=K>r;Y#DS&0YI;4;G|Z$%7MT4qvT4dbjEHlg?^DKIv+C(c41ZLTNwuu=UIr zEoZ*ysChil^1vX0C9_p}Z?(ZkuF^9YED?{(<8i=DN&Sz^0QNxd?cquUcd&U` zf0bgbO6jFi8P!&W0_h;kKO!y7CnU;ji-?WS4i8U`i;4I53sA~63{MUkS+sRbwg+E? z9)~WKOI%%Dg?y1#p_}sW?{htwsqu+h*Q_6CYR00vp-9Hz3Z*iIx37;_tWAtb-m!Y!m6n#DZe96$yzg;e z^XqFv-(DGbKHTwgu>JdseLqeNd_B_jbg=FDXy=RGcIf%6=fabo+NXW>FNT_5jJCfR z>3lNS`mn3^MStCwomKamPrV%Nf4bCMzj4W8n=LFot5Bu$HCsZUv&LW&iKRGtC`5L)KWD7J0252m1KTBjnT((+aGHcB%7A|f-ef-Pej&CmY+#2Ys zFF(F=(ML%U2}+5|$=P*^lOv6db9GUwL=u@8xs5Fl3uQ{KSS*lX7_sVfe||n{Q$b8@ z!`@xrO!R+$ZTRKI&M*6#f4DsOUpL49baCMO!LA=J_I-b8;G2s*-;MOW8S8s9(fj&x z=T~Db&xV_y4!1ua?fUvk_mhG1UyWXP)_v|)$7{hQu~o7Lr8=M-5bV)_&px-;92C8sgOo*o=7lOYjsl~R#d!e?_? z@F|_%WU$!S5~Wb4nvp-ftLogJ?%e(5#>KBkdtg6bAN%3T@YBBbe=mF6zP~*3%asv| zd93fJtHU^j7XvNN`+%)Z_M!CqFI%3x6H zwGst&$J@!>5n0>K%?;#8;3!wryO8!5T`+NA{t)J0v9MeE9LIRcqFl&Yfq` z`OeD7YdLcG+tL1Se+SxLbzXQq)b(bh_q)ONH-oJ|47YyOU5}>s(8^EJ!onGj?#@m$ zH&+ifi!T;Sc|0EeF+`M7Ez_bub#+J3>#R0v(srX;l$sSKv+wn{zPd8>-L>HtV_k4^ zc+i{6Jzt@X8R>sD-1lm@=i7?|KV2LB`PMjG<6%$Zk5@;&e;w<2+;#rd#m@1T>e+=k z1}{^1LMoVXpjxB1Orw#g6l^}v{sA(yBIM0?Ix#dSF7~%3(VSqw;xOn8`yX67%$zwt zKO;ZF>}M8;7Ubl0Ri6B6Y!K1)s^`Kt{jJ{&cKmc{=*O|XU&eZ0_ch+BIW}^vtoPX7 zW9vTqAS+YFfAy4e*?caK%IAn|zKFv^<)-s_9Jx}VGc zAulyW+nZ1{o~W-LZq5|5e?X9e!wZ(lSLfu7*PeMc)b+Ui{1^2V-wn3@GSUBLwCB&) z#=ahCf7R3Uva|kP?eW2bTiSPTY%1GSy=`6D$Fov{eMBq<2f?h+0UNo3$7kVCd1Agm zDHEzye{wIQ!P}zMnZyFQyAzG$!3wkbZC<|YYFG1L9^d-=lbb)^9)`ES9P0dftoz4n z!@pb~g;zi8YkJb%@S>;TKkr{Vf9yy~Y>L?&=;IgW>lY%FC`EELjKLM4&%!K)+UZJt zkk!R~>U(^aCx&Qzi6mlyNQj{lUQIe}@?j&ae-0|8G%>_>^s^P;j11sVAGFurZ#wg| zv+ng!+jnrkq0S%12i^>KKW?dec;WPe`pQcu_w?@F1nicb>n@(&eQx{b3-U9()N1PU z4?HSwOQm9|O2$Bl^H?&CN~YIwMN+;*K~)F;IJwNs@)U^}LbF1X9}{X);?RO086- z!$0RjqchnoE}sKoU0kQJU8e9oY0gupOr7e;6H%XxM|dN)IcyK4F8g1YI#IQ1@yxvX z!#hznUkr8t_)b&R)yMiXWv#Z zU)Z|p#`#JN7@w9Fc`KDtzECDr34}7CN-5WBH3q#_uTiR15`|Kx(kgXEk;J4__!x9H zqux)aFv! z#hvDaR@7mn^6;ynwpSzV_q*#Kbe@0M)o`!94x6urJAXt_T^f8n+ViBT_GwG~)Aoit zb*K9d?P@FA)VyPT&H5F!o7Xn)f7~#B`p}h{lLuEWjr8#mu!T~&i6__4xqQArpej3caDy5EmZbl+i!rQ$q0S1$wM6PppbcN3=_#&IZoST?DH@6@mAW-a16XKA} zKB19OL1B@WfMAowCRS^yAxNt7WbvJxsdsD8g1BIycXN?Q1tlr5Hl2b^f2VVKA`C@* zF?wPKd|xcUR79iE9o^igdU!fJ{Lk3H_r1+<=KCGh*Bj41>TSN$R(H4K{OgGU_xASnw^(f!fke!eN$Gqcm|ff%Q>VEwnCP*&&d$zo z;GjUiPfGKGOyeI!9p@i) zUbxrUaJRMYUTfXcuBLAXyHJ^b9PWMH-}(JO`?J=%M~!D5G@QD4V(3m z(0ZBS?JB*I`VgeSe`xj%))=g2TUbbJN^nfFe^{I?DB5BRHwFY5{R2^xRBAmS*c_fK zN)Y;L4|kfIJB=Y^3N>`5h)bhKo0Y4Il0M9gjkWnmBr>_)7!(%D;iB`VQ6ER)vgkB7 zrmM4%P8ZQ=4nJM%|7Nrk%wP62f6-oludV)JN5hNW*6)V8e}5S1`(dc(%|I7=Ce-Su zt$;BJTQLkZ@7&n3XUo;PQ{RmBet&sr=ZaNGsV+|L zJh9xF!4+%uW~;wKqeU`P>b&5h@Nez)QaBEs&32;E#A5N(X-;r&p-9g5V8z%hD`sRbN)2C}9vx*d;blUl z#>dZ!wuDA=Lnh<$n8@24nj4sfu5J!LUhP9XBZi^U7cI5-+bQ_32RmO6_k2Ix`(~); z`@wE7f7geGq~S?x^{txYJqLE2{B+5-nT2Q9E^jT{f829$7qHv+Z|^y>`&#{J6rNwd zd0Df6k6OTE(mg0Vy|>cf!xG8^LnHj{|IY)+vEm@Sye>H!2X?W|fz(mtT^@(0jH&iS>kHuwr@R7_QyQ8B6%EOc1rkfYe-s^0<+fw_utMS!PC)&Ut z#`?b>?W3edGdw`0ZgghPJL?}bS6x1Hq-MjaZKXvOD?jWxxD!^hdG&>z>-)?1UaPD8 zvZv|$@t$A5dUU&|EhQ{iE);9DMmk4g4UJPMf3-LQ_%rq29@qk*uvDoD36eULtoz@HTD1b7&t-+$`XLxX_##2(9MYDAwGvj=9Yf7@W&!4`k zFmr85;lj*#XpVnHq@t>ZyPG42?I{)u`D_O2wtzwB(_C0n-*fnOtm|oi3zF9TuBHd= zf9GHJwE_6&%fqmr#s^_PPYiuO-2c-Us&wbGu6m5`w;N8imTlU%aMsTG#clhx_8r?( zwSM`@)gK{;U$3da%=C5th406^etmZD=Xpq^!4$zA(%14>3yls z$G~a5O&0%vP~>o5|6rqE074O*29w3df7c%?$`bHk9D$JfqdPG31nx8@i$+Tcwr*QE zW6y%3EhX8TXBDlPS+poCAtultV-^}-t(O4>Su9{vGBZ73DBT=aN6+{Ew*zX@i;=De zJuTOp>JY}?4tIn0uQ$eFf4P1UO&ILwi^G4qJc2O@jnSj_>e~$!9S61^TfV4le_?6$ z=Fhqhm$mKNc5dB@6U&z%uy56$`TOm$?}ppnjCTF)?$uwvdR|#p#-}mR@M`2*gWjyt zd7+5{VTWo!;za@DYg>q~v&V_*|g`fy%_-PVV3)aref7v{*WI<+PRDexu@KzYjYQ2u>;Veb|;xGgZ4~Wdg zQ0ep@{XhO6=-l(9zx7Ug!^HWs$Xh>N9026sZeRZIFRuRm&J}F_>(-@TCNBQv>i930 zhtMHC>8!ogSlM^14E}s>)9TafmS5Pl5s}=qV*|n)Dec> zUwnCYXs|RZ%WbNg2aSpBW%dtLo4ip&)k>Yk%VIWB|Jws~1oo6BSL-xdFQr0@R!)q` zOsYU9Pkk~@AmXr)kGMHz^`1qgr`9Yxv3hCM=GEI5%v_qCuye_*53*AtY<~FhQoWa4 ztpc+`%w;p&(H&FFG-r=#fB&2IAOGU;q`UD}OU=XH*5_mW0RH9D@PA$(r+(3U*J1y2 z_Zs$K{_C}gzg!!AbFuS9--Rz)&WxTq*tTzT`DaTjK3~>#xNPF=@wVMts@8m3w_!Ds zIdzku>%xy?J%61Tcr(!X*IQS9{rdT@ufHxoQ10&+^uD7DPo~g%fBT|b$)zeix>7G6 z>U|QuQ4P1$8mRx?L#-DIq#UMz#TFo#`4Tx#EW=pH@L=NUqjPgle=-l{qjtvz^g`=q z7p|U>wP8;FqP%o4tMn$Z#tRji<>{i5B9`5yY?g@O!Etw@PyK)C|K{NEY#3u|%cI`b z7lU0yVXPQvAusm-e|d8P*nhe@3P1nrwTn0r_`<{Hy3ykYTX$m2Sc7A3*}HYTs{GQK za^&#pwJU1Yt$f_xfEYnucs<&SNWr(`2O?O0ee?3sQ1_C;Y%#+_E|$Ovd2$_3ZPKc| zbXucKAs5O-SgFaBEs>y?k;%}UO4%}Zj`%$x?|p`=H004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 zVoOIv0RI600RN!9r;`8x010nKMsolF0D1rb0Q3L=L%h%c000SaNLh0L01FZT01FZU z(%pXi00007bV*G`2j2r96b&%wK70-U000Sga6xAP00C|Q00EHz=)(#7003N}Nklk|v1pCZeiuvDNo2!ehz3s;jztdKm&}031O06*%B9L~|L!VU9R}Kp@=l zcK`wrnlMvS)LoTTnHiOt5gDt8@8;&Vz4ugAM3@-|(f8auBCBX#7+KinW~!nhynOue z$N0;C{cn-5ZQ`t(fwC0>A{Le?ZQHal2zu`O&G}hgU13UHkcW>R{OT`$`N=1b@87w- z>{_x?QZGy~1d#wh1`t9d=8}`Ef}3keX;`nEp-$>X$$Ngk048#GE+*5G{?iO7)Ye_JreziK^T%B7U z_qyisgL{AZi=Y4dfAiNr`^hJV2g@krnk^@AW8oNsumGZ&n>!!^0GMgfy5g$E&D~7R zOwHX8fDi-Y!QSlfU^$;Jnzj=O=8#g(DHSb*5QL+IAS@yzqHaaiR1r{^iOAjam{QJa z#w=|&@8$;~cEw=Rr;CfLH*elPd;apf@4o-;+wWgIe|>eeQNs}1HpZ@Lx>?h8Z4)CR zn3j^ql1DcsguoP|%w}_G+83v1pMCzPzx&NU{r*qiyf`__h!h(~9EV}ESutS<;_i-! zfHrODf(T5=OoRvy{K#LmlVv2}>WOb3WAfiYJL6`*qvcu`+=I?&@ z+28*9H-G&4+mnl{4Cu^`sA?$j(dlPd;5n+N5@^)1tK;-y|~N{2;h#U=zz#1 zft%P8At4fgxw*SAIUx}N*qFw?WN;+JSvRK{AUc|w>D$$CwtD*2_s^NIYr+S24j(_d z^YG!r2lpS`zIk)jwK0Ssv2B_drIa%C{pH2_<=eB*pFI0dfAhCreEls*+bs4Mv-#z^ z?>9YwBYJE?N~4WN%yn5+)l}Wg0o=&I+}zY8o4UIrqhJWkpySnA$DX_#F1q_Sjz9kJ z;YW`iKDc-1aDT6f(cN;+7etZ{9pUI$ACk%lUk7xm+yfQDn1O zpS^wi`qisf7gsMXF28;Da+7U73lakn3W1OVfEyHWbyK%sWM;YKlCzcq?g;2^TA*IJ z^eG`RGLr-Zw|<>2&#~nFS^Mbd=;t4N@Y9bzynpY`-u_a8s9QCWfIuvO=w?|>y);BZ zOw5P~<_HJ?nzQBth=7PJ9E@@RW>YO{?pBKCtbkMuuddcw%4|NnbFjB;o4r}L=vu<> zo}RqD?6ad7pjpW!d&z+aV-O02XaGcegEp~=O-^tFOzHR7)g);-L#Z(QwRY77=eY63Czut z>IU2ZnTUu8kbuzH3n~IQ1F{5}IY~*y-4mh%TcNbdXPZ;E6U}N`+zi5AhzxCPx{jH~ zG$J}7BDh-_`puYgaW7iHaaw^=iWUTC77<2-QVIYtvml9%#YzEl8T&oKyLWDX^1-9O z_{k?f|M>C4ySL|E>u#Ggs;a6206IFj8#n^E13-ORSR+?8QzHNrmLO(^3Eb4IxEmr6 z0k~_a5tsuY5;Cy}A)=`zEsoGN&BMEQ7W+r@y@ME=GJbh-aj8Q=L_!3>VrJ$@KuAQy z%tVA>?uLx+SZxR~A&Daz7-#`>A_hVV+$|QaSX2=}gqsi$Af+^>oKj+>w&`ZGIW}Ab zMA$TsIfE5pM8G_zq2HvUhEUAO(cN8>n<5~wur$a7t_T>J7F`rBV4I}t0afoDbw7W6 z=P!Qwi=X`D)BE@C%w{bx_Gs>2gw)v75rG+jyoQ(HE=Ynz=3b167{!^~O|v>c4LpMo z5xWziX~Dr&b4t0m16MyQ1tB1^ITm$CkHY)=%bT~l8~cmnj+Vaq-Jgc9U!E5L2tk=J z2#Ej@BA}}PMgl=+Vh;PNnp1X1a3&yES5+inCMGadGZ#i;L3bpIjkImUBJQ1*h2{e8 z=l}o)>ZU27tD3qMFGB(MoO4N)_zl!QoFI-}=?h9)0@LPw(ElH($(D^EeI;U#ra5Ggm zs@{!=gx$>5Of{8UpolO55|KINthPJrfZ(R35Mm95Rh2>%CSla9;J!EOZXL`X-a6pN zM>ihby7jA1KmGTA{jdJ*zy8(FfBxy+`}Y^iB@mewS4AWMFtt*Ox!3SbO~HW>YuqQy zOw9F^`($CNk#PqAcc}k!H7lw)moev*YIc%qmPAAj;NYriW~$}@MAUV&qod=84gE7|U}jphlw5MrqE?EkraX=%F|jbCyOvUNE?R9PI)J&UDgZW3SKL$1#2kbJ0efi~ z?i}wwynE~3tsC-x_+S0UpM3cE!v_!V-oABkIPVrs3_(k&(YtA(>2huB6A^a{NJKOR z+Jp!-00h{rHGm`5b0&!30L&ajVvI3{o=CN%ltUwJiNu6Vgd{9RW>ZMMt_!qSEFL|2 zxVUla;9&3QaPMz_{SU9t&WvC-Uxc%QhY@_a5B6 zb?5kSZ`R8H{(tx1Jh*%3Xt~!$AwjR1L&=)5sn%H5-BqpZQkU(r6A=^F7b4XMQCGaK z_4H#bKmZB`AR-}zrfJ$XZDNlIMRU%%s73&)kFv%r2yT{h9)@0+ndx9Q|M32uM*elz zh7jm?fBgLQ*#$8PvjSms0iaqeLJTpA1OPNsw3?!UyVcNf zYZZYAnTVZSt$5awQ_ea?`sQwG=I%lS#90B6gGA6#KxaZX_ht`nAKyMc*qhG?od2Ky zkN@lb;ZlOD4(1L>;M0FZM8tqp)W)21%B3g})l{k45D^I?!puYn2#5ekI7OD=00>9~ zhz{s(0N@jv;wj}JrIfNTHEry=F2vyOV@hKl-JOU+2qA_bL4?s2G%fcQckbPJbpQUm z>sD7+ecz{)2r1<}3~9dHo6i?xzscj^?&g4qA|fJ0lye@(QA-h)Sv!jotErsa3-gpo znE?Rflt;jHaJ}R_jziAb%n;n&axSU`9AXH}k__Bk$Rqk*BexEgk8a<1aQk?F)-gg# zSt7c7aw^mk8le*+5D+tifx6c1Py;q3s^AkM5>hp1)o|n12~`-R;vru52mv^3cNsEs zh@oklrj0QMX3CoTaah>0{s}cpDb?LA%%BY;1{N^Oo0SM1bn~Bo`cd07d&}kD{{27x z(-&X8KD$T;(#|ZG(FZiE&Ks%`gb6XQ$u^jYx~UT*0ur(lR4-?0T1*WAh=l+UQHabr zt7$1YXHx|Ls+%9&-4TH5VNi8b6yKXQcMg}2ZXe%1I@q7JjG$_aD4WZ-ASkWGCSqYs zfY&Uqsi_t-BO(@YG(<#jA`+&+EOl2fBVsjqzKz7IEdj5AHkfNoFKdh}K|%;Ih7e^; z<1mh?U?MR0qG?RknN)0YGGbep7#+!-#F41pS4AFnUKgs@;>i!Y zJDQ3WbnQrP9xOk&f9J!yx0h{1Ejbr(7iRvy{SW_rXrmGIIqPVcp{N!uxs;NNs;ap; zIHDt(Ls3J3C>&U-C1DX}#_G{(%0XBS2sjWSF#@8wn-z02H#5&##xV^kRl|))v1zI| ztAL`bThW}0yVc{~#5kYL06E*5DVU%q&;*{lg53KOvds9RAh zruA$w5hK$SPZ%Nrpt%8fy+Tz@b^q2F7Z4mu&SM&F@|@GF-X;@aMcUj!HCQ>AHFs|u zet7@RqdT{59PQ7WNQh=u%oSWv1kgdr!vQ z_38P$16U2b0Uc@(Q}5Kl0UQ}6NNgJOdJrw8#6-;8G!3W?W~G#INPXXL*8QyOx>@Uh zrkckA9h%wv-kqEKhll&i<=%WAnV-FSz3PXt?^8+~0|l-H2q3D_RRt*#0Ub;g5Z%oQ zCqrlkW;Kv?b3=2tl*Vx!S)^{~$+jXQA~7NWn5$|4KWOCc(cZ%ccOTrjb>m>ai;XZ5 zaVq9nbI$xf{Ga}hdCch4g|?w6C`1(z7ZxTW16R|cT8frZaw)<*Z<-)dW0IOa*F~@E zUV|0@bO(eQv!H{UtDCudt)k>D7$_lz5bE;YW`j&$_nXY);;sUS3@lQzViYo3>?PSI;Sxl)+qxqX^c!+s3%Qjrt~2 zF_}|Mj;pIHj-g%7i#rtMz+mPjr<8!DT`V8mxw*H$cX)Jg z_ukzbfA`zZzxw**?VC;C_a!f3FT_~Ao4J|00U8n@n1h-EA~*u#&gRscF|$Iib# zV&FhfFA@>Ktdv~+Dzoe_XCK`=`r!8Q!D2S+S`M)|7(gmHtEmGJ@&En*{ND>lc820$ z+mPPO5Y)YB8B-clDym2nLTKBzjWKe~ZHT7?XWG#_lTuw}h1aJqqdQpLv+Axjzce$o zA*Ylx0K^cwuIsu^M67JH33F3TIk&U!;P?mtwWu%?qMMbROHlwvqHaFBclXYNhYt^q zZZ>V3^SD}FZ8mFjLj)$C4B6J7S2WyAYj|GY*D4bNx_K==nOcpk%&mr&H33%Bnh8dt z{n`A(TQ`37;oVzD2Tjv9Z7Z=sk*wAaLq80q6hh+v%YXOZx|w@%Q1$xeil7JzuHd!$ z;5AVoV#3JWgj!o--_}!hn|gB7h=8D`0A3?ka6lk%1V<~b+0vME%B5B-YQ!QnU-i*WtZs1;9SM#8$;QA=bxx^Z~#_VK-={f^Pn&|h7aaTG*iLE_?& z0hI_G&>a!owP;q&rUl)=OmiuzXjb%E#{hCCMFDoe(R@H1J!ehP^;Qgjb?@F^e(>Pd zt>gLreluHywnO2fWy~q3(Nz(Ek;Jq>1vFq=WT6VOg1M`MBOx>GR#VMTb-T53>mFh9 zt<#E|S*<8k69H3Y5($~m2pJv0z>B-O5JNP1}agK&$%s}Kdk93=^ z986VR4IK#?oB>daAsdO~bYLBkkWsy4D~z^3Z$G?o;}`euJidLCmb2J(5+e#1)f&aS z8xabzI|;l4l%^Ne7!JIa)#~P|tL8-RmUFg}+ooySwtCBo{vZ(oRH)3|YoQk0Rn>B_ z?Q3@es*?eCMkEqI5SA#yfV<#5h**pjBXjqhbIut6L}YTvyQ{Aji^z-i7v~h4qvNB0 z_wW9zJNF*kx_kd`{>y*)hu?m7a(-^e^Sy&8jEF*l<|U6n$e}^!qWx;KVdQx??`EwQ zyEwbhR6=AXc0yGZmRS>RNSJko^uev$zxwG<@7%i8Ef>%R7GWlR`_uL-HC|Fva~F{awGM<6bb8I606_g~UK92TXKm5A2^(|=0AUeAVnQTl z3M@h_HJTBC#@)P>GO;I$s%nkKrqc4erQV@Mj%J=lb(=NqhYufc472%cKA-*OpZ@s# zF{Ldpx0`-l5Kx&Pq9 zhxd*T54so)92kMfDmJEC&EVE2fLyyu05bq5nBeOPEx-wAg&JU5F;y^cV)SV-O;x>= z>%mE_F4aE<09<1c#I1juvSC7uA{Cb2`CA4gKp|!#0LVEbVkxDlUIQGbCEoqf>n}#k zCFOA_F@<*a(W8fp#r*i_@c8iPAAbA0Cr_UbX(S!JG(e0f<~e5tazN>3b1g-SZib!_ zL(8n3i)Jt&2vM}CZN{0|y@S2Kc=X{5XTS+5D>IX)?*3?0c%_;%tly>mXhlUNMq_ZoAr7< z4!xFw6(eL}A~m%wUqIXqz!BVP%I8SHj3HFGspeL=^BvoDt~OpvNyI#B8Yi+mTF!fI z`>%fS^Sifh{i|R8;y1th><^!R{@wS_SHqy>6&g|Xk~1>IAl!&aDPvMqa6lxH=esTZdUw!<^ojb=(6EL6$WEU)|rEcv~?*-j)T40dLioir0s71#KHrXyZ zAexz$JobIR-i+f|PX{ya-cQ8@Ag>n29GIjDVCW_9UgIzho6UN)?l+r~vzZZ6WDzDc zs|A=iMU<5|mbRRhEkGD*dbJBW{hB>=M6bCLA|P1x{;Do99?fUR`}=oq-n?~mc>Cz! zx69vu`Sk6Z%b`AGP^|V2;U9kg<;zzuuQr+7LS%JYt=3~nNHm|dZPPH57xdzYq?*cleblud-@Es#pM3nu z2M_iaUE4LK#Y;>{6`ab%6jN2L;3y#hS|tez_ym^jF4wn2P(olLl)y-8P*|8qkSpEI zwAz+Lh%Um+R?BQ=W(ojWQxtH`+0;}ujd`=_uP(2yE-qG=SK~0`oZY=?8h4Bh0@eby z5MnBM9LByMO3qB&#HQ;yX0AC^1#s$ieuqKszEyW?g-0A*OBu(0(-U*kcJujscKhaX z*3B1(cW&SQ^*{dO=U;yL{PoGEFA8XGvF5v>L8LSmG$6xqSQi}^%#Uu~`1wbVKYV!q z_-H>wMn+~1AZn8vQ&l(JCHIc#NHs~2?ONjmPQw&3*W5~ofxw9s&`Yt|49yU6NU3c* zCN|Zavgx$bccD)Oq%@6yK!93G&ZY1B%gd{av-8#E<=78yMo1E*oz2==7eWk8!y@L8 za_)zr?}wbTurzJEST2`)d$k(yenthA0J^1tPN^oiHBE!W;9gQHIoCo>hJg`642O&P zzx|6F_wL+Ub`(j=xOsN+W=L7uu8mzg>wqceG7OpB1K@ad70B=3z4fz44}bFb(aoEO zp^JuAP~A|71H#~=?jpZyYwf6YE6a69j}-_stt45P>M(@l41#UTh+PQt*}N}>nM0U} zWTu)C>yEBrkBG3a5!RJR!*F$Zb^7M??9J)b#f9b)L>7B{%lUjZpEvUv#bB!LUffoj zwN_$8&N0UMe133naCCG;LDJTU!4F^fJ{ajFK|;_{O3J3zv|YE{2h}o;!)iSsHcgC8 zI-bk_`rrNaof}6VJh=b2zy8P1zxnQbJ>+4m(2_d_iC(hhF}mMeEPnOjhrjsX!+ST5 z+gY>#C^D+)IEK(f;9(nXOnz{BbC?Lh*OnV<)oWXk+1>(HhymS$Fk{n6Xgh6-P8^!1mlyrf(KkQzIN z7`v`(nr1PdFPD4E#WI^FEq*NuydDVFg*G#)X#&-}vEC~Qi!=@7>?v6(W{ze$tV0uS zAMDM4{^|aF(aq+Iy@Nk|_1&BEi+()-Gl>whmcdfGxwrSzhYx=7=)(_h-#%Q0~cEtvE!^boj4Paq`btwDeZl2mt4n@k}fhkzn3m8PvQ)zqkN?NZ9l zRhl~(sc9O<^=h@*Y|ON4yMyK4-h8pQSaw|-SloR*4!vbC2LKZ4Les`})^%;uRCEv= zhQ2RuxGRKi@8SngyO|*p6N7mflbbU!61wVmbyY#+D52hT8P|EZ>^CcE7a!ce+sv0Y zZr@w(|N7UT{o$MMpZ5JoBC%<77+TAZAKw3~U;N_n-McrIi!KUwAq$LJT$m%JqkbvSF41b?eW}(S3m>~HdP)$DvRBjl~v8n>M@WYF@=;;DW&98 zhKc6vMVk=g{y`Aw+HO9ZwQb8pZmwEHv2h~ATCJ$n;HGlMncQK*;;QSu#*~9?h4fll z>}K1F{tou5`Sf(1h{E7trV6A^Slq{if`{|?vk&hx+WtK5wfyC`Pu`qg^cy&w$tMqv zfBx~kj~?H-edoq})`5Tnp*b7Y#6`)~YS0hGz?nfyz8yk02^OrZ&2Z9D*j_fKmz zF_jbr0M+KB5CZ@(8MB$2RrH+zODV%JY&M&I)BBjPm;g!J@j{vy+qP|*MnXWMimyT` zore~jx338pa34!Tol;E_qHW}1rnP)QNY~@;S|)Ncy|(Lpi(O2h`|fiDzkTm;dA!FYIb~Icf&o~~imQq! zpk=iJ*&LXhxzy7(B{t}Y6J|1zpRSpn9|W`Y3Ba|4VrMriq_tfuakChsh%`;(OLc=< zfG3eHtx1qb-BL<9Whxm;vD3?>$r9g ze`a^Te^>7o<$dE*SB9CD%~b0ym^Qx%GFK~a?uPXZiJ6dhF8BJ9?GDg{|CwF?>;J-v z*Vx~Gv_*dKliOc4mAK8!Rf9;o=;pIFtEqYyanX>w=epKzLL^*?71`Cal&SEfN)AF; z+`ybFkZNw`s;=k)yRrc6K74oj{)Jn5_rdk7L(P4Hyep@)_GmazZQ5`!1GH;IQ$eVB z#q~#6!};r&-}OhkJ6pT=|H97r@$TNOaz%SesoV+(At0c;TTZTugaJ?x$RTGl)0~SI zop_RnZnclD64k8|fC;8HLIMv=mbIwXI^ud5#kYYtY~zsYyZg`X@gLm$^~iTBv~Pi4 z07t?d#%OMC0EFh%aiO3Pp_A1p@SlC6|NK(^FIn;T(eQU)thjm3xf1(>2qUGG(m1LX zug)J)nG$2IX8OcQbuDE_CP17DghT}9Xn<~v0L(dSDFunt_5AWme&m7t2Os>{fL#A> zg|K(c1B6s}B~=!3kcsWHBbng4+;3M+HlOy_^%eZ_%EFJl-*xNpFWZ(s``BuBTGItY zkX;Dx=Bk9i$WqA>I;Dz;U~X1SOSRZmDLxKB0Em$CWXi#ui8F$`bBH?RSEp~~y?gu7 zTK~%%r=BU=h9y*st=ktf2MJTc{T_g~EhS%Dv3j_6H1HoU`j0Q^pW6_B<~jYdFTduj zz^1Gai8usjM6SCVP~TB{YsJwVs)W?s z^+?>^v^cm46QY>8SEdG1h>@Wos&H2^cS4*VhPxY>x|?GqoK)OK0A{iU)hh}|KL3S*?N_kA^MJOUYFa{5N(S!A|fyn0Xn;xqfgx4N*nwa z?7+KgyIxcHU*IHv5Q+OWuWshxir|%=r0Th-!NfkE>Ki%dtOY;`Y{yQq$qc$X(?rFu z>>nmpt9_%crm3W?nzWp)*RM|BUT!w;YL))aJIOyALcQBHX0{Dc+_s>V832@0z^1Ev zN4Ekp00S-RTau0W`?eT<6l+e;`(HE-*RKlR4=8t!bN8v4ffqs~7I!i?2Qx=RawNwZ zUs*0@2nJY6@olfnwKTxD6lTpO1CUxl0%BD4l*g2!|xmq>dcBa-}%gl&n z7zZFA5eXsJew(brIJ|oG`t`|)A&O7nsn;$SkcI zL<|VkLpe@dj7jRGuI3Ld+`Imd?Z()-Yn$pU?`UjW?rZfy;Ev#1T7E_BYD&2!j+yFo zo`{H8+)F71tOR7^I9R`0Z(hAUd;a##*=Ei21F2B!^yJZuET@82S*W#9N6Ac>iK!qZ z12>57Kxl#<2qIY&h>=5J6wKy*%Il$+7cc^#g25Z11%{|CtF#3AszIr{f z2`~jhAaqCFqIZDkie9!zNPWNMyH^`8)kbSkH9!##&2Vv%E;jqKE^xc@)#=&gpPoK_ zdU?JPJU%#(>-)h}T{RK|3IHj9A$VYOS68%b4r)|{QYSG;WEMhFg`wak8(;~6SP+>O z9k&6-4S<8RF0DFS-|LHYUR`-f2v!gZBSgl7c{lG$6Fn&3}Pfzsg z7xvvNxf;+cw=#5`_nZBXAI=}##wfK9Fd!1Tffe^P+K7gTGZb_zND(<0S}ux?g5XYS zoHPgsheDpg(5^4(pNXUJ8ejLC->M`y-Q)yF&O35X*ZjH(V!ft#+IHEpY4FW#)a z{3d<%UH<0#^yCGreM&xS_0Chj_xgA_B&i5l~j7d69cWz6f@!w)c)ceZ;QQ^U5~)pr3dRo>aQAK)GA zF_Exc)r+DQaL)#>FIL~aeD&SQNkX}Q|Ir5@KHi(pUp)O@e8=T?kJ+&J#>T5LZThio z!eZGq`!NXT&9MIFCOM^ ze{3GyrI&9mzWL_j@)Wu#our6aN;1$;*daz%$7DKcv6A?8&u6Rj?aAfuzP-GCSneG9 ztphq(%B+jad05U%BnKnae7PCkUJYr)WwZa`y=LAvYK@1swn)N1o4Z|uF#ik*>v}45 zJ+FbOy~x}Qt%|2j_1uZgQ%cUoSd#nK&z}9^o3GC|{jK{SeEjiG+R(mv_4?aC{YhYo zaRA&Qs}E(P`E<29ySP}e*lK>9mJa#+)vLF^`|AAfKVSX!i^a*?dt`e}q^`q;3R?1U z%%dPRAqHk7$U2U1US0lw{-<#BM#p${cCwZn7Hw>~xTca)(NPtdsew(Pk&qL`jWz4k zpKgX{uM0rxVmeyN{hQ6bTkVab+3lm|=KeT~BN2_7UcB8rdA%M6zH`_v=NMSQ6L6f` zXz|A@h=1;jKQQap8R(Op!ENvOHePpkf_H~wO4`)2LQ*|l_g{Yh^vSE&+;(^GKfHJM z?#0{Fr{8}4{K>c5YL2_R_oUhaw)0to<7#E!zdC<&(QCR~oqhlM+3B+vesXnpjM&7N z`K%-D0!d&)OPU=(L~;vEWCe#=$fJf=FJ&{>(SpEe)@qCy$%{z=$l#-8%_9v%CSk?FwUi_{&cY{>nRPl>rLm z8o6IX;dfT}I{s4usq0wHd%?yo@Y_{!tGvln=bdsxwMyHy2_B5I*RNlH_RV)sPfoaN zAAj<*d-v{+!{)oMzk2%3S30iWqxFpJxxwamxj&!9i(&Kor^7#eH=Mi~HfJSWq74x;f;vL6F^|{}zP?nW6_<5WLfdvUD@hhA%h=6s?H|wgj%IsZvmCI1jj3c{ zruR+rbrj{F`?~K6BenZtYmcT5D6`5#t0_~J04bU${Y%&4Fc>{OIse1g-}UA$dwsb?yK(c@tHZt1vCqkS z;M|7v;FglD_3LAjdLZ{bOVocRU ze|$V!F3!(SU%q&He)^g;2PQ40wh2s~rY$$7zB;|sc{5w=%cEP(Pafp&zV2VIo0QvG zTy$+01+ouG4T@tn8Z9Ny#Y;Veld6g#l%zx7r`-Dh4J}$}8Cf02QnAVs1I(Ld-nD7o zCgJ%|C@Yv11SJHAr6MVsV<8#?356~-hc0bsupmScZwuZ z3yWL!m2b6zD!B%x0K+D;{2uk^`f|VXmR@z99Jg6Nx=n47rA%~g_p`I}FTeZ#eADkA z9_=mnET`vBzJK%ldD^UJBtkgmEV*Q=5`aPjVKV1I0tJY%+&;>W@9XhRKe@sSD`llsv0|le?(86)+_S&)Tmx zmlqe$p1yc_dB%(G?wwmf{qotXvnS8`vkNMYqKFU)1aN9zH}y41Ae{ie$ z>0`Ux=(Cq_mDo#i6_hT{gvdffAT$f$;?7n~M19Ouloi#RC{7R}S=UnAL=K@i4_VBJ zzypqC8_2C@Gw+NVCpQ#x0W)=U19CufRtM7pMFa2eg^wOC|Kg|d{+(1buX@>JmWBeA ziT!Lkb;w43 zd3%w%(KDyDtyEk%3UQ19)v2hciDGajXhDnRGJ3g~drxS@ak1!T^GLymT(F0t0Z}5k zl`{7GMX?weB-LC}Ntvuf1_%T*1R?=nsBV&8h}{19gXMqy3weAip{-t@I#DB08(~6B zMSK@#z@+#MxU(ix3EH>j^GDUvy5jFA>b05IP$$_FbxW%K)LBHAU?;i%>g?qC#aR<( zVs>%*W^-|Nd3L5++Q^GpGjAGn82VnOBo)oUu_#plQq9Mt+~|I1KfCAWC-&u6GNd*Y zQ^>=()rEa8*kncu zv==I~3JO?883PZfNg-z}Np;L+)U2gAwRZEsfB8^<^>DnkP%M)2kz0{f9+OWOV*sbwnM_c^kd4S7H*s5{_5iVt7p&t^z_-= zad2UF^Ks0ZwWU$q0%Ir02v)MGIhdrJYvoyXIx>@5o9B|pqywuQ?H&E)PxUfgt%o#h zTH%A`awvI&VC=Zxbsyaix9`||UW(?VS}alsF~%-PY$633vgd*^$o@PY%ySxiz4Eav zmIsH2$Km)F_Y^a@&~#5cJ-$NpxYjSoF{$fT=eqt>iZ|pzWMh1 zSFhj1#bVaA+^3QgmeLY%6Pmz62$er*1^`mj*d2gH5QUAaRGTS+sluoMeKue0|LpPE z>BZ{wbbK<DHm&+Mfxr z8yhz5JW4|gvh{0x9i27jexsX#vYSyVRM6vsj}GF)o6XNY?H)gn#R3vIstZ}e2oAY$ zHjzLvjya7vJ56F-+pP`P67mUZtxaEb5r1G$uC0FUGj~Jm)2OOh3jnzK)%xPqi&tXD^3=JTy`*HpDe0cLV z664+yR%?6l+PWB*%g}UQZ1wu=?RQV<>X}@;EYD8#{G7(zBr6WZd2C`@9KeV7<i`FAX;D~|{9izgg zPv=&AZ+ZBOPvOc}V>!!xI=di3r zdifGWfY{oZQONzcdHLq*=?n3Ti0jf1X*1+h+>odVU1Nv)<=$=l=mYrZ9^N{}SpXl| zC;$gHHuEwyshE4tX@mj}Q6g=7Teo4~^^f8D(*B^>`@^N5w0TRm%tRz1_5H=g#mUL* ztIG>;+gr{lH0E@EwMxTg9LG8WqAFR{-vQ>8(u9Ztj#zu1-LM#$76zZDq5yymZmX0w zmb+QIJiZ~nL}3~Z!s@Fh7vI0SdT};iuMgJi#d;nWGZq0N0x}FPAxESxv|VeKRu|`a z9N4jwXxt>HJY*Qso{enTO78pdau_a4$uYpeQtsZKJ-8>2?%~~=aCDFwk6;Uo8SoN{ z0+KsUL??`Cxhc4H1`YG%#C8r#Nn3k){%eSW| zZ_nQvXt!v&X_NZ8?^k8LE}J2b;1-32s-%sA*6u7vcS5WHELH~`i<4m{_pJzOMi{B| zgdGqq2WW^o3vaNjNsnS^jAGI& z%L5{JZD5Y3RLnGagMdFow0~H~snQql&erUH{0ILhKs2~GJ$rL{a&d9qk0V6^*HLvn z_UHZP?XWuS*QJz&1V#n~HFGz1XJR3)3KFUysSH78f>cHOfnAWmU26J^*nprSCxznT zNJeg$f#~Qc{9NephW_l6@%hW)#p})MQ$4%l)zFUC5;*X=QAuT8a<93764Q#50Ue+K zWDY8oc*`F3JNOTt77-T^m;Zl2u|fmeNmK^?Im zA_E{g*d+23UoJLE*J8If?tt-vpT5fZ# zA_nHxYj!KDlc;+@Hg`x`avnEBN*l8bpcj{$mv7Hc&dyF(muH*xRZ6RzFZ&&gU5gQ!kO`QbzyRu6o7p7D z_I?0yy&dbl5Zis*61_FcI}ZNz1KYZ;c~VpNNqO8{OR}O~6wL@QC%am0R;$&E*KeM_ zJb8O@ez93!jl-toUbRnoEUH#{cFfEH3>D2xT?tX}-QPuYB4lAn!_agKqL@_0f$QU# ztQ%I~25oA^!m+;!~#t{2<=IEw9zz5g5EU8gdXpvy#)$Z}ONB zCjH2y@apvPn{S>xdG+%3#rdk=j3tlmimm{~9f*Ta6p0cUDY&vvJn&Fu7P(e09Lb3= zFiG3a3P3SMV#lp$QoUgGsj4>Vfny!USP(`A04Bsx+s(W(k-^=nI5)+J!akAfCde5L zcPwDDN!$w%nE`@@a z4hB$i_M9}0U`pt!Wwq%~FIL|@fBE&3XWu=0d2(^SN_{G-b+Q~GAdne4)ENj>Yz)Ck zuuhsos-w2h45l_E1R;_T+FZ1l69R8(%vEOypfaUl2NF}&WXC%0iUM*(7C=*Pq{Gs1Td|C&YF`rC0CcflKR-GB`su5$pS^tg`t zMgjxFT)+$g+}t#mF(CnlhL~{M3eO0Rj$r7(&H^BptIghxo5lU|@)E(BCw)fT)g1uH z-N5VkE+mTJO>uHybRj1q#NZNu9l;Hu5U3_g#jpy$A^{Qr8KT!p#yj6T(ZR@R+U(#) zV784YwwMx5VtMb`jqPszK_d^ox3zr-i@*+zQng~9k{O_apcJ%W+`KtI`}XBZ{m#mTGhoG$8heEstL@+w;I{lnw^gM-Cv&H!3+wb3+fZrpmBt#ESkfv#~?v=DlP(1-wwb|mPlZme^6`V$qY(t}WvB*0Q`D1r@ z%{rS++R>A6jBYoz)rBs#4U&YAhMZoXoqhS_``>*2$KQVO#h<=^_GY!tB-FOtHbCU6 zo^qK|hbp9@Zpz>RDKa<0fk~Jd9o@-2)XsQx1S5pN7ziT~2lw;KDIP!M6$pFpCC-lE|Y=eWkns0+e zwaMBzY=x+=v)F%t-odqRUhC+1C+KgxLi;rJLMKyDhtFOO{Ws5^e)gv?e)IX~pFer} z{Oo*{wGe{@78c@2Bo3&GJ}Gt9X-W)001U_uxO%Mmqh=tJVh*u&9QZR$s5NNJw0O+o0j$DNZ%pAdl zNr<<7Th8q4>R2>yR(s3Y?K`&+tNct&p>e0`vZdVunMZXg#_D1q4h$$YN-MP{nOZ&%x_ zidNcIYq-vL9ES1NfBfu!{>`ty`0m?hr>7TVg4oJ@5!x9ddM-YUkVej#ih`qQF)P)r zRM~HI7sSXMLu^72CUgyifmz(ijlqQ|2r&Y=vl&Mq2OP%n^z9jmEEdadzKCrLIQ7nM zb5JHE2U0^Yr)g1;rlfOHC4DEF@9qE!H6o*(>YG;|$&){>taPq2R_}n%s$mb4nKZBB zwJ^<+^=<1$rIT%&!0QoEQ&-zgl{Ym_DGg&uNlRAMJ`HE9i`SBtHA7ZS2qqGc#6XIYIyg=0R>15?b;PeD zOilzG1CbCop>u@@$dQ}`NPxtV>l`3+s*`f-fENTqGy+4=NxI&2OJQfED)^%A+d&0Z z%*>6d>NS9sqGnmZ84=xb$-|H~n>>s;r6G@}m*-zSfAX6z{_uBy`0Vo+r*8)@C`iIY zUbKwExL%F@T63y$@rKZYZ9qW?iQG&igxDZ)aUXL=#2AE;BKVA~A+D0x=Af#9Y0<=G z7b0UyiDSJ(Btu%SSL^kvX~W+B^3JWBgg*2=01z=E)sZrU6oNDj*EurP%fA~q(qDy zr3oR52*<#6T(6pE?L<08)Gz8r==M7eY4 zR$u{#5E??(qGnEjK`06dGge6{Rntk|p|-+TmBpNMPPw)_PYRIlc}v(WuGMe`paLVi z^@eREw-ttiYJhSsrDSkmW?><4*OJGf~i zSKoc{-P30$7gv4JDmZ8k6?`=FDbuQO-6RspF~+tfCn27<^Cm`OmO63+(R0xu&7!nS zP)3A0pe6)D(2QEZHAo%7;yi1DA(C*2Aw+VtH*e40zC9bq@#c+Nj~{>BHZxO8{V2>$ zj09$-jN_QbWU4~cG)>#Kp$;+LBFi+5sl>XVw(CRO1|JUFUR;1JU9Sp)8MsYSF8(f- zsf%t!O{Z3TcPpjjG-yg_CWuT3?j;TV)mceH9WRjF-(Ic0e)i&bUw-wQ&%gTO$+Oqz zo9rUZ9Kc;O)Tygh@v-V_szgPN$B>&wnhuc~iOcyi#<+_c7y-4A<(4s$2SOoYqBh3J z=p|P%ur`LajZI|X7)mLX04suyaCy1<{Hw1CfhlOgPd<3G=oSF1X&A>%U_wAQtZ6og z5TX$2mXS0~PnuL>d}=zJSiS%VM6ex8vco8ib~*st_FV9H-CdIy?XHeqA4Y{4e6mZm z!#wAd$H9skc+s*>!|RKyZ=S#U^2zfrzkB}l)#>?FuTCtHF`$oFNBc}Q&B=gJjR3Y; z7E2I`EZA~r+nF$_=5@a+DY0AE1d#>h4CYqqA%y0-2wk0{TuR;<-BL;}xfZds zY-iS0#rA6kxh97A?vAg2!?(!N7Fb0fq*6-B*?pQHRdp|OO5-pL!?5Z5TrzS<>L-`$ zub;j6?8~qJ;g4VZ;p=aoy*^nF8IYI*I%qE7nb5Z)iWT;sc68N6WD$u`ViTHf-p!WX zyldMgHbk`9to!xaH1Boo@%}!RB7g_`dxB8%5D)|$>S#N{CdRI7XI(30V#%qSYcUd< zwF^ypdA{z~V;&U@-<+QQZ~mMA`e5FL;~VZNms~So7OtT}9sA+#A%v}bS;|FG+!1ZN z%G2(iVmKzZt)2`c(k>_5CNl4}5V%`TC8zA*b^Zb%Xeq-u48u@z&T7RWyZ2*RZ8opp zzWwgyi!Yyi|Lu#Hug}k~`XQS$2@{|eQ}?1Mjuo|Z#HlHGYr+VbMM9Jy65H5x%f)ih zbOMNOW?C;;RUI(K$ctrgo6Y86`!e|Mx##US5d6zyCLXdH>Fhk~jT&lTwNSI80(c6-?OT_frOF=C0}hR#ns{^tPhs zXjrjcL#Tt#@yBbtv-oP}W+|tkA3_jrA|R;hFpQgi7*lfaTx>n0tE<)Px93k@y#4OQ z%O}sDK6&x{&E=&6Qk_Z1NN(Uppg<1OgrK^m9VgY!no6*Q&@@emQDPgLcD7i|n+}Vn zVJMZmBVwtHDGw>{&E|_JZDbo)fm}cXLaix`1;$)9!>HO$49oyfn9XcV<9fZ>^!=ENA)y2(I$N*5d;a3HKYsrAzx(~) z|NhI*zy1Ej>FLF~FYXe9L}5lR>ZK598+g_RCp3gx3%rK5v`qr*cc@H9XkJHb|%nUO?+H$!sw<*bofAz?&D zM4)1xb3!1N09Hp5+3U;mlRsQ84)!^OfAiOW_2K=y%f$lS$CQSCqiP~D3&J53Ev6-_ zR;xm44pvnL>xvU05==N~LD1sv70KN-jK1TZzMJ)2p52ym;~Y z)wj={ef8awC*Obn{ME_HML!lr24svJS$L97+gd9H&sA;c8V*-`@DNF)?uyuiCWc5s zIMg`Hkw8s{l(K3a3pnOtxva;W9a`q5X{c*kNCK`#2%#Y9)i9<~N?~CPOi@?}Oub~& zq5!}|>Y7WgV|Kv&^v&tB=P!!kaTea;ixKvZ7`eDiAn9M!4ZPRsz^y2mF-~RrO|LJf3_J8^>zy949 zUp_xMT@9ll)N#gb6N3oCG-jBPYK?GI>r+t&n#Pq*n%c}P9Abz~Z0g|oAb~|Ba1>!6 zFz@^RYPIUeam=Z12?S@6$h>HqmMlPN$)!dC(gHVE>%mkH=7DFkE=FMlD{2MMQKX6x zt7-voiQF_zjIkfm+4_WpSr`+Z~xQnn2Dz~O8g;-I|TC$d+3a$iohzaMEUc7wuyMOw_|NLM6{y+c2KYsr8 zx3AAG`l8v<5QQx;)FGo)^0F$769<&w#EM+1{?9cQ71goRb&7qAb*+V&19RjmSqknc z=V2T#*H@c}JFiLWm&}kQr>&!)Jf^yG%4nb5kjfp76rk!>37w69*U-eoJTal)*v^Fy`Cj=B~8y*yMD$)q#Z0>*(Yt}Ih zLUxk6Eeoitg9+oTi|%%|UjL83{o?t>_`9!P{Pn;7>tFu-XOAD;J2*HduyK7gZq_9y z(o%=()Ye=AL?>opr>dGcODJ7*`imO*S`M`u60AMxR%gg@T@1K4C z)t`R<#ph3+Jv%u&yV~?wkV9Z$WRFM)0*-FA%c;hmlbR=hTgl)~?g-9^gzt1h%|X?v zPA^0z4iekgGiO2{x z&>DW#@qW}qNK!n@Mc59-{zSJO1}MYmb6p1yeY`t{2{{_zjL{=5J3um9>V z{?%Xn;-e29-8?+(nrH}wBuz`q?(S+#^#J{$Y75BFuc85 zJ$?4<`|qDVfByW-ufPBDn`am6RbSGmO2SPWLyXK^S??3{fks?2-goZ!2mMaF?6C$a zb(&h&&K8U1a&Lb=Up8$=EP!Zc6eV_X-gRU?Y!#7pIy_#q6a;rO^ip{J?DF#D z?Cq;JC(mEKdVO;8_U!EZ?ZxVHRop=+#K19d6e6m{bx=jGlN!<933tA$xcaplsr4zf z0^rONLg>2Le7>A7_vZ6OH=Bjn5)(L@yF`g?(}d_LL#+*!vc+s%t>iMP+l~FEq{PDW z#Ukd>)x=ziW;a2Y&)e;&i*4oi&o1T!`PtQa)sJIQ6~H!zRv3jz1h^JBD@LGX&PYT%)5* z12xngJOqld>DpP>&6=iV35a!gCJ}Q$;wX`Y5sSN(qB(0RHIi{KHBB~+(H%B@zv)eF zIiH*5VY6ufX26$20=LC%R>u^e@wK4`F-j44?W(on_wZNeE>ip_* z`07tjp0!OIM50Itp^Z%wLd|!CIflr@b&hTt(|WTWhtUDeEom8Z?o;Yh9&^s7fP~V- zh67 z6S%8t$vLN#b5hePOk#EZjw>O!!)86KE?51~?*-~+ErObea=F@!uG%eTGBq>To(8O zHKXxoWXjyD8m$*I+zkLA5{^iW#6(oXiIkES4HfS%CD++dHj$2VDX7Xwj6_V-MB!jw zrG7C;j3LGlCJL!)$<;lT0m=`yf)F!9oo)ov{3Rnocd&m(#C~^n+pcZewx%>9K|+kN zZM!ZuZ3q?E5hAYNFXONyQcQCIw75?knMuUCm}Twze&ybDa(u9ll=-3;m<*A;tC`?L zUEJ|_u3y=1UjPvh@-&T^wiHNpb405RSKE5dyNy&g$#%-BSA=ic%uF5)q6-Ms2LJ@_ zDUG1!=4eiUf<(eZ?C9=L=gL+YTr*eIIsv?@7u9*am7V}wQtt#Y?r1_d1td+=&SvxZ zV$sd!Z9AJbdk~Q*BE&MAcTE#k=jK(2zJ?|xm&$|K68>A^S&U7TD)9@9B;2$(pS4V2 zrMRk8g6vKR60cKrf3)ITNcw#NRjcD$5Rh0E5Z$2SKenA}%+u+VIu$~Ts+Nh&fQPC-G=^Bbs>M?%UQQuh)dzp-)@1*ZrCd<1R9h5G01! zG_(19vD{nkE!%b$LfjH-IE2`?UDGz*Vnz(B%gdZg$~o70E=3)z5;%fmWSTY2QQOYi z1^_4sM={qX#)G|O6J%uy<`RNrFH@TBJJjgU3GwfMXfsvYc9BfgkFD<{0IZ~LtqhV~ zAcj^nq2k22nbf$!!BLIO9lU_nA}0e%Xd}D35fBq2OSUrPiUkrQF%!uIxL1>?Rt2$; zwv&i|EC5!gSH&2crkT$di{)}}Z+~xZe?DJI5OXhCOECa!J8Zgke}7+^Fr>a8$IJD4 zy(Z%P>u?SC-_gYo!LcIWwd1QI5awt`P|?>q6b-D_KDP3oM3Z9!vtUGkR{O)yiGeHC zf+q@_A{n3}BA~fh9a2jKyv-P~c1Bbx`ZQ4XeG2D0$-odo+qR3v;^63L|KMOgTXfwl z#AxPPH01(Sk%6d*&1^O|_HlE0xn7@NUS6(O{Wug;1PH=i+cZQGa28@40y>&nDOR+o zQSA^8q1j(7FJ>!nkXi<<*ico2$7{-C*As-vg1c4t8sEPmceAXzt$s}f5->ob`mq55jGXv##x!17J&x2K{>70Oc+W!!R~5>)L9XmdnNdadx=b-`OJnuwMofN2canzYZL@-qv4cwU-i4?pt zJctpd8vK^$=Z3EYMi7dzIwN<; zb0=xq*pPevS0*yUEfuK-+$?9+I83YOOrHn+P!ti-OwBwQEb=nk}Gd+IfYiiC8Mf zsm{!7+qUbvuIt*it+S}B9UsT>{PgVd{BlfVsl&7Y+O|EuaeVXm_|C1{d-Fv~`PK6m zUw`%Gw_ksGdG;2~+Ey0xX4Z9qiNI4%V@j$v=7K~~xQQ`{5E22@H*hUEmt3HQnmLg$ z2LfWM6cHW1sq~-dRcT>NqC~&O}f$AadKe-(51j z3n6wG$F+&QlVz^7@oD%a)oPrGNC+{6ZDPV9hHf^iL1!JMD#S{R7g!z1ae0==)gU63QczpZ#=8(qM&tH7;`#*g1r!UV=PX%E)pUu12#z0Jt zpj#2soV64aL}qG&G%+v&y4BgfnzL&`01=itlTMfoNY8$jrOk6#xM^1c|Zfx^C8W z-E7vjZCmLH!qq8DklDOL#B}Yo*=*`UUtL{YUS6(Nt8p9&8G+O+gwS@~y?ggQ{`lih zKl$|5&6{ra;`^sx{{D}@|Ht2+ynN2;dk2f7{Y4vtYe{Kz(|Sy@T2fVa0wk~~)HOk9 zY6aJl(+B__gS1VQT5nZEG6_+*nVA-FU?ev$Mbj{A(H< zo8SJ!KmPvrzdw2TQe1ByF7}s;u89afmXcDcrx^jXHgO3v0;9Kq=WP=R(3L5aoO(-y z(6%v7_Y*?}U)YEwFa~A{BBnl$DW~LR!sD5_8t8hwg}G^(wrN8QguHF;fOqz!(srl8 zPQFtc+UXB%;a%7<#fV9!g$^M|2rBvsMRQ7H8pm-*DQ2=u)KLNW5SYCMFdMJ?-G$ZK}SME(2&lWFmEHHp<4_LR>mWjaD(bZ2RDY+piQa$;d}VP8jYa%69AE^2UR z@=d1r0000bbVXQnWMOn=I%9HWVRU5xGB7bUEif}JGci;$Fgh_ZIy5ycFgH3dFxI`* z8UO$QC3HntbYx+4WjbwdWNBu305UK!H7zhREi*AxGB7$ZGdeUlEigAaFfb|gXIKCL x02p*dSaefwW^{L9a%BK;VQFr3E^cLXAT%y8E;VI^GGzb&002ovPDHLkV1o4xz&HQ^ literal 17539 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 delta 4927 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 Ef|nq%F8}}l diff --git a/src/main/resources/Batgirl3c.png b/src/main/resources/Batgirl3c.png old mode 100644 new mode 100755 index 7a2cb0e8df0ff46672ce56fe20649d62b1edd6ca..f6918c7460a5ec413f2fe3c4af5e9b716d530737 GIT binary patch literal 21057 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 N002ovPDHLkV1m$CMt1-J delta 12225 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 P00000NkvXXu0mjf-y@K% diff --git a/src/test/java/org/teachingextensions/logo/PuzzleBoardTest.show_initial_puzzle.approved.png b/src/test/java/org/teachingextensions/logo/PuzzleBoardTest.show_initial_puzzle.approved.png index f2abf821fec01776af5a860b898dc68c39975fde..6d6faaea51fb62480156c02da52b8debf1ac9e6c 100644 GIT binary patch literal 191181 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

    E8fpR??z@&j8AWTx`iVz%%{)?Q_?f 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 E2T0simPvi2n#50|SFlSxH_80|N_&fq~hCdk>gn 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 O0CPU==GbU|neZ=S0%?{2 diff --git a/src/test/java/org/teachingextensions/logo/PuzzleBoardTest.show_provided_puzzle.approved.png b/src/test/java/org/teachingextensions/logo/PuzzleBoardTest.show_provided_puzzle.approved.png index 36f107835a397ebe3ce20f8ff454758732a47707..e2d053d1e75356a8744f2fc2947c93b42409e8fa 100644 GIT binary patch literal 191376 zcmb5VbySo=A3wT)bax9PolCQ{0@6rGNG>5rE4zf`5|RocwZJ0Xuz-|HhXTsd-BL?~ zf`F9V)%SgW_uO;tIrrT8bI(3A&&>0k?|eToafSw(?Lbjbu#OO#M7mvB z=O&zZZD|;|pOW1C>cop=ivkd6PgGVYivA&>0X%q@_x7>U^-b8#R@fgt=Kr;u^T}HY zyNKlfws6q>|1~_wqyIGm%$xrzn`2ZvXFI2mZgiU8MZo`G@1*JPK9xF&IxLr~f|x_t|jJe`of0{QooX-^u)U7JvWS zh4}9)|NSok1|25#Z!P|RJOaI0xjnl5w=Ta(2mdqhzgPNCkN+F^KjZ#CUhlvE`a9O2 zg`PztiGzG@_Tn{Zp^P{5Mbn!T#K|2>*|EmFq5M6LH@+>kL#8i7_4jM@-g^e*s4<5g z2@ms87q(U3SB@6F3E=5Ze59V)3w#!knW(}4imBj4MA^`f}6u+pr#C;X-@6IEQ<-1eEIHx1kSS z-s13Bh}&}5zmB+~BTFOMt0lhzhiR!inrz+@2&%w4odN$3A|67`Rd8PA9 z|NOP8vNFXo-qxF=dp)|h!+i7W=d*JGnyuMK7dOhrR5dpZMrlrV%F2l$rmKtJT*KBw z9&9!pgan(99>z4|AJkDOw-w%;U(enP>13atj*%_!oJMx6w94|#zq-n5T4`(HuJZqe z8kye9$oRE0MLHjRVcqa^?db!KTosYzjv?&l9uvcZ2v9Bwqe0CItNWHf#-u;G_M-i{ zl)7Ekh%FkHQo;dr;ZPW;A@=Z&|G{)5 z@cq+O+}VXv9$tEw6;2ku>j%!}XW9pQw+%n-I4~Bn#1OB%GnXDj$MU}k;zP74d64*! zv?g;rpQ$c{s>Kwre=9B4HbPF;Gy();OW(brdZv5a!d)|1bkY7%Kz`#US2;+}k+yJh zdG1m3u9uOTiBffy$e8j9H%|B~1S8%YHOINuGN1K3p*EEIp%)EiEsG|(;QcC~IQ1cp z&O*=nUKfIP<6Dn)7j8otIfR;Z`C&KLfQAP=K@d)QeIAa|QQe9{bt$Wj-|ZTV5c9wr zUEpYG&WB_o5oMuXm|lLCc1@eNum#d zF6Aumgpz5uJ>Vt+4yx8!89KOcP;_5jG zA8lXDX}X{q0LJOvN3nJ(6B`6je3%IsfAo?Vm@y6(4Y?28DvTu^u!#VX_qBlyGFZ{3 zxGiu3pPzzxBf2Vh+jn-UL>yz)oG5@XTNX((Twer}LFq}|X#d*vKx{yF5MH%5P=e=| z^MJW_aJwUy?fHdZG2DjNXUzfw$KsO@0?6`c2OXh>mDn-R zGDr`C0%`zX_%oo|Ki?R(2@G%aKhadq5Y9syGvlnOZ}LWL5;G*7XlYS7Il zgo#C>x)Isd_6B$@WfbmzlwR4wl!8`N@GxE^+f&J;X+8Jy+|+>IP!lpc_#^a?uW05{4lo|P7a0BREfP1PR^7Zc&3Ag z?dnyRHH)tLNGe-DBxEHDA4ak*5&LbmuALniV+kVCrz+KCmUs3%CU*)AO}F=Y!&}nl z>gN1jzI9>8pjU*2ZMS%)CU+vE-tjURkYsaH#Dau zFEsieLQLVhQA^pp)~o{i#jNOjTd}?c0E8?0tuBzUf%CD(Aq9>%j@9)isxeZ_tMq+J zEz;*#?md@f9l2pgI;!U6vo?&|B*13JZtH-s)))I_lqp4jb=sO2b_PP(9%YQdsWg!;4X)s7!-@u9~ z^4&9)4#;Z|PK!_v!u*?Qw{ILNE#AbN%Vvxi?vhKm+St8N2hZg@P=oc;qpf@)9Vl-q(f z0}oc(gY;Qh$v|W-4^}8%U$^4=2Fbj+XB>0HwZD+Yzc3sli>q|}=Q=b4oVbbag9~Z( ztMILqd57H}LgotQ%$SDDmL&5?5c|Af_y@*OY)rYe{!1@+Fm%DFof3PbajClqm@q)W zpikq%Y3I)eV8*dm*#OVt$Wd&Ph`=12o){X53gG5`cIrf@$($vBv=0Y0YBn! z$+QE!rUvsRePfcEHM^HQ=fU8hfUu#{`I?%V(ZZPXou!402GRgWI4QxI(~iolvth&i z7YcslOMMD;D&44PO22{rg{8b9`i(Q?Ibie4VqT&!`X*lahO`9?J`@I8=|4XNmXEmbF^q%T~ zR_o5joDs^Ab$<~X3e8+!0zc<2^~=t*2G_GOGZ(a;Pvc_~P&jk*S8`CMdrg+x$owHaa^+ zqAf&~5wTfn{=qwXU)UlKe8Qw!CXcuZKX?taRiP??E`L&45tD$w-vY7w}haDoWFse_H@LvBt9gVcZsIoo$+#t4BTO${mP@Gsij?(sa9O{ja1%*y+HyR2MU11bcBSXW=3*H z(Z4?JHRi&Zip$H1cXtkoI{t`S+GZ9ulR;zA-DuE&ZaAu%64!Yfs^k>MxHMc!(@N7x zh)$c$x=z5Rn!j_#muG~V%wK&4nhTBo#W9x};6v_g=#;5F(h}v{HT~X4V{)H6jf%aL zjhyirSo8>{iqlO3j1is2MgOe(EIf<6rOl?9{PFXu*NwZ|@Ynv1S{4&Wet5XDrOP`j zTblyRG;cU6x^IEZZ>XWEiNEG5nwKaVq)M$?1n{63LHS(f;zHgpYp|Gk!$%*Gy(pQk zd*7z~b>(Rst};31nyWDkHCaXBGZT(-%R8J`?FYt4xqttjGKpqCKH)d6BzwB;q=BdY z+*^|iQZGq+n2g#X&dSctZ#pxpsO;2G3Sqxi$SI`cu+wd!7kDA1@q0fyMs39lhv{Bh z2Cl+Li|oQJaxK(!a>#~pS5R7=&7;l#Z-!PO#w_L`Ess!cV2TCuzeo>$mC<2IaDJ)EqQLg>#Pve~nV|nnhHF5X z9hkxhRh*{b=HZpM;&rP5MmDlbLr(DFCaz{()T$J;_Yk2FgJ%U<=ZkNA}-qNdAE{`S{+ujXDubF;Ql2ZR0O=v+F_ zZadzYR1B3~JdWGKXbC@9R<3Mow&cv@%8c}-8_SoGXjJ6wJz!}Q>)-hJ@;7j*$8oBy zcg1YwNSL8M*sVQL56SUbZeV^1P3&_SoYpotu$QlWr}0cf3cK zTw;KnoN|2kl0-y!$izhV{*BqWc^$8-TgUxIJptuD#?T=U3m+i$I5Z}s2rp+rt_IrR zlM;nJ*WHWwVT-wJnF+4Rp!S_L8uU)NnI}6;lejOS-`QC-XH%Az&|i!fUN|2 zXA~9x)5Z_-8XeY1k6Y#1Gb>vB-t!DDPG4N9u?ZU{T?ESPkDm=C-Hs0|b|f(W%*BTU zvP}OUjALr9w$=EUXS?!_ciQrxWj|F(>c_N(bTjfC`nM?t(^4u1R)7GKJT)guhZnTv zTW9iJ?DBdi7nP9A7IF&oBPgs;{q?l8}E$n?l=A z`$?77gm!XrUa$FZv7n_--p$p$;2E@DqRa-du}zn&x&N4n49A;TANHtUis;SlHymJL zx~Qy%b^71RD3XBmXVpYDP^x|{o2DRGdp2hli(V7Pn~8tBI`_I6RAo^P>LjG zzAw1#ZMRT-YNf|Q{<*j9sG?f70(wXST|KeeZkh$p$xA=utyo`i(bQyB3WVlTy!-YH zPI__9#MI0)PT1{20cLnm_?o~E|C5mVTGJhX$P|J1j6t_V8$R76{V$^@H05d#LU+m+ zF`~0?jj=^`WsPI^6BGc#A+kr~P2c~T9;yMae4?_&`>z^RL>E_hMSs${GxEwq3_fu# z1d@#&DkM9~P9&YgsWr$iI{iHxjbZ~QJ`l~ZhYx~IrF=?rYwJdZlAQ%i>UL}f1`Ly+-5 z?Kho!mQ%mAn`^6&M2ol-Jzkk1pLfeKymv(1kV=+{YiGUp-n5A?7W`nWYl_QPTK4ge zb)qA&`=7WSnl#34LEdy$?u*ilXZgL93L-${fOWYEtr>oB{aI~&D|^R!fqs~&*qs}CgI=@ zhS}@qBJAUZfrN0kx@Z3T66gzAVNf`-=;_051Ub};mZuHV$$;rv2B1xk^Z(W&zY@9^ z=ZyMHV`Xmi;FYJd7kUrDqBY$Jq^14gXL8J%k%By9vs3RPNXQ(9QWO89q!};GlvnyV zcWm}I_uIs`qyzdxdPcXSoKv#0V|GW21y$zg|Rh4*(AnO(239|HiT(BNDO@FVn!#%xluZR>j< zd^FCaX!l~GEIQ7w*^3SHYevpqbQ{+P%LM4$rh$ja_y6%&@Jc~>f17u$yLC7aEavIc zsc-4Fz6;Fo>tf?L7k<`jZCq?oEma9au&*i@`9fi+JF24hfPBCKT=X+aytc`+R2+-_GG?(XGY@TK@w{9S?_soZ?pKZ;tV zT$kwv*3qbkQ3legYz&1E&AQ%rPIFpxT(gbQb0oh$ia>1dF$|@b2He7jdX2SI_99jk zBnb0JB?n%6A74^(1>oFIE=GjREsCi%!NdO6&DzTSjIY8uQF$49CQH7s!2yh;G%i{})M4Jy%$4~+$(e*@}<3rP4J zVj@!O%l@vC;Rj-fh6mU${}M+Y9|HSCCX~?#KGegLk$ng0v9$$@y0X$+?fKMEv481> zX6cWE&=D6Q%Exv;69xw-C4pM^*Vh{wKI+v&>ZO2ETI3=_P*T^b5{1dx@d4Qh=6E0i zoG$d8*`_IW_}-A<7^uryP|(#uo3WRK=a2wuFXR^UC{Du16ZT^N{?1}R(OI2+jCo3y z&noW}RWejcS2gZM-YA)oU}Ms$r7zog$lw4T=Fav*Y|Z#&p3O*J){HiCHeUoscH|)F z11{QrTumJvJodYG2-xh|%@%1b_33dglW2N6gQC6HD^Crumych3v}R0MP3Me6bH@#9 zV}sP#?l)Xd@ge|bl>W^&V&p7Q!6_E{cDSx09Azl&YW~cy&2efG_0>C@_NpnLJo)!` z6wG?G$@FCpTa+`AN-y&UWLx!DVt7*bo5o64yBUJdFEAxZ-tiUU^5&l3ru6^P%zAk0 zrmFt5-!TO5HjUfHxx+0%tQZ4{Vycqf#pDQ-Fj(}Sz|cde!Q+vV#xg_%DwP}}V1eW& zb^LrBn<_rAX%a)`<60i1E8)?;dJA=7#4uwBo(H?dPah&DuGb=@RHYi53~d~hmRyl8 zaQ8gsj__zE0ssW|pp6eK`lVlA0IsXaqc051c;iM+ZDtY$u+f_Q5O6W50IfKy z6MqNbX}flyOo|!pW}$^IIKbC=daZ?nRTpxX6EYBd=xU@^mT%T=Ez@0Anh}uH!$oAP z#_6fAl)QwhSgsOgWHsf8I#*KzQvkJ1CnqnvVeeo?_=QRAbzH7L`O>IKl@C zM=`1OC1i}ay7@&15)it&d8HpJeR`arn;`WWII}qYjdMozl+5Q;{}jtFKEUY^$Ym=Q zf$Q?z`Sza7SX;YsJ{i?udS2R#h|hawTD|bL8gtPu}H@6P52yhvK3<~RTrRUw7b zUZc`lE2WyHG}Q_tCl^-k1Ic+`B*6fpx6ZAcn}h3&VUh&Skm-f!ScK2LbLxM z+ZT7tlO<~&!%F&VEFDMUI$b4;&QGUcugL(5W((tHV+qp@Xr2i$quySWkF#I3zt;C# z|CNuQI^PA^>x)O{+h6aqWM>sE=ikeE3NIy0x;u{ByO>7~IURb73-SN$3{n=?QSKlv zoHiJ*`ub_I3TNYe@V-=}^`me$#be_!2banSlw9zRb=!{hhNa}zEMfn76o_w>N4UJD z#YbR5hh`xSE)t}eDPMB@p;w~N_*)j=hvUMDiK5ryw%;;_lS``0UgUjl72U*v;O8Zj zNmbTNMv88)X>Yyv6UlxrqTOC0Rhbi=<{W496P|G8FO2{DtjA$t&rMXPhW*CK+#>9F1Szv`R@S^8#gC zKXGE=u27YBmIvG&3~#jw%YM`!?V9ARqgl4PK9Wd4)MXw2Kr~IT$J#6sRAfu7ge5k} z!Jv$CY6Fx_(3Uc8!dK(sLG?ZLpWpm=H#elcr-w+2fz4+1MlUVlWi2vGj>u_ZdI555 zp4Le`fPq4qJjy0}KD&>rYxhPfwdXqp+lrLHFW z%TCZNaiX6M!VnWj21mgfgkn!VCb5p*5Cco)-72x%MPH1mF(?lYt#Q!*^469b6A=`g zNSGRr@0uHCx92XDW`B4{LjIOa0^Mk0Wko7xRo+;g?6q=9>f0ba(Szm=2{?JEYEX~_ z(|QbFC?~-P;@C|2>_qtXAe1eIzvDvQc~`Qb=}RBU*$;zGPQmMue53Tg##k|JFpA^d zVBZLYIJpc~)x{D_w{CwqA8evE3QVuth(fhR{KY_acyPznMqG#vNNBt?%2#vllk_uO zS`N;*(Ju+W{u-3rkhYYk;|co^dc@c~jKi0bf&uK6?w!?+cQXzc8=Y6z4~A5^mkFt3 z5+MSaBP2{3pT%;V;ks73_z*yA16C|pcwZ<8JLCl$sKlgV>-X&;jg4`|>Gh+1 zAO9^ERrP`X?0J=RnF;e(*3lpiy9_G!A4l#X?TYAXT_-OM7ES{Ru))v4;R8rit)K#)|_il-=5T)RqUN6<~X_L z)+O$E*%5S`#aqHxUR|0k&$L{^$hfWC%l0NRi227mXHTbh?q1&c3UB?NdjwmsosA7$ z9$ZI>`Y>nmWq-B!5bzEcm8#o9`{G$~kmL9}BWtGP+nZoyE%3&F0%wd41bXpw5MiGkm-MNhM{S&N;K zIrbE8Rh|0PZ%-SVa0$NcNiKwP+B{<}_%5tU$pwmiBisQJl zh0~UJgj9)4?D##OW+U=#sdkM1cwpHbiR0~y6Fws}(xj49LLWyo|9Pieys5 z0|?O~tRMX2JAL^ib4D&?hlIT$F|&3`b;%SaCfLM7I6f919UJf>*RE5{xtnQ|-VwVW zyMLT7w@W{Ut3if$m!vH%txD?R#CI_&>Xw$-U*tX&7QPN_VLr^-Ezdt>czb+wx>>K8 z`q5pwkT7T*4J)UFed6!6xo64eCosKT2h5Gcm3Oy%EjwvLc%}nJs%yN1lsMhA$SyTG z3tnr_Xd2;c8}gOze4m)IA12-Q(;#!r@?%d%=>SV%!~ZxWxU=uWr>H=A?`NW4iT&{h z6h6WZ5Zwno)31=wt2lOTlZQ^^omXd&_(HQbd<8r$qjWlXg|ON}TUl_Xl&7=_ zZ`%d|#5IN|4jZyGou4dX9e%zOrWJP&>Wlt_D5)Y35MU*cTm?S}Y!Gp^O8!hKLeJ$< zl{(l!GQwOd{e}#Jrx?=Cx}Bz%S9{;*o}Lr<9qEP0W0aiGKAu#_dmj13$hMJ4!gK4I zo9iCLB*cN_j<8N2A75E%O@`&dLRnf^Av?S0)o^nUu$opx(pf=e#mQYuz}+~rMmJAej>wb5EL+krIdTAaZmFe8|v5mLCmKDo4jRXE)fpp6b~=2q@0UDl8Z_N)&qg-bd5 z@tPtdpsuF_%$a!TpAr-cbm~V;UBaZv+1P`O%XcOMC826g@%Ib@VT*Qy7!=kQ(%*~= zS>RX>2pmgeJ$Uv{3HOA3x;wC>h|WomM0psw$h-sDi+bZNjY-=dPBux^DINrbOv{^F zWO%fNsX^)|q!cAS17%h3)83cr{HQ8)ZpNcCGe0K?Bpi%ML^8CPcn@_1pB@Vo)5QEb zIEh108fTY{4Z5to4s6#QZ`;yQ+@?bpBk>?xY3PK#cZA{vFmUhwi|H0lm` z_=E91KOO_PN!K<3gayvS?%YkXO=BK~a)TkK2M~%id&A6;ez^maviYpFOOm!Zw=LwHPgnKG*^Fb2fWo(FYnem+sN| z%Ck!QuLtXyw?$@FI8qqBIbqt(2G-r-_GjKcPV_Yo2N6B`4E&9c&Z&E05_Ebk@bh(5)0+JuXyiPw27NwETb9u}W)U{XuwZy}W z5{b(xehzyMWdI|m2wE^00ylMYpdf zZ!#(yS3wL8@xls+GjB&9boc;Wg2r}$g!gpJha-mvA%7EPayTlN0LoZ3LV`&Y?Zx^s zwGU!ECagLBsxBAoFz<$w!gd+NjY8xLouy5Ii%P!f+j%5Dj<8G|POVOA}D6RXxVR%<-498Jtnf$CZ2<6ZBp+O~#= zi$)U=0c_sg!&dhmy^HpDD;_LdG_;Eal#swevaE<~#y7c)8+Pe24? zoBZ0jUN`n2@MJf03edYEBJVzC0VBZcvfc+jhJNzSBrU|@auWI&CXMBmD&j^>Bib#o zkaP4xM%fw*L0ghG!4&#bKnl^RVV-t}GNEt(RvOeIH*E9Zsga1Pf4DQQ6=R~81s0o* z5~E*9n{FGHYW|}8?7H_WWaMLUaz}!m5eeo+Fny*P?VSS1YNSm|XUD^KB^$EmOSljd zh)F|jixy{T6w$Wb)z#%&!;Z6D54<9p}DEZ#OmsQuy@EiMnqT+a!`D@hu zg=6kgmFWliDOEyvu&0c*5LRtJR}Mn7zzc{eTFpp$&(yrk>CD~ejLd?PLqV*pRdhD4 zF%Gw}7H|6-mIk&9;-_v2spG;y7x!p29$ElnE*~m4CmpS{*k1WYf7;n`wY0L!@G=Xy z$0ZR%Km@fBf~yT#2U(>6*vG5Oa;G@%s=9Q&U(C022hq; zal>Zn`xKPO61VQdie&kjx!Pyr)#mtEp}Wp40!3NldekeVUnBj`S_|C5g_`4`2LH<< zvtn~78y;0rlf7Ltf6j;Kc6l@pDYaseMHnJS>wI74wzRbksH>!uBT>eN1<`VRr#_Ow z6MJ{J^B?Jje$RHW3aVFS!z!?i$<8i(JK&=fXuZSxDCu-Gmg!Tc=Yq`W*O!RyX`O#; zhDA1dd^h8`gK`LZPSjREWk-gjU!tjs&RlWmuwaPSeoGBTqY*00k6Gv4+$h}^l#8^ zXH%t^=8o-aY_xn!#q?8J38b@-ee}5xKN%fMZmCtn8`+jPLi&Ses}B~)^zbc5FXCvI z)0}wQi|ce(+NgjAJ!PpG^R$KpgHUa@!;)|D!2WqP+Rr@n;RfTiT>q8BZ0zR#oh+`k z7<@=Zs+cEIZYE0zi3@3wCQkf$!2P&0H&^FiF~(f%`Ae^?%d4QW(q`T9s*^#plitZ| zDc@6n6TB5VRx6gW#_DnaWN7GAN?cj5b%FKQ`d%hFK*@-`KI`Sry6o}dA?o5KWbqIU z$>kzaX*!oTL0+2y$4DeeniI{JkhGLKbM|%N)c^IPc=eripK{A)B6jYjdLvzlLTP8s zBhjG*k;9~U#rD2o5e+L`PwIu>+56H~6x$WA75LEQnKi`ySV}Y@!=?vWu2$`=C$0Az z$LK0m>5kUH9FQ@cMQs-I$>xgi{BUe?lCBzAO^m)bG`~D|Zx=8+_aQciy?SzKigyfz z59w74`E`78pM+2tvi6(`;&AT7f-*@Oz$whV2y>hb#b$R}Ug)M&UgZ<-QZR)Ke?QsFSNKpCG`;f| zUY%7j)@Dq9`at!vfqt@_a2CZaSsp}r#(sED+N?K9gdF3eMej&+r`Ou7Acgw)z@ydn z3X3NuCO5dNt1L^ppTksTD*-l|*T%m$B$$FCe>5_&_dhLj;0n>!q)8Lko!Jm zT{K%UURIgE0Who!O5zuOumVl@l{vshnz}{Dgvaf#VU^FZhYiT5+Pn%wz2!n5)Wzr2 z=)eh#Lh0cDvE|58Kx|ddLAk|ZP09)__P$yss^%~d0f;B0v*#r}rx_l^HW{Qi?Bc`$ z!{>?#3s%n9W+Q3iKvs{UH{>Gc-jPEhCH8z?hQ#%i^p{t+=Imzg;bY!8V+|ys1l;RECdm7%(<<792~UAZ`ce97`yyUQZ=cz^7B9L#U=eKp*x zR^-f|pOJ)8Ams;xLWAP~aiA1Gkgwc~bwgfZ;aQP6R(slh?&(&Q(oegt)^PFj?Uel+ zFEFccvh&;SQ6^dra5gS{{TXazM-a%@=ucsa=PxULJ2jYcD6dKgCk+7P$fDc*4G2_7epd}lpiC@eP@ZMw6 zFh-cFDgbdel@=sKliABJrWf|fv6qd7bM(vn zqOlkY({{;QO79{ZTxrNR$|J3lJ_TbRy^s9KnpvlU$*2nX=UDT9{Kl(?Ic^Ova6Uae zd5yRGr1uWzp_GHh7FJ6DK%4O6S<%F!Jd=7)2M6S~oV|^4u-hK%{4pSuwn+mUIDaKU zALuxVCdqfb!-s%E5eb?C(AuNGgIvX6eqeJ$8}~FfK3ok?JsTflV*@}Luwqz>vm2`$ zAHa|?xBRcJE}3}>(yJ3DkMYkogGYY@;0brmiuO#oAcP9C1due?@PtReksHw5{l*$= z;69E34bWrJ)tm&7aOK}!39QEzr^DJ8iVtsP!Jb0a_PJF;=m&hSguYZnE~4({3^Ilv zu9aDz|xnHyVeX?^WEH-J&-D(60Q!e;PflnFt*&7a4<_RjIVeUF|yI3VniG4@`u zW=A!WXpxEUzk$+{T}$DQGb~aX;%2OcR+y|VO5{doG&q(!Qp*rhsy~8=K0iwUnj4yB zJ0;hpLQ2dfHDVQzG#CRNu&5CNVpS~tEw1%Dir(dEs(OJ~3r3(sOi(|@lS#ZR~~WnWURQQm}pR-SRcz5eMK zj{3sW#dd3^8T|}5Dr?BC8N{D{50s+)67)4Y0UN zyj_UcT@MF7?$NbC+bd)t;p^#V|a z`)Q87#!K1P7Fen|RC|Of^fL_4q3{k6#e92CwtDilh$+<~Q%a3FwJvHa6Z$!QKKi2m zOP!;aO=ZQPDS#q(5P45g=eWZtn!~0pZ}vr(xd?4@x6HWF*~ z6|YXNA0#CBI0`5;|QuZ(-A;Z*r7&1--c!y>WuTK${}C&kn42z~KX-ky8dk9s)= z$y!_4?^%-&sj3ggP6N_1vciunkb-NAawX3J+N+`PQr8_b~Qv@d@g z(ub{3|6%XDkbGTKXgcKl_M&QdzAP-mA=IB!Z9*M1b>~GB#reV0Ir^39S`qccr$~bUi0%-B8-`5~OIlCU)rJJy;rfuQQ7Dchc_pw`lS&N?z{{&e z0&PkdBtHsTt)W4GJ!APRileZS9hRMVJf4!J{RbMt zki7~Z=G1K?U$((m+e(5io~nC@BNV|Dv&D)>`B!1*li`J-Htav2&Uc3Vj40vbbq%%8 z#H5>(0%wGQGwRh?v*dwW$(cc=DC{XUYN#-PwQb9f;>tICijVxzicV8MJC!CJPLf^`8L>bgY_9UwfrPM-sx?X z=-WFH=v~xC0(5vF4(vuBakX5f-JcCbKivcyuoE)B+Kox!4&(x*(oOt}%uhwSM)M`g_ z)Lcc^7xe(`Fk_`w$1WxopI1-ivJrnBQJTICFrWrEe8;+Qpt?`W|X1ow6c;PnN* z)C8`|gvy=uQt|=S1ME$Xon&eZdE`IRlYaWsCdG$w7|$9D4PdW>0iuc63(U3jr^$RI z+-00_*i|yN@AdL?B?74uf4<^-X;4QL<{fhgJU=e(T3o!Q84?wp_&zJ=`^#^z;k|Pz zPJ^r^r#~@99v_p1rLSw66Ar6uVpnVuRk9J3c!Dqr@Ey2ro|h5eijtS1E&-s%L_d)`*rpPkVj&hU~%$(=ucU**?1@h~{8MY=EoHoC7&CU~m z8(Ao;SY$Fqlbbxu41OpBTsn|;!^g+$VXbm$P?=B#i=;is%buBADItNAi8iG$S@*fd z*zyx2on20xj4jJR8}0T#l2QE@Nk|MCSVoXqv|L(&%;>JGSirM2-0(i2|3C|qQ- z*T-E!o=)NK5PkMfq(e?()f?xjAs*7Z0Tq4*o++->na7-^Pw3I*k0POMRB=yC_7KhWSda4KX&^e+xmAtxB%OV4aMvW_ z#x2!YKZtqgvMR=0h|AmI7;7(dnfHa}i$7!$-yeRu0GlQ6DjMstH@24iOpjgh`w*Bu zJ|ymkGEefO#Gh9`&odHRAKwO0!n2*=+4yJ?3G`bNmzp$Z4JQLIMfvnFFF9tutiIla zh5JX4mq%6M&#?!Wzg9)QM1+PvDN3V$rC$9s!k#SIK%GnkzEH!CxuypX<8M1)T{&xk zQAizlLQBtL69L4^JQ_rwL+U|qkG*$biv>sTwx(Cz{(Z9ul-SlQ|0S#(w{X~?`g0z` z;~F7XuJ4j~I70)H_v(Dk-o)5sL$W)MRo6zDRl;u1q(wwT2egX1^B?T)>=lpIy|jGV zsykxWUR-|h3I`R9C1pKaixkLxCyCr+{Pr+JH7Et&uuVs_p&XRcH@=oXIoUC@;N_3< zrGQldg&WJiy5-y==jijG-SRj_{A}8VhEL$<9^QCxdRD1;$NoFQ$yv{+uD{Lf_0Ngl zbaP&xi*5bt-;zW{!{dcDUu^F8+qd{a{T$TiSMU8;Aa&dbl)x@n}o*4i3g(wO$D#os^ku99_W#>n0A z7}*impmmXp-_F4UwJ}db3u;zI9&dA~bd0KWge9l?e?5N}pOMH5sWa`~GG7rGpVp+A zN=OZu+v##C)~~*7&!VeSu#c>87Uh*M3936PckSw8Kl~w(Zu|g_4M3#Y_K$mA5G;;r&b{^xOIn9MDV0JQjQ}Bun4YxcrIG z$7kI+(A%}vwY}rCnibiOM5?=vN(EM0t6W(;6F9&7VxJE$WQ=ToNs0OOL(BoF2{*WD#pVG(0lMF_XkHK;YC8{OsHWL)QmMpw*zz%{l>E-vn~QRFzX5tZB@A z?sV<4X0%Ibt<>FcGz=eli#0&?GN?+klIrX-zGXIeS4o1cOM{gFO9pw7NjU?=kWki* z7i2pXODU7?PmF8Hd|;qDF#$_BTcFe$1ig0k8)(AjhNA9fiJ5^62aRH)>f_a8{PPH1O>2tZPeG zlp^r#oV4d`ss`i6Z{e4thAE2+ z26<{gv6m6~%2ayg#9;+lP2D39GH(e9(zCmM6*MV)RllHSs+z@vogdf}e*BioNaqR$ zjQ1^=|Jq+wvb4)8MST?ym&R#C`t7 z)zp9cNh|x$s7Ym!YI3gNnccccLATxK?(ZEb&-}(_4OR3LDaO9_RH+l4zclFsys}8l zlc84S>ukUO>dh12c$XGV3=W08`wzv`i0{u_tg5$r)>V10qphkbZ?(|G5 zcCP&8yfaKrpO1&->GR31SI4N&cQ9xC!-naGCr*`7E&Sdob2U^des9O|&;ItlWCK#5 ztz7VJ4umfVsR%sepv7{lUWQxveqPBS>>c6%&{h=eGu&b@$buhsN5Q^#0x+M`qgEKD ztMq`UR0KEH>Goov1;52HR>&bWf$3jRgUjYbIY8~_Nopiqi) zw1Tu5nQoQZue1Ic$;&?%Pmo{4JC(nDXINv!3}Xlb&v#K>3+-td+9?J}nPmoGR)1 z@VH-(Z7`BI~_Vz=B5AkJeYBE$S#fa7iBpWF~&c_%^DaiA`e4zeSO|W zT>}V%{w#-cgJ&EM5VJ1+K!i|UZR-!kGs@f3%y-u^P@gNOJfT|W!Lj%!spDhpBcVdM zh=ro(o5La5b8l;Mh!I8?vVo9hR_q9F^!zZzhd40c-$dKFng_|LtB+1xwnv?uY&Za^ zn7qhH-#=^i4o)9A-s|g)GCGHnd}zAx%`dg>MHOWTP1-O*MDL~wfIMWu`Fsd{_4WX#9DzV4|6ETLma+Toa4*S{u`Jr(;?L1 zMQ2!j$Rbrj-RINSOYi_)LqUo}U}rI)QA&S!pR&UDCk&Dtrf|U@h-T`CUpwTo z{$2FJTFVzF*=EvyFUre_Ma1Ql5)%u6AT#Ji?apk)J0qd6Nl-6&egaTVZTn60Vt2om zwW_l^3jfki3EK(mZ3_0wdbb!ozX9!6^TeJs1c~tZPP4~zJhQ>cn2+0H-03uyytqo` zPNe>}`{khz05fsUH*>(ZBU2#C_XxXL@|X1&l-UDnn5qxLFg1#g$i9_apm==$!n4fU z{Z(_smUY-4)Cy?1r)WMzH~q<2TL!ad2e&*rz$ttUPIF4|$3u=N_vkOd23?eXLr&RO z6A5XM!B|qr0^Lj&poQqbfSDMT>}*p_tOFy~zzB-8a^Tz~h87iDzJJ)>)Tn3?nO{HK zkdb2ij77=f4S3@9mO;VrB2c))P*Ah`YG7e{z;;@=N47~4;lD*H-!4P*5fRFSKn3Hx z$%P8g`nDEV#z-(HTmO+Mz?eXYG-~^bS{?`-j@jw+iz|yC{{phH*plP;?di^oFHH?k)rjlB9ATE~PsGGH&mIM%l4n{^R)!FfD7%geD{dbdpnIV5=dFW7 zqT&9B{2O_<_gWTmnVa1fTA?!(LFFL2=aREpam zzS}UT%fmA~nZPf~BeB9F(8n)v6xzXxU>h(NlYipDmSZwq{SsI$0IV1WmQ@Irc#!gz z^c_w;);d1H+beh{KNjNMcdS)Oh-^%%sTWmsd2yoT1(N9nj%B|10SAADl-wp> zU8ko->|N7HU{-LKK2$SPC_g~Iuevw%D=B{an3$|k7c4&O=f?T^DN=oYa*_4^?3tM2 zZ^^%HSAQ?brhcP8qj|r2*EQX|;(rC|<1LFmpe}U?k;E71f=y=MHxWj6H|;|#e5}?YIHjg;e$KBeqUsRvGsCOvd2XBpNKfr;USp5I_rNn#6nd1s~i6o;maQZ zEn456yLR0Pk|!%HG3Jt<21hGIq7H9A^uRcBaXv@*OFbcL1bJ#8iNCXQjZzcnXJw82 z6(YuXIpbomt>IPL;s2NVID!n2Zxm&OKwWan#hz@I>g?hhm5(`@&T~!}QU$9L21og# zIs;mB{Ux8~{FNJyK+)0DG1po+!<2ooFe&zIvhjYk1eOl~Kf_VD5fK3gGbCBd zg=q@)ntE$KZkQjxA|W+~h(jh!0EouA?>Fvl*O}fOOWWVC|JvKE*zVQZH-R2h28&Yd z<8ZslwrO%5#NM=CR?d0cb8L*2{Ps2kv2h%H*qpdbJi$p$7~BUii%uTe59ac04jlgI z-Tbhp|9LoFhj$KHy$v_#8dZ-c{2h4tS2^ zOQfhe`$HaeV$9_I@+oR7^wBB-^3X9@{!cu{f?D@QHynEVKG<4Og2ZWPg4asBOiUMWcZ^dj4v-pe-a7BvuWspL30)6sq}dw1~ZA# zDk7xXqts$(lrrWwXEX(J!A8E-^0i=}TH1v%{{N~WbjWgnQD3(=+ifK-n~hf;u^o1o z_T`7LVD;|BkHp_Mh_4KOEcSHDUzm|8D`A^VM_9PNzEQaxaES;1N-VEWG{lg;92v{2 zp$kL=L#fuA-sufxMVd^{ENE2!lr3-+6YToy9hl>CEtAz-)OY5L(-tsh{hFxHZa95B zW^?%wb(Xc3{HC3%eM4W)eo6h>3^j)K><}6R%bWnF%T#j`TdKL0*%5s*XSrcg$`8F{>NjwOAzax;BV z`XY0B7Bv`X9x}b}^`q&~$Pr6k?-9inTh@EqN9lYCX3FV4NI9X7>WB!tKh1u(*Y}+u zix&Y>NiP*&Qw*gF6>D=v?-DT3PJhcIe!v?3j;X(NgYwnKmz$uIQag%2CGRJCL}Fg{ z(Q~B`89yAL z)$?%T%QCEF>JO4tD#0D)ilmk2LJ=x>uE4o4OI)5T;w}jCS}7E(!%ij_^}{DUJ<|fI zu(ycYI}A}DAN_W8nQja85?unDfBY)?J|x~JR^}4=jkg!pn!Mu>Dx-4aVmaY^@Qas8 z8RukNuHzdZ)$ks~-q#x*sMP9ARiE;am5lb;?)JFGflIT-S6&}ZTCG5O-ZG(bM#kS`HEewf&WBt5o8C-6f{}FJ3aMAsX7hp z*8HaaveW#Dh=kN@z`m79Mw_XsjO|&w_|Fj^*_|6boCx0!WqF7yz8mnF4HLIaiX`)x zLgBYp52F$E^!o)q_^kt)`&0cGDI&`=zU#~14u$lZE2gOpHj~4z3DKPmHiy_d?!3lH_?2?lZRLMCVCG_%^@ zjd|*r*hJ~E3>@Mo!tcdD?xcpyMcCRHNX^X6sfZxlEK=C9a*{Y+LkOSs#~B?P7aoi0 zww6T?0*TV@U5GZg2MqHe!LjCFuM^O4Y^AW~Y_s|Csn7Hc$}AFtxt^(xOmU~j0YVph_$paxDW(T9ZtVVwcrALoTwy0 zdQjk<@6%twIn0Z7aOY1J&i3vaaA#NB@Has1bmOOF<)UfoAWY4n^`89PX);1&>3W5D=qZWqzjd+e?Y)qAT|*oHTLa1Q97%b!lO^z zAFE>umN!M!;9TOS5b(ghaiV_3YwzxMEmlMt#7;^lC??xh_&lC@VrQq8mc5|67aK}! z3xb3xv{Pj1^c>%YXuohzq^U+9#aZxr!>sk%#RC0 zfMC4UQv7bt--F(M&M7Jyu(fcD)Sr8>{q^{HeP`V(S_rfs|vWg$q`T)yj?8B*r_-cVx!{ae?@D)d#{?y;QJI4K%NPNy0eFD zQa|PI$~0ER-PP?VU+I=z>hz1Zu!-a3Dl!823DO!0y#*qj^@_V>`v8uh6{zlai+7OX zH;Q%S;Vc?+jK-v;JU}<7U6ytHX)Fo)5@puzJ3R4LRjwm*=+NhT?uyh6P_!_u8W?K+ z48!sWVxOGkZl@nLDvU-T^ zrVxgs&BwW|$?zKF{0{O|3AxKd?6#o`6g$n!O%j@Y#-I;90Qn~)Q+~&b)YrShxcX{o z`%7uq+V?HiO8(Kw5u4x^^~e^5=z6n3iJJQFsjS#hbYEJu#n37wOy<4*(&)|z1tUx5 zotl^V@6a~!fx5P1 zP#`AhEe|AdDOLFmtUHqd34L1i0Lh0XNwUa$F$vH){+BzWMYAm#Q)IPDv_AevjuZAh zKZfrgL4CSS*;J#B*T&5h3iDRA>xl^6?y^3@1a$FeT(Wji(G!g z)w!*sd#H>5-t_b&zrC~5eWXGek>`tG=prq{UJF!l8~(>FNo7#9+b^I~f;#UPj`$$| zGUNR}&4bok13w6FBsLDD#y5wxytCC!5XO5vcyF2PS2~V-Hscm6Rjxy1d~c5kM+III zzdXxz%d0NdI+T<6E~NjEXa$5w@g*t~wKnEkgj$S|6nW&jm(e4qWOf&4p#@%J^<{t~ zCY#z(jomI5$!_S^wd?%GH#1u^_#>FBH ztn72_4cSUa2ZaGhe^6drT+rO%w%^rGTIL$w9p~eDVygyR40|3!1j-$rI;~TI<>05A z@gNVbG3u=T{Rmq!z%smR@#(8eD#B_H2WSGKqn{AyTh?_87{2ihH$jB|CsuK=7USk# z?F6F^=qK{dh6x>=A)AYFp?Ag}GbNb}Xy~{~6jWOIGq_Y$vDHh~X>#X?NL|weA}%W? z01Ms-nbo%3)J*>pJI9)0vrkorjLIclFq|C=V1Mb+XWvs~WMUZZB zEW?+oZh9yrX$k(~|Ky;j-AOE2+}ir0xRv{@h7D-zad*KUkA62wV0e!ze6ggRs?k+O z)liOqnF+y!%X@-tbb*ALd#Q=g_5cDq-(dK`DD%6;yoXdft8$?Jzw{N=f|Hmi@gxZ_ z;l!_V;^vWK7p#Yq6SfJ8F`^-y(f63XDqtgqCS-TJcHV3RJOpc3L7Ey>1u82)>FYtn zq2lA6VNZA7Aa{4_@)5R?!5rYgYLMi`=uvHm1?f^>Ftoy<=bqRtV?4{xLRuVJdWVUb znE86D9ECG_Aa>M?TV$E5ETl(>A^&@wa9;s;lXVH`3U`o3lq=P8DDB*xf22O+yqiYXOI*PQfjQ|FaA|_ z%7X`XzV^y+XGafJ;E(^Oec8A2@#fNrBD;_1l9(r~kO?!q3-#QqqGcR7%XxFk@RKd+-yL1llY!1jDMb`$9PENE@_Z<7#>I};?$ z!o?<$S++%OE%9O1Tu0r&k@>DAD+41-?l(8$)&7C!PDq9~2@FY+LP7~s7GnaInB*RQ z0{1z)IPUYG&H$87j6-xy&!xgOO!6kP-Ttp66X#c6YZ-2)4t;g@pTv!#-usJ1Ql3qH ztxhq&ZZ8s}sNnFy!Zqy8cWu~{5EhBvPRhSS8<0IV=Fg5vSe$5h5B7TANA|&lRj<7{ zeS?yQ4|1_Udo?X1J*W6*H=9v0ysCVzHXQ3q=}~YBDKW;_5m;gxLdKbvew2?KYl}y{ zJ5!NlgG3E7zK;uffW}&%1kikVZj<~Ly|5l?%$W#sK_D1r*qv!LwhIva*e6i5#Hl#{ zff3Wk8F8>b0}2!qe2jX%BlDX$R#%-GK*^+<^{|kUzZ-R0%gYZ*Q` zEH3ZFWIGCpW#@u!_o75hSw|!D_Dk|4H#4AyQC7P&1JbGea5)@3b- zn#Y?r&*Ta9nVjdC^_jv7ZbT$yhQ&|Z=(A`)PVeNt?Kn-IMwi-t@~9*AqWLT?r)%%% zs@62CExhR{a;UnjkKk|59yOXO`j^OBWOsJntPab+W!CtzTQlzC+S~*h{a##CqtT-H zn8?}R@g1{V%X5OOg`~~ha>=3bBO^&mco@`$*IoVx(mZ#c`#wfangaVo7N4Zap|iez z@NkBoM{gRPmjSQ|UTibar|6a&CY_u?(5Ls%rL`bp%-`$zjDIDZ`@yKo$c5_z%lBdz z=dn}=JPKU$M9MuSdjMvz{Ifk=<9fF~sp7LWmPg~NZ_?OfBL0fB`@6@c53Sif#+=Nq zfT{)_5>aIGza!x%i1#aO#KhdV%|76)q2n+=T5u7?Rghv<%_wNYvbW+%RqlMqezW8J z90}&|uZx_l+8md*S#`Et!H;b^l{$^+fyK{Vi+$@NGX6)3aAynav`hReK+ZvRGqQWV zXl?8*X)IUJuJQEV`Hb}UwEo!RuXFilPx$7b^N#J~l+HA3p@rV3qS)*ELAN@WS4~1E zE^-}HfR|ZVT|AKVKHTnjiNV<1DF0(#VA|_o74YE;MC;kRz7Lx5-@c=1Ni<2Py1p!( zOw2uegMtj`r9AS*38#L=Yn<4u^xghLwq98PLI*XNVUm?zXQuu%g|ad8zLd@M*v0Lb zhjY%~Ez_!x2#4ul8Z)_|Vw_&^gdyoEp?vRJRbj&qdV+yY%9rU~2djI#G*m|iQ;)lD zCAiK+-=QtU95{E1U-Ea2_qGWL{0s{T_IvH@W|6%=JxBa+_)fcV(oK!?Lq6W$VdC$B zc>~<6l8jy!=A(haGbKJtCrquS#z#{4HaPInnM@9Y$} z(S70BZ9Y>BC~HF$kc-18kZSX+Kn{@9!!~KcLJ&Lm*yK$ga*zHL)M77R#Ryd6Oh5ep zy-Iw99ME?CF!oqp7Z*yCi->K5KHaB4=OH_le~B8zj%|Fk86#O=bksYfeZXuRDgnOS z`my$0L}pE)M^@+$q2 zWNYi!me2cROqY92os*#D7ddi%&wjj&xgCO>v)r9&Ual<|NItLY9U{E>vq5}wwS3#p zdLGu1mGz4Ae(}wofbZEBTh2oBODzzn>x%e(XasKO{)%oLtvQ0ve@ z9zICa=&?9YM=8nn@3kyoBZNmr>TkF1k5*S4x?mj}5#V7?M9N7K5MpIrjo_+s_28-pMhsP;#NdH?eiz=SSN+g7Qed@4d>RRY=c@Ob^gei2bW7wq?K@xQO^ zF%~+=#A`lz=v zN;+$U0^9xm9ckg3g-RX1bcIU7n@ShQT;`53H9yZ*bPwLU=K zj9tkC0azDUi0*AXSKh0vauao==Yc548P1=_v+uJ$kmkzo4-t6FUP(F?v z5=JT0a1A8IDA~Cn60?7HY9c5pMS?9o6<_{N%SXmaN{YRtq_mn$i`j}>XmHuQSuoD9 z#^+^sSCB;iS?gva#>AvNY8M-1`*3fP0yH>r(891?$w? z`S_q9o3lT1>+2K&)!E*J8>jN-MH2s14XZW9ebv66`TCc&i_(j0PJ5J9Z&-Rr8Di3U(z}Gkym+GSu{Y8?Yuf1x*HHHZ!ok-du73k!^!{K z#bxrQL9Zh^ZUpxo3ib6F4iF6uTP(2Aw0mutIe&p!oc4`!2^GLb&@Sj11gXKR(y+=t zTI}gBIhDECCe@ge!%0OEKvDJ4()@SVD16#leS?&(i>ZN=nD_v1>$IYN<4k4>z1vq1T(i<;)wHuGeLTw&O%6hV?u`i@yG`dppAGj!cC8QU<3iiuBYfEUBwc#x z^uJDJ8$MevvHOj=nQhoFEwYCu%f_1sScnI8X5B1J&rY$)M{yf)^_l>!x@pr@$ucUg zU{m&LQ>NA3+2J65pc%yfGXC3@fhKqA`@>Fw+x9@YR6Ewv*GXdHOS?s!f64H!A7ddE zxORIt$L%imWp4LUdSC=ULjSYp;Y^|QiSd4jY0effC7E+^*J~vT;+~JMAr*OrJKe1cYLBS93bJHtsRfRpVAj^b3HSM7{rXt40P_vxDE<@Zt@T<>CHBHNG9 zBI9r4CrzC<$;0-Ag&buqEvhp!vn4ULRO%Ahve9ywVm;Mm13lAH`dUN`e z(^$B?SPt|={&H9IE%qe&Gi47*Gi3>GJd=|z-H>p8AsuV$qStD?=jCnEfh(*;TVE2G z)pmxS_CC9E=OdKznorb=q~OSwQ$0Eje+G#}uqQd>WRhXCfisel()FC0p9*}?9z@NGzrWKK^v(JRn5F{p0wIE`$9_^Qv? zH}{&U>1an#4&-%ng*AU-Ib~^Q3A~gdyfS{gL^M!^Ov%U?y}xC5`Lvfgd{;u>5PT@V zP5ec_v}|HQ-=KVlekWq*B~Acq&^S!MccsF9r>vyHxbiN+Kwsbf3-8>QWFlRF-u(&c zEH9MmL_kriiiMz89tI(dH-b@5G&?iMaSWnCPdYTS$2aA_(gKP5nB5~JALC|ibG5e+ zDaJK=lzEWs(fM!>4NUZ;6RXFNXMvLIKmnRe0CvqBw>GGnXt8Y0<`rTapyI2)J)7$+ z>AV@g(}~~;)UG6H*f~Pok12X;dr~zE0KMDfuFkxElggIbg8-$<{^XKG)Z>h?n=z7Q zWte(vS)q$jwG*%LGtnl*dP#ZbVhUnVq8IX={>JYl?6zG{kViXJD97MHM1oD$I?z57 zJFd9@L(#HbFhdZf?Q9jt!}b6Ltlo+rj7zQLTkSs7P$(ZuB7O@Or#Gp>eP>Y3U;{CH z>=~WlhE=}T*UQXS7^g{lEu3b4!Jb20xeYXN<1Z9~QUvU^5tiW&8uSoi>3ibI<(I;T zL*fbd@emS?P3={rXI?Xli7NX*`tn)C zP-E=lBQU});R>Miu-rRzC54mrc<`-|#4(|~B3zYX2-hF=p~@<&>z=S0=$NbLVy=D| z6cCVFbct>};vL7Yg7H8@$#Y3IWORJhbF7kLM!k=*?!%xo>%${GV=yYTis6WoVBbY> zoD0q>h!c3}LbcI3jaq?75S=GY$l9BrLcglISM!Pd`!ASmPTn{H0>ij=+nvYPKQ^ty zrCXz48MvtBLZfbGCAxTX)dY-8oW>0qDT&R@rFW4HJOQ>5@=;g>6tYy|y1|-cR0@8d zM{si5om|e{pz+$`Fv}wBg_`Q<#-q=; z9MxM>S6Nh4G+n5cdJhB8sR`G=VC8q@smwS41bHd%?U*t<`LqU+`n~Q5XvKl$V|3ni z49KF{B^U}~6#O-v+=Vwqu4iOgh*iOf>k5)$9N^d&#_szi7I)=`;jJ;C?gcl7s}$a+*^|ThWNYmx~$m~5X=Wjx~513)_b;>&(i(& z&%;q@W@!nB2rQ4s=*Rwrd4l{bXcew_3yrF&Crz4DyV~#SZs|Us9DI-NyiwW>(k<+` zJBp~=`E?^@?{U&5mr_*uih6fkt1!qw((kH7CfCIlnXjTcJTjDQg;cXc;`Cu{k>`D) zphSIbG!TqnR=qI`l)k{ZsX9ONEGyOw6zlHyYN`lFZ9nXSF-|a1V;+6pXu+BFT&hL6 zqQLU6aU^{**Hl;GaUuWv%5j8fi(dJpvvBu_`T}`)<8gjybf;47Z(ahi*N=vN&Zf^V z|Ik{9wMpFQTl{kgqEC3EwQlFQfRP-?>P>o zm#|{Oa|0u<&&ejZZW|o+@NDWBF}Gli6g_Jdszd8la}9jfe%68bk-|1!wF>EI`k4b7 z(Y_EfXrzDv*j`%}i5RJ+z)S`k(t@}Ga{gw1EuP`I?p>+A)6AOf)D%$nEbFX}Wt3PR zXMQaFH?aIf4u8JYZ~BK?s@}m$LRpoI*4IH9ejZK~B6XQXc{Q79T7RK{ONI@AboQmu7ZD9L`9A ze0f3Diyl~qYbpt5@zmU3`oC#S+?|OlNwW{*9wE401s#rKw=`E$Nsq=X5OCM*JC>a` z=$-D&ICwtbxnTN!J)w$2?z(BeL$7Ov$k?HyEy@NkqLq=TRb5_JyMLn?w**}u&y$N& zD_3f)=e3B#bM1Y+XrSzn3Z9_T!&M-+tv$c_{bvByV!*xd$|^8T&nJ2b^l@@UU-`qH z9&K5Ph)&f8_2P6+fRh2p-qjViOOGuHnY}#aO@oCvlDW!+%BHfg&_}vPGA{sjGC!f=j+Q zmTph^aE-u6*#Fg(R`ng*WcipKGEA5N*?Wl7%jk<)>CZEW6PKk*exQY`HXIn(#R%)r zzR4_()u2GL*ebykgqJNE=Lb}s?~`=tJFny*NRR_a+aBXwSSwbWK}ycV** zkcBD zl9Q6t+%s?xuFETZSgW^}=biVE!eQiXbl8w63ckzDM`)}S+STtLt&mo^!n~C7TB|od zqVVw{NpJ&gm9JmJUN5{#r?dO?Kp|7NzaN(j{pT^w*5~8?&6?vahV&Oo;Fq{7n<3)f zCW;B>G)b=uvc%1yqKi5P6j1)|com^mq5N@zcb8XWcLjkHk^x5qdQ}J2)0@fLh?Qw- znvC<^s~@S~_b5F-kd&2I=L}cSh9_9hPJR7;ruD1}*iaLqqG%~z4^!L1*K*{ncYj@# zKyrbx*fnc$RTe&9IT&@o%xDSp$gf~S-1?!5>DOPn)a_TclPz=n2oeh;FhEDI7O{ zoBCkI*?E!76BV3QZ8PS10rMUg=u{pu6+WwUHWlkyyDG?6TX(~6$Hh=^NMayOEP23d zOsiuEwc2GOce?UEG5t13R3IweZvhv95T4q(y}7c7!{rrVQTnMnJ3EB%s)7Zu9IP`y zQvtZE6e~cYw9AMQ%^&v2n>$NzgI3fCSGAE3sM}pBF#a3*k94^U>^hbz{siU0XcJDvPQIVQN*WnO|IJ_Uq8udBtBgi;}J&79&d2;Ucy6U zMiS&)42;l_TWSJjd2Fm(6)d($o8Z~iGU1_n z2+C1@6Q636kLLF}C_Egcd9|=Urmm@8w$S8K-q9gD^Yf?1KFq+I%qgIxs?=bq9cO)b zsrf3Hv8Ak~e*zT#I~Cy3Ty99%R6WvrM$YB8vN%~r>`8&q-q^qmeVgsUQ_Ve@M*K7m z^rd;yUeNDVU5W``PcIp;;WmeXUuk4XrSYm&BY$oXn$b|0B1gPI>_nJaD1uXJEU065 z3=5-$k&X_DpPV`|+pgQ16XO1>lGQWZoES8B8Ny0N7y45LGw&WM6pmkDGxoAB&KBta z&Q}3>fS_QR%-M0zX9|qNm2U%*^hbU>OnJwRo7)A(C&--l#s|IHb5h?)!zXHXXW%2Y zcb@NJWNZPgi>wH|?9hod27AO}Z-pL}KX(h}dOF&~!%l=<;MJqN&3%~Sge}JK`vNX# zAEt6@p@yF98U@FshwVnd+qyScQ&ED;p7PTSeKI9 z>+wvF@|V)lFsHA4tufng%id!}T0!$^7N4I^J|6rd;_$*KU*&aBCU9odscK%&yLVnU zJY@L8C3U#=6Th&-n4@3U`R^2?HDAo5i47ve_i-YmBUdAFL9}u<-;)zXF^CDQD>YYr*_rLNu3@@#?uh133i z`|FC1Net(ez{7PLtBV^Hf|>u{{sR-#O66NYL1;X00kCfj{SUKoP>Ul({MPxUX}fPS zBMP8)uZ?+nPJtAYBT={A_dPeeA9`NhDukkrb|h~Inz-+gVEmzxP*5fsDSTzD`NO|< zH5X0KY&*#40iUpXXO)l$vB}MU^Z-Na{{C41g)4Tj)h{nQB349t`0i1gL~d-j6x{=~ z`&_6JnD;L}eLg&nQ{ZcOxrrr-(x-RFtFt~z5%|T@l;v*sIVSUZJq3r{jZ&U!q}b45 zH0%?kjNG-e1iyWW$srIEUJ0B{zH+xG272XBk9G==sp#Ls1~2Fc|6LQrc`Wu#K?qzA zN{bC_&-Hzy;&IQdI10~IoK{C854QmKAMQK(!5Ypv?}(_qOk4l0kpQZJ0&^770t=3_ z81oMF|2*^!u7RD!-|lO%f0N=Xey02(E{>v4RNP9)A!BE2D?bxeR%SdSCz8J}3`ofhu!HMZZFG4T z^F9sQeo7dQtz6Kj!iEMjuvXEo!0~d|5D1>uH-pZ>_nbloEwWOjKI|~O?t+5`lAAwr z)cTvSi_yM*J^l5!-KgQF^;7C);nT(+ffD=4Nj_ow=|cMvBh;7@G*Q&cpgTNkyfR1x zvm{OxZ74Ul#M55Fpu1l}^<>RO-#UjYi%`nR4!Pxaj`xNufDFkvO!Y3%B8x^>`{S@H z27~}LQlNN8dl=qzk_L%rP0=}GA@M14Nn2)eCjz0}M|H6;mzNChZ2EJM#x*Oq3c zP9c>djJ&yTe3$@uxWFNV2T{a7$X4IJ z==L@+B2@(4o#tSxYn_~YLKbFujg!aNlRb;=Nu*_LNdV!$u3bS}5aV`m1vC4e4WFLN zd|xQ!6eY*PJh0(>S)D0RBlzWYXC|m60=S}jVHUL=9CI?Mm-_$6`{&?8yA~NpoU1?h z`*?K(wlsrQVZjgLlCk!Q=`qqE+Rzq$zot6SnSGwqW|PJU0bUemDJG(ug;T~QYb=Gi>Th{z-RYs@2v4vh5QIb2S zYz-AHj&{r6p_!Px;p z9B<<-H+ePdTVxRX6S%?Th5Ed|XtKeKaA&mWaz z=FOjduLw#B>f0t$_W6c~ehKgjJW-HVYNXDcZgztWTNZ2X)}!9Ts6 z5pF27aJKeR6`*LN`yT3tKf2(~-4z>O;O%^CN)WhyYZ|)IH6$Jeii>Y_fObod|+Pg?Vf@nPu zpXud_FU={b(d*5O6z^gTUzoUf1-zK%vYdyE%GXW1eP}}7#YiTHBq5WVZ!qP0BCjDf zI$}tSgW#7C-yV7qD%+J2(dpRk8@M_@(l^X4*V$t-#m8LY>*{${-ue_@ z34ik&>KuUaiV50SfDlT8XuB;1U82ax^bGdXu{4^~MUkim)OPMQkA-u02x?=S5L*_C zP9U3L;^_&8kAX~+iu%D5Dx>Ql#C~LS31rogb+adPye83l?!UEufACVX2PPIJNQs$! zXaT&XxuCspndv7dmkZY;L^PW%FFtGfg_iNZ1U6HjSXF&Ij_tH8AG6iO4HCsVP3!pby}93{ZK58ISP{CFyegQ-yE z82n@Qg968cd6l~4M!X#IF$iLf?lF>yuB8(mG=c zgzIX(*$h#O$87= zD*nx~q^`vre8e)%)-{BNz-wB#m~EdNc(?UCMPg+J{tE3@Zdki|LrqPE^HO`kKVhkY z2nz#pvwbkYfo*_=FmPVfbuwMr@oHVawm=YB63u3ygXzN_4M}twV9O1AKJfW4a0&(b8%_kgu_(z#|YNYRLzct>FRkDtabse$tk(N@G3*R3lH*uSpK4zIe- z|JYywVX+VA*Zoig7!fSK&XFw@^y>8FtbCZ41hMh!9RtpXGzeGSwS@G1*CG!#6lAIp z(BOOYH^kT^+hF%Q?qgv)d1rTNAkavPPs1r3FEDIp@Xb7xcyWVLOj1I6wK1t%#`hAgryYWHLJf* zGn4dVOvQYcTCm|d6{{qyBjvBCX$x^4>sf3o03C`ntKh*?3D8PP8SB^{ltLf+&28V+ z(KqEUjAOYxz+}th?`r+KTQE@~rQUWbU77*#XR_H&oGt$toHiU1k0=v*%%SXW)LU>Q zOG%r(#eVP4l=&(7rrf)Grl`OVwat)|E)MSm+_5qf(FQ5 z7DMNkn{u=JyxcUd!^3KJU3o-7NYRM^V)P$HyMEj)OQg-)f=Q&Yc+AvBW3hit(LSbdYDHFenCaK&-(1q+j zr4%}e5pThP#ozJzPiqHNFi+e)M)-JngziHIWDwkS^afQTxQOj@qoj}DHhTd51%wct z+1T07Vz3YNdR8f9hcrQI6HmFQ#7@yKzUkk-TwG@mm4hnJO%3#;>&qiseePRRd@>|X z`FSdt;<+mN(3bYX!=*PpN;+6vXhpE>n!Xrz*6}7ZD-vZu|I_SQyn^pJ_T=H&wMFEA z#$@;6IkqGrB8YUtX}q>!%w*UoiG>y1)1OwUvXg+Q9M-@UjS_pmo!YDT1vDU2`1b7_VT zSGaNL?|)n^^4LaSSn_^$HK+E?(R!i)i@wF#<7;>m2G#b7_C912Xi4#3(o=0ydq>8Zc6-cJ5ZTv9n zecynq z%0Q6-`r}Wdh+ocQ&Pm7&OQc`MeLV_150B`DHnLf)7CaK?ikEZy)XDGwc^U%mi!PY! z)r@c`s{RpLhG=^)_J8utEabdW%X=jR1?%3ojUi|O7i)wq-uBzmV;TXMuro0d+U%Y~ z<~>xHK^s&sX5R9Gm7s>t;FXRVMEotL!uJ|>H}2yV2PfU6N-3Hi3KeNXed?~s6u^YS z#E`_CroS*y$R;4f?W7S04^XO8;32?nx*Byi+HS-AQx7)rT_;0uE8e}Jz;Bs6`t&{< z1xCiYp{}PY@aV=e7zFv_zZDURT<_*Ml`^)h&{C7Q0%pZ4-Duk2L3~6Zdrn;5hdYY| zXvNC%$jHe^_iy6S~7b)kdNg+oM@tD(Kp0&Cw-8~X}1;TtO+B@1fwqIT1 zYiN+H7E86kd5iN!U|a+DP}w=FBOXLHAr@hUkMWOj-+jP-xno(k4e@^p*~F6c+L4wQ zXAtK8h123FWmaGfcRo7Rne5~9+L;{73~y~3XW@XPa({D+Lb-g4;=inej}?QzEVx^Y z$^VQx&tOAJO+(I4r(~Cy{f?hyL4yRhlEe56fb#KhS=shw8ZmIRH>f7WKt^K_)aWmV4S8lAMf5SLARol+Z)gKrofL)%9Z5 zQEd=!<=Kr@<4c~9DqY$BwHGN$@~^1SZeuV(fIaTrvV|LQhK+&vf2>uYF+&ocqUn&a z>0eI2etMCx#$zW~dL%|Thjj*s@rDuuhD=dU_==1O@T2scOv7$}80;K~f)V&zG1$mN zRxXRUOd|ouGZ6aM(IU!1^z0HfZ)B>wz(-uf&k$JwlOOAX8R4UcGNIBo_ttGo9x|`{TkAU?j?=ojK05Ez zek<6^D23Q)>?>PFXxUfRcaOP}I#pZR#j$c(V~1)+ioFY$Q!oxhDx6u+V+73@^}-Zv zbORJ9E2D*L9u=}76UPdFBz+`AtoPYl$S}Z3+Yt&10XxZ&vFGJ#kC=T8v(s6TVXojN zx9I3OYhovl#pKcASY76+YCy_U>0*qaS?BXMpOFa z?_;fSmH*qmuD-OY1KXE(Nlxsk4Gt5dXen&PdAw(lD-~Jc;#Et zcXY#K<&p%-gS*=jN6|;Gu*|81!*ESS0ouU3Bmq5K z>HqYi1VNqokkhCjGz>vPGWOuX@302PA0GZJtTmtDkChynkFbD`&ZZZGXl_Gyx3i}| z;H*gYQwS>7U#FA5Z5V$n^Wa|2Yk@5s93YLc*Ml zh*Xjs3t@8zIc3-!%J~qALLtK(QsgY5ne(A?nmM26%$yH7hVXmU`}6(%J^t8h_v^l& z_w~H4$5ZZ)TE{)=NNH!_D(;mnD`KM;ai#-vDGd(6T;`^jn~x1-cbN8XwweuOo|YP! zA=5Z0bEGjg2lRy`(US8VIKj-7m9>Xm{5K3XhTabpo3QH3$nygjY2LYsn0OWnSv1}s z7$WuFZZbSlWX8Md&YD-J0`FNmuV6XFi5E68A9c9?{5zc6E zv@*e)XxS!^Tg9%tIe3n1RJi*9p`5|Wy-I1ktth3Go67}KMj_nah^{M%w$q8 zzRI!a2dqFZ!qoz{f|BpTQjuHlALWWcsY9Y=!Hfv{{u;|yFGa+5P@!?^BA?Cd<+Ozy zI*o_(2DjWvyjc&1Rd;T`vkQa6B|7bmN0Khg6Mvbo?GS|=*0&aoy(q-z%NYgv8t(4g z6k%aB1py|~RX=_6z#{L4%ZCU;Q)tFRAJbIdtxdHM+zWUE*SDMM%x;yQHj+HU^E7}$ z6WKPb&LES{)p5?d_Ukp`uLjN42~&Ciw5rTWQSw(hLs7c>uRx7Slf@q+?-fcC?E#r= zu{YplFhMEP)?qzNv@8qI*dtqhQ6fPUh4%xqEi4Zw)$79vdZS%YciEKO`Nmb3+jn`m zDVD6=5aw9N?t;%UPrZ;u`DG+t`kDwNfx9Y0r+}G_8DpfD$+X+kCINkp3VwM85)-b- zO0Al0p){MC(tcMfjPQ_)A_(U-vg8K(33ox5o@zJQDQul7SZ{()e47%*i!D<( zZIx-Jr^}{ZRLc3@*&N+ggGp0}fUif}3dWm7)CD_FcAd;Qm03dV2M71`7n zUcP_$tv`d#lh!RA8*c`2f6I+0kyF2ji^#5Sc~SoAhY6dFyh|Eyb0Zhwdxa824Px)q|T$2AS;zaPh>FB3p?)&*o;bA=V-36Bh92W};i?g-` z*FOSRV4#h$S4Vh|Pq-7GNi=W!0%owCW+|_Hb98l)#rqXiC3<=_v2-jUBJnG_dcUG+ zXFgH(*@(8KmFQQMoww`JWl$WK?_Ib}L^TZ=+3bNS^-Xq}A)`^eWiujw9NYH~7n z)F0A*{2Mf7Ys~Ov*2zGn_Kfx}om_29BpTCFdj!Gmsi|jzQMxWjt4VA|PYOiCQXz9Y1gY?n zDMtUWDY8%KJ7zYpvwdnBn`k3zmSY(!L$}g|tCps2`LEz@Ah#UXswZ0~@et2q*Xl)p z{zAB-UrfJ9o#eD6Q}@}OX|$iL0WYA6)M|-wJV(1P#+f+?8K|)Uwy=}QI{$|&1{UiLsgPiLjDWy3Q)N^(h2FABL;)^Oh_bYtU2oHWHi;GH{ z=&td}y$aZyv0rAqP2#;`1}LFSOb<00#m;CJe{JlqjM>1Y8JxK{*c~|uzi*PX64VN# z9b5^jK~yW`pZb}1pN<#h?asq13aOwlyj%elATPTFc$>RA$At~XfPfuqfrjw$e%(*k zq~H8UR+zTDc%F+gCjMss>Ne>x0<6_O5cn+m zY)F%Ju)Cj2ov(jnJiFMkK8If|@Du;_KW4xfw?25V>>r_PqE|oZM8FSt*`U*d)3~Vo z_F);9euG)NQ%$~VqM;Z~qgME6v!MbEN}gA$6qmS~3WZ&~xq+noxy(%rMWA54&_ zV9FdDF{nO22fYr9{LNM)5K5ST?zOQlG0-=ryGhrgOO4br{ahvIYc@{sF&(e^_@Sge zwt=}Aj38WWPZ9rY`wa0wM^;;n#Tu}afYMkffUXX{eC_){|3kWW?(_$Nd(6Jfo{5Rf zm~5)t3z@R_!Vs_M)G(4sX0ka>X+q2|sbrsR%xt&0+i_AZV&>3swDOD?!)z0NBM+;| z@N0y!1bSAW-%gcwy=8ogl|$#E4YY(V4lruWq!q3n-qtMxXPX0vcBQa zqj5h;2g>~Q(xWTUUkR< zzP!SS@qE%2{F6!~o69-kZK|{oLKHI=(U~lZLfh<#Nvc%(cfOdo;H4EOz?JMtwrg;cgmK~z z8tLxVoNss&DS*JnTL{fq7aKGWECOE{zk}WF59WhG)~NBS^PzC>0e42Mrqk}~0mk#y(Jy+|dE-iMPz7c1 zyfVvWvj$5GEfqeD&Nrvb4%)Ow)8zc}m3d{f2ML#|A88YD&p}yUIF;ShNhrqlPB-4c zZhIsDDs@X7SXqfT*-myhU;L7d`Q`@~9*VNO`T z2$)JRN!>>{g8Ll{3fv=A%wN^>nFM^bVaQ$}&0oJRLv=iMK_}6O487=W@WdW#>rhM# z1!}m4h+eTU-e?;rK>go1pAoyVKzft=gCK^c7@&|AxXZvsaF_-7HOUd>K@-O+IjB&jJh>Z!)&tC%gb+)eFH>xl{NdiEfy24&ZY{Jk;TRT zmCbr(>rcW7PcjR-z?}(E6;vFOgV+uwm^0nf zNbYCxRC=#N;?>2O+{wL)V^2EIa`oYh2}KrK5RqOe@AeU)s!aRN9L-j9w>k97mpO=+R4f>lMas-8{5jiIuP?R zjYknete~dk_rV;-O}rPPp2nnm0^ekM|E12dzZ$>a6T3KTs96jTfbycH0=n)%g_>mE zBZYU?DS9dTDvaPyu6mR?8&D#xVpZF7*=$DViC_cnqZ3$3>j5{}KPB+!s!SPaq4&SD zC=w0_P4k&--v4x%09p2jC5d8Mt3_FSpk+MM_{Iz-(~wW{VWW(vSfklQsG zH&)LQB^Ga-8!AQu4@r>zgWVZCBon*UQc>ygP{NwQF;cMUm z-1f?plY-_8j)O(sXq6;tI~L?iMjJf8_C48p?u#(7P4~P8S^Rvry(IzhE!w8FqJmTDo?@kO6%YO44n(k@kYBa(!QP6>01#Zv6 z2wj0L5>JNCNVT@L4d%+Yv?dq83cgW~1W&dvqeH*tr$m*nN{5P~8F&5i`ZhQV+Lq;8 zsYbb-9kVaISP>4WQ3g}y7Q7o-OCA(kvFA6~y6`sEmRSgiT5~nlOV_%o#n}dMYe4@syPfqxcV?Sz#!go4di=8tq(iPWn;RMJ^x6r#6A*gY^DsXWc zji;ge0#xsJuw*l#nKZoQQ8l+BY!QeopCA5_w^JJ4R!+HX!q;BB<@+q`J5Rj67Tf$F zUhiO6BFXZj-`}0~-_zH`+QuDue#xN1NPg$zSj-~VA%M1?wtp|Rf510`{T_&rcL>Ug zX1tE7isr&YX29Oga-O2LR%>d-vd>6)vU^%6g}nY*S$PaFlx>MxLj)s@t~R_DG4bH- zjyMvm#8f8KqRAp68ZkC8`{jq{h7>u6q>?&7FWT&wXmk{YUTYK^X(AHAO1b7VJP-RG zr3&$W-UeZqvzms&TU<#G9Uf9`oVDwy3#qA2Gad-rw^9Q_lunEDvNNGkRs}SU>r!)Y#>71G0 z+D#gEIP@N`^iSb2>lY<+DSyxW7G{cYYru(nrqq6oU?kh8hsElg+4_5g8?(=GMg=dF z6{Gc<$P3p2Oa3lM<}wj*>DRbfuP5mX^p~GxY=<*B$YoZrHBkK=PHXmxkcHBMzcjwG zeP&CwIcGbPXd7pHS5ByDz%ug{jWRRW?<YKASy(+|26C~5XS5eS@2{V`q~ihswtz#%C4GZ_=fZ8wNxSp*cEg9egFRXefrG1X)19-c0VHaSfNEpYBsC`T z@d|Atc`)Melg)Z`1VQRB!2kG}I!rP9^f&H?VquC!ietE`j)euto!J^d_R8%1)Zo>a z34^Z_m{ibj6x@m_FJYz}j2I7l6MPBj4c*%q#N1JC(O>tt5+hoY_%`};cx`!2>idib zdjr$ot~K|%3>wpS89FseieRJN=lp}uS6sg6Yyi0Hvf4ix?jHfI4$Qhau-9DRzm`T2 z#Wwql_V?zJa5qX&WP*;p$qvbQaPTZq=y6K}j`75PNW$2h4KVXS&>CHDMBrY_FPz=n z4B0mw;w!}BT6jLV5Cd0{I3gJPe-Za4a{7j zy?ONOuQbd_t=Kg?Yb|+i@(gAtoyGwb4;HIi-*Co`J*bBfmrj?`RaNXdGAgLBrO`h_ z>fJ{GPw{5lvH-83`s`gc?L%A*}A|x>eW?07; zw9-&Q_d{2*%G*JvLkNLTcmxc@WnElXswXcu7^x;+Ota}OhQGO)!?4`KZoox{`OsT{ zWH&i4U39hMGXaDIJhNCfpUlREs^_MG&q>kL@DVA_dE$>|1iX#@${8m&up08W6+%nBo?V;f_&%H$vf62Haeg0Oc+^&iB&KjD;) zxD!~C@~#%$dxPci4^#~w&725Tx>-Ct|-gb3Hs%3ooWPWi3 zx$55is>cGNU_pb4u#fau5Np)kcu@yQPHe|z;t;3dOseM_%;-$8BucdDb7eZbCJ1!U zu$fuqzZ<3O^DA_DbtxwZXU(n+N6)}&qlOwYX}}lmy}tM0Nd@ z1J!GvG5Tq0A5!GVH-Zig0NhcoYl3;vC46m-ItU+vEMzJ>tP-mz?(AfJNY(CcRZiRy zXR;ruIB+^6Y)RE^W^=mIUU)Y2mDtvIaVCtp&Zk#Ev7*cU1Iz;4jtpx(X}( z8SL;nM8-_b^W*))I=!Ea|4$BY+T4>ajOAX1QhA;|%oHLGd>H)9r!oT5_-dyo_hGbpXG z4k7g{BSwop$`oG$@imfHh1X(`xYUPCW$d4RT)1D!jr|DWh=()Zo~xXdA0rJN_}Dso z{3$a3o;?^EK{$|xU~IklhQ~Y;7=NUw&zAhvF#*3`*j>Imp%eVOqkMEW&A zxZzIuIa%{i^Dq{nGDSRNumF{T5!?8I9;&&yIS_LY1Y#u6BnW9@aCy|6bZ#`MW%>A5rGQfc%a0_EyAdR?G zjwB8W2yNbJqANOPj%6aluV-|oVfYF}Ls9^gnB1G6o}t|U<{kt>jYcp>_u2M@3q#KvfMc4>fi(0G_JAcp7QZIm+&2E^WkUcw za9x-7r)H|B*b1s?2E*Z2uLi>5DSb3~vB@js5EH)0{(+U)sq2JIJ!2hXcSLdI_HGwNsb9=s94fTlM-dxv z1H4I(=!gfw|3%@Lhyndmk9V~jQuRm3D$E9d6q|7?AaonY)K5LWd&Pj4C~$Z6E%)Nm zCmC_glo#+At^T+&91RRrn-VF1Ub{j!CYwyvx7OiM(9dduc{ddwdLGiF#6 zZNF2KlI&Xm^;R4p{frtlH#4X%=+Kztb?W&ZZ>@9@1m78&zXrjW1EtXv@fG8+7boS3 zE93cQw(}Ig*Q}CEg%Lmdp}D8A=?Vh-?KW-dB^kUH5k7VaV^#T;cmu4?Z#fYt|)==yHKfk*2>#H@rJRJ?n!XPq_ zU!)1~$1pS_Qt2rvWle~OeL=j$d1`yDa6;u!cCV-)Gt8cY&f9Qm8JJfdV@IAH9FBZafc(6QWSVWV5UG=FY=?_yeh*MYj*qY7W|Er|{i@)Xwu;;0rCbhr0 z_tw2--ZYrEyt<+|{g1!?u6G4Hv4ROZD+G=aw87e*?Vs+YM!M*@0GFN+$XUJjC8wPd z@ShO+TZuYljR?u?K?DxY=xsoQxF5Ud=Wb1;Q}E%s8H!{1^G7voX*v=ZV0zhBvi;SO zY>qyLijceSeh#}GU}+^NLw^o%ABz(|I6&WC4hvItUfq>FX35sAz*ppW55CVO9tJvv z98w+y!xOBBlD6sLfW$ijS~Rg|Jg@2{^BE<{>+&u}LE7GoSwC|Fs;-qH3!KxazW9W& zB#DotF`dZT;=b7n>YTyj53h7L5-f16sh5BD!8lv*B(|cT{yVvoWLA7$z!$e8k5A39 z@#+gdvp^JgzPA9sdu^9vcX7gXpl>9{rWgs}4kN5d^d2@?7ZI!rI~4f<_l;spI4WwKpBn$4ipoiXUU_HZ176f88pitFjM;vmNFvqLTVV8&q|ceF%Z?fek2L`gI$ZI6-aoU>6~II?`(Y{dC}Jz$lcFZD-lwji zcBtRTTd$Dx$m5Sdec*>j@7^Td-kl=p4vhEQgAGw(%TjrTTj}hL=_#Ws2I*@CYuw9R zl$3e?!IzdYbKi{N@wtG|7n9<~EpLkL0Hcf9vEoEJC=OH!nxj2eEiLsMm0|}szrWYs zW{UsBE&s+PCUTtcy0%O{c|C3AzP-4^6Y(U<8O(@Dpmfb`xMN+*tzDuv>(1^^?Mz!A z(gN{zBO-jf&Za4v$=F4w)^}@BQn&1)3#oy8ahF*7ZB5~2=RDmgR6{-TxafInc(s@0 zh$IQ@XRWQLhGd|?A=OvAZz6ZzA%NJ@ZZ2eaNMs3G}IeSd>i{W`s+z>pLBi}S^&+xU_>V$t#q(S4NV zgYh+PiZT@j*=R0_*CPFGT@R;iH}dK~@AaZL5dL(xGKw0W5!RAKP{J5W3%)%@r>6rc zc7zrw9M0&vPBMq*nJ>^nsxxjty*m#}VddI!z*ZYGdbFns46)F;6KuCK3vf8p^!L8E z$y*ze(ma{$5sb|^+>?344d3*4)W%k(+5F_{Ja7CUV76LqAZH=hvTdNMUNvGD1qi^) zz@O1f@Jw&80Rev{&x8?2JxQa%xJbh|3Fn`-Up=$_{Rtx@2ABx{q-7Gj#_A1f3a^A0 z{97t|Fit8DwI2kZXXywb620fCo)$}N%NH6+_;s$K)7>K}T1>~G)q)QS@XW1ALcy;k+>MH}CZ!!|mf$BMgq-`04(Vn(mAw}j_3Vhmvebi0dCMHBr*?V36#S38pY`})h zNM=zS1)Vg8~`Oufa`zGX~7zR@zNs9^b+au2Zcsk?)THbq12)Vuvu z%dL4GnmmRuyfEoiFdWKnSw_RomHEgLr{|V1^;$WC@YK)R*1P5jW~J%D7aMFU74eM& zATxTjW~J)47Xl_u0qoIypVsbfya2f_@F3xXl$9D#iE=_TtmFlc-+hib;~8{?D6w>^ zF;xA=8S#W5 ze`bbgPsxd_bn5%qgkv%!G$9bL`H{{RF?cxT+hd!*2u}B;=K3 zoYca6&Sf6mOv-VHu}a;dc7p1_$Wi?q0je zVT{bC5=E=U70ya7194zh7lkG-=792)qtvm{);F`;+$pKr6x{hL{r5*T@k$3ZWvY&4BeQnIiXC ze>Ym6nSQ0Nv&2>yqEzrwM%)d@KqiDITgSg>%TI-B;FyJ=RD4eF%CBEaywNQYoxDDl7b028=&+pNQ6R-3VZKRak_)O#;*nZzN3qo75?Cyr`FMk9p?d+ARI7D28 z_5-MB7Btu7a?rSCou`JEclq1u!R*G@9XVvCBq4P~q*w{{oI%R`U3ROWN2*DXG{+dx z)^~6DYO11+ma^_;{qZ+c#eBVQ@n#`EPiWe=qSn&FLT9Rfc=)b*6u*`oMAu2BSg5(LD6r7Y20_q zo%6rdnQNM>>e4F8%lG)%On*BUb9QrJfUbcvQ8Utd`fJoy9CJU_%o%MEVa5p5wZy>D zef;CF>ftN3E8%t0yi!-yIC8%%J{&~5BEI2XTnEF~17_PEOm@`;XW$>*P_z1VBnoN9 zxk0#9GVJFs=OcoWK62j4-Cv!Z_;y0y|K5Wrcdao*Wf<|`Xr+MGyym0V5yM4w#62zC z7k2zSRV76KI^*qxmkjY0;qE4UH2mS*(S=oUI*JZcZX*<6it4W`&+Ynth@n3IOPBIt zu$P>aI*|S+kvO54v{FO^;Mm%ts)7++>9b9)M}`mrc1wazG>(JZEbAX8Nv3xN!v(s3 zt%2qkD9U-X;x>RMTl4*C)# zZ}-1c?RQ+OECf1Q-$0b8%+PXw*3Yq=9HlE*Lah85N^4plEU7o+_)jv`RgS=J!N^mv z)1wd@l#4Fk(?T#+lN|4_H$Zs?>|LIc-(5#v4MG?(+sT6X8b@+fAxu$9okSTR0On%# zr2k^2Km5KkA1c~HyWYAQDJ0?GK92|SbkrqbZ3x1*!rG7VIVRHCqy1!Vh8|(1 z7)Fy@@21!cFH5|X>4|meb$&V&>ty@N%W92*{Z6jCY}@^B3V!ukigu4s(YbE-^~>7D zrk?f{X4@a=mida9W3W#o4xxR8GN4B&%+#N%N*p08>yPoHb1}E4@2mN|OWZGeoFZ>* zQW(XgpF16bl9%2yT5~ITAlC-I9Z!tN(q{b=Eod`GS}VL3h`FxK`hZQbNBIW3+LPw6 zaYr`7ggD-5aH(6kAo)orGl%7?Hk?k58T;R?sW|cY@F3pwR2$pD(Hry5H1a7yO2C_u zQWsUI+`ub&deGvwyxCmmdoYt+<$m&%fr2*v{AP8^*ot8=k#(l{$GgpQbZ+Y=49U_9 zlAl@ZM@AO9>}g(*gRV}B(C;f$$kAEwjPC3|R%*1-Ax9+Cs z`L9%=K#jPa5D=)Cev3No1$>nHLzmd~-LT~~XJdf1YP6wfB1d$6kh^i16+$?E1CYnW z&;5yh^saWmes_Wzsn!nmY%R5YbZMlMh1u7FX&N(QjY2-@dk&~adQH3=KAj-tvxaQ= zQE`FX|5RNlMvK0RWs+lYD}+$E(EO?lM(-121C1ezDES;7-UvK3UfWp9chDCoz&L0z z6TP?rp!zzrzpqboW-J-TIWdyLM4X@b-lkf}jCqC%giNk{|67T}-DvN0+Ps25B!Kh%3J@p$`h~EOJTnKVA5Q^4E&9jsegu5tOk>Ge zdQ8nA6N$VOA7si`w7dK(Oa&M=_6iO7_Bh3cIX5dlYoOd*FAsxDOG@gkIt3`+?b~0 z0e~_t(ID$k$U0CfKyMHamZZgq)(0vZ1pPUQ9u253;#c+0B&A<4L8h&h+Zt2z_K%I} zY*7KU2N~Ef{)-xFCG0wBvk}&kZ7AtiWpU+eqS?4=Vfo{N?8N?I>Rjhb-Od^pj5STG zBTAqU8)N`C`S7R$d>0vTER5I?g1oCb>fNW?XJLM)?0abJk_4_I@eh#Sf|Xkn%=)U$ zQ!P^4IG$#umAFz=74W&fLV;bC^*w=LfVU`S3rS&F6z)$pDgYWpK*4`TY*Vr5DNH1G zff{4Tx=_6SI8NpH;VqEoSK6o!QLMO9lsLdvAY3+C{c#zq^2=v{Y*4gLuE|m`p)3hJ zbYJ{t3VE?sED_Ioj@fkGI>301pOLbfK7=h|MO%sAQYR!#oE2|mAqlNHcY-mzGOJ+( zx(^3=uRB=*z4ftEu0_8ArxAbl|DuC2JHQ;xQxD+1UEMO{_z5(wwJr~7(qJ+?NDC~> z`;&F~X=}QG9Stcjb3Iq1SkuczJsz|W^>=;ywvp$5)w#0N6+zXo@l*dj+5j2ifr1XO zDm5;*zXKw)aqmO&p`n!uOde_Olh@*Qq0qd#4>na3BV#3WUube6bWN^eyeoXXSG@Kh zKxB-nC~#n6{Ik`^NK1NWk?bSLG>K|4MFPRiSt0@Y22x-1Q{1mG!@9&E6DibbA;9=O zZ3ckJ(Gd)1=?1RY9(ss=ev<|sb>O=6d?JX3XhULC}AH&q} z$m}dgS%63gc&QdyTu5zgbPmoi-GrD{Y(l6B?g#ZGiX5S?e)%gH7F$E|9MD>dpl zHClBC9N^XuSnbf-9h0)^KOBv!dOn-Ny|{51yRx=sczk>;1cW{{phxCoyrzJ4jEuet z6l$9qq5Le@Kmh8k&=8iyk8;f7FUv7evO;pduWAzuvjq=9GJh7EPj5f=DuRRO4sl7ay8gu2o+39cs@P1%ho?# zORbzbs?4Zv_NEBD!)-n)Ppq&zuDcA32;YWd{_1||1b+=cSr78-;$=~PxHy)5`}0HN z=cU}s8%9jr22;d)K7A^gKxEWcTx^GvUkhOdrlwJdwV_H-QRV@uJk7b0Kh8)2s3jW z7iBmRc%;s*O#5H#Y2cG`F1+8hS+^T;V;KuaBh|5PAHF)rI`^^CJ1&=_ELx5GSnqs= zjs-_3gqCk7-Mz#qSs=@KXJ91Sw4cynI&jeAvK%^a(9vz|wb#ob@45btyWc?3okFeJ zGS&JV62h8pT7SO1G=O_?(-L+$x{~wiHgu^&gSvB&WJ%pc*+UI{Y9y&6MH&$_=cq6v zAyAkp_n4y3IUr8-MD=QGo0AE==W48dBq8*YZrO|nL9fh&8ZZdv-w)c0dKj|2?r2iR zZrhIsU|?i8#Ldry7Ng}(;bQQia=1QSRdu)dJWntj@bUrUFN^45cp#eQ9?RFv+W@6u z1EliZCL9&8PK!pi3UPrDu*j3+_~QR{wu4lOR9TA z=8DJs(TMDKk1nK(7H0@TC5-o8POy@atNYNf8M`vZ;~}yVt%H>?vye>0f_7Wo=3SwTJXNJ9##_84m$sWO!IC;A|NizS<&xaF!lv868eNUu^f?>Jnc&K|(`V)7D^BBB|qO${RhxK7t!PY?0m8VC(9O){v$( z7yL%SijP1pk57=v(8hJa+-5jP6&I!x+R($Z{3qLGnRg0GnmEu|CK8yO=UxY{P0Kn1 z)0t?8ppyJFNUaS}t=0YSV8PD=g4V@)%?OD`3*;3doaU?(Rx@w+6ig&|T>dOy^I@)? zx*O<;&^>!v8b~$_E>`MGj28sPgUJySXSXv>4CVV13Vce^4dvR>!Gu~}izi4c6Te`> zuCbT34Qd0Ja`~8>GI)(xlssmMomEqz!mKXa1mA2T=d>1ESSfJ>B!zMG{V(q4{x8g? z)xCgIU+sz@h-NY+n%xM>Oox-O&9;F@huQ%>U8*IgE&fY0&qE0l=_q+6rOXJeYeWb% zUyTVf*Y5R74bFrv;+`|deRTkGm0*6>3?XvXJ*7LMrK2{Hpt;rU$bon7y~ruQEO-32 zj#qV2xWGxSVfBPFp+VBbV2ub3FhPgbowFFh!mB9Oa6x@-)Ro2syt;n2m1+hx9`p%y zRrkAHJ^IAE$6i6<|1bRx;`xr$|*H;6+j|h>nI& z6N%CC0eONcDe{6U#fVzN2p;o~_1hqdkvBur4v8b_P9wq`R0gnaZvk(uaseBo-R(OF zJq{VxNWodQDmhq7W39OcOWIO~%59pnB67sEoo3#fLD5Wgj1(YNDX<6vTtCIHafGJ6 z8@Va@3BJ3lLb_k6DSL{2_JgX^?H8~rp(^+)92G{z9PnGoLp)uaGA(Gji&A^VwNmW9 zr##AJ$|UWPrw?<6uauq*CAbf7I`hL8Xn>`Bn`%5OoDlv`E4|ZKSnr>m6SQdhVY1GK zp@~jLpwONMpL_IG_j}a>f&EK;fHdp=QnO#xpM0tf*$9EagIlG-k&*PyXfz^CRV6D# zH;mjJ%*{K<`g!2SCk?$YJG+5#^H=6AU;8w z7{2+2WOwpU6ZY3SA1Y~mB+8WwUR_a^)^K@z+k8~TSVt=<0w=lAm3~E2zCojiVQ(#r z$Hx+qe*2W?UZ(pb$OA7QJU+C!E4$R*dBi=l{;qf;bbIfm=P^l>t#~qU^VaymL2}j6 zCZTGd!S}=Zjld85*PrJ}SuM}%@4{pIJN=$9gEmm+iiYX6AMcd#G|-UKs%eMTqqswM zj=0rs+&lITXkI8MjfO2_++)Q170UUXQXV8hPg3Q6xb{yw8;`I7J!34`kPX(Ei!kM+scSl`###Kqp;q*l| zYe8Z#b|~0{)<7q*_cChsx6^Tr0hOS>fK;}zZ8k-oTI7o$==;rJdm&x|`zLCk*h~9_ zi3WKY&i4Zbl=ZW;pK_v}y4jR^$?D|ZM;aREoN5?-&>$F{e!LYFYk!D2mti1ZVZXd^ zglC9=`X~&D6tSeP2!DTT(1r6_q;6&3;){=3E*m>L`VGbB@1q%+ZF1i6C3TVo z?X#Re&IZ>M+l$V_5tZNtb~udjSK-15-p zTX%cF+a?9LP~BGpk8g%F(jQeXuZ<}>+u6PJr9|w`XPTVCF2Y$mLvZpC%yGa4AkRxL zKk^|GK`#(`A_0brlZzW|Vf_t)L!&o`R(^5o0{g4yT40|yyZBAkp&nfn$6-5wa(qT$A5ObG9$Yta<#fz`s0&k%{O*j)%i#P`2sWx>q1KufTs4w5A>a$YVOU1y7u0c zkon|j?p4Xj?u}n5+{!-55u)8)k<(0wi(9lA_|hUx`SOaM{r*fF36O#k+Uq=J$0yoW z7dv-(u|UM9`0G{Gkton~@7Dw{XQd6O>Ly#Urc%0z%`M{H%3D#r!UYW75et$74cL2m zGcuRRYDF2R34sy}3+J4=#eW?21Z&4vT>f11RwSI(S%h&e3xFCg(xzeLu(I>>ux<{v zZXo{Tm~|g%hRn%#5#QPHN<4|wCS1+yp0sMyKITixvryC$i<<2#KG|^h(c*KCJ7UNj zdn6mfZH=;(H#ulRNRFCylId5FoD@{TBP;~&`oYWQYZ7XG5r)qfl8obunPP|!ccQ^y z9)JjV=PUmfg8OvhfY=j*N251Bq5lL zw&bxfzmlInE!hET6AwRsKTNR@d?%t=eW3y8Id5)2@$`OK#UoG?OpkpT0&lSJ#>y7+ z{_wU7At-$JcYL|R#bttg35H`d-XJRP3HmH?A5Mad_8G_^50E^F4+LH3iD|T_`J@5* zCRbkjK;Pz?pS`R=i(Ah<7d}(tJ70@gn*vFdK8__ev5XU?Bwexw`5qS~s-!X^V6pMbIz>5M< z;KaqDrppbG7X5e?({rJObA<5l(&J~$o^b*cVt_kabTm_K6o2qt6^t5SATG!k6Zywq z)iDMl{KktNE~b*K{{9nvr+mw&6sSb2p~063Y40h(LA0-?g&m6ufit?Nq9q~Xu51F?y&W}YDd0^8s3_P=pWE__3DUuY^9d$m ztN2TQkys$0{}T`ihN~mGTHyncP6JFI=X|MV4DQ+QL#BSl@Tj;~zBmG_`@t28EMM#9 zEw}-*Ox<6NZE-c|P3-^atQ=J7EgJ&e08P74tIQ6n3bjC!Dj^@FSoDO{+0_-ZCZ$?Z zL6j-thyJKeHt^%KFtQC;6(@0l0*u_cGMy2RLwSWjp=k-U*MWl#B6Sxlt_MIGxPiDc zUkuHR@M_{r?Zfw}U$21L+mmbo;vXmD^B>86&QzYy^m_qpa~KH2F_4{a(2TfOKN-Cc zIk5BFW!FAP>$s|32Z)C;-77HBqN=*2+kmz%rNO9lIKA`}p!1A&%47<`{Us87-6h&P zn%wy5+!Sam3g_SUHMheC@bFz~ z44xe4f5R*GcO-T7!6MUv_EDI_ov$i@4G5rTYr=-GA9Voe09{ zx5mqTWu-q`>Jxi+liWTJ6!^$4@BY5V*uu5UHRrxM@VmUu$^~E|`zvOrJ2e2W#T&44 z4GH6QDjobQ+&5QfiY!op`-ENk#~O<+ApS;@0`L5jWmLl86o<9=z(7v!1tq?_hO zhMw$V$O;#;G%II}S7X%f*+ZJ7N7w0*}6E z!CEv~1ilT572Em9s&ubC4~9M{)uO9nB^JFv!tuDpiB1`Da?&9J zaTkyyuJzm!|E30_ocu=C@81YCfPn!ZWTlX$xDB<)FtI6u~U9;JfgXyg0xurs&TsNcx-Cx zdx%9UgO$%WBZfbSleonIdpILHSe|pSY2TEMXfxy_DG1o{ZgnAwVWvhY6E7QoU8}Ui zVvz7UhEf2Tz-rICevwZi1-ml8bo@A%(6l9|EAbKI}|`t<3mh;Lr%JX4Sho;dxM56#~7 zD^-ghI_OvZVe~~W$BU!OxEBjS|NXl6tz$CR@Kysi0)0G%u}3MK#9weg*+5*e2kHF0YsW=Ifsu}&s`JG)!qfbroX{w$2h7#Cj*WJ|bHrbUyT z2A_;hWlrkrmyExM-Bq=7FYv!{q%qeb-8x=bBx(C@XPqXrQYAJc-1Brqhx%H>z(-Tt z<&iN)>eABW=euYlnz2f-0>rkfMTF*&?X&_@aAZqu8uH;r`2^|O;@I|KB~{Y`_g;F8 zZmx*iPi_5{pGy_#POSbrTdpvJ5E-c~J=XBYkBv~h-x!&1PRaTJ_^mz5Tkm&XcoT1~ z?QzwW?5GVX3}hNlJ_ROKiLLdPYW@w5NFoCzDoTX_IcN(6pjZj_jDeKH-DV(^yBgn7 z;ZO{F0=mdeiF%3vFg)6(00SiXL{i+*@#9oKOMZ5#iE53XX29rpFU%(sidUcp$Sy6= z3AYFvlJgLi@}Qq+FyW6*(ME+g(5oonakRzCdRzgp_+|S*!uJIOW%a~l;#{fF_R{({HBSogItCc7c)vwtUsZG?ZGf1@ zdRwZ`+!x?C5v1y6m@5Z)ffUsFCu3Kxk@+*MjM%peKKYb&I6w8(s7>!zSCn>;*YSm; zc4o$3`<{54s|Ki^Wj4C*zn3zj%jz0hsLb#H7>!v8Y?IYsu(5-c6$t&?Qm_HVv)ktt z#ji=@4RK#g(KX57jf(3lV)lrmRk17je=J>hG}ZtAzt`nj*G(iY*Q$&t-Rw(>wCt7H zrK{`}u05|kDk~iWW05%tIys@p+*L)ME+qNof znsaq|G)-rX{Jr7m_d>)`eYJC|cGUQ7cHH&{`PYGXz{Da{fN~MIcz!}aAJ$H5fZ&X{ zt8DuEZUCmFO_h{?%)IQokFWnjmV9)vTlX2h{#k0JT?xg=9nYNB4&MK{ zVsTk9|61_h%<4CeoQ)W;7i977_4?_VX&tqgu1VKV`7Fivr{1wq>U~zK$*qhhZhDrQ zwj-l34I5Vcj4J>UOw3+Ul^TJLtdpF`Mf)xBE$Z|By77R}J1XbcYCyKoumF_!?Zhg_ zq~15>t(ilf=1K1SN3~`9OH0*cM&lO2tulk{53p$W^4H|1i?vm@9*(XfZgHNqY0b?a zGKJDvDm(24ZtAyA+NegVJlEj08v?qK76+NtKRhNb9MRro*1u~@3pg^mUa~X9Id`rj z0m<)gpXRv)SXVXb_E7mdl+yqE?Ay0v{v2@uYVw-J-vGf2u*agEa@*ls2N-KWN=n`W zFo2C@%JF}N9t{r|h7FbfRL03rM9py{q03;1MWx_aR$)B4B7L}TX6P1P`W)JwjJQENz{s) zNc{5UR@BK#)y^I9;1x=TtJJs&KeLZ5L7F4OsJaz7ecuQWH$zD#CE+k2&4l`?9n;o* zwhb8>xs)h}?qieCXAra=d($SiHMX3-dgxo+lHE$rh_YVGnW|nIJi$-@KJ$nX<)3_$ zbSr(4(f0vMWSo#ivuMKWdM?SDo7Z95H_i)Cx}CUKeadkEy;mEyTjAlyeP!XHj(}v9 zcX{R~@+0P@{!2^?%;MM5*#k-_2X@Oa^r+qdh$9RCQ|#a%KGK&x#zEou9&l% z#AhsY&V=VobiT!`Iib}tvE(S}v4|ii>?gMe~B6cazX1dX=bGcTLlS7 zaBDYBIaLvC2vUxhFaulSFM^P+4;(C`#--W>^4)EHvt@Ogt z55>jHO7e^DE}X+w;{*NGmEeA&k|OD~O-pvsSnOA-Xb&TImE?yrcs@gBe~ zHKawEE>Hq zewhMfmxh@S4RNm>{q3B|{`0xkV>MKGXlp7o>0HvMz})3P8Th9+^LL4k##{ih| z+l}iLeb%4mUWW>N`LlyH-<-T~n)Ix7HgMFcpC8FdAfGE^<1iBtK@#@HLAGR~)v{?8 zXP}WC)2NENIf2CoPrA^`Kx~j}#W>qDrGd|Zy+>;2dqzI&EPHHY3G1gFD>;t!OjXs`XM^j2x8+{fLo{Tg^7i6IHcjXA+gnJovHk&$AwcdJ|aG@auwanxr(Npdi zf#&dWE@>rtErGnnqp0gM>?^jvc>&KdRl!BZd1PoF$P2nSD0@l54S&aT1>_fUHBT5I z*&9t({bn0UKQ-8Qz!TK`;p`T&*rMn*ypl#$3#tz_4_bgxiWnQ151ZL2fiZB2$Cuva zs7^)fu_3RXpag;ip(68B!p3dHS-IujF{KkYkn%lN@<~VI2eU+h`WI-NO;w|>%?}+F z*5lpMRwAJA!fvUNY4qYq()T1q7yAIsZH!4TdNdH>uYak*T-{$W4(Ov!tG99B^s9(# zDct6jTty>NOx`PLu5K@E(54Seo4gHg8*mZWfiPRAyBN|+O;7S(Bs$gNIf6Mr4#iwg zMt@LcCIC0UYr)W)>8o{Li#z7EZ!ipyXU`P(0HqyutQtx5Em%di^ z@M5`*?-BhJrBt>|8HXo*=|(C8z9Taopd#kl0_EKv~od){uE88KB4wTM@u$ma~HqV zwbBZwkM}*7nGFc4k2Mc}w2k@F0k!H@#mTL{lUv?ps)bwf`P`0FtED9-9KkLv;6+8i zjf4}p=8#b7q4KKx?`%5l+cM3Ct)(WYL=LxZ_05{Geg>b?MTF(Trd}~Kh!=p1~PpaY6NdH=) z*#?e@rto3!x7)(;qMQhbMte&U43LN!2p1sRH5Mzj%-RTeWxe?b7cXoEp zjE#+T#){mTUQt@O_Uq!NAnOo7)p)~4mvVXYNia$$cCbV}V?&qe?Gh>VQ4Hh5xnR*H zx(1UrUKLskin1|lW@sRui6y<4wdBw12Rxqx)T&-ZYky@K9eezysAE!QsEjW_{l;zc zzsawIvEzF)hwxY@>^Z6R2F?yuWfjru&yYkVe0GEi=oAuozr8ln6+OB*$$ z8Z*ak1^5_^8A@O~@zA$Z4Kdzp5NKT^m!7wvy*ca#Z6bZyHAKiuOviH;^@%N>QDiqz zx4B)g!!g_1YPr8ezUl3Q3UD@8%;z7DthZnLW8+n(j$fC!;*XAFZ>X^#wpI%0qxw*i zUj!+3)a;F`22ty*se=5DnuncwWlHel;KbE=H?{l+v3H*k_Zl|VY#=4;#(l4jJV>4Q3ULV>LeH>!jQ zNO@k8`^a;8(bz^`JoK+?OS>U&e(5_DgcceUzHe-{0j7UH+!|W2hF*##X~x#@p7=1* zQ030y71DS1wDvmyNTC4MAm8849wan>mj2uki!MKr!t>zp6lL=_Pb)?$S(RgjOS?h| zxMIdV2^TdGW{m+?DL;1)p0*NKefJn@_F9SOtA$zu13dyGvd3IK2&xq|Yv-Y)!m+iL zR@yxdoI&1~!TA@;xZl5FIP1{iFgQVTwYn>k6#4QOBZ6R3WO{-?-n$-K`-`Ec2XanC zz5WiRbd>0?tMT4WV4H}N8}Y*=UP<>Ec_XOTK2_~)|Iv&KV&Z9!22D1hkT(|9P59l zeeMgc@mr9oz%*VIi7WgF9cT>Fx%xQE#X3W<3QtNvlq0g!G*}d1mv3sGY^8}n0x$Xc z?q4RJh*$a9T=y;1{j*ec9sD%J`kugu+`x#UlF3tOdFVhiJ^U0RV3ai5cwYPpv>Sy62tbWjxU4p81 zIn(I@F*-#nVI&r92G3(hb!Y?-nLWw37$$V{>$tzho8GlBD(WfggL%7irMr4Bi7@#> z=BZ*h`rEjXR*a8}jkx7Q6#}oJBUA+BMQt{9%`y#I@(JXz(zww*dHUkJCz>B33Ruop z&!jBGQq!X#%$`xOF7VpdLGaEFQiQo;m5)2*nnK?j5xDFz28_GK7t05WW1_359$SXK zOww;I;e)NN6qx<7wl#c3Don{z;ai*J83sRb<>z0VnQw0Q0$!UHN>(kV>9*3nDCE&3 zkVg$zbu!`)T-&!Tv@Gplvpco2@a2CIT*f;+p18ZG-FIA`Y!DkBcM z$Ym?jA3-9jL!ZJ9hMH8B7H1cRBvcu!kDq~XhfaBIaIw*47_Og@zNL!#P-2a~M9``K z?6*?KeO8wXE2A~A^DKr`4Vuo>uE3K7#*pr_Z>b2v(7iKT1sQO4|Gqf%{pRKzaD3s1 zmv%dTVfn}3P#GKiN^f(_lGM%%(Bbwh^CNR6Ui6u!P@R5w?qGX60~wQSTbb9OV$e>U z$|MVi)Z;t|(o&zO!#DDEJm~{xGfJ=k?(eYar+th*$m^8B9)9} z9-g~4woqYyyGR}|2}-xJORP1>xX1h{Vz1%QB1S=3MW6iqyw@V*qR%zVdnc~_?o3^@ z9H;Hks_qOif%EcMVHNNY!futXH!CgFYyG^NVdlj+p7~x{Xd%l!nr$6r`|;XU_E=#~ zy~r?hmpYL0r2KMNg_FN%257Xta~PTXCu>w1^pt@}e!s$MtQvm;W5~_EoSc`ppenTc zxcfyR)WhM8t{ArxeXLCKMbvVxH&Y0LAopIQkHh=Bf?uhE5rS1f#JHVy*pemhxHY(R zKSQ?6`j%e9K^vIVt7S{YV`Kq^Y8%GSjQ`-!_e+IVjab3={77+13{@WO@!r zvVfD3n$uu1jhlT`$TeA2j-qz=x6g6}sfx+Zk*NW&!e(n!yh-?j?)vW@og^Ip*t+9m z^ZK|fl5}_MR{$Y+s}*?;b$A7iGdKZvvJKNXT4DtDF|~PHlnKB)=@*xvvDtModyjnS zxAPYl|7O8YDq%>^gdPQ<=$^iQ5t9od1Lxktg@aeQ>G_F$id(w4&=2Uzrb(KmJj zjR_9}*a><<{3{za%2Qs|qJ3K_I8~hAHs&P?1a{PSY_|R>W0cXCx>l6{jE4Y`l@{uS zSE^bajZPTd*C~mlCCIvh1Vp@FgX~9X7ml_X@ACjWYL~(a*LB(CXmGs5O6HWQ$YHAJ zrlL-C#c?uCWW@ru8?W?R%8%eWipr#r0-AP z5M=?3$ZeLq@^zrN&uLNY8CAl(r%#(`vF@%(y{@UDMX2B^-@ngtc>{zi?k#KdV_dKI zBcUR1Cta}T&J56fx0!Eu+IR z31`PfJe7TM_=YP~6NCS&+CTSqtNKT1_!-pL%;=3VMRU9M zUq9P~qG-RlQU3MEhG?9b0gYSjQ$x$Kx*c9WBG-HUBbJ(kng|Di`}7}Q_*n$W84HB? zC?OU@2zyKGQ?Y2JfxuNa{psEo*_=;-s=l1V z1?9NypvF!~Gi}v++=ydU!~Oi3AW~x5DkUX#G9FT|fmc?dm_q3C13)Vw4pYzn_y$87 zvh|QG7q__lg+DWk*AqyhrGtE-i*ET4L)N=(pER}770Ao)uJL@0as9dlW(3E9uHg~b zK9ER~=aepj=h;(;W2HiC{9#8R1Q*a>`bpt*_%@UJG(*foxtA*xBxL5wO$P_(fCofq z`^hx{{vzs(Mr^%Mb6n1Fhx(ZKmRQd~CF}*r z)pS#pzJ11PjaOWIs)g2jwK+8`{_R5kM7NoPwq_EJAw%Yfq? zGaWwd6E^}wzv*JBet?5Rob#y7g_qlFC3Q*qE*_6`Bx|*)$iMFnBhkOU+|I16xlY1; zGj_dlVf;qQxQHVe(6wSp{pc`?R%TjWMus`tfT`(-p#mA%Q~n(kZ8;~l-oR%E^6AEU zD9fIQa00_Dm<6ibN=!9JdeA)ETrO>s=GH{@bGles2ys#EBacaxK&C- zHp1hrc_it0h4M8Tk(<1nap}w9Y_|972&JilsE5pV8qeg@5qgoOlhPU7SStI98|sv~ z%tE3BMJ)S)0vf;=Hi#FXHcU9r?>knZ);tvz7rI)ym400_?-$-4kc&m(iAZ7hYCbyO zTJF^+kZF?&2n6>`sEZ!oDWraA*O_X|4T(Kb$3qdMwMfWJ-^6aYLag7b&oP&(>+4{X z4x*qc|IKl+z2(>7D=4PpHJZ2Pz4xwED}6N%pmi`pmH1Wf?iDIsn3j`(a7M|aPOj`PNpp^pi(;$tO|BSfpFQeJV_KTy_~0WWVI{)ZEuy z4dNgTVN^*jN8{d&N1mf zlOdFU^2tK%*{ln2T7`q+7(-+ zW>*xwflm?RVwc~C7f2G%rb-Vo?l|nOKH2%zxZTWc-M|QHywLt|@5;rCPv@kq7ZLoF zs{15wvGWwMDNq4^%Ue6S+EzaTqw*JnNX<;qiumaEN6@}^tSz&wQmSz2ljR@(-oGZF z{^AaHyJZAj{>yJjwcW~$1uXOsTB{>WI6q7`D!@dflQ!KnNn8UO3!XqAQ z5$w4fTS7xQLUR7YY92y3fnH-+{SdI(8c|s0IDHlU>uW5UkyUu`G8y?&3)R;EsAz~J zjX!6Fk$maN6Vxpsm(2}Me;EWNP_LQ+Fhe0bu`3jOityJP!zX5E?x zMH#H@w>(km`g+x|uY=>ag=c${zM^X7@;_Yes6D}0YBC!7)bOuo{L$@Od~30qR(JNQP4?6OcJ}-meM!qOX9ip_8$H(&b*M`w zrr!Son8|E?aYp&ia?=@Cu9!vTK>hDaXUn9iN~rtai<+{&YSq4XtQ;O^3$)|e8t?|+ zr&}|-zz|jSNG5CXBPs*AA_K>jSmU0%pR^e&2ay&&T(V>D05m!FX=C3S{r7d30S!yX zzyJ$}ttJD++Wf@V*JQ6{Lzja{^j@dX7Kb+-*73=H+iB$aS&)*zqP8~Tv^F0+amk{K z)7;ont0>LX`+}4-?_40y_jlT#F=g^wg&|HDbjsy8rx$htBBv;Ns(_sZ`bH|Bg{)`X zS@j;b=vG(RpKO4&W~Zkjss0u>d)b*QpV9bfc{1^2?!vEBCLDBrhvv7do5=$gk}o{o zncpf%Jg3o&vGa}%Ptszh=RaSmpX^gXsc*tO1YsUIngefN>mW%d*M?AIO0Te$Ic-g) z6@8?Z?`n0uD-w8_?q)Nku0WC}bZcWze6WKNF7cgWeKPs@&+)cGvh~TpHe}L_8ZP6Y z)-g^wIP2iTgm(feLll+q36;@@%1AF2f56V}?d0I{#0GGum?A@%>A7+NP3j408i0h& z>%V*D=6Fy0EuN${3gl^FA=)z7M~NsIP`;{*uLReH^Ni0BzR_(7z6=l^nuw+X(tFH2x;PkdVXEft>+K zrl_;S)4iUK6A~^VwwjOwqvw2YB=%qj`BT*t|F;wen+^BKoH%H@OY(y zQ~AMEWaeE{D(&TDd+QEUfIyz(K>K{KZszVohz~=M&|7AI_*VyYD&o~!EIdCh_safG z=GChqivKe2n3(!mDFq#D@p59o#^-3xDmb{5$pcBgCowxDldkN`!o9`30%zOzJ;9gk znz4#i2ZB1D=qmfX_jXO1nR3an*lfK|WUs#-ta8H_G#AN#>rWy7B3KbyL59eIz|y8I3P>wCmX$TXY3&hLnbceVd4Jn>cgNY z&h1WBHoCtMnKvk2B5Ez_v9KrDbxH#&*u2&_Vw7SQ+Q^j-7SvXKEzTfwa9;aS5jk*#vjPfxY8n|Ox>wDMo zY0Sp2xLi^8CBxL~kF`(LfWK;M>)ZgO+gcQ3Z3K`1yDk-_YynpvX zD}0unQ|a`*8YDV3BI8vDTmEBx+XZrs$%C}b6NN^91Q|;?(B8`5$wdM$srd|~?^j`0 z8JGN{o6(r5!HGUYT93%soe|%I3s9BVl^%ZI@Ls-GIz2|a4o;Ue&J(xq*`8cFjm6!* zs%hoH&@~}|1UcEDmi-oK(#;#IX2(D6>wWph2M6^qtUfo-Eg$UJQE7*syBpo+%%jP+ z{+6HeURl5Qv80x0Wgfg|8yr3}kKWoUeMjen&H1szM4s)hv*) zPc4AC9#E&p{&ybR=VYYvwIqG@%rVP4@cUs?f{ed&S|%jjmaR(5f*Fd~nrR8t$eWov zZdts>-&lj{SC`{@`Misd<7twSFc}GAeJ7k`HCdYbcV$em&QMPfVy&lUYBpjNDE9YD z)$4-yY|zTV#OR0^<5Zn5d(b-%J;`As#K`MC=P$gXompyM>iuIHi~cj&{$AV2D3FI| z;rEZGg26Xdv5hKkUN3ET&o(x^v-C?;tn*hc`^Dtn|ZjmX6%(9XvWY4Ni?(=n7KYSlkd zez{0X6uJ)BLY&OvlE?H$7)FO1kcVkAdbN7)Fr41qUUl=RSufM4u>ht_QY-@Y&2t+fJbE3Zcui|Yz@@%(SFItBww0Eq}o%Ky+9iP5|VA+2m zCtB7{cF^RZ!Vg@eAk*1(mjz*oL}Z^lSSxd?|-ObuDtD+Pn*=27P7#72I}E_E#J zj4hr{YsjyZ0(qu5AAeV``S(sdgdKEB#d6jD;VU|W2DvveGx+d{2i%V*tRjpsh! zCR3sHNDwMv*N_(B0pBLQ)#n~^83%)y31ko>5e=HTb2kEs2Zkxp{KPx~dj|-Pj|JSS z0i}Z)p}+X28W`y={8q0k3oPqgvG!RUxSON5;3h)1f8azUp3RAQwwqSx0HCPj(S~P* zx#fs!T-j8`-sGH1r2!jm)tqrKU!Hm3)RVc(U;92LbwcTb@;gQMzC!KQEfG{41jnVt zKzPU_+Xbe-=c5lQP@clR50Z~R@KBmUq)-y-AO7CKZYA(i)byiC^Lx%kd7{xqy`Dh8?+bbiVY68VS=@r1fTiij)_Hzu(d1<6O>S#l`(;`uhNZhQKr zdH>-^l9{r5@NyK%@iZj|M3Mu#p^fecOZId&x)8wR1bN+RJoNY*KxkYb69HQ!%7hxO zuJOB0Bf&(>jNH&+fMT~?f&CZ^_?)+aLFFXg#w1t_E zRf;0+W4D$}R>QeJY)S*H`g|N2S$8X7BfvK@?tmT-kgbUIfFt4H$_oHVOYwWrO8g)2 zY)z<+*g7L}D9lZlVe`?-Ar+bfE8(+NR)mu01Fu_YSil5Dvf9N_zo(pkv8Si(=d-X0 zR)RDWXR5i1x`ZLKGeO#J9M|Zj*nvofbhJI!OsFk>XNjdM<7~Dt-URk9tzCrj-AGj> z*{hmo0XvNEIaDKM#qAAeL8U1nzRw^h=rHG3Y0+i|AJ1h)(?Fj<&1kLh%ufo-4Sca@ zI4?&&<%T&u1Sx@N7u4ZNUq6P-qQd`53U~gr@@>k(Fm;r&jyf~bbrVLe+-9{50wR~W zlN2f7uOfJ%o*`eDHv_JZjn2&l3+bx;2CG5*gJk3D+#@wxjJhS zZqTS}Bi@SCIiRT75vCjhRL@)fE;@J;)0Ut)!B=n&!Yy=NMzB5Boprzx$h9mqix7)K zSF4=?uK-r+BK}--YKuZU2aeUG>VpRmc*f!L-%_+GSgZqbS~y@E^x14c-a|diwoH3>uF)A4FrMYZGOqvH9gMwRh(ddoLfn zv2J*O16bW$voux^;S~;Z;=ElM+Y){eBGyw5QVF@rjiilEOXmsXzu>38Gp!#&~&T$EpVznbP|X6RysP z;L(fJx(5=xTBZhi?gojToO*+WZ_zw`w7r+FFAOE!Lad$nEUI}fzI7~d=4peBbnSe8 zon%U}_O}<3LeiyUAg^~5Vp+LEJ0Id%&0yEcEl^4&wjLT9!t7t6ABOioPoS9N$*v&u zFHErkHP!5?D)U=8ePFh_!c0RDH2(uBfg|?wfk?-x7_ipDWhNbdg03@ns0)J=%p-*z=J~iQ=H5w1I6S*2lpG7? zp}Q`IOj7`FYOz?7ePW+;r-v<&4E`(k3tD%8Y7)SoBoh9+#+xqwJh(GI!3Nka%mEMm zk4&&TbY^F7io0A{vDW{wZsy27Wdxg5`+Tn6h6GevQi;{(4C#ul`0|oi4Ej)C|dG7Y6{`fxHMFfPrlQ#}=^_iPV60zlnujRn)HH#lrKr z^AI9z$>18X$Kq|E=m-)gL-bq+smRttmpsBp9v$C^bh`fF`Y17{g3qE=oON+jloyVb z(1g8^D|t^xrK!X$I}}C<1+W-AO!U(~`mUR)M0r+dasD&gGlM+Icl^n6oQ_|4`oH0_ z_dtr(Wv6co&_Myp0OBp41z;2eCnid_$Ybf^4!3Vzz5Unbo=mKhXyEqmLSsV=QQ$}4 zSchx4-<_+ATJ{5{v=NWoELrj5U(O=TffZwreK!K&9+IMS(XB+G$krRKesueWU%#u2 zT}>`p&tjfCy?FTN(1}RmWex^dS~Y*8Z8y59teGs_3703P3V_?S^_oi}oEoe=UwR|M zt<%=yHpv&Stwh<}?tsJ~SosUko(bP4_DmNyE}3tk>qKn3%o)<+_3S@uhuU%OrptR`9GD?fJ=A)sLvMs?$2 z=_=iS@wb7W#2CCI+OJw(&e$bQ)-@&766_N%(RQP3 zlScA^= z`IPcW`p4pXm;18F>KPej*vi+*wu;%|mD_)yweq6_wNLF4Vd?=&>TDkTW+7_R;T=H1 zxJn4#M-^R>uvVb34%kZ0pCSYY!3k4n34q+1BS7a;yhUpcfEYN>JfV6qJgz88s~Qxr#@2tcRK{ti?CI$HAw@1WtNMQNUQFjE zM=hHz1u=pj7nU4W<;IJDq2?$Dz+yaCPIc+2w6%T?g-{T;^<3lc3cu-(~`nn>;*}StnM%xqkl_v0L%g;U9nY`JER`Ui4d?!}6}4J{Q3Au(u2}=yfBnbr4S66&?j2-vW6?u`>q%qXsew zg#HL6kbR$q$fI!wlR0Ijr9sH%KpUW!Ic$ca6~z%Dz-z>-+1@pL67%vOT|s3T@f zE3&dguCfX{fXW+94}HO*F1f6)!PnXwOBya{mC&HZqWzsb>sUDe23O6w``VQmVZY5^ zmo{tvlP?R;G#R5h@!!`x|6WJ=i~3Wgs;^Eb7?9W~YDZQmf8dNU22anN@JA9-4!`}6 zHuj z+Z7g>O!(^IL?Eq-?&6XrXC5(#462ZlvOkWBKue%3$jG22?;=OIXuCZ>-9ob0>~0Yy zQ!|q%rTnS;CUqxDt$R`}IRwNYAd)Jlqyf-fV7P@-Y?r%a8CeI~3Zhhbvw3cN7)Q~D z&uC5#CQ8=TXAQ^!@+&Aavs~IUyr>>re z*St1+=SGI9Le~LDX;^DMRJrK&l?+_N^2q@QELFEQ%ZUrv>nFLUJ{-Hr(O1!v^Kb+x zV-wH_knI9BZGwu_R1OkC4CG&7p=SFnZ`j6jqn6jadLOj*)YRR1Y0BKOeNT`~BPEN)XH^2+$AI3r-$#v*&X{AxSuCfOJ=8LEh>?>(9Zt`3 z5~eWshN(2^)eLSz@b_r=iMyUVa+eUv!9*5sUIvu~%H}y09KlavX%whC(@OqtbC7hq ztb<%O)|oFUa^8DzpD>_BEBSEg{+9#SG3N)ew+fBw zO;5(g7_Hd@#GKVaYNe3NHWur${;KY~eju&QbFABid7!pNYoOeXqm|K)Ckh#T-c0R> z;cNfu2Wh;*MN#Xy7wiUh93L(W^RzB=wAs0n;0#apR6wz7PmU{2t7R$uG z(d-Q#*r0vL32jswCIZvyZ6q3%1FHu0)OxeANwyB8R|GFVVTbvv6>D06w@hF&NCN!C+)6gM$c>;~#rwHL3|!xzkEzaN?t5<&} ziuxZh#EWnYMC*AUTnz+*-6%OBY6tu4Uzo64PyNQK3) z1Bx7!YQ2|+2YN^K0joKCBB`fA9E={RnJun6z4LHrxJn%`k3YowXVyOAye15c)&nqM z1Xi<9p3C+Qe_mn~@|w`xL#MHZ?87?&Z@3|+<5T@j9#FL z-CO2~BO!l=>>_a9r-tqA;{ge2;|0_qpr^41;G}RF{5@}i4zImKNy5%J2ae$K2^8H* zE6QV`T)d?FnBD&uoup1w_JDbS>N8{z7TlYGWFiTu6#|QH<5Ap>WZInm{83eu;0XeE zr_9#y=6X&=9ju1bpM9mFiCwq0n8xMRS&L}@AM|?s4j?T|kHwPgG`UOC?Pl9@f>&9@ z1Q&ZJsI+utT#7u`=T{{RQCl-$CT|#!%1|fWDH8Wk8e;R%XY@3y-W*V@dGcu7z zIiArHxuW>~p*9F72FR(UrElV6cli}|K$%>w3iEOp)Yy1BB~u5CBZKPCLkpd~8e-r6 zKBFR&eCkUQFJ7jj(@3}WOnOHvQvL%GwU5oP=v%nF`Ekxmw+bR>Qssvp4S6c~h#|&4 z(X?W_eVL2!&@k%OOKxv?q+A@JR~PXWEVd@Y-;&xm)R&=GhBSHo*BX%dnwA1Be~p`4 z@a_;CUb*&@<~8O4p3|(a>`}@^kec`UaLzkgJVmDXG-Vv=m-1IU#w<6MbcLNRE0ZAS z2pk!?z-85q){-UQ09w=G$gIGCbKR9!_L$=RCpxUC44ej`x0;A<#Z>yy`CX*vQJsGa zeT4|Ye-yADhd_`91KK)FO__)E>znTeoJ75Mxdhf@AUXsH~nUC6NIi@0N5;WF|+DU zZZR_m?)xY+672uER!+2CmamP|@C?YjNTV`Q`zJrp7QSkayl2151p;_95&&OLjB+4L zIXLlD?uRbh07vWv;E&4z5PqkKguPj&gEd#Yz(d=$;Z!5AtwU>@WI>#V__vRni(-<+ zb|M2EM1plW!Qp1$2&-~B2j_xu&`nFE2Q43;+W^14KTvwL(I`R*g8QMCnQXf-lgU*+ zG5w}hA1pXpGAES!E%cMxds}^U=^By-pcZ&}JjTkbc)yXPBw@$ewUjuIDxr}sumrmO z1OvD}CI~Njk(<+BOjLP%vnz*AL7P~5h}$j{widNZ`kIdm7KqE37+v5~{(!y83<)>(BEO6SztUHW0s zQ(lVI&)18}W)T_VxXg)_d|7MFza$NIvgeWg0Rk{xj`oK{$Rc8l+KMy_)(RZ)T6)9C zFZEWq#zuqKovvAb5v%{nx#salY-O-WDg(WJSV>u2T?zFhton5%=^bkXI_*-)Dcj`7 zy8T*)D6EH@*{Aqud%Q-)FWL3x{Dg@P4HopJOmCR;5WDv&W*Nmx_oZcM!$e4I{bwUx z_cXj}oD)|xUv?i?SBso$GbI{u83X@F$S(13c!Ozr4U6V;iaHxtMFujD-Sc%A8*RK+ zc7i`MdZB0UnZT9ofd?w!iL9$%SaZDxgEyQ)da33O#swNDDWFPH&x(zyM{wccTbNt$ zmfL<=e)F#fcyii7 z0-(B`2ZZw_SPz444jlhVZZHW41**7f`&Z5D^>1TIw!9*H?D>L z%?&%6E8M5JTi?#~O}ur+$kf3;e|_tOvEw6QfNEgO{Pn3Qd~LvGedA^EsNx%UCu4o0 z-|WsfAc-mC2j(N3i$L^De`0YE6aw&v!+d@3mfFIBkk0inJSkU1Qy0~q$TobQCDDms zf&lb-F>fVIF(lGW;AfrVPq5nFgCJ!A*1YNc`dimy?C(X}{8ebVaQjMUmdwZ4vppYv z1W7XPWM!p|-IaVNMkFs2vV2D)HSmCA0$xe(OJXNpN!c5^LfJCoK3BdAF@@)WH5vhB zjN=2{xBML3?eU?`ZseXShi2ge??<3V#WWX;3c!Y7XBw1c0GmDlW^sDL6Gep|$^D!$ zwh1BZZ+3sERG`RJ&qHgFHLn}A9mrNmEC3@8=+*J`N_BQ+908lcMM-7(@@qyWv zv;l9|{GxNboYVytLwv+G7a5~xdcLnumxVGH{vP(v-Zv7(X}ixjnYIo$(yx7}EwsL8 zz||iNRA}(0arn28!vYBamgy*THz3GGaT@H;jCKxuKT)$>(0L|IEkQNo{bJCi=DdS~ znSM5RP5*p>eNY33` zJ$W8r2mfcM>`z(lS5Du91NH&meMy4r`r7GQzX#lmqd~RCdYXkMX0^6dm_|T1>}CgU zS)2Gr8qa_)_*j=N^(n^$6?ZEHg3~U=dYogTJT>kI{SASfJc)NeaTNe0Q@bZ~&bPqB z`{m_3{GCUYmK?b8aTHnt6g$TX3O7>SiuLAr--7(hg6l zL9m$A`JFhE#i1`umJsjY zFA1Os+V9;4T!?9jfR=oUv77R??qte@h5b)mw}GZNzOw3jqyx#0K%h(iy)TpED7&ru zH$NkyC~Mcb9@yG)dilR0ezUUbt$W&h92-wfQOee+?qQAt^F@{-ibuQw=n%Yahke`rY4i5}`+8ELNzb+5S>4VB3R z8aVayQ3QEI-d{Db?HMMxN7n1+R+IOv5Bm+L7nYFXHQA8ZsDA0FC0Pa z6dqVBv(6Sj2Di44k7A{5hN(oCI3DtCOFnF6Fz=(E^Ox^#{Lh7SjBy zt?ZGyCv2wDBB*}2u?I|ga5~2ES>sACS!w|tlA~mmEJ;A<-slJqDg<+J0Sj}tEBFm# zw}FbZq~)Rc4nHl(IwT6--m@#y&`JQl*XV8o&LqMf?X7$=eJ$%%CrlAt77vb}Vs8Qi zA|gT-#~x`;+;wOf0UNE8NhhZvf<8WNbM~!e2QB^z9lB9yAi2nbBy)JFC^DIPW%;!p zKD5ft$~PB395T2pSU<1;3T38 zVQD*uZot}FomDU`7aarB=l}B=b{4gRl_PK(+Kr^Bj(~3IEq{6c_jal8yyYZgu^(Jq zl6_E6vaapywY@^ zxIT9CXT$=Jazy>5ej)^l`36ik&vFtM5=~OH=@uq7G7+>7vg+hf?`&MY1zY)j0;XbA zK{()KI0%%BDkD)`n9tG9?A_c#1ev$PA)tq&%@h~;N~OLylFp4HxHpwn`DTg(aph@L zb9tM*r{T21ZQDw_YI<$OBi*p$J5MSfN{D``FGe4yYr>_OOv zbluc(EelE$WmGlzWMQr*aTn5>{(WDwMUt>tz}gl0AJuq~qgaO&rQc9;1I9+l*0Xk* zN(6Nk>BN=>WJboFvAjLIAdsR=c>O$~L(@sxe_kVhz<8%p0^0eAHEe1gewI9*qGrB7 zQ7DF&no<}N3UBQMg&=0ZivUHWDLljv2QM-}Bw3$twkvhLf~XLgAD;^Frd@A;SQ83{ z6~`a{4W3~~5pEWT9CCOoceggn3eQ&iwy~O==K<3ON5zV-{i)*LoFiPA^gka}e6A84 zGi1o`|G!Gl?%_JvLmH}x<1R&gFvrgh5FDP*cA0(d4mj7_T|toWz;5AsBn?5dAHj#BW#O^HRigYUUW&9pa<1H8aumq-Z1ENTS;Da(x zQWQCW{2?V)0ct-nS_wnp^g;i|R1b|H?BF)Q?q=E!oW%Tu(I5Fo;85U64?@h%cP5s> zsNFp`CEb*3RUZ){^*F<^C%MMJnwxm{gF&gu4$5atzo;@c0xMlk38Sk1f(6w#G0Dg@ zHiz#1@ypykjLB%WIbNaC+cI~sP0D|2EQk_FGlw%+&2P-Ov;B9%84%BC{Xi7&iZqo5 zkKT>~zc<*3XuHM5I>wW``;v?0R0kgm=SgY>@H$kZQQW1{0r@*b7lxdihPWTIHDO90 zwM_W7D)TGH^eQ>;@8`-DOUQ*S;8C&!mJ{2y)v23HYmkA}k7c;TDup5d*@5WBG}w=L zz&q2Kv|h2#_>Z5M`VI8)c!<6@IoiXh`ZJv246P})BR5U?;+cI?@7nGjC~_MO>*LQ5 z5sITv(gt-(t@Q|oqrdT}ry2iua;`0g!*DNvucqFSzyp=x8gu!WoqW<4<@!++G>P$* zVFo4?e*B$Si~swsx=j)MD+S{&3bTkq)A8~@P}rWGa*V@h z?rfm~v}w0cp|Z@HGlv(!J2^XxUA_eZ*VF#C+aNL7t~RR&>r<40n9lm6&hN#f6kX(} zifvR>QDqTQP-+UX*TL3k79ubslG6cMBZSUY1Ha2YQE+sW8v*kIOxVco#mMLsUK5=g zmHCpw;`E%oevl?7)L=m7a|$zow)m$&km%c004sOO3bc6%c-t2p`22VU=8);jut@ z9s_PG#K@9h&g&Uq-4@Sm9rfSGF;OnxZZ>WWkZ!5L~fbq3LbRU8wCRilJ! zrN=jZ*JQ^M0SCGh30S{e~Ct;->N1Q&TpDbf;y(f+!9e__Xzs6%*Cede(~f zKz9${CNhtM0icZUpHTQV%)YgP`o7FIEMI)6qA2C||736eFE`t#$GfNx-<4=Kn2(Bo zbfVq(<6S~-;QI*P51~KY8|^RntKiPt}qmiPX=IL8oZJs1MF)E*7U+}p)z1Zk1 zYV&fMy&0?E$kbj%dOJ5OrDP}}tLFpf;VNv?*LV4;EaefA6PHAmHwy zhMD`u-w#oCj*N1_-xc2)fxuGwEM?#_VnqLs=YiR1TFk`Ph+ZBH-Y0DM(ZPh*!D{r& znqKyKoC*cx?vGROBf6NI z#Bf$kjg7Y2_;|+_{m`l$S+>Nl%F^9iEJ`IiA#?9bnp>pFkBbYib2fKzKF%*H@+>R2 zhW1f!3|f_$eW~ttXKxDB0A*@xeU`QrvE+*?Jlt0&zpW=G`UK}h#oktvzzf;#M?P|U z&t#~eYHc}{GREP$g-2WA^IJm$oylx|V=k!R%i7oT9NGJ7&SX_N_(@-yEqeqJ5g#dg z@KBM($HB}rt43`fON*k9BLXogRKqSIp;RS+*)R$ciEO`wxd)GMC9Y_uz{|%yo$^a6 z@B5B82KL?T?6VcF|i3j3Bf-(rOMmLHa$7F$~`?H z@$leV`pZ_j6zx=I?^vu50dotY^sM}m{K?jqEG1Q2ohZ~mnG+GNysR~wF0QAl><7H6 za;Mg!fSREpp8zi{e^ZTK#{Dzto*o&NJ}HvEeQ6P3+iFYFdw3|Rlwtu#HX8IKx{{L% zn8Kz=v1Joo6Bj#Z;%KYr-}h~ky{zcI=+@>4FflGp^C$&P#JnZIYGTDB(bp|lVhe0)#EzCO zfBM7mXL0~xtEW+4r-LoWJYDLuyF6w@7@Tv^OFLjOL5I5Fpi?l+m)l6!I3?e{VPP&e_)5I^)L=Z5xJ)A}Y%daKDc5 z%YFsU`TC#`jd|Rv%abS;$vQVfD~kcf?0 zI-RxK$0{|a3B`Lx)g!Ic+bruv_{PD#{*bVcSwymwQbOwHqW63wR8Mqw02&?YzYS=rGcl6pJ>VS$S~+ZLTQ?g4H9gR{o(@ zS}Ep2&2`fCewhY(g-2`o7DsvR>pgdrcb(NW+hF%|ASCnTI9AFz}-l_A0etD({eK$Tz+@ zJhaTY#iptcrwySbQ=rs>br=DtxtVjC0cWh%$R6tZY%xi2kO^m+2w)T1Uc1780S?~( zZ8paG|JCD?IWy*|b7_zFaT`=!MMBQmv%bl?WIJ*3M!b}r`$O^#cQ&b7iwk6*GzOQ@ z$RFgHZK1(j!gxg+8>X&%mqQ&?+wE^qXA~>5Bz(NADdzbR4(v)=8a{1dvvE{yNqsNW zP}3L;d^#mNNKjssNx?$2)P%ZO!olrn3h^+2x&@llW$WW4Z0&MS27Ss7%w_FkDsWHF zsd8UlOfgX8S%oWncE>h8oqeK`YZzT>=`Uwsua5xL;KfaMUo!l~`Sy7dtl@STLWjg; zUJQgRswj<2!{Jk$!{pNWcvNrHK?tRv$=19IiEzSQgW@3dc#tY2?}&>i{qRo&FbmUj61^ z?ea&3@kBh+)&8$YSl0q5731ivCz=me)dngi86Yd~Yz*+(-W>8^1z!VUa~C$RBjzjZ zKC$@(Jg$ulHiB;o)NH;-L=2MV%FNA*eaMoKJ~1gFfS#VDyea1&6f$$R4u#YA)3q@Q8f=VUQ5%!lTAtuKDS&tcFgS35ODJ!RT{jt_MCSgFua< zA^0AMl?=t=P0lqGOv1Nz+Zl9kh#E=Zlg08ppbQDZo=dv}Ic337A<~&Rg#^1so4R_s z8Y+|xCKBYDe~`UcMd>30jC@uGV%@8n5kjup_vE{y>j2imM5SYq*l`^;x%dnQBAjN# zLsv5+V8{_|a>Th#o{mXoigqjr`YeMBTC5Fq@1AQ}?I_5Ke!xe-5>|G}DdW(_gsz{< ztaHmtcYSpiMj%z;^V9u$*iA$sDSw@eCnb zUO|97DTw+mf0htuC|PU>Za&h#__=RxUFe-*hcrs7k?a0Rx?X8nXW}Tn+^4SrElhR} z=lKhs0Ud=&Y~>X9xRzwEJ$q6U|FAp;h%^Qhv<+uJV8{N(f>2?he8Js=){?K5)FtK! zHL58?*yo!)qY#%y@RompmKP;HJWI&Vkx-_5Yr#Wgx&0ndY-NKqO^)T(XP#7N+H<-g zZ((Da9r2cLPK;kA3k#CZXNLQRjj%f~)~=A_hW$Wwo?Jd)k869>a+@ z`^T*x0#WfSXy9C^3KPmS6tSMNyA&u7^B*50nQjGtocRc+=n5>Jfh72|+}e&wW? zIvuPqDLYimOgVfLl?j3coRFjQOof;Fx`dJc3(#H=;;|7@vsIQL(q2#tP-m4@;6cbls|df<-b}xb!+if>u61>ZyK+M3WLg#BWXZMy|u+i*yJIi2K z^VuxVsYFMB_XnvbmsBe&G9}Wed@MHguobftK7Lj%o!70B67FF&A<#Q2(ts&|W4XwJ zeJRj5J~y|doJECY*wM!y#CV?7p)pjQ+S|j*Q50RrR#sV69MNi3R_^pOI$D&CtGe(_ zL}xTg05?ka%B@q`shZu}apgvd1X7Srq1brafU% zfkW?$p@hGJ9sMA|A&~G$!keNAcogDy>F;WtJ&d%>;5Ukh9V)+?#n|%?UWRt^`l+7j z4FqTc#cd9~xCFZji2=8ObeU(B*{{B_r*wqY<1gULhK*{`Ha7t-EQSi>RCG-+d66bv zi^t-*gCe>o(X%^8d%$xfl?XFli+5<%`crV#MvLs}BG2(C?J!((yT>g4Xf@{PqKy+- zj;$P%9!a%v!Sc9A^q9(LRhzJtkSAZ1u~^B5)bj{2#4~J~bf-qJyk*|Fdg3K>2d5eU3nI_%+hwvVbe?plrsD z3(>#{xTNFV0yFb^p zY1+RMdYy~=>UWrZ{Lftu9AU<6W6Pr0XMl>4t%d+97BJa+1-K5AP+D{NhM%AQpaP9d zB1dPb+<(Xxr2{rtrm!P;StU7!_p*7eto7Jf;mAimp?$pLY!Z-4s<|LeY-P^5S%RO_ zrV*tkVG*GPgy?cM9F%!1ecdiKIqy*(Y#qLY_4d%6*dFKRgC#AEMs}o*EO%}+%pFN6 zyE??$ogZ<3+XTLk;vVXg%QDNxOZfhlt`t(_Df?-+jaSrZPqAw#k&#M@e{) zgL}C^LT;Y0n}hxMaR?p);g@VKNnJlJy!&%hhs*IKu zYHO$CqFfW^;xMOQ><%dqQFt)a;GxN7Ir zDYrQ;`22uMFVu`D-A3nTQ^&-8eYwy7>y75&zRiN{&5$GUWo| zSIREX1(N8q?fa;vsdbm%Sb=FbZMsuroTu`x3M@pv;(GG44}nu zO+A-iqCW4k3?=xxYXoMb6neNKT7&8Iq6dy9=COUAwzwpArSzO}sHYE8Cy(zAHei{xzQN48rda3z9Wd zt$)fLytE2)E9<7riDZv_X;tw|(P4#OB9HKu~$5jE8bE<58*^q;l71X>C~;2D@=jR)e=GHJw=J11`-<5eCwx zanUrc14&y)?MBH-YF3;k&|kGCP6?(?s(ou2hp0CvmtVnIVaOSu>=6JjG6sZ%wO-OI zRafF>%+N>qhs0sBF%1K2hmkmNWkKFfvk4O$P6yU#*C z%cN%yWStM9KBd*Qp&^x7{9>XC@lFQCT^=_fFRNX5&BtCZ+kw)rJAwB@H`ZORt2f+% zcS6T^0lPF)fj;ibkO#Q?3o8MHnigFDQkDl+G(xW1+isxepC>ZbGJ8cYZqVp7w|SEM!Qb3v6?0Z)Xq zq;LkMy6rge{#@^T{osDOQH3RLvIO6UD{MxJaG1aoY2WO$SzP`^jo>asIAvPr@q5tG zbx*5mQ-ih{CdZBy|EpY^Y;V!l)aUELzdw^oya^G^Ec~MHw|V+Ix;rTI1}8k(s;dik zP83Gjx%1BQ{UTER*oIk)>hcxJSW1iBB#94G)aY{9N7xI$%S1HhW3X{>nBTL`Bl5`k z(AeW68j{IUDm2XJ=hrESq<&W8c+}@ZfYs36@@IN2{zz}3-0L6H;8C95P(xpC^W^HX2Cd!2C~L>z(MDn zr{lBCSDCQT{&}NPlk>NTcq0*XYoeT0dkyekHDvKin`FLZi8&Vj|E(B=gYWR`B=IB5 zvze``7er(JK9ie&=({f3yy_-S4{73#op}HsJqXG5%Vn6BcB-wNT{M#p0t5o6+d3OY zEBtjz!?(7oBuBDOtx8TWXnulZH_TWRaJ3eXe$DznT)b>-=1Kjl3{-l3Fn+>$&X9VM zc-VZ|Be@BDQteWGeWZE){2&x~iTR-2^;h*s==D#RBF+8l360@uE(PWvek$_9fSXa% zlg6TtDD)>Qk0piN?+od8=lDeB{Gkn5{d=rG2H6vm9NKFzUI(mDD^9O7tt^N8s5OHq zJ5`vxn2Y3sU_8s#t+b~=-Uyt9;snm;GyZ`&j<|E1H_WOyJJDqIdOLS~vy(1pNUa4Hj=rql;1|33 z$kz1UAXRO3CamjgI=tNi)?lqFCk1gy_9m|)H4v=;hk@8UFcE z>e2t9>*a>zhU9hkV#fGs`eM4vJogbd@Rs@J;^io3y6Z{4OSfG zvfHd*1;{YsF|i_;&GLtTMvJ7S>;Fs}AWGLaD$u=Y%NxV+QUR;L=K$E^bzzD%CDqJe zQIU8$3<Qho&o1#~CS{i3s-Cm(U*&c?4;%2hC=9368<9-O5~4Rr)i9(pz#q7=3QutYH8*14+AnK& zKpuRO5SLAbHvBa^I}BD$rtF5FD<)1qm31&tNFE`KImXD|{QuafQqR}N$d8v$g>od`|Cx{3;y$F;I%yPy(ipb z5tPHsp`wp{b-(F&Md;de;M38b2RtK& z``^eh*LvF1p^qt_x}CKkLRjX@IN$KV3%0nz!3G+Y^$gb4z|1&VdPda>wZG8ysV^y? zT}WL({;o+2RhpR@vxqoFQaDM)OO>tee~CGbo?n;RCTmz``JL}C&d<)rCeHf>F`2;N z#7xM9h&4mhUM3)~`S>093}ui;t~bM}T=!h{JWo5ewzBrxyxV=1sBUAC!2g#PuGc+7po0R0E5eUfh=<0_j77!gVPBqV5 z7&+RBV&t3QAJRn8`p`%mKl2Ij2aBW1X@T{AWEfeBnaFv5y{gmCY#XPkHNUI(@DRH_ z+di49offI$Lt340b?t*pT`9)5dyKE0phN-BPMh-R-eotHU03XRRGzwT?ExG2)T^#a zj`~h#lsE!Ly=IBtY{f+~;4Q+!KDOIir1MKL zj+Re?s8jN$$H^KIQxOwdbF8?)87z=nOj=v29FmZT&d%U~L**!2Qf33zlOca(EHt$< ziHfek>Rm;m=A77hc|vkh{=0kdPUu|a?^Zn@{k@wlrEw+|{c!Bo@e@m@em4DBR$pKx z$L?#JKiTWW`sscA>f+VkLd+Hsf!L9x-!>dv@}4qmGH9$SO)681c^Bms=-A5sHYcRA zvcJ$oeGbBueEf@WZpf)v+kfaI6zh)v79KvXqpEn%WRPg_x#`@gF{ivX1)GB^)8yg+ z9#ADmb1$Amdwi%dGL*O8J-U5!aBsi2^dKA|7!bJ7I9qWhTn;}}O@BC=f``6mH&UyJ zB4#amt^|cJj@1f4jHL4}#on=C#>i?Ih`u%deB{F~bUm0rj87F`vcwSfZqO}*TIUe8 zDehd&hT&~~K0Yyicy3?Cz~ae-rtt=(jfbP|Vn89cCQ*h$o|HUYRz;oQ(_;!p<0E?vbMDql}CW=o1iAA17lWXD~3gQho^O||I|XIAB2LGYzl z{k3n+b+I9PrxU6T zFoU`#-D~;zmN~pKLs17?+DV!ByHU2?KDb#g=iHwswUepZ#HsOo?V&~)j|KzQ96N>n zj#6J}NZ#Pcj`W}x%`FUO!xd>1jR)yPqtCQ@7E`J3q>gfaG`g5GHN!q?+37|WL27kS zz(Ez(GOlW&O1B}Y>FON$>EDay)6ld1ec$i$`;!yzHG0Yk&*p*% zqd;giD#zcyd3hDMaw3QWsq8|GL2Uwywr@u^CHr?~L z14;vICC*%XGaLy_1mJArFf=qh+#mQ0YW!oeFDDMO{Uk=BievrsQa-sjB7$bbJQV+I zSBx6LLL4BE`r?>6AJTJ1dWx`3RkKpWE}ZW2BdBJWFf4+ZHsQA&Hd;hrHytGodf#@< z2c+;Yf=ih#`2_RRquzWoJXxAy{OLq@v9Qa*h24Lyr&k7kA!sQtH{=qgmb)12it^Ap zY%X^$O@_TZmbb|BRG&ahQ!rZ_`nAzFmN)Psdg<|)mDnv(D>2;1YyNHG@zp=9u5Ku^ zR{ucmw+DFx+Wqmn^mThle(`-#(h1}j3uDGC_|nAxwb**-%BF~B5mg`L)lR-XfGqsu zdsu~RFj@m6*uF$oP66Y)n5Ws0r@G9flY{v{(ZJ6dWj`821+&L0swK`^Oy9x*^!NGg z_@E|JQ-bZ&0%KQ?Gta1KlT)i6xzOdS$~BF%qSR=FYD4Cs9J77Ic+KPDU|q$$9VzDTV3lt|8Mi8#u4e3Oo%Z~ z;JY{wiSk#BKmnOCboy^D7Uvg2ymurf=Z4@r1h;?fJKg2E=8MY>cFQM&kvk#c8dRJ^ z_z&rzhw{bo0dy@b;+lr0@U#?(=Gvg&c=LR9;pq{q$(q=Cc}_^29*8BZWzsV4%r_bu zE({XL#gC$wSG}xjY2>|s6RFo|r`B_*dzdjl-{eWkC1mVf@3ZX%w78H<8A!%nR82zu zy*wZUpHsfLA0oUYf$uhHHoF5QT4SXo+GDx3xy&q`D3hp$T))whQxjtAV{#wa>B$%_ zld>tGB&5y`1|wE*LYa~Uu#mHTm1Rm=sZVW8P&nx^TOG#)QiS-MLtq{B99f2@+h+)T z^2|^X5rUI7lfz?VR9r!S1-QBb^QMU!-NkcziJkibcZZdff$4G7s%+F8`UyuO*E7;k z%2&zw`Iqv}ih9J=VLVdl4>2K9&+RYL_>?P8xZy7JPITLe!b<2SP%*+m!)3CYl^k^K76#l%bT$E?TvKo!K5Y!H# zuQz|R2K#ek;5wH4uyC0kF3I43|AKsWpCG9|!shC!H#F_g~DvY3Jf#>bqG7J$` z+o<1GV#Z$P?3TacB$iqgvBU-jXt`M7(OI?5-zA@0izzglpK1xN{I!=MhmT2NTdvt| zgc6u$G3hujYK~QMO4SiV?18Nq)U3Hhc&ay6xk=b#`rqqI@4hPJCZ;2Y=GpZ!KUtfx zWj*Fo|2};Cg9=k!61ttAMeXsN1@+8Afs_9|^w&KmDD?^ls`$+}@#kIt+A8>tX>4Hj z_2U)g&OJTk6g0Gt_qNaYU6hDv7{1wg=%-sc`-A9L-mwmB_emakR?a=sxNy3v_LfVL z10B0EHZ{FZVMirsUs~IG2UjpW!^kL5Nl4R{@%AcOB#YdlMH3R|!=j_9lZp80*f}wI z5~)D*)6&=-P4%)JEka^(t4X1hdrQM>>!17Xzj$KB9}ZrIDG#_7h(hkyLlTtM}V40^-75Q9Vu6 zgjPScYK(=?I1TfPZ85xcu|FuXN`KNLnhI|>UJVaWi_h67E zs)e<*kkx%~0vM}ML_;!S#LguAzf@Kmh?|)HhQp*7N-ffWUDG4r4Z#h)-@T`IJC_VL zc-8c}=sqlPqukSy-&^v>a&st~b8g&=QU#Mz6)3*CR573SY=Mv>-fyXWA!H_p)N zG%py$y)7}ZiW@#1)>8K=^H}(6%CwQ6n-8V2A+)c)@becRr#Hq~Ir~n5-mYbrg2hP!uf-a=vvM&aquVw`s37E5ST3okpAoMrFRjF3 zQ%L$GZU)@wjs3>M-(T_Wu(fb{cG5Ch{$5#Kk*43aZTgI(y^#)6UMr!r-yZO(tFzU@ z7ro6eex)$g45LVkiNTVS))I~6aT@)e+g}-|&v$amm1}-_{9*)Ed;yPj;J8;08KB`p z^6ZQB{uO?_hhj?fGxDCvg+U44lhPf$RClkPf|+d;?kYc5t+k455VDtZ4qZHS<7xND z&GJORuIt|P&jy}t7@gNN)rG}&AXc0$&6Od$-;C$wnMWgHtRyfp*xKMl5%SZrGR0=C zzB4JRjxQR;;E2W9x-G@WfiyFrwBWa*@)dmH7m8D5$>CI*iIkL%!@Ju}sTUuc-luUk z>IU|PzGjj`m|vi6u-Hpv`Qc^csp9?aZ^ipb)WxgKoVDISe;6#X^boRodhWC5}9^+72EmKK6xd-r9R~>n_@snMEIzus$&s3@*t? zk@hr^FTG0(M0$gQYI%Q(ONwyGL_9tyjL3d6qtVz)HnFwAQWZn(M?%UM6eEzBCxY5I zbr?Z zIIF_pojDKQEtsfGooh-%cc~`@!48|3l#qP)%|Yz05P-!|!z;9ttC5^BP?==jVrDrk}UA zcsLDtMV7tFjP>XE2J9e+K0*S4=`f-o60g2jbUDdlPq67k;=G0VzW5TC8gc4;es{TP z^Rj=1M`}_ew?R7^WQH zFKk-y^^%k_I!@k1gTqgTeoH0+a)TYl2R}V8g;W(lSL1~nR@=y~Jt+5amh{@rC*jBE zK1njm;gQ;%F}o?P>7ddkoOVaYL`urA??1mZ5R#a*HsT+min@6GM7={ZiAT4JSB>9J znitO`>kmDK?-j`qr5PgVT_thA}59+pF}moxQO zzBs})u!2Sib=9@yEjpOpzV>d$uSZ`yYzUb~xr3>>fRmbQdbu0L9vr}<%toDQBJp8^0JjLOj5)9fO z6a78$M=$Tt-z7VEi{`l9?gG^xXNO|$D_3`h!RFC;n7@H!#-6EowELAEum5o6`p#O# zc=b?H;s&bFs|!e8}bQ>_6vtUsLBBvnMe@=K0ea)bVzuJz>>z#B7DQT z-X1{^uWL|iE8S0^!nG(z`}X%{N@Ki_GSDK<^qh_&QC~cKa&p{-g0|BjeIGQ`Jy@g* z!^Zpd2T3$!U5+@So$+aC)cfh*AoA1I!*pzgP46Ns1p3QmoH$gD%2rm#{{!NSYEF5`v*OyW=uUGwF#7&_NmOiTo>h;T+t|n! z?;>=~5!K7N%9$N_mwoS1T_rR+5OE<{;Bh|Th?E?yO=UhmsrYgDHLRHN%aV?cZ( za#96*haG_uRdh7fK_hPBd3M<~WSyZ?lrPpA>n7|GH4Jvz!PzpW9-7j*+afThP-8#1 zyr4J6pKN|B-0|ZUh2t)}|K_V`CdZh}EuGZ;8$b6(0lM;BxRGbxrTSFua;Ma=xj%JG zZMRXglSSd6z}&I%;P9h%%Q8bzYFn&q;)Z2hq2`YfU^z*x99fK|?;JMU0(P5PS8zPhL^;*NoK`%GC=ExC3kY zJ`GG5N8_UlD0K|&+meF&l#0+@=D0e~1}Dygd|6}gxyS(ysvADg95)SvKGFc@0kxrO z>!E!|F-v0vLrI~I(b!R+`Q%Sd0g>}r#HG#F*A?%_0MjIaZ*yejZ8vp6%S$mo%w}|>lq{7 z@F<&%vMhJ{Pgxr*HBoCJ8tTb z5>E+=8B~Bf5YsHCxj9VETX(Y55tCc*Px8}C5$w^$fu%XWWoH$_qAIi(K_z2pMo2zu zKCPJ$GJQ>{L^(d7VM$$7j=|&60B3F~LdrJU4>m=4z~lveVTf5B7uD1aTV8SFnA6@> zn&sgTSlqQk4gR*};gw5;E8lwcrH&>?Iese!hAy*C*r_KR&W-Md<&`sYC7&dVBr3D5 zhUtXOzia1(IMJwKR@I4AY!?kOG>-lUKw)hwfgmUB_vMO59#*+5Ojy|y?p#ntu=YY*x$pzBu+{_U8%dW8US zu!wUESZZ=a6yj|**2~PWilwWm`Oe@s?E1OV&!H0GOcpf6ZdjM@k*lb@m&*6=7ifs; z(3 z!ft-9oa_72u~B$4!gip5=}kpFy2PcWAor2389t;kg?;ST0Z7|OZ!9=&zAok)T4+Im z1V;sjiIpunA3KH32|2Kf#N?XG4nu-F^EkCvm6Z)qcg((n7{)Yz{Mb1=qNScez5iWG z=d}IAiLf5J%p)$s7h6myIR5bM`mabti|&6HE#w2@%f10QKd%@5&io<&03U>$@!0KO z^~IOZ1Kv)fDTV>##M|6hTgwJQk{QRnNw%$-6y1xzX7ATEW!6XK{Jd>HZo#@l1mf~m z^a$U-?;V;W6s@aUQl)vB*?A*O%ZX^oC~$;#qoXYG86m5-kRD5?QUYSM%1wcgDF8pQ zHi2(N2+{hm6bw3Si59W;a#Hv~|9!@2Tpo7NbVopqK28n+l$$6tKpUbauX}@N|+jG3oQKOGgd>?To zWxVZ^s5QL6x#Ip@dLiWJaNDp31}tI*vlb9Kq6p8?uWy53&$ot5`Sb!P3Lhc}4Qo|* zazBS4ycA>I-uPZc<-T6M<35jX+J1lGYT!^gU}jEs5JzNQ^rM&SRDnlXL{mHB^U&y# zr%0;;B$1d3#n{VdQ|VjYAh=mI;*tp){TMMpG&iW@(E^6wmeuBkDSlUhvVNdU0ZW7} zI{JK}8SBvatkRv#{!4GH)?xWt-v_&^N0OCC2TDqt3HLoM^RgY};?o;5UEgJ4;pD&k z-5tKb{ml2d5b8@U`1_$Kv31^7OB!lEv`g;|jnNMk!Ev__BIyIke?71pLq8fIo^ELuu!DXAUw}n+Us@oP_Lu3QG za|1e`j+9yjU)`Kxb#~T7RsSG45;=NE8~X3-uIF-$|J?+1&kAC=z^_ zEioB-%wuq7JESIuj*&03ZElZ_NW@5qM=+HATa1>o7PpK|^oFnQnnMMo_dCSY!bw@G z3vm&-cg(7hnVntJY?7VaVRvsrU+D1vW9l5k;|#mC-PpF(*tXR)Xc}X}X_Cg6n2ph} zv5f{3W1_~k-PpFfXTSUXj^q0?f1dgI+|Rn#wXSnrV}^=@4)sU+tVp_GLW+OC#B=`f z+r?0DJJL_#ZJDC3F&os-z;-`v zn*z)vMHbjEKSr+MQ>=?){CwD3BSBAiCOmw|O5L|dpD)OYXmqr7I3C?+>cI9~U%(|b z$bibr3?ZHvm-}ML(t4DIIZXuzgulDGMpdD#>T^;;F_@iES0)A{V=DOB;ji!}PG{yu zCd|O9ET-(7UXcQ99BC^Xw>O*wvvd8$G7bl21^7khLX&gwTGn(Fe-G~6BLalH&<|pD zw_N>%El-FykUcO6(u!4P?;?+BZ*_MIe={LLBBzn>X|c)3q_mZAczBSg=_-(g<@qr| z?RTJ6gq)Z0%w{JGCE|rg3aW)KwbvJhKZPj|n>w}pcaveetC!Kc7sl-ImWNd9uek?J zc&)5ILu2YUk4I{sT`DI4m`0YBu_Yagh!NW8ogA=&pZWrb_u&aK_Z8K*Oh3~G6!t!k zV^s{|J(5w=F1Y%dM*IXoudaAgFtkF*+}%C=|2r>$eq>8tp|p#1p3ged<|@~q!v3Rt z@Z!1U9#`sUi2(?5F<4@tsrhU3Y`hg#uV<_$x;HB}5G9HK*3`UzMaQdmDdconW z>{lg>3~1H4MN4md{fT-_MK!MpY7TIZGUGI~ zVkkv)QOg+K&xrn%viS=TMsx#Cw*IXCgxOw!U#0`HnCF{+!M7& zvq1hdFjMIuQJ$zE7My%BF`IZ)AWzC?S3+`WH#@QGSGa`z^FTWjM|=v*A|Q@XPD(`V z8v3*UGBGP>7r+RC1A6nlmm)jI^1$6)aSo<#o>`ARF+z8Z(UbV97+?R4Nw0%qw`H$qWM`bH-yK^`u4)WHXBs0(o4Fw14qH_(pYP(y^B?N(Tb zL1ZYP$^h0s@{8V6RTRlS2~`!g2cAN!wb1Y2XmVvgIV<(pohALym2wi-nEm=QPLuum z54e{H+Dm67HNTp}_#himTGQ6o$@CU~Yf0}Z@#d>7|tf9BFmn>t% z!}|CL7g4={V;2D3EcWMrMp=Dpe~Cc-Osswh9x&^fC9Z$}mlvjkq?2zG?;D?fw;-db zgB(=<2FtnYAi~07_AE@0GVGUdHCwvvkL7`Z@S3n$F^O0(0~GfY5>75xVPPo}bMuXx z=liiKBQD_YmmSuW`(RABt%2{H=W3YSG+Rfr^CBRVx+9&S_0rj1PqAgi)DBOc#kff# z#Vgk*d1I*!WjNTVS})VIt}PJp`f{d^i9#0%e@kFy_mi%B1T#*Px2ZI zp@5$eEpf2i>G_dcWgb-mDuO9Goy)O1V7a@9a{Lhzj0rDQtetWuzgs>+b_0bW&{H%J~w8X1xN7M9Ze{ts#nc1F7rwk8l$5+AgpTzTb#B?{a$RkT_TXoLA`#8bJj}vW+ zY!UkX)3}VRH>S;DoftO-!SE4Nq_UiXI@h*XJND6T2$!g#obU=w==+Buv};9XKV;qh zDceu63cAKDCFQZ3zRDO|RXBpJnNE!zn9VN+SMiN6$KShYVO*L@U`xr$Yv)!XK(`r| zWUSokIpGsMt_?&*`PFPlg^h|_%b&U`BxN2aXs1HA@+#{ zPzQnQ=E!$Z%heO-0wFTt+gy*bdc5{=woS87+%+L_k?gR@DenRtmwb(3^TBMc<>x6W;h4I2g@- zYAi!T6<~SWXlJw7HAnu8?-o=PUBJ>;gefJXfmr_8rbd8IA-)h#p%uR@Wvt#!GbK;}1weEt?__+?7$`^Z}b!AF@@dsFf^}P~_ z1i``~wW4dIa#ij!Gscc3xyr*waO_I)qN&Q<;Q)LF*gyakh&H>Vt#XX?l9Q#cj+N*) z`}WPJ&n|uqN9xec4@82gJHzDDWZG`)D4F|h`iOeMEd?LX$d#E%p1B^9DOD0=n> zlbpxSJeZs10qHyxQLkGTHBEF!J7OPO^jdscx@QJR7w#*qp|dUY@qAmm@x~yYM(5zf z7wHxsgswEM0`PAnIyz1K;?kYxB`$~9yPXwNBwfi<5hJMP2eimTYgY8W`tD7fJBGgX z{z)(eg&KYFC7+kg;eG!`nQJ>$L4gmwd`>$ z$)cQV+ajlygUNP+)6VQ<#XB6s{obH(T+Dh!G3UqoVHtf{qUQmf5MC=(!!K4?vS@}J z13DFj4t9cUt1zPq7nP@wX?{AipsZSi28^*h`RO^{z!ETb!<}kA&~#!;?Qb7yn5Dp) zgMlna)VrO4?{2xQjJqEjb%ZqjS4v<~$VaVjdz+uqqHgcy%v^ppx^j;E&q*g?(`JlSz=X zj|yFm*a*w@MvmIZyJnnpz_Nx~DC6j;SIP)O!GN@8YBn@IOeA`jAg|exs)4>QpOYDe zNR?l1MW2SV3oRKZd@@#C{nsjzGEm%8c$sEt5Dw?PGXe#3*QVu4Q07wcfJf6y zv*HNddAQx(gfnieBMQgwJ*TBN3;JRvPQQdZrWaeeO$9Wl zx^QJnha9uUWQybWmOuv>`MC^KZmBsr?ZkCA!SQi;_B!-b(;;m4do{H<_+a(y)a>RI zn*W=?Pn{H-Ma9%%2i7X?LyH$>P;EM0(j0nzfkQ-P3mbqUy}Rm)W{udUdpuBKjl{11 z?A;+t)Suicb2+0)$5(7V7>UkEuM#YyDI>P+n~i;H6BF#7QZqdrod1i#m7pPyIzM7P z^W)`e?sWK(qG*1V43#ff0vQ7}oHcMp<1gy|^ZwN0OmIr8$n9-Ie(`Tud3|eQ>vB}F z2WhZc+1Mx9hiTMXUGjccp!h@+#h^Key`$3xa9q}VR_nf&b=v1?OOL8Sw`ppDZh?Rx zgD?FV08<_{z$JJSR0|Pph_=sHn40Ek{*e$v5sl(BVA;gQ-581xI585IEX*CA1HtLX zecl%U1e%8lyLn4CHpJvBnRRH)A8D-q$O(@x16m>ptID1xFNQ8jsDAofVV+yWhF@G{ zR-7M%jRe{a_r_C`olYZ(Nkm{iWE+)tROKEZtKbSKAjF%eCuSM%mFvf0B>$uy!?ZKZ&7O(B{`88NyuwK6K@XA%&+%_F^>^v-`58e#+!f@hwgSb z%L);zDrq|p7VAU6-re36g>(qlHxRpkkn?IBwc>d=aFZSI- z2}EJa{SlpBF5PPn7$fLY7|3nV=6YpwG^g=kOz}u{2$R@cRl)Tmm&Ak&*O*6m}=4pPYXrR}oYqs|QVV z)MvBzU_I0E@(}JZ>wjmZ{WwR_o4$h~6tGRq(Wtd!X(E2EimmXa5m-`+$*(wrLvo14 z3I`hc$!h-3fuM{jO;&Z5wA`CeU4SpJoI8K4552YWv8I+FI;P6ZMrKPu6?hY{I@mUkNMj?X;a`=ZL4+uTa>Y|DZYju1+h5yLoC1-O5xKb8YB`Wi|@>3&UA5G zu?s@D+rc~5Ti+*RWPSW$Ta|ga)s>NLes|j$imNrxnU^==0|o@5csn`@4l~>}c}{7T+bO7F--78~A zS8{a1aKchE=SE)7cmnYUtA%`1ihKi@+4{-UWW?rofjB!%Voz{uoo_7dmg-0{g~uYX z_nYv}J=r@2?4Bcf$puH6TGIpD@VB5E z##yLKOh`?P%8LG2M6UqKrdj}U_^1vi3d)@Gv;SF$ohz;~XSZK>J^f1xa<=uZ1GAHo zxB0_`{I{d^p6U=G)qUQ7#h_*+2FX)JK<1fsrEMP;)P`ry3gKr9f?(mpL!8$!PxZI~ zqKs*2t1^jDlmrON%W5UmhUApS%jXtS`HQj$>pL|Y7a}i3aLXUA(C{1amL(9ra#ivg z(-@>lC(A}8?EaUl76U@zW{n`!_({jfM4Vvk;KVm~fL(Kz`e$Gu_aEvuwAD0%#-7}7 zFpY^uU0unqb-utKaI8uBX)?BV$mW+?jnB8&gD!)r|Cv1^h11XqP+F%iM?^*9d7gK4 z_?kJ|BMJHt$svZ)NiyKDFGGZ8*P@fp-2wE}Z2T$P01&f7bWYz}Kh7E;txN9&Wp|Li z*LW4ZE~FxR6-&w`S0t$+I!`7|lZPv$Jq1&%0VA)_3RPBCnfNeMTG^0_v{ht^YbrD) zpIOj;M5?l^90P$~wXFPD#wa_!60F=Z8&(j-@GW_shJ!Wk%-jbB-KWMe93MToam&Ii z*pri!97QywwTP*~l0J`B5Jwxy+Q&U#-vO$ccVDA3*7ux~Q8tLPalV1hIrS#w8Y61mAej?egr@LRkr_K0ePqC2c35=*eQi!c5!T;wmz&O^g${RurP2DCYQUwVI&Q`;6 z4T9?jb&``^$k+=Cfm>U9NMt(rivuwGI`>ojT)_fneRDkty;kg1;Imr7A3 z<75vVg(7{d7_N@4sW~vT%zoFC9<&)adDT$yR;iYa$I2&_(y!enZxvQ!Il|#B;RQ7m zKge3PA>aQz|3T?@NO^rP?{CQ=0;QIpu2sdnp2aEs-o;xHt*~*kVKi+yiS=80dj)Y} z!gsa;m@*6)x=%ky=x20iFEfudH5H1`;B8o{Eip16MRr^RxGf0$=$MX3q!d)~TwD#4 z^JNzCMMMTd`0UGOCQHE;gE0flvwkk9$MM2>=p-ccV3YD+1*BS9{CP!{VQ?-{0HWZt zwg=PIiR^g1#2?A+xUl2w3Fjx_BTK}5#SA#R8q=Ebp<8vZDho-@C;!w07bONK?0TmU z;@fy`d*#-u;sMHy#BHj@(HD5DgHok zXJ6)cE~7f`jK7;i&B22b4oBy7sE!XSYrcs`j$){5BIE^6&CHH97)zmO2qHtBt>3)Z zMThh9`u-_GHqO)vOpWE^#@~Wtx3iWF)!ENJ#-k_g0rNg0^%g_Y%9#4>R8iCxbxmu3 zN4+Bpg^jMOwygEKWN~@JF18xBjI-)`tC{|y)cu8x;DZPJ6rtp@2a0ApgQ(I$i!ot# zFq{igjbAvEe_P~clN%b6h`?T}H30}v1*vNPDh$RSzTtPdh!YlAANkixaVvC{y-EX7 zhX3Viw>V$|T;=pfoi=$z`_}YMIN&mK$+IAz)J8Xh!sZ2E9keUATg(;TPm>INuc;#E zcJ;nlG0;c~5#C#%*u)ieh)VVo*=W@ zBI&IP_r~)V3UY-fq*LS%Q*{O=)VSP+{YpXUd#LD{pGIQe<8Nu?3Y+ANGqq^P)I}t9 za;rfTWKiJ#l2t7Au@bF0%*o==a?=I`LNU2w5OU*Dvbr$2MXOJ~m z7$-UK@aG?n$-hfQK>HQ)GSoC*a~%|wLy^@^rw&+-0;-BLF;^>+OGESP@Es_TaByin zzj4s8BfXn(Ut&fo=$R8<*GEmI=|&|AD^6tw!1LbTm`HpLZ-WmLg=2KKYJhtvMY_*J0ZCW0O~RJ<^|x6j|z>4n(K$%NXOU(40>5E9tPiYZTD*i=ivJ6p=Vv>sl!CI$~_>C#aoV~D!u zN?M=nS5cyrutfYMdKeb9gw0nnm`~3Ov;JgF%skw$;)X(qQlLCudFccPeh>h47*@Md zL4*9(PoWCeQdsgkp$c9r>+JTHoteT#@yF)O`LPKU9n1-+IX5AlIqC2Xf4wodmps#E zy(O8tIYzzN60dK;KGV2|yxAw&-qZ8TSnZ2D-lluh%*_S5k`OnJk z=^&sh$K(~==GLzgAFFF}4!hRhc!>5AAA1{B122Bmy{XR4C35-`&0O zj1Oh~=&by&W=a(eiK@F!?HMG0X!(P?zabzq=r@jJ7K!HHxl-!(;^;=2KA(ndyQU}L z+z{wn+{>wQO-KiV)A3par^DKIf?N2x!|FRIzE=-PdzT@tMQi2LHz8e<$>-PEbGp)h zGpo-3`JK~oj$m&Go%Pt~LL|rUjwHwbhCqi>LgAv1Rt6U>-{urm-pDY7ad&5=YVvX% z>tCSNWM_9w^2^~du^hmTrNI0bbfEV*XGb2Z+}(XB2hV6x@EZbWHDEbyG8?k6CUZ-G zzv&Btql~))@m~_}gYR>@)*~f+JG)RRIk#t|BuDD%x4r|>^z{+Q)pf#yQY4aGqp7R% zMjBJi=^RErXQ=Be1Qpa_?j|##W-K*-!SQidHh02PymUj3aEgW(m4S!3tS5RGq{kBJ+_Pwk(eZn0;c3!%;6sere==8e~ zWf4UTOTp*LZVO)`H}m5Xe}On7#@_VSVO4q8)39?Tpyfw$a%PM31?wlgha+ z0I|DPxaLkQ`ngGZ?cc7UnBOzfTIW5o?AgvIRMp`6WJW;N+a>`qV(z708sw?BYlG}O zr0uniG&=eV(A$O7ugacD?Tg~Aw27yFdXI`cj0leg*Tk8_w&s0hhYD}mPif+D4 zYTx>1CsRVxGjK6oQdh~G3okyNV|r{(IEgyk=k|TJ;&pK6-x1hy2(5FfBV>$nY4HYC z;)P^@CB~pM+rd7^lnkTfmElL#R-u<=bMe>5b&OB=%csK+vh;pP&f`oTV9Ith#y`^C{_X3Zc#voYzZp zEc8DwQGH2+K!9qbgpI{>5hv2Bqqzmk~XaK?ftWnuDr8$ZoIx zwSeuygq}$ol*Cl`PO$YAeM^UKU&UGbqZxaL4&I;6h)YqmM%4e4Z9DkpS&&_-O~IZ7 zW)>GP5bZJTN@Xu=l#9;AyZj#Y_akG!mCHi{X()V(5MNo0XO!o>-D|d%LD}Cm+F_lUvhJmg}}2$@BIW zg=3@h=R!US{J@^{_!xx%YR%7Vjg{uongAkEO)^#xO#MjE|Ccmxu5n zj3qSG94MXKDBtZ)2IkQgxg^D6^IH{eXP&aebz;am&K_MYp_(zq&iOaNbJe@8#HX*m z9b$2e2m7^LYl>7{`RbZqLn{kN@%b?FEKM;?60=v8O zD0bH&EgegZiPCC891l`<&BXVgBV=Xl1l{pSn;e%vC`B4^O)tu2REw|R!A&I+M0Rhx zM&r2;9J6q5XvHmq-Py3PHlO>Lz_qmPa1?qZc7wf<{$knLc@KUch|~nk^0<)3f1?N` zBnE=sIy`;fSR^|AkeV+x7(Yt(luEu*t@%DyBUYd%PMhV;>P)R0$EbPz)$(xrTmNJmH1Gjf9F zrl?!ek7Z39sBU+Q%nFM`s150gp4#&Hj&rg94g?9vC@6*)01XkIP?b_83DT z0q=^R-nOmc{~e}IEz_YAiK~XRh)~lE5gjFjClC+?vdI{^+mH)ZWhkXGqoAwdkb_-# zHR2O6Q}7w3xcw30l}t{RF`Us}NZfDzKM+D6}DTd8J3P-Jy4U~Dw)r%5oR zg&*q335R$fWdFChR;B~JGHWBY6z&lKpdL%rdKY9?pFdhti{yT?OK${JLRHU1z*r4{ zR>H7Ec?xz0f0prRu{`mUb(KGk`*&bXY}|y zL)@u%+GC};?kTs~GQSvS>nGkKLp7o-9s@;~daC|KHMs?cXE4)NiK{231^!MU1kgmR zwR6Q~>P~JCjQ?zTc!UA3`Tf|?w8GBOK{YZo(Gz*03F~|qP89#{U?=Ntz#&GyX7;IU zW_B*LqpGkAMCHkZzjdXA932^~s0YtNnpx|*g{#A1Jn$5$6ul^DT2w%OgTe3VX@hKH zlGUr5dVuT{QusvUtJ3naJ!9?L=|VZL=wfF1O(lLRu&#s~D&FQ*_PgJgOG$rCr!GZB zK)@JcJ(e+6$_-wJA(4;xsU!;kWPDIeHTPlOP7=TE=7gQD%A~IIg8Np~X9g^ZYwvY9 z97XB>WR1&Ud&3PXAg!kuPrEqlOHYvY9xrSW6OO9DlhsQn?h=P(I$)4R!FgE z=XZq6&f(v1G;&iz)di8#evjZB7HwJsmT z$Zd{Cmgs20##fu2PxhAhSi>Rw;`+_kqY0H~_0KS5)JvF)Mz`c`N8IK~9k*f{qD@jZ zCy1v|TvB@1Bmg!c;0fvU^+-}``|mr-FZ|`d@2~?%MVn?a7xiRt*;pEMLGgrmQDa5l z9X|7O@}{#Y^(Zd9xJG&Ej&< z$-Z6{r0!vG?dxX?edbibf^)|ZNMoK4_qahw`86(wMSuS%CAGlPQo*e3_08RFL`^iZ zGTRebHGQ~!_X*@kB^iJM{2oJ3Cun z*Qh84-iD3WGLO4s5-{2L1oP?nk(ejmhpsUChfig)&W^gX`-Rtp14vURRCZ3c`M`e- zy5~h7xSO0{t{}-=4L8B*F=RoQ@_7wKsL6Z$w_7Q20geGetHRyA^KjkW`LL6IS^!$u zUb-zj+_1bf&m=)UQ|~K22QZ-b>}FJt)>UnB5!ebQT?|JqJW$(uNd`Th59rIRu}K&c zch|GtJifmZ-12Gd&c^9W}3kw=&K2ulyOzh-UhL_Y#HPG`moK*18JY$T4RgwV zXWCjkqi%19!^!*=TT}E=2oX`{?=nS-E1SdtaycoovwilVy?yCJ2~5>(+q(20WyZK& zx`|N&_Y9UAtpvrEdW;O0Ut9pqAk7%f1}!NeOzqI zFq)Sm=-!Oi&use}ClCP_j`@F+cfQko2!nr?QB_9EP+;Jy1$`WYAd5Xb4=BVZCw6nx zt^<^Q5#>R1Fx-5X1}tuDVjx6$czPMT_GHvdqD}UF9Nv`NIAIX>c>HDftMNbG6DDua zGeaTyf^z@*np=}f&3Hc>5VAD+P7-zNW_kUxWn~dfY$8|`ibTuLLTv49HuTw&&N*_e z!N%PiH=GOH!WHoIe??G&>;pEs`w1xn){KzmA8P-lH5>B`O_a~wG^-|Wq|;daVj&|lfl%hGNUO z0GuZfxEJ8!7YywTL{S;fGP5|t0OFB>wIU0Ck?!JawJ@<%$QVoG%*?z{f9_gpFoSEd zUyJAv^^i7EB}k`{Ag&tjH@9NnDn_|6ib=b$?%p;fN*P3Qwzh#^EFE;poq8FbAvXiz zE*^D;LM?Dbe{+9dYk*f_gKwJ;QZJ!f^@fXYT0ERd;?CFl>a9#Rj}}d~60JX{QM=Y;E|0h$em)UD1Q%kKW4-Y$`nvmgcgQKnTv)5S0onO!2u{`=fFI`{WiM(me|fC1x?^MEJCi1%G8>ie5q8Escq@&;|} zW1H}#UZez4l90K>Uh+d8l0#&dwObpTnVT4N{puswtCIGryvtSh`geBa#7a(0+W##U z$lMPTX+Diim!n<;?&zQkNfD2v54w#U$@KJ&W7AlD1INcnuY+aj!PcprToNKH)ida#6dXTA&%e3F$Wl^KhhKE-(D0q zwh;m8fN4b!_P26qBFh(cDts<)z6raV5!7&Sk0&QI8~rHB&I!a|mI2{seK7Vuhg)`6 ze=Gx_V0H2Ec|6d4jqIeKvA);S+migtAy!a0Z*a@F!ah_zFtzz0$mqkpq!(NB0n7W# zU4B6YlBS|y(7QCT{_5Mm({(pj?T6Njf279b+vn%!9DP6FIo0y}*Voxw+S>52oN2nV zQ??C?rra<5?j<~42R#4f2+Ou=y02(V2tVZbOg``MTJkJ@9?IZ7^WI~f)bz;~hHMPD z#9+X?Kr0fjaJtpqi|0R5r*lrpXaxy{1NBk;qhx* zXa(jwmzc;s-Q$|z)HacVU7A`C=iZ?{^0S3j;$vd-BKwHqPUbTinRIbi>cPe80;da1 zwX-F;Y4ErWB$bRr5yH863r*pzp3L2MR+4x!6sWPh@sNq*Rd*-s8@w|J?4TSs+U5oga1GUDw{`W)#P=bCE{VR1&azjdHI4+u_Tedg}wJN;t=QWaJm@ zF$D9I)2Ps3yors@mZwLQ{WWfZMmb$oN%GHd1Zgw}*&vWJ?JA?MgEp#gCAs$PdD%}vq-g2}ywdFn*8l8U+dCt^Qe zUlM%Mf!$sF6fE*S@KK_YAtbHND6_@YQ!o{aRkKud9w6RoxE}MOIzZ#FN4cl7@fB== zvORO}ythlkkt-zEpKp}4)DQ&O3CE?Pkohi0d_~a~|0wS$gQr>Jd|!6AVQ472X?pS_ z9Rd*^qk zCIU^&c0B3pU`MR{p+=c0(8R*BIS0}{sE~fhjIRiUpj_ms1`Dh5O`D$o%dlRM4DOJ> zsLkZp-Z->T(C2+9y^$uPFFzSmBGe*40>@rMg4&MnK=WOi3i~>oCOy}4{VJJak;dZQ zI8}U_jVE70`OUMsG|D>7#NBOeD7GI|b3I!Qmw-c@t@x|n zdiVI*=>cK7_R90=5eU49fFxryVa5sx2?H5(Gg0=@?^L)Kcn7uq;)38<*>0n+Ku)IL zAI|N5`K0}^YBRMIB#J%X(wX4ytRCArI0>p7-E%RzY4JW5>PK>Sa#<&xp@(D&sJB?) zS*$iY8EE8X8P-SrvNzoGA>XpxUXXqk(6Rp9<1R!3CG&&g5D3^IVg#yiZAw7*XY(bglL2( z?oQzV5|B*R!Fwm(9b_Uk@^5da*1pTdbotWKA@cpds22sa{HfN1d!SCp>bs5AHpu4Y zaYSS~ipa=Zxs;l+^$Gn~30(n6rg&cULb~4^UkfVJXZ?Q)Ry9vU%f!e5>V|7_4p@YJ zzA(pu)h$DNP%6i^C_J)Of?)(?$gkMu3}?V!t~jdTMxUEMf2ipy`42vk!L7zdhpNr; zZVm%SA=fWjd*>Nmk9bO)A*A-L({zEUcz)4|fwhcO0x%_zlAc(~W4{gWw)nfQP%Ch* z2&XrV<9jBrLuCd@A-s2Q7%Fo3(BcRX7DBQ!pe607LU3#29;VJ!x{yfrT3-CDus7`fcLOs8ZjrZjW0Q-~O@_PliYFVz0SBi8 zmbiR-x4F4)s3lq{P7cQR_Cjgj-z-t8S!UrWNW{QHd;VUXtxYEm{sPT=F;CC6Z?Gle z2R*XP&i#UNZ6D5 zCkEO5h@0`?O#g{~a%;}r&&3+Q;bVh~w~e{I(`?b)j@iyIX5*AjP#)U zNT*jz@d?qUls$fPI|HN|!yPUhuu2;Rh`680YrLq14DUFcOX%sZn%P*!h8EK=EG#VP zt(rPm2G$0qn?f@aWXUR3DdvuJc#Vu?#MVgOEU04b^i-F(!~xjICKEzK9`e>=9eP8- zH!eo>e*-kTdzCE!63PA67R@J}MoFg|YDcl`Np>4uzqMJ10j){sN((H3>tW;Hs#fI| zN+@=z#FUi0C6Y@&w`h5%*jjNo-9=!tqTD-Wt# zSpEw{S3XzC9TI9qP?+N73xlb(C)ohg?dE+&?TpU2__(DE+wM50r@wMBQqRunlqBG|DDC{NAiCU0S{P`RwDg!I$nViG7BFv=P5K$Av5% z46>;@Gd}~=V*@_0^39}V@}%T|lth!=26o&2UF~~2CWD)#wxGOFqn#X?t|4NBZSQUO zTRQ7yhOlKro*jOoLJaV^@3)FJm!QKpZ6)mP=@2v7G>#vcqV8-rAL|uR7sAlZwl}3! z2&YtuTE>Y*4G{kFA%F@4I$&g$X+(`R>UW3I5@d-hOx5Bae8^}vh(H%;tsXSG^(AX< z@w29Cc&dD9FQ#K}U$Y_qX47644<>a-<6o8Go#*vyztL2{gOvB4dc)DRPn!B!=|Blr zkB{Ny;tIh%z@wEHWyDz0-qhYOJf;ZV+FOP$Q5C z*_y?;NIyhgpIdyLF~fl-{?(;AZ#3IfFwpJTAZ0>-BJyp=|3i5m8G-O>vBe?;DLUc-C6WH4DM;egNRiKWU86iM`udMMb7w?OXD%G zDif4{75Ao%0AnIURdvuS8OP3E)y=Et1F59HPj)zg#oEyDruVaR=QuX8Mb_@h7F?3! zy3BK(1$mlaZuWJC;Frwdu;2B1l0X<+`ijy?tMxUlCJv+V&O1Y4rm59>cV03gcB`W# z{V@ve!1UljuA7qtm9rOuowhquPZ!3pkHuv_GN&3DdG}s>q-FI4e1&Y`(N;@TH>bAK zzg2%Jc6}h7pj;jb-7#!oifGH~{K-nvM(@*-0`0(-U!LygX!u74p(#VfXIt*)Upcau zCb#%UA6u0fd*EOrV^paPF3D;0Zm^diOt#o?Z?+u|u{jfI`kCc)7Okx-7joTz7>$pP zG`eK_<%PZu-}Ly`%Rf}xXn~7SMF~8gSH3gTc?Joi;mNAF?Ve-`6uZ57H`u9%6UH1* zwNIDw*gkIt3;6c)ls45z*ce|tcy+@+oh!aq< zYur$wMzBn?4j&Nx0aG<6!DRtYVktqo7~3T7m<6bfI#?7I!YHpV#xk}`2D2WzgT%C6 zA6yx8A{^fu5~FEZ=Xpq6a!1k^!rA%FwbU40^<3ePz}X=|cGu#W2v_kxDIL|^Uc~OD z)+c2>UPqMQv-=~NDW*GuD_-o_V^tY^!R)*TwE^9@Ji3)M0plWSY-)SEzqC*Vs&oa# z07CwsoSappw8kXQ0|x&{c24dnA1M9pOtzK{OT=D7#InUYRV8<-aqS)-CX)Q?B-6Vc zL3rDwWb;MEoEFF4JVGggo`YGMYcb`=6miy?A9r)@p!%idcbll%-zW?t(?i5`aCFfa z(cHW|L}U6u2fNtLrr7o^!LEs+_?*bA${gY3*ACH^c>fTx(wRpENEp5Fnn?CwHmELo?p6%!1E1kLtVk^!&yyQAWp$tt)`QMv?uYJHY2yvK z-BEukL<6VGP%5*;g57xcYyJ0qbw=EjlR;=<(U#qt(`=MHVFAah)`vLqB zS`dK>g*aeupORgUSbCKvV=ZXl8zy^}(td_~(z)JvI$WkufNMpU9g^-WyiHIGS^CTF zgX#Y;^_4+!Ma$N>yE_DT21#%ykl^kbf;)q|26uON4-y7<*Wm7hyKBC=_q|v3Rh_D- z+Nb8vsl9i1uU@^D=pSeJQk4CD4{q?3N14bi=G z|B1hf*TF>NGWKng)vV3+jL22i_3s)wI?73<8gOzwMCH=Oi^w45I?;MU;U#CIhLTI* zKd4!ADvc*1Fw;u&zoii`Dq{E2D(D}1yf@~=JHe3%M401w7ye{qz0yoBgVUAy{S`gm zw>_2_93)YwG2!_HpR`Q=AT$pwMlO6sY4bB#+&+4ej;&1Ru$+u@}2ebVc&W5+m{*pAG zV4A*M#Sy$l$IZwd8)48^?;PD@vWm7ioj&=ZbF2N??n@MdyvfS`ar5TueIvLLILn2> zW+b_qiEeF`e4~)XsNeqUN8o-&ry$5^>FT_~HaACfeCuL;XErqI=h^b4a<5Hm zmT2yxAzwz@t|d4!s)jeWR{ZH%3I)6y5v_n@Op8T=t01NgD7Zl&!>5$|=_43Kz2}r- zV{xz@)DVh~Kwo-9N?dWkg@%R>2mK2MPEtNbz8=6iJijb2T(+c(YFe|{nw~ZL`AZ}n z?y#!cJ`^VNxQFvjv@v_$ZBPrUC$WC2eo~x6t}G#52~dzB#$hhj`F_T5>U>lBV5%m2 z?N8P%BD@t0`|DJ4qA-SJ?+zP9Z0zkjx_?X>ex^PfTG;|A;UrbC>0;(0NH z7>Qmlhc!lZ9=H2)8d zEl{83Gi3o?{+t%z(UW|FlsUaBtX)x!ER(mVdUN>5_Xb;2p{h;tP9f54cgcuL;flws zSj@hhD~SGygg0>%SB6``k2iUvX6)`5Pdtw+w6Z!bOV~-Mkv=wQSXwKl`W*vIzj!t% zAWa=m8>?IVl!o15@~_0^(62Z9=YIayH}yPG3&h~frs_xeQ=sFM7^oVxcv0nf^D|&h^ef5 z+rLxJ41Q;mM-enyjQ)ibF}?UK2e02!*$%^n7$gmiK28qyzen=c;_sjBYP$W}zU2|s z@9LYoB?KiWP3PjD63FB@045w#gjg3Eo3o2aQ zCM1ZpFoqKO6nNu=L;+pE=L!E~?<^vthDMrTk%;MZe_{f_$vrqQPh@H;85l%?0E6ah z5Yd${N!-BABVi&h zzwSU9Q_MfN7{ID+zJs85(4Gu7?!L?qTQnvn@(2aXICo<>2*qi+-DCG?H!vqyt>$ra z?60b$ZFt1M@<2Jl(dMB3WRqr*k*U;$!AxfqC0?X7>u`tcF@=Vf#nheL05tM>efum+mGJgQof4rGj?ePN z>IAx(DTKgFcHPPM9=OBZ!d(Vxyw`RX;m8iWa`Wo|m1e8Lp`i#-=r-$lCh||o4~9jX zEe|C8Pb|_%NApNWzp9S^am@a2rNS|s4Fkd)THhrxp!tA15`okwgv@F+QQBuf?5L5id2Z%OMDB4f{{uZ$b*F+R{Hfx3EjRl2D( z7Ew?RlgzQGtG~5si(FpqQCjR7es`PJg#I~7%DuURmAcwF#cGDm?J%Dt6Y1K5*oa`P%4Y&-qbSH5-xtAcU| z+yAJv`D5ZEJ~+8;*-u@pd_AZoPqtg5F4t4q)P;AbVv0Z2Y;$cCYB9)dRP)_DCSMy# zvB~IiNgzv8YjTPavdCE-Eif*E^4!4TXD@MCW1hO)8i~Ob1SNGEZM%hM9f!d=$?Wez zLIy$40U5Y!U;N_J1(<9*YeF~(B)mScI{m(jt3NK>7dUA{wEl+>+K{5SNvTxtaWiCu zl91gHI*4ECEL*s~*}Yf4*2?a2bA28URSlP)#8emELh`+G7NpC$)P?}o{rCI10E`g6 zm1$nnmrbzxGI?O5XI#64qjwHo{$m+!kc6PkTN~w>Gz~~0l8Yvh6Cs>H-e)CQP;qb6 zMcyRK;vF!kLS|ekiah457xTUU)SW*4Q2{(E)-Aff zHpf<#7*)ZviMA6<^sbMPbn415rYE5hPH0%9Z=Y{i0?H!j|49NKyf9eQ3H|4O0~E zrmm2550W%(Xax3dt>tkBBP2EZ^G?_091ae0<)ZB8rkdRp^W+Sd5L<&1hY$FJ1mRtY zg&1WI{ZvTYZ{n)H{+Om*`}*9)20@0Tu4^lQfIQb0QRf#Oe+&xzUPO^{BQLfbrckt7 zk)EB(NwnLy(~`=@VhHZDE@5Y!KQjeOn9Jww=i1(4XojZnOhl4@6kV<^U2 zE*1Xd#3V)UO3&4RThMTRg&e64UF|Yc@8mMLzDhyE&4LyU3HUgS^?-SePX$#=vhX>7 z&1H|(^Q-DuSC_sTiCM6>Hga+G7B^$G{Gyi{Y0d?B5P2^;(7w)KPaPgQJysiE*z#jC z%X+9AvM#m8Ta-Ktv5g)0*$eRQ-x~_J1>C~4%UPl1Vye(Cee$0pi9FDz4%e)en@zpP zvm?kKZBSP>=(0gI6XdO$9^Goqj6R6^E@#kFu^`8kU}M-|+8N*w+~Waj@o2xj+sg(4 zv6A$Ny)}wAL|wzZ%VM3B;{Q=`BZAU=1J-n2pS}R|P(TjO@SZpA zDo#EesAWopdczn}A-`rpr-Uvag@hu3I}kGY?h!aRIErx5O_3-oeZlKe0e&FWyfhs( z^Irt$WELbklpWNRX`%&FF}0Vh}JkawCBePeaW+AH5c`?ILvXfum-XntRB zqlst}5js%)ojjVvFVe)fq)Xo*P@jC_)GtVK4#8t|=>-MFK=(_Z{1g+`9q-&;)CiUI zO9|ik#RlxFmtglhiaC#hBZ(aKqr5qlkEOb{hv;a{cK)H zwkn{tGG~cWq3T1+^g_MG}*`5R$O-YGPs<2{d1hv@BG4I$pEZrA#3oqIl@DI;@8dd*~+) zCC%~s_?HHxS-=w?K&lm?f)@s^byQlKns>b%2Q- zuH_sE75iKe83Hj8rbvCu!f3Ku%2_Vv*w1vO5@OEHk4NfAaWiDk)z%R-{`upRGPjgo zerZh=o5P2LO&0O7u_bFgw`yTrK}14ZsiKk=CUU*yKsjdAXlMTL-GYvybRmL#L z(U#Hz^St<`$4&8aP4+pLEqVN&eXAK%d5~HxrP=|64Gn4uvI_#oRKX3hFs0e}X)+x; z8wZ!$@a|Vdl{1k;O3bw_xB4eZlw#FAU-Hm?p!qzY%m`^J_oLMle*5eqxF$GCY_f3C z+u_Gg)_m^1vz!Ee*kDnLjJdg2y9tfB<%RW0>+<_Z zGv>-x#YjvG@fGaaV5LbIMeoXKeZ_>}Dl$|kZct6S&|leW!N*g<0rf`autDGY$37(I z@32PC;Y>BONlU2@HulI7MNT@`olR+Hj-p1X216YAC!(aH9(z^SWNZO57e(R}(lR0U zdC^a0r9&g@%MhzeN40BB;AFOs$gz8=F2j7fbIs!1p1FAs#<}fO~rQRxf&Wo z4F!;D%{vxpiT^@1D8>da1R>O}`NU%+R7*qWWh-j=$6R zJa^9aV;aK{*`cTS;Q4mQjv_5uMa8cr(*xJ01 zpiN_OT1Rhro6*R@{-@%2Dch_=O>kq5FfwNY+6iv}yz|DR-Ky+&U4*UFQP;Gkho;}z zmn?D~Dmtw7EQzOC)1A9yy{ZUX$kh~D;3`sedoab`-%(%Z8h0m^+Q$+a@A3z5o2|{l+KISLK(OV9c#m*h-fRXO5ac zdApYP!--6X*pw)(>|l1gQoVre8TcTss8KLg^9!VhVrps{m{!}Sd65@C_u6lzX_kB! z2Pn%{v!2jc%1~QcARb#H`aG-+u&8ea8`o-hI&Zk};xXR+j0g}F9*r6X;k ziM$fszChq!eWRX5tgupNTUA6t=sfT77mp_EfX;xa-y|+yhVCNJP4xd6PLT0RZyW*c z?K=73^-)IXm53(Q&C~{pold~v6}Us?@mVh|L;9}PwHaAF;3XQzy80@5 ze*Z@J<@SwFB1kU&g%9iX(C_pA&8Q%C`ly>>cMNDtV%;API8MN!dTSx3^?JLB2^=fm zIKh|Gp?4?^M(|ZwbF+)U12Cqes#;glxm5S*r$M_Mt!Mo-Q)$bm6QepjCmgB|q#0TF z54hyexcNhhFO04IB%`r?wA)Aay0Gv>Lbd;jK$z!)z-L#t7;#%ZU&u1e2s z<6uXdW9CxY)XkL-9bx3{=yG@3B*atH;;%Zw<7?)A2;N&~u%pvm-{2sk((|(3_V(^h zRAU*#1$3?l{OdOPZkR=U9$7GQcsQ*xh`k^oB=l?241EOqXwLC!Elm#2>g*?xgcj%X z9}@k@*Qf)-lcZYSTDCQ3oLX(75Km!-))~$j@g-$MUt9w;dA#Lg6MHj=ic*2VxwWxz zI4FazXAXh?^kO&ZP(d~k>Rw#PLjidxhRR zDF~&dB$}-+T%UTXyw=H^cv?kcta@ZvK(zN6Yj|Jjg*OMYi+R(SF4(Cu+_)h^UABF0X`^@jy==! zp)A{y_yyH$PlCQ1`0T&7G8K8Ei{Q-oRx7Rzfpq7(4aji2K6KA-0A@cIh7eqFgY)gi zo@V8H0prNFys%p7ZfV$IgzCZaTo1NUdLBy5#&p67{>!fUM8pWaKsEVPc`IS7Ajx&AU zp&7_oB{%*y6L#SyP;v_3ED4q zyE}e>FX|@gVfF0KW^f2-+@G|$iSLbm`z;FF=2~X6hKED5hDHDHS6UUO+n3n%^z?$F zIvExNHeFH)M6Jryzkc?35Ut3XY`GN?8sCFwM^6ci`1 zillm&J{^))lzDwue!<%OzF&y-TAYRTYF{&O3`ahzmbOx+9gf{IV~yZf)oV@(SB)Ho z?uU)R_z9^EOb2b{(bln`F5FHl=HcM6V27lAkAx3)R?5Y|TR`pQ@xam*s{e|4^ z<5+y=Rf3s$BTK@mb^eTxFNP`$oxb{o0g3>3Ytbzx8X#ob3m>?DT}dWe9X~l%BW7Hx zR&b$K;XDtQI}7($=CL_nu_(o3RxJM+v5O2lAU~)pNa6R9)aKzH8KgGCzYW zZ*3+PSQY-hbVeeOeguK08)mHo(ljL{;7wIl(UEO*2>*fecIMhd3IobJp#?Ai^`5^}0Mw zGYZY?or<1Y#RmCMoXS!cQxOp5$XuRec;fqB#;3ytRoY8D%-lE9^en!XAuoP2^o?}L zOx0!Jg=i!{-T#sr|2Yl#Qh`(1b>1NA$^Y$-WA?9i7yK?_w8IaG=M5NZ_4cE zwnV7e{dBGo{>`y8UaJh=;efxRQdul*^7Iz;=EyEXUf}I|k=(XhjZMFr#{e;6kJ zyaJkG{A<-6n=}ETM6?OnrB^LCkhN|VYOG-pS zN2a3!gw$UVtqw5Y=FRIE8WlpZqg>_#d?fm=FwlEH_h7nrLwVZsaL$en4AJkM6Gt}| zF^F9Fx!@ElP;e$HRG^NoH)k|5U^;$&Mbi2mtL%5fNbK#_=sPG2R>~Zk=`xyS`V^|X zrA%g*0}nscWVw)O&Zajb(T*=59fY{In4V!}YGV(lx1wIl2?(Uf&-AA{kM(=AFcZY9aHr4TNq#Yk$Y_U0}32yYaA9tJdU!4y= z@GGCZ>G=HVsQf=YUcI8gI}r;pYb8z=L9jgnC=p>6D50_d_8df*uCfCL59S{KboT(g zjP_^E40E>8ed{UYSO@*##&+C=9_Bo)fzU&5j$!fi&LAh-L z=KQEdd$EuJR&6mt##U5-Wngy$#s!STD}h42Rdq6rRftWMc`Nc&cGi4s72S%~ zt^_PP`f`<&-v3lUnB+NXZYk_FpHUZBJ@uk4Hs)hH;k%_bb}Lz{a?MkUD@i|r>%CT} z7puRSO;uOiU2Z|7bQpbt`;a4KX6JNR;@jfMLFaTVkzndVQlA_*hOKMMs*u(H+@T9*|= z5C?IO@MY^Qu$WY?qc8vAlO9fdvRE@`&k>p^O4Rr3&>k{kPrFSbGcpn=ax-g9_KWVw z(Oc;jO3_GS;H*`m6p)tQHM0myXu)91YR)%9?ai(g@%lB^#*aI}#@0~(duUxBU|}1S zkdUytwlKD;n{N@8A~v2>HJ;*Z2X6)Qd+9Lp`B;M3zf*f^i#_?45PBmn69X$ zkA4u&CS%;_yEm{jeF>(M7v_SJW90gWM#Ir1{NdQtL0Cz~iRBtMJTS#mNc98*g6);_ z#FUvac<6hCdxN||K#Sk3ThTlzN(LS2f8p#nS2wVMgDKi37z+)g9e8^jR_L+2>^_BEa0 zRL{jL@1;s<6Yn?_MgdRFwZB*gqzr(})P$NdcWM@hw8XR2`r{l^J;okyaIs#Fc@i&m z;Dul5(XYRJDbDG}gcYRYHaikCM_y0HZu?#&U7m%LyvJd)3uhqvT5AQ|gn9M+|w(xTL2ZE*A9B#UA=-b&GZJwj4G!CXA05dIbM9G0s1imxL z$NpsdY%>T}OQg%BJvVCV!5;9kb@}2IB{HUKh#WQeX#{88Jfd zTnF)&AX@R_td?Ps5!A$HHhn*n_wF^2*N@ZaX#~(3tKv56sAR<-!M`mmj6cMGhJl8ME%PvB;xCGRV8q_eQ8RYej3x9`)*UUG z@NsshGml@N$4%%*h!MQpjE>o6F>yyP^hB;++X^}*5UMevpQpb`$70tEZp*J zmH8IM4k0nk!nGHh5DNX?_D)P_Fly?cAE$7==ZxV(^9V1F<(^oGN z6=F5YSyZZvG}QiuIRJP2rEehPVWgK^AZ0>HR)J&&N3>yu@FxA z3_i^bG)~}Ky3rR!`MQQ8*D<{bg-R7u`$C+9TivS%ZyFbrb-%i>(=dtJmadviH^WTJ z!rt|NN$GO$3KN~MAd+;o#LP&M*-FzF$Ild0 z7WhcX!+eOVgh&nG668qL8&CHOB8hezBcMNJ2Cuc;>}HL>y}sML`Fx$xbPGBxVR+i{ zN!XSbbFbA7D795&JeWK{@#}KS?cVI51&zclOdeiM~1CyxXC6+>nEt_wjbZ>0gZ zN%@Da-!Vi}b9Om`vh$du;61*=2t;gyhi}OIn5TCYtPr*iDfeD>&VSbEk5o4F6E9ZK zTz>@eWv%2d>BniZ-C0$b$=gK4#zsK(qH(JQW`z!{S64#SHWXxY_x1JR+2{r4)HG8~ zOZ(;~sP+x~MF7h5#s*9cEvR9gMi%w3s~Ypvj}x-y@uZy9=z;VS$60#UiJIrjNcNb-xS*^1ul-(_}r%va}$FY-NW1>-0aisimetAkTO;4;7L-VpH3#St+o{P89zlkt0wNlqOM^sB&7>4%Ptc&;V)Ynsq?y8t`T}F~91OsR4s|y#FZj9HqQjGg)Xa*-PS(@V7&U7H zkt@IqJ|9}xwnuu9f?gjiTw1QUN9*(6$w^#N)TIND-s8~bB&iIC=sHZ$72eDf{4Z3o zH6-bzaO))bpSE0_PUKcw1&E!m7(brEucL{%6R`WGXaBexCE~8lN*j9T?X$BIaR)ZV zkhZ2eNwAH*szN<>Fsj9;4&4T!8K&g!-XFslYT?~TdQ#MlJA2XuJU0mG^`uQTb`-6P zfWjKvc@shA$fRXT=K6V?O_->|lYI!L||h$TI9IX*vwaYD;+8xYkn5F}JLl8UFkP^YFw z&7^sIBOgK48O;mRMp>tR6%2L#yh2Sedg@==m-pJ(2 zZuIyPv|Rq}ZT|!A*Dw|qc5qeQ+uNq!$?V`9BBBeZyRgG^~eIL;@ zGd!LD`AZC`F>`ujr4eFT>HT~RE_55tvu++ZZ+mv1W*yGuLLoU$6o1|KmkcVrA9};P zeoxs(5UrBdFV~Bnvz`8QerGtfN>1Kd>oJ$R@`7jz{^H7MYuB3Agnqw>)l|9T_DUg< zQfn!PN-_Hr!SpQs@u@}YnF_}$&YH^qg{JZ%L0g*>S6h_8F>u652jo=H^l*&;d&tmW8}YxDhdn z9oA@r407r@|Mu(Fo16Uz%7`GQF9j22>KYqs;!AP^UDZOk;4ObJmveLXsT!Nw*@eb* zlDDw4FME0zU!K<}vaGeXnwTDj$E2`5fEW2Pb@yn>GWib{2FN``2?F@k=lAhGnY5icIjg zojq3v&p7xlbsQTI1mQD8!sZV$*>UGeceQ^0I5IF_X3AX9+4Yy-#O;I$KSpbBD91neZ) z&|Gwl*Uo_1ne+WMR^%|cOEjuVP!=-*aDn=TP7p5XXPVg#d`|P42%b6mWo^W0Aos9bq3m|JbyF-?@Jgszspb z5nM1aO(Y<@o=7B_*geZ=3*K^gU3mc9!8N-52fM%Oji{`*dxHg|2b2Ti1VL?|5P`SmH+qxxT%dt=vh>>`~*yX2b}?`fg`#%Sit^hUL8a!$3}{1g@{ zWUd6cDy`1=d~AU=w>w;=UuL$;0A=$d5JF|bCR<8fo)QlKW*cYZ$e8N~ZQWiMvL8D@ zPlt;|5>XT-xM?Wjayk?Etj3Vg;(*9Ig?GJe&Cjb;25jEvBSeW)$@LA-mK0p+c4A{W zoHQL9Y4BMvg(BZ;$HL8)s@G!ey1<6Cb<02RW_S2FskzM{gklq6(?kq1@WE&~_)lh~ z(|5DW?STV>!x$(&KH$De;ow!C{j!%7a}?^``5rP%kGoXMGMeM{_q$)-8iQ;676_?t zqcg(Mg|2rpDbQ}M!F=qebBhDm%Z&sxO6j^45cSG0yu`7$d=qM$$DK1j+fTGuBFtnW z5&{z3wzdldHDF5*l@ev@nEW&=8|qm{fyKo|i$>pXsKmghr~jorc56p|-k=uA)ZT7V zG(_(0u9Use>6rSD;@pm`f#>&t`VtbVFRV{C`EerAbdyT|a)UL~v&@5Y4Pz7oq3qK! zSm)zo!}G(hDzV#;V`s9&$B)lwq6%oH!CzObuG%*af!q12lFL<2aKTk7k;>hCYUKp6 ze%by(TF#1|Q!yR#f8FgZuJ4HNPS#^)dH@}rut-ReR6K>~iuRl7YkbBBM?o=3S#41( z>q8W#s4T98e+nupI{Zvs(C=seE|e}foc)Bjmj8Dy$pO-MgEes7JU@J42d9>?SIeSL zuo>{g&BNbncPL|}w+rG$QHh1I6nkATG zWg5n*O>vr@{>?)SiDD|3Z@Kk{#d%;-C*?)0iHFzM-F@Ql;5bqHz=9`8V8%(xPnAYa z^&gg*Vv4!^95B1Dl@4^n9r4&cr4;ihHfHA|aS(m(#G8PZrpG2(Gh_=QPnpTBAF+Jv z@OAvtKsU1(i)SP{KvT zI(izYsF8icqVgX| zcLQUK$SmF#5JY+ZC?ui;{e|8fhL5IstG0_uYwMfQ`FsJM=l^Xas)+@J>VLQu_ZF|{ z6YnssnH7N`vncRymtK7W4(*ZMuX5iM45oh1n^o&4kNsU~gwyW~M?oDDRR$2^D@n<^ z_dy5^XqXICtjRs$NP!w?y)bR@>3oH|iQy4S)XZOE>#vad`ui-i(#6s+MqT8-mzt{L zL~wFS!G&#eIDEO7y5Qq){o%mjL?S_e^A2~8`*gzowXL4Zdk+sA|zJ-`h7S-9r*snSj+$aMEQ zad=&5{o2uqdVVg((1~+`QYb!JgQeB^j_MCk$=OKRO-b2};k4fP0?NG+l?H;_loQ=G#0iW{tr{HofRw_kN&;B5J?zXyvNO-_~XA> z$6Ht*gA^D-@NguMI@4x2TiwT<5rcbO#1aE=%rp9O(F*lNqUi&cX6vXcZ4yKR!@gnWc=kla>O74`R2WAg}!U>#J8R&|u zA8VH*+}TaUEEEAYmezsT2+~AmKjCQ18+dpF8!E6J7U+Ajsl@+X0MeeeNWmWjGw(Ej zv{a(d`6ovEjHoyz>JqAq7UGDAk%+k7)#pY4(=uU~E}MhmCGWMQM@$A(^J11?{CANq z<<}YJwKYr%zd$4;^0*mfH7o%?u8!k|D3(UFkxwan;_NCC^lpL6f%K%_#A)AX4^v^y z#f?M5Qz%GUZ(`A_MH%dfM`mRW&vE6Uh$ph@+iiS2PXW9s4C@<0Z~@qNsY1she*vJj ze#weoEYQJK7D#UrTaqIKkJwmW0tu+Qlv_c6g^R_)>lne{J2+j-=FMM%t~slC=3;f#AM+>KXON8xHt~l=(^n zo&`@q%)^I+onj*<5Ec#mcQ!jKx^2Qk-D03ff-=fE2=r1DVY!(RS!u_#oYe}?IZn7e z_kC}>!X>b#1YKT!!ofYrArwZ{ zEQ1&G+N@d6$U}$-5_`2Jx33Z<$U(A#zlPkf2AUijOG2|l{9u2=?O@>WBMKnogBKqF z`O_a4jIhx>fB@{%BpZ7aHEvuYqF4gREN{L)VY-~6{0phHaLFnc*-67{gpxB&<*+owYOWhtvyr8(Fxi~>BNdzf% zBHuJQs?5@!N{e2d$!sPS7mN-iLFWi&FVs3ZtM%#}z-u*&t|K3H_yldA<0928QtEOT zc_h6x`N8xcdC7gaC_Vk{Jp2wQb9Sb?dJG-%C-Vs&>L2z;<7vXWzH^ZYh(nkwiynOW zYGf=ZuC5`Dp_oFj3mIr!Qox6E{@VJD%Dv!@s#cwBC?=EoLZD+qKlW0OnSW%%ioxU9 zc3ThpqjOC+ijsuoT44cMpF=nrqPBxQa!}-L@kQ5JO(icSWOYJn-ki=kpJnN55zl8B zjSQ!w<+P|+$!Er`+`##J7EYTnI7@t#@ESW~3o}@67;bNGPFq`~8Kikz+8@h_WW{KU z#qlF%@d>m|9EGNCv3DKcBphk?*k%V5nZpOH!^t*2xv5JsyM-kUkULk9O#RRr`HC`P zRd8^&4W}hzQBH^Q^q2ayu^vlm;vd>`Lzc2ZJ$~7E+>Wdyzdg>tX5qBozn_A+xu-+@ zbLUT8jTmWFku&mn{2ZT9<`_b*iG=ar6+JwkdpSJFk~5*gQw(X*Y1v)aoaqdz@V?xw z5Dlyd3iSShnjh#xD1zV?Q%GP<^3U^AQ$*5DPkXw#M1TNx~+V+fuL<`ZIQ3ip*~IY|EO96Z9DT2KZ$>CF;W5 zAxYo6!5go+z`V@KTMlKQ}>qGkxq(~g%2G|X&LMFeG$~+6@}@8vQL?NnMtLZO4^?8pF=fl z!iSQc$@**EvGX+w2{Q%3o}B^?8ye23;L7pw7wJah#S}`2m*ir&v&ALhQuU3SdF=Znni$JN8{7xY3@8)h{V zx|N`)`?V7sA2pq5QaIrW0rwV1-ZoU{+4Q6_@mc{IXbqPsX9KjzBx*-iKW@chsRAc& zfi?_V83t$rt6GeeEKSqn;W@x&)=+>pOhU7;Z8e#(soeG+Rd7lXTq?DUcGB74k8ftG zd@R{i?ruTJgH!zB#&RcM?)2CGemr`b;C*5 zTj}pvCcBK~=@Gn)9rzZ+4=V{vL_~x&64N)5ATa?6RxlIqydj`&M3?>-_-!2jC9bs8 zY(P1$3A+{QUp49iIXP(`XOzMpxbZ}|QMNBC?BNE8@4qv&-#>_aNOt3#J|F|pNjvyF z36It(6+%1Zj(ehG7idjy!#xUna#V-nRd)ErD4(|oXQg(iG@Ma$_0OR#+|l*Z=Sg7r zf<#J4m3|tFpK>K~pSLq=IBI}!M?57DE)biCC@FMB6FJUpc230ezu|^NjVVA8i91AW z@G`gkSx4GT|Ehg@fXT)NNdCdlx++K=e$n8GJ0#xijLh7q<^+E7TeoHGb+5sHYAZq0 zf(R0;PIBs3iu@X1_}Z#38ArUVL2(f0fOF=%WfT1Uf9XVOB{_;1;M{ch83rHE-dBSD_8pDB==^~ z-KZJTN%VR=im_R(PK~WlLBT{6cdJ;s>b?Mbn6C5(Y_K1IoHC9)4vS<9MWAftF9~&! z0!RYcT?yR>1_mO0AhBj_>GNLj@FPkQIczBG6riXqV$M zy7-(in!*lBQc^OgHNoRB#~tt^pLI~i#+D+NMRYj0f$&lr1!<@Q#$c()U}`Z)omV9-uCDf1~DdY9u=SW6IQk-F#Q%8 zEqIX^&YmYwfN33h25DWt^P8@Hfts~&!4-86uxz25MS&TGe_+ZPhL13JWV=vZ@;i&G z7K~U4YSORap5&=VRecp8tj?6eXoL4&-k~xh9-x&brzo zwqKRCS3V8sM3f}an=ZY$9<5}AIgCd-))m0Gla4!O1zebKIO$jL2i>NG^69w|5h8Ea z&gb@oR#Ioz@kK^8y|;mIMBP4bV;m!DMizyF^lY5+9xgv??YJp0by4THyS!mdk*~zf zg}D{kxKog{nCElR5SO%hBo_~C^YyMbgdma0MGsylOC_HsspKU^KD@cyolQw-i6dA$ zC#i^;I^70&J~^(_w$7#l8smE*_S@V+{J4Ug^3~@iCT6I5qA2e&pb8^M|&8K;OV320dJSD=74F|52hBC5KXIT+5xR-3EetMh(h`8z zt0^Ap)3(08|+k^|m;+BnixS7QE8*wxQ) zNvqf~V1z=H3R=e41Ty#>1G3RH*4gceGzRqxw7#84?=ym3`(-mf$KF!|)T zXdH%%LZ$b^D+~>_dEZUX;?|>+Ufp)=ec=sVc(y&g z$-_VnHgS7i3o7~*0zs(wVNRvhScJ?OX0gV#H$-6|xrO0t1#Vyi&V=jyo;LyS;x|Vb zvBv=83(jLjQ+WGi>?iWIIPTDPr;}}Vm&;K}HHuy`w#>++AIcCGCE>JwbpoSoq+|p; z{DO`E&wgpaXAX2b&kD;8#np_!7jhlG%mT^X)#h~016UXax(WGn;|bXqZGoPNu|VS~ z3<$})zUB9?n3&IJwst!`;#1hF5y{(Q5$z^}s@{CENH?@@aL&}a-@fncOXQcSi}jW4 zyONvPQ^bSj+>Z(hd>y`}h+y%1_a@K+?+ZA|znOAjP02d&MQ%X+lhC{c3HiPYZ(k4~ zVcH?7v)&3ZqEUQ^E4O-!?UWXFI~Dyun%+974eom$MuNM$TU*?NL-A6)I24!S5ZnsE z9f~^?D6~kCBEgCWNpUB5aR^eZSl>L~-{;Lt@^|LWnS1u0-LpGXOp8l};d*jv<>01C z>_~vl%}s66 z`oJ8TX^Cc-wHYS5G*)0wilB3ep;f%|6M@cvZ` z)jM}UVEt9@{7>&M@saWq>R-17L5TMNXIR$J;V)hvz6tkpy@&o)ws4fxp#>7^ru|68 zEg5&T5VibX!T-CuUUg^}a@408zhMyt4N^n!4Bz4oOe9-=cDogWSIa~&t=4$8)nMLs zn%vm)DwuGj#&((-43aVNk^K;Kp^t1&q=0&sJ-*;GBEJX%Z3qUqRQ`1F=zVI%guAd% zyVkQ9?8qL*-V4Di7A>W`h;vfU1}Z;yQv)+oQ;PDcXP`UACl2&UOX28dVx{z=Zp^7_9nEq}8+Ip8$ z_;2b6qH0o^Mw#BwE_!E45mly12-Xw{E3xA6AlDBxH3eq|0p+k?R!TzRV&Kt(X@Fa~ zpba^Lcxyy@G@H7Tj%u&?7`7j$%GB5iAeW3?EnMQuZ@Efw1$W{-y=OvLWsl*C917?k z@f1n>;irsJZS_57sC7z_)XPJv+#Tke;jFw0#h}-udSq?#R7@$bYU2u$5e|)jP`uHUK4!i1^zfE?X*_ z(6Lk}>BmiV8?qlYRYdP(QGcuuMXOq2XVQA)(`Wu)N$E+^%&}4dq=L7|HZJ0xAMxn5 zlLjH%=15NYP6~><&>n%VtH<7|D65brLCVl_rH;I9iZ-&rgBBJ)|fBFd84@LiPzY%e^K@Mt2_QxB;4%743IPhOsb zwe%CPbLRCM0*Pd~)&`rQY?IGXNqzK@{HAt|zX1}wJ?8J$uV{(TWL9p^qhsZGt6y`< z(+M%YkJ#BfRJEPqib5|ch?Oh+AjoBZ(MXG?kW7iY*IM}}p1#OxG68+|S}<2wNOVBW z*0xK7*wM-cA5Y(wnhe(cFoB&!?}p1J?9fd%umodN0n`yvE=-M8-T_B6!X*^IfLx7x zg2E@0C+>cFP~8`zK6-Qs8LTerMQ#RdO=SmXS|L53DX!_3rtMLH_h=(sIwM2!k6(>y z1gXjnuX((;7g=0RtCl3W$fdqKe72eZ9PDfLeLA!iw7w({h}KlqnZn8?zGLLX)P60m zMxELB?0G&d|9gv&%801F)49~}L;LD*y1{Z)ykeP8Rh^V3apZEnv}~+=3WsW(Nw`?| zaJ2lC;tn4FnY`)N>{#)Qg>*|-C3VdQB#IBED4-t{isN;|Ku(WZk&VmY8z;)KTygSR z!OnDJuy~JKb#JrqTJJpSW5_OfpE(xewdkhxM>fRu!cH(Dh@<^Aihp-2z$n(dhKgD# zosVopum&y;aBjm{Lj0K9dQaEK903n)owTa|8q+Fz*H}i{cFO#S?~i<7%GVWia00Hl%m5(Z$FyDp)_<5P@-8GxkyP zH%l574SvJ}T0A@FUrN28pNPp74TXy@zFCFu4_l|4Hh<#u&gok+YJ?H6a*5NH)1rxd zZ2t=Yef<%k6Ep+#y)9QRB;vp0_4AA5ZN4X&dfDCeH_(_tBHPv4Z3l(hMd}mpTV5W) zl|jH6HMLa*(%zyD`#eeWoatjA6`Km(z#xp)(D0@~q%EcnLh%Do$rOvZJ+57aE5P+1 zjQaP-iZ6L^Gg$%NFcVYj3&R+{xyHX#`|$GR70stKYNo`&cF&4I_tz?}A~WSSWvOwT zX^DdixdtOomu$a7Nun%fTYx}+`b#P;g~3{!J15#c_!1E@^(E?XYF-SE^(-;97>;`% zOPX^_S_6-MG_5-yLWg87ei^sKDun{W&zBBn<6D;1**`#stL-r&^W&;~vNV;Gm@tqQ zp=S{MS7Db7+h_x&J&0^7&}|eD}bv=GlxJWVTiEtACw$+G*{5xC;kG z`{GK{epSc$Vj|bY>`<7r{Tf~no#*$O7_)tZ;JCRNM~}^}+P6f{?t1b?>;t}c^t*_8 zjVxt=-cY-)(Xd6W9C5>%wY#B1x-BgjqA(3gHn@ve-=Tc^C2pYVRTPfczUT(}dP z5uReQZKp^qjvv7HgJD9*u`)W-*&$DVKo_BMcG#CuocaD4;2S0q6I$l!Xdz~N$ikbf zYdR(I(wZaPE3peaF~DmiITfoB@t$T|WOaa`CwWCU?tO z1ixV=B{PA>IF<{ z`)AtjPAh;3wd{;d#D{h`3xpzBWj$C0!XG4})_ve3>Wgo9YZt@s=kj465J0nOWvY@gPNiA6^;3{R}}{vtaE3p_me&n#V8xN)_0ER^wq zc_i_|%@vKNX?zWovmmYduC%scC{ywJ51q@aZBHn33dGc6uGk#^V96F^G;65I*|4HDcJt-sCc4&;-MbG7`G|JJUICm#-^aaJ)lQxGm;u z9*4G*0Q()iGBI?;H(5w&!?!zSoG(yn3&dftyK zlGFcx9qD1eA1;?Ub)MP_r)%`SXK6d;XBMx1XTkbOANx0{Ein}`a5ai|71dIq4ePR&@ zTD0LVqLNbe^C?Wl-6IUDd?j*`K;Ud@N7Saq@9i<}?q+!>Bnvfj|7TSGbxjynrIgGW zA&n;Bl^aSI`fC!PgY+Y~|IUu>(+CUO2l7{MF9-%{!R_F<7gr~8;T~oM|3_#rmdHit zAk&bJ%=wFN+qQ>B3A<e(Hjjb zloc>@GffO^ z!^m#mtYG$J>(y(bo@WWLrIcKch#u@s8Jcaplc1#BQr?+c6bG1|Syjt~d=OM2-dET^ zzud85-XEm2R$P!W%vL)^4D_W&YXX}nE%Y3Xm!EC7%izt|2_R5Ea_0}4r(KwUjciFck!%2w?XYIJ#}qICOY8IL zySt38(Bb|_-@vra*L?c&DkxCHJswJ}esc-eA?=J;HqfZqwsNa9=ti^#1x3Kzd`gbv{eM^{`~7=hJQY>& z#rA8i_r)I2nq~`t_tV{9S2?%CyF)E$ndKN&WFSE>-9@M>L60+YZjE#d$X?YmLLNCS zR4%^KNh-MBZ69(TMLylbjK~;$L_uq3uKiCbD$<*ucTSVr7xgB6f7UVj<2;8secR;F zc7MmvH-D)JwCu{EWC^T>sr440&#PHVW6@~rTkQ{1&~F~K9qOve8x_(!Ui;j_x!^b#Xuy zZi%U^BWLBhwi0`ltYJ8tK0qJOn{Dh3{**9Sfy7kT_#@^g=~tV-fNNV9kw*$HX51=c)O?FbVWKNg!JAQ zln!x~^xjKSoj|f9a-KseL=-@gak9!kPdX5RT)DP`jL}>X*-RrJqlXxU9l2;L1p3{B zW_UJ+;%pR4hSZ-=SQGWN!dPa1< zj?nQZf)$8hAaktBzgiJ#eya=cLr9191fa^5AO>cODN(He-IWg(zS0`k7Z8W8u9f%_ z?2|CY1E?j<6bVew=y*1xE?{alPO7M-ecmv-Kyz1dC;}Pybd6*Fjc+fnPTX0;v*s(V zTvjo)YfC)$8KYuL$mZIK940FFjuEuz^?0CLCwQ zdVRe@(PCU59Z#W8SPw7E!b@unp!DuBAK~>9HS?_=pWRV1I%XAUS9$|edePdnX+A&`|8<5)|X&4q01gy z*%HMbQwTA|>4h8LQW#+d)Dve^)Vp^{;U$*XHo6g}2#r+WGXD8?aTTF*OeD$;|CQ+f zFw=g$wUcYIf!SSoMh#faxPYVZ8vSH#4~5_!2QoegEi?p!tk8s;MWbya{3dgtMndGcpuoYX(!XQ~9p4 z@+EqzEgRZcG0Z>J&shZYoBGT7a7Qxhuh1vQk{iU#Wq*8gyxhI;q}?D6_?xt)9AS}F zoTgD&mIhSV*#Z4 zTVdD4aG#ygNdRj!DMj9d2Jh+cJS&&93{%F$@IpJX~>3QZ$noiigG5POD{n zP|~@LtZO|`YBhPR1!kxnI2Y0q3Ilk!Yj#Fff*Xy+411K668Q*yUWqbPH69P*qHvdb z>Rl%J7{Us2@GqG^5sm7b_U5}$-9m2ue(`I7H!ncrlpsJ2WdsHB_mHp4Y7|S+CbfhFF0&K9s7|~% zaczf9d*(a0WvKtseSvYn01Qd2e8AbeoX-6Yy_kD(vff0yy1+No>O0;b?u?#*y@Vv? zbc$*eB_b?zZP>9S_CCpwcII)ZTp>2%>E?%gGzr=_3=)~lxDRP-a5xJtjzXBuuPLN^ zyisL#E7kBel15ScJZ)u6+>{!c8zQ?~uv1uR*o7PkK`8+56ux@t)~xyL3~n`m!-No3 z`$(n^q+RiJ4};=tRni!5W~j&)tTRx&K48cb*}W9MK8fM&NKuIMo1US_%Kj9^EEuP+ z5PyNkVPcF@1@`NWSz_4?J0<=>(l09~D|`^TA~27dZO|lPc}J00a9`i9&Lqjg%y8Pj znHHnKi1=zkx&Kj{MDSSgKWId1h4{z`>z4Hp(g;^$Nz+h34yJ`N$kNk^V}C5ERVaHX z1YJ4Uk-~O|RZE$@h5e$xD+~`ut36-pv-20mB~60U#Mh`g9qz36UBMlHWtRk3(H~?% z%A-C;bFj;S3&;-fwJx?SJrnl#UY+*8no+}!LS5Yh0bK<(3+Q~N*(aMA+AVU@=E%1t z15e`S4imVy)a(2YL3F1ck|Pu@bQ|iL8+rVCMq=fzavQIBckxcDxa4qH8{Hznw}b4v z(`AV77b>}uGp_6DF!AETBVr^?Zx%GQF?JnLO2*H3wN=&3b@AsVTGun9DS$ZXnk<|o zR|es-`(*IbrDoVjlcL?+ETNe~`GA}6w*d5Lbj{^EG_sx(VH&Ekd2{)eC`@wk*7WZ)@~ezQk8Q0T0?=e&r}+BXP{Be zf$c`wWAoM9B{122z&m7vEw%OXQT;IOnh`f`czB_Ag8iFto#3M2X zwNT-EY1gENi;LMxRPb_h`}%Uq5qhLyhgT13gJ5I-fj>TWDUX##A{S1L`2Iwbz6^^& zN1p=cKA&N{F(F1op=nu+>0#emU9G>6ODELk)Ocjjvni^3FrMqJnsHKX23`dznzZ4M zrOf#_I)Ef5Xb&do_+fyIg~!$SK@f~I)DtEH<-!amn&}1Vr@d6=y{hMte}ha9jD(nV5c&2hwYzZj>XYFU)e*f5E7rjXP&hrts>=`8-X-$a z_IOX)H!g)zTpZ@9AJk{ChiPfV`z2QM^+^*2u(&9q*;4{+s*95US#m%RS+ep2H6P`i!=7*yeM4N$KGco%6(Ga^2G#A+K947Y8#TEydmU{X;& zJ>HE+FoGd`$U|1fOu7<>nfg_g({707Y^t0Jn%7H5%|h{}dibeYR`tACc`;*2#mH)1 zdy7YWkvxA*mi>3JUB@!-5lR0SL2TcZjp`Fs6}4#Z@%(p!LSOc{zuK4g|5;8r8I*t6 zJRNZ8#$kLqIB7JoRYhmydE0Mt_0E7fHH^t23>fKeZ{1+;>Wo8%_G-^23j+D0#Y+fq z^kc=LSJoRDn$VH>T540T{|UbAJLN3?ZY*kOvGH?%3alTBOPIl~=LiIDy}L z7OeL6j}>>C{ED@+KJMiOeQ}@^5EI+UmH_E<2dJ?dlYUkn+t+Wjy?#v}XP(#(1g|Z5 zo^b5W-j-Xo5KsS+-OZ~*gW-^}_rm|7=W0AJHp2)|*Bb2kG8jR*8cC`SuH-W~zlB)E zSh=0aT1jE2?76FCJvdT}wc*d>{Aul1q3k3TyD;ot#3Y(mKp&92J~t|~25P%#^YNr$ zH-(I;^Yb4NZ_s{f--Jn-@r^F^Yp#??$0)2M@kX27KqngxBSbX<^Y+CH_qt81#&P}V= zKtJVL1%*LVdaa~QLrAO4>QtjRkuT%}Fr9SZc#0uqeej`!Q9DivS}e`Df9orJ{L*a9 z_79`K=+wT;pkj9IwAKTlg`dAtvmk8foN@&5Lv85l|n9=hRLJ>4VJP7 z$Sk+OcmOt-Q2Hyu@mmvu9RD{=ozqav$KCcn{RYTZf8>PzqPR_5&p~sb*Z>*4v?D~n zlh-v3d|mR9C=^kcT$A?0mG3k59;*XhrTYIhG7prs0^%FGw4L+pt36e(A61OOkpG)=Mr!}|!hmS;|97>5tH1DpMHtXhc_NnkV7=B!W$4AG%Cp^q8R zfFjc@Q0NQyli4f-KKqw3^_WtEXZRmU{`QD}iT>Lw7l7ZD>#HS9=`4y`G)DKPl6K;a zQF~C3eBE_)rxCWabmUgqO?2$*#C4TQ$p zY>d|;Tk0S2G_^!XN{)In^iM;^w=;7^mHy-ShhRmA12w4Nn%N&R%88NB?!}M2Hp`5D zZCj}5kafeyrL`yzQy0&=Vh-8D-pUm{bGF>hWxYryNjiwjwZxh&f6Vr_F^qnd(ClE{ zr-jgL-xvIIzHVmrQ^=C!}q2cPAC^X!Ds`mf?_O47D7rWwcZ zYD@*F?CcB$qD^o+UThx)!h1Y1yRSu;O0rTah2^5Z7jU2Oz^v`9Q5%i>6*NyOqUy@& z7g!}u*a2>O9KVG~8FI#c6RWc~P)T_=hLSuLbw}nhPmqXZvo4uR_D|%uF8DP#oVF*` zS-Ux7fk463#!FikE_9Evl@iZw(@xY$jHr$veb`h0i~GIm()I3Z`gl{t-VU0|4~;L> zQ};JU>kqC+-v3MrtJ-7ny5Je)Cr-e``|sW=iGnPC*H*tze*RPZ_2-y-=(uy$gT>+O z3=r0h;}a>6BlPZ39OuJ*TUMENpIFe7p~b5vQnEBgs>rJ)Cp##VnM*c^c<(dL9xKkC zn#nX>x@OH&ZQS+Lcgu+1mCeX09ZA!^mcsL6{F3-b9^8Gbor6bta$fwwiy;MI2as5m z^1j^VD}O!zAB7!rCcDszA-LE3A2USYY_t7gGFWu~z!1|Ln(>4TMZ_*{wD>WqI@CO* z%;3TLDAy~_w1fN_sraDmTh$hy-1+<0UHZViH`T4Bi$$`z>mo@ZKP0dCrUkS}(HtPq z4V)k1K!S8}(Ev*yZ^6=_H=ft+RSc;?$iIDiDBGbZ;NMw;W7#&pC5bw{+aXk61Mm~4 z#Yr<2OCBrXhcHCcKQ&fTS}ta8_g^R;tT!_d zNCY9oWG3W!IdG!^yvki_p1Aq`yQRS&WrNh}q(C}Z=}FszFX-cO_63YeGGY=rVgtV$ zuV;Z}p{b|WUDX$%9qyQ)BbQsUR*?|&M6q^!|pfSzBt zzs}QRE?q-oYe8H_fzIf@bVe96D=R(0?Op*nn0%w85<-t^AtHox(6s$IpkEPF6F?(E zVwdi1Gmx$*P(@^!oH?JE)^5kCxBoG`7Lt)J=YiBEy};eaAcbL+2Iw-6WhX2AO%TYe z!&cs5<@cG;|LoPsbTh#a={pM+^mWA+Q7H4gro+n;!>64jelNW=uSwv@PhrOh)7&9+ zY@`EsqY*>AMV)WY22L6G#7_Iy);Zy)-v+uTB=eCuHVxk?Qnd-Q!l=<8mIH8sDI65G zgGGVcJsBZxO*LVoid? zl;AO3U~Y}+&C;fTI6LO&$wOgj+12E#9POPUqy3BU`fDFIj8=}}t>&*8TXr5;<t3eHrn`4=R(J?1f=Mv`BsC&>qz z@_cI|m4H!HL9IVNa=LDG;nKKJvbYUN6M{w)dx-xZbryyP`iW)cG4TGf1YKf{4zVDI z?rr|{r@j&}ka$n+5CA$n{P`kMo{w9G0s;t?c*(QHLXrpjMawi`yDMbNCIPb_c2}W% zSuj-6@N|%@w$_e@!?X7Bf(rmTV{=?*KPeO^eAr7?*rNYPU$7sGq?eAeY;}J+kkT$_ zy`DWn5#a+V?uHQDgzm)}gCP)osO?GS=sCSO&bQKw^Qn}G>{8A0>DP#_QQhYFQl?qK zFX4^n8Iw9qE>u0ImFl8Ji|p;B|7&VT zzk+vY(1Da}i?hQPrIW_PhlhOdV_Sj6aJpXx?F%|7HNKVRi^n*7*eN~Vc!vnUQiisO z(b1blliGo)8!}K$6Hvk-nU2rk^`zH0Jk1xeJUX#>%ahpMIja|2V8G>x7zy)1tPES% zo0dc!CE3k6RDDhfuk$jKT=BE}PZ4>4bEfn!!a_Q@g;x&C*F-Xt9qM^(ZV*JOMSkfVylG%n#5-LHML;N}>1%d_{vb-}yGDD}{lp=84@VK|GJHk|OnQ z)|b{{gGr7B3G_vqFe@#D^1~ZooJmq4o|3oYQXFzJ{ee&sBy4QF>Sm zn=Uw-NrBrM(Dpa;P%=f@H*co4F0=ki;du z%Uy8W2==-k>CJ2=Kmqx~_1WqfNS{jw?q9A2#Ph$R!YaEMzi`?RpeWj!o$9dXab5`C zy5r&S`?;U+LtWPRc1sEN_(+yiB7q(@D+?BLqVE!UKG%ULp72Cu)p4AB0N;7OrS@az z+%z>4es9qk&gIx~p%~2DWcsG(wC~KDri5l;XXdU?aOR~#Uu{{ZYSyv zR=XLvZqNGj6oWnQr`!pBlFepuf^575Y-GlKE`TQO54^c_tuVn`fzFhTNXWjUn9M>7SXQxaRq$a)FZ?x3FeYsE}*X+gr z`ckBTcrN^Wf5r2OcJG;S@X+^zIqcW{s_Q&UE*;_^Egx6`xHm)UUuU*$(iyc;R2wpj z3ghU}I$X1n=yQ*hHNAj%$YtDqdhGpAdj>tRdZo)13^h{;GWA3`aM)JxQmYl(4G(o< ze_$U_5=w;RMs(Xm0H-coW#W(MSIQw#9p^gq4|>TvCEQ*CO{8Xu^KrT4ag~-KQ50qi zw$^u?Z=ddjUlbV#g!z*v5vUHVkCBIY(~xHK4}85OEp8cu*I0^YdZ%?R>S|7vd*GWTI?*qr;708^({ggEFtqo-`4Ymv&^emGS5~gxt?#beXGF)U~^uC-yBkv z)eLI^5g`1}!+z9Go$nym!Q?a+1ADNvCvLZ=|AxWkK9aU+-EO|K;7DwLpeIWA9})H2H(`cohmG*^uh`r7^n(2OURSbbSpCW8$R?TJLN^f!4-Y zmWZ;(k%-<2z%ZMNyscX-#PHzb!xfzm0Aj>Zw`Lin(QsX9vozL0Y0XD-oI$eX9p z8HNf_;>43ox&0dca;}zyhacTtCiq)y0eiOHdKY?D?&`uBcH#y_&p&r>ncsBYC4oEh z3}mc35F!B$lA^E5Gn)JetD|#6wkt(=T5-`m#^rwmzZi@F49^I|G^-1EdrR7!B)AkL zikuuBh{}<|)>u*QTOkRQ6uUnBlv^i_PY27*40Wr`Q-wM4v(do;GyQ9=efgkUlTp$c z&nF4a?9KCvs$?@%%f@U|d`gp0iJ&txfT_5P)~5HUH5vrX=VU}BR7L2U{*F!_edJLl zP~;0onJ62E<~_SeC0Dtq2DA_H8*xg#^plM179szT!ZT;bxdlxA9!YYnqxq2YhG=IM zGaE%WSqhMZ{~Ob~KAuV`tp8`ESdSdGpPRJe1u+NEq6qv8ZMctYEo+>5-qW??|r$O(@0D*X`V(#hZh(6+`E2oS}#fY5=rA^ zy&!=E9);}dEVdu7f?PKm=$9?|lq8WP$czO2-Y3cl(*J=WrtS5pnho?0IegEbV2B*% zf4^mV>;v2G2522VV2OI`QjLVj;>=>=+m%<)?LF_q6(Ee{xBZZ625b5NdE2fijHAvh zX08R4)_O#Ckn>jgrXOd-k~jt(FES9*1>>t%AhzUU%E0LPOCW|Zo++p@@Q2;Uah6+J)jx>~+$L83*VKMeU_p8o z7K6qT4up)57-(Je_mDi5|JH{68qJE!1w+lEp;3YcNA$r)PU;u9NM_aGXCTX`PO(YG zwNwx1@c^+`%`*g%^pQY^N?T88im(fV3;*roTPlRGj_bF<6=fmZGYlUv$ffGD8t3yjv2B-U|1|_Q$3u!mJ-}by0m8@mgS}1 z7oQDfpi-(XC171K$VjioN>z1wK^k!lFjgA_N8cn7<)UQG5wN=8Aa~iU&zO;RFVvWv zly`{{BYL;SD9UP#v|G)V; zGT#QvL!0&f0Y)x_Sm74=_go4HBLVSu`Rs}%32%e6`M@1-CFPDG`3mwm>Ex5PzuQIm zL@~_N@%M5IM7jB5xa92y-2;nI`nGqkNR9(9Bg1}Csaam2&QNKpARZf+L_gx=Qej?H z#I95-I6VlFhthFwUuEBVI{yhiSQo&V=Z@3`Lea4}rM5le7*b;2r0?1%5)`v4X_X{( z`-E2In@t;-BsV>VyxZF?4gIHO{yF}%1}TxZ$~s2wJ$FJ97B_;_GLG10Lh~~bEd&eW zHVfo?uXch4D(@3lV$DAwvEV%g?3#dcLfYDWYTeQbF?6U!=sjsNT98q@ZZ3?N?vJ>2 za{JbQeQ65}wW9J5HT*JMmP;vjy)0QMX&mliuY6ZuPcJ88u;b3%sZG~ztcNZ&JZSwr z(cWHsJ9dFK#LP0q<*L{*^+b_MK?50rr~6w4++MlV3$tA${`TEkWpE z9+`0W;>T`xpWs1x{u6hU|zLain8uoV9LxAZ%V4XS(sQ4Qjvg|SBP`jv{yHV z!Mn8l)CKHTRI4a`1TYGYvCm~(wg#!&iMB+ek={5rLb6@tU+{@LY`-UhI&QIAQ zvQ~lt5w}X2&zU8nB%XM?$dVY&R}f!3KHZ2QR3Bk29e=|JfJleZQgLg4$|xKpV-_;r zk3Ha>YNiE=kTlG&!-R53T1XDB6!RMIL3TWWM0tOpwyRw_CwWXswg6C;26(Dnn%cr; zc>DJkbzpa(P>{HmJa?bP+Kk|f;@w1sveqSpBY0p(Y2>y|863;oj}C9NJ$+?*RcB9Wtwv(kXI?T%s!o0nSY;-GvWPPaiYRUQj6tdV63t z|1NdIf2n@-$P|Ej_IWp$3{1jvaTkpkj)Z?q5eR3Mx{y-SQ&&a#>-D)4vd) zemj+s7JXlGf=!6NMS__xMZ1M%{F(Fk-<^UiuDctvppcC99Zp_jV@Mj^JeOzsdMd=t zWhTSRZXEN(w2|6ue^LbjH(8QA!#gonVs3N5NKtX^jbFl^J0hLV%SqM`_P4S6$LBNs z_xQj=dr-MFYO_g_H=RqnkVW2ZxfOp8fj^&P%M5Mupjm2cM`8~iKM&$PNr^#OTd%L7 znm^pWoPADCj21%*Q+91HS7UHPw9ooTkpSSZfBa7;^bFfZ<+KJ!-V2PpZVPWv2J=%oQ(xJt}RZ;z)z*;4*LgmPQ*^Qb4u7+a?| z1O>&prH1bt9R`(HWgLk2t^l6*BLrQZ0{o0HEB9S|JHFhwlR#_at~CJ5xE8+6Jja8l z@@LG-=R1Mozu^mj_s&!+C!j?mME5>Vobcy6{2ZJ?zFV;^KS$mkkNV#Ee6n_(F#McX3Fi!WOJCIY4K+mlDb^}SF8_vcOJ?jpLCm7db@t}m;&ZD};(Lvp{*o(1k?3e*LDOB66-PzrHH3>WIh6YJ4 z058|zvVaDlXEYz`gLv)mf-)#wlQ^f%laH|0Bz|VZbFPZLlvf;`0pR8qXyU{XM^8EK zXTKorkX7?Ge#hjyBOzkgACQ7{k??Ac>23OYbk=Kr%%9i770cZEJOmZ@4(eK=N zUezKw0QQM};%f7y0+ZQ0L5G{;yzC2jC@u|K@f~s1Su* zjo@*ioC&Lx);u2`4QNn3CridAZ)7;Hj4b8-l2gwwhlTbEB}S<#rXv(VbH@~j$to$9a)SOwj_lZ9=xzig@$j~5OOOpKL7=K=S23QM>Wn-3yDGQhyAw|N}SG7dS544i4 za4Zhc98heY084RxNzfpoFqI+wPY(s|@am>~8esKtZb{06(liyJYUIMvvHHfV1%fT^ zg0uZ9HN)w14L4N$m*`z(nhi~(%)_N_K~{ny30*_z5bJNA!pO%; zJTJQe+BwdlGAS-HN59kFJoL`#kJaIkmce0!`8dC6aggq6d(=}c(>v>6Y4ZwDh><}8 z^i;Eb(Nxa(lO6Wnx?i){w)JGGL5f=*=J7-eD3>9nC|FD2HrEQ_)W|#WDPd&)6oUs1c?Lay=^2Q?XfV&imfh6uf zcnr|<0{!bOQyBi`bho9Xuv#qk+!im}w#PE#5Ywaet^N05X~#-#8zcj>v!HqTp9Y|@ zv&)l$$*^VnVa3af{u|onR6UXn5|c<#-*1ZjE!=JwcSal24AQT&h4=}Owk|lzA#h~rS zPk-aCy%kl0*f0N->wY>)eYkjT&mm97dU+9$Mjtz~gbhzl9Mm^Jd+!B_rKfmrKgFzs zJ{_Fmwax5KTZo*V5lIRdQ5*!Ap;4HKYho@yW0)w2$w_!(T0{l1u~+} z0?`z1SG6lF4`d$&Wk~pyrOj(SzdEmd#rNfDouhaNPR#cTEJoOv1PtLtNBo%F(D!jy z^T}o#ykzhCu>ITDO1z#?CY(BPcEm?#dpOXD+)^_2b0T7-XA^AaA3W`mm34#&=OHqJ zGwawLZJB&vRBsRqV-ZCBUAe}V^+GcNRAb~6=~ADhJbL=u zMYS_OeZytu%hLZz9&9qe3Y?N>i_=;Y64?KS4*F!T^{L_~Eo}Lb z?&&L9Piy{;NYhgna6(h<3!9l)k*%v7V>!2^7E4CxE9>ND61^t71s!ipZpA`Q7lRM= zHM5_0A|oN9ClkiRgGJzzBpL>PdP4J*!Ak&Y5zUDg8+5Ur4t~M@2O$pEN`NR}i(ms3iRJ4;}a$>|q&NYQ`y)z*Nk5J=!?L z<%yhV3T7-j36SspjrT(ZJ*`zU=>?|@$vBH^U3&CEovL(zz$e+4nx7&3VRJki zAkL~0u;JIWT3W9|($=@#%jWMDa>shY|E^fHiyDaUIa=R>`pT0@({4;Y%Rn4>b>tRqpzJ)js`RI~m9?_BxN zfC+wctt4BNqn=T6GQOX-4?X-_^4&zJAiy`?npNwJLn#bMH>HnU z97Xq(Ye26LZtb^UbO4?#VgGIQ1%UL5B-B4W3klq!4!eH*E{E>*&mwf<$glz5F5y7C&8&XfV$^1*g0K5!JxwIYWecFpHj8%bh+Ojl5!mMQSXBG1v5O(LcYH^Qe}o_UK!52lXzL8RwQ4VEv6fbha!A( zE;D9mr?n7BPZjftSPp&;dC?*6i558}q59k0M>*nFITLWdt)P_Vx#o>FG;p8;FL!J0 z@^ZECYDlf7gYK#THLk;4u^9)W6Ds|R#;ZInB=`dL6oRrzlaUgutPhPxlS86=02s$d z*7d5jNeqaui}-Wy_m?vkyLXF)EE<#Smj47DOJ*NHzq(@K3~caJ*($lQz@naD{LuZ` zRWa+M(ujkp3L5+)(ZM)A22amv_JHE0_{>Ca^60=VzbJm(NNF#bUi8IBlj4!&yMtYJyX8ie-^>1I`J}1z11Lg0+HLx=<836jkt}bx< zlWdQiHs?q+w|Swra2G3Azfgj=)~oP*^X(!?cd6e*{nPlSjXjnlH)O=sw?UR5IDc)$ zEU&K*d_2w&TfR&JWL&|+!h~43lrBj#Q6^#z#PpuP6IjkSga`$LzpzH5@Y$Y;*v&`| zm{0W3sBMU1G}5W;9Bn@Xe4dDZ*bw(G5-5-4qn?}0VT2_HZ;s6%?QKH6yta&^PB)U! z_{F6^=RGICi-BNgvMb}Jacg3$nt+j;;R3Lsqh50~g2Ic>&v3I9hr|d&e7_D)uD-&G z4Twq0u9^skde{^y^8FyCxtRV^+}|6g=<5m0;S^9geeEnV6x?F`D|2C)JCs?QZVb zc5H7z=sGu`biJM7i0f1SC0Z!)Non|evBlE=$J1N5Mb&=a!^8kXcMsj&F?6Sr0t!Qk zbax5T%>dFeG>X#A(9M7}NQab!zyL}Ki0?d~-}id2>-+`h+-KiwueJ8tjefY2lhzTL z7E7$N2g0J=S#a8e$oEbdOJ1HB9lCH0;XwI*UGC*uvU&Mwmh2L##BHfHL#RzY_$}^1 zw*Yi!9#sXl+D(QhI`TbY86sg*2dxb&O?pwNBEX*aFf#yy;2bljLN7$d#%paH ztK-167TL8v5Y1_I4>p_WL}=i?4~J@mG<9hl%V^pOz^d>MOn{eQE#DbnlaY`nNw zFg}V4XU(FS=yd9eJw1p^9}RBs*=8hDpY^Z-TMq!2Tt4@W63j3{TV}skiHo9iBoXnV`KChl@ z;Q|JOP<0e60^GTTpG|deBsTZ(yZ37g%|;ronqdhw-lM!1-zi=auEy`^dgiU)a#1h_ zuaN;FZ|XvCv3)Y+=zXc&788eIZ_62nO9Js%aBW+=N9t-j9r^-@-L39-tf%oV{kh8ZkVZo z=-7CTjpvYuu|F=Ez*xt;w+9|ABufS8m)Cx|E$wh#j0L`{)xr#y z@>S0#5j2GigxQj_sk_U>Nz~$-zzvV{w>dCD=gU}NLHLt>pzA`6D*lp z1-Plip;;^#8)aRjZFyiEiAQZwm%_t6SdoX&QEK&5#mQblzNg@grd}{-4P);)>u?vb z$8U#2&^+Qp_Z%8Ulzh{`;QqX!Dvmy_yXtG^h{6AKttZMc@6$Ir*1y zziJT1aayw|TzU3uTjj8W=Z6F(ucs@;DS?uU94 zcHt=emon&%4Hm4RqgQ!{TE|PyE2AQ(Q#z2`Uu)FD!TJ#~SE3yKf=>5Lh0LSE&p$9h z3K9}&sUZi~5#~BZEn4rv-tV26Q_`hOucjlvwH}%5S%kB;=5$!&HC@n0u6o9H+^O%m z{J_QG()qj|&XKT>i8L5Qu2?7gT+ZyuJ-!vgQH0F&yLKM@o&?Ml-|<8icojCarlO}J zgU>ptkS!62dhZ88%e-or{DX zZ3i?+AxU731#tFxra)HQ4OR>TDsrWCx`fci7R5mv^?@RQ4`a&}Yx?gY0jNm#&&X%Q zX6&8Zq=($9DTRb(NB;z)o`zK1^agIPSRgVkNy#{Y+mA)HUYm`$zph=q9IkahkPemq zO7oMz-vxW!CpX;8f4GxjjQf5zP`e*AV>MHY!jAT(ZC`oZyr-?urEsud zXZ8S(jrPSTg&|t=qR7H1XeDi(*Ni#IWFae1E*wuUo~VDo57TW~A91Yy*W1rUHjhv$ z!p)EVj%0GgvmgZ){W~MjhSBF{T5WWiM{84(5w}2tC1leerVbR*|09gFC!E_TAVqy+ zX)b}YBzb2z(VvZ^(}jC*IYsT_gUE%2EN%uulI5@rgF{4_TR)MKs>1@6ISQD?LOJ$I zV77u_GW~^bR5;KD+iK7d#NNEc>*T`bW2?eZ=ldY$*V<@o+GcO{kIajnYOv~1Gp$5V z;>-4Vd%qa_$SVH+*2o#<&HaoHZvFVoPu%um@6^zPZB*Vi*+4WS1tQ}-RKe|)p))>@cv zz5D2E{BYP&cWv0~`~~!mb45%q^IT_>uxZxHY9?`kffe4{lPS<+HMc(eCD<;<@(F}p zQeeaE(mB`ICp@+}IT|{jhLw+Tuw`Y2TM}AWoRs@25o5Mx9;*|DN`eY)^)Y=+xMcqk z9X%Bmn3#16S3$~lm0r+%n`??Ve zo^ImBPr2Imxr;&TA&IMO8mKa)J#US3u;0*{LEat4YeB#Ik38?8UP+H7H!KEhAu+b< zdS5R()|iZXA#VA;sQ9v$W=c~zbl*19D}@}F5<9-akDd52J^8dSB8I5nNO!LlI8aho zV|%{^DlPd5cbdQxBX^vEq}Kr;dNVng%9fn*&P$<*<{;p?`qwsGx`_=EwK@hAV2VZ+ zVQGd523Ag1XN20Y8(ms@_7F+aTV|s+{gS`NBzgwa@Gzn>eWc2(bSXkLT-HB3IioU_ zu^nBPr9sTQ2W1z}2wpVyMR(|9^D4#J`V>IIF0$^YaeH7x2 zZzG>PqY`$U5pK8RyAgO5HDKBG->)@q&4sR_y?p~7|7V9wf|q|*+&p@$#nQ}4(;UGt z9%%z*(c_B)XFM|R{@AC>YyK7is$E}8@TD}ZEG=2B-8?RDPz(SPJv_7R^CzU>bLztP&v~$P#EyY*hfrl#@ z^U4&j4b;_{BW};zhn;stCijzny$ky`)b5x}tpkAWE922{&XJe-Vo}sgV!RY@>{9;9 z+&Emd>j|8E~_Mcd#Bu+WiRcC|!Cud3ARg zf^ErX*|HR(y8Hv)VRjWRbmV)~Y1%qJxN&&Zo%94esxm)nd1zt5>lE?rB>CJrnutqj zUCe2ruh!E+vQe41B9Bz2R~DuY!TMO*%T0Ve^w&#K4)}XO9s_O^(2N~SI+lUaZE$p+ z=o(I)K1Bs4?6(hrGbazPdlM}s7@D(=yh?QHzX&rn#+oYx#Pe@}7B4;|RKQkDjZ#BNR#rq>qXR0o&aDs;$Br+8rfHhgX) z)gkdV=Suw-^2?ZFFO8HQzv|M!AA_^}*eiLlk~Ik|o^=G9_irG(J1z9evOJ?TkYHeo zX4sP<_M(-IwCOc_R1T5y(Jy6yZ+UueC}_7mE%IMyBD!*7t?Qbl>!8_eB}hkTBipv!=e+<6Pah-o z!_0U19>tilwI7khB}iW?nN7HKt-l3+&|CiE@@&b>>`W%!qt&-L6nZD5Wz(SLLcTO2 zWu75Oo}#iP8d4K`7oA#;=u&+=JDHo)yX_>EFV}1HylhsY7=P^2NA-Zi@eRbU%-<|Z zmKsAgRE=kvb>o0y_spHdHWa&;>vrgGKNTElnf4ptC-~{aw#S=;NWdcI)sSY1Hl{r8 z0lW5l)F39#WEj!@H(^JP-OUzZ1RCPrrgYCA#ZIbs3Av6raq`(o)zy+m!sN&40wgPU zY=SBDDsKmNwyDOXgd#@<6Qw0OnDkPACWs9Y*oswwA&!1({U2DgWToks^#n&GqB^cH zeKVR0l%TfLe!Qq3Qb{z@;^&Rw*p?U(_yIxIkg9a|A@agn6fIIWp3Uut)^IHo)*^JS zEZ3C|-SQ$%x>*Ce>#tj~mi~guqc~Y{mQ`-(oq0C!a4OzC zW4LqJO@QuSHVUy7G{}qpu0;^IVRjb}l9A$5fBD1DZm-Ir&9wDfnDl|zJzGh&OW1;c zmy0gc>0>IwE`9GkyFQtUK?aS^1M6ZUNn!?^o*_vV62%VVbj}!nQ&Xn=xQnxYG5JP{FAt7vbAEL5H_xcudtP*Lvc@Xuwfa){ z+&)*@iu48q4*_>Wc7MUFT0n_+shR2Ohx=!R5w180wtr(3YM#XjeDn^iPj~2$J}``9{UPc;(Pr>5{}CV=Q1OCEN}lF^80oQT4bONBoexP zWJ@Qn9rW=F`QRfkoF(0@orqX(QF~0!PbmhjJmnWBz9XG2Wv1@4oS{m;4RfgatZ9~C zbNr{uIJ|;)5|_G04`iwSRkMWLz308ZjiCA&RanN&9~v2d1_WRZVS*oI9D~>rgGlxP37iOeLp zZ^ZSUof0+Mx_brWk-EjT#|**SE+8xPJL{t?zwa>i3(ezTd&%lM+w2(4-!=h$U7wi! z5rBD`igUW;(;o8J9|GPdHg^KTk+&O+Kx?rN+a8>CO!>(t@t=0?cX;3dZk)RTdXfL` zzW~=;>3BQ9NH4ozSuf{scd5`f+_7a0i(2sp#CJYwDynIam z5LMjVba8V1_R$m)VXcdI+1rA4e$?F_`zk22a*(gHxOmPnq%3KGyz{o0o%9=rkEK+c zMBCU1u5f6+P9`0;WYia~@eM*&7}U5+zBplC0bpI_RGQ>>PjC!r7cu?&cR0{A(CiP; z7ng3?Wh35$%w?h|WZeG;qwDMa713LMo|ImTilCW?#!^%YIGlm%bKA7YtjJ0%WaLbV zY2#NPzu&@l{AHR0xlM(HTAx$X=iZr_6e{C&KErDk%-;?ulsCNZUJ;6Lr3`iBO7V3mpoqdUoTk^Y^gmqgLD$; z;IJ^oLP{ThhTQ>cti*P(=l~>%Guj0HZdaXYBA1u$ty9C>!i*THd>6jtm+#plGAj7u zqB~$6>SZ82I9`+`CQ2GQR>g{9VhZ^d0|h-mk-ZkL+@scOlP&Z>6D1 zyhRbbBG4i%jK=+-?$W~plef~myHVbXPrTzy`ma?1Uh+D)h@liMxiRSAUl_OCSI&}& zBxQRI@vwh1_wvA>O}nvHjvTXMj}* z>qs=yXl#-~Q<;I+iU|hz9gAKZH_Wp`*3}D8(vF_~{ziFFA?x{`2 zFNde;YRuHOlI{P9U?RfVod2sP)p@l&Z|2 zfkE5(dDC3~1`c&COv#WiMRd)P?eGpPqv1j1SZ(Je+em&GAQa~_PLh`<7WL<1)Bx%X z)ot$D-i0BhX9VX>*wW#?bWOxUB)dc;AimsD(~eE!4Ad;hI_KwFUslrB;;c&qED0y7 z!pnr{6CrFKCt5O|cs^;9DpbmaF8}=47ygK#=+mHUt)Qv1q zpk*cPJHyx9$l>@Bxf}sB(jaAKMC3k!Z<)WL3oN2z2BQ!q&M4sc(iRVHBtPp+6J>Mu zAz|b177{ZuKuI6dQs3IMVZmz5QXqdPhJU=o?793=flNR`6`9jrM zFdUwp$doL4L5{vMgDP!@oAdw|sZ0E0%W;1>mZNI!7dxA^a*q)6n0GlFqcc)?Kq|2d z&JSCPas)zysu!YB6bwnZ8=NQRqE?&ZgTKrCE2tUyclqChL3QbjHAhss9F+rW@=VhOluV8k@E%?;XL>LG0O-+ z&1ITaQ`^m5JRQw;vs9Tp;QW-F8|oJ!XV1%IKNi|^;JCYI`wPx9eqh5iSqPk!nyuljH1Mo91#VP z-%#0SpBB=413S?=-(aAg4gf~S=T=oxCFa23BHV6jzxaRiTR>}BVB$K0IqW;dXDyyC zuDKh)aN_GhwjFR6*V`pM)%VF5u^BAf&r{V|hCqZA>TZR}xGLIj&=^NzzeJBU8>^Mt zAkF^pzasx&Km#A{+0q!;m9kdO3x^T_k;s6&7oC735jhxuAqkt(ox z&`XF7BMlgUVt76?;|EUoUbe_Feg8f^qFDcN&wAYZPJo-_Twd;S>93qsaL~5D0b00L zB0>lY9As@8K@A8K;`P{#mqP6@Dg%1r&tLM&(PZmz$%)BBb5CyeethWpyy8Q0djnD) z|6&}3^u<+dicPmU@wXz|`cb(P)`r*j*(pCOLg&L{7JF=&Fc>Ih9A!{MmlDdu0`Rv5 zSk47ytIcTfE5C%Tb>4`JfU*G)PqwHF-)A)8<+yWQlhRRYGJ0?;J4L@&wi7TJU5Up) zVMGK%>6TsO5p(QImr_j9FZLgXk!47bs-^Y{TWxqvj!4Ja=>k!uSi=&y7P-k$%GN^-78Z% z%!t{;u?x+^m35w&vA2y#Rkb_^-Dc9Gzc-ZZOzI z^Nt^>PX{Pgk0xog1(l^JU<==zWU%_$pPtdMn^KV(k}Ai#t+ z1LpK9Udo85>uQ+wPOkq`mW44dMN|F3FlZ}WoH2kdS=Ms2wBeS0qp+J|W*Iry z6~=Xuxk0Lk1)Gv8Dp?^ z!(Rw9Hm+wq&@K4>7L)`jBGk8wwF%yW9I1JgQpuCm&h4IiBddff7d4YDV>sgkA?#{i zmo_<6M>Gd3ya++lIxZAl=XUNpcIBfU7ylb4kDU3iO0B6GgbQs;Xl_*doc3w`)OAU3)D0wK*T^u^7SDH7%oLMHOt%-IwipMR&38ut@-IO zp&H`=$Sa(4eVQ3~ z9L0+VQ5GjK8P8uRB-;o|;r{3_gy*Yz8D+(^+b>_ZYKw$x>mnxbt%5@C#2NXwBIZjM z47cnlirN^HxSrpac3TBfEFGmpX~-LD7~H_n&MPsg?rNEFg1m|Q>?`;3J0y_LEE1Zw z$_o&2ZTm#e-tvuzN#6bF?`syQB*+Fh0B!PuzUb6Ez z?V@Z3In?opQ=)^4l6@^X#{{-)vNxO06NWeQgehX@e22Z=zGQIgrwx=}(ag#JaMvLS z*MbhZVl<*CJQI=etd^{9kG`4_(ONMR9YU;PSWMcwMap~D?=}lpHks!y? zDvKbIF_YL1iUpp8RT(N}*SPIpgH~RJYq-$8^&vYw{iu#7cxMY!lqrGI-P%CHrZkM% zgW~K16@VA_YtblRkJMrmSf`^E z>pd`*{7cj0o5?-`z^o{VhNV5gJpmmlhXu)TH9TZ+sw;9V+`hJ9)3UpDL9zUh4VZZb z6B*MA9b(u2OmYZ>`0A_-&HZC0$U3piaGYzIp&^{>Gk`vh4A2TNW_^Y48?cmsq7)(_ z!>_~u1!wW!2M8}@8W=sUm;zo;8BNkEP~7{Ul$h3b9@%U#;OEp1wpoTYI9(e3AA6{X z<130GV1WV7f%L=7PaXVi%=o&VgRP);yDKBSHprCEVu;x2Y|{5ap$0` zhbQEf9NLra!$K4BBh|Iac2hWt_eUifzFnzex%l9YG1A~5EKwJa<^ExJvJ70twWms_ zh4ModP#?sj1kyBPyUTQJzB$f>y+bF1;3C>&YFclm2|i#oWDv*s_J8L~Xau0Nd1&^s z@_pHbAat9Z6N3X_vHbU~x2!Z;8aeAFs}N&0)}?p{5K%7dnKki-`(+y`xJQGvSy{K@ z?J^1O_a)8U!0Xbg@_5(#IBt(Ey1)nI<3=yTE^*!%M!n)P6{Jf|6@n1Wg2Hotw>zon0opyJ1VM z=9CB0R?u3XvWe((tX9SB{PbphLSJnHKiSFzct=HHCTWi|fyxq5^!KJGxOly+;4~6_1`Gqt z5%=Oh;Ge({Fb`CTLqBw+8FI800@Q-k>ThHIt}F>NmBdfESJ|m-dN%Yj74~`Zd8k81 z7GQ5E7SO!8Bq?rp*$k;hu(UAMRxzQ3Ra$ABdC4QL7&3w%4NU3*MFJ^ErQ+Ja&Ln~v{Dg*Fwvlnh5i9Boxvxw!Wp54q4E4zKYJm(QL|cTZB=_x| zV-IDLNw^0d%kFWqse}d<-wBrKq^Nkmc}Bf=5b&zk=G&NacfFoovt z1%c;6vz4I9fMkwHOQN9-d#MVDkJ>JngABM!2D8`l$-$pMc^XotUd0rGq0G&y7xHj? z>VVqFiMm$l#&Fy?zq1IL#a{K)HUHVbSzwJ-JE89Z|7e5)=A2RAm;d~hf9++I#wd!H z-;o?-xydgKw8ysak%8C=fNd10Q3Ty*t zK@?iIC!h4T1nULZl<2OB(25iwSl>(u-!1qH3LT~5H+K&B3R>)74;7Tmx>{KWO`c)J zC!X1YQ%+WB2W^dH;WMm3pzlOn_fn%fjMt65CK4(2mmCh_o-vrl8Z4`piCp=(LFq*i zO~c$9Nd%+rZQ^QJi64B^jGWN43Ayr;|L~7#qdY!o75+@34ZsPbw?IY&cDbAcnH1|^ zT=vs+zYE|zF3~SjPo>?*KX7p$pqp$<>~qYppk;Bj6{!&5zg<`M7xj@T8X;rOTYy*C zsTpf63PxJTaUo-#%NSBJEu*cH8e>jd6g;VPY|%;$B__mKSD>gAJC1Qz`T(|zBjfm>6A+t1I>4Vx7p)r*mvfvqh6K1pU-FUBq` z6YiK-({9kUN0!?WjM6B)tt>5;g)$v^rMP9 z%Rv;bzGLZ=6(QqJ7IP!@I>;`4K}X6%58uZvb|Dr_g_!XEg^8HJUFK~+{S`nxA%~I< zrK)rJjD%$HszK3^s7wJeZCoPB1e2Gn^FJw~^chAL%O7^a#we(7J%`3k@P$41m1rcK zBkr$HN-T@->;{&uE@dw*$8Np*4ikWD7 zguXQ~wd5on;S?A-gfZtTQEjX8+X}V#0--~J12#d^$2hmg^4sEH#Q5WAcV8A`OKbrw`EE==i=hg^F(Y1F^kkkKv| zexGFsG%89(Hm(V647((!P3y7h?`ug`O0eFZEU73BtpS%kBaR#hNfv4p$_kcL-G1L| zIem%WC&Jc3Zs2(rrjl$8kd$gnr7JCui@L=>3T|e6D-|1DZ&PjYrXKb?PRi3OB>5is z?GpoQ0WE8Vt=--77vf^<)NS<>D}TD}*HfKdUrgweWLj-4+a>vbev3pEi-!A8R5g87 zxYa_g1CQtaUUy6q4bAuME4mH7HMZn0mn0+XQcW*vmT}R~;#vHkG+x|U4Xi^bi+*sF zi^^jQ0q1%B`F%P~J2U~^{FW!MrR#fcg{#a89LsdO>Wz3Gb^`A*_gq<@?irSe3BqH> zX{{eY;OEc5aUDT8u7*(d!5eXv$+V$=!z_28Rm`;LPhMMHm?xEb5!%%UPV;buHGhw^ z@n%O`1rsk(6ewP;XRttIPj&1Mi3qPH{UGB9?LPnhaGz?R)cDg3T2(_UINC zzUJ*DVP>sO%Ss#Z0H7=u4433j=WYmlH95lT&5$U_To@biDFBgZ_?(5lGHn81cF0rR z8p6tKmuLL!9CvwD9%UaUCX*ug&sH(l$Z~!Jd2?DE$u3CNt$OBSpO^enmduQrIN}y& z1sAX7+u#g{d3Zw($=jko{Nxw^7Y=QpSwn@zklqB=C#&|*?;2Q#ot~Gc)sFf%e)5;7 zk*tdQfsOK14z$x4|2@xJX%W=pFG{4L1~XQSWRd|-RlH?)ECpc0Uf;>cNH!vmdG;R2+?*J@98J0>_ z{TTn#lw=JJ_-r?&AUz#R3B#9c^v8mqEG34P0IAQ(K>4Un&X5GxEx??>2i6)BF+iKh zaQ2OWcWXJR3hPwQV)uqLF-zkTNYUOna z*Z$ssFj)N}1$DKAX1cOa1#xjaef8~jZ>?DPGrggDsro&{qu-8?gRtG~qJq>~6Y4xc zKrbzs@7N}tE$fM2E26w5-aeq^Dgm-dQ?PqCC>nHY{nx+(8O1h_a^b(Xq{KLQefo`= z`i(cpOrIfc<}&O;ritF;Az=I4Jt58ab|$*nK-bM)i8y_l)ZhtfyNwucr|(~ZgjFV* zJwpG`hv*hjrkMXhHJ-`2Hb@;+mq9E=vCcH&^GLmHI?T=9iyfS>B5AS1*}6bMWD4{? z#MWIIo3wQgHAO2_8H=j3{SpcGzo|}^Pqaa`sMz3GiGh+`Z* zLplajsG8D7B0Q=|`W;56jht>Oi9oK^=dw$q5z5D4;iSK6|D!+(BuqEB-p&BMPjh+k zZavw{b^~O>zv>UkTHwer_5q~m3${agB)LyF@Lz@9vm`39&Q(Z}rG~P6(bZ=UIEsof zJtO(vf<<=qfu)1xi?SGd#xA|My10A%2`%f3KFX*MJ-F|D6*6njE|pT7f@{R`L{ ztoZI0T?P2V8LtUD+;+^F=1k()lt!^<>1GprA= zyrP-KAwSeZz>mpiYr90~mg^EVzP}~>Ti>VA?Ae!r5~J9051v4iC_|hMy30R?)kbwF z^K@d##M~$qktD#oP4WW(+uUpok0)C)ov+4*ubo86(bbL!jQENhSdDcGn0+;r0ktn7 z&#yTh{OHQdFTgAtO2-xGIRt%W*Wl^n2`k*9Od1#1k@*Ogb8L^D*=4+-$m!TJcy>;7 z+aXWd)TC(Co~kz5`(;c{j{a4})!zkmTC!S{TY%<(>LwnM;^D=hPlDjk!)}imDapau z*Sq$N+bndoH9P#Uve2V&bL)(;P?Xx(W+}k$ZbFDp&^H46^xei|&r`&@o{n?*FJAdc zShTbIhn&`$!fCfJ zYz-3$rb62P9mH>S(_+d6oT~xpje~n>F0sdjXIqv&+{f;gAz?;4$GkbA2tY z#}#8lSt*-=LJ+~%hg1#kG*bAgJrGa!29dfX?={s=^XHx+eYruP>4cW0+ylR2QA7<- zAQQN<`;(rzM%f+k?TPLQz_9auQB^L|)Tman#VtAE+?@5UnzKS9p=K$4dO_1FGiS_c z0ezf7Ms=}CUi3q&vIaR@g`|Xv(eEWKmnFI{_wFSw->AM2uCo}{W0rjgQ1RL`1tf;} zoqZasS*A+VkWX(9k!RGz*;dw;`FifKXXqhnRWZ8vkR?5rc5Uy$YURkaEzy3XllC$3 z{o2S^5`^$Avmh{yOhw^M>#zH0xXoOrF23(iQ!8cGXp{BMWM$}xhiTha`_RrLi~$Hp zIvWj2F8-q8McX9Uob7$Bk7L^4j9XvBn5A3;CJOl>8ts#XD}0GtoZJ#}1X6_EPPtQx zMMy0}1C$p=uMN+ug=SO2m#F|g_txPo|C=J9%*&j}E~buL?TcGVZDGpQ=0bX7 zpv;Sw!iHebpefu-LEG^OMH(M3(>D1EXFwG$Zg@ z^s7@pPYSVSc!gqJyfx`+-4Bt-pe%}{$}c;gwUYbAqB1c4i8F|OrWy#FEZSI^#Z+<( zbtxogHEpNj#=a~7S5pbn*J~I&X#57J916X4>)AX=fm<$bVqQnJ?&j2bH(Od%1iB|v z7}>7hz}L&zkaPi~siva_wEh}R$~YAgF7Y+ywWU>yWFprV{kZ}W0J+9Rg7iCL%nGSv zXo0Wkc5gE#Zync;tt}qX_o1$Wrkf?<$Kcuwa2x)~%HEWp*O~PyE4)~9yfi4CBqsDS z60RSTPLmR^&2lvvyUkMj{cw2~!z)cmzu>BWwHjik*Y2MyiSkGLZF8a*;( z6KU`iq7i?c{(wXG`1joDX))L7&vmZwqt5?pZZi4)iT69(b16+1ZBJV9pHbWZymZDW zex<#yZZ-k43|Q?MQI6y3c#oc>AtzqWwSq<$0?0Lrh*=W<+ z0V!5u(b0vmUf;jEgKQo52&61HHUuVZ+&c*zexoATW~mzJmN0HIQ+9;M)yABSq+rEc z)VYU5QOmHWmeXXuWNhXfC4uuXjE%;Z$%B~_8E|*9_icJgGRhEabcS5+M2IZtN%wy5 zk$^mpScIhR+u2#)&=d07`*k`x^wu*jx`%G)TSX*V$Mut18{xruOUfkn~dJdu=*&h)WDwcO}oxYaaBJ3VjuNrT+vK$L~pd)f~QK`YaMKv_Qx?L#8&vsp&sf|h}34R@~s<~sOuvkggPs!t|* z(6E>tJw;!Y;J)=1j9!E)VuTwL`yzm(F3f0wLqA|_}3Y4FRD{=zr z$;vMEvJ=c!$Ado5CTmu4zo^K3k+J)#Q@`I-j|9<~OTym9H0wJ$-y2|tbKs{8wFpFw zm35iX?n|2r?v-WATn;SIde?~#uN1J&4PgAY750~Lf{0?&MdkykOB>VHLx56m2yFnA z7K(dCPbcXLy(#Rpxtq16`Bu#(LrYgOuxwqv_5CT%0pR0a6_$Fl*r&XH{`9}PjGET_ zhwd9dmuLJo0^EUpAZ@p(hv`cMnKiTJv(bA~yY@1iTkMyJ?BWgE7>Yv?<*vH_#(Q z<0i5g;o@D2aF1{j3z#2lt(QAjRvS5Q{HxR0{(i7|CnSF=`Xx=E@We*-VeRF58JBoYrs4;#qoaDLuHxA<76%JtugeSILhcOklG7x7Q5 zQ@?2LW`P1DUwlp9>o=<+;Y?=vW&bK|?1Ut9kH7Uk`Q)a{JT6vks&})mP*y&{$X~|t z%Z6oXIix(geh5kfUKRJ#xjKL z>DBK9Nxva0A}oL=g=b!j1+fSsZj z$|cY@N2&BSttgb_1kC8 z0y-Joqb(zePtSq7KL@_SiEjK{BYNbo8x|@UQJ5gs|IEe4zku%LTqkx;3wyfjG}^7i zCy9GH}-04Pq4Csi$6tF>Ky+u)>&cy_tq{zGOvoX+xQ9YzA{KKwb-?0oiifphXX923deqD0H|-+1OAdM8WF$ z%eZB7)7_CH`ye?d#;=|F1GP{)uj(_etl7(3nUukyHb3|Bj366viXQ?vCBr3LN!K0c zt`-p2Z)B?>*jfv&Nq2D}37^e~2U=YQ+V$8Vl0TzjB&rSl28e#lg>!#Athh+RNg8}K z7!>iWdMT%ysB8}bSaBe>?ae{*Vul#|cYpq%xqB-YA2A}vM~+X^h$wK0%~32SO!87$ z>NrvvCEkF95RE?LdTmDqQpy3y$r8psfy;8tmYH?QT<$y7iJ#U36}E&|9!AtXS3gU1-TzN8{D*b`dIRun zN<&St%jegk#Ed(bZQ4tEKJKl_RCXRNJ(W&^_!r#0s73r+a*6Rep(nA`1c zK#b)SrK=lU1BSdo* z;sXZx$zO(rpO1vqsV;kyH008Pw3x+V6B&E9sZDu&+=*=I$w19;FJX^)G$S%!%D}zo z7>-B*U-J`mVjW6n!~YtvmT8Da4au@;HS_kn95vxwEwUc%@=N~62u?0i`;jl)f_lu% z-pV)cDY=n4ULU_>qGaZs5PUm`>l#(?)EaAX$(OM=Bwyo6#-2kGDvfjY2JTQRCxawC zuJhyOw-zqlw%@*hLXzG$CVK~t(sf&Q(x2y^BOdH=E{2*^gSvhJdCeF{&sHtc!6CTw z*ps8Jw#k=XzZ_nqtVbjb=%VWKvn={Fma&I_D_s+J-1V*J4_!(doJf`d3G}G0Pz)Bh zMd?Qs-A1DdIC~6yn<7wGWg`I}aLYP^N4Yj{^iLiklWB0&dh7oVxixeB^8@w2nc(S3 zaArfG*zdyDCGQ$2#3ZzR$>mvxrh5{|a;&LoCo2(*NO>mh(R6kM}>W zAR#3oUDDDyU?8C)h`&}Sn~~Dp-BP1lI{fbS{(XLbY=7)L z&)Lq-J@?+neLU{tig?K0T|zw{qyJL*r2FVF#@=X-7ZSn2|Giz!TlUP-@qH%#<*df} z2B%@748UYsiNxinb^dhsK_1c&y20AqOZShZ%E6F8SeW329Mi|u4OL4Iy`7mIXK~Sv z>aLa}37;Tk-H=NeLE?ZZ6I(}*R>;eo+4nYf7#-X*pcl|h}Pi^|%7yK93r`eBL3a87Z9OOMz2Ux4H z6=#t=+BlV2GAh~~#WN+#$WCYmPm9WpQb*!D(7TxH*fW^CMYmyU@xw z9?!kIZQdaCSKi-@9$CDl^!;q=&U1u#MH3yx?czAiRsx&tzQa|$MH;r1%7RYD1Ig3L z{1YLLcX-joJs0+Gb@vUeJUwGJ{=5x|rOrbcI8VIoX7Q$taz9YVEIjGG6G-)GHPY(x z6Ut^;cORoTu&@1ZnZquspNO^a2)4m ze5rxuAWFu5+C9rIOGYBz--(LHd&e+IyL%w!+6MpA?l(Jg%fQk|(ZM2;kM>%|5m-xy ztNA4!@gNwXX zs=0IhU+a3f+6I)$v3kxQz0_u0!deD5zgPX|bA?`RS0Zs*_Z+RrHl!{{cyEQ+sR%#_8X9N(am654XI zIfXcxFdtU^N^+PeM$*VfxZn!HVFaG`UqiKVWaKb^J>_;4CyvG(r58OSg;3o^)$z zxA;|4X6iC*5!2A%;R)ZAH1+rUy7?sIWIq1zDl79_Mpo_7M--OJ^n+>i!^3)_bz{x^d?T=Sq5oH- z$^2A9o;>CCr|WP@l^6=fSMSzk#yES;3xUn48mJ?qyToiuROs2GwNR~_w?pt9m~Gs&xk;vLt$=zvo|>4x*yv|3O9a z%Fdj!o}DX%qhpAAf{S=wd}OA02@NBA%q{7F>#{+CeI4ti)3{p;L3S0$t9ZP_*q7w>}>0usdfYfmo?PGbS?c zz_ZMu2Nw(-QsYZ&U%}8Tmw9);7hd04L0re`ir7u1w9P!ROF7X9R(F<-gJik`f#~&q z()lYpfA$tDnxnPZ)7#6d&D+~8iWWJ)w&4tgKR2rpJ|63I%O%F`Yogk9vnWPeqa8ca zur)_!>Fmmt&*gxxq|A8k@~J!Pntc$~82XB+Hry06+*PVJdVg)F*Vl-0z<5Bu4_w_P zaZmn)D(YCnhG?0_2I|dXD%~8tt4d_wUF}oyn@4L?N;}Gh<0}8WE?h?MVlmDrQsIb| z?czG$s0trg-T%6)i!{6A5yI#016lF?mn~~4B(@Uog$QxYHo&Z{GILRQm~t$K5DDb;A~VS8twlX zjk24X`A3GZkJfnz`9!@wML@hh^|)<{g1>fcy*v{2>=)cIH3SIQV4zq2X3rv!84*gz zCg78X{YZwkSotbYlDtOw^Yd96mfj)K-B8FS%WmFZj*p>I-rUvf+i4}7pu@qX701Vi zCSR?a&jn6uY&`jGr#uRZ!PPK^iEqptkJRHIA;fRuPF)`4ZIZBGaQL6tJ{c29lqhEG z=5{wb>`8F=3mupnVi|CPwGSxcpz#wLi&46aJIJY#kb*Ne^?b+Hw;q-_OoeN<7x?#N zlaHN6Z9=iZk&e;8pMhvCoR->M`ifsc%o(JPzwap`XQ@Zt`k83g zMD28qqQ`j`DSH>ce}d%{^i5?M$+(5~$3fwKvf}B&69g`PC^Jxt4Jcz8VR}DbS1K8* zH(7{N*PUbV0_&ms{OtzJM68x5uC5SeR2lavJ*n@sO+7tzc-8RSJlryA(4TQfFDDHKU8#B2Nrdtga(tp`jNROoI$aEZ&N5`! zTYb#x;=O8=-q@0wk)U$S?kcO$vA>ci$8&Y+%;3LAYxQPtb87EwAzeN~SUC#go@ZiI zIG+lK2%iY1sscRzAd}>7ij8J>=aB8p*9iL)^@@#%#ckvHUfKGfd6o0y{gw6?(te@* zy#(=T0dE=0;N@HbQJg~fP{VsL+i?L819nTaean5TEBOJN1+Ny+4K*6!eI9Xp?_MQ|mN(7%Hd$L3~wvf-cOi2q->)Xb&QYgVuUxu=ZY7Sxs zh)7E;P|Z-ftR{<=q6ts!UVe{hG`U?{CjLbwEBf^7dl4tXH*u?10ds$M9tSKmQ#3m; zE_?}J!y%iHH#8f)sglR5RY#zq3Abrhv$Ac~u6I+?#+ zM+uB%%OYjzdC+Ny@Ljv^jrMo)`V$0^pAU4eRS#@tv^9%z}MBpEKs zo<$1tv0Zq+6q6#3uclbEP2#;xPT=ddD%s?5K64$IrZZ7}>P<|mn7}on8CV2! zAb6sWIt$hoz6&c&$43*7@Qs|?m+;&L*AexA%?|8W*#z|{$>6HgFLYjkBKz(detku0 zp$F>TJ04DIQ$T?fHG%Oz`LXJ_q^WSu^E)X6%9#wQd4O%Uhi_NaUmK$a-EVgDArB)N z$6FUkSs~1k#p-qrcHe4q*anM9>{9g6h_Tk^vKlup`v^|~Yg(`17 zgcGXZ>+Q-3jaeeoBjL4-vm#B+q}ukoberZ~Z)rI~fDGhYAA87oI6?^5@q1l92eJ9? zlWsXeg3@d7|JDMmzC=EzG8*{Q&>V%g&-D1Tw7*qV5GYv!R0#pBT;}WU5q<0pNnhGS zio^_5pQ2rTXfud0Fq6r8!>(Z3kd zT+;#(J*fb>-2CN*VI`cjIrbykp*Qk?u$x|<=bDMak2g+I)jWNEdC08D@_e{=qLl<@+&&&y(nLv z;nf07{vt?v;Eaj@?X&uM>hlfEp1t-1h;TK^F0?QZ@+PWr09*}DY@FJ-#5K~%f}==# z`H|jk#i?!B?$k&Z`_d6PX4Hj$+NT7C2yD*OcRHlpkQH{3V47GQlg5TpRQG+6bH$`< zvb8qO{7&@~7uiXbq-TN}`A+6a+E8u7ndH%TopVUt1bhaJVKU>$I~FI)g6>rL>n+g> zO;K7JaO}H*H*a`H-ZTZGMMx3mCojoqibQC$!M|XUp=K#Ym2XP4kP&m_w+t8yeoU?p^AS?ej(?W?tWCt>CovAxT*2%qoINYw;L^q8;|1$VM=8W_Ijt+ zx^AwPE@}{rR5kfXlBnjhnvw1Vu;XIr!FUYzTeY3e*u4{2uTF8EBN-KcCbV*D?Dmzg zX@u?SB_6Su%#}PL_T5jK9SQWW34oAg8`kRF zYsN!$ZK#)*H_7;S0-RTxB^t!6LGNhUq2%eHjLVN`ZG2`aEKJn5$YEqUfP^Qe$7sk7S3#f0Dn;qEcid~Gap=140BW8In8#&X2`w^ao-#d-34)^y;-oj}H z*}2Tf^LB1xVB4VbpW=ywFX|j2iQYq`b(>=`!c2@OBPDFn%qb_C?hqEh?$FvfPJ{a* zdT&1JR3jNt?1EtNs@*8$-uIl#6uf9OgsZ_TVbGEZJ7u&jE>W6&JVrkvi{)%~b3Wwm z-Y@mjg`k+O&pR#GN1YjtY#=E5xR*I(F>Mz)A6K6B(6QNkCF9vC~drl4gGVRFY%8+*NKc- z>a4sbKgJGBz!B1Ax0W@-dTOtfMV4C_o!snNCxix(V~dHZauD&VEGgrrrla$!oSHP= zYCQWh!ALuMD2P~=*sxE_yrlXEj*+#%H#?{u>i+`sA1!9x?N`=)e~%F!Ca@|NtzmAy zM}D*)8f8;xRI9a5jt#?U5!zcKOj}s!f}(SeVc>MB&Fd|OE8i(S3Fd_917wkGEpNgs%=-PuLz zE{90%&WRM{QfDzm5>^!`XBxXH*C&fj^(SiqiXS_RWz|{(>XYu&6!l0IY!M+1`XWP9 zp~vw3syUmYJ@8j%s(F{4yL79@`N(et%x^PB0=}s(zNOBGF>SS<9FT^l0FvU%cX?&1 zUNa`$ypsRoWLs!AO=Sd*R38WJJj@#2#Ulsy;-DoCHglb&#A9u@c^iA)Zkm87rA|OD zQY{ul=Rb`+49Gol{ye=HwmDTiXoye$J=n-ulB%}ZHYqWbbGYKr@$MauW_I0cDIz(> z4-TgBVzM4Xvfl8{V##SEC}MFmLN?0nvL;t}c?#CPC^LvQ$`jq(0sQ&UuDk%l)?r4e zH9I*cmL8~)TXDNVqT$oJY3>4DN6dOhee>NSIUH3^ds!exp&Aj$3H)nG&s{N9G6(8zZs~~IZy17o^tC|4_jn}@ZuvJo7 zz4am7H;x9RK`ZKVunH4H@x1aVPmLmjz1^N`nA;4?Ox&ei)7y+~l`aB5PW8jq8F7?6Z%Yor$BzX|p>MKz`_sD=?vyYE5c<80{)zksU$b zzHv?-mJ!c;w->nuwNzv^cDsh?*_Jhlwlk~KS=#pKf8A*WPp6W%a5E+NzrIdwwi?`d ziIGj~@oNyD9dC#cXz5RAb~6}X3NHIyvzI0wyD$SVie4TLx+Q6T-nU`{Lm3r-FFXoEeDdF;2uT`y(u~4b#qh<%T|nA8;uz-)OZV>NabLbEq5~WU;RqP z;oFz8?(-sgudLeYAc}2w%l#yJKU-Y{TmpBX%?b0a`|gUA%>%*NjtRNK2%Amx>6G$}j4o~w674T#22 zoe$l7F5|V-m(FHAJlpS>FxjVDt|Wae1ISY8zpipv2gzxA8>I=9*GP6vjm5~wST^E0 zG@mC>XTfEtif4YN74xPs32bedfxNN90mH2n{N4Y;I(GD*R2GgySS`HE z-K$(}x_kXhGPuN2&8n;sga4|1BHy&AF}HE4!t+GK<59!Xj`FQ6v#Mtcf7s!f+0A8? z63H&`yYB9*m4+F zSn4Bc9!YSyo8h*3PjkN&sclRX&mhFuJSL*XBA+zw&q(|Ns8(LbSDHPTMR>jPg&P85@?hK%bHS z@^c|N-7n@VI?RXnk3aI~RDTZP!Xsz29o&>bbHd$Z$7qq~v-kHOMH}Vos_uNI8`*YQ zuG2*Eb-KxY8Uc%Gh}i`pRca>YTvzX>Noq7PA~2lerdw6$c;YI}o%HlC1uj9a*u(K3 zsUgg7OUIL+3Y*5gfW-Wn42-Y#1?si{RGQ`yzZ^X%8_qebf0M7~fi^FBSmP_~fq5LS zuoIi^Szp;lP7Tr=yz$?OP(v)s{dld346(YqZziv6Q{Y90|8xOk?yApnPv-I=8$I*j zmw);Rw}g05yB7$p2l?vaEAn(>cwF#8Kxm zMMVQ;Wg_hhZA`Li;yZ>6qYGW%YtD58C5h*@*BAPb=kB?#u3~vXSz*72KG!5%%VXJq ztnLMc(7CT*e)soT&J@&I9Pm*sijI8Cx;afiHe5*vIg^OgE`Hl~AA%l9L`IO5&d{@i z-lVhg4=>i4GpDo#uHTpSWw5^fd+p|6B$G016TLdp(4?9=8rD%O<7@>dkc@N~#Ba&P zDKjkE-f9hZhcRF<#K|;O&NePksf6kaGcb?vD{mv;`8TsNkB zd-9-px9ZcpUj0t!P4rBf`j3URW7p~+V%2>}gW*@u6xXLVVS|2(3 z;cF6$SD$k~nbg^vRfo}X!ny2NZQZ-xlh=nVSQGb}ie$6_D|wMuES};^?6z|$RvPK* zn2s>3w_}{Va9O)K9Z=JaBzBD>uGyJvmY?>+Gyh%dlr`yE1Y_cp1I%^r>xCC?Iw@q} z-B-d~EMw#zTK5etzuc8nQJ?lg?D^wvr>nO6+k#Qs44dR-9Op z31$dh#b}7<9c_=iY#h(RVuQ<(JUiyO>5JbD3F7HPQ!|E17WNLG%UwtZ)FU6cVrGaj zJNk5g9Ici3q2d9l^!vr?A4|o52895rsbpm6#zvJ}aKHS2VCyB8B;A^L3jMyID;@FU z#-eHzP3|aX^p~FlQBDLu(NAqltp|bgltaK01T+H$*xt#5P_>8?B~rqucM zG|zsTkktVF@8gR*;MMWdu|Qg_TZ1Ye#eHn=`r^sSnXKa0snozm`nocTFACV3wII+u zFudyGS092_K?ll!pRtXKc*sQZptpUvoW1!}1mVjbdE%E`QYow(myrwiVy4gZxl7%6 z6NO7L$4787kD+X5!3$~H4;OHud+{OW#XirM!&k9uaH)vh+cr2{HJ1ri1Wi$CZ8Itxv<0B1Jn1f$n(_~&AomIh~WWuMPA z#NNt@!k_l^dLAD{K1Ipt*DATl2&H}tHKPpDE%WbvA?Ys>G_t*xL_3lpx^FmIs%1Rq zT|Y808!~rJQ#XUOaD+XJDGZ4<2dHb1j2I+aKplf4s`1M(t-*0!pix!AQ8<1pk?W5i#aeMQq$o2BT*lXvJxhj?DqkzPBn=BcFE+Z}KP_=#fx! z@n>8zQ10P!y$~R53zDG`l&q@=dr$SsdphA}QGanMY;r$UpZB@ZSX(+evglK70q#J z)6||?b3K;(jE(`{+U}`oF3UMJKtxSM&(K!KrJ=8~2P!yr)E<>d#(+#GWAd zMDlWtTKb09QvwA9!TC4!a2?S8=C!`YG)?w#nM8ayE$DRJUS6|=_UO`3=t(JtaIeCX zv(DRx7s4|9#|8aDCG(ys*hl*4fN zWzF-HQsT-_zm#!^`3ha|Vo_V0>3kUSg~eX=b$72f;*NmM>%$ZK-Po47Z%ntuh&a8Q z9y=^et+I~&k0zp?pj6BF8hhp|!^Q*a;({Q&i=|WjZ{n#L)$M2au#yi#OyJwti^4SG z&2spvey;nr`XT<=N6elga~kjfqb!Z2x8M&QR~;C%H?!wcK`$%YhQy}0v2{|nz4|qy(X4dtGF8hxs=_LVxzE6ANc!>@TH1}u zYHUC$_F!;6{2w=3s06Mf#9hxms%5UEtn>6${;#iZRllVcnz*Lmc`~*K&QLOUNj_ZE z1^#o`w;&TpQC7Wfht-6E!vWUzNiEnY>3E4&xP7#Zox`eLenypRlu>Xr6- zOyfSRLxuaJvUOP)8&!&yXUcaAS?)=7YSR?Mx zW$cP2^h!gG0Zg8i1hU;{t6Kxd>&2#Rn<^ehB5O!2Q+iu$=Zxd=2$4bj8Ad#HK-{Nu zY6fmK3`P^=#RIYn?hIRmu$D;HcF618_dkWSaVOj3!t;5j@@(Ok^|uns>BAecKM?2_ z{KG3Z#GbdGa*(vOeOFfpcqR*io1JOmjdi{u84AK{n-J?;_!>!zQR2Lw+SN8(bXb_? zxM{sXjdH(c-G^;CZE$l}tkuFL;kR(SN-+J4i4UWfmwqNhrt6$`)b$=%WW8Q)uU4Wr zTv)T|Rh?*rx4?JgoyeU=*tQ z#FRG_(po;LHY4_rgC?4_eWt{CTPKf&bdTA&vVy!L$qZ`qEi#993P&pK&%jvUBVsiw zSKZthgOs(8j$v8B^e~!Si3-WlT!WOyTXQ?=54S}Ft4K@_!O(GzyVU)Sx9x_28Emb1@?Cvy#`Z!OsQ-F@C?A%0>7PlP6gkpqrD zre_(bhZ1^74Qt*M+3IcCli>-o`<x1P5~hB3~388IQ%A8!rH z6sjiN*2=IBl&ZFYfvB((Q4ce7ep?!eTFdg%rp#jQ6#SbqTXl%V9V69PAq}Gr9@Il~ z>hYFtjf+)zG->57OFH4V^e%4 zg(|^a+X0G?s%2T?@ftC!eyHQGceksV<=AimGfrXUil= zWcoX9I|Jf+(ZtABlFb6~4lou@_ge_VZnaKsp% z3$GDv+2YfIMeQv3Rl$qzHxonTU@g+%45E`}K5V)f4(C6q;*21$t^CAkc5`jSqCi+< zk}ABKc!J}{+rP2-i^-4X^3KpFSz(C!w7dHB*5!t%Wf|Rb=&@mBcF~jf=EDU*y@g8o;N{X31`9JiZ7F;&~z;G)dAxO}aeKW+?L6FR#z zoeVnn7?F?Hzj;pgf4i{X{gjtL>Qs+q zkUn;idy4Px>IWUvIE@rn{CNq$Kli9K%T|Q>yr$)TK7dZ4*m|EvF%;4`KN4d05_2%R zuj*;)T%(g&WAkEDmn6?MRsqd=#<@{^&Z!R582f(yec*WW8s(B|3P6hY-yqzN6^Rsf zG}}5#zPLHHje#@>S*8*%-7@}Hj7v@SUa_{IZ!dWwR65_`G+cwgTr~8ZwZvkrODT>KT?wd)lCQkVxEl z>x%xqIX!fAcP7@{qSbZEXnVQcW#E@^>s6e(T$1qLQx|G+5q!3n`+-VP3Z@CWr3oiZ zpAY7-SNcwjnq?5lrH|Y+)ha)+=igM6Sx6BFzpp+l!ZDuIYB$zhRh!`*;T-@69Dpal zkv(?ar6?jj0M=!{+RLF-vI)hfKg>MyGHHkFA_--(_^NeEaNRMSO-d-WXv-|_RYE!R z_-heTCh)jPcBDCgHXY<1CW=UjV^ujYD?6T$?N|6d;TtX`aS741HEO zOW*kIvS(wxOW-HxEk^}yB>PHQI#cRMf-wiA4EQ@GCf!Ycyf^;L7)r6!(5g0206-v` z_L0j2FWVOua%HfDk%a*x5Bv3mCDaUIamzq4+9I!o%Sg$6QM|w2+J=$z(J>X#oB!?s zg`9wx8FRg7MOr)K%q5jCXBo%zK2MD|%g8wvj;p|`;O1lx9zYpYm0s#Rah72FJsCGz z&7AapIjOwbksf0)K>pSKTY+8Qf-cN~c`iJD+$-*E^w~QFX08}UjoG*dM3^&<&7cFT z;k}{lCth08-VZj2L*OpkZ-|86Rr@c7SDOy7oEU-jB>;_%UJxY+?*we#;THb3$YZ_XweH4DlPP6zgthKp4% zYZu>WXKIgkg1c{k)LCwGe|Mo-2r!2$7`hz=FNWKLnM=V@eNA&AO2zToF|w7mg^Dl^ zym^b~3l(8)8Y#WYbZQ}urp(4oU$zXKM4hr(1DI1*Al-O+FOfMvc)6z%kU*JV2slj- z(43=ee0J8{&Nd>cn7T_wn`D4QM4})nm}&nJLMVY-I)(0o_UAm2X(N%%Lh)Z&kztM9 z$nojkxTQce3l4heBzfLmD`v#%m4IP$;k*AN|KTAhD1P{2+W16hPiQd{5>SV& zkVFndifOx1huT1=Qiy%AYE|xUb9htZ6jnhlxboBCv0-oepU!M$|9376uZF((D`I%s zrDcl68$Jo?>pu={yISfXn zMpIj5X-xa%*Nv1}rM)WUpVuEV>Wg-^`YcRkX)g8qtEYS>dO|#Qw~?!My>zzXA#+J0 z`b$;>bBv>!nNupwY!@}+nWbr1LlnnZ>!G(#AYGs4#M%Y}AE@AlNbA~K$Uzg_i-&)P z8LRsHKR_c0wCg|8t1hr^~*8!jg1< zB{m7swHCe03Y%*y?(-d`JbXZb;0%0%-qO}KthkbS>Hwr)547BV9y&g2W^Nvw6wH;Yn}FOJ z5UG%8`&}i|#XVU@iCue6dOzO9BfZ6aZi!zYx? z;nhrLSJ4jm>xQvhwLD_CVQPx#nGT@PUgH0V?rnKHxr z^*n>vNLT2~lNskL8o9RFI5r%4|9L4w*OFF<{LmxPBQ`%n&6o3vCwO+9#5kOR)mOOB zk@L~)!1No57&U%nJ0yQPt>V;;Z!dB&aRCn(Sm{juhV`7o+=rmeOL9FeSLm-xW$SdW z?h`s+6SW)sGf%|FXASF4+kUESn!_|$Z}(TlKl(MtMY2(ESX*#_;G-k3mgF+g+|x{K z7F(Mqj*AE^h`93cD33W5eq5#V2&#}DE8%E(Ca}yqu_!Q&EyY3`QmylcdP7HF`!>Yx z-+z|XYdhTNyk+ZF7*1@xsx-X+-blXg>u+LW`rzWVXFy2rrZx4|Pl@P5uI1jtv+B$f z>zrMF?BTbx!rw-#P^5Qt{aHNNEivAd&c`Nf1SGua`~f#Kr^#5W{!5j zKNN@hl%r}A^obS*@LW;9z&uEVh*aC)7~KsD}lqW(H9%+6&cnFL+p+=ypm z@@f!=s7P^$l~FL_OIbCU!6HpxPZ15g@|u`b-qacYgD3AkM@EjaD{EV@XkB<^s*+IS zf?dW)R4jSOc$Y#h)ss@zd}gp@Lj86NIo=V74n)tM++Hxui}m)WDyraODaEYl>W6oG z8XJ+5N-2hu&uneKWE3~{_N6#|uAZyuPc?@RK0_}JUz?I309G~-P4 z{tM*T41G&T`X^c0t^X!DE>wyWZqBQNpV`(Amh-B4wD#q64hq9{@qRWEO@Ln>*lE$2 zK2B)n?HyI#OivqJOXxnpilxiIgls@+-=Y3-0VYp>}2QKP^xnSTZ%7q>>Sl9U%gI7X^M3QzUc zJzdh>Z@hb_12q82`PBjxJ-olc>gC)`Oi2wXSF{+DMdnrOVYL6WpVBkEU*`tY9R+ri zje=S@XspcO_1nj$-79}Kz6@vdLSEyKOy;qrpUXH@@93yu4V%joTV6s`WP!DZ;($SWMdSV*iE7F0>f#+? zTXnrO3OR>$Uo1|qOBU-`{6c|)b~#Y~KQjCu31YOII`c*o%f*x1-_7@H0R!fh(cGXn z;0k;1x)4g5dK1c`YVNQ}uiiK1Zxr*U2HxNob2$t$uuqp*+x9R-IqDA-R3B2dI7@$B z+V6@w77V4I`%M0?zUZv5d#*L|G5u2N(NDq9t?9S?f%2(GkqZsaMgII}UMXXVGXM`N{JC;88{p~pX! zHz$?~FD9R-eFm*;6+AnDzFa8Of^PZ=$PQ}SBCfWL)rf0x32pn!X=4%>vINv zXs-lQVQ}U_o_O%Beq49-8}zOIr{v8yd3bJl)$*>W9o@*DMXKM6qv0&~z7sl7Y7DC8 zYOLmxvcvepB&zhOOn&Zft_CSRiHEx5s1y!h6K`M<@_j{?R1A4z9GA9=SiTy<5b!rM zw~{Ok^vu>NsHuTbsM>yIeI+WbDeb{969F;R3s;*@hLBa5V`Nq^um;0DQ-A_Ph?({T z%Bm$hyT%B;i8+jl)sHI5GfRrO&Kw5vZNa!sjIZZHQNw7CEEi<|z$nEO$ko#pA?rofh&8GVaMtYcSpjfs%h3!`?U?+-Ngvl!?ZK9r{f z+21l!loTgwYiSp!RGGN0%(a?yLLw||IMleOC9J+!0&tkI znHhV27| zGG*nP7`u5q*h~E79GjNEHV=KfaLKck^RS=a`cI@$t*IAgX|3fl~qig&L!%`RTqY zzG+&izUur_)6znV@DrkuG=7>9>LVk?JY`HXZI2vQNxJ$?_*A@3m>e9_5dY&6&UpZ` zhS?IWK7!YdO}g9ga8h$1P0(>B&xMk5`WchT`nw3+|&mm>oU;B?%1iEFSWEf=TM>AE`AQu6hyz?3;~IB*4X=XB2s>fsjrSd#fnbvqa}_ zOp4#1a`22m8=r9NdWL>fWyzU9y4MYaPvYYBddZdaDnCi^=N)6Et-35oeTUO*H@7&L zKS=?p*01dBJNa?QXHR8k!hMf8zq{mNwKUxbGV8Ukw0s3#cUSG|*1G#1>v9x8uJKbt z7`0Q4v-y`=MrJvOV+pCL|77wO$I5^KD4n^zS$J?5SMynl7-B(b?0kPMqT&@x`rwL| z0mG9B%1idcy3axZPD575`?EgHeEh3g=06t_yY)JOFR1?bnwtEM#zs}=hhi}>6ac?t zYB8et{`mLA-HuT;>y?4o#i~zIb`?7<-$`Y?a>*T7GxjrLc;Xz8(2%7 zPT%Qi=iIQ5J9o6xJIzxajZzw`j~rnanmhGcW36mdj?;-Y*G1DO<|Pb4zb&Z)e#z^I5%7BK5*`rcGD`8!y`8t0XG`t}W8YBb#YpUaabQ)5(nU$<90;q~ zNFZ8DsHup@$|tIscV+6y$7_Xdlxs1U--npeX43Z`MiTBHC_B>%>v|Lo#_7Ta94)#V z+ysz(F)4q{+vudUl~KiL&H$lY5_hpq%_WDsJra5=j^9)RS3n)blEm!VpxBzXv&)?^ zY(taCE$fa(8h0f!@_|VE_LXu+AfTGq;PC9{r*s8dT72j8_?K2qn|%5n^Tu(xtgLb_g{(QJscR3DG9YKC%~K+YIn;7G*duiFm1jShS_U*XO>BPE zXzsd!t5I`t>#3`{x`7Mwxmea`yTe3?dA_~#wJgy86Tt?L$9s1l{x>%kz4I(X+Zv2L zVWguq>oVmqV2Z+hOmMuiSdllxXBWL{VOa#Y1XPcj!=OPqi~KR-Qmq|z_{t$pW>!bS z>YO(CI5NS&N(SWCH<4OhJW7mouxyb5$|ZIU8P5Qse4AHrm?vKEI$+LathxK@b_rfVyja5%Fj7T<5K0wq0V65x&mf)$&Xsdc}l@ru6Zc|+Y1zM z&-9vxU^CjP<&W)d-P9NC75WfG(>CSDd)$Ay3`J-~^SMTG87P;=*6=ECi9694IaYG2kb9mhT}xZckIDQMPDi=;k%b(G_r6Hb-> zW5aGTn@HEbO1)JhGP^*lIs?ykPS>at=%Z)Y^Thg%kH2yhpDo@OhMo1ZAzI>{cYNAK z`_GT#8;6Lm=!xJvmstx~l;1gJVn2705;t!6qnIJdyNF0?!mDM^iUs`tSo#XTCja+q z8Kb*vbV_$gr!<1V=+WIM2vVcFaioNliH2m0li_KN)L-rVXEW)8;+m>JG`Ew9jrvgm9n6s7M+ zgiu9A4DG)5j#hR&{O_6PYkEH^6Z5yGFAjmBIZ$!>qWb!|i}T{QIz)#H)f$D;r-2+)*Gb>PIz5dVQy}23Rv&-4i0Tqz4Wl|0+*&I7GMm<^UWc}BSCpWE%oe~ZU_Gh zb;?iNg+;A|MO!sP_{F&o*_S{6;zpJ7m}gbJ)u;~&54Ce@zS^NN#(xK(fu_e zUT9-rUXua;SkG;-lv$dpX$7qT-|E($9GB`0FyyZ0-X6$GN>{V40P;v@8wfYMyRa$8 z`Mi#hT^z0B=fXD7S-K>jtafTaT-{-+_k; zlBS+r{6Q`+;RmqLp+>p)y%w;O^W=aX&8B^iX@=-QL`Zk`oO%~O90vra|8nF^N&00o z(q}g4@5fSFMh~|v_%Yo^7>p@yzt^Xxa^*IfL3sMhV>Rh{vO8?Gzc775=D=bWO`?o; zX|Af`zlBWI$vrMNotYAa0^kJ4FB^XYVY%^0H=o;FV2O;%hK4hGTJ8L~@{^Ix9P2(d zTqeZB)&KrY_qRtpx8xHfR;(~q{k)w0_mg17LQD0*0(X{WElkNMRhB9$Bus6Cv-rMM z^sz;Tj44z=!LUxfnZb9DeGj*}YOg14@lGQd=-QC}J>c+$tNK=U?z>6v$OouIbbBmR ziZ54VRVR7R_?Hmha@OaaPRs=;Ufl z5&4+feUnswD035%{AoVe>##cj=W0C|qa=kETZLjG{Gb9m3ir^zQ3#Tkj0X{fB>1## z7Y>eGq>#OM>pqgQUC{lVJ|OAE@T1&WCmTR_@`qE{_1!t+nY-I0q9Oqa`t$ zdAc*NM1&5~l1Fm9m)aPvKpR4`zlRZK9dH|Ly5XYVXM{?E)B!IXr405NGCea`#y+dW zr_$`oaqP^#Pg$mk_CKo*_+X=$MwzHQM+oy9WyTs$er#*97y$zYd&3dxmbKTv*zSe8 zdOsdLqr18Gfzj=%M%};TLqrZ-=lPCHO9-iiOEiB#Uqia!t$qDx?j3Z*Qeb8oOSbk$ z#@Mr6m^wHCFl9oL`0w`@@8WXm$Tz0@oG`loI_|GktYfh5{JMlJHe!+Q8S&GH6aM-5 zdW!PD{j@zasa@cvG3*2V99fQ}9=jQ+w-0cS6SQ?G#>JCWac-GfX~?xF^BuEDY>P2R zq1vBgqXtK3C09gDadv(sv+PX4R24qx2!2o(G_lR}fz|j?*hHj)=vb4fC$C4+GXx8` z@Q~%hz^+y%yawVqxJv8*MiI4!gbkBMEK-GDZI)Lu>nPa{SY?QKSSmV>XSWFoV*Own z3d1>q4#L1A@|m^ z`6SJ`GvJVdCaaElr6*CnJ|O z8Z!N#B*KfV=;vJYEKiNk7alrw+ATo?ii8JY0}o-$d|aR6I)L&OqM4U65<^i^0U~Zd z9<|x8kRd;;2@Z%Alo1iYbTTLP?%~6rS~l=$m7@7RH?-~S095<^7cR9NNAcjxdzEdI z{(;)^l%+WxJZ_PhkALOq%OGOnkX}4Dy82mZ=Llo8T6A`E6g)8>_NT&?SkPFx2!aCKkQijOqlu7pOcD!SB z|Ei0?B#sJ+A8C^xr2Pl~l*qD^{!uK#o~tQlff;Ji;}8?d@<$qDL_p3iK#d{>%ooyq7?k?>p`nk+Lh?e%#e1WJJHGG zP||zj=CaP#XQmg-=WisGlovI*(-m0KmAU7qnp668v2wwL(NPLI+6tVM=TTVcOMjTh zHFiZ7O?4MdHJBRC$-5PH~v5 z0`0Jeb|er7Wc|rabIUGWRgN|jAo%`CKp0yCF!%2B6ur&RGMg9HxYSM>I%@dQoJj)R zFSG0#hEU($c2w{jW*LEaV(u?ViVKEUGh=!IeFj9BBqR&*r{(F@+ZO8;JF`!7dkET_ ztLgWQUvJGp-3y#``;Z;fNt5v-Fa7w3rE3IxAcTaXR5p#i;)GdIwxy!54L)45-A(G} zgoE~~f+>rtn-;;sR$y4f*jjG;TrSe)6s&_kjD7c(6Jh(N7?da*4c=lMA_a5|_4x9h zzbc;4N>P(|jxuAfvdygpdg7xr!RGWGaK{7SYD=D74)Y4HI!A;BhZeN>4FxciZ=IW$ zNC<-0t$4%UZpSr`xBWv-(oB2Lh*GH!6|?5!>W=dPVx9%)-11)%GuIQg4S+_g;YC#7 zSOTMT(1M!P-<9x4fs!@SUtah`e=tMV`EutDq6repS~=;m?=f-akh+gXr*T;_&EncL zx|WoGct(;~=|_V6ejGF0FAQ31BKj!bp2{d6iY4ErrEond_IG!J=l1&4?e^h8htTzH z;tyFulX0c%leMGwc}Nht0H&F>klT;${M!VD)3Fze7g%|Z|8#OZ?zkD>d9=SUc{jZ! zFW(;FwcZndwvHIOZ;-?FmDgEB+^16rIWEW;@7|#ZFBTfQO4=M%cI;nZ+KI`Yu z#(G;zz^-_CvahttkJwqA4T-xnTypgZ<1>N2CDfYLaaznIq^mfA1qFe_(&~%gNw@FS z2efoH7mfWB-|6H^Y~nOtDg_0Jf0^}5%gl+M`w@?Qc@bmO5R<$iJ+lIZ?kntI1{HHX zJ%c`qRfMf9soBcD*^rc2keELscjbpc(jcGOw}!>COFQ9Gu^`{RRr!I{Fbvg_ew>y4fIH-SEO zJp8-@BQ8&Ao8c@jx+ z3EWC^r|n-`ycXuB;fuzUTji(jGK*>9@KVUJ?%SalZ-Shl#KuwO@bVr5ULt*4(_-30 zoMPz^BWK?aHYut}nq|ZeKo@)zSeysFRl5-H3-!3^&MJF`OBRbIk3#E0G^ghH&3viE zcoH96T!!9G(YlKu66jxM+C!~-Gnm3fuz;1&D6St~*-x=VSySn8707LtNh1WWh57jEEv*MJA{4 znh$hcfcG0zl+d&#$xo=AlB#yl&>!|u_F}E1WcA_(B8!P2aEmVxahOhW82M!%GRGNJ z#>a>IX48|a73bA9w@PFs@QOiruH&n|V|q!{Dc|p|d9c{Z0Gc16)J{0!(XV79?2lCI z-*oqRnwnMo@d*Wx`L#3e+RnLP1t!iGCZ^CrFJsxif1g5DufBz+nC?09`j-LySnsbl zZd2yl+gs7T-;i%3QnY1O@{+dsswHP~Vp$XSHb#F@g3M;3F8;7f>KBGrCwPPEv5_hc zk}2~;+kaX`EzDr?CON3B;X~WiHE?t=UCqTzDF{@Z&^M{Vvk+U2F!DsC0<|>8{!xGx znc51Tedg4U)lCq^*Cx^cx@pzEh^^uIX}hWqRbNxgVMQY@obyosM|3?T4> zADTYuv+L9pzy4N|!Bd>hT}<(He@G!Qt5F}{9h~^6NPNBRwT{$#yj~dSsr#wt1P{I0 zSnwA=vMloWcG&mtJf+(odrb0Q%H_}+-R+a=Km?4iUhP!udrM|L>x=6DcP-o5!yI^j zSGRakiB%hT@#g)_HD54_I|7tgeLr&H`D?qWo=8M&7hJ=??sxT#-80+n{Q4r==>qwK z479cW?v#36E(G9JC>4J%`fuy@nVNWg|F=8tEY1L%*f&k?wDi3AxGC@3`@8olQ)a4pL-D_Ve3|IiFruBM>+uAM69b37Yv+Qe z>6FFvWn}{(E@jmQsZlR_95e1j7$6z$5y z0bzz>4DQuKg#_7>KhqP?qeGX76}?)~grQRG#y-_kbf1PbNt?#`ezlpS%w)4=9P4xD zVIuKT<8a=E_fUj;;j>))b$na8GbRVImlT*+$<7qg-JgwF?U zW#n2+dAmS(A|9?mrcjpy>uI+)p*0-yhH=GhB1A9kYPYcF79BbF@w6wVwX{NnC&`p#mB7&p|HzyHK04*PqH7J9qS z5Zlr4GnC%C`wjZf9zQ(!u7Fs^*ppZ!z1HxpNCe35Yv|VwxheQ#p~C5`o4`g}gH_*S z;MEfx-35id*`xuqvs#=LG8YFwke?Pwr;L$d3AT8!E(pL<5g0#S;$OtZTA^1f;P06N z+S{?2h;f;0;|Xw|@AzAiYYO!`3In9rH3X>oYI78xtWhk1h9XsV7~vY4nEt%FDG>#_ z1WofmJ!=7AGzP1%IPSE@Mcmj+Rb3&Z1$%_ODTYDjEb#^-wt#>@d*=#7$mM`qY3b#U z%?Q}X4>6~I+59;$O0rMU@RVQs3+R{TpK6^bV$S`^ODiW~{dg*r*st^dxBY*Mca^mM zSZYEt9?|(|9qM+wj*!!jwQqr51Hsq6^!qDgHYv!poeko%wV=Su@a|Y1MS8zp;iJ{` z2_Ekt4fd3_ifxFc4B=$*(CZM=3e?{AOFh|?diRep2o@-U8dQxvc#-f-+c;+X$HHq1 zOQQsdwzS7}O-Ke-_)v z5r^o&(A<8&0WTw@YjI{sWLz5yQjmwsb)WpeiX&E}r2{NxyQma=nkYdnpkOt*cT3&@vef&(nf*HSj&e|mvkIFO|MGmX8e7`l_LMSf zOm)hc9CYaD`U%IffXSC7F#T&9F=^73tZaMe9StGm@vM?@YlP_M;9gt92AT2ob_><{ zRpjDDoAuLHFW;5wwcatbR#|&N>l4wT1FPGwRITSy?!bme~M0Yic}$wTuCM9hdw1^ z1jf6s;5>@>qQHRKB=KSi3!NKGv5tW{XM!t*6x|s2mS>ho>HohuaR|!Em3@s30--oU zG5uJn58F5;le8mOzT2S~l0Vqt5Z~V%4?kFT3N^YB#k^fn^ej;Dbd6*3vs3TI6 zlFtX@a2yNsV-R~m+}_R43CLRD)HNynORFl{t&|(18JM86lfmiT-$L`o(D*!XK^1=A z!7`-4Rk#1gq;^+38&R8t@g^Stfwki5(;`9jU0mI+dFjLA#})Av?Pnv!n#ot2nC?l! zHuTBe$hWYg%bW}Mg?Gk6t`jUzJH9J%F-#!^X(6O&&fGLyZIQ;7AI(NPdr7(jCLe7Y z)pyM-Ti1%lK%+esc39}8kQ3&8%lU2;K4>1nE~m*`el@mF@cvaX<%#Ie!#Wl9r@ZPX zsxeq6|C)vM&c0}j1 zm5dvm*4^>)tKA9m84oIrSM!l{x6tq-qJa91??9WdKN}1^q4$IjDhfAOD_$Gl&(@Iv zXFmsS80GqifH7g^{{;Uj-2WL<54hm-;(3ervnzOoA1c-Qv0*)k-g@TYG4PC5E^HfD zuJezu9CO^?TO(-8SmniOxgpSl69=W6rn^;!$0;?}Ev7DgYP0Hb)t;bGx-wO%#37e^V!>-@? z_t&%5UM)r(0CAQ%{hEr*%;E9VxN!VY45~mh=>?_G;yMTmGZ*#RPhO*#vk1 z!mmBzhOEPzE&E`K`b)llnN|9gqu(O)nNbi`){%w2CinDHffzPw+?O1d{n7|m(EJyW zbVv8)Vtl%jQSsWqu!@<0aLr69A#5=fN0-fQKFV&eU z6M635WYt%4``Et~{Gup!fgu`>%t|ej=dU{yINxq1cTT9$YpWIhZ^lLA zbur3xZQ4fRoHF}KVRzuouHWr%uk`_I`Fn~UoBFvn&#lD!MX6Dt#`}Ra9-ytn#Xqb7oGs7oF)Rt3 zeNWP?wf>K}Ey>DjmeB6b_jDD#U5}W2oylkGWmlkm&zaWolb|Q0K>Ks=%&Rx)=UP|N zqfgbJJ0?8|8#r09!@Fi=rZi&!C)-YlDcCYgm$*>qyv%4pqXLQA8BwB?G*aHh)pzn zq2!rMV8q%WP;Hp{@ALx)A<0xSar24l&)F4tz}{Q@(;v~u?#{+uFRF-D-Q%?;x_=?T zK9EJZq_g9ZCC?zY^%rr|Xp~wb2}G&0J{&?)((%>lI3N(iNJ$9}hygSbU%9xsbEuir zR%z$F?w&NRGq|+MrY+{Ub^L|a!fYi@WUR)gSqu-$&Ca{^IU3cnp*QqWCSujCM)P7} zSSrv-na`7#r?0vKd@S&5uoYiKoHM_XbsB2vV|<+O>5o1^5xz0RqZrWrfXjQ4Q#Pv; zLzxKtoy0On+GRvCXe3PYQVk7P+u&0kIjoL^S$8uEIK+GE%LifCuC<+O*VI4bSLHdW z8M96vLI&|dTDHb*o5AJ#zZ_|rqu4l3lrRj?P?&va^xlxtoo z4AlA@OHZ}HwKRV}L1qjpE#maquB;p_=k5Z8i3ab1q8wjzMqld25=69bq7cF_h@CzS zf2pmj9AwOI;OCca081>*)0~@|P*r`${zdo;F(oY~eZ-fzdU#TbU6a|y*)B$*HlfL~ zwT~uSj!}hOuqtUQTd=Ki9IhVb^K<)ViW<`Q(;)X9b}iQ=z<-!zN`M{(Q}uMuLZe5n z?vuB*UkI}R{bGmJvG-$e&hLa2Xh9_h7eYy2zB9_CL}KY}Z0wLMKRmlWS&gL&%zp(_L&mv^sTiLdU z>Uq1C3L`TMUD{uszx}{;`mYkTc_L;MnB6KR#|iis4fM-3CiGh&8(-2ATx9e>=IB!_ zU}(ZQ6k@V_gn2JAN)iVO$gk9JP}GA};&J*q5EJFk;_wAa(!m3VxcLO)hPP@N-*9qi zImu}(^=(K>7dZN5B!t3(i_XfFOwt(WL#0I#Gofqb`%EzNeLbeV%KrCyIC-lW%};gX zNLPRL+$nlDW%DSK79dpW)OC=g5yK_>ycDb6sG%GyBcXE$pO(fQQymbc{M1)d1`1+F z7iSJY2z%R@!dwBFxxZ+&-HXtQQXX@%h{`#cY`>BS<0SivyBwFvYUhhpl``MY?OWOEPvaXk;@82NP z>50UX*1C!e`%*f>5lhWH2Kpz%*gxk{8Y0i5kGqlw8HzhbYFUxsAWaF8`M5uW zi;p7sb#6pA0b(ilG?mYW_Bd{8v)Wn2cyMWo!a-5Co7$MJfL?GfO}UpG)?~g}@$j6( z)7~C5pgdluc{Ebdp6#*KhXz0hfr>yQ8=?64f=8>^G2qqJL1vJYKdE{}irxD_ z0D9+*&39DYQi~7kwdZ7%i6rKf+?WQ0EixE+Zls1YvtLp~~AXH2M-i|GDv8(ztc8=36`LZy8FzA1Rq|Cw8+ zx0#sg1La2cZgl(baFL7!I4`xvjr)9~TDq$#l<<`J+|pHdF#Q`bK4p-NUj2)=aNBMT zJVTKX>OOo`6~%vhC@ z)Z%{7q8W(tk1imH$8q#MDT`e(_gC4SuWidQM4fNuN!v-f-f_9SE}hVdFxGocyQb=V zNn8?5!IJ`E+KZ{DmY5@ZmJ>LdzFDD^WQrjVkT4;T_5TqWCmUs7`x;8kQCBuupqx5Z z>yRVn^b**_L@KGQtKYx9TVdl_@r*y;aqN*|Joi$1iMRfe&QO_`Sm8P4z=*4As4bxA z_;m09j@I?>*Sq(Vhm+k-0VNOT(@zBR*ZbR#z4zE*kC)1SFIR3Zwnx0k=GF!zYANXt z1c2UQAvX*U*X#MW@duU*4OeIn57X#H6L(kn5*H&c8a98wFu6GU^t0QCfYCCTMB@8X z4Nyek62g}x=#X2Vm=WDNk_NLH~Po26%-j9H~>OML*oKr(>A zIZ6UwRQJaS`cs_I?;OqHLf_&}Aq12vX490eD%}${xqhQ1))s)l0k)U}7UaM{88t1a z+#wTY@8efy2cxCqOv@kKjK^8uwSh&f_6aId-LJ9*j1@`x1Ju=se%-dM(Mi~?9EvTi zcj9&~)FXS6=>!|!iNv&e4s9%W>~mgC|DEJqv>jQ_4h$M_Jznl&2+{Kz?vVp@{p-Xz zytavAm&GSIx9vAXkCa@J4<9f$**O0~iZ8}q(!fG{ugNN8oEewtfoN~6#s6TOv(1ZK z!2|l51Sk5yS#kDIoLjru?Csq?{Oh5v45tmB`{ti~5ufAxkOpBze+4ae5|I{+mz5o5 z^6Lq*KtH|c#u+w)+RG2N@u@&OnIYI2w_2HM5<-pSGd_!zV0+X&%#NncQOMwpk_wjv zaUCU-BG1m%uCH^x5)@&OiN`(8U)72&_~F{{j9HZ|V&y%fnDqNM&NmCiL(0fbt#Q^3 zJ6Q`l7>0m;Vl@18zvv|S&oo2T`83lkuTn-0X*wlEm)Iq05`Eqw4L+_?EqgsuMJe?k zNU<;d3FN6`e)|sU^!XcG|0C8$nUf1=%8dEaW;vw)4hedQ-(4lVms zesiZ4&TYjoCpM}A`;a40dnMu@&^MB|^@Itz&J5^^l+-=qxWBf&>EMLJorD(Nyn)Cb zRAUq_bvdK8Ui0=}JIF4i7r(gYD=&`JWFC4gZidqYZx!KvWCUjzI;j_ESql ziH@Im#499jEp{5Dx`7(6TgBOrtoR3apG*_6m>Tmp)BZ@SKDV*m8Gmt?)@2%-FQ#$E z2&Pw@N->J#HvB*Lp|)ir-*hIcSYUPw2!to;97(%aaP<_0vr^|r1|6W^8*w351V(E3 zck}o^C62rWCy^NOXwFH$RC;1*FU+V0%^a}d+#B^I1I1s=aoB`|Hi*Zou~GO>-08lP z@aHHHs@*|%AAq=gN`}IgzR(=4mMK)SFTLV|1shD1OuA1g>oKu8VZ1FYWXih&+Ux4| zJ-J)Wv?cSnwVp!KkyfigLd_u}gePYMxnG4WC{`#`fpJlOPxXV3vc)p+#JMy8O{>ZfB+IT*_@nlgDjFw zq^vT(b0Dwzw->~_t?;@vh}N1_pEzX;hqm@7;%??fkfd1H>*Z7{o(_wC|C}%y3_#(veUOnzd9HY|DaprneE( zpYl7y5yjJ6P-#FNZ6dXUqY!Qq%X*@ik@C436BYZ%X#In2!4W0_y|W~iZnAGUho9?M z=Dw^a0R6;_9ZL*LMMjgv!_c2{1E@wOM`*X1ne|zXq8p5-gA_28P923Hu^RO?Vl_B{ zdS?P39G~;LGK+EtZ?xDi3s+{~6<1=lJrO8(QsdQZx@qwR?^dbY{#!<@0#5SCj1c!;K*e~>nrm!eD_$>^^mkvZMZ=4-O=vyfe`@X>@+bx&IsTtfr>qTJ}u#}=<09m=8<_ypw8zCJk@uCCORyq=Z5|4Y1e zfMK1_A8jYoJn1OUT|Da1ts|&B@+iPRJl5**g$R3 zyp))1P6&^w=@V`V1)@*q6#DC>z;X5Wes~UVLEeXO)?FJ(ed;87ng=kst%6fA<`LQI z|DkA6*gXPVoeq!J(ANEt$#PuRG5n6De~B2m+DAQ%HSFWOL!6=m8kn16#y?q#v>bZ@ zuc!uEmRCD}OHo!<6U`GY6A};ui8V#)(=*0N#Un2rY2rD|7Pa#}QbeY#O7e1P4sIp* z^M1@soF^E1;*W6k1U`@SeIwMCLjXr`4s|^&V?|aLw*MsK`Mg!d(0yya4fd1PZE@Uu zZz5-9Wt>7scj#?5Ythx*K`qemZD8I=s{IQug+#F51#&^nfb6ucZg8ydKvGtMbYv{j z`-?F3cca*C6&FE{FI|li3*m(}wC+T&>@4GO$Dlj=*CZu{koq5*f=*qgp49Lflt znDESgYI;=hMJhjIu)3koZKFGVE;*4b$&!Px|OIxf=f&QM`n?III=1> zB|K&5T{SE}69I7mnz7&%SO8&SV>FYxlis{`iV9_E@fD^YaN^(gDfF6Pq5G`;G}%^0@xmxQ@AYD~&<^&0aM% z7(EX?ad8O>N(L-5O<&S7t>gMF<>#}B5XzuRp6Q~?|)_RSwLzye2xm^|v^37p{! zVp+=D8o1E(?0?pZ%cpzz4_&HMdNE9C`7kyeo$1Rg`d`?nVKojRaqSg+xB;`Fr1)Fv zk&zTgtrt+Q!77o$&ktu3`s&3BS@yJNRh)0xG(EcwWe1u|`gV<4XgDFort#d&uMSB8 z(eKx)!M?9n_h z0Z|3v`XDNS4Go`%bY`xM=G*_hrnma}I&rK9*W1OE!^$!@zO5~5TcVTh{HXBv#d<~1 z>M7q)Vxf!V3bC>RRYVi;jguSBG44O140rZ4LmRhZP<|vinCkN|E}%oT$H2ew7gIez zw6jV3wehVd;#5?6%9r>Emwu28AuH1p#bG2PJ_;&GaSSICVC z%LoL6CO}+@d))T5*(cEkj_OLU>^w2262~ zNu4A7?$!8_Q6Y&MZT?LkecXj$!^53t)UgbiIiY2~n`CLEAi+guf$oc!lt*C>g(9wC zROJkV*Kn;lP$#Ht4dD0%X4Cou;^P-PF_5W7M9nKsXzEL$n5~ADY^F70q{N$})R%B2 zO;Vd~QNiv_sc_5!)no>K)jeR{DiWpatJ)t1kf_BSG(C_ zcZMy7TNvlCF%eVBCMtjWolP>TQOHa_S?VT~_{;>G?5i4a{=848v$%8NTOs@~7fkA7O?LC0JpUsYQqyX_e!`Kw2A zi=-_qUPYQLWNjNkzZ}(YU!Y>%1x6xFK9DTQnnoYdar+=77^!kTZI|!T+$yC}&-NVJo5KB{C>k zF^3XLFq?S*nt$=W#yIR2t73aL)-oz&&ZAPbO7pN~id`b4#-}0^VF6VOw{H=dnbRFz zkS>{GQ;F6|FvIltGm4I26!U*0 zdMb5zc{9aaz%*sZ8Jjot3|ZbpkYA?WLrw^}wq^7_pfvcSj0~1P)u`)RKcsPcYundid&;LY|8EJ*_EUw(?B}txVGMX%L zcIBGjy;vV;`_}=27+N--&c={{t%M&DOcWm0oRE5b&F};B}I+QdE$fd7FY@)bf ztSABd1(D_6uY-%PYAbA|)RW6!+5_!OgNThCq9Dql8ZuFBd=Aw)3NB>PShh z8;8&0X?nl4p_%088akL%vN(R;UsIFlr&V*M+FwtmD1UzP^ppe?Wc-C zOqvPJSzEwlrNgB1Qj|eYJR^7Cdmdy#KJ^3x?l@~2Pt)^sn>6nauEY_U0+CYD&){Z4 z$O3E}*B9gEZUyNBW}&8oRo)>iRCZorZeFPEiZaP&Kbo z2h69`5S9c+1SnDp)7y;RZ#vJW6>P(DK+r7PR9h|fwy*4!<7*{b)-+$%K3~o$UkQby z&#}we_Xb+;zNEq;o)=c;KoU)V)bhrBw~boY{6c+9QyWB(nr#OeRzvAJ7)w$fjqv(% zP+E^fydJ4b7FiJ%dS<_v5CI~xgA74U(;c94`JEJKNVK^4R8_UN;+i}>`Y#$7t|sc7 zojtZMe13OQ+H7W6@mhD2xP4qs;S0WldsxfoT-U34OjvwkV?%x)$egq$gip}`pdLbN zTAwZh3~&k|<&V2e&>4FPJfbFuU|RzRDJSataAKm!g{z+2q-ePvy5g!5kx)^R=!^ey z7NIV0P!EXpRY}66W%D;aH6X2U$X8;+SfQ`N#_DR`fjiF#2`}xOR}8`P)6lzP6@VlG zu52{d1#21}TN<8F2}gfS2eqE)(7jElEt7Pna-*ayK96rHTwI>e?RROToII(y)>dN; z3(5WGOdUq4FsOON(M2@j!~?SwIcQd2v%n4})>H(Y45}f< zHIP}ZjnCQt$DO?*gFXEr%YS};{dKFCAr|q-9hwr50Ld-p9m^O=dd^_hNX-NTz2JOODY-luWtP8qa-xpsmVF^qTe5aL(Ta<2aPrE^_8=!u<%GoicEfal#wY_S#% z;WG*&LL_myqB4%DXt_C@4$hELyA^E0WK7w%;R|XhsBT?^Lz6D2avF@{RprN&)Y&C6 z5Ul0Yrl8PjUxiK%v+5UC#`qx+`(oND%HEYT;#Md~eQ@b7*UT`A~) z`o&9FaI>@ES<5#*KReKl8qJQ5u8prNt{u>)EbP_z&hC$E5nD1wrwm&|BmE628R z_O}{4d2xfaSOvi}5%CBi$@PM8!{3?b7UnFvEyLT|!7`Hq1<6`?q~|kGdyAvVzHE%k zw;fz`Z3{*lb(M4%4-ew+g?q3+>hU8v|9J$48SdGYZ!QAP5aQjl#u^ohCUHDI&mx5oTTP zl>OK{00#i@vpx3WXuAXdQ(E7k1?V=O?V4G#s-wunsa|agRWhE8V&YdnN#Zq#S->!z zoiZ8TI(XkwMKnb=PBMi-Hw|*!Ram6nOp#KgBo97HJFZu1e1$84c*YSlMQv|Dy^9OR z*_YW@+|eMC!|Ic~1Y=>#x~-@(srQ<|mHLlJePO|ah0^H$36IHdbSH2Rxp#>~q~~Yh z4${V9DShM4qJ8e7{r2{z^_T!Ys93TrrH*>97CKrc@+FfaDNleT*F=y;9o_j^W;y7A&)roTTvhvN?s81K}~#k)Tw3%e1>3P^s7$KO#3)>&p_KmWTwIk8JG#BGJ>*GUEPbD7~JjR#n!*Gkfs@2PG}o zfS@pXLtt@LM-OhcB@jPZNArR)4@iOU$zO& zKGtI?)-Wo%Mb+RuUq9u-y;Ki*{Vb;ft2oS4RQE00hJ_Q0=XK7;>7f+$_td^jW;J(j zFbd?m|KSJP797wI^s(FCUS0cUi&En}rln&Xn0nIIu21?SdMbtfUUD2;b&@BdD9eQ9 zh%tan(e*&y9_b7kiii3t!fQ1{cS%YIHak^M=^zarkxY0(vp5fq+m|w&<9?idmW$Um zlHwFVJHr&l)}333Q-r|v2Q1R5=uNO4d67#zvZ+o;a+V}fYpvyE zj`{`DcN5~t@i+`!#xGT@GidbGxTd!Gwu}+FH6k7E0Kf|p>D5n9kLPRZsL|KbtZMz5 z>5{A}&sAZ%kzCy~p1Fp2=~X05Is!^XstE>|zNffFXy(quB%>sQ&z+bJFMz^0C}EdQ z_cH1~&3usvTIiOvJf*})v2JXIph#Z7M-@>^X+phEL_Vp8IEIox>C&L?6hcyQATd$% zz+-)VeQacZf8uaz+gE~E^m#O~mL=1U7|uzbIJ&QVgVe~v*CA-wv%-QmROvo~v$~z! zrhjv7%z_HLt@3s2w)n$NubpOP(!&+B8=zlnBY*Vs2J+q;AzyG-iTa*)h{3@4ML8oo z@CC3MRKcVU&A5e-gMwbUF8Y<$$9a;jbWv$pa$5SGW-Hw?D4)oWwVLr3>1`H=t-8(% zn`HC#C#OSrhC`<-e(k4ts5v_0T8t^q6F0(3;dcZ&q7_2-y@AJa#LAHftIz-%F-t(lBz}!<+GFT>mI4b5po-GGSL z*QLUZos*Bu;ScUDhNy?P~j?e!B% z?`B+FneJ(v8(&56rFc1?X;3ecn~{Uw^`DM2{%-{*i)WPVF%TamLCWE~GM<^(ooIIW z`o7NPKu6ZITD{*RG5(D1lb6GUP(+VX*s%akpSS5Vjv8g3FG7SLC>=M-i+H=bB*{#i zyLx1(ylT1oJ!bf3x|6eSz4b&MyuF|I$Ra4M87-r4-i{9>uiFL%*Y!;pQ3Qq<(O8}F z^&8#&EzgmZF+WX>q%lt7%oi+x^!EgkwW_(mrNI%Z4+j2$iPM|9`g`1JFBCyXAEif( z;sKfX8nnzTJCh(3%RZ92(tzm|pL&KFl)Q!dfEFrVN32?F7^M+~o7rurl0F&z{~Ecj za5%W9AEJx4qD8kl!RoM_Km%E6WMc#fI%~4K zQ{DVr8g3{L6|F28XBAieqhXFNL6s;p5$MRnr>NoOn?vDJ2>u2gym9#USZ^ukd&H5w z_lD=x4QW5=pCUVkdEuN>2Of>Z$S_TFBDfvC%*FjO9;Z;bp za$aK?uH%K|W=Wnd1#N}QNS)P*6RqnYfT-MQ7?A z`h&IQ=>mn$Rh8Kao+(xWiOQasOVXtP}Vzn*>$0kv- zl=^@-wGX34`g^xp+FVFPU}9B6J;(Xt8%j#Km5f&z1!2vZ8a6b_lPYFJuBsjsp=(v zOtiFk6mv2K^}9``tn}G?|NREeZpt{|rb^&`OF29M6+^5i-_r%~HVZ6lz3puNYcp6W5}_FM|m@^BB=2U4E+kl*Z~mjG$cB zKLxr!t@1QB7gAS=;JU_&UJ^KdA%LCxxvEmmo0`PN-#lMimeG5^C1Crz&=?Qot=*It z=Z)>f_uR{KV*<9EJp!0^O71f;pu0SpJD7XLtw`6f8}VaMSo%FZBEcH*M`3RG&2f(& z;IS%YXWltciWsk4uPA3>R%Fi8&{Voq25LSX_QJE*b z(x-P(mBV|HAAPc0tU@-o()QEUn$IgLajYO8nfiv!PLUU1uHyC@%SA?JN^psJct}&i zGhO?tjGl7O@)gwEl$~dD6a*sr&9W-$BmRUIqMRGF%3Q#7!y*5Q@UARO_t&@S&uZS; z=DiKOcU$_SCNZ;4%aFLpJ0B@#+kzbzY4WtOuK;%KRtPE#!w?^2IP;}EfIttsR07>% zdwhxVqDm6=!|$oHFzSNNu`zj{OvJ4LX+}HxD`_2wa|nH>AhezD zBj1O#>S&!Zf$}$k6L%_AVOi|;CcMk~0eCq!mf=)BzDw~1LL_TTHSz}W7;UQmww|@& zW-(;h{l?zE@c!y&)VwiXgcxAf@yU{#%bSF0Ahr|gpIWkx7=RhxmAdK*+P?fw#iVP zN~bPPT$;;bgAjELpXV2%goF+}YUGnnUj$Vb(YU*neqk1R?NI?FOmpt?ES{v|gDZgE zI;(_a(O9V5umjsfN8%B{@x;B(6BO<`0@E|Ks7;;G!H<2?wT1xLx5G|~1Kf}to!0<8p2rH$`x?j+ z+-dV>^^hmY9Cf^eT!R)W9DJQFuSlk(Da5UgQDS9_m2Xvm3<%%!99$U2vij-z-{Pzx z$8V8x0!R4UTO#G|0(i_@KL-HJjdXFTXp$pIy9-vD4N$rvtt0=^})b{*D;Gqz2nt|0Dn@6kxvw2 zf;8(+%8BuW0*dyDr2X@}+V0X}ISxo1BSsb@^rtW5d<9u%tGG09ksXETYB^jtdY@dU`j_?Trp z?Hr0TU4823-pJ2nJeQyIYSs*K!+7Pr-ue0Uk94q_|(NBI4v}8!z`xhA)E8lUvoj^r@LV4hr_Vi4@qopR-eO7tfxEH z&POH{TEYj`C%Bh%7keHwwfeJcA$!Cos>x|NiPgf5@A!|1@efIFYxR~6Mi@w4z01ru zQJhT6e0@7u!d|P^gDVS(NWpU%CG-T*ci3ZN((WlV4jF_t^yd4C&xPi)IbrndGrh1u zUi`(-Uq9iZIXN3Nb7x~8T=aZ?j3iY65Wmk#whZM~{&<8iU3;u@1pBlyJp_+Oh>Eaw zq*bwXGB88WT#CqZaXowMmtXe^t8P)vwE9V`b&tX2MIK|bNsAXD9VlSfT?Ns&Gm7-2 zjwkACQLg=tPjiu4F%w!oDUZLG(XxG5&2`Ndpd0(yU#hVXeQzqst!^8VDMbUWhuoQ@ z1(l8?=;rDP&iy-muw_8RnqRlDr(?gany*57-1vuw#5esgK=`+!HUm~jeGOJ!UC5+%g^RDx_XUNj}ZzWyaF@-1Q zz;K1UBTu_Z52iuf+uxPaIBgvyiZ@tqf3!wR(KsDk)TZ-Xi4XIvao5#~^Pu3|DEOk+ zI#=)NXws>mt^=hd9Bkr-7;ts-W>14%D#A1K^L2G3T}G4~W+>&P)MsTl9SmUYn@(!A z&r;Seq&G$pTbyHeV%p2w?T7a5(==woI z;R4Cq_DWfOkvE+7#`$vs3hiM*g9CALWs`3Nrq~g5p(96|uT*E}EzU<-ZwoBP| zI!)4w_ggX#{oMH@v;YWS^S0Or`40OMhy}JH!(X$(tPNG}(H4zC%f*dhnI_hl)oB7O{TSoM8vf7K{^eosC0gQ5C<$TS3%4GX->hl4dczhTeXG)%5Iar9DYy z=2t7{YFF?w;@oT|j7=5grr|+I(`Z<(sN}LJ{ppXxV?|cP_4$eB)r^JK*}(zc)oQfQ zm0c0-wI7V$#{Ju3gD4njQ{}z<(-N$hf%?(^j3!tZ9PjFwRU-NK28(pYZYN2C94SVWNqfVDBhJTmV)rUtkKV2mmpA-ZwpPz z8F}WCf#^f6&kJ#3&nWM$>ToQGxK|78Yv{awC3TKaQg;T}wAq$=ZhKWoy6vE1k$Jc|H6dDm{*n zOwn8M6ICx)YX@`VA90X;Zr8Ev6|&`-%~4ocYiclYPw2SZtsWTlESdBcw%1Btb=<54 z&+M~$&vC|ke?9daI6Wb_+9Nzv)xWFRxYJqbVU!D+=Jp&LlPP6rWzRL@6UHv>%_`*N z+H`CWEz350;iK1awyr^}S}<6;jd|zd`Ab&BCcowG_XNeq3@NwnL@D>ZeN<;ZFqpKQ znA=5x?jlsLWWXdosq;E|_G=PQIoJ9MxeM-Tp?cWS^F@o1ktI@IG&H%;h>;eM;2;6q z_RTBqi`jf8!c_~UPesM7*l#S3>l@z-XA;=UOfo339J3y)uy zKYll2W0RAbE`%9#7W#F1S8NTHQ>6Lox*ykSAQ;`U)G_Co!IU4(*dag6_1EqHxl$=DULVW(4n4kB|~f*q=hYlPC9jzrYCP9 zR4L0LL6a_Ii_Q*=GA+Qy5%w?fQRqDn%P$t%T$PmU+f|(bgR1+O=X8oWuAMd&M~jCa zfoE6P(umm;2!?&Id(T1Q)7jJz(bcy|yucvDy=%{Fg5c{O{F|8u?%*Qa^ER=Fg$0X_ z-TACu6HzT}_Gae@5ELkG7S{_vP?>`p&9WmId@VdG#aPkjPNtNFi;WARgq~Q3?(&(? z-*L~6J~%<1goJ)gW`A#KCn5+kDT0d7jg8-hU^V?Wo)Vg*JfNf)m#v#w9!hFr^$G&` zWY_!EX|zh2E_q?g^2T{vF3PhAp{i4ixQ2YaoT`Bg?uniBGF)%nhNuTeek$3(WVCcH z9c{~@n8BI~?0XT?2`g}*=Ax}!fAgEg!c4}q!6$w zE0OR*OFeE*xQadL&sCOyfI&Wx(ka^0UsHhYrCK!jQ!#qVO+8g^lb&QFuYYOyNkpe@ z#8)nol-G0cCdpVUc#v4|_<9g@L1`yLJcuL^)IlCqUzupNaugPz@=Gx0cKk0@R!70je2l1Qlg~A8OmR%tHyT9hhojhD+yaDdTu{ zc9%}RUb+3uL+BYCdM7?gYtP(JnvF8~?-l<<$I;G?xF|&3OiCVG)V6stH&j{mj;9Rx z9WT8s7iGn4w_C?<3#gl9Fzl#00|vB@G+mC?9NtS!puhn6Z)W}ejn#&o6*l+HQcCP_ zg%e!a2|INQQ3YQfm`3~UD+{Ac%(Xn)(08k-l9w@#bo05TUCaG)f&84O8p^+d_J@pE zgWJEy4dN)b(gT`j`Di90)M@GbWQ|{|Ujok{cE4i2(OeC{5ND?ise6MKh_e=k-u?4) z+pFILm-|TKn6rr%#M$OBe{kD)nBG`n7XT4YMCREbz+jSZ>=H5TQ7=XT!+2%gdFLVi zkW~xdt=>kY-I7={n1f;?t>ay$G7$POyu>{TFyQfg`a(y!$eXV-6%v6Z|e02>!=(gG42|3mP?#^ z$5G539B{Z(nz(DTF801bj9G#XPuparprAwG`iMe|ZzuGdOQ^+s7I~J>-NQbX-}?@0 z+q|+PV+IWnaI14ezc*<}TC4Gar4NC^)ZVJx42u_&$rbUef#$CMm?i~%x`K@cr{P?a@N{6#LG-f!e*tp2bo!P>C)u+jQnQe4b zMkC>izJVdq(VOBc`U8!DAo_UK(fg($7+PAnz()Tx-hF3V&BW&61yb$k1Nop1+o<6y zEX#wa5F8i@P`Xj?1NIgT1|3x^#gcFw4qGuGVz)OkkTjm>T@nx)- zn?vn5jq}Nu`W@1_^=1z6Vb+fO$KzYCIIa%7>1x^&slx%~L#72eQO`YBCF`v}BTw1D z7*Q|C-!*Lb}s| zH|GC3|EvDjS^ehdf3eQibpFx*3HmqwzleWR_#gG(bO!zZBGUYm-9P#LHvz7H(Ec9> ifARhaaN}|DaL-1&^egw4PQb5QH%n7h7gDMGEc`zrOh8Bg literal 106126 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

      4C8?70GFXs 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 Date: Thu, 2 Apr 2015 09:00:15 -0700 Subject: [PATCH 109/111] Fixup merge --- src/jars/commons-collections-3.1.jar | Bin 559366 -> 0 bytes src/jars/log4j-1.2.9.jar | Bin 352291 -> 0 bytes src/jars/servlet.jar | Bin 79265 -> 0 bytes src/jars/velocity-1.4-p1.jar | Bin 360664 -> 0 bytes .../recipes/completed/SimplePuzzle.java | 0 .../logo/tests/RecipeTests.java | 13 ++++++++----- .../recipes/quizzes/tests/AdLibsQuizTest.java | 12 ++++++++++-- ...QuizTest.testCorrect.Mac_OS_X.approved.png | Bin 16768 -> 17019 bytes ...izTest.testIncorrect.Mac_OS_X.approved.png | Bin 12662 -> 12781 bytes .../quizzes/tests/SimpleBubbleQuizTest.java | 12 ++++++++++-- ...QuizTest.testCorrect.Mac_OS_X.approved.png | Bin 16768 -> 17019 bytes ...izTest.testIncorrect.Mac_OS_X.approved.png | Bin 12662 -> 12781 bytes ...QuizTest.testCorrect.Mac_OS_X.approved.png | Bin 13284 -> 12891 bytes ...izTest.testIncorrect.Mac_OS_X.approved.png | Bin 14619 -> 14197 bytes 14 files changed, 28 insertions(+), 9 deletions(-) delete mode 100644 src/jars/commons-collections-3.1.jar delete mode 100644 src/jars/log4j-1.2.9.jar delete mode 100644 src/jars/servlet.jar delete mode 100644 src/jars/velocity-1.4-p1.jar rename src/{ => main/java}/org/teachingkidsprogramming/recipes/completed/SimplePuzzle.java (100%) diff --git a/src/jars/commons-collections-3.1.jar b/src/jars/commons-collections-3.1.jar deleted file mode 100644 index 41e230feeaa53618b6ac5f8d11792c2eecf4d4fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 559366 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 z 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

      `%1z3f3I9{zh!5R(Ih2PaR)T>|V$2*qcbkWb8 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%0Ay>pY!-vn+{v#bQNtjxr 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հ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⁡~$Py3|DlF$%lyfCnPAu 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 GUgIOVjX^YWJ+#$3+>)do}`%=eHNS)`yb%O zf!ArFQ^qjc#i4XY>%G>P&@DuJl3pacmY7@Hn&r@oI-!QGnh+35m9YfedGbxi<2lN3 zF3zI8c{|69QSGD*CWMx#m<`A4#B^%yh`BrsY!T)Idc+h|1t9?_UwaJm@{9{U%6>L{#-J9U~k$iV~?jjI_3kDz?KqWs439TdR+pTyaY z!bCmi8d=K~(6j6@VcpEbE(g#9<&4oJRP8a1^q>RB9 zykv%U&CxdOzk}a&gKd%Bja#9@6_+X*NBEa5_RqUp?vLW0;1ONXU+H+*=UfvDOtz}1 zvT)9>I}fghzv%Km@fJ(N`;BdUj|e-cc$%l-krDDrg=Yfwtp*{Qc3{ZX(?c2{SISd{ za;je4tWvUa7fnU2Qmx9(Y*ccPQY7|$zCh-Ag#_WE2J+H#?c+eI4A zs@oe=;%}e z>t=0-M(VRo{c<~xpe^<7+d~gM=qhi#t^BU6^h{Mug4L=GhH@i9y(Xo_Q%#!Cs*HUO zQaeIwvU{;tUO63JOZCD|0ar3^C)(=SztHN6ZsIgNMRG~%G+=cG+ZJ`WBa?W|p*XrU zr12@@xxwz-136WVaEc=tT?|2K5>>*Bv4@kjgY@0z_$-|MQbtGyBcp~^YIteWvg>t7 zZ^(Z6H>)GTX4# z*kW{60_)YrpUuQ<(te+MMw-bB^29O3jQh@Rz^OnXewcW_Q+8l6x`?pX!mLf6^SDLXr)^IDu!R9@Ty| z9WBE8Ng9s5iQ#LH z7K2?RnjKuLJxC*Hrq~5!4sQPv&h*?1*Tz7&1pLAe(Ua5;z)SV=M886m8E(Dk`4oTFD(#3AytgBaqB4dOW-HUd1y%i!L)RMB_1MgMiLgKB9 zaJT?rl;|C`I>8}F@N)6rdBk4qNcLvmCFKO)Dv$r4oAJLipQ`_os~g#x{%>|%^}C&X z13j2HFpmUcz6q^Zd6k||@sC=On)FNUz%=|=NTUH}yd=W~eFAfuTASAl{&oi4Lyu~< zx};f(_89&)?+kw4B_kw>#zj2!WarU%>(P0`RO{0cug@pg1%_yBaF7@H?%%B?PC#G< zVX^RdXeuforJu~)X*ZpG>0sO|yxi!vCq?3&Z|65&uxGHy*ZszOF} ziMMIQ+Ga1v5f#}HyAQi78I<;4FZH~FLhhqFe*zyUQ7j&t*o=b7tE_Cr2sHor_L1e7 z%;}|~4s?r>e#X;kfs`{*4w$nAu@n>}#p){&Rg~8TIx=i^lk}6^ekM`q>KfbmW)`QG zV=Fg6OYX7Tn9OnbCKHzYKovzM6{tS@ky4g{@KHyu*A0JlerGwHC14blj8a9yPbs1N z#H?6d&P4~QSh7djw@m;eaw!{CF<3tw{>~>%$-3>pW0=mI!q;W3N_f1)jBO!Y7yT>` zn>%}h_S9nkCl4b<%ua7xjou$O9bV#s1$J+;(hy;8bj3{b0WY1&^vp_0(#hS(FhoQa z5$VV2b{p}psR*kLo`Mll%)Dn{yek1m5 zbgo$vDk$ocTGTruNXBF|3!J~DLk8Zr*R{4b8T3qxuc(if(p42WA zlwfU$Jkk6yA-jkAV}UV{K|QK-CG_uq+iIpAG0f@+!R$PY@o+jx^drx;PkaPe+sE~{ z-$^qql;50i-~Tu$e?r+RSnf^5%I|K*0wQwgWaK)c znVjLYJE8|H!MWMZB4Z04asRMXBR?vVx5Ha|(w|RqJ1t*$iiL`;7I=!SOwF`%yrP_N zJFN`zNO|IKv;zX6?ZcT4*aBb+B2GM0J8~A0rI`AK3hvu}H`^m#$pM2z70z!) zH#UYp0q4Dr_mw=t#m%nxH8a_}vumPtF`uRwwXhDgp0|*}*rw43G&USvUx=7%NcoR9 z9#V^NgD(U(Ad`5YT$@PO{ruetNc44*e0}g$=Z3?Dd9y4m*+eYGxzy1??%O=ikk3y|vno zC8kb6+z6Y~%dVX~Pu^nyOPQf61|e<$3XipQ%qz&xgK1oMnmSwY)&t&#W{-DnReQ)3 zWivIExTIQt96_02m<-Nh`(w|P`942zRiWtZvqb8M^m?1b&NHHNIUGBLCu(-na@K>I1M)UXCv`VInts%Fl= z5dh&QWO^RQ7zEnT_(b{0LcH?70xJU9g-U=C4a8To3H_+6R7WZ%LG56dN{nsB2Xw)9 z(;9-9<3UG+%-@h83(emIm>AKuGa|a6g{Za=JU#tek}-(Nd_~M)gf-J|LibN2MTc7G z2M6fHXv!&#_+9@*_1Z2_@-qj&GdX_zn{|O@!2rkmW|FtR-^~B{y`=xAu~%GCmW_oT z@c&gcMyW_!A*&*M>YOiQduFvr;^c};l23C)2OvX)iTBDv6f&o71%e`dvfK=AI$bb7 zrhhfbs$Tz^qTZ>Y3B#rs~tp$H=94APSovbX&?Y{ z4=GxljaFZvw=fVHNk)Q=WT!EZ5lIPBaXjmgV&ITTXW}~Xk#H}F_7|qb4Aw$J`tM~b zIbO18H8AcJw9+&jq-&UC_Kj8AZK&ob$d-_ClpE}L4;fCmQ5o|fdFRnwToQAciosNk zY4vKWwyH=Slu*(M0gmFsg_B4$#&M@7E9wGF_bRza5)rsTPmXq%iewfmwEFS|x>|?K=1mXmi z(R9jNy7L6bH8SIZZlLN9Ml%LZ*~%A=cYhW~N#MSS3}={Is~rKGYdCyiuY^WEEO#rm zqc<>Yh7c5>T6PYP4)@#>((O@0>7W>^k&m#2e4F2Y2V5MVpVsOpfMnnvyXZxLaKqhm zAh_yPz-ni~v8lA-P=WvCT>d1 zYh>DfvsNj;Ca1@9G~4ssKtB*$h|#3%QmQZ02qtN_p&6ghs?$xX>(&*9v_NL)=&UFe z8xc(W5z~>+Ya5mv)n@DQ7o9j7>EdG?8G91BCs}xg@^ExJMwKOT&?6U25*xE41h6OS zJ!$qPj8W;+bW$!&bGH2CsbD_sJ-n2=sR)lKq9Z3U#%-kCndEC*4n9 zWfT&~A_TF*=Q+^rV!*J3Z0_ryK7h6=MrNRC=AecO-4Q;^3y$A~2pCGP$Xb3d`Yd^5 z(CWM-btPIiwS90)UniK7zCh%1?LtW*+Uk{@Dl)@#=GIAGH-7dgG!vujqXwtk8VlEYVCW&pvC=G<;pv6~92@xBg#+Df&t#`g1vd z82ba}U|M1QP;x4aMT#gG8i`PXLMFgG6%}U3Xn9xL@o5`_${LTvc_ZCE^lO(t9o9MZ z-ouUA@DPDeKovEB>ew`$cfY3i1y^GWI(?jpomh2lf1vTl9B>{VGtKsNe)Rr9KaW5| zMI;*8P0UU!yl>*;sGA|zK4kIXAMx_~gF0*PyL=d*0w|ECS?8xbAP}>jU#L?Es6BX2 zh8Q1W+mw&HifyTDV!P1iL)x!;Eg=DJe7aEZ_877!z1jMpyoM-$cgcN*Fh08h?_rSd zQR43b$j|6xH#jB2G)jp5iE3fy{P@rYASOa6m@|_2P-_6H$8H31qX7shdnot3ol1H+ z6yd~v5-o)0;|))6)qZU))F(S>uI{0Ew50*Xb(E>=Fzr!Rgl)nsDq{`j{0Qtol??Jt zEYF1~ntS_w#I1sm*QuzVHxQknill^u(wJd=5jOVmw@4v@*o1to7<{h@`Bazja9%3Wl% z?JzsNoQRnoFXipHGVaoTow~V)%#btg*8DXM?pCtL*33<&lDAH|kLnOKhfZSn*4%Zx z-_;)YPoK~f<_^Lq-K2Eh*_(7f{5@w7-X7TlJHer;!u=yGpS+zE;JS6S%MLy+PGj9a zb0lk2g+smF4^X0DO-5cdIIB8tJ+#U=erRQmYJ6HqW{%L=_-w6GDtf+MMk!;EyyV2^ znBVoTNF;x+kCpO|6HPL6GlyRv1Cb%DDjehEM2`!sttO!(WR4HPnnYa+6$B_r90t1U z$Urq>TC=fvXs6eC?fd|y?~uWBan9VPjSSqEpzNL<`@_`l9olVr;MH2HL3Opq$zYEr zn7SO{bl>fQs(X^6H-OYff8=b}Q6G}wyX~&ehg=vT!YRl(*{rGCP`vs3HRWfj5uO&7 zmGqQD2|1+Yw#9e|u(mTefcsavl%Hq1CJ(N@ENG|?6^Qcm)j9t1wCq_UGMabql41!G zTLK9gezE9$w$quI)g?vbt6`ECVAaQgq*WWRg_AOkQVl1lTDrnNmj3QKm(oXWUV@ybq z)F;4|>3y;Ps&Hy5G&{f#GPM%QjQSLC`{TuvgN zDhL!*=J;}w0HD!gT5Ty@XwiYY0?K-0LtLGGlihMPyJ4^>{OE|vr)Yfn>o+gdeT`eq zUIiBqiz-~!2`bSC$oyZLIZnd4vqb$OBek-mrs)aBG>8fgNz%_iUgYREIgLJDsdv;X zbGNPjt!vkGOSd>FFOB4TiV<|h0lTDBN{~BJo^JnOPSQ_5cxh^bFl~z7E)fyrv1jt~ zNt2C|biMu0^JkQ+V@e;m6bYFgTHL9lEQi+UoPe{M$6D7UYdM>v^WO*y=B}0EaaqQ* z@FExHD$BX25K(Jjw0LR@sus3^mm=VjzWdws1bm{cmjqi>9bGZs6`@0uSLe zJH#3EL5{#N)^PX1)ap?q5v#4J3{w!UHYfBm=WATn2YLRe6 zn>G1P#lR<3w7>X8-~Ei8bUOm7*UXBH z5ZAD=J?#dTqk{)+`Y@uNaI^-ioylC6;D}S|OtZuKuQ_b4CD|n2nRan<_D@k90E{ZkhqzVSLg0g7L1#LaYGRopV%VW>Ju?hbr-p)m`&a5!|n*|O@KO) z`nw?db-)a4*O4NYJ%b}EQ%z@cb{TGL&r@1i^HM5TRVTQs4ZO1}(8;|aA$`)uaGDfn zg)XBQT4R|$kJ^i|Kq1o(^Ik+R->jRYC%y=qPnChas zuPXiU!LEN|K9Ra^7Qb(3{9qCtCJE&{xyJ#D01hoDsfGH}gh-sQtCowl!iPr|7f zA%?fM-~_EbqFrZ-23U4~PF9%P6;zN`X!E9TiVWa#zZ&HpZ}j7qDvg3cQ*`HwAU|CdMBROLsBL+;D0Da$l4$x#CdNb-Gs;&0}mVVB}fE{30K^vhh&>4kGY;%JiIinS9D} zeA@c@e8J_F3=G4TlFQ9sCX7yzimO!vm!U(FYW%r<5J`LQfjS z$>Vk2=k_Bptv3VTcw>g4J(gRT+t%QroWafO`^Wp z8Sk*Ey}^R|{1ds%pG(sqMqpAyos(b?W~7Tnv|83=aoSG?Hf6eahhbG|+^i*}#XmXa z3}>>s2AZ(ET8?#>)IOhCE>w~xVH(>3s7*oK8PC}GZcu*t1|rxqrYr;tp7 zKip>stEn<^TD+u4ApPK)0lYdbhmvnVxN#d;EK~&*%S^XWJE=LqEa=^_B*Bsoj(ka_ zLkF#BwoAceX~u@G;S956nBeFR)+1jFwR$1WRPJ$u$o5u!kArT927Q|QH?5Q715uzI zPs?9~^;Z<-qU|55dOvk^vTi{Un{{|SrZZ$~hi(6?pKcZGS*7NKVNi zE5YwXT)RSi5df0}I!1!j#0G;4xv2%u4%mJLaY^Xnk&MmN=UdW_Dx(*@2_eCJ_E}gm5IGR}~17z9W z(AvkKb?_?LWpdNW4!#;bd?T8(W9NnaFhwl;REqO4+Tg9b%u#=$Llr*djSzbV<06tgd%PaKK7wQ+pPFGqd;#~NaMyyeGi=J-&!_gd=qKxakWm>L_q^UalOm6qk}`1u8( z^yQTxU62{W$@+jvlf- zuIcR~$DQSc;_E#`s>3x?-QvPrcvYv1Ai_YM3RMEK{-#Gqrb?YB;%w`7TZpQZS{{~6ZpT5_L%++ z39{CfZnD;f#=`dYHuhrr)<%~9M=YA8d@h5;kNgFCk_323Np6oeSPxPTs6(C~N)ihX zd6>^Y`bTZ($G(Ym9ppjY6B*w(?9kT&4 z-Ja=C06Fdu{IDxB(j5oIWC45HupL*gqFFKFh%h})FH`W*a>L-^Gu7b7#~v1_m01ej zP37RFg7c(sq6iCq zcjxE~^ReZ;%zC_8#NlTb&2IHQjieau@Xivci}b6G6RR8NpCE#cgVrKyItN2hBbpNC zx{OT(74_C6%id-lG)ut)?PWW()-EfEl<-L9z?OqVi9X{KnH=foXZ!m6TIHy7F1EZ1GQ~z(6CTk;3V4$G(JbBk-hn%|xR(ZuzpC_=Vu^ODCW*_n=FvK~#+7 znhCq+Ac<8aD><1jzLo4V4&sA&{Ts+zr9U|CVRKT1)5+s~Tgi8iOL4E;)sQiF_|513 za>2;E-3LR%pY|}^-A5N4!KrMAbtjcO# z5+;aM5QVuUGa-54e-7^3nERm%zMT%x<5|KWH9Pw7oxsk*J$_eRYhhvnelnb(!TER% zJHZ}W5kxTnxSgKL%+c{FJV~9i0>C_ok2wcClh!YAtdhTqG1p%{Gz)k{X5+lU(Q8|< z3lvnd;1CohK=>%P;n?F5)N=>U%Vq)va*MrkxAJcV#`tEO6q5DRI4aMQDf7IV^Xa2x z%7@{6{b7->Zik4!0&ouiWE#^2Gxz{zgKB**<>9pppiI^tewYx0dyf`_!LN38ARcT4 zoc;Wp8;#DgQtoTmDjmgIx`?wul14Hpmy|EXsemf|9ejh^YRR(bUFA#NvS;%bwl0V~f(0MX#W9(*4$v@*Qszrx&-G9VgIe<-){BPRKuC+h!N zfMx#^qVQv??`&-U|J)jA!00J0Ch?FlrMabX;bVvq2mXck4-_Z;HS60SL;8z271*2* zouP01faE6?H^OEM*gyXzqUo{a5zMDLVF`Y4TS9-`YV)#MyTjV0W8KQ7^14To-rsjh(S&wi?!ga`qyy#n~pImw>8x$l=!U+>HQ zhY+6jP@bR9w-dv+sF=3#EFTmeu61vBH`K_--3P$IT*YIG_uTzFMGs|Ip}xDLp) z%C6OY#yr`>_g&Z{0i7U_DNt=tgSi5`!jN75(zmZVIv4vAI(vt?eaeukP@Dof)$*+> zv65Y#QoB%{om#t4DBUCDPLMS>cM?H#D(uwE)e5dnt~H}1uQ3_OIu`RFz;B4+y5YP$ z-HGRe1^l}r1YTJ&%lDxAE5O+070aDxx9c_t;f%y=$#Lc7+zrBoXQwl%5O zitJ~H+K|^z_7kG-rv;wv+3zUP9;>Gq z&(#KZMQW@z`gC&O zXI&RG#t+K1>XSw{O&!nadpIzcH4{Fy+gGcd1|93Hi1G)U&HpGxW{I~fqDj+(WaO1D zsVGsQEIysq{o0gTu*R*;7r~|kbDE!%zR0IH7$8b78f1~IVUxB32UJnE&N*A8R+Oxt z=xtcJnYf@@$)zeD<~Q33Tlv!na}rmIYH=|yb;8rb7?EAs_jkg!i*q*VLO-25sDxm3 zo~UI+-m*cpWi1#nd8=oTc?Z%W)XW%FIY++Dq6PL>wKYyUMmF7;p7}LX6gMIM4prz7 z(oGdgkPB8YEgIgXZ6j%wY2^|FX*pTFX|{h`WZ0y3$3rMfFS|)Ng$sbfZr0vKcr0!h zF{lD*Lb$Z)Xlj#k1j%FAYhrRL+3kAyV*tT4BPKLau?4uH9V(no*MWH|y{Y8Ab4^O$ zF3H5(-`VXN7eN#?>H-RDyq&(Ef|%%0~~P_CN;cdyU`(gY$Y22MJuU zKdzV5P=F#P+GFSQh+fjS)?RdT3kyj0nr$}|-Ck;u5VY%puW?3wjBhyooGdD_c7@NR^ygEB*R+IR4RB~8e z$&MwL0OjJ0$^O{X>&D2g*xm+y*kDiR7t7Xg`zUo&F>*2hLn9fuXd06^!Gtp#PTX1h z&Mkl$Xb7R9GEOo+ip@z0fjv?&mUx-1gQy_2hq7xWo6FaFBpAAAwV2m*=5uH+rpNQ0 z*f&jz*wk1Hq{W5i&%#t8ZcZjK>+e2Oa9TbyV4E z!@;AZAl$BSr<=`k{FbA%a(JRei7}3?|BdLd)?70wmX4qefTEMVU~Lfyp9FRSRQ$Ki z9{DseEic|IYs-)+tysU@6DNamvmb)%M29(J^pD4?0>@|o<+Z*MpWPEIg%EUEXH1Ri zE9h3uT@?H{+bmNlgL*sWe7uzgAv{~9FKPsa$HSGcF|d^OIV`bJ01Pxc4yzn3Fs^UH zm_?^&!&nQr;&u@pV-gGIs9Fm$;T$9Wx^V6=J&bpx% zu)8+V2ogs+Jf&Beug)=-u&PO3(F#6T%VCNtCio_rm?0c0esuvGpQth2To2_h!fhC@ zDpgjtiU-InrB~c;Rj#Xkiixs${jfw9_>ru?(yo6at5>fM-<7@jgq(*8N6H`E+Q-9W zqEf5tx@zWnX2B@E4N*#V$dWHrx&gx4O54p5kXas2)@pU&5kx1N1I5Blhf%2!VUp9nrjURy$kc?zYr zW?hSJ#~mBH4mBcD1oR{@Nl;wQo1c~oAs`G%sO^ql5S=eL_1VZ1pvdpuk>@zj1Rzns zZSw$J-{B#k^5`% zp^P5QOhH~?C_Fc%%p^w&8@MSCXnE1Em~qU`k5(~XG9~Z$90STzsa=iji2FwR647G5 zD6wKe9Uf|hH;AMyv{O~@tD~T|ZQn%JgTJG)=xOs1ezNzfa-HWuhwLJWV9*ewjX6kR zrZ!s0kf%`cK;4wivAVDXPgX^s1y4Mizeoa+6TzNx3kRU9u$*1O0B@jqsltbs52l_T zPD|;+5=jT9`|K!vKl+D*5_q?&@925i@`j88DUu*5Hw9YyN|=l1tQEg|%QgXKj({1e{v;f0&U*>KL^&Yu?@Um2im&uhR>sZ)`~qi$~3D0O>1j zaHUXW+UqtAFJ0iKRLmTkzJ~%3AAFQb%6UW#_XJV8G>n52&IMU5cnp71PkTI3PORd! z$y)g`BI*+tKw?`9W$;Z9sWJT~iU9Jz$dGT% zKC(Wlg0iJ;1;r}IqLltYrT;{e*#a=9n&yNFmSQg3E@ z^lv5}ry=*k$?$4s$t4QEYQ|dcVu!k`*V?MjzTEU+X5xY9RIGv8=j8xTJ<=RX0^0NU zc@m4j>lrf1fZ2TscK}wkt%{$DeEyv$?7Y*?Lbcu`{_zx7D$5oCQ#?z@=w9yf>o=W& z!ST1FoIMXpd;A!MsEvo&V&TK+-hlXN0^ag7^C%)(nu6Al4<`b-1tLZkh^3jl`BBth z^ES^d6**X#mApL1T}M=;$NbpnbMdshWIl)^leUnMj)KrQU{Po=$+qe5JFk-aA^wEa zZhW5y<$+N~Lr0e(Q_#auDxjffeWeJt{VXgl{%kbt+yd8OPyx)=KwbTsrJ-7!z1ia?Tc@A(2s zL}w^Zii$wOb5Ukcia-wiX~DQV8ujXO(E?P8U}bw*Dg=uPn5{J9Jg(+*u)(9|9_-*O z33;=r^ll~6W%MZvm2djYUG-s?7!|EQ*E}vpWf4yhDEUJJEm$F~b+U4ZUB_bU2yC_S1U(ASwc_d1d3mP(; zFqS$KNIC;mGNjJJB>`bvl@-~{A(%;2F^7{lA*;s`l^vggpzjt*VD^^VPDeOSFxd3$ zX9x8%C2G0@<5HO2rl`csZ3rfw^X$<%h%Lv>5t${7#W@D5wVsk*yaB{|Fy(tfNp&S1 z5e1>)i|l7>hz;Y&(iHOMrR1{b{Fx^|3M`SCNi`hnM~}c($K{fiEFxGmWVT5>!ZVY8 zwfNu_IbhXDRqp!wR`Zi(1J)Hxb5@^9F;H{*Giyf&*m8w1Dqlj!KZb# z_Nd*G*gV2_Bzdk>(it0-o)I6hzkjJvdtFg`p#;^`Nsq)p_Be^c8 z+yiQzydrJA89?N+dtC^J;+-x9%wf;mFfOK$dk<9XGyfnVShJLP(Fc!Mf2(S(bnylr!f z?4z+st0dxPul_F-3>NyQ=(F~sCQs@GMZ81xbbOri&QgqGFjGsz1G{WN__y$ z#PMeUYb z8d>$rI(__}%OMsZFqA4kG;c#qlj2!C#4Z8QxaV% zO^(RFHTh(2FgQn&C+gKDHn;7O$zBr82Js8>Zk{NKrVAW*56^6=4*ZH~Qnb7C&j?T0 zr}LslP-MR^)z6H(h zNpIw(px@5zBkXULPl%ly*$tp#ndb|U_FTbf3vxjfW9|Gwx5x#0+N@2outcZwwPx43 zNN|;Ckv@kaSe2a8?v)2a(%oWcm1(GGD72Bw<&b1WrtD65O^Ydd}+ zV`g~I8NTCM z6%c%I$+fquYn40l1uIE1fAf&bFLXa8%SCrjrm(J zLUDU@$1~;EC7SGSt)}lS zMSFUWv^bA+zz0ryT#u;B%`=mpXY5y)Hz|&roHJhX!t`lQ9sw9wuTP$?-aTY=_&23T z0^ygz-(ZF&1K~{BPjV=(InQ`49QsW!fBS9QYNIxVv6rAKDRbK9o_wDaf*&`|FCZL? z57w8Q)Aeo2SCn2Hu;}?}|IcBHWRJ{h2fUI%TR;=+n&W*8z6-Qm_>^&tp$FYL`R~u~ zfA*?ex`C)OhyVaZKdaOKc~_> zIdQ6agObQ`(U(%r)Tf)`xOSU%n>xPwdcD53*%86sezC(~;(0J!>e{wsElNx@nhNnq z{jstd&CF?c6G#0x5tN93_og-w$K<`)gF-Pwfm7yEh?Bo93OA-x=^TM1Z*E(L4>hK2 zQs^ti43cJ&uTCUwLCpBmX1;V5Ryk{$%EGB!=Q4>|WcKU1*%&IcF)@<+m+mSx>(RK1 zxOorC&B^NPLO!jn9e0EA1!h>iehQ*{!Jk!Q>*mC#I2gKykY!`R6f-GxmJV(v zoHk1;QJ!h(dc_L#V-_Nl@yE>yW|kUGeqkf87<9_!>r&~xbIx^)G={C=$$wp!X#uwc zDs=qTaR?VHR0tI*l1zJAE!Lt=Z=;=1ag_Xw4kjM^Wa>tAoPlUGm8P$eK|rSh^w(F@ zEwpoI>uEXH3A9~S4?Y%te@<4`5zsqYubHJKhCCGwks_>WIu*-V%P!WaI-7$yjK=Rn zX6fW$Au9AMN1DFC2Ve#hV+^6tbIOZ6jLo3%y_V>(v4-!=uaaLwKz^a1+KV=!Svtvqq@etiwE-jy8}+p8 zs^J%b2p|3hir~~0Ooi##6O2f5%5e|`wJiRQ0pO?reng~&*Gqf*!O)}u1yCU43c<4k z`klQ+d*@1aV|szYr67EjBw_z3G=p#i9n6m5nCKLB%i|9b$qDh$;@^lAs}RU0Ab)^* zH<7JyTuAI5Mk=`)BZJ-Bg6$I#%lQUboidZpK!M%sgU;LM(UKV3*Ko)5W_X+2Y6pA? z-X#kgYme-hPJHg>=clHn(+DpxH{;_=_08K14ZC9jaUHJ3=lcLVY>(zGMHGq=ZIvv% zWe9|-#s?|BF%0wtnp_vCECIqL1QJs_e9JAmWY%X?QMpfgu@8zkW%P6l!DGw}cWJZ7 z^c5%aqlyl&42r!r_0ZtG6(Pv^&4>R4MO(^dT+G}0g$Ws`%ldsw3P(?02z|}%jdP>;JAQa{BfT#`eSl`VMA>|9zn; zQqq?F*@JPB;j40zxWF)xjh8z0bg|lU!Oe{TQn~_M#g`-h#cL zdG-Ovz3jlZ+)gFu4q&Fg*j{gOI2=uEdR$+%7P7^wUC0@W4)CB^BehdFO zmNeLcJ#)E03Hb?wW{pHQ71rv90b;Wo|4Tl^yunHz%?V0MZ-yU00W%MoHyCN}!cex0 z+rRLgm=NwVcgx!v5ET=bo=-)V971rmj#9UGFOekT>=!(U$U{@qBf&1n9!E_7)dAtQ zT!*gV*|G$a-aa6(N!k=YV=fMd9vp>^cJA=wgLkX85!*78CnTb0?r{lYp4-&iXmCV z8&KrVL-4?W-;@wjLGy$xeSzWlglz(TUNt-G=fDS_C8~;#2Sp1mzYzr$a(9gYL8~Qo zN$^0x?i=F!lyw0%_-RCBWN0*Rk z)(V;VKUW@fApiEC75?8d;{Sv%{STy2l(#_QhyQwVPf2}PGq*I?h|<8ah}W0~<0lr5 z)5C|CkZhFgwoI5b9yg}D&<1=}earQS`vUMuWcPpxGROzR-I&~%VB5a%?0COle#TSl zB`|kmZ%qk^vd4YC#gEve#$_>q2RSlwP9 z8TX)ur=`gzNb?v-5H&P+9@s5w zd0i|p7^QLSFWZJ@d+4#LrkMGgz3%}1Ndcbzpkr6)SxAx;Q+IwRjld;Na8MX@l^VBW zWjKMl9NOkfQ6#t^5n3erE9Y>KN$syp>h^CEp#Tuqd{Gp{KLCF>?YQ_ z2*~$=wLQM;*S*@qQEbV#@*U3{ck^ibW67b7-eUk=Ee{!aO80qUP*YT-a$k8<0898H z-ECq=(oLI#^FE3#=dMd#Sbo_c>eU2i7ommyRIh5KXS;bELy-zc-c~!XmOLl9J}1Sx z_>GHQf~6l<#?U(cdF*Dxeb0ZiD4cz^?7%;;i~CobDv|#mu(Q;6aFEfrGX5WMr=huVsxUoz(8ge(;UyVzFMhz$d8OP+hBTtCmVwtlif%xSP%nQmp<`# zx4k9LQCD8A_O_dw8C(!2DrN1oD>~$1mK_SXvWb{WO{Xonz-qxq@PpAy`tJT3aD^R> zZWK5rcgZEphkJ+T6uixwS8wd4m~5tu2%3P`4jQenJx z@laZ3YG^*t7z_cW;YSYER>^Ndi<2jbrIeX^O{dG^0WsS#fF+|F~;XG zODAqd5a|eQhN`6E*MhFJD;(3InUb0$ZuKrv1Da|hvY zMKa`TzIG{O9`Ze*&f1Pltf+ zT?{6fLW3{bB^QoNT~v!pZvHDt0a1*A7#^{wt#RI2ykmXB+K+d~hT&Fhz}A)cpK5rU zbvfjlJTqX#^giXmb$6C7;sL zQtQLxCg18Yq7f{4YO3;g)7%HRW(RiDrQ$|7jkjC&F`H@t-+#c z4#^}jd%1P!DYd}pk9E~Rx1r4IqsQW71x^PgHC1ubiW$tPP)9^qF4|(t=-i{F91mNg z_w5qSLPlX;(q>us>*rs3Ve*azGx*{iq%i!6Te{Oq zywm6}45Lm>F~VTKpVlcpJAP|7C+Eis3l6vP4b&~x$;(expWa@g>rUa_X@Qv zbZt}_f^p`oc&3QzRej*98#hs_1|io{h*pr8PjdBa&bs4M`ds-yO}yQ$rVlO<%9t8F=0(kz*#GzC|O1 z~^c`Z_xSFr~Y>o6wJi?SEeE_;+tBV?V@M{8!=#{qKn*^^cpT zzUBYGo%qQg(INcscfx?3p%he5v8SRbg&E|Fe;|CRfRK_vyt8=MfH1f)Ah^GR1b;3|fk_bJ*j-(mKXSG&CZ_%=>AB$@rX01lMShsozgvUPS*=%E z#cK=b6EuVZjlad9gU}#QT;J1Rm2X1je6Y*u*9j^cNquZ^;LWpMdW%deHE1_;E)?S20sa-j{m=;lPUBune~pvl-LBfho{d`LTh-148o~Fw(4oX1?p_q52jmj5zKr*4AXLbkh3i$dg4c%48dm zuQZjXR{7B87t9m8~{~=NiCHvrc{_LE^!U+uK11jx%dJ*Q2jR1LN zgA|EQik=<%49XFDMVPY6{lxBG=tpfS zP%ZS!K18E6;7R`qNEK49vYymRk$?||BuFM%dIDYFE6hI_+uen{zWWg_()?@N@c*M* zm9jDXkCOF&0GX1eERsC@S1}E>c5(y?0v-9tV6ze`{4bg<{CH-HK;T0!ijd2AiA(=rd| zQRyz~i}0KBxBA`pK8IwO8p=*Cg0}ke7vo(`lBb-ep9^|E*CkuuH)p8omcim=L)1(d zHrpL?nVA~m=9OdRV<#~CjB z{2_tZEWVLV76;W&rcbP9_{9>gK{q=3)M#nB?mSX#{@5MGPYu~~QB8-Txsg%rIEfJV zXIM6LX3S)DV#chsP9-und%-M=+U9(7c^?~pu32;SrrMJtMt=a_ry zePe_GF=EwgKo|IHp6`RKMt1`4Mk0jq%LNdr&5QZ+5O$V2j8J?W_Yz0H6Eujy+aNM0 zu7D1`q$V}rhO2k`Hq;x~^}VlB)b;pB`Sw9?hqtVbwO_*<>I#JBrmCKDaIqQs`JWCt z7*l^Z^{3np{cE}9``?#aX(7S?o&{No|HXno>-CQ6+S$sWKuQm0qJzeDpS()>~Ut1 zE~6bkX1o@he$QQtqi|s5t)baXAY}CFsC{FVbV`b`^|8grTDbdpde?5ppCy^TDjdVC z_idw$%|FL6;<$8%*492Y)=kbRfJD)sNDd=ekS6d=?&?pfvN&up_ zu(zj$z3lVb3;FF)Z$uK!;Klv=B@N3bL*=5G9iKt}*_=YT^eZAD`G`81Q zNiWH`=C0ZIW6k_tdKbL3CW?4xm6FOJUvu@1537%YEGIP&B>R>nN^q9H;n-d~=qO|} zITg@wmDR>@&<-@9(Ep4dN&i+9O^xo?2hNj|z*e?n41cjRe(CxJEI2Zv?YVk+S zee@YQhbifdOs?n&Vd&j2Ve*^9D!*oAhE44Or=e04yS?EOkv{fLO^=@D6c}_IL<_gK z2e%ikJPD3II(DrbhiOCq68yBkfy=FsW16A<0jS{tiQ_kSN`-B5g)dd>*ogX2ckns3 z)y@#WA?eZUg0!(M9EaL}J=$n>-0nbrAZPop)mPwu54nHdYexS)=!z7j|I-`);nir@ zCMOi;mjfPXPOQdj!o}wnBeqmP@ZY_d%d$?P?wGtvKH2Qy-J3uy@R7M=v1V7v za!+g(!Zuh&NB+n;cQ)%DpF4j5n6Og{Us2AHmy7YsGx$M?Q&*7lE7}3EDR1;$5|2Sw zeE0vh`=EQ?wu}gn)nv9T@UiC$kVIC~Pf!~e{R=FGcF{}}BDoz0wo1eXT6?8-f+ zN6`Nq(Za5@GE44Wga;6bNF}D2lMo~^N|jlMZx_=)g;CRgV+l-gM4=b3CswGFja@Y% zzkp&4oO}X|+~b1J8H$VQFWCq74?JnwOGGofE`9}ofLLRLl*9>zgRH^F=BLF)B_B*im2CQ61EQRv1s&%gK5ID~iz@*WQS9<2X_ zgYg8k4@gfzKLG(K;UCI~qMYZUEH=Qc)X|jrRO=@$C0_)w(N7|!cwm>vAh;P?IBT0G zgIJ9(E9ocow#xpk964JZYZC8xOnmqsR}_C+<;%n$4y^tw2dMwo9QeOujMSm@ln#@= zrn1DZjL`8h2)Gb!L-9usKqNr=92g-Oe~bG96Uz+{w2232O$?-k`B$$UuRW_QH%C}& z);5`4>N;9owp-oSU7F)nH?4SoXQfSKaS=mpeD@q@e)ArG96#o8 zay@PZ!1V^3o7wK^bLH=M{Kj?KW8k_XeuE%$-VKZ<%bL0E0&LuW|DA2$7ls7+;)m&d zGBEEd(#2g7e7tbei7A7+1JYUgBO6QpP=n!>@0ZOQ_?!q+d}-VB==1wlx|f9g5SZ+7 z+%x`=81~_~2?zSF%GIU%uz|eM%v7tHccB(B9L=v zzl5dv%}W#W`Hk(p8DfAgRmPkUBb?MFknl4Y<}V^)fM4^FRrk);605Ez5gI7+FaNZ! zQTZA$ldic;e%WDjApO^j{q8PUCrDg zx9d{!c&ie#i{hc?Ng9|0YFFh~niC7FtiZ2yM%COlJH)$l2~T`>j8~ZW78X$P)!Eh- znwf=E!KEA|qD6r_#e#vy4o8*(%5^ywE2@w>46Uu(9^ znOf7iba>Mp24HYIF;19cNV}!88`~Yzp)EmA!q7!f_w@Bd$Z%BbQH^9CeNvZq4Qr;7 z_WfY{Hw2p9yv~UI&+eY>PJ#Uh7CK9* zuwjJzmeG?54e6dM5~Q!Ood{+BCOA9G-zM^mjW(&1Rgj-s%KxToKEVnVioB8=K)b%W zHlEQ`ZpNcm?J#wV*!fUGhe(z}hCm98bJk14Ookd8QphkIm9G0TEm1CSU|GVure_VB z+!=)kz--b^X`@XG0Rzr%utTD5WGDSYYfj&;5V3cQP8a)1OVNu%i``d+U6?qO!M=*( zPgSayOdFCsu8{2DG=ijW^hP(*ObN#PWRhV@{aSO+Ja2`bPF9q z!~D}-fQP!W#AjMCGRBA56 zHn(b6G7l~akA=d83WmiB@d{O@DO_4l1YLtsRgDF56pPBneOJDeN7_|~~XekB@1a zvWx1~PYl|%L>S}PUmN1n*pW{6cyI=#?UNT-d?L1h=NT|s5FJ^ghtn8j%;>+-&sCLY zJ}}L!Hu9lOh?%V1bvE#Yv<6Nj-UxTCQSnxVm!E=_J(jV4=L*T_t;@%)mu$4lwE4*n zCfFJKkjH~NiW=JW<0;_m2X5upA0{x$JeDP&P&OydzXcSqMdROm$%r-C_SRvfB0-rY z=6-oeF&>p7J(rw)EGn89tXX`1tD0W9K%wU0bi5dI<@mrj-kx`8dTA7d*rLCS?)uxVGXUt5cr#3WGYs*a0MZ?ILq>f=#!)Y+%u86By`0IL5zK2cB?nWvR~u-IH#C?P(Y@dCMxWY@amLw!|6fc@6&XBrr{n9YBu1V~ID^$luzT6p(sV zh20m)Kk={zD(_lTw$@{(1)jA}TCW~LxKMzMHlLIs?+0LR3(+lQZYKfU?O&5lxsV=S zH?O#9tPxk;NNBueNbZgpq+@ef&EEO@(_}?lQxJ#M>AjN zickDc(r0))!Gzge@=6W*KxKJ>yTvO**F>P7$~F8EsMR^8EWVr@_We?lHwNxuyZ(fWVvd4)`9ha( zKRhb#a9gtz&<(Q*D)ksOxg<>~PxQUSb#bVfk{yV$SeXxxG5``?4CJX)yO~s@0O=Yv zsTxg!IS7&o6_PMce})2;S0tDFfy{i*Z-1^KZ+k62kQdaeJv$JW{cT0CdhOAshxlgE z!G+3SRb$K+oR{t6jbvW6$)$ZZc2QVmKPdr{FCUCS2{Cu8e~*=hLP9X|hvoP^%pwUoNfo_L6Bw5&B+FPd$dzfdcCj24*l-F3bm zu=p~O1dT`MHWu1GF3VMp1agAOUoJ}D(RCVWF!|z{yjDCKAH69w>2MFrX`fukbGntA zgKCQFPyXaO{cI~I_m8x2_l=g^agN?T)5tYhjly$#Q#$B&I@Zp+ZJCKD2^oD^OysLr zD>NZ^)&^vL(F@=II!ScM6Z;P7Pma)1UoGu#9cI@Cw zvC^)L_x?5sm2FGq0QcT-OA&^sG1yhgCVJvH1NA05Ed&>SPH%uclgNRJr)YP0$f2{R z>Q!F>W90CGJQuC(uDBc0b_(x4*d1*45;Ir9qg zhC|u)1esC9D%|H(mvU{dmXf*YFFOr?ma%5BbP1*KtUU?d9H66^4bn08#t(l*A*9LFDNh}9g&+WrC7lol6$ zi|AkZlhX^n|!B5dzegp_^LI=qCN)ImPjSFJQG?)VR!&nFe&h4 zT-m{`804%bF>hReLeb(J$#|mzqkr5r5yI0ZQY~oMp4b`Ggsn^ZK$YyPdIRe{p2$Jt z+)3JS%NcxiJs7}t$o0Wbc_UiZn`6YWmHfMtDB}jrtXEeZbV`iuOJpiti_GngWY$n?C2v7|^Y8>yv}deC0uXylwxb}I=aT^iN=b#FG@xUN|)*)+natXZmajk0WENvz4a zjCxt)5YQ^5at2zx>~V~;O7^S~%c#q_z;cF%gy%Ar*;KUf$Ns+A;(6S7E%agmH(q;f zzh0A*0&hWP6!(&3)uKUi#5ww+At_YlIG_=(-xo~%u_QqaAY18vw^isEMtd+*Y zCHnNsh!-2N*D`l+HPca2i)@VA|h4N z4bGwHjQLK=DzVZN={`NE1q&{H(h0ZN5cr#6O~>LTnuBNH-tV(Epi7ps1{H>i<9gSV zR5*T8}^@J`?hpz7^l zdpAu;GEoRm`a^z*X?zZfB#t?a+uGS@1Shi6Q5sQ&9HE}jT2}`{^lDU|e z%aUliF%Sa-5f_AksyimYm9SfO{TAAR(4Hq01Y$ZsEfJv)3PKVw83WmRJ-MqmjU!+k znn-)}G4|{I}EkY|0^cRqaXay|k>osJq1}1lA^&x2}Ij zx6VE@kE$Z$!|K&FXMKIGn?Kuj>Gw<|&g9bImcv_?zm5UA1t^_u!N_HNyZTbwzBs;D zj#dPLqcW~wg~!m$xi}j$Q;ju8v-Od-v0uCe6p8dPw3Lww|MIpm58h3Ffo3ru5A#?N zprEAGj$=}5g4xNX+RrHH)=nUUI)25WS#8VpJ2ZqEtnlJZbct5LfbyV*9rTpi)bdVQgDk2u7!(!$w{ zjo*R?_4ei%9JHI<(nORR8wN=@!Bay>?VeR?2Y;do+%_GV+h{SxRPh`uX>2SB>yFsN z(ci8Y=KJ$CO<@4aO14Wfp z+2Jgzf@?9mbd1S2B|*pNZ{5Gzu-zEs{@ZkA82dMn1l-eTzSQkTH&kYzWM6kSzVxq; z|1HcRGJb+CY|FfYU;KlQXb4^jtwAikCRSr)f(amHypzV9GL6|ByFl6{ zdeJtJDwK3ViE&Kh%Lylbqtc9<|5ary;*~_>Qk;a6IngPyTXC6T1FhLMNT?{KVq|W9 z3te`GXp^)XA!YnaRJ22&bN{9Z_;)y2H-VgmO)Bs&helfXF~ZFS1suUb4HaO!A6M$Y zjEoPke;8JQLHGpuBS(Dr*BSo5hGQ!jTmCGtoQ?n6bcufk_y3TsrRf|H1ce{D*Mcq) z<+e&95))U9MMzB7Grf7m8#j`MS05?sV*qZQJR%W9-ZQHhO z+j{ap=N`{{-t(Mu*Vv<~zN`;5_NrNPuJxPOsE zdeH2=%^3aoxV=TMDKc0L43NTpwCxNA!CP_-7G=ZBv&_-Y8IcWVQF&2?2m8ULOTnGg zG3NohY+ukH?Sbn!Tssxt;fjv1Du8?2AevZUJhiPIMs0RCmpuCelktq@$GnT%5Z8}w zcmB`i5H3V*3dOw+biBnI#biI5CbU;yEc^BBmUbciCt2&vD}{>zb@vJ=vv9|#SFcAg z>f=Y9{`O4SVy&>KmGz{aQ#|mPIi@S@1U1aQDnKx7!7~nN!FmyYGP8ar}muW80Evi;O2J;>aQe6f^C=P|J8sjXFKpD51e%yG04*#t|+(mb{ zBp}tFb`DpQf4ZmP2f7oC49?jWrT=Rdwo%hZ)N)fZ%fe`(SQufiKDn~Q)9}xZgiI6Z z;EJe7J8yeDSY@63#um@#)T8Jx@~0C(n}lGD2f}u2Q}qo|W|l!*E!ONy)HeT|lygh5 z(_hJl;1+I~KHr2v^pe}nmupBbgXtnxIwsGRCOdwMPM@;hoKPkvzFvt-u;K+(%`Wim z(4kHsRt+Fqk~f6XFSZy=2*}4)1;P@q_eu2Fpf=86(H~pTFmPmEunJrZz@THcaOF2O@ezZ?{g^eUMU zHytc;k*8|4=jS%&4-1Aq9Pbg_z^6=GVO5hQ##Hi$Vk@Xg_sg*8*VYK&p$l!RO{2#e zkzYA7^%0E4<|EH%{kbzvPdoxMl*qe?@S23a-9+1z4dh)x`TfZZ4^ z5nS5kbE@UjTBA+;e8(m(s1xp!m4AC?Jn`eJxB-eQz$e)Y1Dj!Ys3x~1WSWkeC7Ucu zL~}Nycn~r$W6kiBdF(gaZ~3i+?5-_9{{8o@d$ahuIoo_41%r6nRSc z{D%y_>Q%i3;A^6G|J#ZBZ+$KQbE5uNlhz0&jW72OjCFECNem!dBS?X+f(Id}1d2sz zLt?D08H1)J1*+U>v}8{g1F{Jjk<3RruM6dr(c(!S!Uxo6$fy_DcOsG#^)pX?ocN%dd0hK>Vy|KO0RNVg?@sLn2SxSC+Tj0@5Gx3Z)44sz0>}3>YpKK z&5>UXho=pl6&gy!uzv+WN?f+oq@Rm-pFwzG)7&@ARixxn;6D zjT_+j684!CW@kwi^Y2emoRlB$Yf3NoGkPkvXLH_T%+fv#e5pgiNCy_cR+yxx5rg+7 zS5+%6tS~Q9JB%=qVil&!oz_|R9kiAYY|_epr8=zHOH>{OSP}P=U7Y7Pz?JGZX;a}l z-uJM2^%{9~XP=rpWv;e1)Y^;!551`{P&XYd-QhCa=AzlLh+mm7kHsvFYt%wG+LUOk zAID*Z3xyahG1)MAB5qJTCpX%&rHq$2ui#`v@{38$l}#m9OSB7Vdsj8fgIN}(2ndX_CHGDwE8ZWC{Ro>kf+4VbYG-vzk z9h0IyKs__BVxW!w^+R{zqPqB1Y}A9DCbCE7O(2UqnL5cvSS@qi*vg?<5_N(&}k9O z;ZRf2<=!cK4ZYoT6yBl+Tc*Rv+cgzd#c9*{cXrc-1}zhvNK1y@b}8646;zRDx2(I$ zW_RCI(=IUvDytAi4jST+amNM@gl>`sx9>lDLlSFQ8Ya}522>cQ0_iw#bhA962_uWr z<9;6mgK}MxJVJVj#B6a66!Jau9s-c}_ZWq0xKKESOyAJ|#_ifnIR_6>_a$uzEdLUz zE8K-V`Sr<@p&6Mi)z)3Gr=baCbPldiX{u+j`$xI^maM2ox{61ikI>SW!YV&_aLq@c`pz1`WAT z#2zUFpcFIxy2$y5h1&Nf?_=`}_5Vo1TT4o|0X{+@i+Km;jY73L^AxOIq8J>(3$h@< zxVJe4JB-!zBXMY1y0CZxSVLv}KZws>n0pWyi3ZSk`5;aifv1CXwL@%uYTXaNt1*)6 zQmeIpBM$h0)3L&(L$%HL{P^eFsbXqF#rYMEIR33I<-c|2P&BnS(lh)ALb8<7v;CJd zhup9<2tT41PZ>N#O*20%IhZgx*#?8QWH?zi1QdkL_>^919dn%CRqIu52*mENKfX~J zUNB%!mt1SUzD=ca<`RFBK6v|^5;9c0f-19~E>A!N3L9oD`Aot#rC`~{5o6zEo3HLr zeF1d^nTyv?M>icg;M9X4)GvtL<2f3?S;eY&%~R+LE_P$Bk0{rC!D@p z{*bHN-eKK!xW(W+6=Z)miyKAXGBrY51y5V}kervy-=r7~J@Fvf(|e)A)M3dDDJH4n zWT{U5qB3Mp=M-$(#C5|Qij~lP!Z_!mX=26X%)WDn(JEp%e>M{fo@=ZZoCg0EVc~1R zKx(+rjFm5;S49^Mo>e(E_+zGLIE$jThxy#MfxINBs7;g>9&40rSX&Ejcm%dr9iG7P zl;|1$cJe_TE`1Akd_b(P!1lgFIi)&P1Eok&fn?9MQ#NkvApJfvZ8ROvol`fY-zWb9 z`p@6!%RbR(`Nfo3eSKa2_fA8Kf48HnXs>7OU~FS=^?yyF9MqLiv>>dXMx+FWgQNg; z#f(U%p;ohsX@8Ii5)u#MqJc4F==MJhDHxK%b`h>re(^qCM=t^=rZ6+EK{8E8#}$BbgGv;pNMG|W~ zienP>qzrLZ82d#Fa}uaL>K5_n(z&SZ3v&_5EGDM+3wFJ(61cqWN;9e9w9LkAcfh%3 z?-PiUd*fA-PW@NatsQJS>hoQL_3XSn#hiQ+9t-!3){?HG1$-^84)p|7%nPUvI)`Fc2$eNeh3ZH+-;j?> ziApI{jU{7o6N`h`P#ovI4$I41D(7plZ~1Z*eM)EB)uCRV109Iy&@*;!?wd$WmHN;& zfGoc|HzM2n&edK<_i?Ls*W4tEnN`3rM>YO)P*%CG3yte?nJRN%jJyD*8kUk-qpCg7Z zz?388^qA@09PjVR2amkqy5Eu*BB2^CXo(=`kYqA@sjdqgo|xpWaPSC?`I=Q+2kde) z$U^N=nS7qW`cn4Y6BdkcBX_ja=bgJ?H+E0@X*MpwKZgx}Xx?AZUj=a4diHZqdiy!Z zfOMW-fyI}7N=W85ImmJJmtQr_bpNI~()j=vjQLagSb)fQRit#1GfirBku5 ziRu1)bdwnODf514y`RAf(m%Nu5f$|MJL)<~w+5uacXnHBm#SdUbDj@UcFgM0R>3|R zei$}0a+CGk5aGjzNS|;%dY@3da5nXl^%QV5gEIs;U^qK`o*{m4 zLaIW!$6gZas(~R;aKSv2WAuZkwGKB}$85oCq!zYm&3N^JoasSD#q1Tf27ctO3PCJDYEk)Tr&Ej8@0x>!PO&bs%OI_gKws ze`5b9iX4C(AWn=t|XEYONJO5rc*y zV)Yo1YNQ!miY_`^q*i8&d^G|@EvLo3nXUTHR^d@G#`3?RalRonTtA}r_HxT zLTQ$dJMfw%J<^)Wy;&{SVDvZ(BdF}!cRdk&3iLh|f%MAT0N3HsWgXY)u%z`T0KGZQ zNvHj8WqY!9`&)$ihlbPBCHIpD{m1vuBJB_H>yH}j&$E6@&6_RilV_#=6AQezF!yH_ zgpP{=_O|3G8>$_ZwWq|Sq>nU+&x`I-r6;zIJUUk?xX&Edj*7s`mg{!&FABx{$rtI0 zuk>2*O|1H<+WnoL-8(n)vs_tQr5AhtiSk1f?z8k)TaNSQ-ImG8bK=ac)d;DqzpWJ2 zT$%jwy;0P!xiAH|3MzQ(O4ob|IBix%k7`ZWMo9$^R_o$>FWQzO^s+dK2~lh}z*h!tS0-L-!)$bZ7*T@km$uqnCEv6veVU zat; zGi9&AXGd#+hoo3KEhIRFZMJ7LeyxaOAnX8R~V4SRy5Q|UM}2y2bFF* zXV_8}B)KQHD_`Z8js2JwVi|SL4OxvElwEZ9-F z>)xBkMw=ViWj1zxZ3<$KZ&eU1d`pKhL@fm0PgfN6Bg(8MPh@K)is9zPlI)I9$YHjl z_EE2O?5|HmA+e-S3aGXXG&R)6C&EHP9#g!zOY0qeHx3aSm{MAqw5ANI#NAfPKd&xm zDu#TyJHk)SN3A ztT*#wg^9Wb={luUwWMy(fdxP_A+@bKDy^U>807(@AyyL*!FPUH5(Kt`Kj>9vcSwq} zU3q){Nu(^_<)(3fT?=T1`^&hMNG5ndWWJU6%UrBhlep;sS97q70CIN+$`HG3fEXXm zIUchK`I4FBPZ{B@AuqDoqbyOeJ`18T9GK#URfsQx}O~fi!*o zfi$reaGn@JU=an=9oB}Ec>A!lUVDaz@shd>97s{1;A35QMy`>^e-au&Xai}`-~ssw z)>ZlI(b=g14K-zkV}DBCt8LRUsiPxOzn5zfI0PfXLC7B)jz|t7)YnGJB>ap|pl}ph z!PtmXU5j=;&VFC8;71;&5te2Et?}hLu5+Q(bZjAp1i*3o@_HjUQ(0s=h}Q!3ver-yEG;e7xSAXJx6Oyh(KP<;2a!pu!xXdfnBXMy&AB9`AbSA z>Ar@)>V#?n*~&>G2mH@?gR}q3`k-3ZcLRDvW)-D==kPmyA?@-1h7_F-UQs7M#o+aqSf8K48B0D zY(e~`L!PqCo0_%fi$}S!{FOKqf5+~OoDV(Phl0Yo3)>pLGx~}0@U4~mK>Q#gqAaJy zi(*vDiCS4g*E7j#dxRW$9;E8`!!en)$fyt#l535)h4j1_byGt+=>7}03!7P9%eK}% zoijVT8yCy8LnF{&tY%rT1)!`W4Gd675-DjdQ+3*gveNfz(JW;9%xICYgo}a|RiEV#;Qz z>GDcjQmX4>hH2VzAr#t)1m>U-iq%lcUQSP+sW&)IRimTPHC?0Ovg3bk7#Pfeimp3x z1THR!6NOH@kl+r+s?g5Q{)k|`EGVbZ(ps-o?ku9fQc`c9c~ZkkKm~jeFAXW_gid{f z&^yA_Y$6dk8FX1{CPz@kZ>gt5GD^XMc(jrUN*Hfv@#aih##DG$U7k!`PY%jx`hmI> zuwJwi=k=qDJPozT=gjmj&MVBj25wqrLFnC3ZBE8nkMdwOsvtF{L%nHw+17&3*P1g*xuS`j@<@?+gXX$Ap%GNhUy9?fx= zYM0r|r!M~lS!!`S0a!77)9k6N1BFc-kk^8umbhyg>Hx!eJHPx68PeF2cP&Qr=t!*& zdR^dxa6lBh*`owY{hjeTOMgm7K3-LLm?iYqjd&e((W9DG*Jbz1S8P@mcz+YMgvu5A zy}epi_bceR)z74gASj?cCrs55HggJ$hLe&UfcOeGw@qQZLr8RcO+?L#eqpZM4s}_S zH~B{8Ev0ds=Q`DKuiZiY@{r9PX5k^IVv6JL%NTmV4H`xZdGMkR{gPzv1xtrRzS1dL zjK`0SM;n{pP9V`!{O&Ei0RaZl8AKxk5L^eGgGxp}B`6wE3jGJ4J96tj>k=EmHT0 zhLg&!j}mU8Ija4AqzQJsj=?r`m$}HuX7vva+7_%pI{l!7dM4|F6quXx6x*Z4riSlk zpG}McZACwMvL2P&LZR16_aVp|+agMC=dDk)$1#dM-{dv7P3P}s`kM|w{42=*N6%;2 zn%`zWxm7dQS&^fB-&WIV%iYeX@b(eS-`(B-UDaL~Do1tb8&@y*Q3(#u!lA2v%3*uw z{?p`szy(<))kVe-gi=;$m2}~zo4C{phCv2h=c#aAfS-w-78pt-CwZw>Cvni@ndLpR zi_WEsW6S%*sQ06ICji1IW3#`AMqASxmby@1@MS-AF;qS>Hp|g{ZuSLolQ$B>uPB-({G!-2UD!XzBgqD1OMt_)<{5XQs54qxQhypZ-{78JPSvy6~ zx4zOrVkYFMu+E_)a%haqDn`ZHUCs!V?I?_uETYKrx~ahwAg&}k!ii&US+@<#s&!PX zNWc-5(nXo0=Z`S$C|0dyu22!qqX@qaHtJF^s81R?C+Nt|cdFU35<9_36JQ{XNI6Zn zq*=cul>9cLdOn<$rw$>Y9;AFBp#h}+?nqRv`f2)az>^oZi1qD}xx|u0#mD!6a*FFI z9Oa~^q%xY_9G{}=pPqrPl8!em@@QH{8R?sOM(`d0gvWTEH?_BFFV~C=It$k(rwNlS z=kOl6XG5r@9g%FH?l#u_d?o!SPPwX{Xu2s?(j~AIsf{itoUpL1GdQWVYqX!Gtc^5k zTp^(5%}KsQk?ptZVtUUwN10Nn1iaSncvLC5Ysl+qJk$}cRH6$*(aVZhQ$vJat@e1! z4ew3F*1nu87jE~c_aF@PJq{c9IQ9?AKMkn)+JfwV^4&B7t78Ln;E4!=s$?&^k($v7 zpBdH<84M11%Mzk=i5DA&-!Jj%QYD)Xsv9zA2*XHMEQ{@xZo7jUcrX8imYzIi0w3a+k~vFKwUOougBMPWLyRc|zsl1gmN3nPHZ>QzP8bOrSjK zNHN@g*Fn!%;RluxdZ2>mXuepSpCqro=vQuLJMQ&~TQB&xW@d<|-hrja>#C`Dh*2_H8 zsZhDPdd13?TwO+QqSkYu1@$XUCwb7S{n4XUZE6Mc(uP_A#-{W$R(iu9xCxo|cVF;9 zJH=9_W71bU^yai@gd5bIH>JStMFy#k5RMz#z^>AxXdC3!Mcdl8Nb6_1i|EU0O;3FP zn;(7qL1H6Os!ZPD5PRfLWo^ENd#LIA&$l;Zbfc43q;7y!f-mJ2ZK|eqz?nq?TzXS( zm>Ae~`_PBjJhF$Smn;D==aUqdYzD}Vv<)Zz@@lTnri;;(zg78)5e^v7T`(h#C|5)ZLN=ZuU zx!E{5{;TIh1(Z|QI0pPqf)5(s{EJEns5b;T$G8icaH8!uSBI2fdM zMyU%p*$>+eI1Zss+Jq0mAi;#~X5kLKHV@;Qo42bK4%yZ(AGKox$>eD8Kb}8*7C&7+ zeJ-o%FIM5O&HIkzpX{`u5_dhd>1?-ppNmLO?HSV)*Xg9%n7*ky#DK70CyV*~7vtrP8Fve*;0l-HC)b#|OFT^O#v z_Nn!^)?wFZ48p?8CEcRJt=?MOQ3RK|+8)dvI% z@*jK4-fRrtln3xIqlTU`!bOd^$#(59Wrkek2Nakx6R*R=O^mq7cikYgDTJvf;;wVU zlMLHvc2O}aM_i=_PMJ2MuYuu>hW|8$z`tq#)^5tJ_i$Uqs{CV$jIoXrMGD7iT&9@! zo(f06kPb*wc4B9DVqgRxe z_oyl4qhR2GXsqJHm~+fcJ~}nEzG-x-b7`z^bar%cywM(L1u39a7gz)-$+^EVvhvPi z_xFw>nEtg*bgimEgF%kF2#JFEleh#5#e=9ic$z}DG`T)D-Zb(N$+3(cX?ErH)tzO% z@_|7sB}zz0rNsU3BxUwGq-ZRNf|ni7o-(pIL0NO&wd}h3BhjaPmJDwABX<7dQoixi z!)%v!^*|dfhLYf4gowU4ru;lfPjA4uIBGMU0hB$3AXBxzGH+ufAvAPcPCx9YuAh~{ z4-rG$<`Uv=^w^L7?xu}GED%wpJ@r^gp|uWI3Za>{Q!z2Y4UJHi0Vo{rZy=yJC5faLJ27xE3|NLR6^7(K=uy82l=pV9t%P0kt^#KAeZtt zCLAvQJ$~T4*7BST(N-;T z^+U$rnv7S+6SQ&Mp;tAz@W94hI_wL28VZTJhC+T%$UU$_7STodNny-SW6N>Pen2S~ zUL~z<`*U|Q;|bzJe8n*4nPN*0ef^5w^Q6l}`VBja>k6OzBkVKAE0drg9Vu9J_XT8e zyT1PRaB+d@9^%Qb=hBWjHBx8Cf!s|CQgSuR|M+msj@3Oj5HBh~Y|swR#XRc(4T+jl zV!H;R|DHdV-m>QcQCM0o+{rP;_E*4|5OOVx3`cA+0Ao;^KqW+;7j)T5at&Fcbcgj* zQ(^|g(7B_P43k4m;UwYy)FRf)oMmN8zdsI&wV{i3GNGeL3n0%YuTDfoDm@bnic$-| zh)u^-Skzw7tew-wC>SlT7f)b=lT<1&f^CK>Y3rr(OWzc3Wbstc`-4&1Wyf_QE!)H$ zAX@9=RH(8|qQt2}b63wwU4hluTH3IDZhhUT8r-t%5GniCf&~z1LYgmHJ-2e9tf zIa$B(_4Qr;QD58a{ysX!U6%I}L0-SyE<%s3dZw3MpTljwSCtlNw%1};*a+b!nTO)< zJ`0kRGUsa;3%0~FYhex=c^vWxuS^ZDl5QVrW+i(bCIoScYCSN0LQs2T zt;mMTdTv`t!#UGCVgxo4D~O3Gb63n+&&`alI&&5CMCR7h(qm3%i@PmP!O=5ky@aWG zBt9Zz{|iiG9&V(7H)6&xe3{`TLTqkb;CN!=csj%&V9;LjcbI+Kk2wjnCJKe8bXgCN zafb}RameZ1)Yxg6mHKY8!|BOEOyrLkZDPqM4u>zQCXYv?X(lq2MH7#|(eaE7iLLoTfj;M9!|Ry>)oZe^NOQF4aW{8#w1;n7h$&P^wi5k2l}&am zGSJ4~R+SFy_BF8=a-pPTTE=q^WB#T`S<;0gH8zIC5fBu&hQttc z+<#_72}ir^K^?rIQH_4w!jUY*3pq9J3$2fPnK!lXo12@iRfd^*sxcO-nz`z!sC8kb zwK)7v;70Qt73d4UKFU5-nqZEAx7!@n0K$C3K{ZLCNTE^V z;D#bYtLV6ppg@({Nk$tOq*bEINuL+K;8@PCl(#1fGUH*S$9#(*t_~z!8m+y7)kv1k zBKH2qM0T?$sPkRRF}5mnqO^9xBG@mJ%t0m&;TBO z654=MmS3hBznRGNP)6heDP?8DFn=K_f%3&vNdtIukAC<(_aVxxuZzi(ywFyp3)BP^ zB&JTGeL;5;6pcmlNUli)VNcj6BuA8L*0-=IO4k0nk>N%9$X^6@K1H4wl1LH*W{+kp=zv?Pt`rBv|E=D`5K_EkeB@XR^ zGvuz>xqfU-&0U2#HrZL9kQHQHOHK0V$Zd5&48+fDbI3TgkM7qv23K-;%;6Xn&1IC0 zpMyCXj82fVY`Q=wUK+qsj-V{f&N1xz-#l9PMMQX+Ss!Zpci1rRGqFDQYFjdmr*j+_ z6TIwzNVqFxxBi)TFKwQ`YHCOW^9VUi5k;H~lS(FL3J%#H(!?fFLa~UCcr=WplbGUO zfA^sqod9@t4!6OjTI%f(^}sI9xQ>;PP2$ej>0C@cO-)0ba&V`9?-S!6$>L7af%vjA zyb11y2zFTStuY-i4Lgq95zJRq6Me70V6wI>U;c6h@kUIb?*EdZ_@$$`3&Mzx4nUBzK(?(# z>7td#XA?)?Q9gEFqq7>oonc#}JRi`SA#T!G0j$_csmN~@v`966bw3KE!n6#Eu6!aQ z*|}d4*Zf&U^IFYU@6S`b6uxWCH%C}0ab}lZhkQ*up;}#2OfIEOa#}uIX73g*bR(-X zkM$zy$8=^K=DmNR-^8-!bSR#$(m0>v#90!b>}dyWMu5;mhwpvAW8wZyw;A#5iYVo% z9UdfUa6*&7)b12g+{EDWwkA$ej>(q;F%6DRMS(&+UU)j@cw5Ihl>(bkAtk)2k|6D$ zXMaN;@hr_h_U4B{MMn3GRIwK5_eE4BgMl$dfH8`q_u(iY&MG3-RuKT334jFz1Asy; z(}MTvx$mQBs3bJuX4JvMZkkNV{a}m$XnoJG^DX;gF{a;xUl}eKl`ZlT^wl*rl zF6%X!HhR_$oEi5IA+3fpys=gNiQm0zac1wu!)_O!|Dn3E6WD^k9sA<4|?ejo%^gO>Z)%c*I z=NbZBR`f7=!E?N%P3*y}w=^HIYu5d)v8OaJ3tK9 z&{eM{LFJ41gx0;g#e5EB>Eu?gCh|YKPc4!cs6QW{ui@74yM8_CWh> z^Lq)|NF5EUT0|KQ#8tC_sXvIVFrbcQWnN6r9ureCmvrHalg5ekg%-v_m*9loZ3|h5 zI;-h6%@`afG8&T5ZXA!^Jz^WnycOmAUM|iaQyT&?EOX7RUuU_mw&k|^`I|K&XD&GA zV0!%8aBU^GYqrX~6U0W8N+Np1mfOtHB=80HR-&C=FPNh^ICH5o%`T-iOxuD$IvmhL z$-Gd4a2oSHk2NN=9N!W*{6SdV#cFkBnwQ&>Bri}r$EbxzxvEC*A>huojWs>A|EO@{ zr}{kEN<0>EgD*AR7I#7&v>Uvs67;qixY%pRV8{#~w)igXu)Kvm0e@&`V1YN;4##Ch zP7*={|T;Y^5ullKh2@nU@Ithn&Y$%vOda^s@3;u!ankfk^nd zo%mm{XGNPB7_5y@T*nlW9$-9+puuW`xoNL47^z@jAhqEhK2{o=TrZmC!j*BG@OKND zR>_83!R{U+4w@^=h8%@nXEVIsN7lD*qO5m%L4o)?WuXpO-hc7nE(bgmxhuAzxQllN zvAq4VW-4<3&Sj6@yX}i(p8`S)S>BL-K%38|7=|s)5DQ+54O(GU@K*-E zBm@>RW^ZG@rJkL$jK`~y-x)le+Sg0<*J645AF^;qZJIyf(x7%OUO~Lc^=GlXVfx5b zojEzE^zv3;O5DZTtU3h}shbp>gv*JqbFKilD=}oR+2QE7+5$Vj%qTO#T16Yh-t&9S zuW8`ie$tygLAWcmm2GD|EjnTt-~6#23z5pdGu4_SoxWM559y~#-#FzkB!LBh(xlwN zHkXR#fuWkaY!dLSk+~g9t%A}g)f|zX$&>BVaGS)%SELw(HP2-+1vy%*KrzFF$J5U0 zwvU#!%|F*ubYg&;R5FpTo3C<>LD*HKj?$D*XgiB77Lea3|LVa{lh!dli#1zz9&sdN z7L;F1FDs{N;fDdgb5t2&;Y4nb5IUyH?F}d!Q}Xw^b_`O~1D9kbp>{qRHWi4^+I2b| z%<( zAHie$P?+;J7gBn=gf>}(TZHy51ryg!^L?QI@c&pSeYc^WQV?421`+;0CiIYNn- ztun;Pl%3*=oRO`v#4#7c45CM&!4Kl=oBw^pQsCB+%iFw|wEpauXuqDyblb|R)6cAr` z)JiWbh5c6x-xb3|jJdqTc_K z9>ET9T^k0=Sz$YpYuRC>*%BSq_pV^sx#s>Tb7mdF%oz#_vFMA?MCM_KHUfR2K?AS{ za88Rj42+_@*z+gH?RTR_WKwGG1jv5MlT$gV#zc$=JAz!HsAQ2XXKqi_-W@sI-QBub zFCS6WgP=A_p=*0oWgOzvEzJciMf(2oq}B(ny!n?2Lg9x6uH<7umcy7ULI= z*lm^t982zidSq3XbnV>}%rZSF)hvYx<1Be!`2wU=CVW6bfNHVgK3EIy=%;&)S8e$Y zA&F*pxmub`kB+Qb{7UWvyixteP9l(Lx}~nmV1$XPo?9lSri{o)tR*x*)W8k8S{bR- z8@@~r{nXZurXI00Mpeo|H-%0aYoSb_QxOjLJ!uM$^sM4=>f$Z zW``ev9rKLU98q{NMRR5@NdGziG-c!7nXS2K26DI`G=^9qsB7END#LeTf+K0DB zHNqRhKP$U?-XVby6*Ztz$GKqjGp$- zm7JvqG*RTCR|cm5kbs7o1CAh-WVXTs7Oq+Y*s|=|e{24zfF_1*hhvySjg3q(CUwn& z!d45hepe_n5ib&VRq&(j){Caj3;a^-F;8G789bPCtJf_8DknQytWnsqE zG$z1k-DL)H(FtGLwd{r);_cn?`BjkH8zcfl-kgoW2WT{?i&*QqM_~dBa8syRBL1$a z*5W*}G&YN5f>Z>D+-7V)gwvP)9Ay$qAtV%(89(sugk#aRYsLB6gqqKG%4HcGtyrq6 z0`*ePJxU7C`ScET)7)oOZgEeLnQJO{S97^BS*k?> znqp`wMCfUh!m#5P=~%`6jOChDnK7DYp=H>h zHBY_CYZ236HUkTD1$2L_f!-M4BARKl+nR&4!}rg#z{c_6i>_~n-e zTYNzVIMt^`>a>^bQGxClV2538c`3Fke7L_?@?cv(%S9F#wZY8yT*cwjs6}WlaX#) zegNCMAc-g%Eco%KT>2al3)-ZX@2}7mH{wvRda$6|0dd|c#<+Rzfrvsq2g!zJB!8aFANvlGQtvX!EwYZ{u1&~GdT=iVvz|fM` zLH021GU{!31Z^kJ|5ns^RPrZ8A*lik%L>Sq=Rwm7`Va?U;EEHZesCH*jW0X?9&pCA zAVo{eln_ow*bx3Shm>!a>wCYPML1jT3kQ(())7HaW6K;}Zx2xYklx#~f;DvT3c_Au z!5F8{a|s2f46SbV-Lo3R3ndS&5S9kO#U_x5A zah_g2$gB0T;)LVAYbOvwK#1BLxc<>e)PDux4w0wUtsB&Ih7)e2z{t;fAt%)@e~k)c z)LW5=jAB@8c`O`s1c5&Qn>AHTPr%zX!1ZdJg@^RoxBTHXtOa-1DC~_SQ_sM2NB>Zq z_c?3PROof#k72GCIgM`l_d?Cr?6fKkG+XGA1iv7NnKnjKIc1!pz-^duEqY5RZF+xnqm?LhG4ti7c zs=X(iXdyl(L2?y#Q%}PDdsOnZn)zKWLtC5ValeA@Z>{El#^hh*_3 z<4c*WD7&D$1r%9rWYO%850v?mIxWOfl!V)X=2f_E4m9)3(G}@03nX0QjNlk6ZOYrK z2xI{&dKT;Q_qQXePFDrL=A6ccRO*a}!wz_y#12HuC%?4tqF`?|-jbz=$Aa8Z8vS#YA$V5e$x(2S&xSmZ3vTBHt zT&u;^B)DwWKZ=C|Uh;DRb1e9;Vpsr>R`oAOR&$@m6&txoZh=Si%)!j;_)mGq*{Tv3umU zO^ZnB_M84xkO4Pj`h$SK4QQq&>PC9mi(=p8_};@Y`AT!a|feC(p1;jL^?f zbC}_RJ4b^i3_|17hT!m9xatY^)wu?T^;>THkpS`; z4GS3Z+ZMA%VG*QC_;QL&pP^p*(O!v-c-qnc9!>0%ccxw>!rM1 z+cD@e7zR!8X=Ntx!%6|8|J*-NqJ(=0_)eu`?rWhK_$GON0wx*`*hfJf1{GQR5J{XsJSY zpeDU6MR%F*44TVgGiKNaPNZQ<^O$UdGLwL)UNpH zKa>}3pcb0bz6kq;{~uxh-(U3qJ=^-%3fljhZ560Od1CJ;e0GX0gbxbBr+~)$2kRoK zH54EbkVs_L$2HkiXRyG7lK;lkF!1oB;mC_YR&bx4nGrDa^`nfpM?p_r=Oj#wb9cCt zSh}!&Jo)-jzyMci zJG+e}Zw;>Aq63$~hnJyQmsD@J9)8=8MsL0#P(DRlQCIDpZ;T&8-B~-U&>yfqblx8V z-8ws!pzk^`6P+>FUf0)+e$SVNZ|#45qOYT%*|xI&@_y26>!7e~LkRf#BwX1rc~k6e z8odSiF?=Wt_)v;%bsD{i4SYgkep2UuWIa7shi6fM5+w?T^~wCs%@$&Xw$6+8%ODXa zS4JC%+QC`}Gf!KyCL%`XHdehuA46YWnTq&k?qFH0GAh2Du6nQ2qB~$EEk<}yR z6l>%;n}j1PzZ|9HDY9v2y+!yG=aD(O{7x;P7L(J^9lYM~Ig=B#e=8{TI@7tbDMGtK zZadOFVuhH^q|t4n+EJsuaV8?ylA9Rzd?Z;=eHmL3!l@ed@;uN&4M9!RnV>O2Hp#l4 zX7-3$m6JKps>86GiD{V2iGP4Z!ren;^su#FuU#@`y2gJP&v*=;DIgVZ)Vx>Z6OWm_ zM?TRb|7_+)FmWMi`n=vb>Ii6zSq7%(#Y#FVR1s?K9+Y{>9`Tb=1oF-Tjc_J~86s{a zc!4jUocYTL6rPmJ!Qa0{R&_x{*(R??-rQrLW+B=d^ZjqV63GQ)M7o)(!CzGP0K{2>K9*k;NDGR3=W_%0 zU=6?O#)q&Lto~Z)!(hz2k`p%ZBpItvaz#CyvYEPtJXCAEK#P!_*Nc7|`!fJKi$uJs zfPp!jl9;){&erp$GC&n>#ocv*F-ME=$XY!>XK^Bo^;wFPe-$7r3(B%@zA)%xBp#3a#crw?oU z1%RO#YUifmGXT#Qav@)geh4}3rnt^g%A+y_9F-faW(3S+)P^`8{eX`#JCF>4FLI2& zP`-v<@8xsNKy4}ODcFf~P5(cfy-!?~Zf6z2nCHxqi%u74ylNPmUZpM%Fs{G%4Itcxe=Qo@!HWl7aI1lW~Z6jm4`e zD&C^-3btM`p2bC!+`{UgcM}ldH=K$yvA<0Qaw6Ha`> z87biuRf=$oNwDNk=|KYNcGDuzZ-LR}f4&DHzd&iO3zf-~u}3;mrn4UbvJiBnk}Q-_ z2gV34lfXw8RZdb>M*+a1(!$mDb`(n-%K&MEr9w@>WNI?D(mpy=8x{3%E54JE~r2?JDplJF8w5-E9Pat*#x$s_`h z8Um1X_W!u3KYrCBL@{j z!#ttYr!Z7byC~#4@P1MoG2*1IX9Jn8 zAN@Y|JJO0g0$&*tdkE8qTTPO;j=@2U(6UtZV3T5d$Hi-ww4f!KR2*<-J7D*FTdpSu zDwU9(XQGUrZ=md!%6$aM?+lnOE@=M?kFm;Z*|}0s5`XAl(RHTX_s}`~K=mP&dcu*M zQ!;Ho&XAglEdbvlK{wOj=r9qEpUf*uSDrRRF%>(;JSXa0y+b!U9+dGE)6wq27!-~a zR09c_tZo=o*1QP}KfIuv69Z6+0LXmVRg84dL8h*3?N6(k3k)6$jj^c|a+|96*}^28 zL{b)?u!NQ{GJRy8P&RsZZrTfHNP1SmspIz?C*rD)PaKM3u(>o2?^}LE7KH-7so@8I zso*>#u*|=TFBKT#s6$aoxTjpkeAgjqke5H%l%X zcmtu!+T;ek{(4_^8K=X}AD~^pk8AFG;0d0_u!c>Vy0a9e+`7Y8Qzp$yOwBon-Wg6p#ch(RLr>KEo+)wTmczd zF|+Q0*VXmY2*bu?D%^YlcTfBy!Mna=uNE!k%;OCCb|8D#iLOP58`Ey;6T9iuO2KH_ zpBF(deNZ}E$5zYVYZ_hNmhQIHNv2VB<{Izb+7`>};T`tCTBW8sqSQwcBTmbfsL;z7 zHNAxXk`!)JCLeQ5gT<}1U2f@r=IEN#aP4gprG&#(E6oq+#I<0;tAI9Wb6<$W*Y?x> z{pc90@=4Ws0zDs#zvRq&MM9W{v3=8-oyg6=B-|>VJmgv54F4{#{7y&W;J0k!mm*4uDIf-Ina9_AoSc@Tekh{H5HD_p! zf;w_Ji{B0U@%AQJQ4P;FqYoO*ZqfdGY2PRQfpYgqf^Pr$ltd#?Q|bOOrRd&b_HAMu z2veL#e|+(uA@j@Nzfb{b)AN~FqX2odk1L=2c4zj zgD@u`6(LH(jPhtvixT@w_PO}A?mnf`CrOn(7T+!U~SG1V+Y@T-4kzetnV;8ov~~)orHZb z6K#yrEA8O;ATs(!2{nchQLjEI*M>M$UM{)U6ne#On46LNxJWbm*w&RYGeNMY4UeH3 zVL-O7FlKD9XJkrh&$&4j_$2Dmyfpi=2OQ$sVd^+Q71O=srUnWMcaTy}B0 zNXofP%ZlrIG6%O&p_;QqY=68-5~u)p=q0gv)v!9(abdUjCqM&>eq{Z5EXxzkcTFb0 zb|eP_U$bXz&W=6O?d@^_m9Eo|d6j$>H;58W!Wk5GV`B(}m5v+kp57rgof(#RdJdVN zpOGAgyP@p6H5lwo2o^l%hQ|EqWgLuAOj=XrSj(#fX!FHkpbNlMjR@Q+wBvV6yIc?g zz7u-l&S=k|(=)yoKcLOi;SMsQG%%{qBsH~br5>j?Ps&x^O0mo~?10hoz&Fi`*{A;6 zJP(PPAn;uIiPvX7G~0U&J|uc{oWb#e!u=BEal^qF2~X$S80kCIo>@Wg=Eqmxw`DS{ z6HkOrj{}u6&_Vb6*yB#GeCU&MkH^J$^(6D62GAY+EsZqT^2EF53VwDKwE(8!VXesK zV~N5NU8+tZw)^xW&szg+W)9_38wedj%=jINJ`*az@T{NTz@`jZO!(3re!bISOpp4r zyg$u;_njomKCmvD|L2WkBAFNO9{c(3jcB$oo{NCk1(oYy_R4EoSoV4**(UBK^;Da) zNtY%@|E*%)=oBWXhdRpge1@aT%<@fc8r@~^vAd`PbNK51pEG1Pp&u{y5Pw9ie&BNi z%Xa$H$cPWg{>PYzI!eim?6-B|+jrmTzi&$YTU)Jvn1TOC5&mz%svgQB=BJOtgb|}w zBoHvaDlOY8F-!yiXd%u|DA5lp07#y+Bhkpd0s9$p$9o%nYiCwP^Lok62t;H+rJ`!B z&xrQ^In&(JBn~&76h6%dYPn?V3!G+Hq@#+ERYG)du?D!Q58;wF`mt4Jkz#eW>@zpv!L*`Tv?C`Oxm8Gy0V2@opvFmPYB0 zzBC0ezKh7cRsDM40=wSFh3Zk23*{60cBSJReQ5~zu|;Lr%SS$}d!q{Ft7zA`^8Ni# z53e(R5)Ao94EGF-^{6ujND$`Z_?fHvs%0gq&*6R|~dsWiYPU~Of?OJ_d>&T=ht*$LrWkkZIcgD?x|@}Dx|#<|qy zPuoC=Bu&s@ZWE6zbP`w{a>ljfT&}XUK5B}q!;l3_taA(4S+|f|K|NUpXw+=gh$i|s zFSesO`!xx98b~#BH~RdJwH&3dK|n(nnE0`378os_QpuIPfQ;#{IBG{+D~`T^DFnqL z{0-){&rQu279c601z^qM&F<^}j^;urR_%f2^HbB`*G z|Lvm|=U!>aw3D)=-ol;%Z`8}h3mfoAy@VtN@AF?$v#r6qo`En3r;n`9tc!3n{d78N7bn-w zhyzC^YjV|nCLOd_tQN*1Kbs9LDj*{vP!vR=L2e{r7_WOa?izUJ6%BxkU3VNp1i;7h;DryoZ&>+ z`9~c;PbgsQHtAxM~l8050d3Z3VewY$q~-yQQhZpwU8F_ zv2;Pwn-XtuA1S!a=t!6sot>(U^O3^Nb>(2w59n6${I6i4}{cOY3ppID_7YU

      6UwPsnTBj%i3M75K<@#bl!;O^TI@~6z#Zat=}w2K1{0)2FtRIBDGD*#YBNjd%Ra-JuVXO6Fvs01G~29P zzhtjxRM+_TJf%thTN;#kb|8MEv> zf8WFF89dO4|6D;!(T;LXfaqy5CYBKMp z=$`95C{fm$Ptxv4Nub&^$k1mj#v0yC_g+_H(B<+tje5w}tr983>>a>-3{PV;){Xy4 zF|Z7svXfaqid%qHZ2f%d!!&u1mX8UPwh%fDW#WG5Y*LfDUQ8ICbg<=lJnf)BTk<$V zQ+P8{-@-2|EvT!~jjle9Tx_4H0v3KmN_edP&bN!p=}hVq6YfmfS-adC)Swe)S>Ch< zdYl@|a~4~{{NT%QXWo=0?W)p#+G26O#OUW(%1x~`NHEA~CvJ+J)UVaviXybhRQinP z+2$OeTzl6y>TwOC&_BB1$4|7GFQDMwW(RFwGtY8ZA5b=tNy?BOnow1rhHx<#{Rn{EKRgWgtfd92MxD&3BB>m=tf0?l4Z6(GeO748 z8_gs92)b1BgcEoNldm^QkBl2UdD;nF0}>Hau(oQ4j0h7My0^o>IYRvR@d94Lt&B*{ z1IwO_FRX|0@4PF5y>=7>lRi{R9;zfgTxA{5WnH97rInDDAD!Man3w>+FTz=jmTI51 zeZ@2LPUyX;{D^{--df1Wd2-D}!Gr-~?bizOog4CkD^h%Rw1QQ=-%Nvgk)H(uF%m@O zD=GS(0-GSalpm7|cRSvXXict!&V#R3De=HoVMi@~jZ zo%UCi%b8~w#!w}mt5fI&IyskoOB>?fJ^lXEDKZmVvtiDp(2fN2_-0wS@Y&AXHK}q zV_huj-atH|RLx6zw9F^!8J4uulWG!uxh&75*5pO^Shv^dw)1Ygzo*pBfq zdxkw91#0UXVDe=+wu(-2A=-iBly=^bSWXeQND*w-K*2QG11hzX3j5^44u^VP|6rn( zf>1g6LxOQs(m5v?nBY4^%!L7rm$XjF#*`T;TIxv+3zw8LH7UYJ8d*;}jA2-@D*HC* z#Il*ph)McTp%?k$RiTOM5`{V()kXjIkcZLcBucg6%dx+?%}Y8~mGKImbMl#2ST?f7*5c*U&^{7$T zGQ9Le!{(Px{VyGK51P=cYk3wV- z*N7h%{-GAiiz#Sryo8{@ycJ0On?GuMH$T74Hy8~Ry5mESGoeUU3nUwdlT)Plima_C zo9H2%U@@y!$CIfqG0Y)4Oz5-88r5fj!IinH_@) z%H$h1!#+BN>6K$d`xln-tPJ-rbqS{{VD9&&Vu^JrN=)#=QFSA;zqR^mB$*!p6eCb6 zlX1(!(z64wjgwl9iyDRCT2CNbjwAG`$#z!(TVQ6wK}k{Dwvzy$tI;2_Kwn<&ct6m$ z0^vtuuj~zGWF(ulABn7%33F8r>&V3x_G^w(ZClo#|12D&W9V+W{q-y*;{A8b!~g4q zzyFnaP%ySJGXBjG{GTV(Y6VNn|4<$*ZgXK(w}@LVX=v(-dspF6gdxbIQO3*lr}#hw zNU^kzkDSY_S>gVJ@f8Qn-vjsc_K z;*;CoLOPUM)TMZpMD%<`WmFzKHp^dD5DG_DWNBfa6w^5wHr?lEjw5bxVlOyjhqMJ^I^ATT6*3KN9#tc@XMmV{sILQtR$B}TdN4HLO z>S!0X$c$3HLBt6okR)Re2qJL#NBy>92GBV!xyTYSyt7UN;W)~}f(j8_TWCJ+gHH16 zMnh|LH;=2R8_@fD@l>OFtMtxjst1uARq{{OxltrzV`m4RN7Hp?OKtXcKe))>P$C8P ztig9|oBfu)%bzD-5S_2a1>5K;aN7&_W9U(}(COJFFVvv>LHcRRP}6=#gGcm(KY{E< zY$S#b80s?;Xo$f^_|8%7q~``7W);cD7;a&aYZ1>o zv9nT7&>DTgZ!uh_R3q!|RQGiTN_+aFX6d2?B9v`I%$Q0?@du8mG>1^DgR;1lrBmL) z&QGcBqm0wqk&P=p|0xUjQVfCx`+ea(`)^0w|4*`j{}Fn{s-Lb{%LxBiQo0{J3^@s0 z>I5SYfyM^vB`_D@OQ~BBk%}dtV~`9NSE`DWo9;bU=W7hW$({g%Tb_msshhYy06q$W zgT|0qlXzy%*}n@tKBjAoCL8v_-;8gkw%Q#{d(t^yZ+w4V|ACwJ1Ab`^;-gcXFj)o8 z$IRlF64d518%>cxVMdUd*V*wCJ<6|PqVAd5)t4OcRQjO3~ zp6b7I6&%Q8^wMm^nx73GV)ppkS}=W5$9roU$&S&;LVe=s=UR+ryJ-x&GH*rPmcR9c zZ0e6qF$#SDjlhF?B-Ho89+oX|QyDu|;;OYb79RdX;Zu?4Xl3L;#F@#HK8~BqW-r3; z`VwG2E`}lLLvg)fe2Vx!b9 zTa*<$Iuoj+A;mDKoN6llSln=?geb+? zF~oa^Omkp02%*==9cn?nRZ9vZ5{z4B-R6ESI7z#W(s`UAb;{v471m^)T9+ji4Fd!8 zJYx^KHG?j@OB|m&JVko8I?1u$1Q5H0-*ooF_=75kA;A$zy#Q^7qa>GLHa#<NfF=F`Ftw7d@*gegOih*x(&0c#39a z&*etqNG(4gz+iqrR6A6?m)OdHPX0{s#S;G zVafWuL_R#~V11T0rPQ^R9ExFzlGd)uFe8zPlNaF9&H6*p*&A03onYo{SWKsVQhKr$ z?E6Uruf@?xq;c!Pk@A<+=^K#=dM6Xikb^I)ieyQvO~-Y4i!7$QEj%W zLvH@l+JTLsP zUx_G~vmL{bjHfA&J8=Qq_mGup4{&t`4v+T%nlZF=8EwbNTlhFX1I{f`(bvi1UrRWW z`~~#p3x5?xrvv&YY;J^q>#b7Rt=XjLkLB6Z@o;7d5Bva%WmbOY{Oxm8>d&X=|=6iplB8(Y>l~^&w%Jp zK}>7%viC4GxXiJpLd2xO_&PJPT^@A}H)bE)H#F#~yWuzZOQ=5OHFZ(;E2O-tl^jL z`NNFr4R@_9&O>RC2ZAETx<-= zs#LECQlKO}tHcKm0;4*Q1=~5WKjM0}%Ca?hOWvd8k3Z573%8~@7mI9j7-%0SUy6Q< zFp^=CM2d0f9rXZM(?AyhC324*b10tG$A~`Y*p{mB7k6Z8ooN)=Md1_#fjt1$VtY~> z<@|;@>IEMv+GA!f^o$czdWXKPlyqTnV{xUhCeOE`^qSadWnkxg7%w=*7t@@yZ z;)N*qZED^HvMrWxhsx_q*bLg)7UeUjo7m_z5v93xwSYJ3`b&mRQSodza4ou);Y0o4 z9^Np=5SiTz!#yi_e6mzbJbZo@JRVhG)-oQ-Iif>?&)7bL6T%tn5Rd?N9*cBBU|Y6= zIgiAwojQ+%Tv0sL4)!#Bf{c+)_-MoY9#AUOtsa)JA9jPnCOf5Rw*^;HlkO0#=RE&6 z^*&51i}{bNoaPsMTg0Y%aQI?iRkJ@u0)5Ol`94@B8yzz`7Sx*>1$xEX)rZWt|E%Pb zLwcF^$h2Ep8TY_$nJAXU-X10ccwm}aN!*ZX*d2?4Ze=dgikfBKa$^K%sq3D{tMG{P z9mNX;l^3}Z@mdojT?hE~+HApw;JMY_oZ$a_5sX%NkU|0n02qS#?=FJ>ugwT@`c7v5 zMNX(_|Ju~heOMr`OtdA#B$VrXnv})-mQbrD_~;EH!Q}4$@OBb~*3}s;PJ_+6lrVn3 zA?Y}ksO~%!%rxnj%s6?hrtiGsJ(Vo}$bDvQ6N5ppb_{04zINR@=DZ$u?a%)Be8b2? z>nV>SXerpMi-M#cutjx+h~p@xsn`n-D&tVpjO&XGJL7QL36?HMleZIF+f3@Kz`7pU zsSb1FblT|-0<-fj-KB#m4rYY}G<8vj7IZ0_rLD>(Xb21kKuPkS4hEcuCmizNwhlLt zc`AcyzY9AKPc3mx&Ky-gB#@m{SFl#)aa$%++bZ!lwceHlsLhZ=f#NJ7C^jFn@9VIh zT1h0hm+Eb>O0On-%Ar4^QU$=B;A-7uC+z#_Vv{>XuKtb18A%j6KSmTDn0KrS4y@K$8QLvfs*tLL_=iX~pdL%b7 z*U!LI?!@?K$6j)4_Us(hX0SItSLU zQhKW=RBitxhO53iJeFADVs-rXT!@CJ1o?8zw?1c82RTqQXC_CGp`kprUYKtxb9lb% zw>bE*HJG$7w3!$?a*b@e|C=DoLMmq_D@O~Ps=@#GV=zk|nU{K~xdfol#2W@%G(Vb+ zuqK!BQm-D1zoWZkdC1iWNz1+d1HO@Ho%kItWl$IMqWK-}`On}1bZPxxQA^0%5~CB$ zQhsjuyu;{K&l+YFhl|3~%3|tISAi2EC%X^40!NHYj~_SsfR2}xt8DxVMphr4s(O?G zNNRgeNF&d4zMqbmb`2Pv*h4nDU`QndH5~jW+cxeoH=Y9OA^WZxp;49QjK_uP(8bx9 z%g>r#$tNii^n>wFOAQ}mm-OSj?1B#dq9XoIGCVE9bV!)&JgTLLbOIpV^tN)yKTJi3 zLP&3J7=#JgMaOWSEipSgtXtSRq*+$`?pa@CTqa^=OQPg&;vw|HlBH#N+J*jdfY-zY`h{7KO}$kE@j*bi2jum5y%VVqaF&Hb{w_`g~E z|L6KW!T+Z`-G3x~{AYyZ|Ij^HEI%#-#1CJM3Njol%*S0p&mZk1wHG7_JwIf$Bn0tl zLKaFg2z_pj$~&1D4*uJZ!Jq;Mf+(F8m|9V@s(jmh@$bvy#}7Sgz$QWgA99$;ic~+8 z|3J$_L6;#cIYtBez_~XNdLiZMPJhj|&?2HmQf%hIdcP$op(MxOemfa3kaAKL77bY6 zHNLY)@!bBkeL@s*w5*MqiKEA(f4uJ*1yDNJO_t%tSrnS70y8j*B-<}B#HSjEk5@9Oa*MceIy$#Z$ZQ;|1-$j*C?;cA5#Oynp=sj zHPPZt(D<;L$rH_|Mvmp^JVb1Khds^tvd@Q zW09mtuv>~rm_2|1OWGclKR&XgOi0cu`1{@VKWO~VrNmsPUouwczb4h+v;JNG`!WQQ z|Eoi`wJ|X_b#^fR6@CJP{2zA(Xx5i27RxG{mfI24Ehwn~ z3melLDw>*=+i04d8^bj#Ho0Cuj=P!TnMR0mpNFZRHy$_aKaIcrly_5DvRvZoO64>V zbKPA;p*Q=*3R$>(_9A|>M;QRLhZ_K^_YQ%xP;uj?lWN__Fbw(f7L-LRM9n7v+B1~J zEfjpK4v|YLlJ+sk)dG3a7S{?@@dnk%rxSe%0Iqi&ft=DhwAV0z8RJ+mJ4B2u;AXJ4 z@dsT1xwB|u_b~vr$A65Oh=y6nJBrRy23XuYVPEfH69-9dq3>vJVC?WjrD9GTcyDKp z(MKKG`+-Tmg;lQT-EIBA-E+en-iG0lR70I3$m&Ld2?O zcqKbs!`&@=MT^(|fw-MGc761O?qTU$y-x^m}MQm z%9J))fBpvBMa-k_13KHLkhGmVhPwlY>Cx_S1$h(v(kH)}I*z^59{3hDUhOPyBkg;A z@NW0w^_7YM2IJMc8wGBX^xGWIjXU5c$7Og+3>Ym1nU%%*sv8HF_8B@71qQgHPsC$& zA3G8Rn$S;-4I`61dXWDoMdO>2%k<_r@OWzc_GjTyII-90L2=<6IP~2_AM=$Bzj>*HT^gsW- zC&BZt_$42zVOi*Z<^8nu$E-EKKvQpTZZB>&xAgSZL{hACHZ_wi>tIDbFV{&83nt{A zOnbmAjCUhI7Po?UhFz25F|Dz+_CBQ`anx3{R5UbQgi^|6sjjxw&997p&X%TJ{q?a^ zSlOJbt+q3-@82BRT5rrPO(2_TEq0U)TE96D9wC-g!Qvn4uFo$m#dKq8tQyL*jI6fi zXRr1EY1&+XTxLt-tl3!VG9k(c8A>Tv&#TEgm+>w&|2Ahtzht#EcDQ~fTyX1q*5Xv! zM87Z%6?9&yWisL&7~4t*wLA;d1dnR2lRp{>Tcby&GFnr4J7#9Dfkm?L?TwhRs%5NU z#;jcfdv9K;l@1!!F>jz;Y{N$c7hk)4AaV}amu%Rdy9yI-4srw2cXrHI2P5vA6;UHY zKCb}<#ShHg5*$Q^zU(C`Q&7Es_9@UVM%=qX5?|$*S>TK$l!7bX(PN z^q^f^q|0re&uFxeB@(`U&<`F&4?2T(RS#cNleP^-XX2KmZ;v)-B65*Z7bto4rZ7Z;|UY zqtb^9u<@TvvgFq1q!FCMP(0jhG?DN6+khmWZz(FoY2DL_h262dWB6*&h%LrBmr(b4 zaIlEk?l08Vx^c_^RC5n$2();`^r*4jHh8nK43A^wNKS>tI7Iwv88h-B09mULA!4_L z4*IBPEN~kJ>s#9t6l(7Ze`m-NwXzHRu7BBM{b8i1Cf!4*V`f{Rp*XxXKDc@57yQq^ zCyWoF)pH-(#kGQT7dWQ!^NNOhOvzqge-Xd=$}OJQ`@?K(3YXJ;CtI7NB|I7yDV z{jqp)y8aqM@_bbr%xHFolf-Sv^+q5|ly6OpFGZ9y`kCSK{anKW0uS3xMnF+w6U=8F z6k&zb13W)3$lQvLiOB(JQ);iIR!Di5QxRTNtA&JZ2EFIolbenQU(J*r|DiQK{f4b5 zOLH>`A*)RPJTliK>G&7Zv;ngVDh{g&~u5-W`6Id^(Nm5k_T5!DTfu& zU{-2&1+yaaEvPyTOh#hIE4meD5n=sC@*SF>r)W?G$uuvS*O@g7Q8O={r*H^no0nsv=V+9as8yus(ko>br&KmVJGT^H zC?NwEmPsWkDJXk2jo(6lJFtCt{?#XHRccZkjxBg!DN zcK}U08%VHrQ8oJu8%Z7B`6&4kRM;IuE!sI}?5c_nI+CT9Oazc(Az#Taan%J?&L@_e zCH4mZHwGd}a}m1$DitLX%^qXrXbH%)diw35%ddDwzB%HQ+uVAAQKw%tL>l8q3drPrGCP&jiw4-3#uBfB^ zk~5QXHcitZB}Y>(Go8Wa);M>0nh>mWHHtNPK~B zWbq7=Be!mV$h4+!AYUJryDaYH?x>qSKTQx9(;{(nIVAh}&q0mqPfIwTj9vQ6-+`qs zmvu>=DyA-PiaP+hHH2uAh1toD)`>z-!`I{%u^57dNnqTWDkB~aNbTyv$E$!N?g2+l znkT8{{Z8o|zyKNBk8g&wmaT5tjPNBSx%)J8g2dmi)n!idBj8zAa=ZyzN6skeHHL=0 z;^WH=j9GDCl$*F9iuT__AxCvjLb=X%yAf-inoo^Zsnpn19*nXA{8YH~VMRwmW_tHo zhcW_bbA)U-5{tQwsL{_wNA_RNp9dc}M3XVmJ;Oi}oJ6*Nb3iH`MX5Sg-RqzMG+0$J z-9QZM9z-8VTADro62;1z*MinOM>L}hH)F+gV4ZOO(exm=+aHnh zssaa(8$+mVB;-CIq1#7YGcN1wq)%3Z?HQKL`ULxQF_5My(oF5}c$a8B>+EXNxgc&6 z?B%od;6$4iKHOre*Vf>;4EpEy8-Si~ywYYnr?<97Xe(#g!kEob@*Vvum70pmonM6O z4x^hkPQVb{X0CH{(K?JoKNJ_@FC^g5AFvNfji5)+VrVgH8%{J*hoL6sVlElU0|s@N z4)lINzZ8#Xab&F~CXI#i%^f-Y3Iq=o>Hs>-fdTq+Dc8%&B^ozi|O=e*0|_}t#x zO3(3^VoJJ4wIK4mNWP?FUYA;P8f8({4<-0wZC@emtXRYPW5+o4UtCK#h~{lH*j}r`;G6yLHDYKRsKA zst&_5EmneL69=3$7`)kPb|UdavZpcyB2qEYD_6%Jkwv5*yj%3^jWxNS)xP^Rdc!q4z?Lo@OYh-=`Smvb}TJ@eJV zZ+lr!(2d-?Ce?!Pyi)DR7r`7CoQ>S4Ce^}ka#>I6jog5I9HfG5<1CpT$DNqSf9kNU*IC|H_jd`%^k6j7?%G7+dD^WwFdx9ZM6pi75PH9 zpi~RY2TX&<%QcBx#3JlVFlk$ZM@VE-o`DrDO)Y&KgsLzZXYigdx;abwrCJw?|4=u)u3WOgF#QAoN`Ali34IjgC7rp#?#g zp8&2-W>}a0UkOYj@{*Bj{uOcJ$5=tw&WrmSHa-;VSh?g#kvdEVC~mI+(n5fI#k={Ey0^bBv_YY@c@nA*!+aTM z6iJ`-4lvUBu7g#(z~!~Y!cI8Ki_c9#HhIQQgeu$6Fy4HGby*F;o~pd4QKz0y-g3D> zRX%*YAkP?dm3Z^9_@`WK^Rj29alW8tJs{w6Wj|RuF7vp#4-wz}jG<*GE>rNTWFdIeoNNMxuKf--{2*O; z8(-+sB3hZjYAO+K&Kw3y7-53XVZ4J6OhsC4{EkstxQ#yiy&%g#XZP+OC~n!H;Xcy6 z{?NrrQoW$gyce}Z$NSoO#GSks9BpKbo!wk&mBE$wD4*E(*zI4&aY9E>D=_m9o8x{M zpA9J{XrD22>TC-gshHqpm20X-XTr=T_2)EIToR_XDa+4l-eH&_W%VSbY@!}25Zxqj z-S`$M|B?s4)lrg%*#(;{!Zcp6MkAsMt~_JB-O&3mg*d_h4t=0)-q?^m(@+DBIl|mv zO{@T{GyzqC{I0FX5lM>Y2^4s1OX zr)G8Tqkb0P8_*_Ey3(xFvzA@CK3!ZJ*(t&XxF@5HEgbP!mabya50aSrMLC$NRSoNAQE_Dlf3r`Yv z4YaCk`Z(BOY^dRCoa+X}5B8d7BNN^9z?zuUm@x|+=k3!tQclDSvo|5c3Ky-9aEqTa zBOM}ugxf>S1f!L$c%;ehW-$w*3-!Ad^t2^Z|B?{vYs1(>*b{@(6T{sh1LdWM;XC5b zarwys0;CL}UG9Ze>g!?Y8*J0%u}vAllQiJfX$3mB0s#4ciCFKnmi+By27Py?IdXrZ z`3Mc+!mGp?GZip~Jwjpoi!+u=z;5@q7Wk}okr(jEVkp&DUl{g{tkAa*6@ZoToVV;a zpcL{+_k$P5F;w|cM1mPlNHXdy|6z}$7Q@ztS3(p1Xtt8y>kcokk|N?OCZ{2?u{oy! zha1CqIHZtN&ns=FcHF{pEC{E1!}JFo1qPG_llJ*;g2B?vf}nog^W(pV=C9S z8HQ+^0>d>)CfCB1d^Sm~OS;UNAQ_=hFt*(SXR-{=V2rHrlM_pDC_WN1$Si`jvDlEC za_1bL;V_aE;2;|Isu+00=lvoAKiYdI2KNxsz>G8luYw(|g{*M+AD=0f{s_mRwcYZH9^;6{XWkC8H6LY!JENM022N& zy`{+E(}E_JE?U*(ziXY&?*}BoqS@v2cpxjl%I<~d(P35U9(chR@k5Pi_QfSI89H^C z9v}twQky*+*+a^rvc{$KAOz*q(9#cftt1Y^?6o5Ju_)rSx+!&YB^RjMk%-Ti5SsN2 z1(&@aoqi##7EJ8r3^uhgvxPNG8<%d46Pkj*5>ukFbHQMJf~ZebCrw+gnMH^COQiZ+ zafFjv)=^~)DmL{~zVpJ+0LKDpjQ6L&Y-(__+?3zj!vt(YLyFYoi%%$#L+(~Y2tLVR z%z?c&>IY{2StQv32;39`?Mf%PM{VnOXNsK_-CGx6?pjWKp_V*%#E=bSufIv`j0yl$ z=~R~hq+T#N71Yx#o1TfiSKZ%_0hnzAYElKEU1^OWbb=%_>_{SZCJWTmBDvDlIiy5O z**3dcRsTXEmM zbZ9O;vJi#-XiTZxPOgMUpAs5L3g$8h;c4+2(G6j@7keXCb)=*WxOE}+ zidE4tS1?~a_`pwvF1z4RHC`oEb`exC-YtjNNfU39{JT-i^QkAJNjX6 z*UF-{W;dP)Y%N-JjTy=Go1D(LF*4POs3|X}FUw8}->6P6+lI1e#R=6gC$VTXE(q~N z+O@~Fh_p*!U-CKJIia;TRE@4(0PJA_^)kl1d%#5a@>|r+y{cuC!h3qEm3l$@gm<*X zE8t8Zq~uECA^OIXLF4aLzt3h%ya~wnNGMQW9kRbpR`xv6xcl>;hUrkbcGVEOl+_a?>Ctk6KRO9I)-f$wY$zT28Un8 z^_%y`hJAn>Y6j;%y?H=xos4H=3u(=&Y};Vh)V4|f%0*5cJ=Ml_?c}QA#*IBKNun3R z!zk!X_`c-&#(REp_4v3I`7x`@O36w9;jtpVGXoDyL z#I(dBlOW!p--zU5iqE&Kk^fTg9H0>{4A`9CvYbbpAFXtu-L;}qr(vmS$t}8smvhLT zQ&{@e#h5rwM3jT;d-XZ(wfo9*`^kNKoY{Rh!#GQTgW|^N2g8;X_}s?IcQ23dTHdBR z0uD4b6iC5Sa&QQEw3iRia1XiuDenG}6eb(VR&c-w=!Kg5Cl3lP@?!Ae$=#iUqCj^T z&B#k=h#o~3`G_|B{IKCZC@gXP%>h8SU$ybREW#fEb-yl5aotU7r@v|1gvZLLsSEBa`g3`X3gLWF>j?DywAG>^ z=aZ1q&h|KTC1r+E9fbi2$Dl{;&Wdr6p~>mQja^kCMHj2Z6(iz43*!#LwG?rb-FD0M zfqXXZDrYoEv?++?aM^`>cKp)o#2f<3+j-2QJR_CGR<2D3lj?yqYm*C>wTj@xg|s@+ z)SPFVc>W0$UZUp5MwAYv#mKPU0?T0I%7Rs?{_m*yt&Ful-IwfGd8j^nO7(V@g!{doE#Fgx z+69MRnYY3+nZ5wPnZD$vz9Co_>%}j`hGUt(gj$#kQ$zl^<%VnuZ-p~dM!fPO-8;_zfclIxNfC?t5v4`wn!DllnnXzQmKn92v+P=#BGqS6&EEm( z7}2eJGj#=}GHVS@LSO!f&CD;4GfMYc@jCXP>|e2B>h#+(f5FyT(A6so*4nYSP7p2J zd3KFFrB$I-z6FM?-iJi6GJhe|LXsA}QM2>$c)Ca0_5HIU4GZCgoSXP5y^VRy{oq=>f0TKK;VtD?W9=EmeW)hr>lDSzEA!Hmn8RrQ4|~!hdY5O zFk-GrE}%X{%bS-l67YozV~AP9k6%;FkjH*eCJHR-zjGmQTja8lJU5)kS8JEAir5h` zS7~)dAi5o#QmT2KNWOOR?i=;-5Uk1^FlBOJ3L_XD^|#XB07=3evTzEOoS#rhh$)lCgv*E zyigHhfz>E1LGbyK%$AAbq-USAbNe+%+_jtHTac(g3b$`%?5tI+><(^?&mdXuFxP2R z;v7h*)eN>07XbD))S8d@a_EUc_NmCCTCBbXImq(L+Pd;dTFUaec1jy;K0jJPGIOq^lBBSa@JY1E z5jW_0v^z1KVf9T!!A;_bo-f7 z`NlO9w(Q0d)zs#tL`GDxe?^_*PRsBovP8!SBv15sWp-&xE;xcBGLFJpJ$yi}r4r(1TLW`Ncwu9}bk)Upi{tTl zA}znO(|D*jBVrJ!UgJ9pXokXSxne6A=iZto%)?ff;q>%}7u{IW zwrwXBn-$v?+jga5+qP}nwr$%L^{E$q@BK#icl(a<_W5}d6caauN_;bI?z5Q*ju7D4&Qez6Hq0|vQtRLpT`|vhqDM#e>5&GED}ZDIN~0| z^0W`nH&!8A*UG++iM*qg^^$DlcWAY5Ijj%P zE~h=h)e4Q5mG3y#^JPb{&JKy@vlfQX^jayt;Cob)u0+dvLr+C~kQSArRk~PsT;xLV zTh#(ZQn1wfro$1hpVuH-CDdX&^?+@p)+bC}lsx1e`RNlp(!bM#U;i6D_^0i*p#i{$TTxdJAP0YY^!~XuHC_c;N5c^1 z-75B>;8<(XP-}3((%_3xY=d9-z)$|ch4QIrr>Z#JWDcv?Rc0coZ@8x}6h-7WNg?=F zTkz-+i7OQ5H2&T{e+F&601-a%f$@9nYINFPo=YW&1f1HvKR#yOrr&0MbjrNFy!+Z@ zqkP=xfjE^s6``Rlsf9~>NcIo57u8`d20!_QoN_mH`^vc4 z`_k=5P+r8|{JaZuqc7MQ{Z8HAgvP%{rzg-4@*O)ooe=kKD=Y4c>s3`865}HkC2sVM z99={ri^O$OP-TdVW*-t^2J$t_my8%k?Z+)sl+7zWnhXU043ujrgiS=@4x0MQqNj?G zOA6V>2eKG;qFfzQw)Eh@I|6PF9lx04ryI*`gO3ndHk?fZq1j~BKz8eRpOkVpM$>yk zlsW&#-Lzx4J8U>g$iAK? z`_-LGJ6qxN@9mDPHgfC2U?s~2mNPgqB|6#$5<5Q_hHFBCK>2=b^(cnH#%b<2} zU9MM?IS6O5U}kp2t?3=;uoO{zJsrslq&Q|yNo1&3+~N(x(R2oFKBL3~x55;xDNvK! zaWHqIK9E$Xda`M&gi0HYnm~WUAmZe6f4R4?nl&h8Oks9dMZn1iIx&ZmgxzDG4$D3a ziy3A#!OR#Zvp;ZR74bw6AX7PNu49u9KVZTTJW6LUG_EebwISexab~qe@ce%Mq|_Z! zFwt8hH{p&VZnqUNP0LPa2rRbGKXzgZw^&uW6=q7&8)WFd#4;3YBpH2g$#JTLIMnbR1yb9O$u$^6_P^fK= zk|s|iJZ0M|F3}g~Je=4MG6M>h-lWyvdn>O)qTWjaHn&&`eC1OX4qjgT_ZF`;MB+Qe z&8+D^K$%~qQRh%m{bq}s0yd$y@UBE*y?V?s->G-#2se zrTQ%UK3hy|8ee%?Ez!%r>%Y2D9`N#a=k)NT59c8)#+ox;zv9cR{lbyc7kkBbde!O; z?7O4#uPOE4^V-V9tU**7eZMT_??zm95+&!9q!eJs_*{NGdcf$$tio0PFjdymq$?eJ z#(i%wVyk}RWCap14^Q;{VpQ!dILvXHA=H>tL5(PuDM*`QI2EIQ1EWyk{sG8}tat3Y z@A0{UH3FH$9G*|>gcv4i8JX@OOEWI;{%yLo8J&#c$P)kVY3j&D0o>8DmAy|W#>9v{ zzz=v;pJ(2pV-jlgSC6H36L58ubwBK<%{eRag0f~3 z`;>i=Rs%#92_v?I+AOhxg0-;)+6qNgE650bNa?H`XP62Qn_Bf@vw5JRZVaYMu1_*m z6~FiuA6q;)-+kdDjmOrtj_H|xYIPfEk@+&pH9+8vcTIKIt)^_|(h6^7F}_|c=X zg+0<-l%px7ltPaK)R1b*2R+eW>_R5WEP--Y15sw(-D<(I8YJ6YL%Afm4;A#i_K_LW zwk3E@4+gjCoS+%r!*XeaW#+H1#gWAPBDJjRV11)K7#O&zY(pn21Tyf#b~!W zfAlM=X*P#?(NQk6!6LaH>l8x+suHln)dpgkSTv?m1ZF_3TXXvg7Pjykn-K-MFk9j0 z?o<4`ME<5PW@>&kh6p?8RS0g+(T7ItG)rtD0T)|s3vy$$@OsTgRNWIy-aZQkfpMl{ zNqJ(HSmr2c#XBCvkfl2C6z-{TskYX;xZt`(MAcjG>Jwm6cCjgDl*;& zOlTX~LK5E@ziUuE0h5#0&B&SLo92{}{u^0~5;hO|pk?J=00H1REs;1GZFx zlbbWaLf~$KOMe5+n+9Pj+CE_+PQ)LY76XkM z8wm|PiK~O;_y~*hdbs@!1J8}w4f(d%QYbm+Vxu0;W2S5+EcC)a&hi_=A{PZjm)%@v zbn;|dLRwusR`IF=jxE7ix;%gx;r8wwb~KK0_ZE;RLZe7UH((;9@Mo47!nf$;8m(BD z2TO)k?~n|mPqC-MlE=GrRv8di*gtuIXfwK|?*xN}x6wBlp@6XZt2=g8@%nEN8dPi& zcMTKc_1XA2q>*i7f|LlQQEfwl8W6B18dFA-ou%)~t8Jw1WOOVqu^-V_@a#UD?XrM` z&EzozOtL|?W}@|jj3GlL>*A6kL`L}xqJKo*E7GfAoMhzHC5hiLlun9>g zEq`M$Pn?~D%Gu~vAZ9n@tsRF@v%kHBI=rh}Ca9S1J#|VZ=;*j3<`I3%Fm~ybMczn3 z+VDVIRV`cz&gm9kEpvGgaJ=+gRZ8j6rW7!@nW}JL#@gP{(+bS;PsQ6N%G!-{y=YG& z!>MrHWgGXuSQz&0aLG(om>W)G44F;ETZgz5zc>&*Y{FZSQH)<`U{?nnhIm@e-7y>r z9EbU_I5tS78m7YjfT^%|n)U|1a62o=e4nc6u#{rP#g4~d9q`=O9Kuhf_F{Gj#W{VT z_lrQY@0++wZIIvb1h-Q-`{~NZAEVwz)bGK002{;0k^hvaf9?^_EzxBFsM7!aAObwI zwlk*Fwb9i#F{HDwHfA=XvoK%p?4Hbx4-YS zt8;&3_-c6Qa%k|pulIOj{IguJ+%7wbR)!N#X zj*f$-rp?C2^{%eN&d!65j{UZ_-QM1lo}T0O_T9F&?SX-_o}Q!L-lM6h`^m|>+1baG z)c(w@k-YrL%&g)3f~k_y`GUf!YQRraER|O*l$6dEm(0}FZ&U$(rE0OIb+@@?Cpon* zuV5-GXSAqfuCf|nojq6IxOsDPQ(IdL3kx_}_kVs6Jc9xb765;u{{83Q_v91A$4_7% zUqAnVz@XqD=TBh~;ZY$zpMV_W6BEK6W1JnWt!#M>wN2w3onzv(>~#cm9fX|uf#O2a z^}gHbix|mC)YOH<*%iP8T$>G?yh%AwxnO4~{doFq4s{M$n*Rh7JP? zb(9w)m7=0hN9BR$fSd@76ICRpgr_&U>gw7W2viT`h(|{Nkq89gM5dSh1kBGP7*{4c z)MMxy2nxfvhn`2Pi-U&9W@1AB6Nunb53uGCf0n2ZI2&je@|J~hwlqHD8WVo*0C9RZ zD@qRW^*{ua`gc+m_Gxc0EG376Tx3(zPheo`O)m7pvITkZKUQ4#j>si51CZ%;XDGJj zNSk87*J+BGE3-R*fq^~|yvqn$+ql}98k;!aGt$%3z!=OPT81S=+nXI~ZEp zQ{#(U>C@u#TUg-B|9+!AzPzEmp`DYV0WB=lH%SqEQF(l2Lpyv1T6$QhPn^G74TT#t z`(FU(I-veK+wteQjDKBre1N<2|FCZVb=lbijQT7rOdSk=FFyN6huSJhWF2@Nww|sl zz^c34?DTrN+U^fUd%Re0b-O=FW-^Yz>R1mLQmpdc=8j#q>f9GmZ&47&8QFPkr15J*j|cfB%yHeLTrS*ME# zCbUeVyr_nrYGL3A0m1BmxCAg5+dL@_4?Rh*f9Z7k@|3D<*5s&vv>=J-xD*3L&0SH6 z#>gcKSXhH(TBx$$(3L%jyRzgKJu>`mCGx>`nS!CQ?xEhXu_3gQ-oe(v;nw!{mV?s% z?$*x1_c|ebDdYVTr4X2fKgJlQg<5>S`VDOW$p7Qi%fDV-mjAb_3*bp@drMsl3vE+< zYpegbq>4JSI!_ayfJ=Mh&+5T0Hak1LKHgVWvJ69WzH^_V?dp0~_m$A9Z_Ag?k8*;+ z!NCF6(&RX$0u^te;)J&$aBcU0) zl52m=u2Rqpr+obi(acW8ds&yVcKG~YE9Y07R0Hg#uAWjHycU@m%YzgARKG+pqeXy^ zzcuDDh|v*ZZUzem%BHyGRG;|qrNrt%Txm5~4O#E_!9TF!@g{rw~!_s7R% zT;g_PwY*332m#Ib(?s|QK3zZ2{eX-U=+bKG?d`3X+t-&_z0lS~`*7GifGPHK{p#(k zf0)cB3-EGv~CTL@a&+Fi$=P%d-8oHJL~KYGw@qIk7T1)=iKo=@@lMT?K=Y_ zLzs^@NC>Z*su21+)6q}1EUxaZ>rC%x!2$hVAK!889(4v(D`*ZjmzjyPrmLazEa{-7 z$iRWniC|{TGx(;Ou4oPQ1kr2)MxtY#z^pVabYnjL&Z4p{RGj3`i$8#bM@?aXm66gw z$F*2Cjtq!#bmjK9MyOoQ9&Y4grAGY+vY9BM1|5e65LxERQG$n z9YSv~HSBqAd%qD{-r=gJesf z?%$cCX>hj9%}t0HDk-h3WXFyBf~-coZEiW!sua09Rfi4o{Q-%(j3k7U)bj9vb$jZh z3Poqac!=?!!=79uyEa&bboafvH7s1?nf=FkY*p*jeVeW0-a#SK4C)xm_<6XTWdvs(fV0?b&rt7*=+G*d7k%&maPi4qJJZN+rrSH^i)Gj=C_@VfP!aHEkO;Ce< zpL4nKmOxeWE3ox%wFtK4hu-SD!pCpLK2iB1YeORW%1wZ%=ouv$L|+b$X6UY`UQ z%fP>l%EXR#NKOdx66T@yWe2$t$_-3*%d;v{fS|W2lpF4d5=xN}oa0M_YlaE4#c_o| zKoH@2o?jKmFeP7Y<;}7TPcot8bG|5=G9;VSv=)FiV#&nFW)!)ubm~7!?&E6CakCY% zE!|c5a|oXD&M^3t;YF0sh4}&2hQxqnBXo#b8Yqt)J}>VEHSZ#H?Mi z)o3KU7OEDiPK%34KYNwo8P#;dn?<8jwyBz7)BqOkDFUS?JgxDYSyf{*X|KebeYxN% zNc@2evXz`Bd2_;>FWaK>czZL9*t#)@~XTgRF5Ha=!;r2PKa39v1P z!OP9bMN{CgOIomn)E=70!O`BSSeqC+=WZU6xQ-8~bUaG>rh~dEHm(T_Hb!QHCtR#C zRaKM=y?LzKQxkv!TMA=2o1hQojIMV)hAGH(X$2JkEj)@4IzJL{r91|k%DgVzXs}{l zU_9)Z7Y4DKFd0SD@_m{9acri6-lEY%f3T{NG(3gm!QU9!m@M&;rmziDwINgg=*pkw zTX#(BBz-h3vh!HVbM3YSlKyv~!;J-+M6SgKyrhVsVZc}lu3;#ca(?uI{8)PO7H*Cn zn`cGlkrKU&5Lx@lJ7uogx>5QlWil9hUV0-|=aLS)To30bYYPlFnL0f&@iCTdFjRzv zAnqg{rpAYuQ_zBa_~J#(BDt%85le3~gG0v1VDAu3MwoQV5&D^*%5|?gYV+N8>7OHC zzhoNsO{v+M@386aeD&c8u5?Om5y>#x%2>)B^U1;Ztateh1i`hj=8&TYQXoUZx#4|U1R1n+qXt8SG8a|S(27Om`P#<>F{`DswJLwh0AQIQU%NOuL zSV_h;uF_;BjA79vWB;BgVn|UJ%pW`S)!o+w73So&7T;ui^q~zSELEAwFS*EwkYMm< zpy2oqEoUG7>1vbbs(P!TOI#1qyU}S&fR{-Tp3Vp0P~wivGB8S1)IgziC14Ag4p~sh z%rSS_b>kaB9DS!`A2Me)nF|ayn9-Q&U?UD9H=;vnIc}YxM}~*eHVe4P>WIh7nwyt3 zIRZ`{iRjGkMob#y!`WR>NnnDbqT4j$(>WcS;`)NL6ScatyNil@;DD^6Efyu%FHp| zB1zrzCxXCf6bQP%62AF!g|T7)^Dn4hza)s^x;1RhTCi+m?1`b{Ry|kHPHWD)Ma4=j zn2^Ojr$!ci3#g*3G$7i78dd`K5aWwH`4mej-JJVE4!o8VOLHe_sGZC5Kz$z=vn=Sq z_)4*OZ7g~uI3>nIa95~^9n15K6_qH32dWz%U)TYE9+Z##mWrPE7~FP9m>Jp^UUxD! zLR?ckM?l+`VzNwPs(=dDf4-pWjH~O6_&^4gYBl@WonV9vLl!bPGD z{QDns@K}BP!z}?J%O22Q`oA+7^MA)=*2V&M*5-zGQr1?c4%T-6J95ddTOsnJbA!bB zJEHWlQYx2+K-JaMEtF!?5u5sC12&I9TaSGrf}!O!Z~}6L`M~Y-Q{MIevL%SosWydq zxnwZu(Rt|cZ1m&(*E@(US64+ib46iv4=l)6ON*_9@YSYRQu3vyPvpH^}wH#dI!y^~dl4vazH1E3YA)$^VKSX05H!LNJ7@U9He9Me%_NBgoqs8Cd z!p4R+gh(CISh71JrG(Q|q_N;!>K0ttvD>9L2oE^5?L6hNz8B`qgH7}Q9^v8D;q7%2 z;jVrK*E^yJ6**CE$XskWBx6#}!6th-K-tuTn%LBQd zf(a8(=YhEZC$tpjou;jDtyC;-%^*A(D<4E)>?HEwnnY*3@U$2@o!KvZV{d>Hg;&U= z@D8QC!Np(J_QU5XvFHj>HwMc4QI%vZDNzqrg|KAIXGv9rUgSY(4{eT)5O2s!Fo%n1 z2Vh+>v?uV)!Aj8lSv_w zq$FXR$}>!HjdZiUmGXSnY{u$OcK$N-XI5>sg(4^;w2uejGYdWjg6cxZX+Wz zqk3>G*w{k%sV$IkH2c4yF50Yj!>&2V_RwIJvRbW@LmQ0YqsN~BvuGc8kUbh0^L;P+ zg(XOLX6d&36Hd&%Qs)QDD z?-f7C_@&iyhR%@FVBDvYgK;gIBWORE5eEtN=g$}B5V5a?5n!nbh$7W47q$kiXFV>$)-x`yD=33o@iKE#BoFH^F#Z9(+c&} z8q414>1M}LLNhN~Qgv>2WWmY^<-laUXlV)z`T12}5BS;dJ9%!$V;gr~1OmCV;TZ&x zpr)|5BD-`28w>K_)iTwd0dx3J+K?0q<$8=e@M*2=-pkDhwzK`cwvlOrk@t0cnSwpkb(QvzAx)f)(2wqru`pFKyg`9*KR>pcZf!R$jw8L(M zu?W7#_|+!?dc=AG^RmZQU7J@$WWZ3HXAsxj<@jkN@J&(o2I`&NRgMlPVjxnyF{9s zzN*n%tLuM~GUOEZvl`@*0uxrZKQ3=npR-IBO;#L+29PUmkY|czFDv4eEoxK`G4#c1 zoajJ<9Y(O~y9T1=bp_^$7*~SG)z0Od2KZ^VPe5QSxjT8zUUx4f+9|Gw1wE*JLyv5= zkDhd|*T!*Z(8R(>G^Sv(kakO#Sij&fvW1SIWv4I#Fw|!lBBT`;b>IPxE(CdN2Kuw9T}h>#v1F zosG+drZlpwX<&0h51ohl2*#G}D`hR!VF79NFr9+a_H4ZRZUP915j8QpXi<-v-fKT-w2H#(a$Qm#--TPiUhC(Ec)ae?t=7|D7nvUj;FEsr)iu<} z+9oSG97e*p8xD=x$n{2ZbZ)m5E6n5KJ?2&zc9(|`$379_MjdM8>1&bUfJxdHA3EXo zF5twHIv2xl&2$jU+6!dBiHKOu+Zb``OA+RUG;knRGTAF;GzUig$+vBY9lH{_XCqc- zIjd4mBv6FOOYL3AXbV1V#e{d$Ya3zmi>*+n%Qfkf0h@Onk=EIqNh9L6(l6MG2a=c5@wL4iiQ>bT+A`eZH}Us2~a_> zr%rTf9ITmUyPt%=AD0>OkYu=honQc8;6Qcpdc*G5+>h%|wu9nnX4rS@)%K-aoQz`k zW#M=7p%O{Le@u0X@B*qTAy>yzty$we8tpt9RUH_QyHGZB#*!#jnBd?Z{PLUZu&?u3 zVF7rP_=oZKmsMxHf|m6xJu>(AZ?#6cIOfkAs@{w<73Ru7GFjrX-hN_V^RjuaeAed7 z6=qz%tx3O9=P?lDJ^{Uw_tkTHGs91by|?i2JYs7fu0GOf>*`{0!daA|MGewGU=<-3 zwVrRmU91$XG#Ts15>y7rDX;6AfHUGey#@seZV%dB+3XDlM!uR7M+l!l*j-V_Uka~8 zi{}~qO3JpmB9Ifz&WTdZ5JKKCG;zJ1o@;?=Za9Mu(1Rz@vu3;qzJtB&M^=M17}}+k zA!_G=KB&_Hr*EQ*70NqLGEUACGp`t%UjVt0-OCO!xKYmwWW)*O=?y>&dy0E`Rejc@ zMBL|Pi8^$%+G9kle)tMMZA6Hgjri6OMz-tMS3U+Osfhf-A7>h6k56Vw{#|Hge*gAY z3g#ui`Vb9_jgUQ1x6lw#&!LYCZFbf)*X}e^tmilRs!Uv4<<}W}0NN|Nb9vO7i$|`|dDkfywYzx&iCTU8_ z^YNw)#DSb@P2TPvin0h?nJDwLogTUc!|-Yj)w&1Sng>{SL#GQecMKKV@gnUW$2EFP zYs>(aI7z1#HQ&BJpmrQ0ru`WJHOPM$YJZt_#w%P}&&VQkTbDb`NyDd053VVu`4d=^ z|Cpgp7D9@(N*TNArYneph>P#Yr=fmVBSk{ueS&xbc+;5=OBTqP&OGiuwAoLzH(vhs zNX*(sP$x~WCHn%BO4?wf0{eKwy!KVD8w6w(92c_+!)|yglByL3R#XJ!BBN67LvwbeNT$2p)4ALNh!Chq$BLFN|@K>{d}ac(s}E1^x!URA}#G^Maa>| z_tsF_nMm!%H(S|B#CEDC zffwNN2a`%dqjP9g%R{CFp8O=jaP}TPtS!oNYXkBfbt$zmcCuW$uZNnRJtoYF=EkZs z##3`#zCW@Km^4c!qh9*I`$(S&QkxSY*Xx&=^Ow}c+on;)R|jb1$r87(s>-}2C?vpY z%B0IO$P@qgqY+K1AB;~9fFl1t48^}JJLCV5c*tqtf@|oBetg+eaj2jB#Rb>+UO-C} z38SJk`6x#~=uCDk;oRK$=0yI?Y_%OoPPQ;7}*U)kg&GKG8NTWj1iw zJ@sQAD_S97o|iPQ42qJ`*Qj_c^;V35+SqaF*7H}w!(|!1>uEV5b4)Hzq;Mj7(Wdg- zBO}U2zuNBC_xVl5pVD*h5QABwgcA;xs)vTBS}jx@>jb~XkIRcti+JHqhNoMDBxn`a;{%emtmVmp;R4)l_yKuo~kPTrmT>lq$%~E zuvo1G4Nmd@0gHcGcE-!ES^*ptxhD$N4X{4PCD@so{^arFGbaS1%YrK66HqtF&*|V? zHQlMI4_y@R@BH-f6I5}>`^#1?{4NQwAG|#EGHzzN{Xy8`W{1~v$mi3h3>|Q^)1n=D zpHbC_YQ)`dVM^X=yi@%vmfqoWEgg!Ylvq(?mLC(c2N2Htsu5!n9SlGCz8ja_0LErgOj*j1+3U+>wHQ8%XC<2n(uo9e+tDe}85{7_CyzYF&2Do6 zm3CKs0>zvRBWR2-1sL45C@6hD-PpxVp}bv5!Lfr_z?tdjGULQ4sg5~WlE93;zL875 zA@0l9>LyM2NFu?NX^-nx3 z+Ol`UOw7ymKZBxGA?vdb^rKS&*Z#-~t;YgBEq3%QhErn2PhNc=&mMcU94X!RI)85zWUmACM6N=eCzo`h8+Z zz>F#WlCrSZ4OrP%7w9uHE|#DblZr5Zm_uPn+d}&|H?z_~JF)j;F8J4L)2Yu!;Niu)gr`^Nx-4Pn{(4K#y;`UC42{NkDZxul~NYK_^X)02Cmmvd1q5?x~V%7e{Br{h1_1 zN_ek8@8rkn3`Ieo)soUVjW5_A*OLEmIu}~%ar0r4+%sur|~7DJ0bVp zQLn^}hc$4-I?N!sP}_3vQxnJ`3@msyB#XTg^dYo21Vd?^``;A7u`>&xh>qZKwQtvQ z8g85gGxv51i0ZFV2T#BUuGG({E)~6AD7cWQulqK2y{A7NA_zFX0`S1Im$uV+NXRkp zn<88R6cO~p3@WX^xp)C2!xKOeK=CraDFQc=hbW@s^-qdm)X(rFu%XpssCuIC_e}c( z4oz`QwPgS}kp07OVE?N^3V;JL12XsWvJ=Pd%KXZ&<&_do)y9>ktS>ppW^(Wa%4HAS zobBu59O-kCPNBRKS0El&5JA6U`%;?#fZ&W89v|jD%t+n4eT>Y6-zKfdPwMdpb<~u! zg$!j#(9?{lrlvpt)uP@`Qk8+R8hawP?-}ENypB7xvlW4D%0WuSH0!Q2E>W{uFgLN} z4m^BuI&(jKoc0?JUqLy_hYcz&A?F&$cp#aXv}R(rbra9*=V{QBM=#!ZW<;SKH>}N;% z0zwAr?~rkkl0AML{SbimPTPLb44bEFia#J3Mg^A(XbIXYOmZhJ|KlFbUxlN5#dGOD zEQuB>v_znVxX{fW(1taJo(WIurU@+2QrmCl~bUI`AHn0}3-$AQt*jY_zsXc#)fjDnT zr<&-kub@?R!CX5FqY$`g$$pcr*wR+?`c+=ZV-nIsnEVg$u#|5dr8xoApmJF9nNeoqrlz8%SMv|eisfOJA z&CmfebnQuF98Dt5y1~)qz5gbfVgIKxlmK{aC7F}t;%G;iQR%QXhT4r1I3`!W6Q zE|3UeF6JvSvP8BJvDlk-TZ5y;a2gdC*i$u2!4;rkyC`*2*YBbU!QX$H`kFU9FNV5oZkk2TCPh_8&tpC zFVb7Q?wj4#pgl4tgg1CvE*Vy7Xz$7a5M52E>=-Sb^Wy-78#@JK7kCb_A21YGa0ZD2peh3HC}_v# zGuEC246oq7>r^%sf^{AMl}rx)?>dnGMARJ63(H4W(W8czZ0(?3WCdfD*LRn1msQI&uyShzXXI_65lxW>gupvo)!Vc) z{of%F$NSgDX%B$%03pyUpb@NLC3aYo6TavoNf6Pbpe2i}cb9hAbAB8nSwgDd2E?$Q zH?q6r56a8U!EcQ%tsxd^AT4QgvX6B)DH$_W;39H2IAg$pqHdh^#-u2gPRm0;k>2=1 z(aHno1eU7$svW~uV;sPm8@Ph?{i*dX;E**cYo0GmJuDu)B8LQ@%z|%AvMRbXhb+?x zB97fV--|=S@i@p@0^jU~v_eMyo6f+@C_%i{W4x2eHD}7sOXdOlA?H>*94{po(%6$% z?=)*B$jtMnX*I9Fk<=*r5S2;cJFr4_p05WiYOn+VNkku6t6%Qk_EM&PNJDvv@TUBY z3)fQ^+w(=R{6V5T0BnHk#bZme%R=W`0&4Rb2ilEP1PsXF6G9c|0C-qtv#{KAl)qLJ(*%?)Kku~Cjq1tGypi{D>7lKGR-{C72^lNbrz6x_#5Ju zW`D^@{j41>>O-_0z_zmO=zqttQxwUW-|BR9MgjnU-e0 zzRPaF;$|)99(mL#k9c)NwR5zJXBMt)23y8}x>QItfl;PN{X=G+=f@wa$i6ucw+ave zssC*R{GW5g-@TLnB$6@1%NHgWL{-9r35dVT@LcgQq+O$}bfNKVgtss-ik z`t8UkF5FfNj)Fh{U2A`M1`tK9&OBZpPml;!Iz-*T6JO;9{Xx;HG4%l%2>K~-=#RY7 z@l;@qV#j91N<~&ewWZeuRn*>9yOQIeG)c?%uI0qN4AtCrM`zF!_sVd*=tYduwRxCJ zC=2Jq*ya{G*~?WBM3cgmsoCM}pKH)8H8FPl-pc}vBaba5c~0-5srO*jkU2YZk2}(K@%1+w>ad_(EgluIOAw*U-_HZ4EG&|23RDrF zzz~F?&iQM*lvWKoyA=d4bnus8h##MLp=@y|`92e{#O$8#x=(N~J~UoxcjQE*Heu>R zmP&y(!S50-2$TgjA?pcdZ4b1pwUJcCqo<1Bi{$IaG!I`$8}PJ{8UN0j`V1n=U8S5B zkykL>wX>Q(Ds1%aI1J+MJ#O(vlMRvJ-q13g{+0c?8CX|IkY;X!iaYR}k28uLK ziG0RWQw`Np-^xb}=#D2-Jq7pt#?{DXej`_-KYBWCGbq0+Ea6P{<$+u; zWkrub^)f{t$|2miexH4hzSJKjs{5e;LWgEQd!zzN=%!MAB;N1PK`ILuQwu-^^FNG= zzZ((q=Vrg9a%|bM5tdYN!;gAavpCgy{d^^UiX}6C)q42jkKqR=Cfim8qe4iYge{1t zUWlvgKF(Dge#N1#vkmu$4g1ODWjx+aPf?UdTTTI3l@m7KQYO`~DnE0A1i?B%O|+tB zZ(5EopvwCC3dIqMjQGjP4xZ$-zOd{w%%oKMu~urg8E59P=Ei3V-fowI7vOsiJ=BxT zy{W+F>&GS+XON()ztidJiR1BW-OMx2`AKxsep0z*KstShM1SQ2h#fBRhX##IO2~af zD~hq4Ulx}I6-cC0Jrd8ns{`xks@B2-&GPavImL-a(mlQ>wB6ZKs8j{@f1p4LaobxU ztxSKvdd>CH?Xd=NcWG1Co85vc~7-@VX zAd%KNt_;!FV%t$bE^=ybcApJHY?6f;ds4iCE^i8km4d5Ap0Zayq`<>jdHu5Rv?H)V zW1YT<@LF<}A?$lwi*0Fl5pA+h)i<&}S>!=&K5;$!NaW&2ItWdsl+^niLy}@sLpvtZ z)bPXJQy^dI&1Wl)>PFjVun0oty}R*e=$Jxxe$63c=|hnY-u^GJ-%#<;+RhvTK*iu6 zhRWZKg1=;^bi=yApS8HzQ9vzDK`4_C1<)R?)67#e)lMHLwq2@--YvNLTV_E0DLQLn z7I$~qjVG4gAKpe);%u=}ArEZwLq4k@Y4&~#n@3;NFM}Lw&BnD}M_7^$#}T_1F%*nx z##qA|ZtJ8XOOYP_U3bv{)LraaT%^>>));kN-`Jkx3T8`?)mn~fQtZ^`3 z;|`vnepg;dT`GFKNN^!1o=&$-A{T*7Jp)YEUxQ{|qU;ksGD3@d!6N9ST^;|bybSsm zF9-rEFZuUC`7-1mzhx&5VMN5cZ0W0fsZKJ(WCt=^qAhLJ6T{zGcH0nB#c$d94;SJX z|E|_6ddbWJnwVcs2EN(a6K44+3ghgGf&n2h5QoI*a4L5(D| ziwB4(an~I+LBI@Zu@CL;_8ZNQ8M6A3#Fx%eYfi4CL znv9Xl)FWzRh76NY)8X{Vu47e45=xIQsSvQ+!ZjT;cR9XFm-NV5*<9KS+LX_7MIm8= zH1iyS6~8DJV6%IFs%8YnZRn^{-itD|4(eErr05L2=u&SuslN!E-@FAe3TuONt?W`V z+tQgP2VitDl5`G#X&!7{K?)>X z*a$_wSvi|^!eC)|=7smg890yF*p(woC+r7oXL466?`g7vS6Y_yUV<7I`#SNp(L|bU zNWa_LH<}t1#|1w&ps}avz|1x;vl&KTsat8vW;2wpBt-*3yyui~SZ}zSF@sIDyTq4; zn%>3JtXG!p)Xlh)0(hL>@p$S-k_o>EJxoFv&+S`W4hP=nxzGk=>uB8EVm;CCGbGh* zUriI3u|CLJXQk73t6d#q0?w?k#Gy!g?CBHRdg$WT5ic@J;I%^kW<670J|$QUVOYK zDGJ0UVRUuoZPFj~3(3RuxD2b^(_oOAmUqp1aVer$%azy zK?RLbLL7h-__{;rb?fOZ`%PIM;|^t5&>C%0OOT6h#U=B(H^tQoikb3a4*+e@KXNFp zPOU>TKvEt3&$dAs|L!y>YADR|p>sn=PoZb8`CW^k^w~w*pnwVG|J*^gq3)%swM=A1 zkC`wU-RIvFdSjm;=iqq)d6kRUEVu`USs5ce(5R>C(%*GmS`M)9|^&tp7A-vYl8u1yHAbiyZOd#P9G^&DL{Fwx87Z+8A&@?H-FSc3`SKUSV&oqO5Mz3_4cRQMEu6W;Jnqi~qu_8QcDNE#Q? z5>4i^(CN|VFU1g2GXnOdxmE~?*eb!za#3*+ADx)x#I8wNmu?(SYx6qZHDsrs!C{U^ zmm`>OAuV-niO#i0vY{QX@?oRXO^fe_qM)|eu*+AMq&Vo<)|WVb_NA54(c1z!;mPWl zH{o8q!hoe(!R7EN{tz`OlN^lD!P)iztMzhk7y6;wCa~rbPP+@gK7a*-Va;IG7D_0t z=3%;Ago( zt~E-qpBJQS9ga`q97mHKYgc@oK0;_Fc2oY5p~Sy;91vCQ76dVusKZEUw8Q{tNB4wf zXdE~)sVS@sh6YKwV#*&H9#Q&>kwybMZR=%_WFeGyYrm@-wwb+Z$O`sE6TulhDE2jw zUn%3HphtGkb)9 zRxMo=G44f608JkS3yb`aV^N8rB;CPURU%%=0$R#isQ-~r_Zu)au4A0lI6%F z5Ik6qCWv;zUNbf_xF?1WP>wjAMT+*eW_MQeP`PSg_%Sqyai5w}7c17&4}*25R&9^e zBu%~A9LdF+RBg3aIat}PZ^ua;m&@0Pd0oBBO=Aru%MgKcviV>sIUUOAWbBkXmnl92 z-7Z%FEAv@~U{7|EGW!)^h+gtbM64tb`9ODt1vB-JK0!Q>{Q0nTLB?&twxrx^%Qd08 z%?>)_&<&2@cj}X&Hs*1foUge_^otR!)M?T^QqODO0?du%$7+@ZoYnevUYw6wXf6O* zQ(?Xo8u(#@5k*r;Yr&G1F7yY|y{`TonN!-O08ilkd2lD96P#Ss4z&nX{UQd{6DT#? z14gJUgGq>w=P%$r7zJdwCb@fVygD`O-$78#%ZC>AEs!nV#E&xzfw}plt?9=zGdU~5 zS3P5-aTQOCeuwm}5_dE~5w7S=n?$Bw{F~3u!NI+@aG((e5%oyT$X9qn;^z_a7dH<` z|9Al>u&8jme1pyZzYO-jrKUn9P1)~e=@U$4v9e4HnQmByW*OBe*FOwjgOZpOG?Jt} z?!<*We2iAQNXsV)LS-)iZgVf1F>3{t86begnwskPyYnt{ZT$23i-Op9abv+T47(*P57`IJQ1I2)@O)z(4<&WS=tZ)xfbK?_zyw|ME|9|-c&lZQ`Y`-m9%9X+NLxnrjQaBQ z%%Eu}dpY&LtXM zJrWpk*I7ocG&r_Y6Q87_5|}VHlQ~WkONS6y(wA8XVtKDh6&5Ot8u$ViyL0gFAvvM@ zi#19p)8RRBAekWOUR~XF5gbPwjT|_hh5j-uHt(Hb1&k<3G={k0l&#MY z%dPE!0C&LV>w)TFqLA=+^!bzVWThIB{M6FaxJ~@JeYaF$^2Q%bC!+OBiTv_~%0Sn+ zU>o`a#*sY>p+)4~y+#qiPt$h?z2GZRCi}yk_Bjf$HN2X=)??_1i?2JRmB4tFH6CkXSQo2IP zzR{(Bv*#73G}yoA8D#7^f@%=$9!rj;70^Qw$Aj?J05Bv;!?OpV4z)u`V*Uw zj8lm3lmxninj0Y--AMQP`-^ZVUkmmiCP}bdOl0H^kyNCmDa+~FTG?;tht%VeI$zoK zY)7{mv@CF@xVF=FWd_LGO5qJ zJe$8=FQw-23fAvzIXr!KKJ>J3Pd+XgTOnL(VtU+U09wFf$BEe_=MtRDlpe6R3hy^e zP;Hh#I!xcZ7Vq}HidL?kmg_0qCaySNQS!hHTrQY`5xmVo!126wqMi;`vw9@>L|f@2 z@JYSPkI9L+J&BB8#L1WZ_DN55EMoCAMhS5Cv>i*giMuXuOx(AFJl)RV3>te}kx+?T zRfcfgz`$oetN*JlzSrhSqfPqQgf*0 zrFkT|&0Oi2@9fTd1n+o5*XKZo!xb40OA-v?*$e^;nu`j1ejWd2<*(0u^f%P!hE z4wxt+C2FHJ{5?qW#q;yX%q0XjNGnOX)Hbf;F6{So&z92ch%(UGA81*8eb1A~^0CDm z6E24xSx+gZub*q_t|0~>aMbk%_)(}@4Kckrq4l7^LZm@^Mz}0H#m?h`(0iz)G4i_w zp%h3<(psiwNtQY^9E0>4@cIMx*=+|bm(O{OEtk(_ij#n$Cbwf`VPjh4DYs^PAla~M zR-yK1!Wc^}4`ad9M{%A$`Ya1*6T8r!;V_iRX_afB&SrU`cN+58L zouCYhtR8pFvS>VWTgj*F6$Q6h7T>N9O=q?7>uvo#ZfvN5fi!fN(rjo5=8B;ag*hTG z!+NQ&(leDhyxJV?j>U1$#11q0*pv}1dDbrd@tDP4@2?u40UI}%^u0kZlO1dJ4u@w7 zZ{`Lv`C*0L2>=E)bhBVjiFO&^t$G`$iV=iWlJ3?{eMXJ-jF!rbwLqh$Vyb?xqX0iP zms|A7J@2LSkob-#3|2R2T=_d%x44)&&HKSC+$J$Uy3(6!BY^dF6$R_QH0zf)&M|RI zxC;|8Rb=8OxD?z4;jPA-)0{2SOZW31+*Q}54m+?T<}l|F2`8~Df<>w@db0`W3j&WH zhWc)BGT>%9(pUJkz;`qTvSNA81f6h}a7799wNP)Svo_4~v(X_K*)jCIMAlwCfj7!% zv6X#zD6u`DS_S(Iwf8%S1jKf!n?A2!;rJyCRomsX$;;)2*Es)pHq}>ps1## z+s@N;PVo?(C8=;faXhhV4Ix&#W)mcE*$JmYmGM)DqqZcY$JIQV?Q%g&u5KJa^Qe#Q zq&G-rd9ImklFG85p-OuW-BX)4WrRt8*A9iA394&nDO4Pe^w0W;d4xe69G+ukd(|Nx zIk$Z+8JzIj+NbiYFmTSKYq=pJ>N2&N*ul~$7Kyef@_-o=*{|8<(W@JOJ#?NXb@ehz zc9@t|lz8t4CN_)ST9~frt~?aa5wNt z;wqPZtRaVJ3m-x*6S$u%k=N-R0#%f!niF?y>O`SCUFJ1VeG6ka>e`=(m!cf?VRZQ0 z$cHSxmwZ5eF1A~ll83(}a)+}5Kj_30Sl*)!)NW3-MFdyFWEWzgL0ZnHdLLq5fg2cUyhiWN;C>_76^m2w!|INC0HG^ zGjqDr$Sre5P0*%RPg2_oy3j$5C%5KP*h1~AItPG&`O^a?0#qX7rb+hIMH^HcX{Pg9CqEL@iN<;KKY*Wb6(As8#E^dWzeh-bq$*eCXpx1$XRMM1iHY0AJ zV7;{lb2q)9*6I<6&;dt0E;%9c^Taq72L$V{C*Y|#mjP7o5vsTluENyLPh&V1yMfS8 ztWN?8eqRZB-sg@5r_=%QzA~Kcfq9`h@)9?v2&q!Or8I>bE`_zKUDt$^{yAsN1{$EI ziZz&tZr~}!LTzJ|7f8X}-L)^3WGzx}zwHi;9d~f+Y?~&Y8~M|nsld@ZZYyO*fP52( zc^0Gr#I(^rAtF8kQlMaBt|(}!--=gaXpuoCtar=*LvJ70uncNBbyT$mqT6ey2%_=KG~FbOz-W_@#?n^8_kmS>MPKWS^-P&EUQ} zb}FyH6vZtT6PexbnKt#8p!IWzb>H~_)MM)0@8&J<4zX{tOd2pt&>VxYbHqFMRMQO{ zaeGO)X6QEjm54pa)CmD?{8L?N@$;Y7kpc;3AL(yg-Tud!>3`iA{98LLRQ^{xY@(^A zt_q4$g&q@IsoOEp*{pt+2UTE)v}1c9fmGDgD?&%sA8zK{yyo zM=gm(P+H@wP`DB(xG3F>K=tfE8yjqZKx{<)oN9($Lc=(6O(%%pz2Yy8;xW2iz#%6lG@=z zj@sMLLH$8a()7|IAo_>Fsd{(zDn})bu4W#nnn)k@=KE>S7h@S?2hsZmVBVPRVGJQ1 zw1%9K*x=_F^bHgsYzYks!!trDq|cg-4Zz%y>Y6JIC;M^M7wo6{xi1y7E2<=+FS-=i z8>;(pM&K>8d?ds6{Vm{CFBTTGQb#qm8Os+h-F9ssRwdsaq~$92d{4>QI?h7F_1}aX zIL5|me>Z-(DmhRGNb?_>w+V|ZYWv0}7vZwy(DzjT4KaD9d_r%fND#FTrfg`gUDr*G zd8gPC1%C)Su$$xPsS_BRT9B(`!zu3Ly=Hei2+m!puH^Ani7t16Qk*Z z5_9k7U#d6lmn?ADsMtl)HkU`#paiW%*-HiU-@1kgU~iLLoUc=n#2lw$WL{59;3^qO9*g_F8oX4|VQAqtd zeIxK(Q9}9=^L)85|N1}3hABcy{aeWG1OK09wEy+d{g0L#JNA2xA35mDUXXUsnm`Nk zUJ#915E31}T*FuZUV&szQf9zs7dr!@k_;0I-d3a#2oVZ52Tu7R!mtF9E1Eg^?kxK% zgX8Y#Y7dEWd9XDcgPKi#z!Hs0t-`P(iVdj2s$e!!+b@$peK;8jBWgI>*@^yf?@s7T za)t$iZ+a$n2F>WVa~`Ah_ixc}Y!a+_(to92%GE9*&l|?{S*Jisd3cEZRQ)86&km-3 zrs6rk*UdsYk?%2?CqzQkSU`P8NIa294Bs210{Ta7O2)B*-vdPfZ>jPU#MR52(1W*< zuQk$yzNNK&7iUsPv!S&m$yq`!=P+XpcTEnh8NFoVb@K#7gk zlPVZ--5SCxu8<8FfFa7v{@b9Sq67dVq1X0Qw%>);n97(ZunRkPx*bQ>fnu^@S#u_M z$m9?gdzVA>kYyx~-Jn~~(Lo6m9YeO_y1)4e6sRR%w4dk^TZX5SO?E7;Lmb-!GBJ4g zOKV_D#wcIb-OWF(rg`q!b7JvXi7 z(!J}Su5G;#Mn@7;5UaA8HFUgC2kkcj;^aFE#z#E1pn19BI`Bew>=CVmx7tBU^AEuT zm_iTPO2Rc|`((M8jQ2z(AtVp8WY1web!b!{(Wz3w&?7wl&@ZicVNLlyQpN0kxpK+0 zaIh`64SZ0f4?56#^iO?q#T|d(g8c~_{sz(T=F2d}T8WOraY0kLlx*%9UV?C+v(J$m z@25EwXbJQwo-Me?l~&TrcPE7!Yq8j4sG=_(y1R&7G|EA{1mL}V$ZtXJ(a@|ka{IFX zdak*q-t{5VDrw(w91{jzGgp#fFE%$F>Ibu#r9sn-)qn9y3Q&=4MiA;<%qx1 z?t9zm>Vippm?|w^ppt(-FkZJ9fyss)LMdcT{o~|$DpM1V@7w1A72~%y0y}BI0f$B9 zuJtXBmo*=5bK0;|Ct0o6*O=@jedjpz3Y3t_!5}U?9Qav13`fUZZgk=~vwp~n2N%5K zpYSS-SSoP+BgbI_ZJ2Gdzg3LWieW4uW7$M(xJ7a?G&rO;jtZH=7mAvC3sA2P z#NO`3-k9>`AHfv+H7i9kkWu#QBicUeOtLjJ^bY#X0_<`^p~z!yqz$m<+;)??W`|(Z z-&8l|2JO`)zXFidPU8+|%@yW9OEz|}5FxBQ4iqyp%?7j16tN(d!#Kmhc>G>=1T-xy z%u0d-_*p4-&1>De-N4*vQfSl8e%-0Ho6wIr__=CQV?`>yK+CItft(qJrS7>#F;s6F zWIY{4%a1Edt7kwIZO20)RieGK6dN4;T0~$pG#X+z3}kTVGB*qaQ`sWVJBb~P-Yf9SN5zw(B2mScW& zN(Zf2RWv|-8Fkod&>C_0O+YyMtxZN@%81EGswY~LaXpEW{&hNq0RoD@+Z$P=fK@1! zxIbxCeEfh*OHilL30_QA!r7of%Gz%wtc&QWkPNO~>`U+*^aGu?flzcqz_VZgkZ6;+#Be`NrY8;b?adA;6#Y@qZ;O(@ZnNy8W@-rOfQ zqIEO=5VoP7|71Dg1AnGp8yUSU3w@VJwNqb&=C#aF$}4H6{iA|(`A91hmt_(N;}h?NMAh=iFrbwNrPdeBKjlaL345am+b-cfA*@%3Q6lX-+%Q4aqPtj<5s;o0;y-h=fIpdx2y zcuIx3N+ep{B7kZ;ibxs*P8oi?(397HD&mX?65Dj&Kzjb~0{I_{+JAsV{3npa8V&yd zayHqr0YUg*Kox>y7+_$hLnI=}mXe+}`o$QNrD4y`ySZ zwSaYxe7dHUDrU?&J0nl;d6G@<85l)dEq2(tV!DC+ki+-T9rsKVCSp} zvqT8#f|tLHryjCt-WKM5w>1=R0(qfrOrS(&IlwHomU&ALyL+g-(1}(w`W$ z*d~76Af!gK|{%Nq?%QO#wU?7(9N_}&m>^Qpo zeEoJ8ajy?$GJ2IK*+H@|54KIW69h3(t33Xfy~t^ z2DBh-d~f6A#c!gDTackH?W79uoF&JaiW6z8=w5X%g`+$>8M({iwpR_&F~vyzO&Kh- z`)E|zkcJj_H{xGsNhhsU5`UUI`U>=*;y^sam=we}h#y z6Vv)4B5*={LW(YV1_8ycjHILeD@a8Wvo<TrDD0=bQh@KCEckR?3eJ zBc1!DW|uP~4TnXYKkzGUkO5T*!&u4c9)qA%lO})Sm!@c&JvBHZ@rWyJfCrp#K7^a$o z9D^;)2i#-qTg`uRbi@Zl05^_l*HBPV%(Q^rWRN?=vF7>ah_Epxdz>}1VVCf~kyORa zaY0(f7^+xH(|Zl~kDR*$4*>fBP=Y;CN}If0lhaLs0UG90m9gfD<_+dc`baMCL2Xng zbXP_D=&9ypN*N(r-|2K5;N_DnX+$lH;2<^LM>Z-^$Fr^m@DpHSe$4=ANhhwFkv` z_Y4&hWxWQsya$T_H>sf7>>wqd>x`fJUiz528rLE6CYZV}5mgZ98%pnUjGx9{LQ*e_ z%$;@H=6hShcfQ5Xo6J7d+Z_4hWPdF7*B$-kdrIh~38^ zEi)F8#DQA5D1*js&~z_5T~ zwNoS(fSO574fDC4;=G0xH_MrqK?{jWh)@jHuAE|dy&8wan?ubg*(t=Hg<^TlGBRfS zB66_06(*1{fWHqbE61iCRsO- z6au4`Gm!rYDl=mcmLrS3hlE9=LM6ytyg;^E4ErYBMiJGZ*75zZ33rj?PszGSIE(SS zNLb(cQL~pV!uF_LkaPJq$$rxhgraK7%JQ**wpRRLk!1vZtw7zSZ>=;GXOW#iE()EK z4;a7zu*YjbV?KQBQcGpfOx}b#)`*f3Ox}gw(Jby9Z-MgK6HGJ@BOgykk&(RoZBBu7 zGP~GC3?!sw0j<0?VyvS-Sw7&cnILO?>qp_WFO=0fKvI3{XDJX^O55cO&y>B_jusB> zF~I!+|BhAM92=Hi+>G%Ny}X0el(MT5uKnA>Ienm!N(!|p{&quPAQR9$X0Q~auT69b z*u|y1ER=tWjkqdW{GGjgfMky-RwR4=7|H{1>o#!RhP<&xi}ajEhI;|==zzWXwQ`hi zq!B%HHdNx)izpjbBwe#)&}P19b5k$-9(HPK_E-mSn>2t6KPqwa^Uz@)km9{zWWn;@ zUE;mL%61zd^EpH6x(ikH-et*t<{5;|<=)^-3!?JcAp0~6sx z^;z~|p^Elm0mru5Y0{%cmBTc${AHsvyKUM725tjX(7>0#zU0sFCkT9rgrA|!&(rGE z+sI7pHb6UAMBmun%0j=au}W*9goCWHD(&Q)+G#Q$+J;x$1aksG*Dn6;#bSOYLGYz= zIVf@0Bo$@bO9&lPqMIC-#c5$(Mz+-Nwm^rL^loB?U!O)ajH#hL)Ws9b*|X@2g+cnb z_#8~?7RKhjND0k7JV9au1x^Q!4Q-zGz$}_(el_%i*%@9O&|DST5yw}+gTViD>J215 z4spzZR5tfR;P_)v1o%_jP|8~mN`Xyp<5py0UJDU=0BCq-=S=XYFLNVhH3d8bHKgd8 z&}W4oX+b5bry#T_fQ*pg2f{ug*}R4di)e4|G{Gk;ac4D`RD6|PPzUS*!db}T>k?8J z@@1J0HVJ~w-r%L6cFkuBzhQaU;taM;cm*UbS}|->B^(p_I!?%`Hu|Q&5Yt9(=%WLP zlc%_4KSnGRG%#!|VQr2>o(-D=IepW8fhoq%y)6r~kW$n#O;{0G?6fTlfD`GqfiiB0 zelAvMU8ITybyQ+xTlPglf}RHU`RTb4M)v*0s0%R5c9a(hS4?HshXIzyv4Mo&^SAap zz^OQ!F~T03AV|q&`4o@IaxMyK0Ev}Ad8<3MxeTADBcRI2*b0XYF_S`9mP1~G*RG}b zbK2ca4j`)=L4fGAfk5nV#{#MmF*}p$jaBg-H{R>tg*cH=48LUfNih}<0A(&|mbD8J z%`a(56mZA8LE9EAonrz?j%rkezi|FT&YJ<%wL=~qoiJ}aUBQ)O&gA-T+H!M(o8Q>90n)OS$ z+Z@cbNZZpgvX9IsOwSZgn28JFoDp?;G6VTA^FO=tl2}R(E_e87bD`H%{55@fP{#dJr(Y=% z<-(7IDU88lN99~ZbtS?*(KQW@$bq;qt{whVT1+$E;*hXH${#@zPOupLXAxRtT~K!k z?}A|?sns-LH*8DFPn4y5Emb(#h-zxvFauGla$IHa2De9hIWbWXQLaFVbMb4yW5fJDLw*}y=17Th4m1xB zift|Sh|*R?)}CKXl5WJs7;-2X zI?pZDMe&$)4GeKV<_)rbAy^TI=Tt?!Bkypy z07LKEDqKcuTD(-V?7LyH3*3#lcn-l$1wMhUSP%0MJt)MB--+mXg56dES4x3g-y419 zQY4R|y%!tCD2Q0FElrqO3IKaxB_3L^XS2@V=ZVhv8B^5dRAB^j0j6B+dZa-M*yittY^?Px{+AV~xgu0CgQcMmZyKpPS5 zIZLuJ{kZbq`YM_s5>8Vnj*VNRj_|9a2(vsfW~iw@ps^voWwt#TPaG;F!T3;(3KVaq!%S|TP>E)ni( z$m}793(w#wshfBtl|W=7Q^>>%H)DWtMKJ%XhWV?(@~@eFy8DRhCVhrjP}aFPwUUs= zI&y@$_|K-)WUnTWCipQ1(pV>O5CzWK*64g%s%`gSnNHomZ#dG<2|8e{d}yR%x#RW| zMzXKkHu&0Ai|4O)>H2&veirSX@m)m;+C zkf@xjY`H8CLKfs@<^#~*G7v3xT{RJEzWmDughMMz!w8egZM^WwAbtz(N_n(Ew18Fd zL=;__WIXw2bG(hSo>1l_HRrxv)S`o8eyM?I^zjA99F9b+bN10<{u5TsqFhw=qt%iI zvf0o@-d1RTBJcTHp_i%ih}yU8IrtBXo=M5tjbk) zvD+{Z1Dsga^=yKrbon6@1B%Xz+Cmi#RW!1=&t3MQ{4q5v$W*jf? z9nc`du-sJTRC*CDpiyJ1+8d_ZIDSghn$Spyr)E6X+1t%92j(FI)x6$W4gW3W zZBALblS7#o_9VnJg)6<_#PFzhre)lmV1Mv45iB@IDE?M{t`30MNH90x7JGNV-vqhR zVG1G7BEF8Lk>^Nz#)x;5=wtjO7Jr(9(_4Hxa0WyD$GN1WNLbKTSE z#`%{u>qpy1ymW8b0l0InbYK){0{cmrbSPTutR9&)^f5gC!KPCZP&rY6+Ysti*wb+H zd#+hG^3~dIl~*SX@Ae%9kSHfm<8%7+^dW-ATlO**bkf6tm(MwG7aO6}fEeI;88thk zD}7f{(`!(SzW5j^XawZIQSrSGRX2prI%~qwDl2+Ftg4!%^H7AkL(nRrt~2JK zYl7*62b5PI2y;N3tUt-4w#H@IgI;VBk<{CQ@TC@T8SZv66N_W;CwMH1Xny2Qx8j=s zqhR?@G=8Utra7e16pdjVi_HRH>LY-yITR;rjSI_bU+7*)(4RbB(xmcDnb6-15r1e1 z1Wa`8Y^^#(WrU9{FO_>hPJ~zs%rW51pxZzjgfby1PSzcGweVZIPt~z&(h8TwEtu&# z#AaBJ4Jc6)Owv4OM_*g}0P)F(m%XX#Xy~?3z||fogktQ~e;w8VXp$x73#49*0p$(G znOZhuD7WxVQwx+Z3a zaeAr`3n(&$>JQ$TEE6VpHPO~Slo+!XwLL6GGN!k6uaFRtMwHo$OX^G^rw!8yU@%@zy0}#X>w8L_Tzg0Lq1q9F3j1Cb91)A4 z)mPQ<@}RWNKWw|Z1fX4TBy56wDi=AX4d)Kk-7?}t%B6;31^r|rud_Sb!{uq#3!8sY zo=oN2=@| z7`D+~JC#yI8d32^kVPZQM4!l>sW3#XImVI_BVf-UZ5t<1Q>PbSOJ*kX^7# zLHT%FWc`Vq8Y-dL7Zw)A+c(&shc`jf+cD=4cLm5Oy#68|~DvvN*UU((2p=Uv|Z$I8heTbACMHw!IZs5z!* z_yb%2)9g7bKq`Ut@YHxO+<%79S5v+k#`UoWkmtfjvX~;StQI^yFvKrUUE46+)q`hM zhHpVz`$AQZFCdo2`V}9BE&(F4sW{2Y2t9Y1J*FE&$pXp%)FtC_jYhdyxa-}UAW@Ve zGPY18)oEmrEzj<TGEE-oe>R|Q5Y?o7%zzKZMrx<|K7{v zHX*}ItukgcbRGl)wZ^3CNU{@oyZYNfCv@8aTVj~5hJt6fv9;XgyA52;rJ+pG} z;GRlild~r(Z1VN*%z znAK^TcX|))ReT*eJzJ3X3^woZx6WivPSc#41DNZ|t&Mv$%~j&l%HYpIcFoOb??HYI zKRSfH>HX^Rf*URj^h6{wLU0X(8kdFI4l#ESBcPug^!B*ZX9%<=aigjFNmsUlt4hob z2edw^G<&skNo^EeIH4oW^8I(xEkj9g)2V9uRb*9-=XpQJdxPAjlHf*z(IdWM$;#?m zgRNge%9{@Ikp&#*GOF`NDs6~Bi)bJ+{ZMC8=`WEb?V02Q-(ZnzZLA)f2FwyT{b|A) zK+MGI{1#7|E6v!EQ%rYoTix8*QH!ZdZ3WmmIYKrAok&;xJ!=5hhpa4)GW3XN-8kwv zm4wTvpZ zI{FPdxToEn5H$yew>KbVZFopb=+oLf(l3ED*#$87iVn7%2PO3fbHrb@oodhk%y3jX zEpNG|e8VHwN=Fd__h=`r)i)t?-Yt{D$C7|`{GSnjE&Iep8+127ps>R;q8=TD9_+x* z9zBig-;~cgBLT9wz#A2Hj?@ucs=kWxbCu4v&k>h5Ck1c6Kq=j|lrr0ek})DGAw&aC zv6d5fD@C=3v34JHBv(}PPrx$o3-AuP+4C2xE?r?B9qf(8G}GTCeuF4kSeDRvrKJgd z>AGpIUF4Q#SKr<&eeRh-Rbw6|O?1z~St?>>W!_@B6l(XHih7PRx! ztWUi=A>P`^%IL0QjTi;}8eyC=xrc}dU3I5F;3dB>{gaNgAOS=|!FBnHyvvA@8$(Jb z%}Z~;j!NCNt0yih?K_cN`2OhRw&&b6u%^>u9jE^dUH5fal`7}?5SN9Kb79fX9_=z} zwX_({8hMR#bcI!Zc)cStc917AGX%cay$x^EmUr^qH7cRfd+jv}a3SNBt&_a_Th}GpA3OA%XpKL5DpeP zPM)m$xIA6qohFlZx=7Mm%tvmUb$1wDW(*<3PFn9+Rq-6R^?%%J9u;ZvI$t^G zAu=ipvgAYj;TWK}My$elyAv+<~IGE{ZE8IUgz}*U2VozC6#h&tJ(#Sn6bMTQA#B;k(S>K%} z05P)D=#zIPfq%zbePw+WisCH0SdN+3#Jp@P#oaQEtGk`Ce|WEsS0bCD3Bb)qX1QMr zL9zCGwG%TO+oieqY$P3`gUR_6hYz-NH!4XdoX~lg8mvsbufveVdzlvLk?8^O6Tbx1 zUhaE}B25bs{)C2(?Kk$K+l%AX{D=$c$AUfc+~TomAl6YXywr?$JZ9qw1$Oa|`Rt_G z!K@b85E9}&DcLZ9=(qvT)EwgA@l>9EmbZzQtN8H!-4*8=Ncx1}5I2(EP?fi}JbwnY z(OP!$6~BJ}@@s~no_)gGku4a%6>$sExmokJ>$993K@IKmN-pEQ@eTCB>BV{!#YN)@ zUumXrNBo*y0Wj?^XD6gt#+WErRY@3WrZ=g+s`BLXJxDQ^jlYZPxkd(7uX=r$r+jG3 zS2H*d+4Y82PL;8b+LkW2gNyp5Q~<#JX$i z>IKrEq@_{j20xN>yTCRUH-^xR#aIXCFf4*Z%H=UAF@kvVjq;|FXkSS5i>G~32CNx zF`!{Hs~a(Lv0S`4gUQTs|TE*!#vEr=@vd#shQ#)rN9CW{NAD*t6|!6=K-b)BTvN zp;;ZrbX>=>47JXj8iZK01PZf}CZGBvF@`Y?Rj1MI$*G2w!Gtn|YTn&jo^7FkRs}CzJFH zo$S{Ddc@^IBXZ6wh;vi*w&CrENhZRHz-%!!fPUZ5E*A7vNzV{72dVFzpwP>S zm5}`+s1xN$I@=BYC4N}bPzT`6%f5`1>^Le|J0DDVs|zz{PO#FCK*ycg7Gs$PvW z%HG{$5qjKf!f2Py*HXT7%R5DLeo~eXWzpKm2lE0=`LkJ4{Z8^-q%FOdOW{yqbDeTc zEengt0!Z=?JFj+ayk^s?f04>{Znp54=L>4W()!VWX<&k#CrOtC-)yAHE$r-V!x=M~ zGJZrDRQbdG2ofTA1NOv0eo&9fTohDFVa>^I=o&0wGkJ6(W1*4ocsHcuyclMtgy3! z4;^0mb6Xu6I!@D~XIP;o;HL;u22DTb&SQ!W*inimB+RaD&?9agAzuW^I~&UiiB2B3 z*0M*0_AR&8W&rQf+h9HaGIo)`9!x$D+@(#Kmh&&`KAQEENNUGRD&j{-5`d@2dhNj; z_5+ps0i{n&?T1+GCs7S;(%tji2)ji+v?+9bBBusi)(!Un-@8~-jmp}iZ^w-dOV)#6 z$B7Mb)GgW!zoi3tVMijotr5}-GySuv&tw@wQx7i6=a&y8UH8bkC}bEm?cJx>k3SYL z!sZMaT&bqH@A7U=FDtQ-yNJuc!xUO-*rSbp%}r3FSdu|5f&(@wDO$R)Q6TJa)a-am zt_aXUW5}HXlU``LKc_@03?Zem1{ou(4Kn2o`t=nM0fmP)ViV1RJ++zgn5g-0E112M zFuBvYj*JjS+IZ}Ugu$HU_% zDk_$=BUL=p!o^6V4eROT_(|tF8(s+E&+XEG;G&5Joo=0^UO672-4b|w0`>Q^Ak0bb z(Gw;9s)uo#?t7F@zDV^V#{(?$W<*bKlUjVQ`8IoJ+7qr6?Tmj~R6; z5wrpgLp0-E`uy3cwQQg}aBG8-t^!ZboMSwXyv|1-3MnZZTw0>!qcTX#spO+KNHHMTh!65GEWkz9 ztwgaVZMP0&wGYJ9ac*Pj$S>^aCHLsrIpOh8xtXE#-qLa?OT803)kz{`jA7TX8~sjh zbWQ@n{1$jI+}$D4BSVIIC&Q8)y;yEWhT9XZZYhaccTp&&Try|7551}KplKQE__o6` zTq6~VjGGqm;q{Xx$@KgWz>=Kap~brb%|4ZlO=}F`ST36~27xga$#XI8w3;-GPL+bz zy%Cb>!ikZ7p=1~XJU;R=kR^(>VifnqS??sBSNbOaDH_)T6hfo)6fR8n~u?)NnNH9YbLOQS>4J@UmhwE*j5-4TTK2n*t}S_CwB^s7VvY-;$R%N za`CEnYm`90nBsu!h%rjf48CN2=)>m4;+Di+ovYVruKO}mPU|7NW`C#J#oL?u?YVfJ z69f@(8`fH9SQuk#M_>K`qgJ@mh9X|f1sC+;~SU<0J1q2QcQLIm~j^L8*y{BRr14!6FBe(pdg=FwD36*hP}bw6}v!{2fd# zVGL%b>;TLPVCHKM+Mpxz@&KOk1}TAqH87QFv@w&>-_t_zqZqP=>xn2o__iY~3-sCE=58#L4@C-T7b3)Y~?$YvMXi*S(5bvD;HaAK6E=ux(F z9e+#EEzFN8D=L*0T<`%yt!1?LHyNUFqgSqhS`jYd1YZjs-?CCYD_bXMg$HLy*@20@ zQ2Nle&dHpXnPi?4JHSZtV4pp$rW_N9UPvbtKUKu;F_HXnA~C_v9CeGUH0c^^dfWem z5TRofqg|+UDz?r`;R3=QbZ{O>V#80 zcy9)CMbR(&yd{*~kQ#V#Mh--{+Wo1cx@taWKO1#|+L=91Zs+DS(i(C%X?& zrT`J8bw+W!t{S= zS&p>CLi0*pdx@bo9Hd#gOOR`gzX4yrcVKpIwlSJ6j3|3OyM!sQJDJa&BPAJNPy=}wccZ1+Q_U(ZmMx@6t&d+Gb*Ag#2ndji*X}hn>B0o zO7?gTw!j%@Z-!s^wFTwBul=gFbVR?W@rZ( zQZjC$&!gnk{=ju^rD-zDTSqziW@rX!y%zA>zRdcd8OS8}KOb5MoKb)}=1yBL9avf%^+-L;x}a;XSE zm>mYb1Z-9`&RVGwYA?2>Z9rfp$;S^DdUuF;0m%@McPd#+twX4K+vFEzygrbhp6>Y zDP8|@`gst%D3ApvG8cfe#NI-@WOA zZT<*Eo=$iRZ+y>7M)XyMU;N@vzp|`I#`AuCHF%6?f}~NRNbR`y%ygNc>^#P_l<{OW@(eT>xRQ zocOK-qwVb!ba1SD$V?%9qx;J6rm;UwxRl;7l-@Y5H<<9m;_Vs_2p6uA39B!G7tG-5 zQ9&2Z15a@-?Ro+_^hC932&+{e0M{VuX6KfS?>xKqbE-GmnJH+bl1`0d+WJA~@t;GO|x*T;v^Ls2y>r??{| zY$0i;uTe$Ytv2g>dMbc}>o4^-@a|mer}jHYvb^DC7uRwe$>-+pmfYJ5g~E+;iR5jqbYq+=#t=_C1^#&VJ8;!&ChUmV z>@jwP>wiS~G6n`~ll01R9wqLvJ8bINX&QkJbPTcRZCMJmK;xaK$2!>J((ukI?fRhnv=wLJPPC!Rfbuo&QA90UxGOI%B-E3}U!&MpIeQr^ z=FY$~L$;8xfR$Lu=njq}@_0JE@8HN{2jaX=vIU+Bn|I)oAs{raI>*h{q2SU$DRQ7f zlrZDBqv@Rq2u@c^TWF;~RR4MH86tOxs8!L0M} z8J(}?!k_jpQ5g*Ld}RLA)G>xL+p1cMup}Mv&?0_|J@HC9VhQWf#?h1`k2Eh%I;t95 zT8*#h6W8o*z}Muv*;pj&ajbE;JnJ{fm3CudHk5BdikU!}bZm@lLwMN?|G;g|cAt0J z31T{|!^5J|!5X*gY zE{~_K6k3-PX4TM8Zo<+!w%UNp=|@e2qhLpS~1d;V%Q0Th>AxE=U9p{ z>#rjAV4hA2r`n0WvD12`mbk6jd})zP4u-*ws=QSbm+TH{>2CyO!~ArxHzTfSq!i18 zDgja_yGocPDUrJ;*q5SDfR?fIQ(1U7uMO;=j;(uK7Y-1!Y(sfk++E50`ntUj7j;VZgwZix^G_%s7|QDjqOt5Y2%Bst=tcf;)vY$s4TN z0h2fMw;J<1ZKrTOAvUI!bN-Utj)gmNt(Q)g1(`Y_T2(@f7Y4N|A$ZU`!pz<>%D0Ps zNu0Yp3wOy6{mDycJ00#xG29EckPl0-PJAgrPob|!v2QcW-0J+;892C}Gsk=*5+Y7G zc(llzs}FtlF<0!_&wh-}<)MQ%m?j-=eK`CwE&LKmWJR0mQ9b4o_?!KU^IR`GieYVp z&JE@ohi!$3UihV9g~R&7$nes#Zjsdv&kca|&V_0|s$_J_^6J(E(c+}ZGGmmIsA`5X z(Zle&R|9oIj-!F8D9UvYi_NuhI>pRzM6Z4c9JjS(Zpu{q@UmT~DGFEKn(NnUGd7w^ zB0X+9EZC(P`N+CFHM9F3ihlN2HPd3c;nnW|(~yj}m1GX?GnS|$?U0Oge;+L|{q_R{ z5pVtsgB&FDvec8tMF$kMGVWzeIoDF{48y=KeN@|{WG?t&Ia-q{;!_0drYhxbTj1gc@W^cWQGo5nYQ8U zBf6HW;2UIqq%CPdS5QiQL)dg_L?<;sK2_LXGvJS0Frh|VLQ;W>TnMl!=~R+xu10JB zcKYlAzv?RDJMntN;UNC0cPkNFc^_0X)i(53c=|%t8Ic;LuAw{p7(?d|2&T=`VDe33 zN@y%$nL&mwkf?)W8kfO}lU#AYApNgHNGr1dfH9MWf$jW$Th}_+zz#3HsVmbWxd0o8z@rw5s|g z>rc+1wqXqtm#{8mgLYeBL6(!gz`6&cJy>qr!PUK-l6IgO888GL(__bI7=-Kt9+*NI zZ386hV9cf%$CGXvRB<6%m=821a`dJIQ;a@hWOSxHI0hQ$4_hP{W{-!ZT9H?DN7y~K zHnOF~+)nGXIhShe#5MGjrfr<;`A}OTk8U~P3pK5DZsNk4kY=tN6O}9~%Iw zOCf}N62uFQcmpp&7-I^Mu!(v$uZB8>12<8o*_>(o{u|Q_UZKEW2Vp}oa_?X|2Li-6 zvK`)I2_K!3%LZppq6&s$V9a7*;(dj3^EhvNqw&r7?@hzs-M~+Kau}310Y;wqUMC-h zwIYkDj^%?kMS6VyWE~A!#Y_*GuN`RJp(VT2a*;)0cuK*83CxYLgH>pYiDL&XlXe-U z8=#bL1}Yl{D_X?+XF+$2C>UdG`19H=hhY=nUYXUi&&9$BmDg zHg{QVQaNcnIY;Va7&o1*iYhBFeVAYvxG|%j!tKSCaG)m}&xw))COP)J$Hbt>6TRjS z+w#Z5orPu)?FC7>H`Sof4pgK4vh(}r!V{MtJ*^95 zq|z5Y>}ii#j1%4Atk2BN-)OK|?Iu{rH95zrOxrJBEo-zign@)MIBrphqaUM;@Ny~E zp_MUgsjE4ur@1@ZMSE)f*D$a9L0{~msM0g`ESt|7E<}!8!~Oc?cHuF4|B?EfykCse zt^8QpE&==B!#l$!-R&IPKLt@_6e%Mf&!{V3{VH6R0(>~XGj*%wMicoi|1l2K6D-pM z@bm<7c!SEi4@;5xaf<3*{Luw83=?zc3|>RjMW>+iTTeG9d|^fmu1rl zW)z___UnoSbcJ(X6SXS}4KPWq-^?>=GC+~ltFK$Hsl(0m0lWG})!HvU`F8G2+laWiXmC+D8yYRz8ReGomGVr1A51)t(KVZ4-gLd2&j``>fOJk{a(|GA2-h&eAquf`< zud4V^M$=n!{H`m1t&ChnJx%J!IQxuvGcTRV$x)rl(`Ty1v@BYekmqzGE+TN5YOEP? z1RW3dcH`Bx*K(uu^{O;enT{scXB^A0T=IzT;BXTZB)CA4RWx5eUOzey)XZW4&2rjRL)nM_S&ZCFk|0WL8$)WKo<&hNI*O_E~?C>Av}5knz7AnXBwjh zwsKCzh7V0eD&s~_U~IUQ5h~EFe%@-WWj2 zu$v^M4MS!_y0V(bBL)`Mbny}eJ-X(#)FRBFpheq7%B)o$3lxflJLQU{ie)nG&GGDZ z9Fwr1gIOXy$Wmvm>&ex}mxYq}K&Z8t6Oj!B^+nrJp8K~#-9IxX)1t;53#Scb2Kq*q z{{L*~ou=TIHzHI`E@NJlo~iy0Oc1H-TBeSj9x`>}8~W&c3A)yl_EeD=hmjJSUO@?W|m@2)w7 zyFT{-zoBZs!5dHLdUOS)#jO(BL1zD^`Q!Vm&v+Zf&@=0<-603ptgDQV1{exWKD^y z@+5WLl-FX8CsM)Lv&!1yMZzeL@mh8rlVKtDpnO;ARJd~#j3*I$YEnmgx55iNIOwyQ zGUt!`?{iw`PLgO}RgN~tM_&+WnMU%< zr)ti-cY@>_-@ z(OXBq2MVSIALtWL`Qp$dS{rFH@Y@%QhLB#8wtzoWfx1ya5Q%t&K3Lr2>!Mx4&EzYt z@?rM81VxLhf8{rlypLWGtOR+Pzv%`l(1?7tglLwxt!QmdAnZ?M&uqRIA*k` z=u7a9Vr;t^gOir##ABssHQAZt3@09x6J&xto5uUEIK1oaLAl{;3;cWI`cy^K85nki zF74M?5!+*!D=2t3d|5Eydn5K$^m*2Ve29`G!GY7XFs63JNLUdgVUJcBc=(aDhR1@r z3U`Kc(XO!}qszgy*SPr#TN$`U5q$P){CBT9c|(3JIJ;P6iaOyDrvvSrrT-Ec+F~K2){y=bh^VfQ6pRfT&*$ zq=?GzPed7p%lXnH;i~rvmNs$2Ub+Y-i_zQ+AQ^Q^8>k*`>dR^u5;`xY^35mQ$)=hx zfy|pGHg~`usc;kcq&`AgU(nu_y}Llq>%>B?qM{Rf8YJzExN}LvPav*6Tc@CTX)~`y zn5QLXJLYAW`83h>GBFd0pu05h1xR&r1YBUjkB#BM3*V`bZVYB|-5tW0J&ywg8 zXTQP!l^N5Fz3n@H@aEev|0y$a{@>{j|IUn}PEPht|D7I5{>^vJ`QN+{v{qec(NBSd zxJaHQEX?Q?bjSb#5)y0zz%Adl-iBo=E;FvwrzTl>#1GrXKY4#pJJ{Ef<(9&Kx@ZGCB8lYTFm@AOLR&ikX6tYFQtZlk+xaD=Z}6$dJzT_g<9 zDs$|T zwz-6K1wq4>)Q3$`F_&A2cOqv8Hr*TrG#U^)wLTZ_MvJUdD{pc?3`yEmegp z#NIYWk}kceT`NZPtK244bW^`<`by>Wf5xC8^EwRGAXBjUu(nXIlwh!TlyL`h@#iqw zJ#xfZ-o&p$eX8#v9tQM*#IAVa#~;&&A7|lH_`qjF=K9jTGRob5x+JR`vj(3kDeocT z#Wk~eJXJeA;DqE+=ur><(%;8<%hP(3s);6#e!I+we}I7(MpH-rKKw5tEK@FGcli$t z1oJ<_K-m9ZmcxHnOF62x&WmCQesl@6;t)WA|G=SWNk!Qjsf=L{5yo?*heoC&LCEsE z9ADzZ23A8aklOj9>1Si|EaLb32O7$|3Gv*4_h)vjZ?>JR_vAc<$>01PWr$oG+ba!; zN@q}<+DjFcS{<@STS#wa2(d(FMiXPOKBx^rPH%C5cYdeHNN;1PWJPz}9RR{JxmD0c zW7b%hXpAsLj>A}Z@H?#n4fUDXJof(7XSaJZ9Q0L+@K8=h%E5M6sICZyDf#3IQcTSX zG+cTRZs^>sjyMIa11)ys(L4cg#rgQ&P{Otxjlv}5Mq|7}P@MUesCs+L?YAAYy;!5vo$ym>?RmfBBCBk&188Ra^!B z?pEwY+Yf`bF1R3k;#Zt8;)O|HmPW%Jh`$1IEP5etHy&ibRab44ciWpTD zTb{u@m=kziJn`>iBzu=08=le32y`~RKsW#^^Tm_C+~D|@;K!-ESW zxGiXX&QkviPTWb@+}(^V_o+fS9RA22jVM(SKX7^PPX;Wp~=tPf9n~(^b${6MlwrraT&drey5ti(RT90qs z0J#01)f13d2L4FCM{5IWDuj!cvn zG=8NDnuOYYb0LRY_}ZU21nBkv)K950LCmPJgk&ObzI{aknf}5tmqhTq{{oL`5|U?8 z|GbMb|ItA4KM&86b`GvC|KITZZ~XoWoo<@Apa{Yr)nWk?My);z37EKIM^Dg!7ejAb z@YHQHF50ucJNoz^toZG}5=; z=}HGMgEzq)gWQ)EXqCVQs0$We^x90+3;HE5>F0gSk4Ek)x`=MTC%)Ih$QDvBx39Bp zN--VP2<*3GXMtg&HZF0aQa4fFmioZgq$me$sVNZ$>up>mkfp@05$ zEUZ#hAgs*JxIxWfagFeX>dM&?zjf`V4Lsd3F9(K0{hlErDY!IVu5qroQykmc@^0zQ zs>xzJ+E{AMO9Zz~(*+kM-_uC{A1e66)Gcbj%Z>u;08U>S&*fE|*2^b-e=UqZ9o|NT zL-Y6vislzoL+3MS#zivon0GE`KVGPZ|JE$F8Edhkys`mI+`E>yZ_U95Y$NeCIoenB z6s%JpY1k_O_`~MtA7YMo;Z6@~-60O+!1)N48%W~T{JqeHr~h*MxHlb?b^Ziw&i@#& z|KAqKzp3*%|6A<3VAlu&M7z4M@Q*Kq;4mtJo&ajOLd60U6)LD+&NPc-a|`vTJ>mEOTyCsM!)}7ItoR=jGw@BSmlapHsr{k8l}O52P%H1z5%}?o z>=HeTqOa2arWMX+JQq+Z?N)i97#VCYZqCyL?>a9~V(5%%)p=F9urHWukP9G$@*50c zyDEi4M#hD=zlW=M&Wy03Ev#LCo@==Cd;6`Zu`4PP&&Q-Q6YuU-i@PBmn`zd@?)xNw z&T@0wvs+ymdR&h0;sOP5DKlM3%E{WbM|oM^)MkG2_t9yYf*HZ?lUTBMKngRhnb&26 zHo1abh!s{@H8P{!y}}EmtRI*2)~P2RG=Q*mVh5jFOtQU>s?Dctbmz&K}5Oq!GqeLFr;a1Tl4Q|w7BSn`IUpI~;d#bY)( zucXCr%7q#JFzh2OB;J97826qy0WiiDuge3X6K4JaGv|j9Re|@wfflk-@9S-r2K<3Y zrQ$)EkBEFPoK~Rm=H)w}!?#wC7AfCejhNJKk|SY8YJBD=2kWW`O`ykG2-oX*e8&~u zGx&uKXQR`m;8q_23ylh{?O|oO34qh7T!2Ynq#=C=!gJe#ugSe-9egiIEwMb6!4@?c^dm=r&@A(cmhrA& zjnsRCR9kxqpGfaC3pu6v`o*{M-;Rf(+SQQIyeG!ToUA8YIgY4QdWl>^o8P_!$o#Kh z*8Qua9*YCyi|ay6U(wf~PcA{XMsST}4Ouze(-54=L37vc(Eqjar~>gakbi)L*#D7{ z`9Cim|BqDl@6u6C(-~PD;ahBVB5Rm!z>UTk6exlQ+XN0d5ON3u1%wH~M#e^BObSoh zy3Q?UI|1Ga{|}!8o~P6iuWB*XSOrH)CC?E2n_|V|P_^aZ1{%YvI?A_|kz_h)L5QG5R4iKx45fvb zhg4(^(ts-pJ@p3MRn+c+LfP}1y=e*;P)^hwr|eM^6rDgBQAGvCU_xKHNi(sKh(svp zRvRGq^SiJ+_TsqV9VoXFhS(Z7MI7JTOXA*OZaV)exCAy<_ z=E@V9g`q|_J@!$T(fGqkCX&d|Ne3Eh?vP}@s*@-l(~XeBMM~#Nepd5a&+FnwH^Q2e zkgG@Y>h(qr`%@Dl;@sTC0>)-msB}Uan0@aZ6iV4luh=Y@vbOHc=r-Nec4;~yPHl*; zX3Avi&SBYmG^(@EVT5{fjE&W-Z0bcRX*=>dZBNWZr9C0D&^e^-7$b9$jLMUTEm!!* zrzb`j@>T(Zm%n)-{XhY1F*I6*V<8FT_QY=M;}6Y*Z6OSVU?b{KvRsM_|~r= zFC;K+AnqiBc?)-?!4ZXlvn)Pv1^duG75mf(gZkDUm_bmz^S88MtUh5MFygsutim^k zHJYsQe8-|$@vBtn@wU}&BIWgvor2ltx=E8E{#qDr@9DV_b=WJkJ^i?KC@thzY32ER zoSIQ(Q2LoIv)IKRqSVX&R$)ti(fd z?!r_TV||%f$DaFdRu!5%EY*@(wO-+C#nQz`Jr7-#wpD|VuHO#_Xh)Yj@8L%u$LIlE zPTK6HdVFlLf}~tVPE`bvJA{)4_`H|kXC*KMu_w1Yr~$$3=cWA1Oo_t97bWn&LI+u} zgwt7mXI`H1E_Iqi2I%vABrhq#KQ4y#Lp~-XKhipai2su33Ox)aF7a!G^jLr<0p-Of z_r<^DtFbQZK)pxQ5^}&SxFZdg4>{a76_HS(3a_Oiz8lL_nvgvVOU+liU7G&G)O_bA zwDt@^gD3f;msVwuBTt)C61-q)jT<$RUUQU+pq{iydVhxE;`v%s!jDO+lBn!AYl#o;M{RhlOX*Fc1;3)LaieeMd0DSiWvJqF~#FsCg zmz6)5mEyKFBMmo`i>=>Sm8;>$g09utH=xn?GNKj2R=m?xFUCZ|uv;u-$0IvXs<_@U zznCFfk2GG;K2j~J%khb>C0Q>)kt9p^jGG66@2!RG1qjSo9xp^y@j3Y*!oNI26$Zuo zY^HyRNcFl@EtfPjK?BKN+-*J0Hq1XkJOOUPI}|mv0s3ZhuFBSd9dc}sQ}0w`IzO1z z%1{|30fN~B@?D{)n5EMER%@RAdsGG!YITwezOB}ig|DJ1VWMKW+rmZ}3{h4i80L!> zkrb9GnmpT4BCzM=m+vqGpTXc&JU&_VrXbHu6!5#cXjzv`HvfIv&I2Eq4q^pIX6Zrk z-O0T=qXKfbT3272Rg~5P~k<6N8s*^c4gA)kXlQ%TO>=y7l>9!^-6%Ds{?UWMh2W6Rg(oA$;zHO z(G`GJix#8#_;f{^#0c#0F)4k3=Ged(^kJ;>W+y2Sa(SL-;bYXGM^VN2n{#dIR;H|#)~Z0E(2#l+BbcwM zEij2@;;0>;N`zjsxV?B)-Nfu_-b%Z38|eQ1OAjRPHU&g#PQ>>BFc~B!%d&%HAHiqU zO#=2cv%bATD{Ff|_K|awee<&2$H{!7=YRME|BPU!viq^YlRZK=iVy2;6&c|lKs~Dy zg?pots01S*X9XaDsp9klq_)C@g6WOLJCU;G-7x61|a2H@ia$ zNcaCNbTV3!khj}$o?T&XW8Ey2$?#1(dksjYu?z^4+u8?un5df2rixRLCWz*-NDWfPTE`|iZf}C zi1ws`n%`>Lr504c=z-znFK7aBq~e=v&<1ph8lDO3#m;p-93C>=OQ~1hE)kk%28J*0 z7W_nqNwdbk{iuMgP zpc=7kIAAW)+q)Ji+pi88U=Ka?`MFA#MyIYt!7i^jZ5OQc;WlNruXu%y&Qn_U}1 zSJSV%%Px!E6XT0n4K|!d9l3|ii>a|{$6{u=ge5G(@fIb}x04C(I~GW5Sr%fX$1Opm zBc2t(p5{G#=G%pHl`--{GNxrcADrH$S+QifR`L^2(i}9cQtUlD0~{ z3yHmqquIe&U#3z4QNQSasf&gWB6HfsS4lNs?$ufsOV5*ASd}{v0$#B3aH*LpzSB9H zA2gxT8>{eS9cLM84EYY95*R~Oq3x~-Qqk7#B!9T&ou?H{G~wMbh~bX07_{5Epff$ zaIRV*Lyo9D(3NL0A@Mo_9tm?Q;kMmX-1gtA#3{UhR_WVmp{j>f(AvU@FuW4M4zL!% zjN!;!19Qa$1=KVJUGz1ssLV0hrtm2v(s|;X1g(Z8P^j=uXASLxi&@AJpuTgSCD6I$ zzewy7cUYG7gc|i-YBXiQ)xnmJWqKbUdx5`?MVM+`9~`GkSi>kx&}|^}gi~A^3&V-; z-sLJ<4SVS^s|nu;b+_>qUHJuJ`9z8Niq8Gzc;5rh|B`mzq587=#{BXT#%I|jin}=# z`upqTj+kzbygMe(5w=f3-G6wr_<`5YSoJlhWeaAzc+Ov>N0c z1eP!3Q*Od#s-#`AD0gOi`2X7Yfv^n!h5jioQ2%3jLG?cj!2fQlQ1|pvQAhpWp~*10 zmmnkju@aV|B&M1E2CA_U0uGp?0X4FUWW!~mPXdg?^k$IEQAOsfY-*LXuBo1dYM~cT z3FH&lwXC#Kt*q3jIkvf0T==itbibI9A(PScy?xF2zU(;9e$8<1_MFT(|K;|Bl4IHH z)9Z%qigJK`4u7o&$4_vp3*YR1rQjpeZ;NUd9?Bu&qdTBO%tN@7MEnrhqCHS1y1rA| zqSpW5eQichS)=9NCO`N#;`t38b%%iWyvMAkL+4EAqc-#l(@&%s?`e;b-faKQh$kS( z=-S!n_<`vKwBfcmoL=fhdia&8mxwAX@=g`!*$6Q=v5r`eBmv2BDash*?tnvXEV4{A z`*AP1{2J|!6<*H!))jP7%eY{sKQ(*@E0&z?46%nDF;=vsNZeI8U<1i?69sbU&`T$v zZ8RLVZgH^SI~b@$RM1jhK^|lvLC)9PD5U@#MQ5dxl>ue#Iu1Upi16?GJ$8DlOG0b|7#OJ9(Ajzl z;thBcsOPJb9|@Xv>pbp}_8vau$#DC&tY=DtI=Q6^7;>9!Yh6BC5R`Pma`Es^K*Am$ zr=Hz%IqWeUD6V7woGetdH?y4wh1rdQ0cmrh6k20%N5 z!Z1AB45}6JPj}3ARx~6DO>FRdc`Qw`Wb6;@3#D9zWk%8|4o2muC^HxVeYi5~XKP8o z;>_e^u`LQhtW*nr9O86T+N-PR8R}OXdcew5cb0S`d7Ux9A6MSMo(BdiYE`_6!4w=B z(Ijq4f^6r+kvt8>lNnud5d#$732ai1bw$rfgLY;h@ve!gf;sg6bjp4f$YCqIrwd~> zpvhNbriegxo~77d=6BSY2*aDrI1N*jqz04llQra6+zHQIR9egt6+19iZHaQ1R`y%O zih2$wZ!!Q4LiR;#3|%vyNR7(Ohaj|#$JVj}ZN3loIL>g8U?(}DH=jWcX40Ov*|Vf& zQ&TbV%D&C1F>rd`da)0K#pvZ!>2=@A8;Yo5N(JwN1Y-#^0Jk$QGV3+Z=z21nebJ-vgIn? z;qqJn+*NtPZai{g%lre>RX>sHe%ejK^$(-L%~e0a`c&_J`OF3FR=o1+ zsoa5oDh}t}CW8B`F@_VO)*Zsae-|Fqy=H;?tKX4*7aZgPed%)uf5*x8M*1J}^BAEY z!mej~Yib8=46o8gWpo%OACvqY`7jiypw(kuq z`5MyV6-0aP5U6sF(zFGu9OoE7#x^3=M4SS5Zoy^*VL>`9#?oqM(0(M^ED$HKu%j+T zU%XrJG6R|F`1BOKoPotfy&>#}C@vBymwW|yXiv>uebsn>i_sORcPvNlV<5M6quRc4 zpqks@+VQ3-lC7Mb>;|AxAi%^v{HdCSh0Nod59Y6{?MT_IcKoAEF<6#ys7!p7Z*>aX zPyka`H7Xx8tiE0mp1ug}b9YO7c4BN^t!a0axV0f7V%YV5yY+{`N=225-#u9qm97CM zB;)G}w>m0?^`x;Pm0khJ)?Zu6>j&`$Ge&8wgu&!+Ga zBsp#W7(P;%8%p#+R(_!1Ei%!;Y6Fo&ejp_{3s~N}E2lRz)-DaAEgVSSS-eeL#4uxF zcm9f+LOHhKE_q**Eu_~JSMmqtxhGku;7q1iJfEuWOs-gsN>X5zot}?Mrdas4M!)QX zb8E>Ln`|kCbfg7^+|o%x)r?$z$rmX}sWZ|rPF$`ucdX-x@Nh29APTT-Pi?Q%A$Q~LrJ7Z6_^VAnHzs2ZsJ4soQ;*w&0{@E!1lJwpL~f=~ zYdXXtR+Yf{@GyJI<6_9S69c*yScNbkB=Y+AwnrnHP$xz^V^??TR*wddGj+>ncBW@` z{LAbR(rgc*$Upr~p6R&^^XmljOWop*b?bK%jz2DYW2l`P%GQu#JT_<|>P&AE@7p<< zHp<4j!1T0;SGwBn@D!J2U1qx-(GGh=3po3OwBT=!X&hu;eIJ``7_qm4=q%7dutm4KxP1DT`;|o&2$7yoqG#RJH^)%X1wge$l{g)`U zIM%ipcsBSUWeh=K_Gp_Ufr@O$*FA2>JUCB^0C+ z+)J*`gR&i=;cBiaK3$CUw7;0kYwM&9{k(;tpwYUTrPNER2%MU>)E{GC>n0BB%#H(q zo9`g*_#=^cLZNtKDS0B*4+yZvfB@Zd8>B%U2{2o7FnXm1;C2NqP$~(EH^j%3>ESQP zJyCr*m~1u0u?#gNutLtI^$bzP!PEg|KP^9Gx3}gUnnpM0iD|92w1C{xSwHo45M>1LXZE>xpVO#3^>N=YWp z?f*sDJ4RU+F4>}$nU%I}+qP9{qtZKV+qUgW+qP}nc2-(9`<%Y_z1ySDdHwbnYwz`E z{aNwFju{a%X0-p3#wP-*ydxMihrIa*PqqX43)TVh$2TkE-&Kkj{)bRb*v8Vy%KAS6 zor;zVvI@$ltV5a^mjI-^l$L1=xtVmXJSen;83^c{n4}pjfm6I}LTSRU)L)uVTY|UV zKDV>zUcHSBrqHSix{kE?Ud!M

      5NnGuZl-b#+YJd~X+>(=LyIqZl8b7I<{7n^t&z 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%0A$aU)`p08-k5&54=qVO(Xo4W&|K3; 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

      $vwxJ^mX{*nJgKi!hrh#qjqmr7 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

      jzlDHoGs^6i`=@VjL-xK>Uj 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¬XzGUZ~7O&;jeB4|NQ6ScO7wV;FW_Py6&<%wMy*f6g* z!<@OQriQ5QM%~XH(RyyMt8H&qwXMz+%+y()Fdbkc@(X_=?Kc&MUb0WZ49YaC`^}aS zA>a(#3PJm{iPy3zDx7tS7~iQLcERVTKWay>4e>g%Zs7<8PwY#k2e8Kp@oSRRsG+(=8}Z*qCDSK` zeK$Xd1#!4fpJ@NnO-#Yi$@!n&CVxpr|EnRZsEn(M&5H}(Ve>->qPlv$ofeEuL887z zEr6+^*x=6QRiWg1<~>|qYzAKue{ySarJf@-rg zd2!XX^LEvC?DO$G_0|9FBTZXSMOCN2HEM#1Ol6Rvyx_x7GHVb6pst+{$_V_T>Q`GC z7az}9EF`Sf$*06X3o^#I936iW5e3(TWH$P6)RZ48(gZle*-@pb*X8Z1QQLu-A>CCr zhj;-cQKGOAZ3&vyWV*F+EYxN-7NqLc37L&=Ka1>D-wv8iRcWuGGC^ib2@VvEHZ>Wi z38(1uAfvOo;N^7J5qhoe?8I3nBkmS|#ePHM(Br7{@?T4Qdt7BxMR z);5g-(s)N_Gt1=%o4MF1#~urH(jq33G$h!P^Un)`243uf4T`~>)+rF9yyzq>>eekY zeT8CFjXK0@F588V5G&e}@YwBT;70p?Q#6j3WWuvCsvL(l!Z^!X(-luG=fOH;JTpJZ z&e#fu)Hs(cIF_nZ<{K5w`zaYn^1nM3o501KvB{}I6>d<4$)@D6yXs+bCSWnN>-C3JU7!Ox_a$3)0Ql75j-wJ{e8A}F*puj#yGLU9@ z93{9yluoGexuE7R#EAX#L(2L5RRJiPUWNgc3fk3UVxEuWi?#bQ78hvr90QG0az7-OWeRCkW^pc1a1G zvEV#cH2W4B!*G?w-Mw@^h@?rR2yf@QBcvVUMw!^b>tjENnaEe%v|ifpYRpk~W`7n{ zN9JDE{qA*zZyC~)D%C&OL=&8)K~6A>kY^}C8)og7qy)r3VPU{R4^L_3pPXY%a8ZJ~ zq2!BN9!aS)Le?$Nf`##CTIP{1ZD%e8VVQo0hzDxby;4?cvBF=t;FODziSXTwN^MAZZ9bQ31$BI5E}k@UEY2qXgLLoG+-f zS5CM^ug}v&*k-rHxe{NyLmE5#C21nQ2R?>7#XQ-z3RHpZ_XvAurNH}a`vw#lzesvr z@=Ilq7H1~8ga%(JD&-hYBsB@?r*4~$m%Y+UUfW7PGbgC{a7xx*v)>H!TP-!nJMcK} zQ*NVYj5tKDpJmK|zU`bJymGSo3l8fm-K*ohWMuT@KmJG?aL>9YHus%*7v<0Up4;+s z=Ww$9&wk4v?~Ui<#}oBIUbNF0ryPnMxjoL za1`m5ecoT+M~(e`{e8f{BmIDTz~CUBH8Ea60upCJJ%pf~tUGrfhz%x|?@jom$b6kO zDV8MkB+B({LZ-?>v(PYpWH0H53`h}w3!joI5EIZwbIS@hpX+s-1p5iTVj@qagL=Yv z*4WGBi_@9|Qi_c(tL?`KSa(}DI4F0J&9mb)UU@hXYZVO2rMpu=FpvK>YfdyxLIg)zVi+uY-*;M?rn zPgxy1P}$a{Wrx(v9Sd4pR&~^RH%cfS(Qkix8Bo;me%L3y&-}7rh!qasUBXlXh)s$I zpSB%z_HmrL1`!X;!sX+%N$rT;r8b8Wdr#Z1-u|X0q2+)vPunVAxW=^ zh2-EwQfQhWUp5m{$)=5>$kK8;$8!FqME07vYo6G4-LoU1E?Q>O?^n0+_GD-J`_!bj z*Ylxr>?aEoL?#&@0WoxODNC1*U~Uuiy|Q3#)1=+9Z`-6|?vZo6s8`8~NAcI7r*9*n zgRcX4U-w$|`xybM+h^jWK2abrz!C>h*w^Ey;9zLe$=hXqO0itjLQnx`pJR3&&)}_P zOd_7J(Sl(N`UuR3IZ0N6VrU_rW&I7qh~*rA|E*?>_|T0rUhXjmF&jw@y@W>;$Pqy8 z7z~1);~%?4A6dZDPr4xmScfF)A3ed1sB?A?-y)2xaOPkP^Nrjh#@IXgNKbZ8Ifj9_ z!OO45p9s2VZXpDL5s-zWpJpVFg_Z=C@>z4W5@)G_+buVOH7 zDIoWP_pV_6qDwR%r||Jd-b_a3XuI%N0i;Ga6dn3C&`{Zg4B1V*mPEt$Qub49v)vD^Ih1yEuyACR{lz*I?cA}&R*9Uo(rN_fvtFp7 zk4@p)>Tb|nVWS3`5vKu^pqJD;U`+qV!k-2zV;T26aO*|3wW6Jjj;xJr~jfK zZTz7hiH5l9F=|kn7CL^Ywg3WR>m^3zMqE8PBRW8oWz>sHqo_tmJt9rniXlV9ih9&1GjA#~dTQQwE>j8bYRD_(_nMTIi zUnPEum3ys(VM2n^-bx!s?sGzk^9&VC)jr-V8*dy7Zg?ZpB(Ag)L{JiA&>bu=RBlfM z5=9-6A`@3=sf{IPQG-XOwmc(_ZT+~OXpj#n7p{N#$ezuF^E8{GXzIO&a465l9LpbT1qiA*KLAFJ!r7TE9;@zf*gDZ%4;Oplnu&z%a>T7 z=LSV4Q>|XeL7E_2dy5VEm9xU)GhK*ff=_6K6zfVvo9}-|OC3y3&_yQSpo4qN=cf_Y zra@;6m`GYh_a5xz_F4%0A23o|0d~`+r_h57?1RP)Z;zYuVBt=~0`abmvAmIpcOulI z>B~8{`EokhW%Q<7_p$RBa_q{fWUu2e_YVM8`U?f}%lqyk%bO0)j-$!ZQRf-n72eRA z{pb-UVZF&rUHuklDx$1m^UNPXGTvU&1*?{V8)O>%L+qSc(sY-JI_tv{9_)|tUhHa} zt6GH92S&ZM6fQ?zrcajSzzi5DxnSk@+h1w7l#S09MCuX38dALFLz(vMRx05(%w7DK z&WSCZpv$A$HPs`#JD;Oz@y}V5#}(2&Sjxr`bd&bv^*{q!?f`bl3ot8?}2hDLW3Tr^fIvz*8K|J zci%ll(?ND@6eco1P2=jCs98_vTdGST8XL%C)kU&LXdB^wHzq7~q;DWh5&@}GbtN`t z5=gQQ39n_DSvDj?K_wf|pG7Vs#|mSU_r!F0%L!pF16>n$wT&@JHPi)lLOaQ4(IjFm zIXv4GWGcWjbwWB}Y?Z<$Q$}gOX*R*}%(lWFn!u(0!o{5d@BvW$e=-@dd^INBs>?HX~gcw2x zewjD(I2%&O&zJDl7o-|g=#!HWIk(<@--z6T*cG~!N9;sHj17r;3t14`zSXa;BsBT0 zexPomBEKg0zq(-q@=(KLW>Z_RB}*Y$>UOg@j_ffq0kumddM4V~r2TYoev9*2VE7`( zh(`IzNXl4(oJgbd(9Rn3y<>BwkU1>MF`U85H7^&F>_HrZ zEbc&TSFux8%CYaguV+r3-1pPJOX#k~fMRECy4t05BaxPK0~;gpustPoMJf}uFG22{ z2P-TmX0tCic|8f89OUaqNFbb_Bo^sh=_pU{P3G^4K+BfpqTXRtoh;%?F+*c9?WA5~ z&KU~$2R7C57y0D*QdReQIL<}3=-$B+oAOCG-9!7PgKySw z25xkCn^Ax{YziU%fo+?SND8{*c3`A~9`1lIB)~T?e>EStB8wbCDG{TPiC3_MlXv8m znSa3<-gfwj)rWph4HU8>voUG}hE?_JH+^NVr(5gY0VZk3tS;%}=s)hdxIl<5GXoQ{ z2DHyU?ZS0>dBLGCXjA?EtYu!gU!U%Si7yp?KrqCwMhgMsDoufu-!G+#XefxvKqE70 zl-Of(y}>j!=BtR8l0_H_ZJdvBg=O_UHLj73t7Z6xdYtsP%oB zk97o19bs%p*QwmB+Aeo#4x4kbYyFUJM6M=Dh+g0!rgW&jd_+j`@ z7{q@st`(ilo&EtsL@8_j&1UtTOqdK-F_*Gv-{5;C;2TGQN(C(Ij5gZRPy&v8mnkSb%bGkm>-VnY( z_{=Z_4udg4d6jMxOOY~UbxVQZlQU3*J5upY=jzwNv0s;kKZ9ME1AqQeNL9X8|Bhah z+8rMZ=~lW;l*}rj!cxv3FC;_7m#mRfp*BB7zwS-=p*ylojizfUCf=Um7T?XT@KgmY zIglRS?jQX_$)9xdJ`jH?KR=heP2XD61arywR+z6k*SXi_jG!Rb*o~xwfNvK)(0`)x zJT%D8Qu>K{K_e~RXklD)KXZT8K^ueWm2NS1G+B|!)b+L(#%ht!jz_Ke*p24&g>?3& z^0k$r8L&LQ+LKLroJMUhO0DUqwr#-K04h*nQz2)TIH`svu3P&&PAvv@&nte^f9bHb zDid}v9RCe_{4#=<2`3xhym)P=@)^3pnEme7U?TbJede~2m=LacB-IhE!tfPZ>8pUba-GY0$XD|wVN zE*l%FmW9JE6`OOSK=&zg@-9%IoXCGlGK+Ic04*9`)!!X+{uWTUHW)wFgjZMYDIJ+$!$h%=w+oaf;#vos&{rFQW&uvHjKEB4s~6%U;Xa>5G`Wy&bbPLxda*g>Q6$NgUU zSB)*{Ly67L+uD|Z@0f?D>;hR>8b%D`B^P+6 zFqyplG!Ch|d{aV|=1xfav^xnr8)VoN9nLsQiXLWh?>hD%{QwQ*X|?y0S$};~!Z|aWGmue!|lvJQBZ*#61&{ zU6br2bN#+$V_nuTLMdk+lM}7GPoj+OKj$MyCm}0+M@OswQmFhL6pd0^RhX4S z)h=m})&vm~KtvP!_ znh>jMqC0m<26X|fv;FAUYPmUmxriV06H_u8{q}e2s|mE84#U>6)n-f!!EFG9>zV{g z8DUw5S8+|}m?O+dT@QdpQZWj^S`y*-9B+(yA}Ql6nKlO}gSS3vK{vFe5gs=iDPzA1 zFMw>)q^H=brA^L4%uY^y)A~nnS6#DNYI|4*?M`fFq>94g)3&Cit_MzX_FNipluHw9 zPsK>XI_}tiZR*6VUER#?q?K!j2Det+Dq{|IP$ej{OC%cn0Ns48Ea-?tP4%0JYnrqG zv;=E!WCW9|U|PXo<*Q~|LuIKWdVgRfC6AujTL1}2LLy@n7FPWc5mXqRAv^+BdiigX z?YKyH8iod(Dpr->MjX!hr=b$-#Oq!;GM-p5wG?A0Sh8{PS5kw>$gp`INm*QO!gG7? z-i`26sqSz#)k_rJ`bK@T<=0+ItAX~ zu@zQ1kgRBk#MX+5(jz#Y(}|uLgYDa?6!zL z(f2)Iz{3SA+xMLKfG@^K$kLw4-dhfsC=jJRu%ksBZsWRORCJ}F4@`03}+ z*w@f%b}ziq)3_f>h_2t zv~A;OG|8gV7+1eYL_*2Cf~g21%k9(`vC@C81Uq+eK}6D|9{q<*2I1HgyeZ zVCbL8T+7!qUBflRZM}o@hz~ve4zhI)=H=uhZ0xtEtBSlbXV|ED%MLL$M2C{GkU4#m zI3QtWP!Rf}>f}gus-YEET-}}1sLfv?Qm4?c7_?}fEY`PKFH{2SDa$*l?~@Avxmoe0 zF!ZYX0&=^p3Pcn`paP1d0df{p)7)GtZdfzlCenAl?==3>;S5HX5A@M86f2uzMg%Pg zB=&R}Thx}Hop}t+qI=167{E1$INj{BT_|L_JHsE(#aP73^wk-LFD# zT5ykan7?&MmQcX-rSk5A*eIPrgpJjv9=E|tw9v<+WEdpDtPd69C^5{OBO1kMl`%9= zBrGo!N-byl#R@X)(aA(Us)^zdx)H~QEi*L#?$ruy*5<;z58E13h7E-uags%&F`>=u zdvk)zNYj~1+Z*wWtsOfAJd58bW2`v{G2@iJ>q-{V6fP*__ijzKhdgZ@pAcbv?sNli zt$;u$4+(=nvmMYUxxu!!#!uo2!S`%ptmSac@p66nlE2dnG`0r?lpV!Plq%W@ zp}y8G3OKN`}W$H;7A{2-++=yhexE4pXQ z=33h(sioe0zcGH|08D7K;nXdi+aoQ-TOj^;ASgxFu|BTQUV%$NmT|6RW)!y8+%=2C zTKzZ_<6TC+6oft*5WCXo?w&@Cm06)Dl~OnqJJM<~yMtzv64*#RQcZi`Srk-K<-dd? zuz_ST%mJoS$EG zipU-3>TMix$V77!s7)p(_d(uG(s~`Lf3-;kzl1T&lMv?5^-V*<%}3o+TnemA2He`U zq!$fsR^v)JZV*TWq=N#?LZ65mAjgP1F{NTysIK@Ou^>{nUa)!Nc8CUq0&b7g?wkh} zy=P7nqR**Ft=4n;mE@%VU>O=$c)?aB|KJ6?}kV*zMG|=lJS+t^_cRLVQ>m6f#A~RaET@s@q7uq zyC5`*WDv3R`fU_a%Kc3|z$|HQID>^m0u(Twi1Q70NY8fph)#waG0S#(d*}};QXS$nN@&X>Zcw?+r5JtECO~)L#wgP$ zSOw*CF1evCtOIy57EXak7K@g+uz}w2?_mGF_}dFxF1~**e3MVX@P8Bws~B6^8k$?{ z8#>tj`xZ!2{!l>?MSVvHX@gqDRw6 z20S5q|Lpwv(S!$(;VeOz3OPAum;3?E$$LILJhsNYx#rpRIgI1|dGXTs%kLgmhPd7m zpw(6d$;{JAH@iir!IlMbLaKy5HnRn=c-I4&-EOwq3VPFk4zQgZeW?(*xnNHYE;+tg zG8M84;UgCUEs-j#|J4A{yvzRh_kqd$|_Vk&NWDNlwQy|s3odJUJ3hF-@`#lV}-^lDe1|Er8 z2IiNWt`jvPmU%HJi;~|=rf1{`yxOF8%D`i9vw$spwCY7)a5m&-3#g$&%pj0zve zY$!*GYC=Z(uxw1`aXxAHA51l8v4-5)9bCzyQT$jFh!WDUjMrFvrqNcOXEQ)3O(+cZ zP0?7(-?mPyXr zZiZx3dgUbLToz;t+h#}myk;!K2aP+BewD(UDBr1;4omC0&u!A7BOkdv+x?VE?m8DY z?z~l@V_Z9dPQKA;G&rlfQFW_vC{cr71>ktcE)2Sn!6mpB2X6_-*KZ)q`)f&*5G=*; z{kveFA+BCV2{?}Ai>=~Rh*skB`C4>ue9M<<;7D7-W7ZU0P?otzA_&=oR#D42@l98o zM z@bTPY9fGY_*v0ofY;Hj@-YC!*4pv0JSe({k# zL?3W){X2)G5&t9{@-ykgbn;83Q40cz`LP!@8+SA;gG-#x6MRRPL)E}W>n^h+jwnLv z8Bq^DLkCR6Q9_XRojo6`ug}~GzB}mP+w{m08w5IqlkU>sP*-=2%;i>s>QUO^AQl}O zBdB32hoDvVil@{u@K!KCc*@FwezGaR8bR2BLAd!|+JlV2U20`M z%Q}&zoM)WMQ-}VEQrO@J#J{JSVzeL!{?AnNe9V($y1pOR-X(HUkty3|Y5H=M)E8USN z5fFUrcH~j&Ys%voTo=yUl4DpDMT{|j%rkoh(~|+X2s2uYMY|O&5RArp!`*e*d@MBv zdh^|jBLl=}XZF~eTVZ~-^YNF7375{Vxk6?PR$b_!ayknPpJsxz@^-Ji3OHOk#;i^T zSTYtzPVKpPDEhcWTHDI$nD6sKSo7NVZMVU@oY#rL4`)l^!AjG*DcBwo(d3tlmX=If z=$6$=HeQ-QY9gn(cJsL>xXdeG)1hR6vnM>E!W}sBnOOQ~{UQPoecRu?$xhy@VXiQ> zkvqK-j%>JKqnQ{0l9p=Xaz+2(yfd{j4f19|PE^*G^N+e4;^Y3c6UCb z9HNBbAq>^h^w0NG$@S4Y{B!<-I>Xa;tpoHZyK1vjn^gNJn}J~ncJh5!uQr3khmk18 zA_+Z3Wn)K`r+?5;)FaI~d_m;V;w~wL)xYATEz5ABa0c;clFjloQ|D#5de_qRc@gZu z!FfNw>XR9&!)W#7!LRmn0fCWF;byh0Tw(^G(ZO-~S3LX^!c5hWY3LrJPD;{N2IGMh z{qtMqsZacW%C>vITfrbiNI*RD4F^Hte>QT?%zmO>kKl$ zwK>X{3`xf`&iRG#jXxNP2i~_M@6&NDogp7Ot#*wmau$NVcQllU`X8|>qeqWQ7832c zV*&Ds7<*6MQF%1l>sOWDZja3rKOOm73T+R4br7uR?H?Td!EE+u&N){cAkBR5aLRa{ z_9`cMk2pt{gi?~4S|9Z?6x(A=|I##=eGh>CJrx)jde|0HTtg*#q zwSz-6iVEy8ZBG9^7OQ~dL8KU#W;w!Q)-l3z&Ddu;oUHu;`S0mSe{%a2{j&+i_`FRo z@t?~6zgIp^?uy0^E>^})e@jUu(zb?{VopwW|M>4y#BFD5^H1eoRr2bmat~*y%M?W{ zcY7m)wum-a66$f{LWy|mb#1zNW>sr7R z)zs^%7U7+f?`7)R)rDPOoZTwZKD8t3_K&yEqtLs@+fdFIx`MT6Vl`_aZalKug=oEMkuM{7+*$@G@8gCJ?kS=cIexLL$z zOoIZ9Ma&(nif*h{hv4B$)sfRRo%sbxEh^1c6^&UdA)h}H_VO$^!6=V3Zv*~_n(j8X zDL}RDiDY9glGu@SvSwz|aeEG^i9;Gs#rY{OoF*XcXg*|uV=GsJtuqLaSn5rEPYEEJA+_EuK4=!j(r?hA)hOwEPuXAv^ zGf>l65nF*vgA}Ifr6}8=3UiA4tpKo61~a#>8e`alxhVZCOitSHP;a+mtc1i4WtFyr zi|7*UeT5**Ij}0U*aEjc@8*!h(z3Y%a}l!w2nR*$>%7KtBMi=q&m)bYZNhQb*#U8R zj=tv3t`SPnQJq-LMh%!IewVTCycFvPXNLvlSW+RD9ZHsU0cjSq&_R*L9SmabdJS{{ zKzYr{xd&?2_8lP;D$lkFYYzrcC6g)Bs~sZjy& zz$8#t%rRD~86cC!KF*L;Ze*5Umdtx$c7vwFU{xIvLd_Yx&9Gea9;tjblku%(;h?Go zc+%E(VOP&!x|)3I#l~}xh+4kW&IV(m;UaLKB@7_Icc7+ckBdpA{1X|{tBT-k^~~ioCEwl1 zB2Q#KO(l$jsZXO3xJ6F%t&vJFxIza%Bz5fIZ}?%96X^g80q^UuQ-J-vBs>qrYv`OIAMq^v|VRnBvtUFiW|knk~8uZU_6@2vb&mKX0o zyPe*E=d$Q)u5LMt!O7T8NIczgP8=@M)PfpW!0C(QIhgeins9Ydg!BJ9G%;vc8+{9QRV3#yEukAm(c9HrVT zbjMxw8rXbHJ<`lrN7{iCBLWK`pqrK@L%2p}d;uk!{l)Nk(O^S}=iQ2I;R7`KuHi zbaF&BE<5VE{)XV?=#6aW$ot29M^4_{$^~QM>UFK2nUfI-d`Lj2oM=0K{J?oXAA+aW z@SRPhu{RM)aL{6{?*f_yD)f4E!6TDiDZX%=+<7c{SZ*vvmKr$TNB0}bc9byY9|hl= z2C;@kX7+@wP^%0@s7K5L&^(0F#b&K*zbQdRt46L8ul|l$(N7V9ghGJ ze1j1X!bf680_&mihtJq=&6dU3G8dEx^&ZljeNGoC&{<9ql=-UBljd5h-{eNp-V+FF zmvnMeH#y{Phw-{SxPAO=Ns=}#p+0FpBq17W(z9Hr36A4cdU(g=Eh3CiCh-6LKqt+( zhV1-gmf${J&;b8`OUlXE?H?Dhij=q=KVA1W>OtXU+(-!9@yU30z(U=+U;|?z-3Gss zL0!;KY*YM>=gg8iqBQ&all#+OKiEGnPaGg5BqSgp(8I5{lmHKi+ZTfks%qwI&0 zd`R}``uOw)lp7QLu4Nt)2ODXkM+3SGwxBa7t*u2CJAsf0)exoO7}-4-Z&UYO#ya^L zi_0>%sLe>ZRK8d%#nadd<+e4-G(lzmf@K#jAWVJ~)k+@mh$fwEw*aEiI+%}`G(weC zqa?|_m^D>j+3ETR${4za`Z;PJ>@NPj4zR*o~62!A3y?G(g3tc6OWIZMWT z?~iULM;AY361oCa>4G zbkt=DNj)tw;B_OK-7Bb|&EyC9wYm`T8{4uP;<#*B1Zo$~v+F}=V$yXiRz|rm- zW!CyBnoA_=_I4xCR8sDnnHdCf$$u~!5Qk4=`}r*>wHBd`w-WQH8fnGA*3m~|jB}$~ zjEkypSFADUgM=hJw#NEd>NF+^IF}hN`?oddD?`CTn7;|bAl2IafJ&}ppTR%2V4JxY zDWeJLrSR-#VxFw}<51bbU|^iOuQ(Q7pFXeWCvL^e$ek(cIpFp13r{YpB(kYk04}5o zN7mP)e%2;~-06A8D#DE>n4}bCK@fs|aPu~kXIPrMRSyd&qxZz0gO9UP!v@l(lHmyA z`Krky9>tA5MA&zF<|@U>vJDC^`VL^-BZxxaNk-BAQ}xsrzEzE@itPjCvk2P>dINz$ zsdmUEwkz~|$G7D03vSKVt|jB8!fw;6jCjmX`p0XJsM)Oqno?DJ>Kx+CZ#;ZA6nSdw zngfw{U-S~NAa~cpa3d~tS5-sH7Er>7vx;JLMZ*+;Tf-bF)d5YIBTD2-I`u{*@^}F@ ztt%q33F>KB&=nn)Eg9RhiW%(<< z<%lltENoNMk1zURIOAgov2AC?l!HP_{HuQ&4C9aF9ypf7&sXfQxvf+|__j2GTg|(1 z@Pl?C{;wcI+ku`kTO`Ht4#P5(b+dG$V9Sp`SpAL2m6=%r2aleo1!F`BRZX`lD-N~V zvvX+gGF3h3eh|t`{zCVd_~Sv>ODbHrRTqI1eE&3_&kLtoOL*@47a6nB(Ob>PC(v*8 z>7ga^|B@j7(h2O{AGh2HkA<6^zR%DE5#&_)VxkN`BPB-L z{VT%>X7tVUX@D^i&=+N)1XX(CJ)ps{mC&XxeuNp#XW_+*&IKclWWUsdV`-%wL@l`A zHT_n{u~Ptb`^joU8?n1tD-5>_o)*X=pNvhNeetT0ICITui)bEm-R7HJe6 z6wx)EC5*V^HWxEq@(vn`G?YhLANqnv}av3ph%P73$S;M@{GpL~0{9kl?be7v>tS zzNZ|DlUt#H#dRqha0IMiYOQw&y;KEjYOJ+uO#|Go?9HQenH0lZ`;tUjI+wy8qT6|MLc$rYedm>N`ACnm#5>u%%|BxiU5gQ)5*XWw;=0zBHm^ zUeTjIhd4xh8i%9cHpYG91EE>H%H}Hm{Jb|4u_S?V{a9biS^clgPO10j$H}fQG`V>@ zFmM>xMgAGsL}JuW5`6^dXlpaM1hn+cXf)U*8b}kq=&%>(hh#|9Yvld!cpw6{al0Et5zxyH2wp6O$KN2t;Gr+8tfDk(6PU7nW8`IWZVdma95< zjA1ioQ{jNBZ@oE6`6REO{=Vu^*!}nkVv|YB!#Ul_>T@LbrIS|-J|-DyvpjoNxjbt2 zxss|z67(ac$a=C_Q$L6+jcdqJv-4|cPAQG-G}>$BE=KB&yJkobF1VH`z~BAX0ot>cLz}@h`Nq`_Q%)$JAMY{atqPlybHUbydvs97vuKY5R((`#j z^9NqTv#?way%3P1?a8CAEBef(GZS>qyhQR{IK3^CSel6>ytm;&A`lwD^b(H|(zyk9 zf-ix_iTPyOHYh@{YhN!gj{G^O{NhY*_%VD7ma;Tr;NuuE9ktiSt^n~2fJ_jg9ik5$ z83;aPYaxfnGSM+SoqnKeHoDBQqbls|rBnuf4btavPmbXj^vL~zQW0U8^_scV?43bo z!8le$ED<8z+j#Zzd|OD0@>FanQEYoK?na3zcnQ3!*I%C{7xVGtiSwReI%Of6<(1=w z(M9;deog3oMJM=9r00-1%_Y?Q9Wxgtw{Yj|8>s9t$Ilq^c{4~p(MYv;rx{STF(SYp z!~+KWaxo{)uZ;n}7m)J1X49OV`&*gJHGbiKf6c%Nozl6`v!iwnRI{lD4cePy3-$>} z&#^UpLO8&Yc^8s^|Vv8@FB5w_jIf$Y|^jJ1*8m__%#|}Pc zi|bgIj5lY8*#norjYNz6>gzdv+#E@e3lx6!_O%SF8@U+I=Rz3eFAFq)}QuTf0>8C*abiK8}7>&Mw~BS zDE_bC{tcG6? z1jhZM4YJgBB;{l*N`#QuEIPG39b9m>OmQCN!W)2h1`TTZVSYTA9-Wk&>|#}<*(|`^ zJicS=iN z>{gam!GbJo=ZXf&p>wAq30|(~9i>$A4yyaIxnDCjg6I0|S@mmvnQ84|HMxheoHj0d zj^=HBnysmbE9n!3jw#3!wv=ZpCMJQd>rN(nJM6zImnFZsa0#L3<&kIAzT6Z*(z;IZ znB7Vg4vD8f=*&uwuIa+UmedED`6;a&A4#mLxSG)97=|Zvju25SAob=m>2ODrRMl#& z47+7CA^Ic`fEnyWjIyl64aaCyALqcdrs<0;&Flh+aSu|{q||YDlg~+JTf*Qge&-s- zBst&M%$ztnXv^?1D@|}Qm@o!Knda84I@K@0FFLQ?)U$|~(V^HhpGK zq^2xoUCvB0o^b+_(0Z2YZF}qNx#5W+uT(Ix4-Ilv+EXW-E)j0Z%=dia%ABO9%#DVoIAPSk+V>8KS~b3k|Z+GEzWADN+=J+ z94^jm=bhV)yfb~dY2ww}KhVamHl995^`zb!Y1W^+wH(d}%y!_)YDybdAyjOHS5l@* zZ5Y>-P_BxkXlv`v@DvY&kVM5{ouv_R9DV16&Nz-XGTk4MYS9-m(@bd6r30mP5X8SK z7bRTlMaDXJnCphTf+Zif#gKx~26(1=C)w%ytV+X&mlg^|e!#a)n2kjig@2=l#m*HF zId#D4U3SbHaEPw=PtbFjvsa3ganoPq&~)CAP;WY~k#TAi@HEHISkzqpVOFlP4WyZr zKjRb{byZu;S6>;D7z&zZg&;jz$)}|X=*fL^%92?8?)1}!;YfrDj!R5DDHzrUsxQ#k zhA%-fM&rDRdB#TE*k)3qd9l8Sd9XWUflMzPXXmRYB1y@ULy(|=zo!kj{ogYj+2OoP-Xvf&Kl-0-4+h|HcF$@eA9l(i)$h2V9 zZrZI;yYFKvu3FN!-I`%GC|b{-%A1B-MauOdGxKm02yL$?DubC%=rFmtB=`VIC!mfL z8m_kQx@#v)nAI7>YKS(A<72E_W(I6%8<=9=G2Dt8A@rd6O_; z<>eP#)6)nwtuz~T#&8~gK_;0twcn?0j8F^gs|SqFrcEB;bPh_Qn5#1nRZ(?kXFKEG z(1YK$!_$^KvIaqhZ;@Qn+4?G4wdVFG+N49 z(S@MHw4p9IjFQHTujjWs08>T^tIg; zuA^wjZUtvEv-J0E6Fdf243`HkMqb_XQasBF2hz)J#VKuc;ya;=3N>nsQ=U3n{H>ce zE!?^UW`5<9I5mtNt{)e8(#JwD51}!z9yy_Jj?>PYKV6 z@u$&b_B`Zd)wP~gl}>n1d0RbE}$I9WB-3O3l^ zV$!Vr6j~T}pPiVHhx|1Fy%v3n*zIYDu>n(^HRJdt5c8n8e-q&=Ys?J~2-w1}ED-rk zmc)KkkZU~_jxfD;6KqxU=)sD_fUaEhmUevw$|K! z$v_`i?dz34wJz9IG-8@Y>m)0h&+K8*;#zi*@*}S7Pi=8guShN!=vT$HVUL?+2Eug6 z+}0aIQ^{g$A#}-&RquQ8W>E;**l^ENtKj+>{4G*st8e0_&wCDOXIJFfOf9`RXOZQ6 zbF?Pey>z}F`z#)AE2px{S#M##FDSM4>CfVV%23%fPFcgq7_#2# z^1T7FVA%KX!Zo#J{PMHFc77xat7F;HsP8Yk!5+wqq#$vpkjOp1{rrTb_k#U|DI9ix zv`15>k#ZtHC*F|@kxHsfbKzr0V}k%hcJ61z7%!dL^RVqg{W5lrxvS!YrCwAjGvY*H2N(pdpHwU(@nlSr>!sM|eCky4@&uU$P5_uB1I6WT$1X zX}O|oXD!_{?X(x%Zs7g9Ta=CsdAV@PH(uI&3 zWo&j|=j)4e5tD1QVVed-TY&51O>ekfk$JoA5B6RljZdg5y9uxJ>W>sY7+oP63tprt z37d!7nk^{4-4D?9kucXGPsB$JaWXs1R?8X-2ZUb9wB|K3IXyXbyr*gr`d-F`4#FMFLNYQ-X4d4 zo#Jq5*ziZV*Xr)KhV{`{4A0mPJrDq5Az3Z10eEG;Ff6ZDY-pY+@HZ7K|A@SDE?2i> z&o9fUc0=T5A8b~?-JV_2o%=d*Nu*+9tF3)w*b@oZlPlI70o=}uGN~sByhC|RoGnI* z#1*2;JIp|$=JmFVICUHq#*lf2Bd?ggmEJJq5Dy+da$flROz2(#0!E)NvWz%;9mZ#& zw%eXIzwd-y1GR&-FNAy^&>@iKU!p_PCjX=dc=QioaGpq-;aj0E2$xjk^Zfi8`0%^ zSo?lq`!DeJ|Li1*{!=$-=V0q%Ze;B6mu~V2O7ETSlW@HGeE*||#lOB6w6(R8HL&=5 zQyCT8^*57|L4I=c+29|Nlv1!YtgmJGU;4iwD=G!&!&}K%G*(M#aoUhCNezBc|JuzSfkC`Z87Lq3w9Yr$Y+qR>F6E7aT{3M7A7UU8K1IT7`nnG4q*_m@(Q+Vs6#8<%LysJ-(}*pgg|qVDesmC# zbq>lxk*wI_fyGRMCtE+ zIS^n=b<22R=g@o=dPANY1ThO@rhtoF<+ww%W0%YnI2H||b+i>7mvf)L%yj&N?1=~S z8TR_m_dnWT{VViBX69B#{|tPOMBfioz@_C(;h+Vp%b}pw@;4X0ANGoNXyJ0lKIyQ- zV(F9#=G|R&)ICA?TcTkJn8IsEG#mTtEg>+MZ@c$!-Ke`?=%OJw9*|x*2;JE05)YEM zr1D97vdWYYMQUjVyxMf2-nvzToO{(s+tnOsGdh^H6Gp=k2P8}*ZQbHwR3ZdPXLuNi zsruM7=9$pa#~suQ7s2>ZOePl5@nrL#;ubT}+Q*i9&D2fU5NYOA$aiGezy%_tGnNp& z-2#115$WF5#ZzCi+A&%cNGGrj{hyJL6a=z3bPiLXBtz=nl-my!oT+@mkJjB5$7sYoRLbCg6T}shNAQOf-lkj zEHIE%4@_}9@Op&5y?%ax*9+JGf)M~O;~mI1f!Y2&iQ02?D{>G9;!%d4RES@pCG(uE zmPM9m;x`m=R;U$WB$cyat4k4duy~>L$bbq7_3$IpY*^jo+DPwB)wE}0Vlcmi;?Zk* zk8Dv^7~FK1k+$5z^JMZRW{eM)fumW?#wjS2^$=7VD6>JT;_4|{9I$oIA+{j2&z zLY>k69T508VRsF^eZ6u%N|`KqTUnhR_<84$a@Dj$j{KDh&~H;k6Jq%6SIVH=`ltH{ z9?vk&ozn?a^B;fl&#ntjsJQ>+kpFxFRxJOcO!GJFN$wwM=kMW7Qibx;0$_cZ#GH+~ ztg>W~b;P@P+SZvTkkNLSc`VN~h<{IKnNpC{WuqT&%2+?YSjEG^!wJv-neShkd;g<> z2s~YZ2pk|U9}&9a7n&dXbH@)d`zgo0J|U$!2KmKuW6Xx+IY$p7N&9iwB5wyn|Fwr$(CZQHi9ql#_r?AY3| zZDYr_?d;^`ob&GezIX3Cr?slq>POAlYSx-#tU3DXqj$f1Nk2c8LPFbzWT3xnQl{LG zmZm4vZ*3Bawhz%j{HR4R3V(|wdiEA9+25KZdge~JV*@JZ?s5Jq6k@XZB)W#2lg9?s z&JnWtXcr3FJW$4d;)U+@fSsVne&Xc!fKv}2>JNcGLXG@7{Zz~ z7rM?_cumZ*&d6L?XK46d(VH6fH%zQNRD+BLIF((&FopBg7%)dzZK+KaPp=Id2fY+# z!zoU*l^tN%qCeFRgS01;DH)>BX|iGxYa|~Zo zljTojPUng$)AzM#-i|+RyT7a5C%j|W`qHH`jqJ_UTpUPJnRKzd3!64${LbgQkaYf} zNnz{Wf$~c<%U;(r747>p=+02Q=%Dyp1d@!D)zjy0uIF1mc=gOV%}SN*L*Gk%wQs+z*?_>`lnsCec1eJXg zbu(U2N|=FUQ8ExBlF@69x%S*&b215-8i2U|blU|t4PjPjv9sC>H*BoI+wj=((%Utb z(W)`UletueVMf6z8>5a!YEK*gSR*uj!nNgDYd%cg=!Q2gKO)a9N}1ne zHzRyoxci=@cEZSdQ$+fB#5V7$i4o+p>>A%zM7ox$w@jB7aRF>Zb)$Kl!tw)Ft%5f#RQC{yv&f`p(T z+FCJUZxOdZAo%suzda(FMKT0L{Glcykxj{NYP26Id+G=+F*}NC%BfXWROozX%1+DR z#}s_MH{IEWl?#dlOyeVoVY)Mx%Y=7G{7xVOxqwM9MuDUjeT>1+XkAGPv^cD`);wmP zA!;l}-=w4;{kVzO*nzec%Ul;LvRZ7{PxkgyUw=z7wYO$}EXtfA^j{Kg+t+KDjK0sKa9jbiE&5XC?=`P zpiCjDy&;-XA{W6fiu|p*1G&OY+#E`8&Q`ggF;mc#c!=C-ksR?y6#BPdFj8by%=ftl zNmoHLd<6#JHUIL8%{8{07i~pPV@?HRN6x{4GiJs!pDvFmrX>017qO2j-Y*#uvFSpH=6nGE$7s`l7q=NW}0xwy?w@t3HkxbEiM`u&-d0$*E~_15eGW2jjBFHp(3 z-@gF@bp=Qgq+?Xw*xfQD`D`(po!!ob`ffBi0v8?&a35RML)V^ypR-jFUkl}uF(?sf}#8TZUBbUPXDMxij6cTEueS<$n>UV$reF2PxJHmG_ zP(u})vxO(+htgT#;x<}#X04jjBzt<-bec97xTRaXE_P2rb#p`ZZ*kxGF zx_sCrMf#=IjuKe8-sR@j1K|#dg{~ewgK)HJMbqGTP-{IW3DS77(6Mb z90-2%1YPhk_5|MSn%`}{HSN#Vy*8Wg@2OX`W^|02?cr9?6tZD8bCbDV4xuH81Bise z8k?ap9oXon7`S#7e4=_8fwPC~>x_XHV$GgS z7MSU9J#Imb$y0ZifPvKe{Ril=Hn2j;jU}C9eSRC()k>PMbca-H*K8CQ^0EzM=FG** zt+cF_(?Yg30gZ(Rq-qh1`1o%#AK02ZlJcLD@m6ja`y)=;@rA>JL0bNJnRi9w`$X!| z7l%u1B}Rig-UyIgRfkq@r3Rq;u?comzd7OFU! zPNUd{XOlq(`sZfUmStCw0AiNri*%0U0as`JNE^+q~^*y_8logHm)!;-~L?G%5C+|z?DO(Y&L$BH*r~4yJtc(SF!rq2CB-uNCedcKk+Igc5cyo z(Z)pG5ixdTu0f<#m4FOtV$@dT!8guhDMa)I;tRT#+eimqM1mA+bnLCo&7!LlEwqF`?)|%R+rRtLP zx}-V`Qvy;1nqZxX0P}d+xZQqm2JKeKbi#@y;9^UqE*8FzB$6nq@;yuJ zhRI)_giBH)jq(UCbczF;z&s4{ve)O3Ut~LlMaTRO{Os%&cKQ_;U{5J{-Yl*z1Pv=? z>}PSvUFf(Azw<4Cv(L5-JHWjQ8%oNsfeeWE5IC8wi)L$HPZKdN-(7#%ci$8F;6Gz{ zE(qSxXK?W)UgoOQi|sB9m{&lx-08m2z5ca1BJKsB9-;jbpgH=r_4VKUq5loo{KrTC z9@gfb{{yVy$r~0r{^lN$eRGfgV+r=pvHzu9rQm30uJJwDze=!N^?x)Aq6JVuZVV&sdi+CXVXO%hc3QTSzAL&_*Ng)*t7#Mv90QJqON_C2ripKkNmS!Q2W{pb*uf7 z+slQ6)z>hu?K#u;`SbqTFc5S!|JT0%OK^t08-ovf^u(I&tI~>aYT_cvhW(wCX}ncc@;=J74+ay+y#=-JVkYwB#6NXP zLO1F{2bl7F9v}$ldL$_00cF$&{19C`&3@UnFhc_?r%){86TOmNLRfzzSo5xZHqwJR z*;C-`c1;1Yjt6nOB8H_3+$Ea52RvjcR0H_y)hb311O-)Uf+_~PZnT%Apn|*gL5NP7 z8T_{J*e^($a33*-RP~?4xP#FfcVP$J07H1Kva)15P<1ExbqJf4)AgU7X7K&J40%{( zv^6Z29aexu(#gkhhL-Z*1=Q|As*V$OtXi;xI=QmxFvKNq!Nkh@EUgxRN@IEy4TMuQ zEl{%oSlfru)@2YGo>_Y@KzOb7fXR!YAwt*KVZ*u9XUtuWd|2>GP~LogrCXKHOhCPj zcLU}rb3g1%_M*91>v~c+{{~|?0kqnVBz1Mm0Wv=foiH=FyK8WU&|*`DfNu?0M+YsY zy}B`6`~WL_$jZr;tnd;cr9fE~YWg;6u0t>p=bN1GS@l)U+w4;iRlPA|UCRZf_;v&L z;{@0gIgyCq+0<2>Pjv^&(#^vcbXQk_GJ4@-iyJN-Hn&h?h*n!j(486Xanc&_o;}$g zp4kaid$^;8WlBV&&cRnVNYO(MfT0Q5UrLD;fh}cQ$gw*@Ec^XU|Cq!bKSl2DM_$0P z6l+s_^n;#{Fz{emOC{SMl9v>bjKW07ta#>0(jagcALyT^;GA_)bXP{$p2|hQ*2cM= zS0M{-RiudVCHs~K+@j@r6qS_+=)WuxsP#lsE+7(z$;PPUze$d>o90F;aM1l<1(L%s zxz$xM2o&R|CvMq*xo8G+8iB4#Um>gFEARav`jT7n>X1-o(Uk}O5l#J{wO{`YHU96U zgY$2(n{Q#8|B-MWsQSQlzZ(HPzM*C6|2R(4+`-(%*v--9UsLL8VS6ndBPePzQ{=j^$>GpAuJ( z5Eaz$UFs9x<{R6MsaRpJ{}499g&T#iv&A;uTshgg&M7pNR#v(0n<@Ny`@8+u74CS2y$5aeZ<=o6k1{FbFgV^8ws z87Kg6FmQ(w_@lJjTRi*=W~b-zQqle8C(+YhAm~fxbS(rJKnls&ZxiV!u{q!+q*Y(r zD*cW~yb>yk7#N>MS~HkO4LLDGU4@>#y&6ucn%FgXC4yEslh$2tj1Pu}6I+FFP=f%q zDu}kNP31^dO7s4~E~sK3T@(YSfhr=mK?^bc#3>pfHtOIHO`Ck$SzQcHsyDDUK>|9O zoCeN3T7r6tSeCoh9I@P#lr0kcd`azk<$;H`KDp;84*nmAIa+)?Cw0eVY?soC`zYdb zaP^KSIK(S#0j^eeukieuYpDaTB7Oqtm=;8HmHNRK2w`_kmc(f>l+3Qgm!hG+PKsYf z+kbWmp65QU^6Yh=AK(e`u2#2Mot&JWYx?pw2fFx0gYP2MTuA7xoNg2>Om3fq3AD@Q zCS_1P<=HYvi;|p^MzttegAe`37QKAUNKp9gnh0C=#;oXEEBMd!S~`sUta7A=STv$q z&+nbCBZ?3$Ny7Iqh(VaM&&%BTiw4ce*IIO;Y0<~XRLA9ASXh}ePo>3@3sZ6nhEc$M zx1CLFX(H)anCH5eHy_A`O`#8o@nR+CPt8LOk9rv=`dkI;tB?$sI2Hfuza>%8ge#D< zgjdVa(Uh%V$quq)gPF@$KEZtGk12OoT<-4&jTMGhE!K_KSjb6`-gYIb$vt2F5_IK~ za95Aj%`{MCrOnouQsH!6&?w2+PSdUwS*><#|I_iX;YmfIb+Iv&bone77pqNe+o-9o z$VBUsaxip9XWw(pjon1SQg0?gUv1D#Um^m?lJU)&FE0k${G(;Yl85cK(Llo?Iv}cu z0VAD0lr*Skp54HRjs49{$&RK!)U$IcgVU9y+)IpM#~Q=K$jA(~zw~16m1h$vZzV0! zZx-b->NDFa@#(yAse$C%uXdfcISVe75m>jBj5E@Q_D!ivC`CWU$FAhsHOX+j%nj_f zpfvI(3&|_jyPkk%Jjo-6EY6_|7r*>@%f#SKuQh`Onpl`dQ6@z*<^A_d5>wowA=gTR zYFRE$kRStn3pekA$89jmLS_Mh>~dnu0cS`X@1F>`o718AAO7iHC-LJ0D#Bs}kqI{7d*2Bn6x zEJgsibN5J-WV$XWv92j(=*I$urc5gZV_qzM(FXFR(_yH9ZZK^4B1AHqOz_y+u*@-Q2s0vUP~~$3C7M*Z%m(22EHBcnl7RuVE;VXa zWXM$Z+EC1lj9zBc>)rth6`})YrUQ(v{JMEwmlhg>EqLvO*piLv0Sa@A@4v%#++x*a zkL<*g_JqwoZlUoo2k;)*+^^6(2A0XUi9jUsH>d8(6g;#O{wZ?V<>ndOtl1`{g~nSxNsa&i5Kp? zZX}_L;#29#xfk;L&P9zcU`!HJMEtIvfeh^8pqgR=-!_x-e)xmBwlsMR)P-rp#$bnw zF59a%n2+k=O0+~w9W#Fa`Q$xp$)L^+<5b80^*05>$xSIw&PXG5p$RsN#dxdI2=l6m zCq<;*82nJ8jn z>oF`A>%DuIjRe$^9JRI5hc|d1`*1z!$f&Gc5DAYq^_FI;kIaaXBx=eI>&KIp`O{G@ z&iibc=1dPkLQB+gYnHslJTc452H17c+M;DE`SELMQTgQq{#x2{a=l!Pv z)pU*1{sR+Bx8Kx7&iV&n)=cShlVc3Aown)u0$&`sa)FToG_^mN7jLszUAP zNpI3EnlcI6J|fteap0WLvY+s;ubE>s_O}Cl(hvd7`lp>Iv~yNV>77RNTzJyYl&Ttv z8$34TjjsjibCDG&DI5G|b1t&0)Ke6p(0BX%snXZc<+^DfWg2KPE&(60I+UKVi6bQj zk6Ysp2frFCTYU&pUA*Q6nD4)W)}SfzNaw-uB1Ts2?dGPWcWn60$f@v1{{ot&vW zmR;0diOZ8q`o7~Ur7jRT5*)^gho-mEm&uu!)lx7mCTONW6-fPD2)}QJTJMdypC#{} zT8x1S#@8A5;^|YmEKVCOpX75w*4Uk&Z2z_#OM6<74sqw_BHVTYzhUn2{(-v+4C+8m zaR%R*_rpM+T40ixCUJsD)q`lO;sO259eq}6@6t0`4}6G68PN&Zghi4(QWpx>8ChBq z0^``cT0Y3Qo376ieSzEX0B55hTG_Q%QKz^)dQ0zB3ELLw=I67#;R4ab>K5{Jsw?%k znxh&5a=f^h7ClYAouh!ErZV)&m7u-bXKS?B*=wqz7?J8Bi-PSK`ln7H-Z@9s5;)HSz&@#WlnQW zqnDr|f1JZK?<(@+J~Z6Uz)EcV3JAyjAxYz|=1t`wSMTQft!?wHXx^;oi~G8$+R3(4 zn1IMMn#~YA-CEMn6sFNl<4T?4@$EaD|J^E|dF{-2|)*=Q*D}He|>1C}Gq1|GvdK4dqcSEphkC=1ejNWJZQowwwGGe5$yEr=hWe*1}sf<=gj3k_S3yRPoQhGWmG0R&dY)U`ho#= zehI=V-Bj`WcO$@gS;x_c5^roBMd+U(YPuW=TvRdMz?SpXvm5OVXAD~i9ZNNpQmSI$ z=tGODB=8lQXgk0kmJ*FwuIrI&S2E@JCI-J=3wh1J-c&^0SJ$1qI#d}o*Rt6q z-an6XXX$Lo944$-CZai`%%l&~{>G(g{&W_9Gg71}^@xg~?u}_2+}Val(-Q$u8WNu@ z4qgr)7ezmI(!_pZZ*l6mE5K)^Ej2nx5w|Rz^Fg+--Go>diY~2B)PA{|782e& zsIU{j9med9N|4&JA99C~Qz9ZjAHP$;XH)4D{A$j7w8thZ1@!z|T-g$Vi8h;#Y-YYl zE!Q$)B9EA1Ke>jOVV#2dw`LaT$CFH~szdD}7rNFIU2(T1TIOlYIUXSqMA)?z!q2`p z3v|9{0naN>JF!Z*gNq$U_)1XwdE@&SnY09;15r78#R46H7@t=ths5{-X#s%8t5=@q zA*9S7ShUMoKf5rT4Iyihrs^!e>$`nAfy0tkdk2`>dTw(t#1p=O_~f(cLY0zx75!Mr z4v6EG2y1bHcx%jK-ZoW)fl1&F2%Q;YB~&+3%v#ij_Kt;Zl)LqLM`u2-vn5B2M^KkU zoYqjBwwMIIc#PLzO794Td&-*3egZ;c96sxFB0JXu(gPVkh?&*Za}a^^yXNIoPhr_j zBwvy60NKsD_Kx3~yG0VYBHfb~m$V0amEL!ZHzy2Er*Drx*%9C=T3FUEhnphI>q`YM zDvSbGH2T0V@U5!X(}zAsuq;E3N9hVhC#@$;%=Eo&{oB6!=&sJIpkA#@6iCg?oC7WM z$<>fyT46+IxdoUW&yp3BFEBV3Av?DQBP$(AiMIRnUI{S9)#;M23*`fTxZjD|C8lGU zGMWkngd%%`LmrHH2?YdGEt~GCtuSW=@cw=}UilU^0Hc!27WVLU_dCz7;b-A^&1_)toc+Tdlb9tQKoED{3^qd0lZN>c-Ow<};{Vv*+-Kq&jl!!wZHY@>CYLe}LLM&Fl_r{+y*r zW-X34f4^(RpkheVaRe$7 znGn32oUskafTSzVWNekXjZ7Ego*xX`k;($C<`UMLK`+)Q(ncoXAXaN#v2^nyb z5Lh`=rnfW%#eE5@Bau+03Q`$H`A>9Zo2IBA9^&S~CFt*AO`8ELYisk>%}twEHCGOv zmmZ$_x=%UpTXGf@j2TbQ_vwaLUDsQ#Gv9{juAj$wuhWJGe$YT?H`bgRAjjx0VYr{b z0oqWU1KAs$Xs(0XukV&-BjQ_ePE|DYUr|FFDWhBfOPMxoS-&|_(@b0j zO8$DiK4+LXO{d@()Xkk^Zbtm@WV9T)Z7z*IS+tyjo#GF6b>W}E3uv8keWx(fN=_7t zGcKm!8ZN3s^6Z@K8;dTiy2Csya1%`s=WUs)Qd4^1$G3NW0#_~$H3_#eoOVK<$Od7s zW_qJ2@8)_30QnOQr+VC@oh360z5YVm*0wZlI`@4RyPYE*2OMt)ZdX0x{YMy%HsWAH zRVVW2DVS!emGJ>}yXqyD8s$3qVGnR#G`-3l9&FytI@oE~`?wg+(N=YY7nrx#PTU)wdPwH@RoxC1lvJ79F}R}q+J`oD}p#5_>*Y$os z{y0{}oio!rgf@Zoe^~HusS-wj2Y2cCD_x(HW|qZ^okTFjmf&)eM2$0*wK7bnxN;vE)$Tsp{uQc0O@GV`(=o20-0Bze zEcme^s$d5PKJ4XrVz!u|HB;#~IOq!?2ZrN(RD`4dByXPadMzSL*^wvmK~GtYa_+Q_ z?*c5X`S>{o4^!1Wme~MUo(CHt^SLo%lg5#4q*crJ_;u!cIwJ9Qq`r}lkpo-|vL2qc z&IKtb5dCJZ{MMnQe|*Bb)uREPFesj;flASlzC_$UcZWu)nui^OE8}{JTARUj)5D{5 zY}MmT24*;>SlN4UjtgzW7Tw_=5la0iM zJ?bs^k>*E#QJ7^m7+VFMI7xBWXI1Br;+zzkA9Jt{>p}BlBhCZ0BsgggJF>9twoWq0 zeaSaA>6Q^?>q?z9;9hSm+r$Bo1HTXN^ol{QU_mX$TeBh${G z(~IoUs#bv|UmOqVw-d~PD64|r#aVGqDNM{y!Ob4}bTS&5;eM-)B_#!-Jy|JF!8~SS zLNB0Ovvk9%5-vY^t?b~^Pi^>?W*DzSN}6!$72@%PxXC~%X{EtQima+IHXfE1Q=jRw z6>1`~i?<*n-HJVJy%IKfx)bHi;_N%~e=g^&lw=AlRp3rMnz2dhSmWwT6w`+Y(P{Kd zzgfjRAtj;weaRq@Wuah8^bG|Stx>j~A={3-&~ahvl16B-Br^@=zZ4OpZ8A$}j;oam zzHru?vjuTc# zc!j>O#sp3RR;O6tE` zHgmEhmoyj$#xLgQvr(G;yN``a-Zbb+^A@91U7|fq@jmRbuM2Jc6|;8F{s5;H@ww6o z(vRbrf@Ley<2nY@@hbm*eujwf=V`Q!4%IHJ8wN*_yDC;f>t;8;&pc*?tw?N9om*U4 zk>&;_GV!!5#>gO>kNFMqpLN?4s%+Ky#v|SdOc~1wWGhRvIT+rxO(U-0iorYk;ZyMFe0F1`j+GR z>1iDdc`-P<-MdL<^V&FX^V)w+j+ty_HaCN$g5O?ARiEb03wiAdJVk3UHrB+pP)k!3 zwOAB~)^`(PJj-6R`O5Zky`+X_m}T&ekE9(CTqny{nM?QdFUCDxUE_sNX%i!HXQ$rP zZVfsW!_s$cX*v-Ee@V_KEc^!J$1x@mA344SR(TMeuZ#+JHbsawx5#SF`{NG6Ss)=Y z1bG_~h3L%2A0w&$0U}Vahk2`v4UN-1xckDD5U1$m8iV5%()U);!wfyYK*L%R5p}*^ z*jb^4={?f7kNar?!r`u@*bp7c>%sCCRIdOiW+ayjJej4Yn9q=K5)7Zs~{z zUmdGBhQfnX&xKh>Ww?T5YI)h5l$KS^E6oKPCE`rEU$~OXT^Zw7DU`@%Syf`W9J=Vt zB1B4018n0G8^2n9>Z%-U@~mcPV@`&@1EeWr`g4C4>%|ArId^Lsz|72&1Oqx53|7)p zz8PF6?y0hU&|XjM9puirLY=D#&N@Ley8)v3Rc_4557NSeZsL_$SkA>col_h*X)8$~ zVrv(dHSCIO9h@g7qv+Pun#3Pb9n(E~Lq(SYfwl>sZ1&~h_0_!I@`diQFy9ItkzG>F ztxd2%>kr0ZLE=++ftW{8fD};4wJp9ZM@~Z|W)#S;StL=&s7^`W0r)IPW1|=kjwK0JyU1T+J6Ho1&tonW~1_Gxcm0=GoF!V zzO!i4&%)Xvw)n+#HAEl{-y&8eCmg&|u)q2u2$5^vgNH;L@}x^e0N)*hGvup~cX|cc zh$L(MCHB(3%$Z#QClqp5EJqb>Jg-K{lgJxyuiia%#%|!8rJ0cXOgP%~48AP#2v$<4 zR7kO*>>l}ko^nTAu;n-41YHPWZNq(PJRr~W3p6x*0FFuJd>t1!d4Oc~a$+zuHPt1X z=4Ml#$S04-?&H}SS`0sYp5?D93h+Zw8TDixp`l0+%6vG5dGo*cYQ3yXmhhN*Poe9E5s-}=lbbDKr#2Jr zT?GqP36YMMjqpCSa`s3SXwdr8cbuI|_gQ6PDYyAZ2L1XqE}UOYezu^$XLPxG-{+p& zuidXB=h*%{)Kgr$&q|p&$KQLrg6e$I?TlN$&&ruO=ihrALH5G0^UAGbPvG1ZB3!{a zG1EcvOSeG(*4M-P3#T`)!Vjf7`pU=;uL_$cSMGnR%w;+Cf`9S1N%g4yp0~1^==Npw zuxlDkjx=7e&)i^yNY3!u9icY{ZITb7S}ZF#3Qg@z-ynTO|1iDlj+QC8i*hQ=N@mEU zJp7|F#S32OQoDA57M3B(P@*Sf-@bYK)V&+X9k2Dbms-49;SBK+LhZM!)n68A?xpj+ z*!wvBm(wi}K99b@C_5JXKmG7%D8hGjh1i0Z1v?;aK`|^|PH=Ml^-TDbNb8YxAYFAB z$NlhJ*c>}(Pchsm{F$%7Lh_8B7}>5syA$-Xcgcj2xdv=Ixj4JL9iS`sKWi!1-{thyV~ten4L1p z4|uU=^ZVX!9l0PMV3U9aFf4@vA9M&P4la@HNv?@(Fp>*8mQG;C{(PZ}+Fnij4GWvR zb)&-S^-eI$@Ym~u1t!6nKxcF==SQf|3F$Dz0PJpy-77xYRH_gsZtel}*9N=EB=LGK zbJC4vYHDbOIDfKAne1nl{w|Qi#i>A~sMR?>%?43t9j~FR*6}Q?^gJyid9MXjSZ@=g z53#S^f!?S*889 z=>@51_PoP9^n#wPg+YGcFKn$<71@v@oiti-`VB<|VcO?pmAY}Xg0eq+Mvp{Q+A}Gj zv%}aGe}$FG&QBW6*fLWDU~T2KyGp9iMy<*JIN$IzsO1ZFXWeCa>y<`q;(pZFAkYg~ zpK*Hy^Tvt7n9w3z?^BwV=-_%IgF;u`*l1)ueX3l3-@`laTb+%u}{ zhR{i|S@O750KAe@qI;mu7lh`956Gm$UPxCu;ueL2>5>U*!*K~!$$v#Z+M#c3Hh}WY zwIimK-OLRp0F)Xy^rxh?B*^GW$E2qXh%@E;1mkpG5MxWn0vgyj zS=HcWyPCndM%q{1>G$`-A`Fff?Kns-833D`DNq~#OCc2%Kx>Ej*W=E7_fZQ3e$gQa zC8k#_W|{~gn47*hn#&w zSJUs>iqR8|d+S@ai>NfR?1cFl(fGzqkOp%@`~gldWVq|>huag=GvK)Q^XC0UpgSyZ zSWqg05NQfrI!%U5oF*BjI5J7MU5v&=ch<0;O%#W8Drr~-y|Fz~gHtxSs9Fp;ks-Ai zRlUb8vr#gOxZsN#OID?2fD>vq>V|3qY&+C32-kD&nfp!CiO>!eNIL>2=mMy(Ku*W@ z2BzzrY~Gn8Xcw7^2tKjbg_El;(&(1=M!&y8{ekP%*QcuWge@}v`JG4_{ei$2K){gH zn3?~K{X!f|V)B3!`!*D@0P`z0O!{(O&*$PJ1Bp6T0kzB@Kfq*HkJXYcK>7H=!*>i*Kb+4wQniXf8U<=kA?qp zu!Oapx%&4k|3ZgiRdp5r;e=G;nRZB$z6b6e4MI;}g$Wim42g>)Pa}{|_QJ8LVC=MN z->j?h8CLrV>qi|)_6Zc2ay!|m7R+v)Je~PE&At74l(TBs6ZipE2cQQ<)sizA69SvC z8KX#KMH(@Ip&dV3Qjs!dk7Nfeq$(rgjii+3GnYaurW{y?o3nHHNvv^a8*E%a!e776 zQy#TLTH78fr|uWt@y?fUwgGCon`p;!Koj6(br0bg7wS)=x1G3~i67N`bD=?{-$AE; z8_BT_cbm+}j?F}8PCN3Evd-{~aM{I_u(j)PWf&2poV#ipm)lH=^Xq~C(3Zv+G|9xh z{DJ!oD zinYiQ!+W7(8Jyj&3Jr=NDogxwy+N+C7Z54mX-1X8ow!&v+k%H*C_*PV3+Mn_nx>me zo2qLwXO=@eDOS0OGWH(jW|8|Oe^uhgP>>SES+w&}f#$z02{8V7I*JRwyCn6b#F+2v zZ(~pM&;d0d=dmNJP2gbhKKji)$9aqnD)*k{5vRLmN8Uh`X6+?(1S`)s&Jz_u>Y!x!0SrxVk`^1mQF*F`#uS&Y^=Ut|XRc52AyfNu*TFQ^)D9W-q3;NdEA2(yXN2BPdrtyV@64)Gse}c#zR2 z58Ud>|E0g4qI7|(V)c_EIJ_=G3faOZv}3WO%qD_j($MI_f0trkx8a(ta4DAj^uGPN zES|7rtFjHH42^}TatzWv$%bJ+fC>;HGK{+~UZ`cI2btW8j2 z)P5)GbP*ZbrXdlOel6cVfQ-F$xm7C~RqEP062jOlQ}VPNlFsEB;;iR7q<&3tw5C6_ zenVQkz)RtxzY95%-h?+-`gP9r`_tC3pXKM<`?DZW%#JzI^XrA zD>l2Kt=NR+$GR}sO}Sl(*}XQ>Ptso|JP{nHOMpxu3v`VzFtxEcr`waTd|<83hT_R*5Kh^H%TDdp%+iE7GLD&A3W((qjY|?b~4)K`eZVOGU z^HxSJ;1nmZ4RnNCLRn8&aHH9edUY6*sS(hR&R5f~|7fU~@h>!ERTbl1l$=soIq`%4 zeMiCkMZcyPW-fqdX#4p(rNZ z$Vr%}>wQN-4YNoB)?->asvt_gDV&ugm#s6LHKjPuho-eNxCo#Q1<%uu!$4X^DbD4=Y%Q3W98BTeNw zF6;wl_Qi2oA$tr;sS7pr;!u86rzCx61al1tqlaJjs@V$z)ZWT-dsQF7n0%cd(Vmov zLl`_4TGX6@5?a*K*&_1F zRGck)8nX&Z{4sg$^%3#j$6>lu+vg6iO;Ci@e}LQR(iT40M`s|#HMrM*=bT=kKglQR zQ}sB{{s3-fHe~AOjsN?@|ay5l>v^Pyy zOCB?GfNdp8T5bq-hSwY>1Y&M_KU@$YJzsy^r^URG4v=DT8JKurSKF0Fx&g2V^9d0n zFPJ^;k)Byy+?*k^A6842VaaY$Y}J$-@=7(~Fw3P=-pH)E;}N-|c3>VORRUQmt&(c2 z?urV=T%?l&NLnLg)dnaDPv*6iQ$%9s8h8@;R+t#|w)UISu+NGtIh&#a!GVn{t`qp_F~FVww~ zVD6D=w0w5nlZEIq-!Gp?6-dotr_>ZQKfP9g{r}US`@c^**#G8c|F2vp3knAF{e^!e z%8D-aQOR#k`Ny~C!@sk6`{yuW7Z+o1X}ABI$)I;_Q|0^B2ER(Octt(lpcKf zW68xHH6Nb%M;}*;PzKWg9ImA)tXZ`MefWgpZX%|^+w3$Of~ZB-^JkgD%s2rrvvoLR zF2C>7cYgGEw)*-!o-hQu^Rh7o@wVr~-QI^p#iZA3Fy6T%LfDPs(6rYZh+lh`_FbT` zkke~n4($xX_3131n!yN|+pmI$OqbtiU zNLjsCpDhF&=OxNuIpvC|k#84p7)O1uhKrHwPKgW1ttt)8h_JnSwW3j|Z(7x^5k*J3 z!SC_&Vlv{?F#*apnZ<*4sS>hjgA{mm49^d-S%#BN30Ef&RfMaZnn+&+m{FFTvw5^& zAvG_iN}AX#sQuR#bL63JIBW|7YHj6C4b*XT8Rmkw2G89|jdf&?^ z;R4#IIuy;X!o>1j)f7?7h7lX%nLoHY%4GfOfP3GuSDM9kf(qU&>W`TU^a+ikmc#X4 zE@{MGFf0VpFo8|6haV580y4v6W^7h}!Sos^t)B$OiYzHwpgESr3{lGwvDSj?bFQ`r zdp#U%KrI-WfN9g;QI9O)9C|-V`*_7YP$*V$Lw#@u9%|)w1nT+nn@AXTh!qyjyrO|E zZ}1bmbg;X~xT0P0@&6tGKSvA}%zQ>TPo?XYyt?j_-v$nMZ@28wIT~AeqYj)VQaqhs zP)IDCra2~W4+hEOZCp{|mEeQOu7q0_J&6~LT01wP&n1W0>5jmupEk|aAS}Fqkv{4| zIuS{iT>;@-0v$3fLA0+xG&D0wxQw*;o)zLhYLtHZCAse!{@0=XUjaE>GCNcLEna~A z9hCph59*%*DemBI|Bq<2c69jvhGnXkTk40?yA`!?VfRl@rR+(XFA&+j%>#d&GbPT`XN&! zSTjOE{LoO|(vjV_~JNLKztUS`Ge-F_iFr&bn`Y>n)B2>b9H>Ri5e|?(2>A{ ztg07mxMQ1z$gVjyo=`PPVDHhh)O)U=2BRGYsNJ6`6wbr+AF;5h-`LkHSLik0gq0kx zTi-#-3%1vqFG}>+ovT1c?rk03bC;|;^3*+^v+{l`&_K^#D7o}WqT>(LmI;lwb!k`f$-Bok?^&qeR@8^a{+g&Gk~NJmW&jXlF~jvEVRf%C0jMCr zlD?QzRjPlRfD-RJ%f)6iwY}JR~4_ zp0jSl0Q3jzCseZ!Y9!EtiU3kt$H#nnMA?q-5`{+^QX_IoqIS#Y|Ftpyp;l{u0WS82 z00cCK4+KQ>pH3F4ZZ6gimg?Uqfa||@X0aBum)f%X=S;Rg8wfoVRsvAH3~Pv4?ZqKOe3YbJI*8CyAQxv8b~<*+>y0vB0L)}VF0H8>b9Z=@*7JcT=l z&WOCopAy+M3+shO_SfrNPSV)_hqQN!vh4e^gfqjoZQHgpY}>ry8@6rR%rG*LVcWJH zk--dg{OVubRo&kh->9yB*bnF7o-xkG+IP)4*IZc7&vS8cyw{tD*`I>z{0bV|&j)7T zAr7fjIiA^J$A4Kdjp>L`n4@i%{~E`^)&BqcMLzBllP=0>t6- z{_Onmz2AYgZmSGstnBiu3H`0qpSEyghWN1*N5oJ``jbY@K&fAY|2Z>Gvb%Q5N7Syf zH1zkE!R__1&2wqs?Ju0#lwHCbddBX{UiY_PS3UUchaE3pu^XR z!6Cty+v#UaL5y94#rrSMA_tk3-&MPU3pXl=zDJT(4TIC~mi>%x&kAp8neEkXpL0>4 z>c4;A?fETSe|p~f>38l9!vFL~CDCVod#>k_63r%X^cbKARIhK)m!EAp5U^$Kn;YkQ z*l^(gfUDjiX5e4xvY!v#iUB!AX*LAej zR#Hq}WbWOO5nJKzHJ7o8ISzH?PB{-cX+9Qx)tHH>eQU~=%0I`K95ZM)xc;18;O5Sj z5uT~lyAg`V)m6ruI$CQ<7ou*wfPCDLZ~XQ>AYqj@-E+R3UG)83J@b4@_M!$%i`meu zHGLNJ$bT_m)!6(A8PGquCIbQ}DTIWeDq^vNr$E$RNAXejv|-C=8Cf$KtP!Raww)4S zwV|=m45G$i;Z9cD;gTf;<)Lik^yra6O6@x~uqm0txHNiz9&^UwLGi&2OHMW;C)y%D zX=qA`%u=e-;I%OJqstj}(^;)fxnfhvrp9G0az8d`Q%7Z2sjtSS9C$EsZ)d3hMn|V^ zV^?pM0A`b**X9;222FxoY8!N23=&N-ljGOact}`Em|Zpt?C{iCrnsVYBEF+TsbP23 zxmr3<;EvBJj0WfLr{Xn}a%N`uXrX_Sv!NMJ+m%9ciHAbU*)1o6fYI9jtQwZxl#e>k z$0jV4=7)Bk*`w=ckWrtjpj%&b*CcnUuft>Ma#i-Dvv;LH)fxhna%P~)LBEUfQ@hip z+UifsJ?WU|Egh>N6Ik>(t=rQeSM|vD>$r1Smn0*nw59+FBGz!)vScXHppRN2Em;UG zG_|v;MQH?BXyj#6_)za?b+j}WI!Rdvf`327lHADu(W%g#P?gmTb4v2QCF{7n0bHns zCcc9huxzEZ#{aC#fMnH5P2FNchQS#YIp0i^C-^0vPW6Y3m4?q8Y?3r9 ztf8WSj#K++C(`&ec8sj$!!*&1G(i^e%wcNToLLcPin2-DCt zHWhR5VtsRGl?W2-9`n9IWIXtt%g7154BQ@Gzy|3b5EcUrDrI;AD^)g85GW86RGD2w zNHUTnt#x~OqvlRUX?qx{#*Gqv%)?m>$~s95NTeikf_7e_A0^~OPx+ig3rfquVuAA8EkAb8~9A!W(r_|r&dgg;d~-pVt$0dwJl?HY7+ zqF{eQpP9Yk*xtPP3ynU#$#!j@y{Q7sHJ?lGFcCM}Ra87=Kk$VI^ z`OyhG4_PB=DUGQd_0J2Mu~>PW?dUUKOJlkun;4F=aozhEH(PMfF~3z)_6B(_KPc3qiVlaOpO*&Z2gOnDvG?4 z5Zdxz18nfQ$_}>!^tvMGs4DI6MV!Tw20yZ1)smB~Uw$=xrsUWe@ZjR86&3X5fLI`T zRqW8Lw5lg`Jlr)Yk)m%lbR^#}$1-d*zI9ttamduVSb4&zYSe;DSvX*dN2Z)v{kl8Q zqY+=I{>vs!nSr`WT7Il?OyNs_n_g=FT|iDHCHi-g){)1PXUCC%9H@Z&xFd|lvY zKe{tmlG#fY&wTOn+4t7;1vqd#vgr1H6&^yXr5Ff30FUBgjjrm|%J-pPpSfu?>~)Cw zIsV8M5DfC6P~56p%v4k;sQk|CurZo({hs8s@%wij*c0OICEToEx^*7$qtV2G^6{g5XdGv`I-3kPCa?Z4Moeku=NwLqf~$MWQF@KX z6xXDC{-YYqCk)NaBD3`|+5&`KGrGxwIkRb%Pd0?&_jylf;mVBCE_9fHJS`8A%j71Id z=)vb&_88%(3OtrNG~d=7bQBcQvAugtboy)Ui{2e;za4B)bWUPi&$|jYl^3;?3zkuV z7yA5#P7bM^$<8zJ;l;%f_Ti=1x%R|KAr_br_`dBpj5~Zdbgy!=Aa`x^(+h?{(rZLX zaya_TK?M6eH^85ZS(vXp)oEh4tjD`Ts7TeMV8Jj!c2GGZ)T`J&8hZ_vYuzsU?9{!< zxl*fn%YM1ieaGGIqDEHqb>*`a zQu1NA6z*j^N|hNp$B4CU8bW8rwNC?q<7#-36Cpt&L8ng3p5y5tY6CoBe9oEx?&up; z)d;T@A!n-c@O2|f8&;|0Ez_3x^z*F%U!k1>Ec(SW+2wON!s76)y`HcSP=VOt=W5z! zXeGqb^H5GFlPG_5;SDrhSMbQxhzH%qz*DJv*N(L-gKEl8k707vD>$C%{n{%d*^PTX z4A$Y)o6pVN#$Q5Bb%yi}lXdCw#29!iJ&IAx6A((Y&=W~ylL;bGcn5Mx5>=+N#G;y% zk}ziVsmmu`(qjQ0E-dVrW5H#^gIqZ_0)5y=i>aA|?J@08QVmr8pPR?)%9|af*CLje; zCcPs{1_%Wc5CNHv@3BI8KKTq1iZ5`VlixT@7V_a5;z6TWD&bvM*hA`Vt@BeXioz80 ziPB+)dA5~urC+dgH^ z>6|z4?;UhZrXhTV5JOLV6jj;}xJk_P62>{WH00DYtVBkW6mJ-tgZYyLjXFsI*dMh! z{@w%*NsLS?zso28e5+7vi~!0&TE@FSK)w{qwqTZ7QgPbsxn-9s@h!B&C^*YMKn%ky zk1{_(>$nW^4A~n+)utkzuASv~BJPvA;ql2-j9oOU*({A=Y0jel3U0|krq~}tF84A- zcb;1qtbl7tr)^||!Z1of*gQ*JE1ALb?E^XB#hMKj(&k`B_! zlMIZI;eSmaHDN=jVF%G6?ebYU zJ(NubAvr?^E4PmnACz6g0G5p?R?5Y>AuU% zrPpL53|ayaCwda<_Jv{p1B8Qcy&dwRuer_Nss6p|&?q%?O+epz%ukxb>P<*(u?rKh z%{^g?D~WVG^PYXh+;UE##;h~oOrOpDlUeVX{eNP5|6gpL^8YV`wz79|a&QKinf!z5 z{U<^m@+%D|?23yk{rd5rufh3We~GBAk+ZX$5rB;OUpaY7v>Z$y6H>_bvxW{W5Dc>x z*Aqe*K+ND7h$WJRl9*T=qCXh|d824t4g9u!v(trrx*ZecfhBhFjbs5|Z#BY*i`?SaMeeGlPFsLLmPh z{AL^NGOz5}chzs6nU$&MVCPL-C)m3pc>!lIxlhyro~oiy)Ci=kHrD?Azf5zWzWwv* z34hiTmA^32=`VOp@W1itqW`qkk+X9CcUU4vxmO;98OcWv14CU=Ok6yUq7V{>nVA@i zk&J>O9}@1VfkUyuWz?SdPAgZI@ARX5f8pGCfvIr3_$7z^wk+|xNm$Rx)UF^3&pybNT>9j8tjfru zwe+0{7nR{tFJ3ifE05x6(l9zXM0ifjG2guz-g{Kcdo3hhbgfV!W>q~Uz%wbMYtwVz zAFa8|nf!Nu{c=l^pv5rhTEMR5AWACU63I$n8#4iT_0ruRVM{;?1dK5Em8+K6~(yhuS z@=3g|&~Gdmou`wVE}3n>-~{i@ zWv(E#P`;JokE$u~)OTgCc=!lk52ReP zdmM8Sk!&&n=`u0fdf0r%HtO`|ur>>E#0-SkKT6d#Q0F~&9YS(tG(zF((?L$Cx);pS z-f+U+K7r7@*8mM{KY3-5(WJ8f^Fw%{Nt`M>wTZJBlgqx-%H4RmQBN>7&}{^6qv!fg zA7gjHh-s=Xx@fXhnk1XosN9=GWsv6*XlxUu$aP2%jY)`yO%vV{%Uiu1D1R`LRx6Y5 zKpS z>8US({b8Cs=HX-ix&LmIN|@ZssIcD~68N`GV)Tp4QfEM!rX~o&0x?Q2p*XiLGxY({ zY6?nb?~2OBx3reKCNiln^pi!1z0nne$ak1I;cd7F1^*ktyw(r)-Y4D?=hAP4mWDE; zEE1;qE84MzdIn-%RX=H|sd-XredMB0!zc-aBBb&?zTI7OH}crotmru|*o5 z1R0)`Zm7DarU$tTv;LDJp_bX}hTXCK8IwJ9&*49|@jrmP`3l}xH|)1>$5`LKvH#z1 zlL zJyz`&w<2pSYhrw{Kr- zS0x2IufO@9(hLT{=wA1w@k{kS*sJc*GI%e7hBZHDdUs##9^>A<93gG^Dn0FcoXz#y<+=4bZ3JD;3-XIaU z?G6)643HKsDr{uGs|rAdxQ&G5jrQh^A1lq?Gjl({Y6)ERp%P3CCo%9H_RTZ!6@3G5 ztgNBOs)2hosW+7ERY8sBl*FlA!y$#alJU#u)Bad2IR9#%8PF9mFloS7O zTV+^7gOda)cs?qO1ybpvSw~5d);}5&5kxkjTXnO4JdR4sn|+yNqW{2Dt5qGT-rCtd zV1#*H&x}m1+3w-pa0To8fMrz0+Okn;+}(;-ugNhljknL4F{TcBwYSNG4cS9otfz34 zRLw%Qh8-M7mpH;B6>v`pRKm8JNffo~U5j0M=sl77{0mT&jR1SwRr|1%TH=@u=M00| zjP5NI7gu%`+o&rw)Wu!TZ$*W!v^zlMn$MCA<>JPYs6Q zoFyYphjr$mpymTZr&`^~bLv*%_z}{7O=#H$DbP`3<;ZPxVuJl0=sUr@Ov{6V8>D1E zN#Kn~hA#CWnUxM2-3=Zf#DoFMoNa?Lq;O5i4l&R_zgAT`f$eg7QX$2UE~Kt%c9p3x zT2sWo6E{dpif`u_!WzeZp>q3k%xs2AVl!CZ+lJH?KfwH4^*UJ52n7Ay5>evv?{R^@ zVbkoFCcbPQef$;7Y!n(|k$Fqgu{s45GV*dS0BC+sl{>@8U*Q|LH;Zg1>AaRLw8GGw z`%6la4T+DRjNI80WaN}&N(_I>oZ)HVh5SR)S+}w(!c4OkFlIQO5P{A$F9vTd7Yt~L zh~e4}v5?~nJC;*5s))b@)QTK_7EEOTkr|n#1Kb4MmouVg5ah;T*{O(_8=pVtMZF%1_<4E-vwBzPVOmoZ^8ujDoO3+ z7`$hWef6Bla5!%z>yP17vz}3xGM`yLjQ5~E&ib}x-|#;bsooE;sf4=dhz!j4@}AQo z;4PVN9d1sUKTKHW2K>ZwKKJS(5Y61!1swLM{-8Aq-mZuJr7{y;?|`C3gHNO+L=Rdt zhDfTK_KGmeRTDR|p6byfUIoH?nBS;-K|16tP1m3vB%L`B;cg3oM?2*0D&Gmrfl3}7 zJT8Ol@o86WqmnxRy|mDJzZXeJ_(0abfGSwIvn*#vL$rfA(^y$`^VTW5$R@#{Jx^oY z^CD@h?N%(&G zcF}K;*f`CelR-Co8(xA|c8AdX?GBLX4fE^-arIV;7t0omBid^z+dmr1)shGMh%H0% z@oO4+FPkPNf3YaTLpR;~B&TFq`)9#{fki8UlKhfd*IMboOdk>FAl&*l_qlH&FNA+2 zcmkG&1^7;6O)rcSIL1Xjbx`reX7>ycm*6&1DF*FZ@weOv>$` zvQy`wW9xCrf9;E}LV7ELRF3uA?(UvQV%D!Z*wfUsLzA|hu&9K2@5l zuc8}(dyVCg_p&a#gdkP}EeGhy6Tf4z+`UKnL0G9_G*^D?kkF4bX_A50^lE4MASZ7* zA8ZCSO_7n7QK&!tx~OBM%?@(*h)h$XaYcpIxr2S|Rr!G-vD<}}7^vKDa}nx6iB~yq zgV$$l-+l-Ci>Ya0B|xbJ!6%vWO5Br1-3uRatRlguf;YYZTEAbwj4wD^o`&f=_<~n@ zjWxAJzKncz(Yx;&p3oNpXAL@?Go4hE9)MM_J%F?lJ=hjrsvAnwV*O{#!x9Wn9z_KTv?60#F$6YLPYN@cI5(T?VP9%vV z83$|5u>gxFebF1KT#ZwD$d0}mN?%(*Ast7u(We_>iR{?f41H%=kEz$gYK0etWo_)( zDT3sszmtZ(14eaDlH_F*Db$Tkci2*mukfvfjT{r-f14+aQp-vm=(?m-G>j|q4+yQ8fV43;pQaitwv#gHsq3dniM}? zmQ;G6L+lP^)uE(njRuTi$WCO^61hkT6rfNr74nD41g2ScAu@*K4M6UbRXW31k$cln zEIgv*!nzQ^iNUGL`N$}y>(DH3i0?UU8h$!ki>T^#)TcMUyVYdDj~gG zqCnGwIm>!V1+`95ZpfG&oOXe&TAf?7>~5y-K|-y3mn*3*W)O?FLml;3)D1UITe21v z+pWUH6$e5s`99jNPE?d5v}?wsvRg%WM|#M3B>4Ap7Tju#D=1B!2pN=0<(#PQ_4u?) zR1MbjlG>SzEJIIxK2EP6k!#;2D?}xqU{||!c1N}bV_2XggGTOgURHyh?5C&jj2!a^ zG7ia}$)_$y?syuq2S-gLw@0^9x}vOOOmHR&*SeI&Q;5~n49m5{9j&1$%1cJn7O9lk z!JN^}D-O9*yqp)g%N5U|tWi@dky2+n7p+N`DzQEh^`jwNsg2K^bPHSdWL)8Em6xsK zaiK@SC<27edn$@`V`;g@g$f{64dJJjSSz}9?ApvIh-mpy<5i%JFmx++^&{J}m+$OB zP2OlqGlD`=KT$6ac!upi1VmU{Gee42+Jc2MmopUlEI%3^3py!tT~O6IS##}&nOrGZ z7N+z!x5`+xNerVmFZu5rh97S&*M}cGT9OMq<~WXBmn!8Qwd{6^3z=rG!Gcoi|eu>%cspxO&&I*?pz*`g32$+(*5ke9#kD4!KbpL zlOsmO$`w3I1y;?@Z^iZYhHgB_KBUZCua_-e)>^ zwH9N7Gd*80gv^&hhxxyr5d23Xo1(1uPgw+i<7P`!Ek?l}CKWi!c%f}{1S5`tlx!y3 z^S51}U(seGF0ERnWN(xNZ1v2yy@We)Uv_{TNR9^HE3fQN+0NG!AAjHXDgE_qn`e6( zG0uQj6TeuyC^#}#(4bJViq$oE_E|WqDcVdW}hZfvrga9g#eIm+{ zq>P1MX|$ciqw-RmrE!gnr%~LOL#<-bBNeV;n)?`v4iY2OfJX70cXLW}wf{HA$zyAk zn`MLJ$uea;=8SQ-#+L9aQ6755-||gcddik_ED|xzh?$`rC^!V?lEa%}(sY z`IBVHlUs2d?vmO2u#`kZ?l$eo=(Z3636g%WWnUV044iFe1J%qr~@f8OM zd#bpCgIxkalD90Xqex98-MhoTe9Tb5340`ommtN1Pb`OW7cZtRe7(E7K+_Ewg&~Wu z_OUwP67sBcYO#i1bm_o3`%>R((`io?u)iwjf9AfY+yojmQH(~H+bD}!tXcc@&T#YO zvbeB5m19A)x16Y&cMU-H##yteCRXq~5sX|Z0ghp_BdKqcg*?{2Se^6sJI@WBS8evaQ{eMBo%Z@R{-)@u1UIo_m|um6z)u8JN! zu=a2PoZ?5U&NQ}MQ3JX2`kWI@sk`8Di`}&C$cDBBJ@>;emkKiP!6v!uN+FIHxV8m| zN%U-*8iW*Co!Tbcthp{DTWw|Tb5%H-et?|omIXu?eIq&GRE*Say2+{ZvR%H4nl|@z zrG0OA^men!yC3A;^)#iV^-vXjDN)agT2rEmeL1UaU9Wm^(o2;q?aa8n!8{@D{G^!N z=#CcVo?Tnkyhri-BqztD=ekuZ#_!sZ(mMqq#O0-~;$4hnm1wGpF$_KTHG6S}j7l2PO{*!I z5T2>M!dU3+*;}3|t2PG3XF?HFEMEOg?+$ep@*D;?8)>>_y#+%Jt4=I76BQ@LWeOJupEEMBJ?Ww zKdZrwNwFtOo4Ca?Os^-3JvDQ*>-$M^=Xas9+*%`m6> zON>Nr-$~-}83o31r+c1h$P$sM{e&J+U@6Guny=*srXYG}Bl`NQFo!xqb?)RD3mn5e z`5fd7Min#OHp%$UhOpB?ye0a~Ih|7^`#3HImR1rnPC<2VUCe9xhLLs{5;y%M50tf~7a0Ow<7j7_E|3GYsr9)+v zIest{J%5*${oB6IJu!>Gl74r2rTC{UuNVISkSp$y^-6SID$RZUdN`^gF^bs8M>_Vd zd4Vhe3RKP$HV(KB|C`GW-0>=LXL@x5Z9AABmvWA|V+hwOp7|vFkKp|erSP)eB=r6j zPSn4`3IBgDoQN1XoBcaLt!DFYA%z2)F8EMcrZRjfU)h9P zyrIp?q%FsyuhOu=4khmg$nPa=*q{kbNkOiC!Mmt^XE&34vU#glqv=EbYmcqtuAKMR z?JskErU)4{lk_D=fk>oMuUiyzmxIC+7!D8oMxL#hLd<#obd^6|)3IW%+W{+`7}4xKfo$13+>E zeKpiVtugt49WJA9Bk?eBP8V(cE_|-xzI=h-W;K6ijM2bTzw(A{X$R6Rd&1s6RX~K+Vzax$}`o(;%Bp4 zEHC3(;-eR531(Y?5jFBm6^s|_`TP_i3Y}N2nZuC-K8oIUn`pK7UHnK&3XR$7wYTA;BU8l%cDPA)0#A8dRbjU{9Vp{|N((4P zTtE^qg_y^1{q9G9M3GXCgDTD3BH*#^VO0GNbyRo5f^hrs>6Y=J>p88EpcQw~n!(-> zdK^L>AbP92SZ}^VA%oK}jfIVW4q?9=8oLf5&|3yk%4EM|*J-lD>Rmg79SNTfF?Oa} znJ+77;n4^lr;cdzW5IgPyx9WfvLwwG72Hup{FpmHtY4~7FAk?(-v8qCW0(NKji;z~ zS9NbRW}))2m-Mh)n6jsEoButIpR$q_Zyhz2=0cP5&2`Cmuwneu{VfC`Ij^}_l7|hh z3t<_D%%%GaXT0a78#7%wd_o?2p^3YlL?kZ!8&DNaA`+4XfsZNG-IAOoIn2s&AySh=jX-r_jl=gM_rN{bcsC* z>Dt#!)`d(_@Tip|D|qs@mEhwJ&Otv?Je5@YZ)!N$Bvp%6#$gc}Vi*p{pR%k| z{CKOClbXB>O5d|rh83y1qEN-Rw`#-258S|Mj@?FUsp5npW7(*vi7y!PQwDXkrHVhX?+5B0=$=j-N#yUq{?w14_e^*7$0idyIkYtw;G)+jz}_7Rb82jf`nkJOE%Jt6sM5k?TpSft7=_C8 zpD21+RhialRbpl_R%ffCG(W1M&7poar>d!j|4Ln8jgm`oRElIv^QMPQqUqR;Q3Kal zQ!iyOTSK^OZ)(??68Csse~2b-W0y-Aqg}ir^yO5z9@Gv7%sw$2g?|`f_ZPDthRk4p z7UX^`;z9yW#@G8#=5V3;jXU>+J`b=jB2XX&3YH_{R!HCkahdX~Ypz|m1~>-&tr6U) z5d{8|O#Ppk|I7LbclbruynfL&9RH1(|JO7RYJ5r77tueiZ5>i2{e_@{z`#j@rA1au zp##Z?XIIF?M1*@}2$RwddQB;EGKhq$)GM@`7u7q!w4cb-l*QxgsCSgD>aA; zmeg%(nyXSip1MZqMx|_i`_jL(IZt8~Wp9=lreV@}`kV|edt=4C9$tJ0??C6HLcB_->v95) zL_x1mhJEM0&;SVa3Ugnk^b->z>>F|Ok*pFXNXE+CrEmDC_L}I+rp#FLF);FwStyKj zeZAyd`JVC+uo2|2lchX`YR^ah)P2}Hzcj{b&v)M2O25a=*}dQU2jf|is%yBXtb;nD@PO;clYAsK8; zoH&DBwWi#mT2o6&OM`yd7KC*D0jN{l-cTiMvwYr+P`h9^*J5dw<4CGH6fy|%BJAN; zpvwSfwY$_eCPh|kgXYi_k`iTB8ZYLR`K#}igWnzu{7qCrz1d2M9&5P>#3an|GV&b6 zLo_XGjbs*xL2TXc*u_p;^h>IZ9kwV_QH-?6QFJ*?l7}-C*m!PBYCDhyvl3-qjR8;< z&vdmyAg$(fX>nL6s$xS;)4_zcE?CrFh<7obMRs64$>(-Wu(ZioDga-wl4whTLPo(#IojtT#YhurI%AVJn!O=qZSdzj*IQ^Ggi^_kq_bEmqpw+Miy%R0 z7-eYDi)t|+%i_F;+|(S@PNQUR9jucWld09l4eZIeM9z}z zyIRdE>V>g#Hxpd0sl)WnS}t3j)LXq-V?S#1p|CGr?)*^UQcsVpAm+#T5kb79q--A= zosX^;SwfP~y}(l8h`krec|HjZ*^Y`LwRM?Lp1a52W!Wa9m27HU4{kAT6e}bTaPxsk z%HGK)hGjDo|7Cjk*-aky<0n>7{S{P(zFLf?cqaFl{HTD0*FY&k`_@ws?@qVDG*_m~Om>gqA`W(-pX(e(JA`zA#xnEjJK&Wo=%Nk4JQcFs1 zI*UsYG0M-c3g4_GVmlHGrPWd?3%2rQth8fXLH<;|(pFn6?8DSg}3d{B_ zUMR`2m=qm}>7f9V1MwKQg97|WmW?3HdkroezD zNPVSH9W;2FC56ycntCPqtR)DnsOTDl2p6isDudS0SVTGJr5qD`l~Apb&7$_Q$r|E7)oR>6c??Z)pjtIy-xOVaxNvMt=rhvpR}Nl(}gY&|@_ho3^sA5hD#5n;!9xvm~X1mL^;0M)t2- zavNp+)FKu$+3}X#n1HN?i~xB?OtW$5NaQN}>u~psOBilm;~|bsGV7Xob_rF1Y}u^h zXWR(u0TN|4Qm>RT{O&QY^(M`r?v!kNqdyjG*Vd*t%>51GXJ_%Nd1>ZV-L>Ug1gj+H z*u1$sa*=6^iuWh~rrIv+TXn>4?B2RW`AcSs=d9&Xb5w*D6IXbg z@s$U|cuD9I;E(<2TySQWzHLvvfAXmhCAp7;d^KdlKpUA*IE7i8*{2Oj1CLszS?|Gq z<3_mMv=#%uZT%G*{pJl{GMwOtMZ+Cu3B?DdAbl!)uu@;z^h_kNR!8BwOy(;G616j6 zJk}okloRAlx6i4M9%*Ie;oh^C*QPV2Ju|kRlUxrE!ToZQBDZ2|J%p07urMTeMk>BD zS!Bx&!6i1+%RhQee&_z@X+y|SM7nH6&&jl#bov&` zX*}ogrIt@4cb`F)denK6TH|esFU^1(LHxe=QUiji)T-mheU5j@!Zn|NJ+&~%jZ?I8 zK9_}#9Gz>KEr!X$ z(dCW;lV(H*#|jN&M)!EW`o-mzd__jZ4f&MFmxkO>xJ4D?=~iRRjYQG=o5zF8Rhzxa z`S%0fEC0CP`*FR$UzsRoR?FDqb2YDSco7PP>V)(eERw(`uNd9`=74f_ZJ6c#OqNOJ zRagx`_jL!+rni7DAHKfxf)em&b;}qt47H*?-xg#27GQNZU>YFMhW96>JIRYoRH35N zTxNT8{6|UnQ;$2A3bpp`>|AiUbd|#ZFxH@0?-w%&FScjvEP?xu%f^rMD-r6yR%Nf) z;fOQp9WQN9H@jDd?LKg^?`9y23?)*m1jR^E&iRhFH$0 zztw>wyCB}#06P5E*mj6+>I8%czA_9sTR`ZXSeqP!oCI!vN-uvG?iR{#lW*cS zf91P%6Je5|?~Ed-0Z}5+nDb0(Xa!FOV>~GeGDl>PL6$uBrR$~;dg(6feZlJ+ z-u8Lyn@1@*CL&8&kgS&e%mxNd#m^&`fVJ1lAFz?9m2ZiG+=JlvJ<<41t{pi`ev=6e z4`>-l10daF;);XD2jL}Hl&MCMz=X)crlHOOr(Z$V;HwYr1OWT+Ylc~4`^W+=SHM+hNo{wfs4__hlgMo2SjMj1Vxky z{3^$c5lj9tU<|8dPcr5OSn?bBbD@tVMwbv?f?*sHp*a^6`uS*fe7{FSk}5405~68N zlKPPU;71{D#^{EkM2of|FFM5%=`1q+Ot9t^F zCFH4u_~-FPZ)n(b&f>}N?KSA6n`G|ze&=4rWZqV5^q!a(B=4k*{)t54LbMy0ZgmfZ zx~DXOHmpcaAleMfj(C#>8+2T|2ebQ&_84w)8xLftS;WC=!nR1A+_>xDnzd%vl!j~% z07dFJN9gZPeRR4A`%|v6e{CRKYJveaKfQ0qdjAMjr&pFJisVzh} zs;xEoG4e;@e}{r(1-^O=eWhzoUvSX>MdF}lZ07WDQr&+g4qb`U@_j-`L%#<_N~j8- zkpM^Z?lfCo4SRPsy5&PKHh%{(|9USttK*?XE9$#PmQcRuscrY($;@qYX+2vVIH{rTs-;snE=jn z^Z?SuhOAc+jOEKm-gt|Dzz2efK7X|b#&ehlSnf*W-edWB>z19Yc)zz{*7r1-M0FX)&eUoBrYsYy@Fw?Byb=qhc=5uo0+c*G-}Wr zasza%Psl^RQ8Kb2%XZ#CJ{Lt>xN(M%P?WmOH?kg2@EvEnb94y$`Fwsi#IVu2H>Lpv zZEdDDR}#_6I;ArQ4EviIe#vD*gD0`oX}hbn+~(cRHr9@7uc2HmM^nqhf^_6`Aau2J ze~;G;FA7PoE8#+JSWz3)G8e1qfrW5~mN-+>lk5Hf%KQ~h;+1*MeP|go<65<4(<3o$ zLF89Emf;ffBH}9`U&tE1`W@jXuUS+%~w z;(9&R#*6)2%{30ACgsD0naQBlSDvWDap$IV3KgquI3Bh4S1lC^g%({Gsh+iN*Fojg zwf!pm9RjAp@rt@KkUeJYQD<&!Q?t(pbeuw+ z$;dEecl7gof(g)~6*}m5fO6V=pQT$VO2Pt{lfPyivNoec=l+_`g2jiIsF~5y180K2 zC-c!;QdvzULlXB!FTqzR2H7+dR)LUM$y`z@)nde(*e}q{Mg+zXb)?Smz7ZsJg)DSLkl?c9+-Za$mi2TN z>QH_rWjKXvISPPq!0Vh-e7ek~9zCDjhn7}Ie~I?O1>Ua~tt=ZvIJ6`CLYp{0EahWQ zI{yoY!wV+Gs)z-vpFPr`%rWwc^F&Y{Mq+U)SUNoEuS+Ng;oJlj&ODaA5y@6N*7d}x zQ|zpB^!;jJssgbSGf9AmC1r)8kIOyN%o0x4nf4n#}bhK@=3@EGdY!AHFNitYM;J9paowQZMh5t!jL5H|9MK#fq>Np~Z6m_^Asu{Kw0j@+?O z$Q|NXO~?8Ub!vEsTWj>fSWL{OTe9)TF`e+qQJvUA6Y#Hs@stC4S6uY2((tNQ51P7| z6^oqpiVr}lSgYZ=n(*kUH(H(&XcJ8k^)IhfX8(4~SG=8~vF}RL{!HFGYl7GoS z`mqc?$d61t+Ce=RJDbuwD0Lp94VqzJW0IjHJse7sQJly{D8hr1Ar&~fU&b%}mJMh? z?z(}$4cS9RG2qE|(yhCXaC<;Viydz(Tw8QRUxs29eS#jFn0w-}7mLA6Az-Euc)Br1 z|A~Ah(Fy0A9v453%tFq~+o$MYkVJV?fsjjZ{PAqc==%#%AT&GD<4#^)0ulYn5aojL zKW^xMjshp3mB8ZbcGmhLYyMwu36=ljmgrKmQ$f{0^OZ-@L{YC7D%TWOs+1-Iqc5dt zDgTaMasn6LoHOMD?cUdC&e^zXnmKi^@J#u(7v@%arfKnZ0_m4L?|fx18qZb4H9v81 zu;F#(lY86=@OZt-TmDw+$P12ooOCh_&b%F-!46;!A;`v5LHlDT$gtaxP76_s^E}n_ z6s*}O(^hx!k`k!aIHprMqZ+Hx5~N;$ydvN02D)9ftjb---&$9jO{iLTXg7uIX%n+k zYmE$%)>>1l2B2$I{%XUrUL(b}(r}K-8oW1bEV!cBtxuBgAW;P^kXw4lhQ({{$T_zQU32#9TBpXWgCR^g>UWBo+`%IJ z1nS>QPiYir9o%VCzr87SRU{1K!OFWU0L8l9y-JmSKVwx^OKvj%sQkDis+BG)b2u?- z7_;FXR5uZv>#W%xk9|6oQEyLS#C)3-Nt_jED-@@IUo@2D79-~F-Z0{z&vq5Hpe6I3 z-(Pmsj^tke7NRAJIICYj97?Jsc21)Y#U79C@v~nRgcs-A5X)iRmZdZKrL35ze%3$I}hjV0(*g*60b7TrF zvi%>WT?shUT^ApfLMS3jQrQYgT7)+H7E+crEyE0rWkzF((lVkXMMb4eY0|z)t0-Eu zNraS2C?zRti@f!nJ7Y%w*{5%wcOJbxIlptycF#Tc+}0R)++qe{o8sPIT#{Z-F`(MmCM z?IdR$%~afdVt%4gg_&B0cZ-_xj2LgXal0R7?3B%z7aE_qKy_{?Q7*7mQgU9!GSmFy zZ)eGz^)?x>DCS4@=bM>z>M>s1&UV&XnE%{6XwjM<*EQDO-bCpN%^Os+qu-SBx79zk z#o|YhJwtaU+N`)Z=*sr z=B~NwaP)qSSLnG!VwF~_@y_Bk2Kk$Q5ii=f-86O>>Ql2WzmM69|GqEp z%PT+K;u*BiW28>IjwH>dDO!E)%aU|I7bK+3s@|NcVE(#!YH|LI+kx-ZHs^$-zerNJ z=sIgzBmJ@Y)a^-1(nI_$%H|Z>@9El;nq8~0#*&g!E*I31bnCO*wZTrG8uJs5^w&R? z+y7bQP5fxzK5yz38{_hP4oxV(N|VV+&)aAj5}*}wy7=fS*`Nb&cD{2y^en0If!y`9 zl=kk-qA#`O zb)^&ZX+L#`?NXRc9XY z#oL<|s@AE{yc_CPjIQuHdQrdLkruD36I6WG=X6a(X<{XKH#dOW%UsHt=PHk7Ph0+R_wl??eZu&!|&LLVJ&gNPg?4g z_8Xih^#8i;-Shv<ch4=+sZ=(vK;azc$hs)6r{|Su;>x!QJ znEWhiMRG~{h?2Jp76v?jWjLPFc4)}_=#Au~=1Y&CX_}G~cRNLO{3N686&*RI+YafL zsgJO0etVUqmO8EcxUTEOBaN3MvqqHEPLWyLRP?pw#{TYu3r@XAR%w|wAYhKmrs_lI z!mFQlM=4B|ln*ZTRyUcxJMEa}u8Oj(GYk6HnEs419XKgy^VNH=mps^CcVb#bpY+B( zrKcb4_L|kWVPVjwU_4X7?!PSeU+p zm)f9akLp8lkp>gp-@UfD+%K~{&saL=a{4vGxg%@N6`WC;HLzIovFcv6k}Y)$*L6F7 zzjdQ_NL2c`{Z4C2-M#lY;g=}PH+{W-+CkHMVcGBgT#TLf-;XUxElyt_63k+>Uk;pI zDE;jHLek!j)vGcG|5~=$x58j@^j5pdJ5yrSc3sdndZO5HX!<+24LR|q{*T-de{RkE z?}y5g@AWlNx0CY2OOuB+5(&7^F3Yo5M8Z_vr`w3Au}1P}eta+kOL zUi%qBOAu&^_x-t#E+`MVmY)!jp@r)Md3*5&=|+FSae zX_Ct*$@IvsgY)O+UO4z}-{_PBC${?gl*}s4yRi24!h()kyxHZnqp_x6QeORZaV1PG zcHLN!74ZIh#BtXpkJPJuO15}pJN^#TYq~s*;C1|n>p`nR#V;0t`-}Cu$|ih2o&7k~ zWn`}ELe0?Mf6BBxDoc0fcD|a@+UWtrupzkQ^NViq$faMO6h zm??o*j<{Kld#q`_e&EF`+9TcPpBZ7jJ2g-??7D-=l<|~)6q07aZ*8gm4Y~Dw-~BkF zF+e_CW$67@tL#$3#gt;Hp&>;D%5Nn)6))qZhRwncdNHNSMB}CF$BlC|OnqdA?bZ8i zwoP^1p6SlFH_+%45SRm|0RypF{XZ*i7s$_m2BaT{Wf%;;!OEjzUA@UG-jkFGWlN637&OjFI5KH0Ify-s10{i#^5??=e8 zuCHASPR@zDGQn+&;(+_oK6k$PYQ>~lt=O#nfU0tC@YusEoXjj#oJOZwJC17ZxA6Y< zCpKTq$8X11r9J$qIX~JwW8}#@TW7UqdigDn%-r49|I}WG3ud3BSJ^+M>Nad0HTQBv zRAZ$AagjsAm5uaWvyLAPP;y8Mx`vafeiZ%9OR7#iYkklPrL#pVuF{^byJ}k>WrhAT z%X=57v9jZ|&OP<2`{v#=hxK()eXmX_^q*IsX!q*G;Xj{zw%U~&W+r}+AKQG^=aq8j z?)@naZuQL(#mT`hJt6F_VU*o z>o<`I8FLk;YNN^VyA2CYD&)u= zzVvYW>Lj`LrSq-?#3-F1%M5Un@m6vF>d>tEvQZ}f_kzh|RX(*1JTkwzD=Su-BDqKoUPq@{ z-uay?x^?opmCoLIb|)t7cnRL{X4%*Jd2Jru)@v1v+rKK`*!El_V`;*IJ7#hl%#v3| zDo_8j7z<0(!B&{x#fB?L2a8JKr$Tkz1LQ5sv4@G;9r=@$i^o}33OG*!s+W8H} zy&mf1V${f?GRrJKF%x#;?5WV+uB5SvsG=xU862XccV{r<#fZ17u%?#78YzhuY5Dz zC^f0R$Tje)lSz2V(xWGjM4Bp@5k5AKSD>D~^Ejp5+dO7j)j7`_b60#hc=qnV3!~pt zPLVoZde^6Y_P%?sI+y60T|YB>v%)BPyvOsX6XU|$zSbCCq-yHw-agT;tP|naU8NG}?7HA**NEG1*BQR-wmH-EURHKEeJ8P8R;{)q$%z{4ZARUbyXg_tF(dlTjp#p7)qVE( z`uKX*rMS3z<*ir2n(^$yJbtzFpCRuQ^0xFuw>c42;qan6G5C1w{I z=k0VTJl+s~o1}J-+_~lH&QHfGrr9+$1y3H-wEV}zh6nWnBEOqV(s<^7kF@vCkSErs z)5vXoDlQDXmjzG6H>Gy!Z@j$SUD578O}(T)db=fSJ~qY0T7DcgZ{5g7lfik~2H&k6 zH!oI*n=Tvw@KW2i&=zT|6w&GxHs+(o#Fu8O ztKUa>zYA1i%5GhH;gRnT+8c_CK2%R#Z=R*ArzfBURj>E+b{dqM&7|? zKTXp^vp(>oHq8>=iv#vyuB1~j0;>? zzkzRh*~=_~`h)$&NMbO> zj}#vL7X{`quhP&RBa8;%aN7pqa9V$nqti^l?sz=_0rX!HBU6>y}l#eAu-m1z!1eB`b%fYRlK%#CG0?~yO z7S6iFiIdy59XDQ3f!mM3ExI6y^`X<=1M>pJ%qDCV4wpCkMuZdRySmJd2oH@w`>DKT zUS~e&{5SB)dbkf7YtK1wJ+ug5yve%B@5}5DV~7V+#F}9%WE=v>GTEI+#fQR!TfAv2 z$&7ul3usq?e6WJIfwN=+XnRtL#CiDOAby0qimWmWf$(i$8cSGfnn1$y-SOee8K?hv zbDSDJE>RH(4~KU-(52g~51qCP@=pOAGYEUKFNg276z-@2jnX|I6g65b`Opmw02U7`8?tqFti5N^^=7XeF{3QA_jM}FKtjlo(4hK%b{y@aA z<4>9uF?kD9*^YQo8e&;9&>YLAh@wQp9N{$W$N?lWmq&ApQ%sSdus&(nE)WxECl#Tr@bKx1DQ+oCsK)IKcW*k47~zKAq&D2W=miF`QwFy ztD{E?u_>GS_yDW#!1qUpOK8WG^`X-Y1BB6H`I0?_8iGgDfDY?#tb*bH$at8JdHdO= zpgRUn0ks`aU09ItlTJ$@{U4|i;S^!Wcb^SDw`2h18AF(Nb+N$dw89{4LG$pvnr z&$JE*g2&*&37A3IA3BX5{VyoJEn%E4@@mY{uBCu95+)mTy&LO8r?ssW3#s=U=-&`% zt*>r*CL{B!tpDqOU97kJ@vwWv{((FO#v^MC@MP z91>ZF1Tj1!+q=_GFBhfLZeZeAyT}(xtEXj*97*wGyf4L`nK>gPGvKu6D^2VVHjxis z>})*ZfKaya)G(qQl}e!s0VzGLS0MucXnw(tXVpPrAajXflnAOH(Tx&rPl+HCgg_Bu zvXg#+o$m)IY-Fg(5C+AXD)~Zi+oB4~Wf_x+(P7>YBnn2w$W!vp`c|)nIiw0=CDv1X z`4eF=IFCx=5rnzxMA)fL{{(ODs1f9FQpn%c7-r77-`ZJ52b}pKI5T!G@)JU7E|Vg+ z#i5ZO?iZ!*0%RXUi3Xc0KRG9u!5*>@D8j<=*2eiXF+8otJC?W3vmN3lrc(RKo_L>v)6n5jYh299qe&B^qDnqe(*tF!Fk0B{5vgaGWSYtCnp5nQ3>2Ii#0n3?S03UWThwjZhQ z@_az`{!nnk4(C#vxL};a;SP(sY=NQWv|pEC1V2hhC_F(<jt3goTj!%I7NfL*H3JLo|r%jO(XH5LCJt;v%GXENo z;$1HV>X14WTD{PTKaw%$|{KT*a$OWqNrF^`vJlT1cen+sI90FE+}Kg_nh$h+Z_jKPS9j0}Bx;5WMk2D*jtPm#dUMTcFKhuAY*;)VDJtvi(l%c#ZZVByTN%oWWTORR1yla+2Vk0z%Jzi* z6=1KLvYa8xSp;fUk@#Q=8CFdm(P81l5Kg@^A=c_i2i=0bmu-+KV$)mdI^hfh@k!1? z5YCVCTcM2tAPfS#0~41h5<*X=&YOQ7Er};Ef8t)j7rUzLOc9B?AmI=_@3xoNfvT18AKq$k4$%1W_ zC^4A2M>q`g>1|O|Ek8UthywCT25-aG#KJR#@65hjdQ!0HhVD0#mo*11_?#8 z5cguK>#N^lR7~y%Tw}EyEgC_a<#;MQ15L#9@v)k%8@@L~mN5tX3@er)M?~V-+1ZmZ zvjGavh8vV$&PdV^=ms52%5j2t9Ty2i*c^>O)K>;~UZTnf%QCprjK$JyBiAIy3% z`|qR%fynN4wYcpB#bGE5VO`qjf*2s2*2Bz^&FIbRr68?*0Iq;tKurH725}+T@v_?Z zU2kXOaQ3;(en*y>(rNqp^bweevuu=Ms*DvQ-|&ZI)qhF>r4CGM6D;tsQ2*jT(ACe67+*oiBY^v0{Ky=!! z0aQj!oj1nR@Aw<29il^(Qzhj~MZ#c(C;r~f9iPUq1%=|1X|PB@WJqbaawY%P$CLx0 zXfF^E)^20OplapeX+eF1xIfw+jZEBz?3fUKc4kx#i(S^MPa{xFavE|CST z77GIkZv01*c2lv{7CdAI*9=~?PAnAm>V>xf*t^RPeFmdx<}x$CcrkGz`I}kG+~Zpl zVKgJbAF&f+QleNWc60cHbj_Vkcmc{^0MXtOV`V`p;(-K*5uN-QQ!jr7z4FMPj&>fq zL3r3jM&?ej(S%^7jmr3qUWI%IW{nkJzg^;C32582cXyCW1rRp?vBHRNO!_~75QG>W zS;0Pi6~Ju)IBZN91{D-RwX2>PlMyu`^4LX%Qi%{3_-(b!nMj%+0zmz^V!{__eH8=9 z9uIcG+l%h#&1qW>_KoAR?{kO6!f>$TZ{JN#`hNldeJ8kCj#{9k^D*gitp7M19F$ZN+<}xu!&3@T$Ln-T7-J)%Nw`tP(f=l zcq-Pgr(F{diOi@j3UOAmWhS06pr&+C6Sl0sBv(wha3XA2&Bc@X^*Ua=sdS3B*-b7G z3(7@+*{OYg*TLKD+U|)5BEan0M!F8H0ZY(;ssz@y&ps9lxn3$eFB4GkTqx4j;-N$Y^Y_z;r;@9Jz{=in1p|qX`v$_^l@*nW=d+D`e2g4pa}k}f!CJJ-SMiXj{6%LO=XeM`%%ctV zhK<%++Qb5ZS^z$T2pbQ4`XT;%(;oX9>hvBuoCT$$9by5o>#DpbQs=7wzC8ooM8M`d zHhBK(*H;|?66`K z#lwp5WwgffH;L0*-TRopyxIkJhu!5`qaqfRCyz5(%o1|K1NTX=2F3jW>0u!xhKUD3 zjo_0|eH*K2p9_XP9E66glinIG7KAsRO6on5%sC_Ym(w2J02q0I!H%SCgjg{1pe)PV zqF>5;)AImA9U!nVw04wO5U@uM?Mi(7^X>fy#g%}v5Hyc9<_>K!P-vdL6EXIsuLj5eVCGH`G{k82-MglkJG}1*bU%r337o@CIB~)Y%8o_X;QR ztENtUF?s(FFokVUIl#^dX;VZ8VHAg{-lQ-RUpvtJDN%X`lwt)+!P;Ddxfnn~4FG9o z;V|u#aFE(FRZcJZIzx0U=Eepu{cuVc28rjtB9=g2SCZQdV8p3u^Z&yE$y)1<;5s=--J=8C8m7#H4H!j1LP7h2y8JQMoV>xxEL$ zmR!O0-vE#i(0gQyflZ}|Hz0dx&lCl5;E(z(XJMMT0of-uN=HYDhvvtL0QV+{2Pg~;4R7$ITor#n z!vmTF25oiH|AWTIr@8GP+^y$><_Y^0!Jv`M36;z4pO3re)dl8I4(^0aL=!}$h?>&) zPS;3Mb`hsE(6aZ29_QXj#ct7=mMG1Qfpb42fG08f-YEhwF!V!$CVhB(&vo$^X^%H%%`gVfr+Rvlp#H2qo4o zAv#Y0lsV%IH=}A8Mu$VR;}x94iDBGa8kOyNa|OhE2_||YHW?&dPeEjuw@i2fMH}{G zj(@L&kmkOP9J$a2w6+G4IYSI-?;HUfBC8WjSeNuVMFq@m1C++G{YG`y1Q2F~Z{{Qc z`>$XK2!&I)QaHr=%aJXcRpg2lA_+=lHN074e(?pQHxdMXg&ueNu=2vd}%?i~qYa^w<|&r87w=ynzl zygxBKS}=lC+E&_0u%R=MgJSzQp1c)+U`O_&5TJr0n7Fgjv%wQVK((L)tbpz|2qKQI z3}77T7mDEU>9sTsJnJgVme_t&XXqs4t7T9xRwOF^|B4T86shRYqX-VD;|1Jc0` zK)q7{c_(r(+{@tM2g_t{SHU8Z!fy$K&0$<5XxSR$!<}6M5m--kQyA={Afdyoql4W> zlK7?;2@zTkQ4wGxs06#_D2GR9`3ejUN>eF}H${5!c#BMD!nFCikUJ~Dps;I>2e1P# z7Qh4@Ydnv728ti<@!y`KD;C<}i$$@O5*x*y!gcDE8Ko$4BU7Li2&WFp!6tmirNu@; zcED?64GrgA^osAOv+Xz78n(pUSN0!)Ch%5|gw}JzOt7=>@Wl=Z4+S+b)iaMm2_W&P z2BIM?9%(AK3Wj6B9l8dI3&eXUS9Pt=qaHUoK*46oW0b{2m?)C(EDU}zEe*gzxrVe$ zMO;AMLo(l_=7dtpvrx9j+QAyAs`Awi-&4{2Bb)iI?J3a4flGnliOn5Kbp#=i!u$jW zv=I>}-|ItS9}k%swjM_xEr>82SRyf(dxGh2zfy(23QCB8kc>6p;l{$~hXxb>UhAQY zj`&L`{jtrOS0Eh+$gZ%7+c?;j=Bo>45l-+J-jm&bc|zne2L)g!T`vm(q*<4_A>zEx zvmnPaGLsrifk}5fM0hOmZ&O7i&OhZeDXm>;4MH)4DFoXmo^2;0agPW%EW_LUGYWmj zPlAPE9q4x)W-_#P7DyekWK=p}=AOK1zYU_>qJ2?Kpp9Lv6+$x|Uvd%^4$^M?NCZ?^&mzG3dBLlb>UFcxcbxLA@aq z@^wB2^+w+JJt}@Kg0b0RaGiYr0k;Peio0-bmA9Gc?rR;84iVU)S`*GE<1WG%JC{vfFAB3Z%SpjJ_Da!o zlTNKslmoJGc7!8lZ-Ipw-?-W<2k2km)dq-YXK&njsuLXP7nlHc`SmVV6xv98{FXz) z?931{Bfi{6LPd>BgBAzxS$+VY&;g&oavLC&7Heu}mFqaw$jz-f#^w&C^5Yh!FD_0y z#uP{{f>0a@hO5t}gFK>2ARPxH8IHN~*j(gh59_q6=z`dT+fKMx{61EqJsq}2`si|6 z>}8>}7;`qS3skw;)Mk$!dG1~)((%?gk|O(XI%gg3h2>tGARtr?U+kK?S~P+X+lgd8 zN8OPhu$hEEj9~u{;&}IEK^#ZGjx(2JmCLg?hQW0466Qo~EGQRF45iO#ADh!YnPF!8 zW&@eSK-L-3&%c?b({@}F&L{gm0bT&ys>9Y~;Hlk^l3)|HTtQ?Q zonubuq&E*2U`pU#*3*&`5DC?QIyRAVDHOn<9XTQdk%fk6{`Ap~VPJ8r6`UEu6#;#$ z=i1#7K%cpZ?haD~Z^eatmbC4H1>1w+oY#iExhIG$ql*fui>t+jTVJCwhC8xS09_Kh z+5`f@7%3LwQ}qgFv>oSMQh$ibO5^*i-e(o{P*m z8-%fY?n>g-3539W_pJ>j0nj<{9ZR;DP&^*=LVPe*HNc-oRSVgWf0f3=d{{kyfW8du zN~p40Y&33rLIVnTIP>W(ke)M`DYh*8;e*H!PGo)~czswS4dooDjnW1quWyZFkY|-N z!N?d2vc-qvd5DE;Xt_LlGh~2h@@E0WLg^XBC8NzxGxBFDzA&vA|B48soN1gu(fWOE1P)b#X9Y y-Nb0}WWVY1w^<+{&L>ZLftC;Z7a;ZnDDJZ)p^^bd%OwU#Xb^C?EDcE0aQ_3m_@O`m diff --git a/src/org/teachingkidsprogramming/recipes/completed/SimplePuzzle.java b/src/main/java/org/teachingkidsprogramming/recipes/completed/SimplePuzzle.java similarity index 100% rename from src/org/teachingkidsprogramming/recipes/completed/SimplePuzzle.java rename to src/main/java/org/teachingkidsprogramming/recipes/completed/SimplePuzzle.java diff --git a/src/test/java/org/teachingextensions/logo/tests/RecipeTests.java b/src/test/java/org/teachingextensions/logo/tests/RecipeTests.java index faee443..a11af16 100644 --- a/src/test/java/org/teachingextensions/logo/tests/RecipeTests.java +++ b/src/test/java/org/teachingextensions/logo/tests/RecipeTests.java @@ -7,13 +7,13 @@ import org.teachingextensions.approvals.lite.Approvals; import org.teachingextensions.approvals.lite.reporters.DelayedClipboardReporter; -import org.teachingextensions.approvals.lite.reporters.FileLauncherReporter; +import org.teachingextensions.approvals.lite.reporters.DiffReporter; import org.teachingextensions.approvals.lite.reporters.UseReporter; import org.teachingextensions.logo.PenColors; import org.teachingextensions.logo.Turtle; import org.teachingextensions.logo.Wheel; -@UseReporter({FileLauncherReporter.class, DelayedClipboardReporter.class}) +@UseReporter({DiffReporter.class, DelayedClipboardReporter.class}) public class RecipeTests extends TestCase { public void testSimpleSquare() throws Exception @@ -104,7 +104,10 @@ private void drawOctogon(Turtle turtle, Wheel palette) } private Wheel setupColors() { - Color[] colors = {PenColors.Reds.Red, PenColors.Oranges.DarkOrange, PenColors.Yellows.Gold, PenColors.Yellows.Yellow}; + Color[] colors = {PenColors.Reds.Red, + PenColors.Oranges.DarkOrange, + PenColors.Yellows.Gold, + PenColors.Yellows.Yellow}; Wheel wheel = new Wheel(); wheel.add(colors[0]); wheel.add(colors[1]); @@ -146,8 +149,8 @@ public void testKnottedRing() throws Exception Turtle turtle = new Turtle(); turtle.setSpeed(Turtle.TEST_SPEED); Wheel wheel = new Wheel(PenColors.Pinks.HotPink, PenColors.Reds.Red, PenColors.Purples.Fuchsia, - PenColors.Oranges.OrangeRed, PenColors.Pinks.DeepPink, PenColors.Pinks.MediumVioletRed, PenColors.Reds.Crimson, - PenColors.Oranges.Tomato); + PenColors.Oranges.OrangeRed, PenColors.Pinks.DeepPink, PenColors.Pinks.MediumVioletRed, + PenColors.Reds.Crimson, PenColors.Oranges.Tomato); for (int i = 0; i < 30; i++) { turtle.setPenColor(wheel.next()); diff --git a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/AdLibsQuizTest.java b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/AdLibsQuizTest.java index 484bbf9..d75ff1b 100644 --- a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/AdLibsQuizTest.java +++ b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/AdLibsQuizTest.java @@ -3,7 +3,7 @@ import junit.framework.TestCase; import org.teachingextensions.approvals.lite.reporters.DelayedClipboardReporter; -import org.teachingextensions.approvals.lite.reporters.FileLauncherReporter; +import org.teachingextensions.approvals.lite.reporters.DiffReporter; import org.teachingextensions.approvals.lite.reporters.UseReporter; import org.teachingextensions.logo.Turtle; import org.teachingextensions.logo.utils.TortoiseUtils; @@ -12,26 +12,30 @@ import org.teachingkidsprogramming.recipes.quizzes.graders.AdLibsQuizGrader; import org.teachingkidsprogramming.recipes.quizzes.graders.TreeQuizGrader; -@UseReporter({DelayedClipboardReporter.class, FileLauncherReporter.class}) +@UseReporter({DelayedClipboardReporter.class, DiffReporter.class}) public class AdLibsQuizTest extends TestCase { public static class AdLibsCorrectQuiz extends AdLibsQuizAdapter { + @Override public void question1(String letter1, String letter3) { //set current value of word1 to be letter1 + 'o' + letter3 word1 = letter1 + "o" + letter3; } + @Override public void question2(String letter1) { //add the letter1 to the end of word2 word2 += letter1; } + @Override public void question3(String templateText, Object model) { //use the parser to combine the template and the model as word3 word3 = Parser.parse(templateText, model); } + @Override public void question4(Pieces pieces) { //set template4 to the template which does'g' + pieces.middle + 'e' @@ -46,15 +50,19 @@ public void testCorrect() throws Exception } public static class AdLibsIncorrectQuiz extends AdLibsQuizAdapter { + @Override public void question1(String letter1, String letter3) { } + @Override public void question2(String letter1) { } + @Override public void question3(String templateText, Object model) { } + @Override public void question4(Pieces pieces) { } diff --git a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/AdLibsQuizTest.testCorrect.Mac_OS_X.approved.png b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/AdLibsQuizTest.testCorrect.Mac_OS_X.approved.png index 39d022b06aebc920befa56f3ddd1e2da155e677a..727c09f3b81575687fe75043c17edf1c914cf866 100644 GIT binary patch literal 17019 zcmeIaXFwBO*Dj2`-GGRQbd{zeB@{6rpwgs^N-vQP(g~r3Vn>uBAP~ArQ>uWJ03k{* z0i=c=X$cS@N=bkaI1})G+WWNc{m#$xM`trLd)C@}m1|vVL)aZ%b;jeI#~BzH7&UII z++|?c4`pE3SAFy_@RN^IteOlAw{B^u+`R8Myf{V)xo@!jHAGnI(zDfDr%v_EqAG5a zQ2hIQs{78NunfiTj}G3@Ka=_C^i7Ly3pl&Q9c(#u!)1evo}hJ5pTQGbF#^iBTeSUX zKLcGPp(G3{)&xI;q>Lg-wbUh6;DgVuSRMravt|PRY2XI_c?tfX!;^r3e{=Vr4bS2K ze0TTm?(ha?9|Oa`A3j1HU|{&`!@ENU&=CfP-FN@xa97^H-u-98J$dO<{Rid#LG}Mu zx!ra8cgj^JT&qioxsQI%0x5dm9K-^fT%dlizMJc7#?7SB`A`(;8mjd){(xX{FcfO` z8D&`&6lBjGzr;#8_$5#!)sHIUt*R0_K+Tw5)9Y{&PgQq~f4l;Ti{u}`jt3nAzW&~2 zHl|dP@?%FB%Cv>cVu7uYx1o_qBMu5{kT9**ymEqGJL$rdY_LmO``FtLT$YbbdgcBw zvvD_5ZGQo-x9gktU8J=-28NWm<0={X+A?`?8of`Pe7B4@c$x#Y6jt3&Yg3N{8hYFd zH04jEt?oD}J`249wsGra;UGRmPPH)hlSg5!lD3;RI}%+|R=qhr!GjOyt_CNB2Ts32 z>QwOGx6!54E4)}z`(a#UN8El*S}#7Vw3XzaA6yD~`}3o5*eeaD++AfndhIZV)Th_- z{FOLrw`w*vzNKOt*z}vPuyUlHQxH-Ti!Be~mrCDC2)Cd-mKODE5yi~6zpT?z(|mdr zU%sgWAF2S?^P|!#^b?LO5IS7Ou~W7AXJ~>#m)f`TN4~pxybrh7Nr-u{p)9nxKH&12 z_jsXW_3F>`GRC!JvUHTxho9CO?-~%zi*i2I+JnpftyMem$C8y|4TIQU*0b0TL`3Sv zZm(FzhmvX5*3iCO-~F$UDOZ&-UK!XL_B%iBH#(2_4y@RF8>DMN_)sWn11c^+F(`jX zkH&{D<{jKF^Uq&>F_vo!*$0?g?oB^i3)YL9H@CjmqDT1Jkc(<>dDTupTPq{@5=W%7 zF-Is;J4G87Q!U{?``at9y^cL2oIczRI6U$CWrc?MVB@lt*^Zc@{HSXd(YypVMvH(> zOSk1hKHK^6^o}l#MA6HmVhXq}Q(x0xMdYq%kOukakA?zB>m&bW%y~N+O0@`VpDweU zKO-}1&$o`g9F9a}9+q6}#@TIU>uLAhKYh($Z8*||T8kRT&~`v05`NvSnhNPf%{@>K zlJ}kt`t`a~3QTcxNN-DiM?t=y$2fF4Tm#no0|%8h+@y)0i0X=e;8EtWtz6CXmoWK20>X%F0zf2}Jmb~hJJ`5;E5 zeMT!#sw5=dU;Yn>nH$E05b4AqXfGYxH_F6zSl6Jo{4uvZ{+X=-(3Ys558Tmn!9;s^9fVPa_~>zteyXzTl*2 zm>z^xE_b<%Q2@W+zxIZ8q2#W+-07%_9B~4^jduanO3j!i?trA+ZpULqXm?-<_vX0dtZ*W^-0!W7q>} z3?Pqh=`~OKEJ#jAPy?UZuvgz8PE2p?4@0­bDT24kanyW)zLdNFwit1b6^B*{D7 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 T??eCN4h$Nqx+;aY9z6L!TYGk7 literal 16768 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 H@Y#O>lFa3A diff --git a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/AdLibsQuizTest.testIncorrect.Mac_OS_X.approved.png b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/AdLibsQuizTest.testIncorrect.Mac_OS_X.approved.png index 28559b92e74224d0623bb5009a8e0c55df79d426..bf8f57006692d97d91055e234ef43f802664f491 100644 GIT binary patch literal 12781 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­bDT24kanyW)zLdNFwit1b6^B*{D7 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 T??eCN4h$Nqx+;aY9z6L!TYGk7 literal 16768 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 H@Y#O>lFa3A diff --git a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleBubbleQuizTest.testIncorrect.Mac_OS_X.approved.png b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/SimpleBubbleQuizTest.testIncorrect.Mac_OS_X.approved.png index 28559b92e74224d0623bb5009a8e0c55df79d426..bf8f57006692d97d91055e234ef43f802664f491 100644 GIT binary patch literal 12781 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 literal 13284 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 Uz-z$m9WkrZ)~BjY-uUJJ02*-LbN~PV diff --git a/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/TreeQuizTest.testIncorrect.Mac_OS_X.approved.png b/src/test/java/org/teachingkidsprogramming/recipes/quizzes/tests/TreeQuizTest.testIncorrect.Mac_OS_X.approved.png index 46cf76b0cc5ff834e1dd5b5bd914a746b7c770c3..25740d9ac87c7e467ce08ba909d67c190e0076ad 100644 GIT binary patch literal 14197 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 Op^lb;X0gVt2mc2jvc?<$ From 516438fc0d913968cf1c484620b13a2752a02a60 Mon Sep 17 00:00:00 2001 From: Jim Counts Date: Thu, 2 Apr 2015 11:35:52 -0700 Subject: [PATCH 110/111] A few test tweaks --- .../org/teachingextensions/logo/Turtle.java | 167 +++++++++--------- .../teachingextensions/logo/TurtlePanel.java | 24 ++- .../logo/tests/TurtlePanelTest.java | 13 +- ...urtlePanelTest.testNamedPanel.approved.png | 0 .../logo/tests/TurtleTest.java | 11 +- .../tests/TurtleTest.testClear.approved.png | Bin 0 -> 2460 bytes 6 files changed, 116 insertions(+), 99 deletions(-) create mode 100644 src/test/java/org/teachingextensions/logo/tests/TurtlePanelTest.testNamedPanel.approved.png create mode 100644 src/test/java/org/teachingextensions/logo/tests/TurtleTest.testClear.approved.png diff --git a/src/main/java/org/teachingextensions/logo/Turtle.java b/src/main/java/org/teachingextensions/logo/Turtle.java index 23ec699..251e5a8 100644 --- a/src/main/java/org/teachingextensions/logo/Turtle.java +++ b/src/main/java/org/teachingextensions/logo/Turtle.java @@ -19,53 +19,8 @@ */ public class Turtle { - /** - * Current types are: ExplodedTurtle, Turtle, Spider - */ - public enum Animals { - ExplodedTurtle, Turtle, Spider, Unicorn - } - private class Turner implements Saver - { - @Override - public Double save(Double save) throws SavingException - { - smallTurn(save); - return save; - } - } - private class Mover implements Saver - { - private final Point starting; - private LineSegment line = null; - public Mover(Point point) - { - this.starting = point; - } - @Override - public Double save(Double save) throws SavingException - { - moveWithoutAnimation(save); - if (line != null) - { - trail.remove(line); - } - line = new LineSegment(color, starting, new Point(getX(), getY()), width); - trail.add(line); - return save; - } - } - private class EmptyMover implements Saver - { - @Override - public Double save(Double save) throws SavingException - { - moveWithoutAnimation(save); - return save; - } - } - private static final double MAX_MOVE_AMOUNT = 5.0; public static final int TEST_SPEED = Integer.MIN_VALUE; + private static final double MAX_MOVE_AMOUNT = 5.0; private double x = 640 / 2; private double y = 480 / 2; private double angleInDegrees = 0; @@ -77,7 +32,23 @@ public Double save(Double save) throws SavingException private boolean penDown = true; private boolean hidden; private Animals animal; - // + public static double getDeltaY(double i, double angleInDegrees2) + { + return -i * Math.cos(Math.toRadians(angleInDegrees2)); + } + public static double getDeltaX(double i, double angleInDegrees2) + { + return i * Math.sin(Math.toRadians(angleInDegrees2)); + } + public static double angleCalculator(int x1, int y1, int x2, int y2) + { + int delta_x = x1 - x2; + int delta_y = y1 - y2; + double theta_radians = Math.atan2(delta_y, delta_x); + double degrees = Math.toDegrees(theta_radians); + double degreesWith0North = degrees - 90; + return degreesWith0North; + } public BufferedImage getImage() { BufferedImage image = ComponentApprovalWriter.drawComponent(getPanel()); @@ -108,14 +79,26 @@ private Component getPanel() } return panel; } + public void setPanel(TurtlePanel panel) + { + this.panel = panel; + } public int getX() { return (int) x; } + public void setX(Number x) + { + this.x = x.doubleValue(); + } public int getY() { return (int) y; } + public void setY(Number y) + { + this.y = y.doubleValue(); + } public double getAngleInDegrees() { return angleInDegrees; @@ -124,14 +107,6 @@ public void setAngleInDegrees(double angleInDegrees) { this.angleInDegrees = angleInDegrees; } - public void setX(Number x) - { - this.x = x.doubleValue(); - } - public void setY(Number y) - { - this.y = y.doubleValue(); - } public void turn(double amount) { double max = getTurnAmount(amount); @@ -187,6 +162,10 @@ private long getDelay() if (getSpeed() == TEST_SPEED) { return TEST_SPEED; } return 100 / getSpeed(); } + public int getSpeed() + { + return speed; + } public void setSpeed(int speed) { if (speed != TEST_SPEED) @@ -199,10 +178,6 @@ public void setSpeed(int speed) } this.speed = speed; } - public int getSpeed() - { - return speed; - } public double getHeadingInDegrees() { return angleInDegrees; @@ -218,26 +193,18 @@ private void moveWithoutAnimation(Double save) x += getDeltaX(save, angleInDegrees); y += getDeltaY(save, angleInDegrees); } - public static double getDeltaY(double i, double angleInDegrees2) - { - return -i * Math.cos(Math.toRadians(angleInDegrees2)); - } - public static double getDeltaX(double i, double angleInDegrees2) - { - return i * Math.sin(Math.toRadians(angleInDegrees2)); - } public LineSegment[] getTrail() { return trail.toArray(new LineSegment[trail.size()]); } - public void setPenColor(Color color) - { - this.color = color; - } public Color getPenColor() { return color; } + public void setPenColor(Color color) + { + this.color = color; + } public int getPenWidth() { return width; @@ -301,19 +268,6 @@ public void moveSynchronized(int x, int y) double distance = new Point(x, y).distance(getX(), getY()); move(distance); } - public static double angleCalculator(int x1, int y1, int x2, int y2) - { - int delta_x = x1 - x2; - int delta_y = y1 - y2; - double theta_radians = Math.atan2(delta_y, delta_x); - double degrees = Math.toDegrees(theta_radians); - double degreesWith0North = degrees - 90; - return degreesWith0North; - } - public void setPanel(TurtlePanel panel) - { - this.panel = panel; - } public void drawStar(int size) { for (int i = 1; i <= 5; i++) @@ -326,4 +280,49 @@ public boolean isDead() { return this.animal == Animals.ExplodedTurtle; } + /** + * Current types are: ExplodedTurtle, Turtle, Spider + */ + public enum Animals { + ExplodedTurtle, Turtle, Spider, Unicorn + } + private class Turner implements Saver + { + @Override + public Double save(Double save) throws SavingException + { + smallTurn(save); + return save; + } + } + private class Mover implements Saver + { + private final Point starting; + private LineSegment line = null; + public Mover(Point point) + { + this.starting = point; + } + @Override + public Double save(Double save) throws SavingException + { + moveWithoutAnimation(save); + if (line != null) + { + trail.remove(line); + } + line = new LineSegment(color, starting, new Point(getX(), getY()), width); + trail.add(line); + return save; + } + } + private class EmptyMover implements Saver + { + @Override + public Double save(Double save) throws SavingException + { + moveWithoutAnimation(save); + return save; + } + } } diff --git a/src/main/java/org/teachingextensions/logo/TurtlePanel.java b/src/main/java/org/teachingextensions/logo/TurtlePanel.java index 1f6777c..d0ddfc8 100644 --- a/src/main/java/org/teachingextensions/logo/TurtlePanel.java +++ b/src/main/java/org/teachingextensions/logo/TurtlePanel.java @@ -1,20 +1,26 @@ package org.teachingextensions.logo; -import org.teachingextensions.logo.Turtle.Animals; -import org.teachingextensions.windows.ProgramWindow; - -import javax.swing.*; -import java.awt.*; +import java.awt.BasicStroke; +import java.awt.Cursor; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Image; +import java.awt.RenderingHints; import java.awt.geom.AffineTransform; import java.awt.geom.Line2D; import java.net.URL; -@SuppressWarnings("serial") +import javax.swing.ImageIcon; + +import org.teachingextensions.logo.Turtle.Animals; +import org.teachingextensions.windows.ProgramWindow; + public class TurtlePanel extends ProgramWindow { - private Turtle turtle; - private Image image; - private Animals animal; + private static final long serialVersionUID = 3272676059303477850L; + private Turtle turtle; + private Image image; + private Animals animal; public TurtlePanel() { } diff --git a/src/test/java/org/teachingextensions/logo/tests/TurtlePanelTest.java b/src/test/java/org/teachingextensions/logo/tests/TurtlePanelTest.java index fb280ec..90c64c0 100644 --- a/src/test/java/org/teachingextensions/logo/tests/TurtlePanelTest.java +++ b/src/test/java/org/teachingextensions/logo/tests/TurtlePanelTest.java @@ -1,16 +1,17 @@ package org.teachingextensions.logo.tests; -import junit.framework.TestCase; - +import org.junit.Test; import org.teachingextensions.approvals.lite.Approvals; import org.teachingextensions.approvals.lite.reporters.ClipboardReporter; import org.teachingextensions.approvals.lite.reporters.DiffReporter; import org.teachingextensions.approvals.lite.reporters.UseReporter; import org.teachingextensions.logo.Turtle; +import org.teachingextensions.logo.TurtlePanel; @UseReporter({ClipboardReporter.class, DiffReporter.class}) -public class TurtlePanelTest extends TestCase +public class TurtlePanelTest { + @Test public void testImageForBackground() throws Exception { Turtle turtle = TurtleUtils.getTurtle(); @@ -19,4 +20,10 @@ public void testImageForBackground() throws Exception "http://teachingkidsprogramming.org/blog/wp-content/uploads/teachingKidsProgramming_logo_sm.png"); Approvals.verify(turtle.getImage()); } + // @Test + public void testNamedPanel() + { + TurtlePanel panel = new TurtlePanel("Turtle Bay"); + Approvals.verify(panel); + } } diff --git a/src/test/java/org/teachingextensions/logo/tests/TurtlePanelTest.testNamedPanel.approved.png b/src/test/java/org/teachingextensions/logo/tests/TurtlePanelTest.testNamedPanel.approved.png new file mode 100644 index 0000000..e69de29 diff --git a/src/test/java/org/teachingextensions/logo/tests/TurtleTest.java b/src/test/java/org/teachingextensions/logo/tests/TurtleTest.java index a82a84e..c81db25 100644 --- a/src/test/java/org/teachingextensions/logo/tests/TurtleTest.java +++ b/src/test/java/org/teachingextensions/logo/tests/TurtleTest.java @@ -1,9 +1,6 @@ package org.teachingextensions.logo.tests; -import java.awt.Color; - import junit.framework.TestCase; - import org.teachingextensions.approvals.lite.Approvals; import org.teachingextensions.approvals.lite.reporters.DelayedClipboardReporter; import org.teachingextensions.approvals.lite.reporters.DiffReporter; @@ -13,6 +10,8 @@ import org.teachingextensions.logo.Turtle; import org.teachingextensions.logo.Wheel; +import java.awt.*; + @UseReporter({DiffReporter.class, DelayedClipboardReporter.class}) public class TurtleTest extends TestCase { @@ -129,4 +128,10 @@ public String call(Integer speed) } }); } + public void testClear() throws Exception + { + Turtle turtle = TurtleUtils.getTurtle(); + turtle.clear(); + Approvals.verify(turtle.getImage()); + } } diff --git a/src/test/java/org/teachingextensions/logo/tests/TurtleTest.testClear.approved.png b/src/test/java/org/teachingextensions/logo/tests/TurtleTest.testClear.approved.png new file mode 100644 index 0000000000000000000000000000000000000000..ce2714f7d6bf1af4593bf55729fe67265fc78eaf GIT binary patch literal 2460 zcmeAS@N?(olHy`uVBq!ia0y~yU@B%{VBE#Q1{6u&f8ad>181_Qi(^Q|t+#h>XT^jv z9Ditv7E<04*$#xLj) zsA>IX86vPpsHT1YO=F382T!K^?A+hp-29!UXJ&tG-c~OLh8r8Z<})xjoMB{8c*ejW z0CYkU9|MCSJ43?^X0ULFB?H3|8L%+2Dv&UeDv)NVDv&VDEU0FfSukNFD?m2lumVXH z$Yvx}=vLr%2*_q6EATi3%?dnz#p4iQ5FlHD6e4I20fjQM71Z!6EOaRfbdYAG;Kbus zBvoj!kLFk85TQc?qi>)S?^i@JJn;WnzkU7rPp@)zwM)GXl)wHQn0F5F859~>%KU$sYy%TGoE8Bz1VKu`M-^+c_IQ?(6BB_T}5OIk$hv zfiy03Tbz=+_Q}V`^JMII&R99sd1aoA=hv?RtIYkE?J}AE>fXLJd(5Xk*5RyigZ9>GUA^tS@|@h+ z&-Zt2`g5^j*5}EV#fzVOd3i2J4&)~%{rG=V7A|!AbLd*wb! zkFT-$tIEZK@7|sM>hDSu{V&VwAK&^l?^hf!4R7G(;pb0(dZ#Ac?Ah?XS9ce$w3GKPtz5U6`sT9A`*UX8%X>9vv#N!_ zAzUSR`08rabbHO2aW<2tTC-boE4*su&(G~K_glKlV*c~}Wy`-lOo_|v+b-@f$M!a- z70AI;`F8|;`jB{XvbyTzV)jcpvL3I0Jq(HOD@%L+>L`DF?~>BBGnZc5C^PHk?DX?q z@9yireD$e<1(-mltup6b_kGsumzp3pf6gB8|A< Date: Thu, 2 Apr 2015 12:32:12 -0700 Subject: [PATCH 111/111] updated relative paths to build file --- build/build.xml | 6 +----- .../teaching_kids_programming.properties | 6 +++--- src/jars/junit-4.11.jar | Bin 0 -> 245039 bytes 3 files changed, 4 insertions(+), 8 deletions(-) create mode 100644 src/jars/junit-4.11.jar diff --git a/build/build.xml b/build/build.xml index ae8de27..ad630c5 100644 --- a/build/build.xml +++ b/build/build.xml @@ -3,17 +3,13 @@ ${targetJavaClass} - + - - - - diff --git a/build/properties/teaching_kids_programming.properties b/build/properties/teaching_kids_programming.properties index 216ebec..52bea4d 100644 --- a/build/properties/teaching_kids_programming.properties +++ b/build/properties/teaching_kids_programming.properties @@ -1,8 +1,8 @@ -home=C:/Users/lynnlangit/Documents/GitHub/TKPSource/TeachingKidsProgramming.Source.Java +home=.. src=${home}/src -tkp_workspace=C:/Users/lynnlangit/Documents/GitHub/TeachingKidsProgramming.Java +tkp_workspace=${home}/../TeachingKidsProgramming.Java tkp_project=${tkp_workspace}/TeachingKidsProgramming -build_home=/temp/builds +build_home=/tmp/builds build=${build_home}/build targetJavaClass=org/teachingextensions/**,you/** additonal_java_sources=C:/Users/lynnlangit/Documents/GitHub/ApprovalTests.Java/java diff --git a/src/jars/junit-4.11.jar b/src/jars/junit-4.11.jar new file mode 100644 index 0000000000000000000000000000000000000000..aaf74448492932e95902b40a70c7a4da5bad4744 GIT binary patch literal 245039 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

      ^K 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 Zm9-%!eZV646_hI`4?(783XX*6{{TREv-ki2 literal 0 HcmV?d00001

      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%0A{%xB*;LAuljzH;^BK@v*W4rL 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�BSH3nMV(Fk2Q&+e@Gn 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±t|=){DBn0)OBtKqN|KJ^x~h*HiodiuUy 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 <_V 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