From 6379daa3d685b91494926e96b41af812c2372510 Mon Sep 17 00:00:00 2001 From: rpidikiti Date: Mon, 1 Aug 2011 23:14:25 -0700 Subject: [PATCH] Refactored code gen classes to proper directory structure --- android/codegen/README | 0 android/codegen/build.xml | 35 - android/codegen/conf/templates/ModelObject.st | 38 - .../codegen/conf/templates/ModelObjectNew.st | 74 - .../codegen/conf/templates/ResourceObject.st | 121 -- .../codegen/conf/templates/VersionChecker.st | 18 - android/codegen/ivy.xml | 32 - .../android/codegen/DriverCodeGenerator.java | 367 ---- android/driver-test/bin/runandroid.sh | 17 - android/driver-test/build.xml | 35 - android/driver-test/ivy.xml | 22 - .../lib/ext/wordnik-java-driver-4.04.0.jar | Bin 89300 -> 0 bytes .../com/wordnik/test/TestCaseExecutor.java | 275 --- android/driver/build.xml | 95 - android/driver/ivy.xml | 20 - .../main/java/com/wordnik/api/AccountAPI.java | 290 ---- .../java/com/wordnik/api/VersionChecker.java | 18 - .../main/java/com/wordnik/api/WordAPI.java | 635 ------- .../java/com/wordnik/api/WordListAPI.java | 282 --- .../java/com/wordnik/api/WordListsAPI.java | 94 - .../main/java/com/wordnik/api/WordsAPI.java | 848 --------- .../java/com/wordnik/common/WordnikAPI.java | 238 --- .../java/com/wordnik/model/ApiResponse.java | 43 - .../com/wordnik/model/ApiTokenStatus.java | 76 - .../java/com/wordnik/model/AudioFile.java | 134 -- .../java/com/wordnik/model/AudioObject.java | 165 -- .../java/com/wordnik/model/AudioType.java | 43 - .../wordnik/model/AuthenticationToken.java | 43 - .../main/java/com/wordnik/model/Bigram.java | 76 - .../main/java/com/wordnik/model/Category.java | 32 - .../main/java/com/wordnik/model/Citation.java | 43 - .../com/wordnik/model/ContentProvider.java | 43 - .../java/com/wordnik/model/Definition.java | 177 -- .../model/DefinitionSearchResults.java | 45 - .../src/main/java/com/wordnik/model/Doc.java | 45 - .../main/java/com/wordnik/model/Endpoint.java | 56 - .../com/wordnik/model/EntrySearchResult.java | 67 - .../com/wordnik/model/EntrySearchResults.java | 45 - .../main/java/com/wordnik/model/Error.java | 43 - .../main/java/com/wordnik/model/Example.java | 120 -- .../wordnik/model/ExampleSearchResults.java | 45 - .../java/com/wordnik/model/ExampleUsage.java | 32 - .../main/java/com/wordnik/model/Facet.java | 45 - .../java/com/wordnik/model/FacetValue.java | 43 - .../java/com/wordnik/model/Frequency.java | 43 - .../com/wordnik/model/FrequencyElement.java | 76 - .../com/wordnik/model/FrequencySummary.java | 67 - .../com/wordnik/model/FrequencySummaryE.java | 34 - .../com/wordnik/model/GetAudioOutput.java | 45 - .../com/wordnik/model/GetFrequencyOutput.java | 43 - .../main/java/com/wordnik/model/Label.java | 43 - .../src/main/java/com/wordnik/model/Note.java | 67 - .../main/java/com/wordnik/model/Object.java | 56 - .../java/com/wordnik/model/Operation.java | 122 -- .../java/com/wordnik/model/Parameter.java | 131 -- .../java/com/wordnik/model/PartOfSpeech.java | 34 - .../main/java/com/wordnik/model/Related.java | 100 -- .../com/wordnik/model/RelationshipMap.java | 45 - .../main/java/com/wordnik/model/Response.java | 67 - .../src/main/java/com/wordnik/model/Root.java | 45 - .../java/com/wordnik/model/ScoredWord.java | 98 -- .../main/java/com/wordnik/model/Sentence.java | 78 - .../com/wordnik/model/SimpleDefinition.java | 65 - .../java/com/wordnik/model/SimpleExample.java | 65 - .../com/wordnik/model/SubscriptionStatus.java | 43 - .../java/com/wordnik/model/Suggestion.java | 43 - .../main/java/com/wordnik/model/Syllable.java | 54 - .../main/java/com/wordnik/model/TestData.java | 596 ------- .../main/java/com/wordnik/model/TextPron.java | 65 - .../src/main/java/com/wordnik/model/User.java | 98 -- .../model/WordContextualLookupInput.java | 109 -- .../wordnik/model/WordDefinitionsInput.java | 98 -- .../com/wordnik/model/WordExamplesInput.java | 87 - .../java/com/wordnik/model/WordFrequency.java | 43 - .../main/java/com/wordnik/model/WordList.java | 132 -- .../java/com/wordnik/model/WordListWord.java | 88 - .../com/wordnik/model/WordListWordsInput.java | 76 - .../java/com/wordnik/model/WordObject.java | 43 - .../java/com/wordnik/model/WordOfTheDay.java | 158 -- .../com/wordnik/model/WordOfTheDayList.java | 235 --- .../model/WordPronunciationsInput.java | 76 - .../com/wordnik/model/WordRelatedInput.java | 87 - .../wordnik/model/WordsRandomWordInput.java | 120 -- .../wordnik/model/WordsRandomWordsInput.java | 153 -- .../model/WordsSearchDefinitionsInput.java | 208 --- .../com/wordnik/model/WordsSearchInput.java | 153 -- .../WordsWordOfTheDayInputRangeInput.java | 76 - code-gen/.gitignore | 21 - code-gen/bin/runjava.sh | 17 - code-gen/bin/runscala.sh | 17 - code-gen/build.xml | 57 - code-gen/conf/java/structure/build.xml | 45 - code-gen/conf/java/structure/ivy.xml | 41 - .../swagger/annotations/AllowableValues.java | 19 - .../annotations/MethodArgumentNames.java | 13 - .../wordnik/swagger/annotations/Required.java | 17 - .../wordnik/swagger/common/StringValue.java | 22 - .../wordnik/swagger/common/WordnikAPI.java | 216 --- .../swagger/exception/APIException.java | 84 - .../swagger/exception/APIExceptionCodes.java | 38 - .../exception/CodeGenerationException.java | 25 - code-gen/conf/java/templates/EnumObject.st | 30 - code-gen/conf/java/templates/ModelObject.st | 40 - .../conf/java/templates/ResourceObject.st | 153 -- .../conf/java/templates/VersionChecker.st | 18 - code-gen/ivy.xml | 37 - .../swagger/codegen/DriverCodeGenerator.java | 337 ---- .../swagger/codegen/FieldDefinition.java | 49 - .../swagger/codegen/MethodArgument.java | 69 - .../swagger/codegen/ResourceMethod.java | 178 -- .../swagger/codegen/api/SwaggerApi.java | 159 -- .../codegen/config/ApiConfiguration.java | 131 -- .../config/DataTypeMappingProvider.java | 187 -- .../codegen/config/LanguageConfiguration.java | 86 - .../codegen/config/NamingPolicyProvider.java | 105 -- .../swagger/codegen/config/RulesProvider.java | 23 - .../common/CamelCaseNamingPolicyProvider.java | 135 -- .../config/java/JavaCodeGenRulesProvider.java | 34 - .../java/JavaDataTypeMappingProvider.java | 193 --- .../codegen/config/java/JavaLibCodeGen.java | 80 - .../codegen/resource/ApiModelDefn.java | 54 - .../codegen/resource/ApiModelListWrapper.java | 28 - .../codegen/resource/ApiPropertyDefn.java | 177 -- .../resource/ApiPropertyListWrapper.java | 68 - .../swagger/codegen/resource/Endpoint.java | 125 -- .../codegen/resource/EndpointOperation.java | 337 ---- .../codegen/resource/ErrorResponse.java | 33 - .../swagger/codegen/resource/Model.java | 49 - .../swagger/codegen/resource/ModelField.java | 216 --- .../swagger/codegen/resource/Resource.java | 127 -- .../swagger/codegen/resource/Response.java | 44 - .../exception/CodeGenerationException.java | 25 - conf/driver_properties.txt | 5 - conf/driver_regression_testdata.json | 79 - ...iver_regression_testscript (Autosaved).txt | 1539 ----------------- conf/driver_regression_testscript.json | 1538 ---------------- java/1 | 185 -- java/README | 0 java/bin/runjava.sh | 17 - java/bin/runscala.sh | 17 - java/build.xml | 33 - java/classpath.txt | 2 - java/conf/templates/ModelObject.st | 39 - java/conf/templates/ResourceObject.st | 123 -- java/conf/templates/VersionChecker.st | 18 - java/ivy.xml | 41 - .../wordnik/annotations/AllowableValues.java | 19 - .../annotations/MethodArgumentNames.java | 13 - .../com/wordnik/annotations/Required.java | 17 - java/src/lang/com/wordnik/common/Size.java | 11 - .../lang/com/wordnik/common/StringValue.java | 22 - .../lang/com/wordnik/common/WordListType.java | 15 - .../lang/com/wordnik/common/WordnikAPI.java | 216 --- .../com/wordnik/common/WordnikObject.java | 11 - .../wordnik/common/ext/AbstractWordAPI.java | 131 -- .../com/wordnik/exception/APIException.java | 84 - .../wordnik/exception/APIExceptionCodes.java | 38 - .../exception/CodeGenerationException.java | 25 - .../wordnik/annotations/AllowableValues.java | 19 - .../annotations/MethodArgumentNames.java | 13 - .../com/wordnik/annotations/Required.java | 17 - .../main/java/com/wordnik/api/AccountAPI.java | 290 ---- .../java/com/wordnik/api/VersionChecker.java | 18 - .../main/java/com/wordnik/api/WordAPI.java | 690 -------- .../java/com/wordnik/api/WordListAPI.java | 282 --- .../java/com/wordnik/api/WordListsAPI.java | 94 - .../main/java/com/wordnik/api/WordsAPI.java | 848 --------- .../main/java/com/wordnik/common/Size.java | 11 - .../java/com/wordnik/common/StringValue.java | 22 - .../java/com/wordnik/common/WordListType.java | 15 - .../java/com/wordnik/common/WordnikAPI.java | 216 --- .../com/wordnik/common/WordnikObject.java | 11 - .../wordnik/common/ext/AbstractWordAPI.java | 131 -- .../com/wordnik/exception/APIException.java | 84 - .../wordnik/exception/APIExceptionCodes.java | 38 - .../exception/CodeGenerationException.java | 25 - .../java/com/wordnik/model/ApiResponse.java | 45 - .../com/wordnik/model/ApiTokenStatus.java | 78 - .../java/com/wordnik/model/AudioFile.java | 158 -- .../java/com/wordnik/model/AudioType.java | 45 - .../wordnik/model/AuthenticationToken.java | 45 - .../main/java/com/wordnik/model/Bigram.java | 78 - .../main/java/com/wordnik/model/Category.java | 34 - .../main/java/com/wordnik/model/Citation.java | 45 - .../com/wordnik/model/ContentProvider.java | 45 - .../java/com/wordnik/model/Definition.java | 179 -- .../model/DefinitionSearchResults.java | 47 - java/src/main/java/com/wordnik/model/Doc.java | 47 - .../main/java/com/wordnik/model/Endpoint.java | 58 - .../com/wordnik/model/EntrySearchResult.java | 69 - .../com/wordnik/model/EntrySearchResults.java | 47 - .../main/java/com/wordnik/model/Error.java | 45 - .../main/java/com/wordnik/model/Example.java | 122 -- .../wordnik/model/ExampleSearchResults.java | 47 - .../java/com/wordnik/model/ExampleUsage.java | 34 - .../main/java/com/wordnik/model/Facet.java | 47 - .../java/com/wordnik/model/FacetValue.java | 45 - .../java/com/wordnik/model/Frequency.java | 45 - .../com/wordnik/model/FrequencyElement.java | 78 - .../com/wordnik/model/FrequencySummary.java | 69 - .../com/wordnik/model/FrequencySummaryE.java | 36 - .../com/wordnik/model/GetFrequencyOutput.java | 45 - .../main/java/com/wordnik/model/Label.java | 45 - .../src/main/java/com/wordnik/model/Note.java | 69 - .../main/java/com/wordnik/model/Object.java | 58 - .../java/com/wordnik/model/Operation.java | 124 -- .../java/com/wordnik/model/Parameter.java | 133 -- .../java/com/wordnik/model/PartOfSpeech.java | 36 - .../main/java/com/wordnik/model/Photo.java | 166 -- .../main/java/com/wordnik/model/Related.java | 102 -- .../com/wordnik/model/RelationshipMap.java | 47 - .../main/java/com/wordnik/model/Response.java | 69 - .../src/main/java/com/wordnik/model/Root.java | 47 - .../java/com/wordnik/model/ScoredWord.java | 100 -- .../main/java/com/wordnik/model/Sentence.java | 80 - .../com/wordnik/model/SimpleDefinition.java | 67 - .../java/com/wordnik/model/SimpleExample.java | 67 - .../main/java/com/wordnik/model/Sizes.java | 36 - .../com/wordnik/model/SubscriptionStatus.java | 45 - .../java/com/wordnik/model/Suggestion.java | 45 - .../main/java/com/wordnik/model/Syllable.java | 56 - .../main/java/com/wordnik/model/TestData.java | 608 ------- .../main/java/com/wordnik/model/TextPron.java | 67 - .../src/main/java/com/wordnik/model/User.java | 100 -- .../model/WordContextualLookupInput.java | 111 -- .../wordnik/model/WordDefinitionsInput.java | 100 -- .../com/wordnik/model/WordExamplesInput.java | 89 - .../java/com/wordnik/model/WordFrequency.java | 45 - .../main/java/com/wordnik/model/WordList.java | 134 -- .../java/com/wordnik/model/WordListWord.java | 90 - .../com/wordnik/model/WordListWordsInput.java | 78 - .../java/com/wordnik/model/WordObject.java | 45 - .../java/com/wordnik/model/WordOfTheDay.java | 160 -- .../com/wordnik/model/WordOfTheDayList.java | 237 --- .../model/WordPronunciationsInput.java | 78 - .../com/wordnik/model/WordRelatedInput.java | 89 - .../wordnik/model/WordsRandomWordInput.java | 122 -- .../wordnik/model/WordsRandomWordsInput.java | 155 -- .../model/WordsSearchDefinitionsInput.java | 210 --- .../com/wordnik/model/WordsSearchInput.java | 155 -- .../WordsWordOfTheDayInputRangeInput.java | 78 - .../java/com/wordnik/test/APITestRunner.java | 551 ------ .../test/java/com/wordnik/test/Assertion.java | 44 - .../com/wordnik/test/TestAPITestRunner.java | 77 - .../test/java/com/wordnik/test/TestCase.java | 77 - .../com/wordnik/test/TestCaseExecutor.java | 214 --- .../com/wordnik/test/TestMethodInputs.java | 61 - .../java/com/wordnik/test/TestOutput.java | 18 - .../java/com/wordnik/test/TestPackage.java | 59 - .../java/com/wordnik/test/TestResource.java | 55 - .../java/com/wordnik/test/TestStatus.java | 167 -- .../test/java/com/wordnik/test/TestSuite.java | 45 - 252 files changed, 27345 deletions(-) delete mode 100644 android/codegen/README delete mode 100644 android/codegen/build.xml delete mode 100644 android/codegen/conf/templates/ModelObject.st delete mode 100644 android/codegen/conf/templates/ModelObjectNew.st delete mode 100644 android/codegen/conf/templates/ResourceObject.st delete mode 100644 android/codegen/conf/templates/VersionChecker.st delete mode 100644 android/codegen/ivy.xml delete mode 100644 android/codegen/src/main/java/com/wordnik/android/codegen/DriverCodeGenerator.java delete mode 100755 android/driver-test/bin/runandroid.sh delete mode 100644 android/driver-test/build.xml delete mode 100644 android/driver-test/ivy.xml delete mode 100644 android/driver-test/lib/ext/wordnik-java-driver-4.04.0.jar delete mode 100644 android/driver-test/src/test/java/com/wordnik/test/TestCaseExecutor.java delete mode 100644 android/driver/build.xml delete mode 100644 android/driver/ivy.xml delete mode 100644 android/driver/src/main/java/com/wordnik/api/AccountAPI.java delete mode 100644 android/driver/src/main/java/com/wordnik/api/VersionChecker.java delete mode 100644 android/driver/src/main/java/com/wordnik/api/WordAPI.java delete mode 100644 android/driver/src/main/java/com/wordnik/api/WordListAPI.java delete mode 100644 android/driver/src/main/java/com/wordnik/api/WordListsAPI.java delete mode 100644 android/driver/src/main/java/com/wordnik/api/WordsAPI.java delete mode 100644 android/driver/src/main/java/com/wordnik/common/WordnikAPI.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/ApiResponse.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/ApiTokenStatus.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/AudioFile.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/AudioObject.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/AudioType.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/AuthenticationToken.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/Bigram.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/Category.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/Citation.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/ContentProvider.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/Definition.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/DefinitionSearchResults.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/Doc.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/Endpoint.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/EntrySearchResult.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/EntrySearchResults.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/Error.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/Example.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/ExampleSearchResults.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/ExampleUsage.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/Facet.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/FacetValue.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/Frequency.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/FrequencyElement.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/FrequencySummary.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/FrequencySummaryE.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/GetAudioOutput.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/GetFrequencyOutput.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/Label.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/Note.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/Object.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/Operation.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/Parameter.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/PartOfSpeech.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/Related.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/RelationshipMap.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/Response.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/Root.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/ScoredWord.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/Sentence.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/SimpleDefinition.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/SimpleExample.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/SubscriptionStatus.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/Suggestion.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/Syllable.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/TestData.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/TextPron.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/User.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/WordContextualLookupInput.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/WordDefinitionsInput.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/WordExamplesInput.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/WordFrequency.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/WordList.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/WordListWord.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/WordListWordsInput.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/WordObject.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/WordOfTheDay.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/WordOfTheDayList.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/WordPronunciationsInput.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/WordRelatedInput.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/WordsRandomWordInput.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/WordsRandomWordsInput.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/WordsSearchDefinitionsInput.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/WordsSearchInput.java delete mode 100644 android/driver/src/main/java/com/wordnik/model/WordsWordOfTheDayInputRangeInput.java delete mode 100644 code-gen/.gitignore delete mode 100755 code-gen/bin/runjava.sh delete mode 100755 code-gen/bin/runscala.sh delete mode 100644 code-gen/build.xml delete mode 100644 code-gen/conf/java/structure/build.xml delete mode 100644 code-gen/conf/java/structure/ivy.xml delete mode 100644 code-gen/conf/java/structure/src/main/java/com/wordnik/swagger/annotations/AllowableValues.java delete mode 100644 code-gen/conf/java/structure/src/main/java/com/wordnik/swagger/annotations/MethodArgumentNames.java delete mode 100644 code-gen/conf/java/structure/src/main/java/com/wordnik/swagger/annotations/Required.java delete mode 100644 code-gen/conf/java/structure/src/main/java/com/wordnik/swagger/common/StringValue.java delete mode 100644 code-gen/conf/java/structure/src/main/java/com/wordnik/swagger/common/WordnikAPI.java delete mode 100644 code-gen/conf/java/structure/src/main/java/com/wordnik/swagger/exception/APIException.java delete mode 100644 code-gen/conf/java/structure/src/main/java/com/wordnik/swagger/exception/APIExceptionCodes.java delete mode 100644 code-gen/conf/java/structure/src/main/java/com/wordnik/swagger/exception/CodeGenerationException.java delete mode 100644 code-gen/conf/java/templates/EnumObject.st delete mode 100644 code-gen/conf/java/templates/ModelObject.st delete mode 100644 code-gen/conf/java/templates/ResourceObject.st delete mode 100644 code-gen/conf/java/templates/VersionChecker.st delete mode 100644 code-gen/ivy.xml delete mode 100644 code-gen/src/main/java/com/wordnik/swagger/codegen/DriverCodeGenerator.java delete mode 100644 code-gen/src/main/java/com/wordnik/swagger/codegen/FieldDefinition.java delete mode 100644 code-gen/src/main/java/com/wordnik/swagger/codegen/MethodArgument.java delete mode 100644 code-gen/src/main/java/com/wordnik/swagger/codegen/ResourceMethod.java delete mode 100644 code-gen/src/main/java/com/wordnik/swagger/codegen/api/SwaggerApi.java delete mode 100644 code-gen/src/main/java/com/wordnik/swagger/codegen/config/ApiConfiguration.java delete mode 100644 code-gen/src/main/java/com/wordnik/swagger/codegen/config/DataTypeMappingProvider.java delete mode 100644 code-gen/src/main/java/com/wordnik/swagger/codegen/config/LanguageConfiguration.java delete mode 100644 code-gen/src/main/java/com/wordnik/swagger/codegen/config/NamingPolicyProvider.java delete mode 100644 code-gen/src/main/java/com/wordnik/swagger/codegen/config/RulesProvider.java delete mode 100644 code-gen/src/main/java/com/wordnik/swagger/codegen/config/common/CamelCaseNamingPolicyProvider.java delete mode 100644 code-gen/src/main/java/com/wordnik/swagger/codegen/config/java/JavaCodeGenRulesProvider.java delete mode 100644 code-gen/src/main/java/com/wordnik/swagger/codegen/config/java/JavaDataTypeMappingProvider.java delete mode 100644 code-gen/src/main/java/com/wordnik/swagger/codegen/config/java/JavaLibCodeGen.java delete mode 100644 code-gen/src/main/java/com/wordnik/swagger/codegen/resource/ApiModelDefn.java delete mode 100644 code-gen/src/main/java/com/wordnik/swagger/codegen/resource/ApiModelListWrapper.java delete mode 100644 code-gen/src/main/java/com/wordnik/swagger/codegen/resource/ApiPropertyDefn.java delete mode 100644 code-gen/src/main/java/com/wordnik/swagger/codegen/resource/ApiPropertyListWrapper.java delete mode 100644 code-gen/src/main/java/com/wordnik/swagger/codegen/resource/Endpoint.java delete mode 100644 code-gen/src/main/java/com/wordnik/swagger/codegen/resource/EndpointOperation.java delete mode 100644 code-gen/src/main/java/com/wordnik/swagger/codegen/resource/ErrorResponse.java delete mode 100644 code-gen/src/main/java/com/wordnik/swagger/codegen/resource/Model.java delete mode 100644 code-gen/src/main/java/com/wordnik/swagger/codegen/resource/ModelField.java delete mode 100644 code-gen/src/main/java/com/wordnik/swagger/codegen/resource/Resource.java delete mode 100644 code-gen/src/main/java/com/wordnik/swagger/codegen/resource/Response.java delete mode 100644 code-gen/src/main/java/com/wordnik/swagger/exception/CodeGenerationException.java delete mode 100644 conf/driver_properties.txt delete mode 100644 conf/driver_regression_testdata.json delete mode 100644 conf/driver_regression_testscript (Autosaved).txt delete mode 100644 conf/driver_regression_testscript.json delete mode 100644 java/1 delete mode 100644 java/README delete mode 100755 java/bin/runjava.sh delete mode 100755 java/bin/runscala.sh delete mode 100644 java/build.xml delete mode 100644 java/classpath.txt delete mode 100644 java/conf/templates/ModelObject.st delete mode 100644 java/conf/templates/ResourceObject.st delete mode 100644 java/conf/templates/VersionChecker.st delete mode 100644 java/ivy.xml delete mode 100644 java/src/lang/com/wordnik/annotations/AllowableValues.java delete mode 100644 java/src/lang/com/wordnik/annotations/MethodArgumentNames.java delete mode 100644 java/src/lang/com/wordnik/annotations/Required.java delete mode 100644 java/src/lang/com/wordnik/common/Size.java delete mode 100644 java/src/lang/com/wordnik/common/StringValue.java delete mode 100644 java/src/lang/com/wordnik/common/WordListType.java delete mode 100644 java/src/lang/com/wordnik/common/WordnikAPI.java delete mode 100644 java/src/lang/com/wordnik/common/WordnikObject.java delete mode 100644 java/src/lang/com/wordnik/common/ext/AbstractWordAPI.java delete mode 100644 java/src/lang/com/wordnik/exception/APIException.java delete mode 100644 java/src/lang/com/wordnik/exception/APIExceptionCodes.java delete mode 100644 java/src/lang/com/wordnik/exception/CodeGenerationException.java delete mode 100644 java/src/main/java/com/wordnik/annotations/AllowableValues.java delete mode 100644 java/src/main/java/com/wordnik/annotations/MethodArgumentNames.java delete mode 100644 java/src/main/java/com/wordnik/annotations/Required.java delete mode 100644 java/src/main/java/com/wordnik/api/AccountAPI.java delete mode 100644 java/src/main/java/com/wordnik/api/VersionChecker.java delete mode 100644 java/src/main/java/com/wordnik/api/WordAPI.java delete mode 100644 java/src/main/java/com/wordnik/api/WordListAPI.java delete mode 100644 java/src/main/java/com/wordnik/api/WordListsAPI.java delete mode 100644 java/src/main/java/com/wordnik/api/WordsAPI.java delete mode 100644 java/src/main/java/com/wordnik/common/Size.java delete mode 100644 java/src/main/java/com/wordnik/common/StringValue.java delete mode 100644 java/src/main/java/com/wordnik/common/WordListType.java delete mode 100644 java/src/main/java/com/wordnik/common/WordnikAPI.java delete mode 100644 java/src/main/java/com/wordnik/common/WordnikObject.java delete mode 100644 java/src/main/java/com/wordnik/common/ext/AbstractWordAPI.java delete mode 100644 java/src/main/java/com/wordnik/exception/APIException.java delete mode 100644 java/src/main/java/com/wordnik/exception/APIExceptionCodes.java delete mode 100644 java/src/main/java/com/wordnik/exception/CodeGenerationException.java delete mode 100644 java/src/main/java/com/wordnik/model/ApiResponse.java delete mode 100644 java/src/main/java/com/wordnik/model/ApiTokenStatus.java delete mode 100644 java/src/main/java/com/wordnik/model/AudioFile.java delete mode 100644 java/src/main/java/com/wordnik/model/AudioType.java delete mode 100644 java/src/main/java/com/wordnik/model/AuthenticationToken.java delete mode 100644 java/src/main/java/com/wordnik/model/Bigram.java delete mode 100644 java/src/main/java/com/wordnik/model/Category.java delete mode 100644 java/src/main/java/com/wordnik/model/Citation.java delete mode 100644 java/src/main/java/com/wordnik/model/ContentProvider.java delete mode 100644 java/src/main/java/com/wordnik/model/Definition.java delete mode 100644 java/src/main/java/com/wordnik/model/DefinitionSearchResults.java delete mode 100644 java/src/main/java/com/wordnik/model/Doc.java delete mode 100644 java/src/main/java/com/wordnik/model/Endpoint.java delete mode 100644 java/src/main/java/com/wordnik/model/EntrySearchResult.java delete mode 100644 java/src/main/java/com/wordnik/model/EntrySearchResults.java delete mode 100644 java/src/main/java/com/wordnik/model/Error.java delete mode 100644 java/src/main/java/com/wordnik/model/Example.java delete mode 100644 java/src/main/java/com/wordnik/model/ExampleSearchResults.java delete mode 100644 java/src/main/java/com/wordnik/model/ExampleUsage.java delete mode 100644 java/src/main/java/com/wordnik/model/Facet.java delete mode 100644 java/src/main/java/com/wordnik/model/FacetValue.java delete mode 100644 java/src/main/java/com/wordnik/model/Frequency.java delete mode 100644 java/src/main/java/com/wordnik/model/FrequencyElement.java delete mode 100644 java/src/main/java/com/wordnik/model/FrequencySummary.java delete mode 100644 java/src/main/java/com/wordnik/model/FrequencySummaryE.java delete mode 100644 java/src/main/java/com/wordnik/model/GetFrequencyOutput.java delete mode 100644 java/src/main/java/com/wordnik/model/Label.java delete mode 100644 java/src/main/java/com/wordnik/model/Note.java delete mode 100644 java/src/main/java/com/wordnik/model/Object.java delete mode 100644 java/src/main/java/com/wordnik/model/Operation.java delete mode 100644 java/src/main/java/com/wordnik/model/Parameter.java delete mode 100644 java/src/main/java/com/wordnik/model/PartOfSpeech.java delete mode 100644 java/src/main/java/com/wordnik/model/Photo.java delete mode 100644 java/src/main/java/com/wordnik/model/Related.java delete mode 100644 java/src/main/java/com/wordnik/model/RelationshipMap.java delete mode 100644 java/src/main/java/com/wordnik/model/Response.java delete mode 100644 java/src/main/java/com/wordnik/model/Root.java delete mode 100644 java/src/main/java/com/wordnik/model/ScoredWord.java delete mode 100644 java/src/main/java/com/wordnik/model/Sentence.java delete mode 100644 java/src/main/java/com/wordnik/model/SimpleDefinition.java delete mode 100644 java/src/main/java/com/wordnik/model/SimpleExample.java delete mode 100644 java/src/main/java/com/wordnik/model/Sizes.java delete mode 100644 java/src/main/java/com/wordnik/model/SubscriptionStatus.java delete mode 100644 java/src/main/java/com/wordnik/model/Suggestion.java delete mode 100644 java/src/main/java/com/wordnik/model/Syllable.java delete mode 100644 java/src/main/java/com/wordnik/model/TestData.java delete mode 100644 java/src/main/java/com/wordnik/model/TextPron.java delete mode 100644 java/src/main/java/com/wordnik/model/User.java delete mode 100644 java/src/main/java/com/wordnik/model/WordContextualLookupInput.java delete mode 100644 java/src/main/java/com/wordnik/model/WordDefinitionsInput.java delete mode 100644 java/src/main/java/com/wordnik/model/WordExamplesInput.java delete mode 100644 java/src/main/java/com/wordnik/model/WordFrequency.java delete mode 100644 java/src/main/java/com/wordnik/model/WordList.java delete mode 100644 java/src/main/java/com/wordnik/model/WordListWord.java delete mode 100644 java/src/main/java/com/wordnik/model/WordListWordsInput.java delete mode 100644 java/src/main/java/com/wordnik/model/WordObject.java delete mode 100644 java/src/main/java/com/wordnik/model/WordOfTheDay.java delete mode 100644 java/src/main/java/com/wordnik/model/WordOfTheDayList.java delete mode 100644 java/src/main/java/com/wordnik/model/WordPronunciationsInput.java delete mode 100644 java/src/main/java/com/wordnik/model/WordRelatedInput.java delete mode 100644 java/src/main/java/com/wordnik/model/WordsRandomWordInput.java delete mode 100644 java/src/main/java/com/wordnik/model/WordsRandomWordsInput.java delete mode 100644 java/src/main/java/com/wordnik/model/WordsSearchDefinitionsInput.java delete mode 100644 java/src/main/java/com/wordnik/model/WordsSearchInput.java delete mode 100644 java/src/main/java/com/wordnik/model/WordsWordOfTheDayInputRangeInput.java delete mode 100644 java/src/test/java/com/wordnik/test/APITestRunner.java delete mode 100644 java/src/test/java/com/wordnik/test/Assertion.java delete mode 100644 java/src/test/java/com/wordnik/test/TestAPITestRunner.java delete mode 100644 java/src/test/java/com/wordnik/test/TestCase.java delete mode 100644 java/src/test/java/com/wordnik/test/TestCaseExecutor.java delete mode 100644 java/src/test/java/com/wordnik/test/TestMethodInputs.java delete mode 100644 java/src/test/java/com/wordnik/test/TestOutput.java delete mode 100644 java/src/test/java/com/wordnik/test/TestPackage.java delete mode 100644 java/src/test/java/com/wordnik/test/TestResource.java delete mode 100644 java/src/test/java/com/wordnik/test/TestStatus.java delete mode 100644 java/src/test/java/com/wordnik/test/TestSuite.java diff --git a/android/codegen/README b/android/codegen/README deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/android/codegen/build.xml b/android/codegen/build.xml deleted file mode 100644 index b5ea187ea2f..00000000000 --- a/android/codegen/build.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/android/codegen/conf/templates/ModelObject.st b/android/codegen/conf/templates/ModelObject.st deleted file mode 100644 index ebaeadc9827..00000000000 --- a/android/codegen/conf/templates/ModelObject.st +++ /dev/null @@ -1,38 +0,0 @@ -package com.wordnik.model; - -import com.wordnik.common.WordnikObject; -import com.wordnik.annotations.AllowableValues; -import com.wordnik.annotations.Required; - -$imports:{ import | -import $import$; -}$ - -/** - * $model.description$ - * NOTE: This class is auto generated by the drive code generator program so please do not edit the program manually. - * @author ramesh - * - */ -public class $className$ extends WordnikObject { - - $fields:{ field | - //$field.description$ - private $field.attributeDefinition.returnType$ $field.attributeDefinition.name$ $field.attributeDefinition.initialization$; - }$ - - $fields:{ field | - //$field.description$ - $if(field.required)$ - @Required $endif$ - $if(field.allowableValues)$ - @AllowableValues(value="$field.allowableValues$")$endif$ - public $field.attributeDefinition.returnType$ get$field.attributeDefinition.NameForMethod$() { - return $field.attributeDefinition.name$; - } - - public void set$field.attributeDefinition.NameForMethod$($field.attributeDefinition.returnType$ $field.attributeDefinition.name$) { - this.$field.attributeDefinition.name$ = $field.attributeDefinition.name$; - } - }$ -} \ No newline at end of file diff --git a/android/codegen/conf/templates/ModelObjectNew.st b/android/codegen/conf/templates/ModelObjectNew.st deleted file mode 100644 index 888995d4e64..00000000000 --- a/android/codegen/conf/templates/ModelObjectNew.st +++ /dev/null @@ -1,74 +0,0 @@ -package com.wordnik.model; - -import org.json.JSONObject -import org.json.JSONArray -import org.json.JSONException -import com.wordnik.common.WordnikObject; -import com.wordnik.annotations.AllowableValues; -import com.wordnik.annotations.Required; - -$imports:{ import | -import $import$; -}$ - -/** - * $model.description$ - * NOTE: This class is auto generated by the drive code generator program so please do not edit the program manually. - * @author ramesh - * - */ -public class $className$ extends WordnikObject { - - $fields:{ field | - //$field.description$ - private $field.attributeDefinition.returnType$ $field.attributeDefinition.name$ $field.attributeDefinition.initialization$; - }$ - - $fields:{ field | - //$field.description$ - $if(field.required)$ - @Required $endif$ - $if(field.allowableValues)$ - @AllowableValues(value="$field.allowableValues$")$endif$ - public $field.attributeDefinition.returnType$ get$field.attributeDefinition.NameForMethod$() { - return $field.attributeDefinition.name$; - } - - public void set$field.attributeDefinition.NameForMethod$($field.attributeDefinition.returnType$ $field.attributeDefinition.name$) { - this.$field.attributeDefinition.name$ = $field.attributeDefinition.name$; - } - }$ - - public $className$ fromJSON(String json) { - JSONObject jso; - try { - jso = new JSONObject(json); - } catch(Exception e) { - // ignore for now - } - - try { - $fields:{ field | - if($field.attributeDefinition.returnType$.equals("Int")) { - jso.getInt("$field.attributeDefinition.name$"); - } else if($field.attributeDefinition.returnType$.equals("Long")) { - jso.getLong("$field.attributeDefinition.name$"); - } else if($field.attributeDefinition.returnType$.equals("Double")) { - jso.getDouble("$field.attributeDefinition.name$"); - } else if($field.attributeDefinition.returnType$.equals("String")) { - jso.getString("$field.attributeDefinition.name$"); - } else if($field.attributeDefinition.returnType$.equals("Boolean")) { - jso.getBoolean("$field.attributeDefinition.name$"); - } else if($field.attributeDefinition.returnType$.startsWith("List[")) { - // JSONArray - } else if($field.attributeDefinition.returnType$.startsWith("Map[")) { - // JSONArray - } else { - // JSONObject - } - }$ - } catch (JSONException e) { - // ignore for now - } - } -} \ No newline at end of file diff --git a/android/codegen/conf/templates/ResourceObject.st b/android/codegen/conf/templates/ResourceObject.st deleted file mode 100644 index e46bee3e3ec..00000000000 --- a/android/codegen/conf/templates/ResourceObject.st +++ /dev/null @@ -1,121 +0,0 @@ -package com.wordnik.api; - - -import com.wordnik.common.*; -import com.wordnik.common.ext.*; -import com.wordnik.exception.WordnikExceptionCodes; -import com.wordnik.exception.WordnikAPIException; -import com.wordnik.model.*; -import java.util.*; -import com.wordnik.annotations.MethodArgumentNames; -import org.codehaus.jackson.map.DeserializationConfig.Feature; -import org.codehaus.jackson.map.ObjectMapper; -import org.codehaus.jackson.type.TypeReference; -import java.io.IOException; - -/** - * NOTE: This class is auto generated by the drive code generator program so please do not edit the program manually. - * @author ramesh - * - */ -public class $resource$ extends $extends$ { - -$methods:{ method | - /** - * $method.description$ -$method.arguments:{ argument | - * @param $argument.name$ $argument.description$ -$if(argument.allowedValues)$ - * Allowed values are - $argument.allowedValues$ -$endif$ -}$ - * - * @return $method.returnValue$ {@link $method.returnClassName$} - * @throws WordnikAPIException $method.exceptionDescription$ - */ -$if(method.hasArguments)$ - @MethodArgumentNames(value="$method.argumentNames; separator=", "$") -$endif$ - - public static $method.returnValue$ $method.name$($method.argumentDefinitions; separator=", "$) throws WordnikAPIException { - -$if(method.authToken)$ - if(authToken == null || authToken.length() == 0) { - throw new WordnikAPIException(WordnikExceptionCodes.AUTH_TOKEN_NOT_VALID); - } -$endif$ - - //parse inputs - String resourcePath = "$method.resourcePath$"; - resourcePath = resourcePath.replace("{format}","json"); - String method = "$method.methodType$"; - Map queryParams = new HashMap(); -$if(!method.inputModel)$ -$method.queryParameters:{ argument | - if( $argument.name$ != null) { - queryParams.put("$argument.name$", $argument.name$); - } -}$ -$method.pathParameters:{ argument | - if( $argument.name$ != null) { - resourcePath = resourcePath.replace("{$argument.name$}", $argument.name$); - } -}$ -$endif$ -$if(method.inputModel)$ -$method.queryParameters:{ argument | - if( $argument.inputModelClassArgument$ != null && $argument.methodNameFromModelClass$ != null) { - queryParams.put("$argument.name$", $argument.methodNameFromModelClass$); - } -}$ -$method.pathParameters:{ argument | - if( $argument.inputModelClassArgument$ != null && $argument.methodNameFromModelClass$ != null) { - resourcePath = resourcePath.replace("{$argument.name$}", $argument.methodNameFromModelClass$); - } -}$ -$endif$ - //make the API Call -$if(method.postObject)$ -$if(method.authToken)$ - String response = invokeAPI(authToken, resourcePath, method, queryParams, postObject); -$endif$ -$if(!method.authToken)$ - String response = invokeAPI(null, resourcePath, method, queryParams, postObject); -$endif$ -$endif$ - -$if(!method.postObject)$ -$if(method.authToken)$ - String response = invokeAPI(authToken, resourcePath, method, queryParams, null); -$endif$ -$if(!method.authToken)$ - String response = invokeAPI(null, resourcePath, method, queryParams, null); -$endif$ -$endif$ - - //create output objects if the response has more than one object -$if(!method.responseVoid)$ - if(response == null || response.length() == 0){ - return null; - } -$if(!method.returnValueList)$ - $method.returnValue$ responseObject = ($method.returnValue$)deserialize(response, $method.returnClassName$.class); - return responseObject; -$endif$ -$if(method.returnValueList)$ - TypeReference> typeRef = new TypeReference>() { - }; - try { - List<$method.returnClassName$> responseObject = (List<$method.returnClassName$>) mapper.readValue(response, typeRef); - return responseObject; - } catch (IOException ioe) { - String[] args = new String[]{response, typeRef.toString()}; - throw new WordnikAPIException(WordnikExceptionCodes.ERROR_CONVERTING_JSON_TO_JAVA, args, "Error in converting response json value to java object : " + ioe.getMessage(), ioe); - } -$endif$ -$endif$ - } - - -}$ -} diff --git a/android/codegen/conf/templates/VersionChecker.st b/android/codegen/conf/templates/VersionChecker.st deleted file mode 100644 index 69365de2aca..00000000000 --- a/android/codegen/conf/templates/VersionChecker.st +++ /dev/null @@ -1,18 +0,0 @@ -package com.wordnik.api; - -/** - * Maintains the compatible server version against which the drive is written - * @author ramesh - * - */ -public class VersionChecker { - - private String compatibleVersion = "$apiVersion$"; - - /** - * Gets the version against which the driver code was written - */ - public String getCompatibleVersion() { - return compatibleVersion; - } -} \ No newline at end of file diff --git a/android/codegen/ivy.xml b/android/codegen/ivy.xml deleted file mode 100644 index d53a4644f9e..00000000000 --- a/android/codegen/ivy.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/android/codegen/src/main/java/com/wordnik/android/codegen/DriverCodeGenerator.java b/android/codegen/src/main/java/com/wordnik/android/codegen/DriverCodeGenerator.java deleted file mode 100644 index 4252ff35957..00000000000 --- a/android/codegen/src/main/java/com/wordnik/android/codegen/DriverCodeGenerator.java +++ /dev/null @@ -1,367 +0,0 @@ -package com.wordnik.codegen; - -import com.sun.jersey.api.client.Client; -import com.sun.jersey.api.client.ClientResponse; -import com.sun.jersey.api.client.WebResource; -import com.wordnik.exception.CodeGenerationException; - -import org.antlr.stringtemplate.StringTemplate; -import org.antlr.stringtemplate.StringTemplateGroup; -import org.codehaus.jackson.map.ObjectMapper; -import org.codehaus.jackson.map.DeserializationConfig.Feature; - -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.Properties; - -/** - * Created by IntelliJ IDEA. - * User: ramesh - * Date: 3/30/11 - * Time: 6:59 PM - * To change this template use File | Settings | File Templates. - */ -public class DriverCodeGenerator { - - private static String HEADER_NAME_API_VERSION = "Wordnik-Api-Version"; - private static String VERSION_OBJECT_TEMPLATE = "VersionChecker"; - private static String MODEL_OBJECT_TEMPLATE = "ModelObject"; - private static String API_OBJECT_TEMPLATE = "ResourceObject"; - - public static void main(String[] args) { - DriverCodeGenerator codeGenerator = new DriverCodeGenerator(); - codeGenerator.generateCode(); - } - - /** - * Generate classes needed for the model and API invocation - */ - public void generateCode() { - //read resources and get their documentation - List resources = this.readResourceDocumentation( - "http://beta.wordnik.com/v4/", "word.json,words.json,wordList.json,wordLists.json,account.json"); - StringTemplateGroup aTemplateGroup = new StringTemplateGroup("templates","conf/templates"); - if(resources.size() > 0) { - generateVersionHelper(resources.get(0).getVersion(), aTemplateGroup); - } - generateModelClasses(resources, aTemplateGroup); - generateAssemblerClassesForOutput(resources, aTemplateGroup); - generateModelClassesForInput(resources, aTemplateGroup); - generateAPIClasses(resources, aTemplateGroup); - } - - /** - * Reads the documentation of the resources and constructs the resource object that can be used - * for generating the driver related classes. The resource list string should be "," separated - */ - private List readResourceDocumentation(String baseUrl, String resourceList) { - - List resourceDocs = new ArrayList(); - - //valid for input - if (baseUrl == null || resourceList == null || - baseUrl.trim().length() == 0 || - resourceList.trim().length() == 0) { - throw new CodeGenerationException("Base URL or Resource list input is null"); - } - - - //create list of resource URL - String[] resources = resourceList.split(","); - List resourceURLs = new ArrayList(); - for (String resource : resources) { - resourceURLs.add(baseUrl + resource); - } - - //make connection to resource and get the documentation - for (String resourceURL : resourceURLs) { - Client apiClient = Client.create(); - WebResource aResource = apiClient.resource(resourceURL); - ClientResponse clientResponse = aResource.get(ClientResponse.class); - String version = clientResponse.getHeaders().get(HEADER_NAME_API_VERSION).get(0); - String response = clientResponse.getEntity(String.class); - try { - ObjectMapper mapper = new ObjectMapper(); - mapper.getDeserializationConfig().set(Feature.FAIL_ON_UNKNOWN_PROPERTIES, false); - Resource aResourceDoc = (Resource) mapper.readValue(response, Resource.class); - aResourceDoc.setVersion(version); - resourceDocs.add(aResourceDoc); - } catch (IOException ioe) { - throw new CodeGenerationException("Erro in coversting response json value to java object"); - } - } - return resourceDocs; - - } - - /** - * Generates version file based on the version number received from the doc calls. This version file is used - * while making the API calls to make sure Client and back end are compatible. - * @param version - */ - private void generateVersionHelper(String version, StringTemplateGroup templateGroup) { - StringTemplate template = templateGroup.getInstanceOf(VERSION_OBJECT_TEMPLATE); - template.setAttribute("apiVersion", version); - File aFile = new File("../driver/src/main/java/com/wordnik/api/VersionChecker.java"); - try{ - FileWriter aWriter = new FileWriter(aFile); - BufferedWriter bufWriter = new BufferedWriter(aWriter); - bufWriter.write(template.toString()); - bufWriter.close(); - }catch(IOException ioe){ - throw new CodeGenerationException("Error generating the versioned file: " + ioe.getMessage()); - } - } - - /** - * Generates model classes. If the class is already generated then ignores the same. - */ - private void generateModelClasses(List resources, StringTemplateGroup templateGroup) { - List generatedClassNames = new ArrayList(); - - for(Resource resource: resources) { - for(Model model : resource.getModels()){ - if(!generatedClassNames.contains(model.getName())){ - List imports = new ArrayList(); - imports.add("com.wordnik.common.WordListType"); - for(Parameter param : model.getFields()){ - for(String importDef : param.getAttributeDefinition().getImportDefinitions()){ - if(!imports.contains(importDef)){ - imports.add(importDef); - } - } - } - StringTemplate template = templateGroup.getInstanceOf(MODEL_OBJECT_TEMPLATE); - template.setAttribute("fields", model.getFields()); - template.setAttribute("imports", imports); - template.setAttribute("className", model.getGenratedClassName()); - File aFile = new File("../driver/src/main/java/com/wordnik/model/"+model.getGenratedClassName()+".java"); - try{ - FileWriter aWriter = new FileWriter(aFile); - BufferedWriter bufWriter = new BufferedWriter(aWriter); - bufWriter.write(template.toString()); - bufWriter.close(); - }catch(IOException ioe){ - throw new CodeGenerationException("Error generating the model classes : " + ioe.getMessage()); - } - generatedClassNames.add(model.getName()); - } - } - } - - generateWrapperClassForTestData(generatedClassNames, templateGroup); - } - - /** - * Generates assembler classes if the API returns more than one objects. - * @param resources - * @param templateGroup - */ - private void generateAssemblerClassesForOutput(List resources, StringTemplateGroup templateGroup) { - List generatedClasses = new ArrayList(); - for(Resource resource : resources) { - if(resource.getEndPoints() != null) { - for(Endpoint endpoint : resource.getEndPoints()){ - if(endpoint.getOperations() != null) { - for(EndpointOperation operation : endpoint.getOperations()){ - Model model = operation.getModelObjectForAggregateObject(endpoint); - if(model != null){ - if(!generatedClasses.contains(model.getName())) { - List imports = new ArrayList(); - imports.add("com.wordnik.common.WordListType"); - for(Parameter param : model.getFields()){ - for(String importDef : param.getAttributeDefinition().getImportDefinitions()){ - if(!imports.contains(importDef)){ - imports.add(importDef); - } - } - } - StringTemplate template = templateGroup.getInstanceOf(MODEL_OBJECT_TEMPLATE); - template.setAttribute("fields", model.getFields()); - template.setAttribute("imports", imports); - template.setAttribute("className", model.getGenratedClassName()); - File aFile = new File("../driver/src/main/java/com/wordnik/model/"+model.getGenratedClassName()+".java"); - try{ - FileWriter aWriter = new FileWriter(aFile); - BufferedWriter bufWriter = new BufferedWriter(aWriter); - bufWriter.write(template.toString()); - bufWriter.close(); - }catch(IOException ioe){ - throw new CodeGenerationException("Error generating the assemble classes : " + ioe.getMessage()); - } - generatedClasses.add(model.getName()); - } - } - } - } - } - } - } - } - - /** - * Generates assembler classes if the API returns more than one objects. - * @param resources - * @param templateGroup - */ - private void generateModelClassesForInput(List resources, StringTemplateGroup templateGroup) { - List generatedClasses = new ArrayList(); - for(Resource resource : resources) { - if(resource.getEndPoints() != null) { - for(Endpoint endpoint : resource.getEndPoints()){ - if(endpoint.getOperations() != null) { - for(EndpointOperation operation : endpoint.getOperations()){ - Method method = operation.generateMethod(endpoint, resource);; - if(method.getInputModel() != null) { - Model model = method.getInputModel(); - if(model != null){ - if(!generatedClasses.contains(model.getName())) { - List imports = new ArrayList(); - imports.add("com.wordnik.common.WordListType"); - for(Parameter param : model.getFields()){ - for(String importDef : param.getAttributeDefinition().getImportDefinitions()){ - if(!imports.contains(importDef)){ - imports.add(importDef); - } - } - } - StringTemplate template = templateGroup.getInstanceOf(MODEL_OBJECT_TEMPLATE); - - template.setAttribute("fields", model.getFields()); - template.setAttribute("imports", imports); - template.setAttribute("className", model.getGenratedClassName()); - File aFile = new File("../driver/src/main/java/com/wordnik/model/"+model.getGenratedClassName()+".java"); - try{ - FileWriter aWriter = new FileWriter(aFile); - BufferedWriter bufWriter = new BufferedWriter(aWriter); - bufWriter.write(template.toString()); - bufWriter.close(); - }catch(IOException ioe){ - throw new CodeGenerationException("Error generating the input model classes " + ioe.getMessage()); - } - generatedClasses.add(model.getName()); - } - } - } - } - } - } - } - } - } - - /** - * Generates one API class for each resource and each end point in the resource is translated as method. - * @param resources - * @param templateGroup - */ - private void generateAPIClasses(List resources, StringTemplateGroup templateGroup) { - - for(Resource resource : resources) { - List methods = new ArrayList(); - methods = resource.generateMethods(resource); - StringTemplate template = templateGroup.getInstanceOf(API_OBJECT_TEMPLATE); - String className = resource.generateClassName(); - List filteredMethods = new ArrayList(); - for(Method method:methods){ - if(!CodeGenOverridingRules.isMethodIgnored(className, method.getName())){ - filteredMethods.add(method); - } - } - template.setAttribute("resource", className); - template.setAttribute("methods", filteredMethods); - template.setAttribute("extends", CodeGenOverridingRules.getServiceExtendingClass(className)); - - File aFile = new File("../driver/src/main/java/com/wordnik/api/"+ resource.generateClassName() +".java"); - try{ - FileWriter aWriter = new FileWriter(aFile); - BufferedWriter bufWriter = new BufferedWriter(aWriter); - bufWriter.write(template.toString()); - bufWriter.close(); - }catch(IOException ioe){ - throw new CodeGenerationException("Error generating the API classes : " + ioe.getMessage()); - } - } - } - - /** - * Creates a wrapper model class that contains all model classes as list of objects. - * This class is used for storing test data - */ - private void generateWrapperClassForTestData(List generatedClassNames, StringTemplateGroup templateGroup) { - Model model = new Model(); - model.setName("TestData"); - model.setDescription("CLass used to store all the test data. Thsi should not be used for any development"); - List parameters = new ArrayList(); - model.setFields(parameters); - for(String className : generatedClassNames){ - Parameter aParam = new Parameter(); - aParam.setName(convertFirstCharToSmall(className)+"List"); - aParam.setParamType("List["+className+"]"); - parameters.add(aParam); - } - - //add missing class from models - Parameter aParam = new Parameter(); - aParam.setName("StringValueList"); - aParam.setParamType("List[StringValue]"); - parameters.add(aParam); - - List imports = new ArrayList(); - imports.add("com.wordnik.common.WordListType"); - imports.add("com.wordnik.common.StringValue"); - - for(Parameter param : model.getFields()){ - for(String importDef : param.getAttributeDefinition().getImportDefinitions()){ - if(!imports.contains(importDef)){ - imports.add(importDef); - } - } - } - StringTemplate template = templateGroup.getInstanceOf(MODEL_OBJECT_TEMPLATE); - template.setAttribute("fields", model.getFields()); - template.setAttribute("imports", imports); - template.setAttribute("className", model.getGenratedClassName()); - File aFile = new File("../driver/src/main/java/com/wordnik/model/"+model.getGenratedClassName()+".java"); - try{ - FileWriter aWriter = new FileWriter(aFile); - BufferedWriter bufWriter = new BufferedWriter(aWriter); - bufWriter.write(template.toString()); - bufWriter.close(); - }catch(IOException ioe){ - throw new CodeGenerationException("Error generating the wrapper classes for test data file : " + ioe.getMessage()); - } - } - - /** - * Converts the first character of the input into string. - * Example: If the input is word, the return value will be Word - * @param input - * @return - */ - public static String convertFirstCharToCaps(String input) { - if(input != null && input.length() > 0) { - return input.substring(0,1).toUpperCase() + input.substring(1); - }else{ - throw new CodeGenerationException("Error converting input to first letter caps becuase of null input"); - } - } - - /** - * Converts the first character of the input into string. - * Example: If the input is word, the return value will be Word - * @param input - * @return - */ - public static String convertFirstCharToSmall(String input) { - if(input != null && input.length() > 0) { - return input.substring(0,1).toLowerCase() + input.substring(1); - }else{ - throw new CodeGenerationException("Error converting input to first letter to lower because of null input"); - } - } -} diff --git a/android/driver-test/bin/runandroid.sh b/android/driver-test/bin/runandroid.sh deleted file mode 100755 index 454db86c955..00000000000 --- a/android/driver-test/bin/runandroid.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash -echo "" > classpath.txt -for file in `ls lib`; - do echo -n 'lib/' >> classpath.txt; - echo -n $file >> classpath.txt; - echo -n ':' >> classpath.txt; -done -for file in `ls build`; - do echo -n 'build/' >> classpath.txt; - echo -n $file >> classpath.txt; - echo -n ':' >> classpath.txt; -done - -export CLASSPATH=$(cat classpath.txt) -export JAVA_OPTS="${JAVA_OPTS} -DrulePath=data -Dproperty=Xmx2g -DloggerPath=$BUILD_COMMON/test-config/log4j.properties" -scala $WORDNIK_OPTS $JAVA_CONFIG_OPTIONS $JAVA_OPTS -cp $CLASSPATH "$@" - diff --git a/android/driver-test/build.xml b/android/driver-test/build.xml deleted file mode 100644 index 148fd488254..00000000000 --- a/android/driver-test/build.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/android/driver-test/ivy.xml b/android/driver-test/ivy.xml deleted file mode 100644 index cf338b359e2..00000000000 --- a/android/driver-test/ivy.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/android/driver-test/lib/ext/wordnik-java-driver-4.04.0.jar b/android/driver-test/lib/ext/wordnik-java-driver-4.04.0.jar deleted file mode 100644 index ca8a56361d5240803995786c8a80cb52a4abc4fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 89300 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 - * Second argument is auth token - * Third argument will be name of resource - * Fourth argument will be HTTP method name - * Fifth argument will be suggested methdo name - * 6th argument is for query and path parameters, if not available then gets empty string - * 7th argument is for post data, if not available get empty string - * - * @param args - * @throws Exception - */ - public static void main(String[] args) throws Exception { - WordAPI.initialize("c23b746d074135dc9500c0a61300a3cb7647e53ec2b9b658e", "http://beta.wordnik.com/v4/", false); - TestCaseExecutor runner = new TestCaseExecutor(); - String apiKey = args[0]; - String authToken = args[1]; - String resource = args[2]; - String method = args[3]; - String suggestedMethodName = args[4]; - Map queryAndPathParameters = new HashMap(); - String postData = null; - if(args.length > 5 && args[5].length() > 0){ - String[] qpTuple = args[5].split("~"); - for(String tuple: qpTuple){ - String[] nameValue = tuple.split("="); - queryAndPathParameters.put(nameValue[0], nameValue[1]); - } - } - if(args.length > 6 ){ - postData = args[6]; - } - queryAndPathParameters.put("authToken", authToken); - runner.executeTestCase(resource, method, suggestedMethodName, apiKey, authToken, queryAndPathParameters, - postData); - - } - - - private void executeTestCase(String resourceName, String httpMethod, String suggestedName, String apiKey, - String authToken, Map queryAndPathParameters, String postData) { - - String className = getAPIClassName(resourceName); - String methodName = suggestedName; - - //3 - try { - Class apiClass = Class.forName("com.wordnik.api." + className); - Method[] methods = apiClass.getMethods(); - Method methodToExecute = null; - for(Method method : methods){ - if(method.getName().equals(methodName)){ - methodToExecute = method; - break; - } - } - - if(methodToExecute != null) { - //4 - Object[] arguments = populateArgumentsForTestCaseExecution(methodToExecute, queryAndPathParameters, - postData); - Object output = null; - if(arguments != null && arguments.length > 0){ - //5 - output = methodToExecute.invoke(null, arguments); - }else{ - //5 - output = methodToExecute.invoke(null); - } - //6 - System.out.println("SUCCESS"); - System.out.println(convertObjectToJSONString(output)); - - } - }catch(WordnikAPIException e){ - System.out.println("ERROR"); - try{ - System.out.println(convertObjectToJSONString(e)); - }catch(Exception ex){ - ex.printStackTrace(); - } - } catch(Exception e){ - System.out.println("ERROR"); - try{ - WordnikAPIException apiException = new WordnikAPIException(WordnikExceptionCodes.SYSTEM_EXCEPTION, - e.getMessage()); - System.out.println(convertObjectToJSONString(apiException)); - }catch(Exception ex){ - ex.printStackTrace(); - } - } - } - - /** - * Gets the list of input query and path parameters and post data vlues and covenrt them to arguments that - * can be used for calling the method. This logic will be different in each driver language depends on how method - * input arguments are created. - */ - private Object[] populateArgumentsForTestCaseExecution(Method methodToExecute, Map queryAndPathParameters, - String postData) throws Exception { - MethodArgumentNames argNames = methodToExecute.getAnnotation(MethodArgumentNames.class); - String[] argNamesArray = null; - if(argNames != null && argNames.value().length() > 0) { - argNamesArray = argNames.value().split(","); - } - Class[] argTypesArray = methodToExecute.getParameterTypes(); - Object output = null; - - if(argNamesArray != null && argNamesArray.length > 0){ - Object[] arguments = new Object[argNamesArray.length]; - - for(int i=0; i < argNamesArray.length; i++){ - Object argument = null; - String canonicalName = argTypesArray[i].getCanonicalName(); - Class superclass = (Class)argTypesArray[i].getGenericSuperclass(); - //if the input argument is of type wordnik object then it is posisble that the object could be either - // post data or input wrapper object created by code generator. If it is wrpper object then use the - // individual query and path parameters to create the wrapper object. If it is post data directly - // convert input JSON string to post data object - if(superclass != null && superclass.getSimpleName().equalsIgnoreCase("WordnikObject")){ - if(argNamesArray[i].trim().equals("postData")){ - argument = convertJSONStringToObject(postData, argTypesArray[i]); - }else{ - argument = populateWordnikInputModelObject(argTypesArray[i], queryAndPathParameters); - } - }else{ - //the aruments can be primitive types for query and path data and for post data it could be either - //a object or collection of objects. Hence we need to identify the input is single or colection - //based on that un-marshal the string - if(argNamesArray[i].trim().equals("postData")){ - argument = convertJSONStringToObject(postData, argTypesArray[i]); - }else{ - argument = queryAndPathParameters.get(argNamesArray[i].trim()); - } - } - arguments[i] = argument; - } - return arguments; - } - return null; - } - - /** - * Populates the wordnik inout object. - * The definitions for the input will refer the attribute name directly as the input object is more of java driver concept - * hence the test script can not create the input with reference to input object. Test scirpt will only use attribute name. - * Example: If we are looking for a attribute called limit inside an WordExampleInput the input definitions in test script - * will have an entry as "input":10 (please note that there is no reference to input object) - * @param inputDefinitions - * @return - */ - private Object populateWordnikInputModelObject(Class wordnikClass, Map inputDefinitions) throws Exception { - Object object = wordnikClass.getConstructor().newInstance(); - Method[] methods = wordnikClass.getMethods(); - for(Method method : methods){ - if(method.getName().startsWith("get")){ - String methodName = method.getName(); - String fieldName = methodName.substring(3); - fieldName = convertFirstCharToSmall(fieldName); - Object value = inputDefinitions.get(fieldName); - BeanUtils.setProperty(object, fieldName, value); - } - } - return object; - } - - /** - * Converts the first character of the input into string. - * Example: If the input is word, the return value will be Word - * @param input - * @return - */ - public static String convertFirstCharToCaps(String input) { - if(input != null && input.length() > 0) { - return input.substring(0,1).toUpperCase() + input.substring(1); - } else { - throw new RuntimeException("Error converting input to first letter caps becuase of null input"); - } - } - - /** - * Converts the first character of the input into string. - * Example: If the input is word, the return value will be Word - * @param input - * @return - */ - public static String convertFirstCharToSmall(String input) { - if(input != null && input.length() > 0) { - return input.substring(0,1).toLowerCase() + input.substring(1); - }else{ - throw new RuntimeException("Error converting input to first letter to lower because of null input"); - } - } - - public static String getAPIClassName(String resourcePath) { - String className = null; - int index = resourcePath.indexOf("."); - if(index >= 0) { - String resourceName = resourcePath.substring(1,index); - className = convertFirstCharToCaps(resourceName)+"API"; - }else{ - String[] paths = resourcePath.split("/"); - for(String path : paths) { - if(path != null && path.length() > 0) { - className = convertFirstCharToCaps(path)+"API"; - break; - } - } - } - return className; - } - - /** - * Converts JSON string to object. - */ - public Object convertJSONStringToObject(String inputJSON, Class objectType) throws Exception { - boolean isArray = false; - boolean isList = false; - Class className = objectType; - String ObjectTypeName = objectType.getName(); - - //identify if the input is a array - if(ObjectTypeName.startsWith("[")){ - isArray = true; - className = objectType.getComponentType(); - } - - //identify if the input is a list - if(List.class.isAssignableFrom(objectType)){ - isList = true; - } - - if(isArray || isList){ - Object responseObject = mapper.readValue(inputJSON, TypeFactory.type(objectType)); - return responseObject; - }else{ - return WordnikAPI.deserialize(inputJSON, className); - } - } - - /** - * Converts JSON string to object. - */ - public static String convertObjectToJSONString(Object input) throws Exception { - return WordnikAPI.serialize(input); - } - -} diff --git a/android/driver/build.xml b/android/driver/build.xml deleted file mode 100644 index d0ab17b1e6a..00000000000 --- a/android/driver/build.xml +++ /dev/null @@ -1,95 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/android/driver/ivy.xml b/android/driver/ivy.xml deleted file mode 100644 index 7bc23721ea6..00000000000 --- a/android/driver/ivy.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/android/driver/src/main/java/com/wordnik/api/AccountAPI.java b/android/driver/src/main/java/com/wordnik/api/AccountAPI.java deleted file mode 100644 index bc6136081ea..00000000000 --- a/android/driver/src/main/java/com/wordnik/api/AccountAPI.java +++ /dev/null @@ -1,290 +0,0 @@ -package com.wordnik.api; - - -import com.wordnik.common.*; -import com.wordnik.common.ext.*; -import com.wordnik.exception.WordnikExceptionCodes; -import com.wordnik.exception.WordnikAPIException; -import com.wordnik.model.*; -import java.util.*; -import com.wordnik.annotations.MethodArgumentNames; -import org.codehaus.jackson.map.DeserializationConfig.Feature; -import org.codehaus.jackson.map.ObjectMapper; -import org.codehaus.jackson.type.TypeReference; -import java.io.IOException; - -/** - * NOTE: This class is auto generated by the drive code generator program so please do not edit the program manually. - * @author ramesh - * - */ -public class AccountAPI extends WordnikAPI { - - /** - * Authenticates a User - - * @param username A confirmed Wordnik username - - * @param password The user's password - - - * - * @return AuthenticationToken {@link AuthenticationToken} - * @throws WordnikAPIException 403 - Account not available. 404 - User not found. - */ - @MethodArgumentNames(value="username, password") - public static AuthenticationToken authenticate(String username, String password) throws WordnikAPIException { - - - //parse inputs - String resourcePath = "/account.{format}/authenticate/{username}"; - resourcePath = resourcePath.replace("{format}","json"); - String method = "GET"; - Map queryParams = new HashMap(); - - if( password != null) { - queryParams.put("password", password); - } - - if( username != null) { - resourcePath = resourcePath.replace("{username}", username); - } - - - //make the API Call - String response = invokeAPI(null, resourcePath, method, queryParams, null); - //create output objects if the response has more than one object - if(response == null || response.length() == 0){ - return null; - } - AuthenticationToken responseObject = (AuthenticationToken)deserialize(response, AuthenticationToken.class); - return responseObject; - - } - - - /** - * Returns usage statistics for the API account. - - * - * @return ApiTokenStatus {@link ApiTokenStatus} - * @throws WordnikAPIException 400 - No token supplied. 404 - No API account with supplied token. - */ - public static ApiTokenStatus getApiTokenStatus() throws WordnikAPIException { - - - //parse inputs - String resourcePath = "/account.{format}/apiTokenStatus"; - resourcePath = resourcePath.replace("{format}","json"); - String method = "GET"; - Map queryParams = new HashMap(); - - - - //make the API Call - String response = invokeAPI(null, resourcePath, method, queryParams, null); - //create output objects if the response has more than one object - if(response == null || response.length() == 0){ - return null; - } - ApiTokenStatus responseObject = (ApiTokenStatus)deserialize(response, ApiTokenStatus.class); - return responseObject; - - } - - - /** - * Returns an ApiResponse indicating whether or not a username is available - - * @param username Username - - - * - * @return ApiResponse {@link ApiResponse} - * @throws WordnikAPIException 400 - Invalid username supplied. 404 - No activation code available. - */ - @MethodArgumentNames(value="username") - public static ApiResponse getUsernameAvailable(String username) throws WordnikAPIException { - - - //parse inputs - String resourcePath = "/account.{format}/usernameAvailable/{username}"; - resourcePath = resourcePath.replace("{format}","json"); - String method = "GET"; - Map queryParams = new HashMap(); - - if( username != null) { - resourcePath = resourcePath.replace("{username}", username); - } - - - //make the API Call - String response = invokeAPI(null, resourcePath, method, queryParams, null); - //create output objects if the response has more than one object - if(response == null || response.length() == 0){ - return null; - } - ApiResponse responseObject = (ApiResponse)deserialize(response, ApiResponse.class); - return responseObject; - - } - - - /** - * Regenerates an API Token. Currently not supported or tested. - - * - * @return void {@link Void} - * @throws WordnikAPIException 400 - Invalid token supplied. - */ - public static void createApiAccount() throws WordnikAPIException { - - - //parse inputs - String resourcePath = "/account.{format}/regenerateApiToken"; - resourcePath = resourcePath.replace("{format}","json"); - String method = "GET"; - Map queryParams = new HashMap(); - - - - //make the API Call - String response = invokeAPI(null, resourcePath, method, queryParams, null); - //create output objects if the response has more than one object - - } - - - /** - * Authenticates a user - - * @param username A confirmed Wordnik username - - * @param postObject The user's password - - - * - * @return AuthenticationToken {@link AuthenticationToken} - * @throws WordnikAPIException 403 - Account not available. 404 - User not found. - */ - @MethodArgumentNames(value="username, postObject") - public static AuthenticationToken authenticatePost(String username, String postObject) throws WordnikAPIException { - - - //parse inputs - String resourcePath = "/account.{format}/authenticate/{username}"; - resourcePath = resourcePath.replace("{format}","json"); - String method = "POST"; - Map queryParams = new HashMap(); - - if( username != null) { - resourcePath = resourcePath.replace("{username}", username); - } - - - //make the API Call - - - String response = invokeAPI(null, resourcePath, method, queryParams, postObject); - //create output objects if the response has more than one object - if(response == null || response.length() == 0){ - return null; - } - AuthenticationToken responseObject = (AuthenticationToken)deserialize(response, AuthenticationToken.class); - return responseObject; - - } - - - /** - * Returns the logged-in User - Requires a valid auth_token to be set. - * @param authToken The auth token of the logged-in user, obtained by calling /account.{format}/authenticate/{username} (described above) - - - * - * @return User {@link User} - * @throws WordnikAPIException 403 - Not logged in. 404 - User not found. - */ - @MethodArgumentNames(value="authToken") - public static User getLoggedInUser(String authToken) throws WordnikAPIException { - - if(authToken == null || authToken.length() == 0) { - throw new WordnikAPIException(WordnikExceptionCodes.AUTH_TOKEN_NOT_VALID); - } - //parse inputs - String resourcePath = "/account.{format}/user"; - resourcePath = resourcePath.replace("{format}","json"); - String method = "GET"; - Map queryParams = new HashMap(); - - - - //make the API Call - String response = invokeAPI(authToken, resourcePath, method, queryParams, null); - //create output objects if the response has more than one object - if(response == null || response.length() == 0){ - return null; - } - User responseObject = (User)deserialize(response, User.class); - return responseObject; - - } - - - /** - * Fetches WordList objects for the logged-in user. - - * @param authToken auth_token of logged-in user - - * @param skip Results to skip - - * @param limit Maximum number of results to return - - - * - * @return List {@link WordList} - * @throws WordnikAPIException 403 - Not authenticated. 404 - User account not found. - */ - @MethodArgumentNames(value="authToken, skip, limit") - public static List getWordListsForCurrentUser(String authToken, String skip, String limit) throws WordnikAPIException { - - if(authToken == null || authToken.length() == 0) { - throw new WordnikAPIException(WordnikExceptionCodes.AUTH_TOKEN_NOT_VALID); - } - //parse inputs - String resourcePath = "/account.{format}/wordLists"; - resourcePath = resourcePath.replace("{format}","json"); - String method = "GET"; - Map queryParams = new HashMap(); - - if( skip != null) { - queryParams.put("skip", skip); - } - if( limit != null) { - queryParams.put("limit", limit); - } - - - - //make the API Call - String response = invokeAPI(authToken, resourcePath, method, queryParams, null); - //create output objects if the response has more than one object - if(response == null || response.length() == 0){ - return null; - } - - TypeReference> typeRef = new TypeReference>() { - }; - try { - List responseObject = (List) mapper.readValue(response, typeRef); - return responseObject; - } catch (IOException ioe) { - String[] args = new String[]{response, typeRef.toString()}; - throw new WordnikAPIException(WordnikExceptionCodes.ERROR_CONVERTING_JSON_TO_JAVA, args, "Error in converting response json value to java object : " + ioe.getMessage(), ioe); - } - } - - - -} \ No newline at end of file diff --git a/android/driver/src/main/java/com/wordnik/api/VersionChecker.java b/android/driver/src/main/java/com/wordnik/api/VersionChecker.java deleted file mode 100644 index 943f97a6cdd..00000000000 --- a/android/driver/src/main/java/com/wordnik/api/VersionChecker.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.wordnik.api; - -/** - * Maintains the compatible server version against which the drive is written - * @author ramesh - * - */ -public class VersionChecker { - - private String compatibleVersion = "4.05.30"; - - /** - * Gets the version against which the driver code was written - */ - public String getCompatibleVersion() { - return compatibleVersion; - } -} \ No newline at end of file diff --git a/android/driver/src/main/java/com/wordnik/api/WordAPI.java b/android/driver/src/main/java/com/wordnik/api/WordAPI.java deleted file mode 100644 index 2a0ba14d7a8..00000000000 --- a/android/driver/src/main/java/com/wordnik/api/WordAPI.java +++ /dev/null @@ -1,635 +0,0 @@ -package com.wordnik.api; - - -import com.wordnik.common.*; -import com.wordnik.common.ext.*; -import com.wordnik.exception.WordnikExceptionCodes; -import com.wordnik.exception.WordnikAPIException; -import com.wordnik.model.*; -import java.util.*; -import com.wordnik.annotations.MethodArgumentNames; -import org.codehaus.jackson.map.DeserializationConfig.Feature; -import org.codehaus.jackson.map.ObjectMapper; -import org.codehaus.jackson.type.TypeReference; -import java.io.IOException; - -/** - * NOTE: This class is auto generated by the drive code generator program so please do not edit the program manually. - * @author ramesh - * - */ -public class WordAPI extends AbstractWordAPI { - - /** - * Given a word as a string, returns the WordObject that represents it - - * @param word String value of WordObject to return - - * @param useCanonical If true will try to return the correct word root ('cats' -> 'cat'). If false returns exactly what was requested. - - * @param includeSuggestions Return suggestions (for correct spelling, case variants, etc.) - - - * - * @return WordObject {@link WordObject} - * @throws WordnikAPIException 400 - Invalid word supplied. - */ - @MethodArgumentNames(value="word, useCanonical, includeSuggestions") - public static WordObject getWord(String word, String useCanonical, String includeSuggestions) throws WordnikAPIException { - - - //parse inputs - String resourcePath = "/word.{format}/{word}"; - resourcePath = resourcePath.replace("{format}","json"); - String method = "GET"; - Map queryParams = new HashMap(); - - if( useCanonical != null) { - queryParams.put("useCanonical", useCanonical); - } - if( includeSuggestions != null) { - queryParams.put("includeSuggestions", includeSuggestions); - } - - if( word != null) { - resourcePath = resourcePath.replace("{word}", word); - } - - - //make the API Call - String response = invokeAPI(null, resourcePath, method, queryParams, null); - //create output objects if the response has more than one object - if(response == null || response.length() == 0){ - return null; - } - WordObject responseObject = (WordObject)deserialize(response, WordObject.class); - return responseObject; - - } - - - /** - * Returns examples for a word - - * @param wordExamplesInput - - - * - * @return ExampleSearchResults {@link ExampleSearchResults} - * @throws WordnikAPIException 400 - Invalid word supplied. - */ - @MethodArgumentNames(value="wordExamplesInput") - public static ExampleSearchResults getExamples(WordExamplesInput wordExamplesInput) throws WordnikAPIException { - - - //parse inputs - String resourcePath = "/word.{format}/{word}/examples"; - resourcePath = resourcePath.replace("{format}","json"); - String method = "GET"; - Map queryParams = new HashMap(); - - - if( wordExamplesInput != null && wordExamplesInput.getLimit() != null) { - queryParams.put("limit", wordExamplesInput.getLimit()); - } - if( wordExamplesInput != null && wordExamplesInput.getIncludeDuplicates() != null) { - queryParams.put("includeDuplicates", wordExamplesInput.getIncludeDuplicates()); - } - if( wordExamplesInput != null && wordExamplesInput.getContentProvider() != null) { - queryParams.put("contentProvider", wordExamplesInput.getContentProvider()); - } - if( wordExamplesInput != null && wordExamplesInput.getUseCanonical() != null) { - queryParams.put("useCanonical", wordExamplesInput.getUseCanonical()); - } - if( wordExamplesInput != null && wordExamplesInput.getSkip() != null) { - queryParams.put("skip", wordExamplesInput.getSkip()); - } - - if( wordExamplesInput != null && wordExamplesInput.getWord() != null) { - resourcePath = resourcePath.replace("{word}", wordExamplesInput.getWord()); - } - - //make the API Call - String response = invokeAPI(null, resourcePath, method, queryParams, null); - //create output objects if the response has more than one object - if(response == null || response.length() == 0){ - return null; - } - ExampleSearchResults responseObject = (ExampleSearchResults)deserialize(response, ExampleSearchResults.class); - return responseObject; - - } - - - /** - * Return definitions for a word - - * @param wordDefinitionsInput - - - * - * @return List {@link Definition} - * @throws WordnikAPIException 400 - Invalid word supplied. 404 - No definitions found. - */ - @MethodArgumentNames(value="wordDefinitionsInput") - public static List getDefinitions(WordDefinitionsInput wordDefinitionsInput) throws WordnikAPIException { - - - //parse inputs - String resourcePath = "/word.{format}/{word}/definitions"; - resourcePath = resourcePath.replace("{format}","json"); - String method = "GET"; - Map queryParams = new HashMap(); - - - if( wordDefinitionsInput != null && wordDefinitionsInput.getLimit() != null) { - queryParams.put("limit", wordDefinitionsInput.getLimit()); - } - if( wordDefinitionsInput != null && wordDefinitionsInput.getPartOfSpeech() != null) { - queryParams.put("partOfSpeech", wordDefinitionsInput.getPartOfSpeech()); - } - if( wordDefinitionsInput != null && wordDefinitionsInput.getIncludeRelated() != null) { - queryParams.put("includeRelated", wordDefinitionsInput.getIncludeRelated()); - } - if( wordDefinitionsInput != null && wordDefinitionsInput.getSourceDictionaries() != null) { - queryParams.put("sourceDictionaries", wordDefinitionsInput.getSourceDictionaries()); - } - if( wordDefinitionsInput != null && wordDefinitionsInput.getUseCanonical() != null) { - queryParams.put("useCanonical", wordDefinitionsInput.getUseCanonical()); - } - if( wordDefinitionsInput != null && wordDefinitionsInput.getIncludeTags() != null) { - queryParams.put("includeTags", wordDefinitionsInput.getIncludeTags()); - } - - if( wordDefinitionsInput != null && wordDefinitionsInput.getWord() != null) { - resourcePath = resourcePath.replace("{word}", wordDefinitionsInput.getWord()); - } - - //make the API Call - String response = invokeAPI(null, resourcePath, method, queryParams, null); - //create output objects if the response has more than one object - if(response == null || response.length() == 0){ - return null; - } - - TypeReference> typeRef = new TypeReference>() { - }; - try { - List responseObject = (List) mapper.readValue(response, typeRef); - return responseObject; - } catch (IOException ioe) { - String[] args = new String[]{response, typeRef.toString()}; - throw new WordnikAPIException(WordnikExceptionCodes.ERROR_CONVERTING_JSON_TO_JAVA, args, "Error in converting response json value to java object : " + ioe.getMessage(), ioe); - } - } - - - /** - * Returns a top example for a word - - * @param word Word to fetch examples for - - * @param contentProvider Return results from a specific ContentProvider - - * @param useCanonical If true will try to return the correct word root ('cats' -> 'cat'). If false returns exactly what was requested. - - - * - * @return Example {@link Example} - * @throws WordnikAPIException 400 - Invalid word supplied. - */ - @MethodArgumentNames(value="word, contentProvider, useCanonical") - public static Example getTopExample(String word, String contentProvider, String useCanonical) throws WordnikAPIException { - - - //parse inputs - String resourcePath = "/word.{format}/{word}/topExample"; - resourcePath = resourcePath.replace("{format}","json"); - String method = "GET"; - Map queryParams = new HashMap(); - - if( contentProvider != null) { - queryParams.put("contentProvider", contentProvider); - } - if( useCanonical != null) { - queryParams.put("useCanonical", useCanonical); - } - - if( word != null) { - resourcePath = resourcePath.replace("{word}", word); - } - - - //make the API Call - String response = invokeAPI(null, resourcePath, method, queryParams, null); - //create output objects if the response has more than one object - if(response == null || response.length() == 0){ - return null; - } - Example responseObject = (Example)deserialize(response, Example.class); - return responseObject; - - } - - - /** - * Return related words (thesaurus data) for a word - - * @param wordRelatedInput - - - * - * @return List {@link Related} - * @throws WordnikAPIException 400 - Invalid word supplied. 404 - No definitions found. - */ - @MethodArgumentNames(value="wordRelatedInput") - public static List getRelatedWords(WordRelatedInput wordRelatedInput) throws WordnikAPIException { - - - //parse inputs - String resourcePath = "/word.{format}/{word}/related"; - resourcePath = resourcePath.replace("{format}","json"); - String method = "GET"; - Map queryParams = new HashMap(); - - - if( wordRelatedInput != null && wordRelatedInput.getPartOfSpeech() != null) { - queryParams.put("partOfSpeech", wordRelatedInput.getPartOfSpeech()); - } - if( wordRelatedInput != null && wordRelatedInput.getSourceDictionary() != null) { - queryParams.put("sourceDictionary", wordRelatedInput.getSourceDictionary()); - } - if( wordRelatedInput != null && wordRelatedInput.getLimit() != null) { - queryParams.put("limit", wordRelatedInput.getLimit()); - } - if( wordRelatedInput != null && wordRelatedInput.getUseCanonical() != null) { - queryParams.put("useCanonical", wordRelatedInput.getUseCanonical()); - } - if( wordRelatedInput != null && wordRelatedInput.getType() != null) { - queryParams.put("type", wordRelatedInput.getType()); - } - - if( wordRelatedInput != null && wordRelatedInput.getWord() != null) { - resourcePath = resourcePath.replace("{word}", wordRelatedInput.getWord()); - } - - //make the API Call - String response = invokeAPI(null, resourcePath, method, queryParams, null); - //create output objects if the response has more than one object - if(response == null || response.length() == 0){ - return null; - } - - TypeReference> typeRef = new TypeReference>() { - }; - try { - List responseObject = (List) mapper.readValue(response, typeRef); - return responseObject; - } catch (IOException ioe) { - String[] args = new String[]{response, typeRef.toString()}; - throw new WordnikAPIException(WordnikExceptionCodes.ERROR_CONVERTING_JSON_TO_JAVA, args, "Error in converting response json value to java object : " + ioe.getMessage(), ioe); - } - } - - - /** - * Fetches bi-gram phrases for a word - - * @param word Word to fetch phrases for - - * @param limit Maximum number of results to return - - * @param wlmi Minimum WLMI for the phrase - - * @param useCanonical If true will try to return the correct word root ('cats' -> 'cat'). If false returns exactly what was requested. - - - * - * @return List {@link Bigram} - * @throws WordnikAPIException 400 - Invalid word supplied. - */ - @MethodArgumentNames(value="word, limit, wlmi, useCanonical") - public static List getPhrases(String word, String limit, String wlmi, String useCanonical) throws WordnikAPIException { - - - //parse inputs - String resourcePath = "/word.{format}/{word}/phrases"; - resourcePath = resourcePath.replace("{format}","json"); - String method = "GET"; - Map queryParams = new HashMap(); - - if( limit != null) { - queryParams.put("limit", limit); - } - if( wlmi != null) { - queryParams.put("wlmi", wlmi); - } - if( useCanonical != null) { - queryParams.put("useCanonical", useCanonical); - } - - if( word != null) { - resourcePath = resourcePath.replace("{word}", word); - } - - - //make the API Call - String response = invokeAPI(null, resourcePath, method, queryParams, null); - //create output objects if the response has more than one object - if(response == null || response.length() == 0){ - return null; - } - - TypeReference> typeRef = new TypeReference>() { - }; - try { - List responseObject = (List) mapper.readValue(response, typeRef); - return responseObject; - } catch (IOException ioe) { - String[] args = new String[]{response, typeRef.toString()}; - throw new WordnikAPIException(WordnikExceptionCodes.ERROR_CONVERTING_JSON_TO_JAVA, args, "Error in converting response json value to java object : " + ioe.getMessage(), ioe); - } - } - - - /** - * Returns syllable information for a word - - * @param word Word to get syllables for - - * @param useCanonical If true will try to return a correct word root ('cats' -> 'cat'). If false returns exactly what was requested. - - * @param sourceDictionary Get from a single dictionary. Valid options: ahd, century, wiktionary, webster, and wordnet. - - * @param limit Maximum number of results to return - - - * - * @return List {@link Syllable} - * @throws WordnikAPIException 400 - Invalid word supplied. - */ - @MethodArgumentNames(value="word, useCanonical, sourceDictionary, limit") - public static List getHyphenation(String word, String useCanonical, String sourceDictionary, String limit) throws WordnikAPIException { - - - //parse inputs - String resourcePath = "/word.{format}/{word}/hyphenation"; - resourcePath = resourcePath.replace("{format}","json"); - String method = "GET"; - Map queryParams = new HashMap(); - - if( useCanonical != null) { - queryParams.put("useCanonical", useCanonical); - } - if( sourceDictionary != null) { - queryParams.put("sourceDictionary", sourceDictionary); - } - if( limit != null) { - queryParams.put("limit", limit); - } - - if( word != null) { - resourcePath = resourcePath.replace("{word}", word); - } - - - //make the API Call - String response = invokeAPI(null, resourcePath, method, queryParams, null); - //create output objects if the response has more than one object - if(response == null || response.length() == 0){ - return null; - } - - TypeReference> typeRef = new TypeReference>() { - }; - try { - List responseObject = (List) mapper.readValue(response, typeRef); - return responseObject; - } catch (IOException ioe) { - String[] args = new String[]{response, typeRef.toString()}; - throw new WordnikAPIException(WordnikExceptionCodes.ERROR_CONVERTING_JSON_TO_JAVA, args, "Error in converting response json value to java object : " + ioe.getMessage(), ioe); - } - } - - - /** - * Returns text pronunciations for a given word - - * @param wordPronunciationsInput - - - * - * @return List {@link TextPron} - * @throws WordnikAPIException 400 - Invalid word supplied. - */ - @MethodArgumentNames(value="wordPronunciationsInput") - public static List getTextPronunciations(WordPronunciationsInput wordPronunciationsInput) throws WordnikAPIException { - - - //parse inputs - String resourcePath = "/word.{format}/{word}/pronunciations"; - resourcePath = resourcePath.replace("{format}","json"); - String method = "GET"; - Map queryParams = new HashMap(); - - - if( wordPronunciationsInput != null && wordPronunciationsInput.getUseCanonical() != null) { - queryParams.put("useCanonical", wordPronunciationsInput.getUseCanonical()); - } - if( wordPronunciationsInput != null && wordPronunciationsInput.getSourceDictionary() != null) { - queryParams.put("sourceDictionary", wordPronunciationsInput.getSourceDictionary()); - } - if( wordPronunciationsInput != null && wordPronunciationsInput.getTypeFormat() != null) { - queryParams.put("typeFormat", wordPronunciationsInput.getTypeFormat()); - } - if( wordPronunciationsInput != null && wordPronunciationsInput.getLimit() != null) { - queryParams.put("limit", wordPronunciationsInput.getLimit()); - } - - if( wordPronunciationsInput != null && wordPronunciationsInput.getWord() != null) { - resourcePath = resourcePath.replace("{word}", wordPronunciationsInput.getWord()); - } - - //make the API Call - String response = invokeAPI(null, resourcePath, method, queryParams, null); - //create output objects if the response has more than one object - if(response == null || response.length() == 0){ - return null; - } - - TypeReference> typeRef = new TypeReference>() { - }; - try { - List responseObject = (List) mapper.readValue(response, typeRef); - return responseObject; - } catch (IOException ioe) { - String[] args = new String[]{response, typeRef.toString()}; - throw new WordnikAPIException(WordnikExceptionCodes.ERROR_CONVERTING_JSON_TO_JAVA, args, "Error in converting response json value to java object : " + ioe.getMessage(), ioe); - } - } - - - /** - * Returns other forms of a word - - * @param word Word to fetch forms for - - * @param useCanonical If true will try to return a correct word root ('cats' -> 'cat'). If false returns exactly what was requested. - - - * - * @return RelationshipMap {@link RelationshipMap} - * @throws WordnikAPIException 400 - Invalid word supplied. 404 - No results. - */ - @MethodArgumentNames(value="word, useCanonical") - public static RelationshipMap getWordForms(String word, String useCanonical) throws WordnikAPIException { - - - //parse inputs - String resourcePath = "/word.{format}/{word}/wordForms"; - resourcePath = resourcePath.replace("{format}","json"); - String method = "GET"; - Map queryParams = new HashMap(); - - if( useCanonical != null) { - queryParams.put("useCanonical", useCanonical); - } - - if( word != null) { - resourcePath = resourcePath.replace("{word}", word); - } - - - //make the API Call - String response = invokeAPI(null, resourcePath, method, queryParams, null); - //create output objects if the response has more than one object - if(response == null || response.length() == 0){ - return null; - } - RelationshipMap responseObject = (RelationshipMap)deserialize(response, RelationshipMap.class); - return responseObject; - - } - - - /** - * Returns definitions for a word based on the sentence in which it is found - Use the offset parameter when the word occurs more than once in the sentence - * @param wordContextualLookupInput - - - * - * @return DefinitionSearchResults {@link DefinitionSearchResults} - * @throws WordnikAPIException 400 - Invalid word supplied. - */ - @MethodArgumentNames(value="wordContextualLookupInput") - public static DefinitionSearchResults contextualLookup(WordContextualLookupInput wordContextualLookupInput) throws WordnikAPIException { - - - //parse inputs - String resourcePath = "/word.{format}/{word}/contextualLookup"; - resourcePath = resourcePath.replace("{format}","json"); - String method = "GET"; - Map queryParams = new HashMap(); - - - if( wordContextualLookupInput != null && wordContextualLookupInput.getSentence() != null) { - queryParams.put("sentence", wordContextualLookupInput.getSentence()); - } - if( wordContextualLookupInput != null && wordContextualLookupInput.getOffset() != null) { - queryParams.put("offset", wordContextualLookupInput.getOffset()); - } - if( wordContextualLookupInput != null && wordContextualLookupInput.getExpandTerms() != null) { - queryParams.put("expandTerms", wordContextualLookupInput.getExpandTerms()); - } - if( wordContextualLookupInput != null && wordContextualLookupInput.getIncludeSourceDictionaries() != null) { - queryParams.put("includeSourceDictionaries", wordContextualLookupInput.getIncludeSourceDictionaries()); - } - if( wordContextualLookupInput != null && wordContextualLookupInput.getExcludeSourceDictionaries() != null) { - queryParams.put("excludeSourceDictionaries", wordContextualLookupInput.getExcludeSourceDictionaries()); - } - if( wordContextualLookupInput != null && wordContextualLookupInput.getSkip() != null) { - queryParams.put("skip", wordContextualLookupInput.getSkip()); - } - if( wordContextualLookupInput != null && wordContextualLookupInput.getLimit() != null) { - queryParams.put("limit", wordContextualLookupInput.getLimit()); - } - - if( wordContextualLookupInput != null && wordContextualLookupInput.getWord() != null) { - resourcePath = resourcePath.replace("{word}", wordContextualLookupInput.getWord()); - } - - //make the API Call - String response = invokeAPI(null, resourcePath, method, queryParams, null); - //create output objects if the response has more than one object - if(response == null || response.length() == 0){ - return null; - } - DefinitionSearchResults responseObject = (DefinitionSearchResults)deserialize(response, DefinitionSearchResults.class); - return responseObject; - - } - - - /** - * Returns definitions for a word based on the sentence in which it is found - Use the offset parameter when the word occurs more than once in the sentence - * @param postObject The sentence in which the word occurs - - * @param wordContextualLookupInput - - - * - * @return DefinitionSearchResults {@link DefinitionSearchResults} - * @throws WordnikAPIException 400 - Invalid term supplied. - */ - @MethodArgumentNames(value="postObject, wordContextualLookupInput") - public static DefinitionSearchResults contextualLookupPost(String postObject, WordContextualLookupInput wordContextualLookupInput) throws WordnikAPIException { - - - //parse inputs - String resourcePath = "/word.{format}/{word}/contextualLookup"; - resourcePath = resourcePath.replace("{format}","json"); - String method = "POST"; - Map queryParams = new HashMap(); - - - if( wordContextualLookupInput != null && wordContextualLookupInput.getOffset() != null) { - queryParams.put("offset", wordContextualLookupInput.getOffset()); - } - if( wordContextualLookupInput != null && wordContextualLookupInput.getExpandTerms() != null) { - queryParams.put("expandTerms", wordContextualLookupInput.getExpandTerms()); - } - if( wordContextualLookupInput != null && wordContextualLookupInput.getIncludeSourceDictionaries() != null) { - queryParams.put("includeSourceDictionaries", wordContextualLookupInput.getIncludeSourceDictionaries()); - } - if( wordContextualLookupInput != null && wordContextualLookupInput.getExcludeSourceDictionaries() != null) { - queryParams.put("excludeSourceDictionaries", wordContextualLookupInput.getExcludeSourceDictionaries()); - } - if( wordContextualLookupInput != null && wordContextualLookupInput.getSkip() != null) { - queryParams.put("skip", wordContextualLookupInput.getSkip()); - } - if( wordContextualLookupInput != null && wordContextualLookupInput.getLimit() != null) { - queryParams.put("limit", wordContextualLookupInput.getLimit()); - } - - if( wordContextualLookupInput != null && wordContextualLookupInput.getWord() != null) { - resourcePath = resourcePath.replace("{word}", wordContextualLookupInput.getWord()); - } - - //make the API Call - - - String response = invokeAPI(null, resourcePath, method, queryParams, postObject); - //create output objects if the response has more than one object - if(response == null || response.length() == 0){ - return null; - } - DefinitionSearchResults responseObject = (DefinitionSearchResults)deserialize(response, DefinitionSearchResults.class); - return responseObject; - - } - - - -} \ No newline at end of file diff --git a/android/driver/src/main/java/com/wordnik/api/WordListAPI.java b/android/driver/src/main/java/com/wordnik/api/WordListAPI.java deleted file mode 100644 index a1089045ad0..00000000000 --- a/android/driver/src/main/java/com/wordnik/api/WordListAPI.java +++ /dev/null @@ -1,282 +0,0 @@ -package com.wordnik.api; - - -import com.wordnik.common.*; -import com.wordnik.common.ext.*; -import com.wordnik.exception.WordnikExceptionCodes; -import com.wordnik.exception.WordnikAPIException; -import com.wordnik.model.*; -import java.util.*; -import com.wordnik.annotations.MethodArgumentNames; -import org.codehaus.jackson.map.DeserializationConfig.Feature; -import org.codehaus.jackson.map.ObjectMapper; -import org.codehaus.jackson.type.TypeReference; -import java.io.IOException; - -/** - * NOTE: This class is auto generated by the drive code generator program so please do not edit the program manually. - * @author ramesh - * - */ -public class WordListAPI extends WordnikAPI { - - /** - * Fetches a WordList by ID - - * @param wordListId ID of WordList to fetch - - * @param authToken The auth token of the logged-in user, obtained by calling /account.{format}/authenticate/{username} (described above) - - - * - * @return WordList {@link WordList} - * @throws WordnikAPIException 400 - Invalid ID supplied 403 - Not Authorized to access WordList 404 - WordList not found - */ - @MethodArgumentNames(value="wordListId, authToken") - public static WordList getWordListById(String wordListId, String authToken) throws WordnikAPIException { - - if(authToken == null || authToken.length() == 0) { - throw new WordnikAPIException(WordnikExceptionCodes.AUTH_TOKEN_NOT_VALID); - } - //parse inputs - String resourcePath = "/wordList.{format}/{wordListId}"; - resourcePath = resourcePath.replace("{format}","json"); - String method = "GET"; - Map queryParams = new HashMap(); - - if( wordListId != null) { - resourcePath = resourcePath.replace("{wordListId}", wordListId); - } - - - //make the API Call - String response = invokeAPI(authToken, resourcePath, method, queryParams, null); - //create output objects if the response has more than one object - if(response == null || response.length() == 0){ - return null; - } - WordList responseObject = (WordList)deserialize(response, WordList.class); - return responseObject; - - } - - - /** - * Fetches words in a WordList - - * @param authToken The auth token of the logged-in user, obtained by calling /account.{format}/authenticate/{username} (described above) - - * @param wordListWordsInput - - - * - * @return List {@link WordListWord} - * @throws WordnikAPIException 400 - Invalid ID supplied 403 - Not Authorized to access WordList 404 - WordList not found - */ - @MethodArgumentNames(value="authToken, wordListWordsInput") - public static List getWordListWords(String authToken, WordListWordsInput wordListWordsInput) throws WordnikAPIException { - - if(authToken == null || authToken.length() == 0) { - throw new WordnikAPIException(WordnikExceptionCodes.AUTH_TOKEN_NOT_VALID); - } - //parse inputs - String resourcePath = "/wordList.{format}/{wordListId}/words"; - resourcePath = resourcePath.replace("{format}","json"); - String method = "GET"; - Map queryParams = new HashMap(); - - - if( wordListWordsInput != null && wordListWordsInput.getSortBy() != null) { - queryParams.put("sortBy", wordListWordsInput.getSortBy()); - } - if( wordListWordsInput != null && wordListWordsInput.getSortOrder() != null) { - queryParams.put("sortOrder", wordListWordsInput.getSortOrder()); - } - if( wordListWordsInput != null && wordListWordsInput.getSkip() != null) { - queryParams.put("skip", wordListWordsInput.getSkip()); - } - if( wordListWordsInput != null && wordListWordsInput.getLimit() != null) { - queryParams.put("limit", wordListWordsInput.getLimit()); - } - - if( wordListWordsInput != null && wordListWordsInput.getWordListId() != null) { - resourcePath = resourcePath.replace("{wordListId}", wordListWordsInput.getWordListId()); - } - - //make the API Call - String response = invokeAPI(authToken, resourcePath, method, queryParams, null); - //create output objects if the response has more than one object - if(response == null || response.length() == 0){ - return null; - } - - TypeReference> typeRef = new TypeReference>() { - }; - try { - List responseObject = (List) mapper.readValue(response, typeRef); - return responseObject; - } catch (IOException ioe) { - String[] args = new String[]{response, typeRef.toString()}; - throw new WordnikAPIException(WordnikExceptionCodes.ERROR_CONVERTING_JSON_TO_JAVA, args, "Error in converting response json value to java object : " + ioe.getMessage(), ioe); - } - } - - - /** - * Adds words to a WordList - - * @param wordListId ID of WordList to user - - * @param postObject Words to add to WordList - - * @param authToken The auth token of the logged-in user, obtained by calling /account.{format}/authenticate/{username} (described above) - - - * - * @return void {@link Void} - * @throws WordnikAPIException 400 - Invalid ID supplied 403 - Not Authorized to access WordList 404 - WordList not found - */ - @MethodArgumentNames(value="wordListId, postObject, authToken") - public static void addWordsToWordList(String wordListId, StringValue[] postObject, String authToken) throws WordnikAPIException { - - if(authToken == null || authToken.length() == 0) { - throw new WordnikAPIException(WordnikExceptionCodes.AUTH_TOKEN_NOT_VALID); - } - //parse inputs - String resourcePath = "/wordList.{format}/{wordListId}/words"; - resourcePath = resourcePath.replace("{format}","json"); - String method = "POST"; - Map queryParams = new HashMap(); - - if( wordListId != null) { - resourcePath = resourcePath.replace("{wordListId}", wordListId); - } - - - //make the API Call - - String response = invokeAPI(authToken, resourcePath, method, queryParams, postObject); - - //create output objects if the response has more than one object - - } - - - /** - * Updates an existing WordList - - * @param wordListId ID of WordList to update - - * @param postObject Updated WordList - - * @param authToken The auth token of the logged-in user, obtained by calling /account.{format}/authenticate/{username} (described above) - - - * - * @return void {@link Void} - * @throws WordnikAPIException 400 - Invalid ID supplied 403 - Not Authorized to update WordList 404 - WordList not found - */ - @MethodArgumentNames(value="wordListId, postObject, authToken") - public static void updateWordList(String wordListId, WordList postObject, String authToken) throws WordnikAPIException { - - if(authToken == null || authToken.length() == 0) { - throw new WordnikAPIException(WordnikExceptionCodes.AUTH_TOKEN_NOT_VALID); - } - //parse inputs - String resourcePath = "/wordList.{format}/{wordListId}"; - resourcePath = resourcePath.replace("{format}","json"); - String method = "PUT"; - Map queryParams = new HashMap(); - - if( wordListId != null) { - resourcePath = resourcePath.replace("{wordListId}", wordListId); - } - - - //make the API Call - - String response = invokeAPI(authToken, resourcePath, method, queryParams, postObject); - - //create output objects if the response has more than one object - - } - - - /** - * Deletes an existing WordList - - * @param wordListId ID of WordList to delete - - * @param authToken The auth token of the logged-in user, obtained by calling /account.{format}/authenticate/{username} (described above) - - - * - * @return void {@link Void} - * @throws WordnikAPIException 400 - Invalid ID supplied 403 - Not Authorized to delete WordList 404 - WordList not found - */ - @MethodArgumentNames(value="wordListId, authToken") - public static void deleteWordList(String wordListId, String authToken) throws WordnikAPIException { - - if(authToken == null || authToken.length() == 0) { - throw new WordnikAPIException(WordnikExceptionCodes.AUTH_TOKEN_NOT_VALID); - } - //parse inputs - String resourcePath = "/wordList.{format}/{wordListId}"; - resourcePath = resourcePath.replace("{format}","json"); - String method = "DELETE"; - Map queryParams = new HashMap(); - - if( wordListId != null) { - resourcePath = resourcePath.replace("{wordListId}", wordListId); - } - - - //make the API Call - String response = invokeAPI(authToken, resourcePath, method, queryParams, null); - //create output objects if the response has more than one object - - } - - - /** - * Removes words from a WordList - - * @param wordListId ID of WordList to use - - * @param postObject Words to remove from WordList - - * @param authToken The auth token of the logged-in user, obtained by calling /account.{format}/authenticate/{username} (described above) - - - * - * @return void {@link Void} - * @throws WordnikAPIException 400 - Invalid ID supplied 403 - Not Authorized to modify WordList 404 - WordList not found - */ - @MethodArgumentNames(value="wordListId, postObject, authToken") - public static void deleteWordsFromWordList(String wordListId, StringValue[] postObject, String authToken) throws WordnikAPIException { - - if(authToken == null || authToken.length() == 0) { - throw new WordnikAPIException(WordnikExceptionCodes.AUTH_TOKEN_NOT_VALID); - } - //parse inputs - String resourcePath = "/wordList.{format}/{wordListId}/deleteWords"; - resourcePath = resourcePath.replace("{format}","json"); - String method = "POST"; - Map queryParams = new HashMap(); - - if( wordListId != null) { - resourcePath = resourcePath.replace("{wordListId}", wordListId); - } - - - //make the API Call - - String response = invokeAPI(authToken, resourcePath, method, queryParams, postObject); - - //create output objects if the response has more than one object - - } - - - -} \ No newline at end of file diff --git a/android/driver/src/main/java/com/wordnik/api/WordListsAPI.java b/android/driver/src/main/java/com/wordnik/api/WordListsAPI.java deleted file mode 100644 index c348d598670..00000000000 --- a/android/driver/src/main/java/com/wordnik/api/WordListsAPI.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.wordnik.api; - - -import com.wordnik.common.*; -import com.wordnik.common.ext.*; -import com.wordnik.exception.WordnikExceptionCodes; -import com.wordnik.exception.WordnikAPIException; -import com.wordnik.model.*; -import java.util.*; -import com.wordnik.annotations.MethodArgumentNames; -import org.codehaus.jackson.map.DeserializationConfig.Feature; -import org.codehaus.jackson.map.ObjectMapper; -import org.codehaus.jackson.type.TypeReference; -import java.io.IOException; - -/** - * NOTE: This class is auto generated by the drive code generator program so please do not edit the program manually. - * @author ramesh - * - */ -public class WordListsAPI extends WordnikAPI { - - /** - * Returns information about API parameters - - * - * @return Doc {@link Doc} - * @throws WordnikAPIException 404 - No data available - */ - public static Doc getHelp() throws WordnikAPIException { - - - //parse inputs - String resourcePath = "/wordLists.{format}"; - resourcePath = resourcePath.replace("{format}","json"); - String method = "GET"; - Map queryParams = new HashMap(); - - - - //make the API Call - String response = invokeAPI(null, resourcePath, method, queryParams, null); - //create output objects if the response has more than one object - if(response == null || response.length() == 0){ - return null; - } - Doc responseObject = (Doc)deserialize(response, Doc.class); - return responseObject; - - } - - - /** - * Creates a WordList. - - * @param postObject WordList to create - - * @param authToken The auth token of the logged-in user, obtained by calling /account.{format}/authenticate/{username} (described above) - - - * - * @return WordList {@link WordList} - * @throws WordnikAPIException 400 - Invalid WordList supplied or mandatory fields are missing. 403 - Not authenticated. 404 - WordList owner not found. - */ - @MethodArgumentNames(value="postObject, authToken") - public static WordList createWordList(WordList postObject, String authToken) throws WordnikAPIException { - - if(authToken == null || authToken.length() == 0) { - throw new WordnikAPIException(WordnikExceptionCodes.AUTH_TOKEN_NOT_VALID); - } - //parse inputs - String resourcePath = "/wordLists.{format}"; - resourcePath = resourcePath.replace("{format}","json"); - String method = "POST"; - Map queryParams = new HashMap(); - - - - //make the API Call - - String response = invokeAPI(authToken, resourcePath, method, queryParams, postObject); - - //create output objects if the response has more than one object - if(response == null || response.length() == 0){ - return null; - } - WordList responseObject = (WordList)deserialize(response, WordList.class); - return responseObject; - - } - - - -} \ No newline at end of file diff --git a/android/driver/src/main/java/com/wordnik/api/WordsAPI.java b/android/driver/src/main/java/com/wordnik/api/WordsAPI.java deleted file mode 100644 index 47ee4a47eef..00000000000 --- a/android/driver/src/main/java/com/wordnik/api/WordsAPI.java +++ /dev/null @@ -1,848 +0,0 @@ -package com.wordnik.api; - - -import com.wordnik.common.*; -import com.wordnik.common.ext.*; -import com.wordnik.exception.WordnikExceptionCodes; -import com.wordnik.exception.WordnikAPIException; -import com.wordnik.model.*; -import java.util.*; -import com.wordnik.annotations.MethodArgumentNames; -import org.codehaus.jackson.map.DeserializationConfig.Feature; -import org.codehaus.jackson.map.ObjectMapper; -import org.codehaus.jackson.type.TypeReference; -import java.io.IOException; - -/** - * NOTE: This class is auto generated by the drive code generator program so please do not edit the program manually. - * @author ramesh - * - */ -public class WordsAPI extends WordnikAPI { - - /** - * Returns a single random WordObject, in the format specified by the URL - - * @param wordsRandomWordInput - - - * - * @return WordObject {@link WordObject} - * @throws WordnikAPIException 404 - No word found. - */ - @MethodArgumentNames(value="wordsRandomWordInput") - public static WordObject getRandomWord(WordsRandomWordInput wordsRandomWordInput) throws WordnikAPIException { - - - //parse inputs - String resourcePath = "/words.{format}/randomWord"; - resourcePath = resourcePath.replace("{format}","json"); - String method = "GET"; - Map queryParams = new HashMap(); - - - if( wordsRandomWordInput != null && wordsRandomWordInput.getHasDictionaryDef() != null) { - queryParams.put("hasDictionaryDef", wordsRandomWordInput.getHasDictionaryDef()); - } - if( wordsRandomWordInput != null && wordsRandomWordInput.getIncludePartOfSpeech() != null) { - queryParams.put("includePartOfSpeech", wordsRandomWordInput.getIncludePartOfSpeech()); - } - if( wordsRandomWordInput != null && wordsRandomWordInput.getExcludePartOfSpeech() != null) { - queryParams.put("excludePartOfSpeech", wordsRandomWordInput.getExcludePartOfSpeech()); - } - if( wordsRandomWordInput != null && wordsRandomWordInput.getMinCorpusCount() != null) { - queryParams.put("minCorpusCount", wordsRandomWordInput.getMinCorpusCount()); - } - if( wordsRandomWordInput != null && wordsRandomWordInput.getMaxCorpusCount() != null) { - queryParams.put("maxCorpusCount", wordsRandomWordInput.getMaxCorpusCount()); - } - if( wordsRandomWordInput != null && wordsRandomWordInput.getMinDictionaryCount() != null) { - queryParams.put("minDictionaryCount", wordsRandomWordInput.getMinDictionaryCount()); - } - if( wordsRandomWordInput != null && wordsRandomWordInput.getMaxDictionaryCount() != null) { - queryParams.put("maxDictionaryCount", wordsRandomWordInput.getMaxDictionaryCount()); - } - if( wordsRandomWordInput != null && wordsRandomWordInput.getMinLength() != null) { - queryParams.put("minLength", wordsRandomWordInput.getMinLength()); - } - if( wordsRandomWordInput != null && wordsRandomWordInput.getMaxLength() != null) { - queryParams.put("maxLength", wordsRandomWordInput.getMaxLength()); - } - - - //make the API Call - String response = invokeAPI(null, resourcePath, method, queryParams, null); - //create output objects if the response has more than one object - if(response == null || response.length() == 0){ - return null; - } - WordObject responseObject = (WordObject)deserialize(response, WordObject.class); - return responseObject; - - } - - - /** - * Returns an array of random WordObjects, in the format specified by the URL - - * @param wordsRandomWordsInput - - - * - * @return List {@link WordObject} - * @throws WordnikAPIException 400 - Invalid term supplied. 404 - No results. - */ - @MethodArgumentNames(value="wordsRandomWordsInput") - public static List getRandomWords(WordsRandomWordsInput wordsRandomWordsInput) throws WordnikAPIException { - - - //parse inputs - String resourcePath = "/words.{format}/randomWords"; - resourcePath = resourcePath.replace("{format}","json"); - String method = "GET"; - Map queryParams = new HashMap(); - - - if( wordsRandomWordsInput != null && wordsRandomWordsInput.getHasDictionaryDef() != null) { - queryParams.put("hasDictionaryDef", wordsRandomWordsInput.getHasDictionaryDef()); - } - if( wordsRandomWordsInput != null && wordsRandomWordsInput.getIncludePartOfSpeech() != null) { - queryParams.put("includePartOfSpeech", wordsRandomWordsInput.getIncludePartOfSpeech()); - } - if( wordsRandomWordsInput != null && wordsRandomWordsInput.getExcludePartOfSpeech() != null) { - queryParams.put("excludePartOfSpeech", wordsRandomWordsInput.getExcludePartOfSpeech()); - } - if( wordsRandomWordsInput != null && wordsRandomWordsInput.getMinCorpusCount() != null) { - queryParams.put("minCorpusCount", wordsRandomWordsInput.getMinCorpusCount()); - } - if( wordsRandomWordsInput != null && wordsRandomWordsInput.getMaxCorpusCount() != null) { - queryParams.put("maxCorpusCount", wordsRandomWordsInput.getMaxCorpusCount()); - } - if( wordsRandomWordsInput != null && wordsRandomWordsInput.getMinDictionaryCount() != null) { - queryParams.put("minDictionaryCount", wordsRandomWordsInput.getMinDictionaryCount()); - } - if( wordsRandomWordsInput != null && wordsRandomWordsInput.getMaxDictionaryCount() != null) { - queryParams.put("maxDictionaryCount", wordsRandomWordsInput.getMaxDictionaryCount()); - } - if( wordsRandomWordsInput != null && wordsRandomWordsInput.getMinLength() != null) { - queryParams.put("minLength", wordsRandomWordsInput.getMinLength()); - } - if( wordsRandomWordsInput != null && wordsRandomWordsInput.getMaxLength() != null) { - queryParams.put("maxLength", wordsRandomWordsInput.getMaxLength()); - } - if( wordsRandomWordsInput != null && wordsRandomWordsInput.getSortBy() != null) { - queryParams.put("sortBy", wordsRandomWordsInput.getSortBy()); - } - if( wordsRandomWordsInput != null && wordsRandomWordsInput.getSortOrder() != null) { - queryParams.put("sortOrder", wordsRandomWordsInput.getSortOrder()); - } - if( wordsRandomWordsInput != null && wordsRandomWordsInput.getLimit() != null) { - queryParams.put("limit", wordsRandomWordsInput.getLimit()); - } - - - //make the API Call - String response = invokeAPI(null, resourcePath, method, queryParams, null); - //create output objects if the response has more than one object - if(response == null || response.length() == 0){ - return null; - } - - TypeReference> typeRef = new TypeReference>() { - }; - try { - List responseObject = (List) mapper.readValue(response, typeRef); - return responseObject; - } catch (IOException ioe) { - String[] args = new String[]{response, typeRef.toString()}; - throw new WordnikAPIException(WordnikExceptionCodes.ERROR_CONVERTING_JSON_TO_JAVA, args, "Error in converting response json value to java object : " + ioe.getMessage(), ioe); - } - } - - - /** - * Searches words. - - * @param wordsSearchInput - - - * - * @return List {@link WordFrequency} - * @throws WordnikAPIException 400 - Invalid term supplied. 404 - No results. - */ - @MethodArgumentNames(value="wordsSearchInput") - public static List searchWords(WordsSearchInput wordsSearchInput) throws WordnikAPIException { - - - //parse inputs - String resourcePath = "/words.{format}/search"; - resourcePath = resourcePath.replace("{format}","json"); - String method = "GET"; - Map queryParams = new HashMap(); - - - if( wordsSearchInput != null && wordsSearchInput.getQuery() != null) { - queryParams.put("query", wordsSearchInput.getQuery()); - } - if( wordsSearchInput != null && wordsSearchInput.getCaseSensitive() != null) { - queryParams.put("caseSensitive", wordsSearchInput.getCaseSensitive()); - } - if( wordsSearchInput != null && wordsSearchInput.getIncludePartOfSpeech() != null) { - queryParams.put("includePartOfSpeech", wordsSearchInput.getIncludePartOfSpeech()); - } - if( wordsSearchInput != null && wordsSearchInput.getExcludePartOfSpeech() != null) { - queryParams.put("excludePartOfSpeech", wordsSearchInput.getExcludePartOfSpeech()); - } - if( wordsSearchInput != null && wordsSearchInput.getMinCorpusCount() != null) { - queryParams.put("minCorpusCount", wordsSearchInput.getMinCorpusCount()); - } - if( wordsSearchInput != null && wordsSearchInput.getMaxCorpusCount() != null) { - queryParams.put("maxCorpusCount", wordsSearchInput.getMaxCorpusCount()); - } - if( wordsSearchInput != null && wordsSearchInput.getMinDictionaryCount() != null) { - queryParams.put("minDictionaryCount", wordsSearchInput.getMinDictionaryCount()); - } - if( wordsSearchInput != null && wordsSearchInput.getMaxDictionaryCount() != null) { - queryParams.put("maxDictionaryCount", wordsSearchInput.getMaxDictionaryCount()); - } - if( wordsSearchInput != null && wordsSearchInput.getMinLength() != null) { - queryParams.put("minLength", wordsSearchInput.getMinLength()); - } - if( wordsSearchInput != null && wordsSearchInput.getMaxLength() != null) { - queryParams.put("maxLength", wordsSearchInput.getMaxLength()); - } - if( wordsSearchInput != null && wordsSearchInput.getSkip() != null) { - queryParams.put("skip", wordsSearchInput.getSkip()); - } - if( wordsSearchInput != null && wordsSearchInput.getLimit() != null) { - queryParams.put("limit", wordsSearchInput.getLimit()); - } - - - //make the API Call - String response = invokeAPI(null, resourcePath, method, queryParams, null); - //create output objects if the response has more than one object - if(response == null || response.length() == 0){ - return null; - } - - TypeReference> typeRef = new TypeReference>() { - }; - try { - List responseObject = (List) mapper.readValue(response, typeRef); - return responseObject; - } catch (IOException ioe) { - String[] args = new String[]{response, typeRef.toString()}; - throw new WordnikAPIException(WordnikExceptionCodes.ERROR_CONVERTING_JSON_TO_JAVA, args, "Error in converting response json value to java object : " + ioe.getMessage(), ioe); - } - } - - - /** - * Fetches an array of WordOfTheDayList basd on a criteria - - * @param containsWord Lists must contain a specific word - - * @param subscriberCount Lists must have the specified number of subscribers - - * @param itemCount Lists must have the specified number of items - - * @param includeAll Returns future WordOfTheDay items - - - * - * @return List {@link WordOfTheDayList} - * @throws WordnikAPIException 400 - Invalid word supplied. - */ - @MethodArgumentNames(value="containsWord, subscriberCount, itemCount, includeAll") - public static List getWordOfTheDayListsContainingWord(String containsWord, String subscriberCount, String itemCount, String includeAll) throws WordnikAPIException { - - - //parse inputs - String resourcePath = "/words.{format}/wordOfTheDayLists"; - resourcePath = resourcePath.replace("{format}","json"); - String method = "GET"; - Map queryParams = new HashMap(); - - if( containsWord != null) { - queryParams.put("containsWord", containsWord); - } - if( subscriberCount != null) { - queryParams.put("subscriberCount", subscriberCount); - } - if( itemCount != null) { - queryParams.put("itemCount", itemCount); - } - if( includeAll != null) { - queryParams.put("includeAll", includeAll); - } - - - - //make the API Call - String response = invokeAPI(null, resourcePath, method, queryParams, null); - //create output objects if the response has more than one object - if(response == null || response.length() == 0){ - return null; - } - - TypeReference> typeRef = new TypeReference>() { - }; - try { - List responseObject = (List) mapper.readValue(response, typeRef); - return responseObject; - } catch (IOException ioe) { - String[] args = new String[]{response, typeRef.toString()}; - throw new WordnikAPIException(WordnikExceptionCodes.ERROR_CONVERTING_JSON_TO_JAVA, args, "Error in converting response json value to java object : " + ioe.getMessage(), ioe); - } - } - - - /** - * Fetches WordOfTheDay objects for a specific date - - * @param date ID of WordOfTheDayList - - * @param includeAll Returns future WordOfTheDay items - - - * - * @return List {@link WordOfTheDay} - * @throws WordnikAPIException 400 - Invalid ID supplied 404 - WordOfTheDayList or User not found - */ - @MethodArgumentNames(value="date, includeAll") - public static List getWordOfTheDayListsForDate(String date, String includeAll) throws WordnikAPIException { - - - //parse inputs - String resourcePath = "/words.{format}/wordOfTheDayLists/{date}"; - resourcePath = resourcePath.replace("{format}","json"); - String method = "GET"; - Map queryParams = new HashMap(); - - if( includeAll != null) { - queryParams.put("includeAll", includeAll); - } - - if( date != null) { - resourcePath = resourcePath.replace("{date}", date); - } - - - //make the API Call - String response = invokeAPI(null, resourcePath, method, queryParams, null); - //create output objects if the response has more than one object - if(response == null || response.length() == 0){ - return null; - } - - TypeReference> typeRef = new TypeReference>() { - }; - try { - List responseObject = (List) mapper.readValue(response, typeRef); - return responseObject; - } catch (IOException ioe) { - String[] args = new String[]{response, typeRef.toString()}; - throw new WordnikAPIException(WordnikExceptionCodes.ERROR_CONVERTING_JSON_TO_JAVA, args, "Error in converting response json value to java object : " + ioe.getMessage(), ioe); - } - } - - - /** - * Subscribes a user to a WordOfTheDayList - - * @param authToken auth_token of logged-in user - - * @param permalink ID of WordOfTheDayList - - * @param medium Medium to subscribe with - - * @param postObject Username to subscribe - - - * - * @return void {@link Void} - * @throws WordnikAPIException 400 - Invalid ID supplied 403 - Not authorized to subscribe 404 - WordOfTheDayList or User not found - */ - @MethodArgumentNames(value="authToken, permalink, medium, postObject") - public static void subscribeToList(String authToken, String permalink, String medium, String postObject) throws WordnikAPIException { - - if(authToken == null || authToken.length() == 0) { - throw new WordnikAPIException(WordnikExceptionCodes.AUTH_TOKEN_NOT_VALID); - } - //parse inputs - String resourcePath = "/words.{format}/wordOfTheDayList/{permalink}/subscription"; - resourcePath = resourcePath.replace("{format}","json"); - String method = "POST"; - Map queryParams = new HashMap(); - - if( medium != null) { - queryParams.put("medium", medium); - } - - if( permalink != null) { - resourcePath = resourcePath.replace("{permalink}", permalink); - } - - - //make the API Call - - String response = invokeAPI(authToken, resourcePath, method, queryParams, postObject); - - //create output objects if the response has more than one object - - } - - - /** - * Searches definitions. - - * @param wordsSearchDefinitionsInput - - - * - * @return DefinitionSearchResults {@link DefinitionSearchResults} - * @throws WordnikAPIException 400 - Invalid term supplied. - */ - @MethodArgumentNames(value="wordsSearchDefinitionsInput") - public static DefinitionSearchResults searchDefinitions(WordsSearchDefinitionsInput wordsSearchDefinitionsInput) throws WordnikAPIException { - - - //parse inputs - String resourcePath = "/words.{format}/searchDefinitions"; - resourcePath = resourcePath.replace("{format}","json"); - String method = "GET"; - Map queryParams = new HashMap(); - - - if( wordsSearchDefinitionsInput != null && wordsSearchDefinitionsInput.getQuery() != null) { - queryParams.put("query", wordsSearchDefinitionsInput.getQuery()); - } - if( wordsSearchDefinitionsInput != null && wordsSearchDefinitionsInput.getDefinedWordSearchTerm() != null) { - queryParams.put("definedWordSearchTerm", wordsSearchDefinitionsInput.getDefinedWordSearchTerm()); - } - if( wordsSearchDefinitionsInput != null && wordsSearchDefinitionsInput.getIncludeSourceDictionaries() != null) { - queryParams.put("includeSourceDictionaries", wordsSearchDefinitionsInput.getIncludeSourceDictionaries()); - } - if( wordsSearchDefinitionsInput != null && wordsSearchDefinitionsInput.getExcludeSourceDictionaries() != null) { - queryParams.put("excludeSourceDictionaries", wordsSearchDefinitionsInput.getExcludeSourceDictionaries()); - } - if( wordsSearchDefinitionsInput != null && wordsSearchDefinitionsInput.getIncludePartOfSpeech() != null) { - queryParams.put("includePartOfSpeech", wordsSearchDefinitionsInput.getIncludePartOfSpeech()); - } - if( wordsSearchDefinitionsInput != null && wordsSearchDefinitionsInput.getExcludePartOfSpeech() != null) { - queryParams.put("excludePartOfSpeech", wordsSearchDefinitionsInput.getExcludePartOfSpeech()); - } - if( wordsSearchDefinitionsInput != null && wordsSearchDefinitionsInput.getMinCorpusCount() != null) { - queryParams.put("minCorpusCount", wordsSearchDefinitionsInput.getMinCorpusCount()); - } - if( wordsSearchDefinitionsInput != null && wordsSearchDefinitionsInput.getMaxCorpusCount() != null) { - queryParams.put("maxCorpusCount", wordsSearchDefinitionsInput.getMaxCorpusCount()); - } - if( wordsSearchDefinitionsInput != null && wordsSearchDefinitionsInput.getMinLength() != null) { - queryParams.put("minLength", wordsSearchDefinitionsInput.getMinLength()); - } - if( wordsSearchDefinitionsInput != null && wordsSearchDefinitionsInput.getMaxLength() != null) { - queryParams.put("maxLength", wordsSearchDefinitionsInput.getMaxLength()); - } - if( wordsSearchDefinitionsInput != null && wordsSearchDefinitionsInput.getExpandTerms() != null) { - queryParams.put("expandTerms", wordsSearchDefinitionsInput.getExpandTerms()); - } - if( wordsSearchDefinitionsInput != null && wordsSearchDefinitionsInput.getWordTypes() != null) { - queryParams.put("wordTypes", wordsSearchDefinitionsInput.getWordTypes()); - } - if( wordsSearchDefinitionsInput != null && wordsSearchDefinitionsInput.getIncludeTags() != null) { - queryParams.put("includeTags", wordsSearchDefinitionsInput.getIncludeTags()); - } - if( wordsSearchDefinitionsInput != null && wordsSearchDefinitionsInput.getSortBy() != null) { - queryParams.put("sortBy", wordsSearchDefinitionsInput.getSortBy()); - } - if( wordsSearchDefinitionsInput != null && wordsSearchDefinitionsInput.getSortOrder() != null) { - queryParams.put("sortOrder", wordsSearchDefinitionsInput.getSortOrder()); - } - if( wordsSearchDefinitionsInput != null && wordsSearchDefinitionsInput.getSkip() != null) { - queryParams.put("skip", wordsSearchDefinitionsInput.getSkip()); - } - if( wordsSearchDefinitionsInput != null && wordsSearchDefinitionsInput.getLimit() != null) { - queryParams.put("limit", wordsSearchDefinitionsInput.getLimit()); - } - - - //make the API Call - String response = invokeAPI(null, resourcePath, method, queryParams, null); - //create output objects if the response has more than one object - if(response == null || response.length() == 0){ - return null; - } - DefinitionSearchResults responseObject = (DefinitionSearchResults)deserialize(response, DefinitionSearchResults.class); - return responseObject; - - } - - - /** - * Searches dictionary entries. - - * @param query Search term - - * @param skip Results to skip - * Allowed values are - 0 to 1000 - * @param limit Maximum number of results to return - * Allowed values are - 1 to 1000 - - * - * @return EntrySearchResults {@link EntrySearchResults} - * @throws WordnikAPIException 400 - Invalid term supplied. - */ - @MethodArgumentNames(value="query, skip, limit") - public static EntrySearchResults searchEntries(String query, String skip, String limit) throws WordnikAPIException { - - - //parse inputs - String resourcePath = "/words.{format}/searchEntries"; - resourcePath = resourcePath.replace("{format}","json"); - String method = "GET"; - Map queryParams = new HashMap(); - - if( query != null) { - queryParams.put("query", query); - } - if( skip != null) { - queryParams.put("skip", skip); - } - if( limit != null) { - queryParams.put("limit", limit); - } - - - - //make the API Call - String response = invokeAPI(null, resourcePath, method, queryParams, null); - //create output objects if the response has more than one object - if(response == null || response.length() == 0){ - return null; - } - EntrySearchResults responseObject = (EntrySearchResults)deserialize(response, EntrySearchResults.class); - return responseObject; - - } - - - /** - * Fetches surface forms of a word - - * @param term Word to get surface forms for. - - - * - * @return String {@link String} - * @throws WordnikAPIException 400 - Invalid term supplied. - */ - @MethodArgumentNames(value="term") - public static String getSurfaceForms(String term) throws WordnikAPIException { - - - //parse inputs - String resourcePath = "/words.{format}/surfaceForms"; - resourcePath = resourcePath.replace("{format}","json"); - String method = "GET"; - Map queryParams = new HashMap(); - - if( term != null) { - queryParams.put("term", term); - } - - - - //make the API Call - String response = invokeAPI(null, resourcePath, method, queryParams, null); - //create output objects if the response has more than one object - if(response == null || response.length() == 0){ - return null; - } - String responseObject = (String)deserialize(response, String.class); - return responseObject; - - } - - - /** - * Returns a specific WordOfTheDay - - * @param date Fetches by date in yyyy-MM-dd - - * @param category Filters response by category - - * @param creator Filters response by username - - - * - * @return WordOfTheDay {@link WordOfTheDay} - * @throws WordnikAPIException 404 - No data available - */ - @MethodArgumentNames(value="date, category, creator") - public static WordOfTheDay getWordOfTheDay(String date, String category, String creator) throws WordnikAPIException { - - - //parse inputs - String resourcePath = "/words.{format}/wordOfTheDay"; - resourcePath = resourcePath.replace("{format}","json"); - String method = "GET"; - Map queryParams = new HashMap(); - - if( date != null) { - queryParams.put("date", date); - } - if( category != null) { - queryParams.put("category", category); - } - if( creator != null) { - queryParams.put("creator", creator); - } - - - - //make the API Call - String response = invokeAPI(null, resourcePath, method, queryParams, null); - //create output objects if the response has more than one object - if(response == null || response.length() == 0){ - return null; - } - WordOfTheDay responseObject = (WordOfTheDay)deserialize(response, WordOfTheDay.class); - return responseObject; - - } - - - /** - * Returns a WordOfTheDay range - - * @param wordsWordOfTheDayInputRangeInput - - - * - * @return List {@link WordOfTheDay} - * @throws WordnikAPIException 404 - No data available - */ - @MethodArgumentNames(value="wordsWordOfTheDayInputRangeInput") - public static List getWordOfTheDayRange(WordsWordOfTheDayInputRangeInput wordsWordOfTheDayInputRangeInput) throws WordnikAPIException { - - - //parse inputs - String resourcePath = "/words.{format}/wordOfTheDay/range"; - resourcePath = resourcePath.replace("{format}","json"); - String method = "GET"; - Map queryParams = new HashMap(); - - - if( wordsWordOfTheDayInputRangeInput != null && wordsWordOfTheDayInputRangeInput.getCategory() != null) { - queryParams.put("category", wordsWordOfTheDayInputRangeInput.getCategory()); - } - if( wordsWordOfTheDayInputRangeInput != null && wordsWordOfTheDayInputRangeInput.getCreator() != null) { - queryParams.put("creator", wordsWordOfTheDayInputRangeInput.getCreator()); - } - if( wordsWordOfTheDayInputRangeInput != null && wordsWordOfTheDayInputRangeInput.getProvider() != null) { - queryParams.put("provider", wordsWordOfTheDayInputRangeInput.getProvider()); - } - if( wordsWordOfTheDayInputRangeInput != null && wordsWordOfTheDayInputRangeInput.getSkip() != null) { - queryParams.put("skip", wordsWordOfTheDayInputRangeInput.getSkip()); - } - if( wordsWordOfTheDayInputRangeInput != null && wordsWordOfTheDayInputRangeInput.getLimit() != null) { - queryParams.put("limit", wordsWordOfTheDayInputRangeInput.getLimit()); - } - - - //make the API Call - String response = invokeAPI(null, resourcePath, method, queryParams, null); - //create output objects if the response has more than one object - if(response == null || response.length() == 0){ - return null; - } - - TypeReference> typeRef = new TypeReference>() { - }; - try { - List responseObject = (List) mapper.readValue(response, typeRef); - return responseObject; - } catch (IOException ioe) { - String[] args = new String[]{response, typeRef.toString()}; - throw new WordnikAPIException(WordnikExceptionCodes.ERROR_CONVERTING_JSON_TO_JAVA, args, "Error in converting response json value to java object : " + ioe.getMessage(), ioe); - } - } - - - /** - * Fetches a WordOfTheDayList by ID - - * @param permalink ID of WordOfTheDayList - - * @param includeAll Returns future WordOfTheDay items - - - * - * @return WordOfTheDayList {@link WordOfTheDayList} - * @throws WordnikAPIException 400 - Invalid id supplied 404 - WordOfTheDayList not found - */ - @MethodArgumentNames(value="permalink, includeAll") - public static WordOfTheDayList getWordOfTheDayList(String permalink, String includeAll) throws WordnikAPIException { - - - //parse inputs - String resourcePath = "/words.{format}/wordOfTheDayList/{permalink}"; - resourcePath = resourcePath.replace("{format}","json"); - String method = "GET"; - Map queryParams = new HashMap(); - - if( includeAll != null) { - queryParams.put("includeAll", includeAll); - } - - if( permalink != null) { - resourcePath = resourcePath.replace("{permalink}", permalink); - } - - - //make the API Call - String response = invokeAPI(null, resourcePath, method, queryParams, null); - //create output objects if the response has more than one object - if(response == null || response.length() == 0){ - return null; - } - WordOfTheDayList responseObject = (WordOfTheDayList)deserialize(response, WordOfTheDayList.class); - return responseObject; - - } - - - /** - * Fetches a WordOfTheDayList by ID - - * @param permalink ID of WordOfTheDayList - - * @param specifier Specifier for the item to fetch. Either 'current' or a date. - - - * - * @return WordOfTheDay {@link WordOfTheDay} - * @throws WordnikAPIException 400 - Invalid id supplied 404 - WordOfTheDayList not found - */ - @MethodArgumentNames(value="permalink, specifier") - public static WordOfTheDay getWordOfTheDayListItem(String permalink, String specifier) throws WordnikAPIException { - - - //parse inputs - String resourcePath = "/words.{format}/wordOfTheDayList/{permalink}/{specifier}"; - resourcePath = resourcePath.replace("{format}","json"); - String method = "GET"; - Map queryParams = new HashMap(); - - if( permalink != null) { - resourcePath = resourcePath.replace("{permalink}", permalink); - } - if( specifier != null) { - resourcePath = resourcePath.replace("{specifier}", specifier); - } - - - //make the API Call - String response = invokeAPI(null, resourcePath, method, queryParams, null); - //create output objects if the response has more than one object - if(response == null || response.length() == 0){ - return null; - } - WordOfTheDay responseObject = (WordOfTheDay)deserialize(response, WordOfTheDay.class); - return responseObject; - - } - - - /** - * Fetches recently created WordOfTheDayLists - - * @param skip Results to skip - - * @param limit Maximum number of results to return - - - * - * @return List {@link WordOfTheDayList} - * @throws WordnikAPIException 404 - No WordOfTheDayLists found. - */ - @MethodArgumentNames(value="skip, limit") - public static List getRecentWordOfTheDayLists(String skip, String limit) throws WordnikAPIException { - - - //parse inputs - String resourcePath = "/words.{format}/wordOfTheDayLists/recent"; - resourcePath = resourcePath.replace("{format}","json"); - String method = "GET"; - Map queryParams = new HashMap(); - - if( skip != null) { - queryParams.put("skip", skip); - } - if( limit != null) { - queryParams.put("limit", limit); - } - - - - //make the API Call - String response = invokeAPI(null, resourcePath, method, queryParams, null); - //create output objects if the response has more than one object - if(response == null || response.length() == 0){ - return null; - } - - TypeReference> typeRef = new TypeReference>() { - }; - try { - List responseObject = (List) mapper.readValue(response, typeRef); - return responseObject; - } catch (IOException ioe) { - String[] args = new String[]{response, typeRef.toString()}; - throw new WordnikAPIException(WordnikExceptionCodes.ERROR_CONVERTING_JSON_TO_JAVA, args, "Error in converting response json value to java object : " + ioe.getMessage(), ioe); - } - } - - - /** - * Returns whether or not a subscription process has been run. - Uses the current server time (day resolution) as the default date to check for, optionally a dateString can be supplied for a specific date to check for. - * @param date Date string to fetch for. - - - * - * @return String {@link String} - * @throws WordnikAPIException 400 - Invalid date format supplied. - */ - @MethodArgumentNames(value="date") - public static String getWordOfTheDayListSubscriptionProcessStatus(String date) throws WordnikAPIException { - - - //parse inputs - String resourcePath = "/words.{format}/wordOfTheDayLists/subscriptionProcess"; - resourcePath = resourcePath.replace("{format}","json"); - String method = "GET"; - Map queryParams = new HashMap(); - - if( date != null) { - queryParams.put("date", date); - } - - - - //make the API Call - String response = invokeAPI(null, resourcePath, method, queryParams, null); - //create output objects if the response has more than one object - if(response == null || response.length() == 0){ - return null; - } - String responseObject = (String)deserialize(response, String.class); - return responseObject; - - } - - - -} \ No newline at end of file diff --git a/android/driver/src/main/java/com/wordnik/common/WordnikAPI.java b/android/driver/src/main/java/com/wordnik/common/WordnikAPI.java deleted file mode 100644 index 6ffdceebd24..00000000000 --- a/android/driver/src/main/java/com/wordnik/common/WordnikAPI.java +++ /dev/null @@ -1,238 +0,0 @@ -package com.wordnik.common; - -import java.io.IOException; -import java.io.UnsupportedEncodingException; -import java.net.URISyntaxException; -import java.net.URLEncoder; -import java.util.Map; -import java.util.logging.Logger; - - -import org.apache.http.HttpException; -import org.apache.http.HttpResponse; -import org.apache.http.HttpStatus; -import org.apache.http.client.HttpClient; -import org.apache.http.client.methods.*; -import org.apache.http.entity.StringEntity; -import org.apache.http.impl.client.DefaultHttpClient; -import org.apache.http.protocol.HTTP; -import org.apache.http.util.EntityUtils; -import org.codehaus.jackson.map.ObjectMapper; -import org.codehaus.jackson.map.DeserializationConfig.Feature; - -import com.wordnik.exception.WordnikAPIException; -import com.wordnik.exception.WordnikExceptionCodes; - -/** - * Provides way to initialize the communication with Wordnik API server. - * This is also a Base class for all API classes - * @author ramesh - * - */ -public class WordnikAPI { - - private static String apiServer = "http://api.wordnik.com/v4"; - private static String apiKey = ""; - private static boolean loggingEnabled; - private static Logger logger = null; - - public static final String WORDNIK_HEADER_NAME = "api_key"; - - protected static String POST = "POST"; - protected static String GET = "GET"; - protected static String PUT = "PUT"; - protected static String DELETE = "DELETE"; - protected static ObjectMapper mapper = new ObjectMapper(); - static{ - mapper.getDeserializationConfig().set(Feature.FAIL_ON_UNKNOWN_PROPERTIES, false); - } - - /** - * Initializes the API communication with required inputs. - * @param apiKey provide the key provided as part of registration - * @param apiServer Sets the URL for the API server. It is defaulted to the server - * used while building the driver. This value should be provided while testing the APIs against - * test servers or if there is any changes in production server URLs. - * @param enableLogging This will enable the logging using Jersey logging filter. Refer the following documentation - * for more details. {@link //LoggingFilter}. Default output is sent to system.out. - * Create a logger ({@link Logger} class and set using setLogger method. - */ - public static void initialize(String apiKey, String apiServer, boolean enableLogging) { - setApiKey(apiKey); - if(apiServer != null && apiServer.length() > 0) { - if(apiServer.substring(apiServer.length()-1).equals("/")){ - apiServer = apiServer.substring(0, apiServer.length()-1); - } - setApiServer(apiServer); - } - loggingEnabled = enableLogging; - } - - /** - * Set the logger instance used for Jersey logging. - * @param aLogger - */ - public static void setLogger(Logger aLogger) { - logger = aLogger; - } - - /** - * Gets the API key used for server communication. - * This value is set using initialize method. - * @return - */ - private static String getApiKey() { - return apiKey; - } - - private static void setApiKey(String apiKey) { - WordnikAPI.apiKey = apiKey; - } - - /** - * Sets the URL for the API server. It is defaulted to the server used while building the driver. - * @return - */ - private static String getApiServer() { - return apiServer; - } - - private static void setApiServer(String server) { - WordnikAPI.apiServer = server; - } - - - /** - * Invokes the API and returns the response as json string. - * This is an internal method called by individual APIs for communication. It sets the required HTTP headers - * based on API key and auth token. - * @param authToken - token that is received as part of authentication call. This is only needed for the calls that are secure. - * @param resourceURL - URL for the rest resource - * @param method - Method we should use for communicating to the back end. - * @param postObject - if the method is POST, provide the object that should be sent as part of post request. - * @return JSON response of the API call. - * @throws com.wordnik.exception.WordnikAPIException if the call to API server fails. - */ - protected static String invokeAPI(String authToken, String resourceURL, String method, - Map queryParams, Object postObject) - throws WordnikAPIException { - String responseString = null; - try { - //check for app key and server values - if(getApiKey() == null || getApiKey().length() == 0) { - String[] args = {getApiKey()}; - throw new WordnikAPIException(WordnikExceptionCodes.API_KEY_NOT_VALID, args); - } - if(getApiServer() == null || getApiServer().length() == 0) { - String[] args = {getApiServer()}; - throw new WordnikAPIException(WordnikExceptionCodes.API_SERVER_NOT_VALID, args); - } - - String url = getApiServer() + resourceURL + getQueryParams(queryParams); - - HttpUriRequest request = null; - if(method.equals(GET)) { - request = new HttpGet(url); - } else if (method.equals(POST)) { - request = new HttpPost(url); - if(postObject != null) { - StringEntity entity = new StringEntity(serialize(postObject)); - ((HttpPost) request).setEntity(entity); - } - } else if (method.equals(PUT)) { - request = new HttpPut(url); - if(postObject != null) { - StringEntity entity = new StringEntity(serialize(postObject)); - ((HttpPut) request).setEntity(entity); - } - } else if (method.equals(DELETE)) { - request = new HttpDelete(url); - } else { - throw new WordnikAPIException(WordnikExceptionCodes.ERROR_FROM_WEBSERVICE_CALL, "Http method not valid - " + method); - } - - request.setHeader("Content-type", "application/json"); - request.addHeader(WORDNIK_HEADER_NAME, getApiKey()); - if(authToken != null){ - request.addHeader("auth_token", authToken); - } - - final HttpClient hc = new DefaultHttpClient(); - final HttpResponse resp = hc.execute(request); - final int status = resp.getStatusLine().getStatusCode(); - if (status == HttpStatus.SC_OK) { - if (resp.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { - responseString = EntityUtils.toString(resp.getEntity(), HTTP.UTF_8); - } else { - throw new WordnikAPIException(resp.getStatusLine().getStatusCode(), EntityUtils.toString(resp.getEntity(), HTTP.UTF_8)); - } - } else { - throw new WordnikAPIException(status, EntityUtils.toString(resp.getEntity(), HTTP.UTF_8)); - } - } catch (Exception e) { - throw new WordnikAPIException(WordnikExceptionCodes.ERROR_FROM_WEBSERVICE_CALL, e.getMessage(), e); - } - - return responseString; - } - - private static String getQueryParams(Map queryParams) { - if(queryParams == null || queryParams.size() == 0) { - return ""; - } - StringBuilder buf = new StringBuilder(); - buf.append("?"); - - for(String key : queryParams.keySet()) { - String value = queryParams.get(key); - - try { - value = URLEncoder.encode(value, "UTF-8"); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } - - if(buf.length() > 1) { - buf.append("&"); - } - - buf.append(key).append("=").append(value); - } - - return buf.toString(); - } - - /** - * De-serialize the object from String to input object. - * @param response - * @param inputClassName - * @return - */ - public static Object deserialize(String response, Class inputClassName) throws WordnikAPIException { - try { - Object responseObject = mapper.readValue(response, inputClassName); - return responseObject; - } catch (IOException ioe) { - String[] args = new String[]{response, inputClassName.toString()}; - throw new WordnikAPIException(WordnikExceptionCodes.ERROR_CONVERTING_JSON_TO_JAVA, args, "Error in coversting response json value to java object : " + ioe.getMessage(), ioe); - } - } - - - /** - * serialize the object from String to input object. - * @param input - * @return - */ - public static String serialize(Object input) throws WordnikAPIException { - try { - if(input != null) { - return mapper.writeValueAsString(input); - }else{ - return ""; - } - } catch (IOException ioe) { - throw new WordnikAPIException(WordnikExceptionCodes.ERROR_CONVERTING_JAVA_TO_JSON, "Error in coverting input java to json : " + ioe.getMessage(), ioe); - } - } -} diff --git a/android/driver/src/main/java/com/wordnik/model/ApiResponse.java b/android/driver/src/main/java/com/wordnik/model/ApiResponse.java deleted file mode 100644 index a5c9038778b..00000000000 --- a/android/driver/src/main/java/com/wordnik/model/ApiResponse.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.wordnik.model; - -import com.wordnik.common.WordnikObject; -import com.wordnik.annotations.AllowableValues; -import com.wordnik.annotations.Required; - -import com.wordnik.common.WordListType; - - -/** - * - * NOTE: This class is auto generated by the drive code generator program so please do not edit the program manually. - * @author ramesh - * - */ -public class ApiResponse extends WordnikObject { - - // - private String message ; - // - private String type ; - - - // - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - // - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - -} \ No newline at end of file diff --git a/android/driver/src/main/java/com/wordnik/model/ApiTokenStatus.java b/android/driver/src/main/java/com/wordnik/model/ApiTokenStatus.java deleted file mode 100644 index 434f81b8708..00000000000 --- a/android/driver/src/main/java/com/wordnik/model/ApiTokenStatus.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.wordnik.model; - -import com.wordnik.common.WordnikObject; -import com.wordnik.annotations.AllowableValues; -import com.wordnik.annotations.Required; - -import com.wordnik.common.WordListType; - - -/** - * - * NOTE: This class is auto generated by the drive code generator program so please do not edit the program manually. - * @author ramesh - * - */ -public class ApiTokenStatus extends WordnikObject { - - // - private String token ; - // - private Long expiresInMillis ; - // - private Long totalRequests ; - // - private Long remainingCalls ; - // - private Long resetsInMillis ; - - - // - - public String getToken() { - return token; - } - - public void setToken(String token) { - this.token = token; - } - // - - public Long getExpiresInMillis() { - return expiresInMillis; - } - - public void setExpiresInMillis(Long expiresInMillis) { - this.expiresInMillis = expiresInMillis; - } - // - - public Long getTotalRequests() { - return totalRequests; - } - - public void setTotalRequests(Long totalRequests) { - this.totalRequests = totalRequests; - } - // - - public Long getRemainingCalls() { - return remainingCalls; - } - - public void setRemainingCalls(Long remainingCalls) { - this.remainingCalls = remainingCalls; - } - // - - public Long getResetsInMillis() { - return resetsInMillis; - } - - public void setResetsInMillis(Long resetsInMillis) { - this.resetsInMillis = resetsInMillis; - } - -} \ No newline at end of file diff --git a/android/driver/src/main/java/com/wordnik/model/AudioFile.java b/android/driver/src/main/java/com/wordnik/model/AudioFile.java deleted file mode 100644 index a0a312a65f2..00000000000 --- a/android/driver/src/main/java/com/wordnik/model/AudioFile.java +++ /dev/null @@ -1,134 +0,0 @@ -package com.wordnik.model; - -import com.wordnik.common.WordnikObject; -import com.wordnik.annotations.AllowableValues; -import com.wordnik.annotations.Required; - -import com.wordnik.common.WordListType; -import java.util.Date; - - -/** - * - * NOTE: This class is auto generated by the drive code generator program so please do not edit the program manually. - * @author ramesh - * - */ -public class AudioFile extends WordnikObject { - - // - private Long id ; - // - private String description ; - // - private String createdBy ; - // - private String word ; - // - private Date createdAt ; - // - private int commentCount ; - // - private int voteCount ; - // - private float voteAverage ; - // - private float voteWeightedAverage ; - // - private String fileUrl ; - - - // - - @Required - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - // - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - // - - public String getCreatedBy() { - return createdBy; - } - - public void setCreatedBy(String createdBy) { - this.createdBy = createdBy; - } - // - - public String getWord() { - return word; - } - - public void setWord(String word) { - this.word = word; - } - // - - public Date getCreatedAt() { - return createdAt; - } - - public void setCreatedAt(Date createdAt) { - this.createdAt = createdAt; - } - // - - public int getCommentCount() { - return commentCount; - } - - public void setCommentCount(int commentCount) { - this.commentCount = commentCount; - } - // - - public int getVoteCount() { - return voteCount; - } - - public void setVoteCount(int voteCount) { - this.voteCount = voteCount; - } - // - - public float getVoteAverage() { - return voteAverage; - } - - public void setVoteAverage(float voteAverage) { - this.voteAverage = voteAverage; - } - // - - public float getVoteWeightedAverage() { - return voteWeightedAverage; - } - - public void setVoteWeightedAverage(float voteWeightedAverage) { - this.voteWeightedAverage = voteWeightedAverage; - } - // - - public String getFileUrl() { - return fileUrl; - } - - public void setFileUrl(String fileUrl) { - this.fileUrl = fileUrl; - } - -} \ No newline at end of file diff --git a/android/driver/src/main/java/com/wordnik/model/AudioObject.java b/android/driver/src/main/java/com/wordnik/model/AudioObject.java deleted file mode 100644 index a2d016a92b7..00000000000 --- a/android/driver/src/main/java/com/wordnik/model/AudioObject.java +++ /dev/null @@ -1,165 +0,0 @@ -package com.wordnik.model; - -import com.wordnik.common.WordnikObject; -import com.wordnik.annotations.AllowableValues; -import com.wordnik.annotations.Required; - -import com.wordnik.common.WordListType; -import java.util.Date; - - -/** - * - * NOTE: This class is auto generated by the drive code generator program so please do not edit the program manually. - * @author ramesh - * - */ -public class AudioObject extends WordnikObject { - - // - private Long id ; - // - private AudioType type ; - // - private String description ; - // - private Long userId ; - // - private String createdBy ; - // - private String wordstring ; - // - private Long wordId ; - // - private Date createdAt ; - // - private String filePath ; - // - private String recordId ; - // - private AudioType audioFileType ; - // - private Long audioFileId ; - // - private String streamPath ; - - - // - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - // - - public AudioType getType() { - return type; - } - - public void setType(AudioType type) { - this.type = type; - } - // - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - // - - public Long getUserId() { - return userId; - } - - public void setUserId(Long userId) { - this.userId = userId; - } - // - - public String getCreatedBy() { - return createdBy; - } - - public void setCreatedBy(String createdBy) { - this.createdBy = createdBy; - } - // - - public String getWordstring() { - return wordstring; - } - - public void setWordstring(String wordstring) { - this.wordstring = wordstring; - } - // - - public Long getWordId() { - return wordId; - } - - public void setWordId(Long wordId) { - this.wordId = wordId; - } - // - - public Date getCreatedAt() { - return createdAt; - } - - public void setCreatedAt(Date createdAt) { - this.createdAt = createdAt; - } - // - - public String getFilePath() { - return filePath; - } - - public void setFilePath(String filePath) { - this.filePath = filePath; - } - // - - public String getRecordId() { - return recordId; - } - - public void setRecordId(String recordId) { - this.recordId = recordId; - } - // - - public AudioType getAudioFileType() { - return audioFileType; - } - - public void setAudioFileType(AudioType audioFileType) { - this.audioFileType = audioFileType; - } - // - - public Long getAudioFileId() { - return audioFileId; - } - - public void setAudioFileId(Long audioFileId) { - this.audioFileId = audioFileId; - } - // - - public String getStreamPath() { - return streamPath; - } - - public void setStreamPath(String streamPath) { - this.streamPath = streamPath; - } - -} \ No newline at end of file diff --git a/android/driver/src/main/java/com/wordnik/model/AudioType.java b/android/driver/src/main/java/com/wordnik/model/AudioType.java deleted file mode 100644 index c67211f4e40..00000000000 --- a/android/driver/src/main/java/com/wordnik/model/AudioType.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.wordnik.model; - -import com.wordnik.common.WordnikObject; -import com.wordnik.annotations.AllowableValues; -import com.wordnik.annotations.Required; - -import com.wordnik.common.WordListType; - - -/** - * - * NOTE: This class is auto generated by the drive code generator program so please do not edit the program manually. - * @author ramesh - * - */ -public class AudioType extends WordnikObject { - - // - private String name ; - // - private int id ; - - - // - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - // - - public int getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } - -} \ No newline at end of file diff --git a/android/driver/src/main/java/com/wordnik/model/AuthenticationToken.java b/android/driver/src/main/java/com/wordnik/model/AuthenticationToken.java deleted file mode 100644 index d3ef086e5fe..00000000000 --- a/android/driver/src/main/java/com/wordnik/model/AuthenticationToken.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.wordnik.model; - -import com.wordnik.common.WordnikObject; -import com.wordnik.annotations.AllowableValues; -import com.wordnik.annotations.Required; - -import com.wordnik.common.WordListType; - - -/** - * - * NOTE: This class is auto generated by the drive code generator program so please do not edit the program manually. - * @author ramesh - * - */ -public class AuthenticationToken extends WordnikObject { - - // - private String token ; - // - private Long userId ; - - - // - - public String getToken() { - return token; - } - - public void setToken(String token) { - this.token = token; - } - // - - public Long getUserId() { - return userId; - } - - public void setUserId(Long userId) { - this.userId = userId; - } - -} \ No newline at end of file diff --git a/android/driver/src/main/java/com/wordnik/model/Bigram.java b/android/driver/src/main/java/com/wordnik/model/Bigram.java deleted file mode 100644 index 53a18a2fe94..00000000000 --- a/android/driver/src/main/java/com/wordnik/model/Bigram.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.wordnik.model; - -import com.wordnik.common.WordnikObject; -import com.wordnik.annotations.AllowableValues; -import com.wordnik.annotations.Required; - -import com.wordnik.common.WordListType; - - -/** - * - * NOTE: This class is auto generated by the drive code generator program so please do not edit the program manually. - * @author ramesh - * - */ -public class Bigram extends WordnikObject { - - // - private Long count ; - // - private String gram1 ; - // - private String gram2 ; - // - private Double mi ; - // - private Double wlmi ; - - - // - - public Long getCount() { - return count; - } - - public void setCount(Long count) { - this.count = count; - } - // - - public String getGram1() { - return gram1; - } - - public void setGram1(String gram1) { - this.gram1 = gram1; - } - // - - public String getGram2() { - return gram2; - } - - public void setGram2(String gram2) { - this.gram2 = gram2; - } - // - - public Double getMi() { - return mi; - } - - public void setMi(Double mi) { - this.mi = mi; - } - // - - public Double getWlmi() { - return wlmi; - } - - public void setWlmi(Double wlmi) { - this.wlmi = wlmi; - } - -} \ No newline at end of file diff --git a/android/driver/src/main/java/com/wordnik/model/Category.java b/android/driver/src/main/java/com/wordnik/model/Category.java deleted file mode 100644 index 5514dea02e4..00000000000 --- a/android/driver/src/main/java/com/wordnik/model/Category.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.wordnik.model; - -import com.wordnik.common.WordnikObject; -import com.wordnik.annotations.AllowableValues; -import com.wordnik.annotations.Required; - -import com.wordnik.common.WordListType; - - -/** - * - * NOTE: This class is auto generated by the drive code generator program so please do not edit the program manually. - * @author ramesh - * - */ -public class Category extends WordnikObject { - - // - private String name ; - - - // - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - -} \ No newline at end of file diff --git a/android/driver/src/main/java/com/wordnik/model/Citation.java b/android/driver/src/main/java/com/wordnik/model/Citation.java deleted file mode 100644 index 6fb91465e03..00000000000 --- a/android/driver/src/main/java/com/wordnik/model/Citation.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.wordnik.model; - -import com.wordnik.common.WordnikObject; -import com.wordnik.annotations.AllowableValues; -import com.wordnik.annotations.Required; - -import com.wordnik.common.WordListType; - - -/** - * - * NOTE: This class is auto generated by the drive code generator program so please do not edit the program manually. - * @author ramesh - * - */ -public class Citation extends WordnikObject { - - // - private String source ; - // - private String cite ; - - - // - - public String getSource() { - return source; - } - - public void setSource(String source) { - this.source = source; - } - // - - public String getCite() { - return cite; - } - - public void setCite(String cite) { - this.cite = cite; - } - -} \ No newline at end of file diff --git a/android/driver/src/main/java/com/wordnik/model/ContentProvider.java b/android/driver/src/main/java/com/wordnik/model/ContentProvider.java deleted file mode 100644 index 0c994e62050..00000000000 --- a/android/driver/src/main/java/com/wordnik/model/ContentProvider.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.wordnik.model; - -import com.wordnik.common.WordnikObject; -import com.wordnik.annotations.AllowableValues; -import com.wordnik.annotations.Required; - -import com.wordnik.common.WordListType; - - -/** - * - * NOTE: This class is auto generated by the drive code generator program so please do not edit the program manually. - * @author ramesh - * - */ -public class ContentProvider extends WordnikObject { - - // - private String name ; - // - private int id ; - - - // - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - // - - public int getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } - -} \ No newline at end of file diff --git a/android/driver/src/main/java/com/wordnik/model/Definition.java b/android/driver/src/main/java/com/wordnik/model/Definition.java deleted file mode 100644 index 0653667b393..00000000000 --- a/android/driver/src/main/java/com/wordnik/model/Definition.java +++ /dev/null @@ -1,177 +0,0 @@ -package com.wordnik.model; - -import com.wordnik.common.WordnikObject; -import com.wordnik.annotations.AllowableValues; -import com.wordnik.annotations.Required; - -import com.wordnik.common.WordListType; -import java.util.List; -import java.util.ArrayList; - - -/** - * - * NOTE: This class is auto generated by the drive code generator program so please do not edit the program manually. - * @author ramesh - * - */ -public class Definition extends WordnikObject { - - // - private List exampleUses = new ArrayList< ExampleUsage>(); - // - private String word ; - // - private String text ; - // - private List textProns = new ArrayList< TextPron>(); - // - private float score ; - // - private String partOfSpeech ; - // - private List notes = new ArrayList< Note>(); - // - private List citations = new ArrayList< Citation>(); - // - private List relatedWords = new ArrayList< Related>(); - // - private String sourceDictionary ; - // - private List