WIP for apachecon
Project: http://git-wip-us.apache.org/repos/asf/incubator-streams/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-streams/commit/1bc84dbc Tree: http://git-wip-us.apache.org/repos/asf/incubator-streams/tree/1bc84dbc Diff: http://git-wip-us.apache.org/repos/asf/incubator-streams/diff/1bc84dbc Branch: refs/heads/invalid_headers Commit: 1bc84dbc614cc0537e3238a6786a005f609b429c Parents: 114c1c5 Author: Steve Blackmon @steveblackmon <sblack...@apache.org> Authored: Fri May 6 19:45:12 2016 -0500 Committer: Steve Blackmon @steveblackmon <sblack...@apache.org> Committed: Wed Jun 1 12:51:43 2016 -0500 ---------------------------------------------------------------------- pom.xml | 10 - streams-config/pom.xml | 2 +- .../spring/streams-cassandra-context.xml | 25 ++ .../src/main/jsonschema/com/twitter/tweet.json | 6 +- streams-plugins/pom.xml | 4 + .../streams-plugin-cassandra/pom.xml | 244 ++++++++++++ .../StreamsCassandraGenerationConfig.java | 81 ++++ .../StreamsCassandraResourceGenerator.java | 376 +++++++++++++++++++ .../StreamsCassandraResourceGeneratorMojo.java | 93 +++++ .../src/site/markdown/index.md | 22 ++ ...treamsCassandraResourceGeneratorCLITest.java | 50 +++ ...reamsCassandraResourceGeneratorMojoTest.java | 75 ++++ .../StreamsCassandraResourceGeneratorTest.java | 124 ++++++ .../resources/streams-plugin-cassandra/pom.xml | 75 ++++ .../streams-plugin-elasticsearch/pom.xml | 245 ++++++++++++ .../StreamsElasticsearchGenerationConfig.java | 81 ++++ .../StreamsElasticsearchResourceGenerator.java | 373 ++++++++++++++++++ ...reamsElasticsearchResourceGeneratorMojo.java | 93 +++++ .../src/site/markdown/index.md | 22 ++ ...sElasticsearchResourceGeneratorMojoTest.java | 50 +++ ...reamsElasticsearchResourceGeneratorTest.java | 139 +++++++ .../streams-plugin-elasticsearch/pom.xml | 75 ++++ streams-plugins/streams-plugin-hbase/pom.xml | 244 ++++++++++++ .../hbase/StreamsHbaseGenerationConfig.java | 90 +++++ .../hbase/StreamsHbaseResourceGenerator.java | 204 ++++++++++ .../StreamsHbaseResourceGeneratorMojo.java | 93 +++++ .../src/site/markdown/index.md | 22 ++ .../StreamsHbaseResourceGeneratorCLITest.java | 41 ++ .../StreamsHbaseResourceGeneratorMojoTest.java | 65 ++++ .../test/StreamsHbaseResourceGeneratorTest.java | 125 ++++++ .../test/resources/streams-plugin-hbase/pom.xml | 76 ++++ streams-plugins/streams-plugin-hive/pom.xml | 6 + .../hive/StreamsHiveResourceGenerator.java | 7 +- .../hive/StreamsHiveResourceGeneratorMojo.java | 33 +- .../src/site/markdown/index.md | 22 ++ .../StreamsHiveResourceGeneratorCLITest.java | 41 ++ .../StreamsHiveResourceGeneratorMojoTest.java | 64 ++++ .../test/StreamsHiveResourceGeneratorTest.java | 21 +- .../test/resources/streams-plugin-hive/pom.xml | 41 +- streams-plugins/streams-plugin-pig/pom.xml | 244 ++++++++++++ .../plugins/pig/StreamsPigGenerationConfig.java | 84 +++++ .../pig/StreamsPigResourceGenerator.java | 317 ++++++++++++++++ .../pig/StreamsPigResourceGeneratorMojo.java | 93 +++++ .../src/site/markdown/index.md | 22 ++ .../StreamsPigResourceGeneratorCLITest.java | 39 ++ .../StreamsPigResourceGeneratorMojoTest.java | 64 ++++ .../test/StreamsPigResourceGeneratorTest.java | 122 ++++++ .../src/test/resources/expected/media_link.pig | 1 + .../resources/expected/objectTypes/file.pig | 1 + .../expected/objectTypes/photo-album.pig | 1 + .../test/resources/streams-plugin-pig/pom.xml | 75 ++++ streams-plugins/streams-plugin-pojo/pom.xml | 7 - .../plugins/StreamsPojoSourceGenerator.java | 16 +- .../plugins/StreamsPojoSourceGeneratorMojo.java | 43 +-- .../src/site/markdown/index.md | 22 ++ .../test/StreamsPojoSourceGeneratorCLITest.java | 43 +++ .../StreamsPojoSourceGeneratorMojoTest.java | 68 +--- .../test/StreamsPojoSourceGeneratorTest.java | 28 +- .../test/resources/streams-plugin-pojo/pom.xml | 1 + .../org/apache/streams/schema/FieldUtil.java | 30 ++ .../org/apache/streams/schema/FileUtil.java | 13 +- .../apache/streams/schema/GenerationConfig.java | 4 +- .../org/apache/streams/schema/SchemaUtil.java | 4 +- .../src/main/jsonschema/activity.json | 10 +- .../src/main/jsonschema/collection.json | 2 +- .../src/main/jsonschema/media_link.json | 2 +- streams-schemas/src/main/jsonschema/object.json | 6 +- .../src/main/jsonschema/objectTypes/alert.json | 2 +- .../jsonschema/objectTypes/application.json | 2 +- .../main/jsonschema/objectTypes/article.json | 2 +- .../src/main/jsonschema/objectTypes/audio.json | 2 +- .../src/main/jsonschema/objectTypes/badge.json | 2 +- .../src/main/jsonschema/objectTypes/binary.json | 2 +- .../main/jsonschema/objectTypes/bookmark.json | 2 +- .../main/jsonschema/objectTypes/comment.json | 2 +- .../src/main/jsonschema/objectTypes/device.json | 2 +- .../src/main/jsonschema/objectTypes/event.json | 2 +- .../src/main/jsonschema/objectTypes/file.json | 2 +- .../src/main/jsonschema/objectTypes/folder.json | 2 +- .../src/main/jsonschema/objectTypes/game.json | 2 +- .../src/main/jsonschema/objectTypes/group.json | 2 +- .../src/main/jsonschema/objectTypes/image.json | 2 +- .../src/main/jsonschema/objectTypes/issue.json | 2 +- .../src/main/jsonschema/objectTypes/job.json | 2 +- .../src/main/jsonschema/objectTypes/list.json | 2 +- .../src/main/jsonschema/objectTypes/note.json | 2 +- .../src/main/jsonschema/objectTypes/offer.json | 2 +- .../jsonschema/objectTypes/organization.json | 2 +- .../src/main/jsonschema/objectTypes/page.json | 2 +- .../main/jsonschema/objectTypes/permission.json | 2 +- .../src/main/jsonschema/objectTypes/person.json | 2 +- .../jsonschema/objectTypes/photo-album.json | 2 +- .../src/main/jsonschema/objectTypes/photo.json | 2 +- .../src/main/jsonschema/objectTypes/place.json | 18 +- .../main/jsonschema/objectTypes/playlist.json | 2 +- .../main/jsonschema/objectTypes/process.json | 2 +- .../main/jsonschema/objectTypes/product.json | 2 +- .../main/jsonschema/objectTypes/property.json | 2 +- .../main/jsonschema/objectTypes/question.json | 2 +- .../src/main/jsonschema/objectTypes/review.json | 2 +- .../src/main/jsonschema/objectTypes/role.json | 2 +- .../main/jsonschema/objectTypes/service.json | 2 +- .../src/main/jsonschema/objectTypes/song.json | 2 +- .../src/main/jsonschema/objectTypes/status.json | 2 +- .../src/main/jsonschema/objectTypes/task.json | 2 +- .../src/main/jsonschema/objectTypes/team.json | 2 +- .../src/main/jsonschema/objectTypes/video.json | 2 +- .../src/main/jsonschema/verbs/accept.json | 2 +- .../src/main/jsonschema/verbs/access.json | 2 +- .../src/main/jsonschema/verbs/acknowledge.json | 2 +- .../src/main/jsonschema/verbs/add.json | 2 +- .../src/main/jsonschema/verbs/agree.json | 2 +- .../src/main/jsonschema/verbs/append.json | 2 +- .../src/main/jsonschema/verbs/approve.json | 2 +- .../src/main/jsonschema/verbs/archive.json | 2 +- .../src/main/jsonschema/verbs/assign.json | 2 +- .../src/main/jsonschema/verbs/at.json | 2 +- .../src/main/jsonschema/verbs/attach.json | 2 +- .../src/main/jsonschema/verbs/attend.json | 2 +- .../src/main/jsonschema/verbs/author.json | 2 +- .../src/main/jsonschema/verbs/authorize.json | 2 +- .../src/main/jsonschema/verbs/borrow.json | 2 +- .../src/main/jsonschema/verbs/build.json | 2 +- .../src/main/jsonschema/verbs/cancel.json | 2 +- .../src/main/jsonschema/verbs/checkin.json | 2 +- .../src/main/jsonschema/verbs/close.json | 2 +- .../src/main/jsonschema/verbs/complete.json | 2 +- .../src/main/jsonschema/verbs/confirm.json | 2 +- .../src/main/jsonschema/verbs/consume.json | 2 +- .../src/main/jsonschema/verbs/create.json | 2 +- .../src/main/jsonschema/verbs/delete.json | 2 +- .../src/main/jsonschema/verbs/deliver.json | 2 +- .../src/main/jsonschema/verbs/deny.json | 2 +- .../src/main/jsonschema/verbs/disagree.json | 2 +- .../src/main/jsonschema/verbs/dislike.json | 2 +- .../src/main/jsonschema/verbs/experience.json | 2 +- .../src/main/jsonschema/verbs/favorite.json | 2 +- .../src/main/jsonschema/verbs/find.json | 2 +- .../jsonschema/verbs/flag-as-inappropriate.json | 2 +- .../src/main/jsonschema/verbs/follow.json | 2 +- .../src/main/jsonschema/verbs/give.json | 2 +- .../src/main/jsonschema/verbs/host.json | 2 +- .../src/main/jsonschema/verbs/ignore.json | 2 +- .../src/main/jsonschema/verbs/insert.json | 2 +- .../src/main/jsonschema/verbs/install.json | 2 +- .../src/main/jsonschema/verbs/interact.json | 2 +- .../src/main/jsonschema/verbs/invite.json | 2 +- .../src/main/jsonschema/verbs/join.json | 2 +- .../src/main/jsonschema/verbs/leave.json | 2 +- .../src/main/jsonschema/verbs/like.json | 2 +- .../src/main/jsonschema/verbs/listen.json | 2 +- .../src/main/jsonschema/verbs/lose.json | 2 +- .../src/main/jsonschema/verbs/make-friend.json | 2 +- .../src/main/jsonschema/verbs/open.json | 2 +- .../src/main/jsonschema/verbs/play.json | 2 +- .../src/main/jsonschema/verbs/post.json | 2 +- .../src/main/jsonschema/verbs/present.json | 2 +- .../src/main/jsonschema/verbs/purchase.json | 2 +- .../src/main/jsonschema/verbs/qualify.json | 2 +- .../src/main/jsonschema/verbs/read.json | 2 +- .../src/main/jsonschema/verbs/receive.json | 2 +- .../src/main/jsonschema/verbs/reject.json | 2 +- .../main/jsonschema/verbs/remove-friend.json | 2 +- .../src/main/jsonschema/verbs/remove.json | 2 +- .../src/main/jsonschema/verbs/replace.json | 2 +- .../main/jsonschema/verbs/request-friend.json | 2 +- .../src/main/jsonschema/verbs/request.json | 2 +- .../src/main/jsonschema/verbs/resolve.json | 2 +- .../src/main/jsonschema/verbs/retract.json | 2 +- .../src/main/jsonschema/verbs/return.json | 2 +- .../src/main/jsonschema/verbs/rsvp-maybe.json | 2 +- .../src/main/jsonschema/verbs/rsvp-no.json | 2 +- .../src/main/jsonschema/verbs/rsvp-yes.json | 2 +- .../src/main/jsonschema/verbs/satisfy.json | 2 +- .../src/main/jsonschema/verbs/save.json | 2 +- .../src/main/jsonschema/verbs/schedule.json | 2 +- .../src/main/jsonschema/verbs/search.json | 4 +- .../src/main/jsonschema/verbs/sell.json | 2 +- .../src/main/jsonschema/verbs/send.json | 10 +- .../src/main/jsonschema/verbs/share.json | 2 +- .../src/main/jsonschema/verbs/sponsor.json | 2 +- .../src/main/jsonschema/verbs/start.json | 2 +- .../main/jsonschema/verbs/stop-following.json | 4 +- .../src/main/jsonschema/verbs/submit.json | 2 +- .../src/main/jsonschema/verbs/tag.json | 2 +- .../src/main/jsonschema/verbs/terminate.json | 2 +- .../src/main/jsonschema/verbs/tie.json | 2 +- .../src/main/jsonschema/verbs/unfavorite.json | 2 +- .../src/main/jsonschema/verbs/unlike.json | 2 +- .../src/main/jsonschema/verbs/unsatisfy.json | 2 +- .../src/main/jsonschema/verbs/unsave.json | 2 +- .../src/main/jsonschema/verbs/unshare.json | 2 +- .../src/main/jsonschema/verbs/update.json | 2 +- .../src/main/jsonschema/verbs/use.json | 2 +- .../src/main/jsonschema/verbs/watch.json | 2 +- .../src/main/jsonschema/verbs/win.json | 2 +- .../src/site/resources/activity.json | 108 ------ streams-schemas/src/site/resources/activity.xsd | 94 ----- .../src/site/resources/collection.json | 47 --- .../src/site/resources/media_link.json | 34 -- streams-schemas/src/site/resources/object.json | 98 ----- .../src/site/resources/objectTypes/alert.json | 19 - .../site/resources/objectTypes/application.json | 19 - .../src/site/resources/objectTypes/article.json | 19 - .../src/site/resources/objectTypes/audio.json | 19 - .../src/site/resources/objectTypes/badge.json | 19 - .../src/site/resources/objectTypes/binary.json | 19 - .../site/resources/objectTypes/bookmark.json | 19 - .../src/site/resources/objectTypes/comment.json | 19 - .../src/site/resources/objectTypes/device.json | 19 - .../src/site/resources/objectTypes/event.json | 51 --- .../src/site/resources/objectTypes/file.json | 25 -- .../src/site/resources/objectTypes/folder.json | 19 - .../src/site/resources/objectTypes/game.json | 19 - .../src/site/resources/objectTypes/group.json | 19 - .../src/site/resources/objectTypes/image.json | 22 -- .../src/site/resources/objectTypes/issue.json | 25 -- .../src/site/resources/objectTypes/job.json | 19 - .../src/site/resources/objectTypes/list.json | 28 -- .../src/site/resources/objectTypes/note.json | 19 - .../src/site/resources/objectTypes/offer.json | 19 - .../resources/objectTypes/organization.json | 19 - .../src/site/resources/objectTypes/page.json | 19 - .../site/resources/objectTypes/permission.json | 36 -- .../src/site/resources/objectTypes/person.json | 25 -- .../site/resources/objectTypes/photo-album.json | 19 - .../src/site/resources/objectTypes/photo.json | 23 -- .../src/site/resources/objectTypes/place.json | 43 --- .../site/resources/objectTypes/playlist.json | 19 - .../src/site/resources/objectTypes/process.json | 19 - .../src/site/resources/objectTypes/product.json | 25 -- .../site/resources/objectTypes/property.json | 48 --- .../site/resources/objectTypes/question.json | 28 -- .../src/site/resources/objectTypes/review.json | 22 -- .../src/site/resources/objectTypes/role.json | 25 -- .../src/site/resources/objectTypes/service.json | 19 - .../src/site/resources/objectTypes/song.json | 19 - .../src/site/resources/objectTypes/status.json | 19 - .../src/site/resources/objectTypes/task.json | 40 -- .../src/site/resources/objectTypes/team.json | 19 - .../src/site/resources/objectTypes/video.json | 19 - .../src/site/resources/verbs/accept.json | 24 -- .../src/site/resources/verbs/access.json | 24 -- .../src/site/resources/verbs/acknowledge.json | 24 -- .../src/site/resources/verbs/add.json | 24 -- .../src/site/resources/verbs/agree.json | 24 -- .../src/site/resources/verbs/append.json | 24 -- .../src/site/resources/verbs/approve.json | 24 -- .../src/site/resources/verbs/archive.json | 24 -- .../src/site/resources/verbs/assign.json | 24 -- .../src/site/resources/verbs/at.json | 24 -- .../src/site/resources/verbs/attach.json | 24 -- .../src/site/resources/verbs/attend.json | 24 -- .../src/site/resources/verbs/author.json | 24 -- .../src/site/resources/verbs/authorize.json | 24 -- .../src/site/resources/verbs/borrow.json | 24 -- .../src/site/resources/verbs/build.json | 24 -- .../src/site/resources/verbs/cancel.json | 24 -- .../src/site/resources/verbs/checkin.json | 24 -- .../src/site/resources/verbs/close.json | 24 -- .../src/site/resources/verbs/complete.json | 24 -- .../src/site/resources/verbs/confirm.json | 24 -- .../src/site/resources/verbs/consume.json | 24 -- .../src/site/resources/verbs/create.json | 24 -- .../src/site/resources/verbs/delete.json | 24 -- .../src/site/resources/verbs/deliver.json | 24 -- .../src/site/resources/verbs/deny.json | 24 -- .../src/site/resources/verbs/disagree.json | 24 -- .../src/site/resources/verbs/dislike.json | 24 -- .../src/site/resources/verbs/experience.json | 24 -- .../src/site/resources/verbs/favorite.json | 24 -- .../src/site/resources/verbs/find.json | 24 -- .../resources/verbs/flag-as-inappropriate.json | 24 -- .../src/site/resources/verbs/follow.json | 24 -- .../src/site/resources/verbs/give.json | 24 -- .../src/site/resources/verbs/host.json | 24 -- .../src/site/resources/verbs/ignore.json | 24 -- .../src/site/resources/verbs/insert.json | 24 -- .../src/site/resources/verbs/install.json | 24 -- .../src/site/resources/verbs/interact.json | 24 -- .../src/site/resources/verbs/invite.json | 24 -- .../src/site/resources/verbs/join.json | 24 -- .../src/site/resources/verbs/leave.json | 24 -- .../src/site/resources/verbs/like.json | 24 -- .../src/site/resources/verbs/listen.json | 24 -- .../src/site/resources/verbs/lose.json | 24 -- .../src/site/resources/verbs/make-friend.json | 24 -- .../src/site/resources/verbs/open.json | 24 -- .../src/site/resources/verbs/play.json | 24 -- .../src/site/resources/verbs/post.json | 24 -- .../src/site/resources/verbs/present.json | 24 -- .../src/site/resources/verbs/purchase.json | 24 -- .../src/site/resources/verbs/qualify.json | 24 -- .../src/site/resources/verbs/read.json | 24 -- .../src/site/resources/verbs/receive.json | 24 -- .../src/site/resources/verbs/reject.json | 24 -- .../src/site/resources/verbs/remove-friend.json | 24 -- .../src/site/resources/verbs/remove.json | 24 -- .../src/site/resources/verbs/replace.json | 24 -- .../site/resources/verbs/request-friend.json | 24 -- .../src/site/resources/verbs/request.json | 24 -- .../src/site/resources/verbs/resolve.json | 24 -- .../src/site/resources/verbs/retract.json | 24 -- .../src/site/resources/verbs/return.json | 24 -- .../src/site/resources/verbs/rsvp-maybe.json | 24 -- .../src/site/resources/verbs/rsvp-no.json | 24 -- .../src/site/resources/verbs/rsvp-yes.json | 24 -- .../src/site/resources/verbs/satisfy.json | 24 -- .../src/site/resources/verbs/save.json | 24 -- .../src/site/resources/verbs/schedule.json | 24 -- .../src/site/resources/verbs/search.json | 24 -- .../src/site/resources/verbs/sell.json | 24 -- .../src/site/resources/verbs/send.json | 24 -- .../src/site/resources/verbs/share.json | 24 -- .../src/site/resources/verbs/sponsor.json | 24 -- .../src/site/resources/verbs/start.json | 24 -- .../site/resources/verbs/stop-following.json | 24 -- .../src/site/resources/verbs/submit.json | 24 -- .../src/site/resources/verbs/tag.json | 24 -- .../src/site/resources/verbs/terminate.json | 24 -- .../src/site/resources/verbs/tie.json | 24 -- .../src/site/resources/verbs/unfavorite.json | 24 -- .../src/site/resources/verbs/unlike.json | 24 -- .../src/site/resources/verbs/unsatisfy.json | 24 -- .../src/site/resources/verbs/unsave.json | 24 -- .../src/site/resources/verbs/unshare.json | 24 -- .../src/site/resources/verbs/update.json | 34 -- .../src/site/resources/verbs/use.json | 24 -- .../src/site/resources/verbs/watch.json | 24 -- .../src/site/resources/verbs/win.json | 24 -- .../schema/test/SchemaOrderingTests.java | 146 +++++++ .../streams/schema/test/SchemaStoreTests.java | 76 ++++ .../src/test/resources/activities/accept.json | 16 + .../src/test/resources/activities/access.json | 17 + .../test/resources/activities/acknowledge.json | 16 + .../src/test/resources/activities/add.json | 21 ++ .../src/test/resources/activities/agree.json | 15 + .../src/test/resources/activities/append.json | 16 + .../src/test/resources/activities/approve.json | 20 + .../src/test/resources/activities/archive.json | 15 + .../src/test/resources/activities/assign.json | 20 + .../src/test/resources/activities/at.json | 15 + .../src/test/resources/activities/attach.json | 20 + .../src/test/resources/activities/attend.json | 15 + .../src/test/resources/activities/author.json | 15 + .../test/resources/activities/authorize.json | 23 ++ .../src/test/resources/activities/borrow.json | 21 ++ .../src/test/resources/activities/build.json | 16 + .../src/test/resources/activities/cancel.json | 16 + .../src/test/resources/activities/checkin.json | 16 + .../src/test/resources/activities/close.json | 16 + .../src/test/resources/activities/complete.json | 16 + .../src/test/resources/activities/confirm.json | 17 + .../src/test/resources/activities/consume.json | 16 + .../src/test/resources/activities/create.json | 15 + .../src/test/resources/activities/delete.json | 16 + .../src/test/resources/activities/deliver.json | 20 + .../src/test/resources/activities/deny.json | 23 ++ .../src/test/resources/activities/disagree.json | 30 ++ .../src/test/resources/activities/dislike.json | 15 + .../test/resources/activities/experience.json | 16 + .../src/test/resources/activities/favorite.json | 15 + .../src/test/resources/activities/find.json | 19 + .../activities/flag-as-inappropriate.json | 24 ++ .../src/test/resources/activities/follow.json | 15 + .../src/test/resources/activities/give.json | 28 ++ .../src/test/resources/activities/host.json | 15 + .../src/test/resources/activities/ignore.json | 15 + .../src/test/resources/activities/insert.json | 19 + .../src/test/resources/activities/install.json | 18 + .../src/test/resources/activities/interact.json | 16 + .../src/test/resources/activities/invite.json | 19 + .../src/test/resources/activities/join.json | 15 + .../src/test/resources/activities/leave.json | 15 + .../src/test/resources/activities/like.json | 22 ++ .../src/test/resources/activities/listen.json | 15 + .../src/test/resources/activities/lose.json | 15 + .../test/resources/activities/make-friend.json | 15 + .../src/test/resources/activities/open.json | 15 + .../src/test/resources/activities/play.json | 15 + .../src/test/resources/activities/post.json | 25 ++ .../src/test/resources/activities/present.json | 15 + .../src/test/resources/activities/purchase.json | 16 + .../src/test/resources/activities/qualify.json | 15 + .../src/test/resources/activities/read.json | 16 + .../src/test/resources/activities/receive.json | 16 + .../src/test/resources/activities/reject.json | 15 + .../resources/activities/remove-friend.json | 15 + .../src/test/resources/activities/remove.json | 23 ++ .../src/test/resources/activities/replace.json | 19 + .../resources/activities/request-friend.json | 16 + .../src/test/resources/activities/request.json | 23 ++ .../src/test/resources/activities/resolve.json | 15 + .../src/test/resources/activities/retract.json | 26 ++ .../src/test/resources/activities/return.json | 19 + .../test/resources/activities/rsvp-maybe.json | 16 + .../src/test/resources/activities/rsvp-no.json | 16 + .../src/test/resources/activities/rsvp-yes.json | 16 + .../src/test/resources/activities/satisfy.json | 21 ++ .../src/test/resources/activities/save.json | 20 + .../src/test/resources/activities/schedule.json | 15 + .../src/test/resources/activities/search.json | 21 ++ .../src/test/resources/activities/sell.json | 19 + .../src/test/resources/activities/send.json | 19 + .../src/test/resources/activities/share.json | 16 + .../src/test/resources/activities/sponsor.json | 17 + .../src/test/resources/activities/start.json | 15 + .../resources/activities/stop-following.json | 15 + .../src/test/resources/activities/submit.json | 15 + .../src/test/resources/activities/tag.json | 19 + .../test/resources/activities/terminate.json | 15 + .../src/test/resources/activities/tie.json | 24 ++ .../test/resources/activities/unfavorite.json | 15 + .../src/test/resources/activities/unlike.json | 15 + .../test/resources/activities/unsatisfy.json | 20 + .../src/test/resources/activities/unsave.json | 15 + .../src/test/resources/activities/unshare.json | 15 + .../src/test/resources/activities/update.json | 15 + .../src/test/resources/activities/use.json | 15 + .../src/test/resources/activities/watch.json | 16 + .../src/test/resources/activities/win.json | 15 + .../src/test/resources/media_link.json | 7 + .../src/test/resources/objects/event.json | 18 + .../src/test/resources/objects/group.json | 16 + .../src/test/resources/objects/issue.json | 9 + .../src/test/resources/objects/note.json | 12 + .../src/test/resources/objects/permission.json | 9 + .../src/test/resources/objects/place.json | 9 + .../src/test/resources/objects/task.json | 16 + .../src/test/resources/objects/video.json | 8 + 430 files changed, 6688 insertions(+), 3771 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/1bc84dbc/pom.xml ---------------------------------------------------------------------- diff --git a/pom.xml b/pom.xml index 6010572..08058ab 100644 --- a/pom.xml +++ b/pom.xml @@ -81,12 +81,6 @@ <subscribe>dev-subscr...@streams.incubator.apache.org</subscribe> <unsubscribe>dev-unsubscr...@streams.incubator.apache.org</unsubscribe> </mailingList> - <mailingList> - <name>User Mailing List</name> - <post>u...@streams.incubator.apache.org</post> - <subscribe>user-subscr...@streams.incubator.apache.org</subscribe> - <unsubscribe>user-unsubscr...@streams.incubator.apache.org</unsubscribe> - </mailingList> </mailingLists> <repositories> @@ -185,10 +179,6 @@ <packaging>pom</packaging> - <properties> - <jsonschema2pojo.version>0.4.22</jsonschema2pojo.version> - </properties> - <build> <plugins> <plugin> http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/1bc84dbc/streams-config/pom.xml ---------------------------------------------------------------------- diff --git a/streams-config/pom.xml b/streams-config/pom.xml index 38d5554..f4a8ebc 100644 --- a/streams-config/pom.xml +++ b/streams-config/pom.xml @@ -111,7 +111,7 @@ </goals> <configuration> <sources> - <source>target/generated-sources/jsonschema2pojo</source> + <source>${project.basedir}/target/generated-sources/jsonschema2pojo</source> </sources> </configuration> </execution> http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/1bc84dbc/streams-contrib/streams-persist-cassandra/src/site/resources/META_INF/spring/streams-cassandra-context.xml ---------------------------------------------------------------------- diff --git a/streams-contrib/streams-persist-cassandra/src/site/resources/META_INF/spring/streams-cassandra-context.xml b/streams-contrib/streams-persist-cassandra/src/site/resources/META_INF/spring/streams-cassandra-context.xml new file mode 100644 index 0000000..842c918 --- /dev/null +++ b/streams-contrib/streams-persist-cassandra/src/site/resources/META_INF/spring/streams-cassandra-context.xml @@ -0,0 +1,25 @@ +<!-- + ~ Licensed to the Apache Software Foundation (ASF) under one + ~ or more contributor license agreements. See the NOTICE file + ~ distributed with this work for additional information + ~ regarding copyright ownership. The ASF licenses this file + ~ to you under the Apache License, Version 2.0 (the + ~ "License"); you may not use this file except in compliance + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, + ~ software distributed under the License is distributed on an + ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + ~ KIND, either express or implied. See the License for the + ~ specific language governing permissions and limitations + ~ under the License. + --> +<beans + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns="http://www.springframework.org/schema/beans" + xmlns:context="http://www.springframework.org/schema/context" + xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> + +</beans> http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/1bc84dbc/streams-contrib/streams-provider-twitter/src/main/jsonschema/com/twitter/tweet.json ---------------------------------------------------------------------- diff --git a/streams-contrib/streams-provider-twitter/src/main/jsonschema/com/twitter/tweet.json b/streams-contrib/streams-provider-twitter/src/main/jsonschema/com/twitter/tweet.json index 34ca3fa..bdd2201 100644 --- a/streams-contrib/streams-provider-twitter/src/main/jsonschema/com/twitter/tweet.json +++ b/streams-contrib/streams-provider-twitter/src/main/jsonschema/com/twitter/tweet.json @@ -97,9 +97,9 @@ }, "indices": { "type": "array", - "items": [{ - "type": "integer" - }] + "items": { + "type": "integer" + } } } } http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/1bc84dbc/streams-plugins/pom.xml ---------------------------------------------------------------------- diff --git a/streams-plugins/pom.xml b/streams-plugins/pom.xml index b90e2d5..5d403ac 100644 --- a/streams-plugins/pom.xml +++ b/streams-plugins/pom.xml @@ -36,7 +36,11 @@ </properties> <modules> + <module>streams-plugin-cassandra</module> + <module>streams-plugin-elasticsearch</module> + <module>streams-plugin-hbase</module> <module>streams-plugin-hive</module> + <module>streams-plugin-pig</module> <module>streams-plugin-pojo</module> </modules> http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/1bc84dbc/streams-plugins/streams-plugin-cassandra/pom.xml ---------------------------------------------------------------------- diff --git a/streams-plugins/streams-plugin-cassandra/pom.xml b/streams-plugins/streams-plugin-cassandra/pom.xml new file mode 100644 index 0000000..b2dbf36 --- /dev/null +++ b/streams-plugins/streams-plugin-cassandra/pom.xml @@ -0,0 +1,244 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + ~ Licensed to the Apache Software Foundation (ASF) under one + ~ or more contributor license agreements. See the NOTICE file + ~ distributed with this work for additional information + ~ regarding copyright ownership. The ASF licenses this file + ~ to you under the Apache License, Version 2.0 (the + ~ "License"); you may not use this file except in compliance + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, + ~ software distributed under the License is distributed on an + ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + ~ KIND, either express or implied. See the License for the + ~ specific language governing permissions and limitations + ~ under the License. + --> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + + <modelVersion>4.0.0</modelVersion> + <groupId>org.apache.streams.plugins</groupId> + <artifactId>streams-plugin-cassandra</artifactId> + <version>0.3-incubating-SNAPSHOT</version> + <packaging>maven-plugin</packaging> + + <parent> + <groupId>org.apache.streams</groupId> + <artifactId>streams-plugins</artifactId> + <version>0.3-incubating-SNAPSHOT</version> + <relativePath>..</relativePath> + </parent> + + <properties> + <cassandra.version>3.0.0</cassandra.version> + </properties> + + <dependencies> + <dependency> + <groupId>org.apache.streams</groupId> + <artifactId>streams-config</artifactId> + <version>${project.version}</version> + <exclusions> + <exclusion> + <artifactId>commons-logging</artifactId> + <groupId>commons-logging</groupId> + </exclusion> + </exclusions> + </dependency> + <dependency> + <groupId>org.apache.streams</groupId> + <artifactId>streams-core</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>org.apache.streams</groupId> + <artifactId>streams-schemas</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>com.google.guava</groupId> + <artifactId>guava</artifactId> + </dependency> + <dependency> + <groupId>org.reflections</groupId> + <artifactId>reflections</artifactId> + <version>0.9.9</version> + </dependency> + <dependency> + <groupId>org.apache.maven</groupId> + <artifactId>maven-aether-provider</artifactId> + <version>3.3.3</version> + </dependency> + <dependency> + <groupId>org.apache.maven</groupId> + <artifactId>maven-artifact</artifactId> + <version>3.3.3</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>org.apache.maven</groupId> + <artifactId>maven-compat</artifactId> + <version>3.3.3</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.apache.maven</groupId> + <artifactId>maven-core</artifactId> + <version>3.3.3</version> + <exclusions> + <exclusion> + <groupId>org.sonatype.aether</groupId> + <artifactId>*</artifactId> + </exclusion> + </exclusions> + </dependency> + <dependency> + <groupId>org.apache.maven</groupId> + <artifactId>maven-plugin-api</artifactId> + <version>3.3.3</version> + </dependency> + <dependency> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-resources-plugin</artifactId> + <version>2.7</version> + <exclusions> + <exclusion> + <groupId>org.apache.maven</groupId> + <artifactId>*</artifactId> + </exclusion> + </exclusions> + </dependency> + <dependency> + <groupId>org.apache.maven.shared</groupId> + <artifactId>maven-verifier</artifactId> + <version>1.6</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.codehaus.plexus</groupId> + <artifactId>plexus-utils</artifactId> + <version>3.0.15</version> + </dependency> + <dependency> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-plugin-plugin</artifactId> + <version>3.4</version> + <exclusions> + <exclusion> + <artifactId>commons-logging</artifactId> + <groupId>commons-logging</groupId> + </exclusion> + </exclusions> + </dependency> + <dependency> + <groupId>org.apache.maven.plugin-tools</groupId> + <artifactId>maven-plugin-tools-api</artifactId> + <version>3.3</version> + </dependency> + <dependency> + <groupId>org.apache.maven.plugin-tools</groupId> + <artifactId>maven-plugin-annotations</artifactId> + <version>3.3</version> + </dependency> + <dependency> + <groupId>org.apache.maven.plugin-tools</groupId> + <artifactId>maven-plugin-tools-generators</artifactId> + <version>3.3</version> + </dependency> + <dependency> + <groupId>org.apache.maven.plugin-testing</groupId> + <artifactId>maven-plugin-testing-harness</artifactId> + <version>3.3.0</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>commons-lang</groupId> + <artifactId>commons-lang</artifactId> + <version>2.6</version> + </dependency> + <dependency> + <groupId>joda-time</groupId> + <artifactId>joda-time</artifactId> + <version>2.2</version> + </dependency> + <dependency> + <groupId>org.joda</groupId> + <artifactId>joda-convert</artifactId> + <version>1.8.1</version> + </dependency> + </dependencies> + + <build> + <sourceDirectory>src/main/java</sourceDirectory> + <testSourceDirectory>src/test/java</testSourceDirectory> + <resources> + <resource> + <directory>src/main/resources</directory> + </resource> + </resources> + <testResources> + <testResource> + <directory>src/test/resources</directory> + </testResource> + </testResources> + <plugins> + <plugin> + <artifactId>maven-plugin-plugin</artifactId> + <version>3.4</version> + <configuration> + <skipErrorNoDescriptorsFound>true</skipErrorNoDescriptorsFound> + </configuration> + <executions> + <execution> + <id>mojo-descriptor</id> + <phase>process-classes</phase> + <goals> + <goal>descriptor</goal> + </goals> + </execution> + </executions> + </plugin> + <plugin> + <groupId>org.reflections</groupId> + <artifactId>reflections-maven</artifactId> + <executions> + <execution> + <goals> + <goal>reflections</goal> + </goals> + <phase>process-classes</phase> + </execution> + </executions> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-dependency-plugin</artifactId> + <version>2.4</version> + <executions> + <execution> + <id>resource-dependencies</id> + <phase>process-test-resources</phase> + <goals> + <goal>unpack-dependencies</goal> + </goals> + <configuration> + <includeGroupIds>org.apache.streams</includeGroupIds> + <includeArtifactIds>streams-schemas</includeArtifactIds> + <includes>**/*.json</includes> + <outputDirectory>${project.build.directory}/test-classes/streams-schemas</outputDirectory> + </configuration> + </execution> + </executions> + </plugin> + + </plugins> + </build> + +</project> http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/1bc84dbc/streams-plugins/streams-plugin-cassandra/src/main/java/org/apache/streams/plugins/cassandra/StreamsCassandraGenerationConfig.java ---------------------------------------------------------------------- diff --git a/streams-plugins/streams-plugin-cassandra/src/main/java/org/apache/streams/plugins/cassandra/StreamsCassandraGenerationConfig.java b/streams-plugins/streams-plugin-cassandra/src/main/java/org/apache/streams/plugins/cassandra/StreamsCassandraGenerationConfig.java new file mode 100644 index 0000000..28e20e4 --- /dev/null +++ b/streams-plugins/streams-plugin-cassandra/src/main/java/org/apache/streams/plugins/cassandra/StreamsCassandraGenerationConfig.java @@ -0,0 +1,81 @@ +package org.apache.streams.plugins.cassandra; + +import org.apache.streams.schema.GenerationConfig; +import org.jsonschema2pojo.DefaultGenerationConfig; +import org.jsonschema2pojo.util.URLUtil; + +import java.io.File; +import java.net.URL; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Set; + +/** + * Configures StreamsHiveResourceGenerator + * + * + */ +public class StreamsCassandraGenerationConfig extends DefaultGenerationConfig implements GenerationConfig { + + public String getSourceDirectory() { + return sourceDirectory; + } + + public List<String> getSourcePaths() { + return sourcePaths; + } + + private String sourceDirectory; + private List<String> sourcePaths = new ArrayList<String>(); + private String targetDirectory; + private int maxDepth = 1; + + public Set<String> getExclusions() { + return exclusions; + } + + public void setExclusions(Set<String> exclusions) { + this.exclusions = exclusions; + } + + private Set<String> exclusions = new HashSet<String>(); + + public int getMaxDepth() { + return maxDepth; + } + + public void setSourceDirectory(String sourceDirectory) { + this.sourceDirectory = sourceDirectory; + } + + public void setSourcePaths(List<String> sourcePaths) { + this.sourcePaths = sourcePaths; + } + + public void setTargetDirectory(String targetDirectory) { + this.targetDirectory = targetDirectory; + } + + public File getTargetDirectory() { + return new File(targetDirectory); + } + + public Iterator<URL> getSource() { + if (null != sourceDirectory) { + return Collections.singleton(URLUtil.parseURL(sourceDirectory)).iterator(); + } + List<URL> sourceURLs = new ArrayList<URL>(); + if( sourcePaths != null && sourcePaths.size() > 0) + for (String source : sourcePaths) { + sourceURLs.add(URLUtil.parseURL(source)); + } + return sourceURLs.iterator(); + } + + public void setMaxDepth(int maxDepth) { + this.maxDepth = maxDepth; + } +} http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/1bc84dbc/streams-plugins/streams-plugin-cassandra/src/main/java/org/apache/streams/plugins/cassandra/StreamsCassandraResourceGenerator.java ---------------------------------------------------------------------- diff --git a/streams-plugins/streams-plugin-cassandra/src/main/java/org/apache/streams/plugins/cassandra/StreamsCassandraResourceGenerator.java b/streams-plugins/streams-plugin-cassandra/src/main/java/org/apache/streams/plugins/cassandra/StreamsCassandraResourceGenerator.java new file mode 100644 index 0000000..787ae02 --- /dev/null +++ b/streams-plugins/streams-plugin-cassandra/src/main/java/org/apache/streams/plugins/cassandra/StreamsCassandraResourceGenerator.java @@ -0,0 +1,376 @@ +package org.apache.streams.plugins.cassandra; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.ObjectNode; +import com.google.common.base.Joiner; +import com.google.common.base.Optional; +import com.google.common.base.Preconditions; +import com.google.common.base.Strings; +import com.google.common.collect.Lists; +import org.apache.streams.schema.FieldType; +import org.apache.streams.schema.FieldUtil; +import org.apache.streams.schema.GenerationConfig; +import org.apache.streams.schema.Schema; +import org.apache.streams.schema.SchemaStore; +import org.apache.streams.schema.URIUtil; +import org.jsonschema2pojo.util.URLUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.net.URI; +import java.net.URL; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +import static com.google.common.base.Preconditions.checkNotNull; +import static org.apache.commons.lang3.StringUtils.defaultString; +import static org.apache.streams.schema.FileUtil.dropExtension; +import static org.apache.streams.schema.FileUtil.dropSourcePathPrefix; +import static org.apache.streams.schema.FileUtil.resolveRecursive; +import static org.apache.streams.schema.FileUtil.swapExtension; +import static org.apache.streams.schema.FileUtil.writeFile; + +/** + * Created by sblackmon on 5/3/16. + */ +public class StreamsCassandraResourceGenerator implements Runnable { + + private final static Logger LOGGER = LoggerFactory.getLogger(StreamsCassandraResourceGenerator.class); + + private final static String LS = System.getProperty("line.separator"); + + private StreamsCassandraGenerationConfig config; + + private SchemaStore schemaStore = new SchemaStore(); + + private int currentDepth = 0; + + public static void main(String[] args) { + StreamsCassandraGenerationConfig config = new StreamsCassandraGenerationConfig(); + + String sourceDirectory = "./target/test-classes/activities"; + String targetDirectory = "./target/generated-resources/cassandra"; + + if( args.length > 0 ) + sourceDirectory = args[0]; + if( args.length > 1 ) + targetDirectory = args[1]; + + config.setSourceDirectory(sourceDirectory); + config.setTargetDirectory(targetDirectory); + + StreamsCassandraResourceGenerator streamsCassandraResourceGenerator = new StreamsCassandraResourceGenerator(config); + Thread thread = new Thread(streamsCassandraResourceGenerator); + thread.start(); + try { + thread.join(); + } catch (InterruptedException e) { + LOGGER.error("InterruptedException", e); + } catch (Exception e) { + LOGGER.error("Exception", e); + } + return; + } + + public StreamsCassandraResourceGenerator(StreamsCassandraGenerationConfig config) { + this.config = config; + } + + public void run() { + + checkNotNull(config); + + generate(config); + + } + + public void generate(StreamsCassandraGenerationConfig config) { + + LinkedList<File> sourceFiles = new LinkedList<File>(); + + for (Iterator<URL> sources = config.getSource(); sources.hasNext();) { + URL source = sources.next(); + sourceFiles.add(URLUtil.getFileFromURL(source)); + } + + LOGGER.info("Seeded with {} source paths:", sourceFiles.size()); + + resolveRecursive((GenerationConfig)config, sourceFiles); + + LOGGER.info("Resolved {} schema files:", sourceFiles.size()); + + for (Iterator<File> iterator = sourceFiles.iterator(); iterator.hasNext();) { + File item = iterator.next(); + schemaStore.create(item.toURI()); + } + + LOGGER.info("Identified {} objects:", schemaStore.getSize()); + + String outputFile = config.getTargetDirectory() + "/" + "types.cql"; + StringBuilder typesContent = new StringBuilder(); + + for (Iterator<Schema> schemaIterator = schemaStore.getSchemaIterator(); schemaIterator.hasNext(); ) { + Schema schema = schemaIterator.next(); + currentDepth = 0; + if( schema.getURI().getScheme().equals("file")) { + String inputFile = schema.getURI().getPath(); + String resourcePath = dropSourcePathPrefix(inputFile, config.getSourceDirectory()); + for (String sourcePath : config.getSourcePaths()) { + resourcePath = dropSourcePathPrefix(resourcePath, sourcePath); + } + + LOGGER.info("Processing {}:", resourcePath); + + String resourceId = schemaSymbol(schema); + + String resourceContent = generateResource(schema, resourceId); + + typesContent.append(resourceContent); + + LOGGER.info("Added {}:", resourceId); + } + } + + writeFile(outputFile, typesContent.toString()); + + } + + public String generateResource(Schema schema, String resourceId) { + StringBuilder resourceBuilder = new StringBuilder(); + resourceBuilder.append("CREATE TYPE "); + resourceBuilder.append(resourceId); + resourceBuilder.append(" IF NOT EXISTS ("); + resourceBuilder.append(LS); + resourceBuilder = appendRootObject(resourceBuilder, schema, resourceId, ' '); + resourceBuilder.append(");"); + resourceBuilder.append(LS); + return resourceBuilder.toString(); + } + + public StringBuilder appendRootObject(StringBuilder builder, Schema schema, String resourceId, Character seperator) { + ObjectNode propertiesNode = schemaStore.resolveProperties(schema, null, resourceId); + if( propertiesNode.get("id") != null ) { + builder.append("id text PRIMARY KEY,"); + builder.append(LS); + propertiesNode.remove("id"); + } + if( propertiesNode != null && propertiesNode.isObject() && propertiesNode.size() > 0) { + builder = appendPropertiesNode(builder, schema, propertiesNode, seperator); + } + return builder; + } + + private StringBuilder appendValueField(StringBuilder builder, Schema schema, String fieldId, FieldType fieldType, Character seperator) { + // safe to append nothing + checkNotNull(builder); + builder.append(cqlEscape(fieldId)); + builder.append(seperator); + builder.append(cqlType(fieldType)); + return builder; + } + + public StringBuilder appendArrayItems(StringBuilder builder, Schema schema, String fieldId, ObjectNode itemsNode, Character seperator) { + // not safe to append nothing + checkNotNull(builder); + if( itemsNode == null ) return builder; + if( itemsNode.has("type")) { + try { + FieldType itemType = FieldUtil.determineFieldType(itemsNode); + switch( itemType ) { + case OBJECT: + Schema objectSchema = null; + URI parentURI = null; + if( itemsNode.has("$ref") || itemsNode.has("extends") ) { + JsonNode refNode = itemsNode.get("$ref"); + JsonNode extendsNode = itemsNode.get("extends"); + if (refNode != null && refNode.isValueNode()) + parentURI = URI.create(refNode.asText()); + else if (extendsNode != null && extendsNode.isObject()) + parentURI = URI.create(extendsNode.get("$ref").asText()); + URI absoluteURI; + if (parentURI.isAbsolute()) + absoluteURI = parentURI; + else { + absoluteURI = schema.getURI().resolve(parentURI); + if (!absoluteURI.isAbsolute() || (absoluteURI.isAbsolute() && !schemaStore.getByUri(absoluteURI).isPresent() )) + absoluteURI = schema.getParentURI().resolve(parentURI); + } + if (absoluteURI != null && absoluteURI.isAbsolute()) { + Optional<Schema> schemaLookup = schemaStore.getByUri(absoluteURI); + if (schemaLookup.isPresent()) { + objectSchema = schemaLookup.get(); + } + } + } + // have to resolve schema here + + builder = appendArrayObject(builder, objectSchema, fieldId, seperator); + break; + case ARRAY: + ObjectNode subArrayItems = (ObjectNode) itemsNode.get("items"); + builder = appendArrayItems(builder, schema, fieldId, subArrayItems, seperator); + break; + default: + builder = appendArrayField(builder, schema, fieldId, itemType, seperator); + } + } catch (Exception e) { + LOGGER.warn("No item type resolvable for {}", fieldId); + } + } + checkNotNull(builder); + return builder; + } + + private StringBuilder appendArrayField(StringBuilder builder, Schema schema, String fieldId, FieldType fieldType, Character seperator) { + // safe to append nothing + checkNotNull(builder); + checkNotNull(fieldId); + builder.append(cqlEscape(fieldId)); + builder.append(seperator); + builder.append("list<"+cqlType(fieldType)+">"); + checkNotNull(builder); + return builder; + } + + private StringBuilder appendArrayObject(StringBuilder builder, Schema schema, String fieldId, Character seperator) { + // safe to append nothing + checkNotNull(builder); + String schemaSymbol = schemaSymbol(schema); + if( !Strings.isNullOrEmpty(fieldId) && schemaSymbol != null ) { + builder.append(cqlEscape(fieldId)); + builder.append(seperator); + builder.append("list<" + schemaSymbol + ">"); + builder.append(LS); + } + checkNotNull(builder); + return builder; + } + + private StringBuilder appendSchemaField(StringBuilder builder, Schema schema, String fieldId, Character seperator) { + // safe to append nothing + checkNotNull(builder); + String schemaSymbol = schemaSymbol(schema); + if( !Strings.isNullOrEmpty(fieldId) && schemaSymbol != null ) { + builder.append(cqlEscape(fieldId)); + builder.append(seperator); + builder.append(schemaSymbol); + } + checkNotNull(builder); + return builder; + } + + /* + can this be moved to streams-schemas if schemastore available in scope? + maybe an interface? + lot of boilerplate / reuse between plugins + however treatment is way different when resolving a type symbol vs resolving and listing fields . + */ + private StringBuilder appendPropertiesNode(StringBuilder builder, Schema schema, ObjectNode propertiesNode, Character seperator) { + checkNotNull(builder); + checkNotNull(propertiesNode); + Iterator<Map.Entry<String, JsonNode>> fields = propertiesNode.fields(); + Joiner joiner = Joiner.on(","+LS).skipNulls(); + List<String> fieldStrings = Lists.newArrayList(); + for( ; fields.hasNext(); ) { + Map.Entry<String, JsonNode> field = fields.next(); + String fieldId = field.getKey(); + if( !config.getExclusions().contains(fieldId) && field.getValue().isObject()) { + ObjectNode fieldNode = (ObjectNode) field.getValue(); + FieldType fieldType = FieldUtil.determineFieldType(fieldNode); + if (fieldType != null ) { + switch (fieldType) { + case ARRAY: + ObjectNode itemsNode = (ObjectNode) fieldNode.get("items"); + if( currentDepth <= config.getMaxDepth()) { + StringBuilder arrayItemsBuilder = appendArrayItems(new StringBuilder(), schema, fieldId, itemsNode, seperator); + if( !Strings.isNullOrEmpty(arrayItemsBuilder.toString())) { + fieldStrings.add(arrayItemsBuilder.toString()); + } + } + break; + case OBJECT: + Schema objectSchema = null; + URI parentURI = null; + if( fieldNode.has("$ref") || fieldNode.has("extends") ) { + JsonNode refNode = fieldNode.get("$ref"); + JsonNode extendsNode = fieldNode.get("extends"); + if (refNode != null && refNode.isValueNode()) + parentURI = URI.create(refNode.asText()); + else if (extendsNode != null && extendsNode.isObject()) + parentURI = URI.create(extendsNode.get("$ref").asText()); + URI absoluteURI; + if (parentURI.isAbsolute()) + absoluteURI = parentURI; + else { + absoluteURI = schema.getURI().resolve(parentURI); + if (!absoluteURI.isAbsolute() || (absoluteURI.isAbsolute() && !schemaStore.getByUri(absoluteURI).isPresent() )) + absoluteURI = schema.getParentURI().resolve(parentURI); + } + if (absoluteURI != null && absoluteURI.isAbsolute()) { + Optional<Schema> schemaLookup = schemaStore.getByUri(absoluteURI); + if (schemaLookup.isPresent()) { + objectSchema = schemaLookup.get(); + } + } + } + //ObjectNode childProperties = schemaStore.resolveProperties(schema, fieldNode, fieldId); + if( currentDepth < config.getMaxDepth()) { + StringBuilder structFieldBuilder = appendSchemaField(new StringBuilder(), objectSchema, fieldId, seperator); + if( !Strings.isNullOrEmpty(structFieldBuilder.toString())) { + fieldStrings.add(structFieldBuilder.toString()); + } + } + break; + default: + StringBuilder valueFieldBuilder = appendValueField(new StringBuilder(), schema, fieldId, fieldType, seperator); + if( !Strings.isNullOrEmpty(valueFieldBuilder.toString())) { + fieldStrings.add(valueFieldBuilder.toString()); + } + } + } + } + } + builder.append(joiner.join(fieldStrings)).append(LS); + Preconditions.checkNotNull(builder); + return builder; + } + + private static String cqlEscape( String fieldId ) { + return "`"+fieldId+"`"; + } + + private static String cqlType( FieldType fieldType ) { + switch( fieldType ) { + case STRING: + return "text"; + case INTEGER: + return "int"; + case NUMBER: + return "double"; + case OBJECT: + return "tuple"; + case ARRAY: + return "list"; + default: + return fieldType.name().toUpperCase(); + } + } + + private String schemaSymbol( Schema schema ) { + if (schema == null) return null; + // this needs to return whatever + if (schema.getURI().getScheme().equals("file")) { + String inputFile = schema.getURI().getPath(); + String resourcePath = dropSourcePathPrefix(inputFile, config.getSourceDirectory()); + for (String sourcePath : config.getSourcePaths()) { + resourcePath = dropSourcePathPrefix(resourcePath, sourcePath); + } + return dropExtension(resourcePath).replace("/", "_"); + } else { + return "IDK"; + } + } +} http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/1bc84dbc/streams-plugins/streams-plugin-cassandra/src/main/java/org/apache/streams/plugins/cassandra/StreamsCassandraResourceGeneratorMojo.java ---------------------------------------------------------------------- diff --git a/streams-plugins/streams-plugin-cassandra/src/main/java/org/apache/streams/plugins/cassandra/StreamsCassandraResourceGeneratorMojo.java b/streams-plugins/streams-plugin-cassandra/src/main/java/org/apache/streams/plugins/cassandra/StreamsCassandraResourceGeneratorMojo.java new file mode 100644 index 0000000..2e9a37f --- /dev/null +++ b/streams-plugins/streams-plugin-cassandra/src/main/java/org/apache/streams/plugins/cassandra/StreamsCassandraResourceGeneratorMojo.java @@ -0,0 +1,93 @@ +package org.apache.streams.plugins.cassandra; + +import org.apache.maven.plugin.AbstractMojo; +import org.apache.maven.plugin.MojoExecutionException; +import org.apache.maven.plugin.MojoFailureException; +import org.apache.maven.plugins.annotations.Component; +import org.apache.maven.plugins.annotations.Execute; +import org.apache.maven.plugins.annotations.LifecyclePhase; +import org.apache.maven.plugins.annotations.Mojo; +import org.apache.maven.plugins.annotations.Parameter; +import org.apache.maven.project.MavenProject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.util.List; + +@Mojo( name = "cassandra", + defaultPhase = LifecyclePhase.GENERATE_RESOURCES +) +@Execute( goal = "cassandra", + phase = LifecyclePhase.GENERATE_RESOURCES +) +public class StreamsCassandraResourceGeneratorMojo extends AbstractMojo { + + private final static Logger LOGGER = LoggerFactory.getLogger(StreamsCassandraResourceGeneratorMojo.class); + + private volatile MojoFailureException mojoFailureException; + + @Component + private MavenProject project; + +// @Component +// private Settings settings; +// +// @Parameter( defaultValue = "${localRepository}", readonly = true, required = true ) +// protected ArtifactRepository localRepository; +// +// @Parameter( defaultValue = "${plugin}", readonly = true ) // Maven 3 only +// private PluginDescriptor plugin; +// + @Parameter( defaultValue = "${project.basedir}", readonly = true ) + private File basedir; + + @Parameter( defaultValue = "src/main/jsonschema", readonly = true ) // Maven 3 only + public String sourceDirectory; + + @Parameter( readonly = true ) // Maven 3 only + public List<String> sourcePaths; + + @Parameter(defaultValue = "target/generated-resources/cassandra", readonly = true) + public String targetDirectory; + + public void execute() throws MojoExecutionException, MojoFailureException { + + //addProjectDependenciesToClasspath(); + + StreamsCassandraGenerationConfig config = new StreamsCassandraGenerationConfig(); + + if( sourcePaths != null && sourcePaths.size() > 0) + config.setSourcePaths(sourcePaths); + else + config.setSourceDirectory(sourceDirectory); + config.setTargetDirectory(targetDirectory); + + StreamsCassandraResourceGenerator streamsCassandraResourceGenerator = new StreamsCassandraResourceGenerator(config); + + Thread.UncaughtExceptionHandler h = new Thread.UncaughtExceptionHandler() { + public void uncaughtException(Thread th, Throwable ex) { + LOGGER.error("Exception", ex); + mojoFailureException = new MojoFailureException("Exception", ex); + } + }; + Thread.setDefaultUncaughtExceptionHandler(h); + Thread thread = new Thread(streamsCassandraResourceGenerator); + thread.setUncaughtExceptionHandler(h); + try { + thread.start(); + thread.join(); + } catch (InterruptedException e) { + LOGGER.error("InterruptedException", e); + } catch (Exception e) { + LOGGER.error("Exception", e); + mojoFailureException = new MojoFailureException("Exception", e); + } + + if( mojoFailureException != null ) + throw mojoFailureException; + + return; + } + +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/1bc84dbc/streams-plugins/streams-plugin-cassandra/src/site/markdown/index.md ---------------------------------------------------------------------- diff --git a/streams-plugins/streams-plugin-cassandra/src/site/markdown/index.md b/streams-plugins/streams-plugin-cassandra/src/site/markdown/index.md new file mode 100644 index 0000000..d0c2129 --- /dev/null +++ b/streams-plugins/streams-plugin-cassandra/src/site/markdown/index.md @@ -0,0 +1,22 @@ +org.apache.streams.plugins:streams-plugin-cassandra +=================================================== + +streams-plugin-cassandra generates resources from json schemas to assist with indexing of json data using Apache Cassandra. + +#### Usage + +Run within a module containing a src/main/jsonschema directory + + mvn org.apache.streams.plugins:streams-plugin-cassandra:0.3-incubating-SNAPSHOT:cassandra + +Output will be placed in target/generated-resources/cassandra by default + +#### Example + +[streams-plugin-cassandra/pom.xml](streams-plugin-cassandra/pom.xml "streams-plugin-cassandra/pom.xml") + +#### Documentation + +[JavaDocs](apidocs/index.html "JavaDocs") + +###### Licensed under Apache License 2.0 - http://www.apache.org/licenses/LICENSE-2.0 \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/1bc84dbc/streams-plugins/streams-plugin-cassandra/src/test/java/org/apache/streams/plugins/cassandra/test/StreamsCassandraResourceGeneratorCLITest.java ---------------------------------------------------------------------- diff --git a/streams-plugins/streams-plugin-cassandra/src/test/java/org/apache/streams/plugins/cassandra/test/StreamsCassandraResourceGeneratorCLITest.java b/streams-plugins/streams-plugin-cassandra/src/test/java/org/apache/streams/plugins/cassandra/test/StreamsCassandraResourceGeneratorCLITest.java new file mode 100644 index 0000000..465a326 --- /dev/null +++ b/streams-plugins/streams-plugin-cassandra/src/test/java/org/apache/streams/plugins/cassandra/test/StreamsCassandraResourceGeneratorCLITest.java @@ -0,0 +1,50 @@ +package org.apache.streams.plugins.cassandra.test; + +import com.google.common.collect.Lists; +import com.google.common.io.Files; +import org.apache.commons.lang3.StringUtils; +import org.apache.streams.plugins.cassandra.StreamsCassandraResourceGenerator; +import org.junit.Test; + +import java.io.File; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Collection; +import java.util.List; + +import static org.apache.streams.plugins.cassandra.test.StreamsCassandraResourceGeneratorTest.cqlFilter; + +/** + * Created by sblackmon on 5/5/16. + */ +public class StreamsCassandraResourceGeneratorCLITest { + + @Test + public void testStreamsHiveResourceGeneratorCLI() throws Exception { + + String sourceDirectory = "target/test-classes/streams-schemas"; + String targetDirectory = "target/generated-resources/cassandra-cli"; + + List<String> argsList = Lists.newArrayList(sourceDirectory, targetDirectory); + StreamsCassandraResourceGenerator.main(argsList.toArray(new String[0])); + + File testOutput = new File( targetDirectory ); + + assert( testOutput != null ); + assert( testOutput.exists() == true ); + assert( testOutput.isDirectory() == true ); + + Iterable<File> outputIterator = Files.fileTreeTraverser().breadthFirstTraversal(testOutput) + .filter(cqlFilter); + Collection<File> outputCollection = Lists.newArrayList(outputIterator); + assert( outputCollection.size() == 1 ); + + Path path = Paths.get("types.cql"); + + String typesCqlBytes = new String( + java.nio.file.Files.readAllBytes(path)); + + assert( StringUtils.countMatches(typesCqlBytes, "CREATE TYPE") == 133 ); + + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/1bc84dbc/streams-plugins/streams-plugin-cassandra/src/test/java/org/apache/streams/plugins/cassandra/test/StreamsCassandraResourceGeneratorMojoTest.java ---------------------------------------------------------------------- diff --git a/streams-plugins/streams-plugin-cassandra/src/test/java/org/apache/streams/plugins/cassandra/test/StreamsCassandraResourceGeneratorMojoTest.java b/streams-plugins/streams-plugin-cassandra/src/test/java/org/apache/streams/plugins/cassandra/test/StreamsCassandraResourceGeneratorMojoTest.java new file mode 100644 index 0000000..aad069f --- /dev/null +++ b/streams-plugins/streams-plugin-cassandra/src/test/java/org/apache/streams/plugins/cassandra/test/StreamsCassandraResourceGeneratorMojoTest.java @@ -0,0 +1,75 @@ +package org.apache.streams.plugins.cassandra.test; + +import com.google.common.collect.Lists; +import com.google.common.io.Files; +import junit.framework.TestCase; +import org.apache.commons.lang3.StringUtils; +import org.apache.maven.it.Verifier; +import org.apache.maven.it.util.ResourceExtractor; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import static org.apache.streams.plugins.cassandra.test.StreamsCassandraResourceGeneratorTest.cqlFilter; + +/** + * Tests that streams-plugin-hive running via maven generates hql resources + */ +public class StreamsCassandraResourceGeneratorMojoTest extends TestCase { + + private final static Logger LOGGER = LoggerFactory.getLogger(StreamsCassandraResourceGeneratorMojoTest.class); + + protected void setUp() throws Exception + { + // required for mojo lookups to work + super.setUp(); + } + + @Test + public void testStreamsCassandraResourceGeneratorMojo() throws Exception { + + File testDir = ResourceExtractor.simpleExtractResources( getClass(), "/streams-plugin-cassandra" ); + + Verifier verifier; + + verifier = new Verifier( testDir.getAbsolutePath() ); + + List cliOptions = new ArrayList(); + cliOptions.add( "-N" ); + verifier.executeGoals( Lists.<String>newArrayList( + "clean", + "dependency:unpack-dependencies", + "generate-resources")); + + verifier.verifyErrorFreeLog(); + + verifier.resetStreams(); + + File testOutput = new File( "./target/generated-resources/test-mojo"); + + assert( testOutput != null ); + assert( testOutput.exists() == true ); + assert( testOutput.isDirectory() == true ); + + Iterable<File> outputIterator = Files.fileTreeTraverser().breadthFirstTraversal(testOutput) + .filter(cqlFilter); + Collection<File> outputCollection = Lists.newArrayList(outputIterator); + assert( outputCollection.size() == 1 ); + + Path path = Paths.get("./target/generated-sources/test/types.cql"); + + String typesCqlBytes = new String( + java.nio.file.Files.readAllBytes(path)); + + assert( StringUtils.countMatches(typesCqlBytes, "CREATE TYPE") == 133 ); + + assert( !typesCqlBytes.contains("IDK")); + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/1bc84dbc/streams-plugins/streams-plugin-cassandra/src/test/java/org/apache/streams/plugins/cassandra/test/StreamsCassandraResourceGeneratorTest.java ---------------------------------------------------------------------- diff --git a/streams-plugins/streams-plugin-cassandra/src/test/java/org/apache/streams/plugins/cassandra/test/StreamsCassandraResourceGeneratorTest.java b/streams-plugins/streams-plugin-cassandra/src/test/java/org/apache/streams/plugins/cassandra/test/StreamsCassandraResourceGeneratorTest.java new file mode 100644 index 0000000..d46eaa6 --- /dev/null +++ b/streams-plugins/streams-plugin-cassandra/src/test/java/org/apache/streams/plugins/cassandra/test/StreamsCassandraResourceGeneratorTest.java @@ -0,0 +1,124 @@ +package org.apache.streams.plugins.cassandra.test; + +import com.google.common.base.Charsets; +import com.google.common.base.Predicate; +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; +import com.google.common.io.Files; +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.streams.plugins.cassandra.StreamsCassandraGenerationConfig; +import org.apache.streams.plugins.cassandra.StreamsCassandraResourceGenerator; +import org.junit.Assert; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.annotation.Nullable; +import java.io.File; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +import static org.apache.streams.schema.FileUtil.dropSourcePathPrefix; + +/** + * Test that cassandra resources are generated. + */ +public class StreamsCassandraResourceGeneratorTest { + + private final static Logger LOGGER = LoggerFactory.getLogger(StreamsCassandraResourceGeneratorTest.class); + + public static final Predicate<File> cqlFilter = new Predicate<File>() { + @Override + public boolean apply(@Nullable File file) { + if( file.getName().endsWith(".cql") ) + return true; + else return false; + } + }; + + /** + * Test that cassandra resources are generated + * + * @throws Exception + */ + @Test + public void StreamsCassandraResourceGenerator() throws Exception { + + StreamsCassandraGenerationConfig config = new StreamsCassandraGenerationConfig(); + + String sourceDirectory = "target/test-classes/streams-schemas"; + + config.setSourceDirectory(sourceDirectory); + + config.setTargetDirectory("target/generated-sources/test"); + + config.setExclusions(Sets.newHashSet("attachments")); + + config.setMaxDepth(2); + + StreamsCassandraResourceGenerator streamsCassandraResourceGenerator = new StreamsCassandraResourceGenerator(config); + Thread thread = new Thread(streamsCassandraResourceGenerator); + thread.start(); + try { + thread.join(); + } catch (InterruptedException e) { + LOGGER.error("InterruptedException", e); + } catch (Exception e) { + LOGGER.error("Exception", e); + } + + File testOutput = new File( "./target/generated-sources/test"); + + assert( testOutput != null ); + assert( testOutput.exists() == true ); + assert( testOutput.isDirectory() == true ); + + Iterable<File> outputIterator = Files.fileTreeTraverser().breadthFirstTraversal(testOutput) + .filter(cqlFilter); + Collection<File> outputCollection = Lists.newArrayList(outputIterator); + assert( outputCollection.size() == 1 ); + + Path path = Paths.get("./target/generated-sources/test/types.cql"); + + String typesCqlBytes = new String( + java.nio.file.Files.readAllBytes(path)); + + assert( StringUtils.countMatches(typesCqlBytes, "CREATE TYPE") == 133 ); + + assert( !typesCqlBytes.contains("IDK")); + + +// String expectedDirectory = "target/test-classes/expected"; +// File testExpected = new File( expectedDirectory ); +// +// Iterable<File> expectedIterator = Files.fileTreeTraverser().breadthFirstTraversal(testExpected) +// .filter(cqlFilter); +// Collection<File> expectedCollection = Lists.newArrayList(expectedIterator); +// +// int fails = 0; +// +// Iterator<File> iterator = expectedCollection.iterator(); +// while( iterator.hasNext() ) { +// File objectExpected = iterator.next(); +// String expectedEnd = dropSourcePathPrefix(objectExpected.getAbsolutePath(), expectedDirectory); +// File objectActual = new File(config.getTargetDirectory() + "/" + expectedEnd); +// LOGGER.info("Comparing: {} and {}", objectExpected.getAbsolutePath(), objectActual.getAbsolutePath()); +// assert( objectActual.exists()); +// if( FileUtils.contentEquals(objectActual, objectExpected) == true ) { +// LOGGER.info("Exact Match!"); +// } else { +// LOGGER.info("No Match!"); +// fails++; +// } +// } +// if( fails > 0 ) { +// LOGGER.info("Fails: {}", fails); +// Assert.fail(); +// } + + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-streams/blob/1bc84dbc/streams-plugins/streams-plugin-cassandra/src/test/resources/streams-plugin-cassandra/pom.xml ---------------------------------------------------------------------- diff --git a/streams-plugins/streams-plugin-cassandra/src/test/resources/streams-plugin-cassandra/pom.xml b/streams-plugins/streams-plugin-cassandra/src/test/resources/streams-plugin-cassandra/pom.xml new file mode 100644 index 0000000..064ea52 --- /dev/null +++ b/streams-plugins/streams-plugin-cassandra/src/test/resources/streams-plugin-cassandra/pom.xml @@ -0,0 +1,75 @@ +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <groupId>org.apache.streams.plugins</groupId> + <artifactId>streams-plugin-cassandra-test</artifactId> + <version>0.3-incubating-SNAPSHOT</version> + <packaging>jar</packaging> + <name>Test StreamsCassandraResourceGeneratorMojo</name> + + <dependencies> + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <version>4.11</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.apache.streams</groupId> + <artifactId>streams-schemas</artifactId> + <version>${project.version}</version> + <scope>test</scope> + </dependency> + </dependencies> + + <build> + <plugins> + <plugin> + <groupId>org.apache.streams.plugins</groupId> + <artifactId>streams-plugin-cassandra</artifactId> + <version>0.3-incubating-SNAPSHOT</version> + <configuration> + <sourcePaths> + <sourcePath>target/test-classes/streams-schemas/activity.json</sourcePath> + <sourcePath>target/test-classes/streams-schemas/collection.json</sourcePath> + <sourcePath>target/test-classes/streams-schemas/media_link.json</sourcePath> + <sourcePath>target/test-classes/streams-schemas/object.json</sourcePath> + <sourcePath>target/test-classes/streams-schemas/objectTypes</sourcePath> + <sourcePath>target/test-classes/streams-schemas/verbs</sourcePath> + </sourcePaths> + <targetDirectory>target/generated-resources/test-mojo</targetDirectory> + </configuration> + <executions> + <execution> + <goals> + <goal>cassandra</goal> + </goals> + </execution> + </executions> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-dependency-plugin</artifactId> + <version>2.10</version> + <configuration> + <includes>**/*.json</includes> + <outputDirectory>${project.build.directory}/test-classes/streams-schemas</outputDirectory> + <includeGroupIds>org.apache.streams</includeGroupIds> + <includeArtifactIds>streams-schemas</includeArtifactIds> + <includeTypes>jar,test-jar</includeTypes> + </configuration> + <executions> + <execution> + <id>unpack-schemas</id> + <phase>process-resources</phase> + <goals> + <goal>unpack-dependencies</goal> + </goals> + </execution> + </executions> + </plugin> + </plugins> + </build> +</project> \ No newline at end of file