From 4c16055ea5bdabd5bd34e98d45694acbea8bb229 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Sat, 23 Apr 2016 12:00:10 +0200 Subject: [PATCH] Added Stream integration --- .../accurest-messaging-stream/build.gradle | 3 +- .../messaging/stream/StreamMessage.java | 6 +- .../stub-runner-messaging-stream/build.gradle | 22 ++++ .../StubRunnerStreamConfiguration.groovy | 52 ++++++++ .../StubRunnerStreamMessageSelector.groovy | 63 ++++++++++ .../stream/StubRunnerStreamTransformer.groovy | 29 +++++ .../main/resources/META-INF/spring.factories | 3 + .../messaging/stream/BookReturned.groovy | 16 +++ .../stream/StreamStubRunnerSpec.groovy | 111 ++++++++++++++++++ .../src/test/resources/application.yml | 2 + .../0.0.1-SNAPSHOT/maven-metadata-local.xml | 12 ++ .../streamService-0.0.1-SNAPSHOT-stubs.jar | Bin 0 -> 1746 bytes .../streamService-0.0.1-SNAPSHOT.pom | 9 ++ .../streamService/maven-metadata-local.xml | 12 ++ 14 files changed, 338 insertions(+), 2 deletions(-) create mode 100644 stub-runner/stub-runner-messaging/stub-runner-messaging-stream/build.gradle create mode 100644 stub-runner/stub-runner-messaging/stub-runner-messaging-stream/src/main/groovy/io/codearte/accurest/stubrunner/messaging/stream/StubRunnerStreamConfiguration.groovy create mode 100644 stub-runner/stub-runner-messaging/stub-runner-messaging-stream/src/main/groovy/io/codearte/accurest/stubrunner/messaging/stream/StubRunnerStreamMessageSelector.groovy create mode 100644 stub-runner/stub-runner-messaging/stub-runner-messaging-stream/src/main/groovy/io/codearte/accurest/stubrunner/messaging/stream/StubRunnerStreamTransformer.groovy create mode 100644 stub-runner/stub-runner-messaging/stub-runner-messaging-stream/src/main/resources/META-INF/spring.factories create mode 100644 stub-runner/stub-runner-messaging/stub-runner-messaging-stream/src/test/groovy/io/codearte/accurest/stubrunner/messaging/stream/BookReturned.groovy create mode 100644 stub-runner/stub-runner-messaging/stub-runner-messaging-stream/src/test/groovy/io/codearte/accurest/stubrunner/messaging/stream/StreamStubRunnerSpec.groovy create mode 100644 stub-runner/stub-runner-messaging/stub-runner-messaging-stream/src/test/resources/application.yml create mode 100644 stub-runner/stub-runner-messaging/stub-runner-messaging-stream/src/test/resources/m2repo/repository/io/codearte/accurest/stubs/streamService/0.0.1-SNAPSHOT/maven-metadata-local.xml create mode 100644 stub-runner/stub-runner-messaging/stub-runner-messaging-stream/src/test/resources/m2repo/repository/io/codearte/accurest/stubs/streamService/0.0.1-SNAPSHOT/streamService-0.0.1-SNAPSHOT-stubs.jar create mode 100644 stub-runner/stub-runner-messaging/stub-runner-messaging-stream/src/test/resources/m2repo/repository/io/codearte/accurest/stubs/streamService/0.0.1-SNAPSHOT/streamService-0.0.1-SNAPSHOT.pom create mode 100644 stub-runner/stub-runner-messaging/stub-runner-messaging-stream/src/test/resources/m2repo/repository/io/codearte/accurest/stubs/streamService/maven-metadata-local.xml diff --git a/accurest-messaging/accurest-messaging-stream/build.gradle b/accurest-messaging/accurest-messaging-stream/build.gradle index 4b045bb943..7cf3543d4f 100644 --- a/accurest-messaging/accurest-messaging-stream/build.gradle +++ b/accurest-messaging/accurest-messaging-stream/build.gradle @@ -11,6 +11,7 @@ repositories { dependencies { compile project(':accurest-messaging-root:accurest-messaging-core') - compile 'org.springframework:spring-messaging:[4.0.0.RELEASE,)' + compile 'org.springframework.cloud:spring-cloud-stream:[1.0.0.RC2,)' + // for MessageCollector compile 'org.springframework.cloud:spring-cloud-stream-test-support:[1.0.0.RC2,)' } \ No newline at end of file diff --git a/accurest-messaging/accurest-messaging-stream/src/main/java/io/codearte/accurest/messaging/stream/StreamMessage.java b/accurest-messaging/accurest-messaging-stream/src/main/java/io/codearte/accurest/messaging/stream/StreamMessage.java index 7b7faeb68a..8bc2a9ecb0 100644 --- a/accurest-messaging/accurest-messaging-stream/src/main/java/io/codearte/accurest/messaging/stream/StreamMessage.java +++ b/accurest-messaging/accurest-messaging-stream/src/main/java/io/codearte/accurest/messaging/stream/StreamMessage.java @@ -1,9 +1,10 @@ package io.codearte.accurest.messaging.stream; -import io.codearte.accurest.messaging.AccurestMessage; import org.springframework.messaging.Message; import org.springframework.messaging.MessageHeaders; +import io.codearte.accurest.messaging.AccurestMessage; + /** * @author Marcin Grzejszczak */ @@ -12,6 +13,9 @@ public class StreamMessage implements AccurestMessage> { private final Message delegate; public StreamMessage(Message delegate) { + if (delegate == null) { + throw new IllegalArgumentException("Message can't be null"); + } this.delegate = delegate; } diff --git a/stub-runner/stub-runner-messaging/stub-runner-messaging-stream/build.gradle b/stub-runner/stub-runner-messaging/stub-runner-messaging-stream/build.gradle new file mode 100644 index 0000000000..20d6bac9f4 --- /dev/null +++ b/stub-runner/stub-runner-messaging/stub-runner-messaging-stream/build.gradle @@ -0,0 +1,22 @@ +repositories { + mavenLocal() + jcenter() + maven { + url "http://repo.spring.io/snapshot" + } + maven { + url "http://repo.spring.io/milestone" + } +} + +dependencies { + compile project(':stub-runner-root:stub-runner-spring') + compile project(':accurest-messaging-root:accurest-messaging-stream') + compile 'org.springframework.integration:spring-integration-java-dsl:[1.1.2.RELEASE,)' + + testCompile 'org.springframework.cloud:spring-cloud-stream-test-support:1.0.0.RC2' + testCompile 'org.springframework.boot:spring-boot-starter-test:1.3.3.RELEASE' + testCompile('org.spockframework:spock-spring:1.0-groovy-2.4') { + exclude(group: 'org.codehaus.groovy') + } +} \ No newline at end of file diff --git a/stub-runner/stub-runner-messaging/stub-runner-messaging-stream/src/main/groovy/io/codearte/accurest/stubrunner/messaging/stream/StubRunnerStreamConfiguration.groovy b/stub-runner/stub-runner-messaging/stub-runner-messaging-stream/src/main/groovy/io/codearte/accurest/stubrunner/messaging/stream/StubRunnerStreamConfiguration.groovy new file mode 100644 index 0000000000..7520883395 --- /dev/null +++ b/stub-runner/stub-runner-messaging/stub-runner-messaging-stream/src/main/groovy/io/codearte/accurest/stubrunner/messaging/stream/StubRunnerStreamConfiguration.groovy @@ -0,0 +1,52 @@ +package io.codearte.accurest.stubrunner.messaging.stream + +import io.codearte.accurest.dsl.GroovyDsl +import io.codearte.accurest.stubrunner.BatchStubRunner +import io.codearte.accurest.stubrunner.StubConfiguration +import org.springframework.beans.factory.config.AutowireCapableBeanFactory +import org.springframework.cloud.stream.annotation.EnableBinding +import org.springframework.cloud.stream.binding.ChannelBindingService +import org.springframework.context.Lifecycle +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration +import org.springframework.integration.dsl.FilterEndpointSpec +import org.springframework.integration.dsl.GenericEndpointSpec +import org.springframework.integration.dsl.IntegrationFlow +import org.springframework.integration.dsl.IntegrationFlows +import org.springframework.messaging.MessageChannel +import org.springframework.stereotype.Service +/** + * Spring Cloud Stream configuration that iterates over the downloaded Groovy DSLs + * and registers a flow for each DSL. + * + * @author Marcin Grzejszczak + */ +@Configuration +@EnableBinding +class StubRunnerStreamConfiguration { + + @Bean + FlowRegistrar service(AutowireCapableBeanFactory beanFactory, BatchStubRunner batchStubRunner, ChannelBindingService channelBindingService) { + Map> accurestContracts = batchStubRunner.accurestContracts + accurestContracts.each { StubConfiguration key, Collection value -> + String name = "${key.groupId}_${key.artifactId}" + value.findAll { it?.input?.messageFrom && it?.outputMessage?.sentTo }.each { GroovyDsl dsl -> + String flowName = "${name}_${dsl.label}_${dsl.hashCode()}" + IntegrationFlow integrationFlow = IntegrationFlows.from(dsl.input.messageFrom) + .filter(new StubRunnerStreamMessageSelector(dsl), { FilterEndpointSpec e -> e.id("${flowName}.filter") } ) + .transform(new StubRunnerStreamTransformer(dsl), { GenericEndpointSpec e -> e.id("${flowName}.transformer") }) + .channel(dsl.outputMessage.sentTo) + .get() + beanFactory.initializeBean(integrationFlow, flowName) + beanFactory.getBean("${flowName}.filter", Lifecycle.class).start(); + beanFactory.getBean("${flowName}.transformer", Lifecycle.class).start(); + channelBindingService.bindConsumer(beanFactory.getBean(dsl.input.messageFrom, MessageChannel.class), dsl.input.messageFrom) + channelBindingService.bindProducer(beanFactory.getBean(dsl.outputMessage.sentTo, MessageChannel.class), dsl.outputMessage.sentTo) + } + } + return new FlowRegistrar() + } + + @Service + static class FlowRegistrar {} +} diff --git a/stub-runner/stub-runner-messaging/stub-runner-messaging-stream/src/main/groovy/io/codearte/accurest/stubrunner/messaging/stream/StubRunnerStreamMessageSelector.groovy b/stub-runner/stub-runner-messaging/stub-runner-messaging-stream/src/main/groovy/io/codearte/accurest/stubrunner/messaging/stream/StubRunnerStreamMessageSelector.groovy new file mode 100644 index 0000000000..37e60c85b7 --- /dev/null +++ b/stub-runner/stub-runner-messaging/stub-runner-messaging-stream/src/main/groovy/io/codearte/accurest/stubrunner/messaging/stream/StubRunnerStreamMessageSelector.groovy @@ -0,0 +1,63 @@ +package io.codearte.accurest.stubrunner.messaging.stream + +import com.fasterxml.jackson.databind.ObjectMapper +import com.jayway.jsonpath.DocumentContext +import com.jayway.jsonpath.JsonPath +import com.toomuchcoding.jsonassert.JsonAssertion +import com.toomuchcoding.jsonassert.JsonVerifiable +import groovy.transform.CompileStatic +import io.codearte.accurest.dsl.GroovyDsl +import io.codearte.accurest.util.JsonPaths +import io.codearte.accurest.util.JsonToJsonPathsConverter +import org.springframework.integration.core.MessageSelector +import org.springframework.messaging.Message + +import java.util.regex.Pattern + +/** + * Passes through a message that matches the one defined in the DSL + * + * @author Marcin Grzejszczak + */ +@CompileStatic +class StubRunnerStreamMessageSelector implements MessageSelector { + + private final GroovyDsl groovyDsl + private final ObjectMapper objectMapper = new ObjectMapper() + + StubRunnerStreamMessageSelector(GroovyDsl groovyDsl) { + this.groovyDsl = groovyDsl + } + + @Override + boolean accept(Message message) { + if(!headersMatch(message)){ + return false + } + Object inputMessage = message.getPayload() + JsonPaths jsonPaths = JsonToJsonPathsConverter.transformToJsonPathWithStubsSideValues(groovyDsl.input.messageBody) + DocumentContext parsedJson = JsonPath.parse(objectMapper.writeValueAsString(inputMessage)) + return jsonPaths.every { matchesJsonPath(parsedJson, it) } + } + + private boolean matchesJsonPath(DocumentContext parsedJson, JsonVerifiable jsonVerifiable) { + try { + JsonAssertion.assertThat(parsedJson).matchesJsonPath(jsonVerifiable.jsonPath()) + return true + } catch (Exception e) { + return false + } + } + + private boolean headersMatch(Message message) { + Map headers = message.getHeaders() + return groovyDsl.input.messageHeaders.entries.every { + String name = it.name + Object value = it.clientValue + Object valueInHeader = headers.get(name) + return value instanceof Pattern ? + value.matcher(valueInHeader.toString()).matches() : + valueInHeader == value + } + } +} diff --git a/stub-runner/stub-runner-messaging/stub-runner-messaging-stream/src/main/groovy/io/codearte/accurest/stubrunner/messaging/stream/StubRunnerStreamTransformer.groovy b/stub-runner/stub-runner-messaging/stub-runner-messaging-stream/src/main/groovy/io/codearte/accurest/stubrunner/messaging/stream/StubRunnerStreamTransformer.groovy new file mode 100644 index 0000000000..3129f70ace --- /dev/null +++ b/stub-runner/stub-runner-messaging/stub-runner-messaging-stream/src/main/groovy/io/codearte/accurest/stubrunner/messaging/stream/StubRunnerStreamTransformer.groovy @@ -0,0 +1,29 @@ +package io.codearte.accurest.stubrunner.messaging.stream + +import io.codearte.accurest.builder.BodyAsString +import io.codearte.accurest.dsl.GroovyDsl +import org.springframework.integration.transformer.GenericTransformer +import org.springframework.messaging.Message +import org.springframework.messaging.MessageHeaders +import org.springframework.messaging.support.MessageBuilder + +/** + * Sends forward a message defined in the DSL. + * + * @author Marcin Grzejszczak + */ +class StubRunnerStreamTransformer implements GenericTransformer, Message> { + + private final GroovyDsl groovyDsl + + StubRunnerStreamTransformer(GroovyDsl groovyDsl) { + this.groovyDsl = groovyDsl + } + + @Override + Message transform(Message source) { + String payload = BodyAsString.extractClientValueFrom(groovyDsl.outputMessage.body) + Map headers = groovyDsl.outputMessage.headers.asStubSideMap() + return MessageBuilder.createMessage(payload, new MessageHeaders(headers)) + } +} diff --git a/stub-runner/stub-runner-messaging/stub-runner-messaging-stream/src/main/resources/META-INF/spring.factories b/stub-runner/stub-runner-messaging/stub-runner-messaging-stream/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000000..7b69d1b85a --- /dev/null +++ b/stub-runner/stub-runner-messaging/stub-runner-messaging-stream/src/main/resources/META-INF/spring.factories @@ -0,0 +1,3 @@ +# Auto Configuration +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ +io.codearte.accurest.stubrunner.messaging.stream.StubRunnerStreamConfiguration diff --git a/stub-runner/stub-runner-messaging/stub-runner-messaging-stream/src/test/groovy/io/codearte/accurest/stubrunner/messaging/stream/BookReturned.groovy b/stub-runner/stub-runner-messaging/stub-runner-messaging-stream/src/test/groovy/io/codearte/accurest/stubrunner/messaging/stream/BookReturned.groovy new file mode 100644 index 0000000000..0dd3ca4216 --- /dev/null +++ b/stub-runner/stub-runner-messaging/stub-runner-messaging-stream/src/test/groovy/io/codearte/accurest/stubrunner/messaging/stream/BookReturned.groovy @@ -0,0 +1,16 @@ +package io.codearte.accurest.stubrunner.messaging.stream + +import com.fasterxml.jackson.annotation.JsonCreator +import groovy.transform.CompileStatic +import groovy.transform.EqualsAndHashCode + +@CompileStatic +@EqualsAndHashCode +class BookReturned implements Serializable { + final String bookName + + @JsonCreator(mode = JsonCreator.Mode.PROPERTIES) + BookReturned(String bookName) { + this.bookName = bookName + } +} diff --git a/stub-runner/stub-runner-messaging/stub-runner-messaging-stream/src/test/groovy/io/codearte/accurest/stubrunner/messaging/stream/StreamStubRunnerSpec.groovy b/stub-runner/stub-runner-messaging/stub-runner-messaging-stream/src/test/groovy/io/codearte/accurest/stubrunner/messaging/stream/StreamStubRunnerSpec.groovy new file mode 100644 index 0000000000..ffe676551c --- /dev/null +++ b/stub-runner/stub-runner-messaging/stub-runner-messaging-stream/src/test/groovy/io/codearte/accurest/stubrunner/messaging/stream/StreamStubRunnerSpec.groovy @@ -0,0 +1,111 @@ +package io.codearte.accurest.stubrunner.messaging.stream + +import groovy.json.JsonOutput +import groovy.json.JsonSlurper +import io.codearte.accurest.messaging.AccurestMessage +import io.codearte.accurest.messaging.AccurestMessaging +import io.codearte.accurest.stubrunner.StubFinder +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.boot.autoconfigure.EnableAutoConfiguration +import org.springframework.boot.test.SpringApplicationContextLoader +import org.springframework.context.annotation.ComponentScan +import org.springframework.context.annotation.Configuration +import org.springframework.test.context.ContextConfiguration +import spock.lang.Specification + +import java.util.concurrent.TimeUnit +/** + * @author Marcin Grzejszczak + */ +@Configuration +@ComponentScan +@EnableAutoConfiguration +@ContextConfiguration(classes = StreamStubRunnerSpec, loader = SpringApplicationContextLoader) +class StreamStubRunnerSpec extends Specification { + + @Autowired StubFinder stubFinder + @Autowired AccurestMessaging messaging + + def 'should download the stub and register a route for it'() { + when: + messaging.send(new BookReturned('foo'), [sample: 'header'], 'input') + then: + AccurestMessage receivedMessage = messaging.receiveMessage('output') + and: + receivedMessage != null + assertJsons(receivedMessage.payload) + receivedMessage.headers.get('BOOK-NAME') == 'foo' + } + + def 'should trigger a message by label'() { + when: + stubFinder.trigger('return_book_1') + then: + AccurestMessage receivedMessage = messaging.receiveMessage('output') + and: + receivedMessage != null + assertJsons(receivedMessage.payload) + receivedMessage.headers.get('BOOK-NAME') == 'foo' + } + + def 'should trigger a label for the existing groupId:artifactId'() { + when: + stubFinder.trigger('io.codearte.accurest.stubs:streamService', 'return_book_1') + then: + AccurestMessage receivedMessage = messaging.receiveMessage('output') + and: + receivedMessage != null + assertJsons(receivedMessage.payload) + receivedMessage.headers.get('BOOK-NAME') == 'foo' + } + + def 'should trigger a label for the existing artifactId'() { + when: + stubFinder.trigger('streamService', 'return_book_1') + then: + AccurestMessage receivedMessage = messaging.receiveMessage('output') + and: + receivedMessage != null + assertJsons(receivedMessage.payload) + receivedMessage.headers.get('BOOK-NAME') == 'foo' + } + + def 'should not run any wrong trigger when missing label is passed'() { + given: + stubFinder.trigger('missing label') + when: + messaging.receiveMessage('output', 100, TimeUnit.MILLISECONDS) + then: + RuntimeException e = thrown(RuntimeException) + e.cause.message.contains("Message can't be null") + } + + def 'should not run any wrong trigger when missing label and artifactid is passed'() { + given: + stubFinder.trigger('some:service', 'return_book_1') + when: + messaging.receiveMessage('output', 100, TimeUnit.MILLISECONDS) + then: + RuntimeException e = thrown(RuntimeException) + e.cause.message.contains("Message can't be null") + } + + def 'should trigger messages by running all triggers'() { + when: + stubFinder.trigger() + then: + AccurestMessage receivedMessage = messaging.receiveMessage('output') + and: + receivedMessage != null + assertJsons(receivedMessage.payload) + receivedMessage.headers.get('BOOK-NAME') == 'foo' + } + + private boolean assertJsons(Object payload) { + String objectAsString = payload instanceof String ? payload : + JsonOutput.toJson(payload) + def json = new JsonSlurper().parseText(objectAsString) + return json.bookName == 'foo' + } + +} diff --git a/stub-runner/stub-runner-messaging/stub-runner-messaging-stream/src/test/resources/application.yml b/stub-runner/stub-runner-messaging/stub-runner-messaging-stream/src/test/resources/application.yml new file mode 100644 index 0000000000..154bfe1b6a --- /dev/null +++ b/stub-runner/stub-runner-messaging/stub-runner-messaging-stream/src/test/resources/application.yml @@ -0,0 +1,2 @@ +stubrunner.stubs.repository.root: classpath:m2repo/repository/ +stubrunner.stubs.ids: io.codearte.accurest.stubs:streamService \ No newline at end of file diff --git a/stub-runner/stub-runner-messaging/stub-runner-messaging-stream/src/test/resources/m2repo/repository/io/codearte/accurest/stubs/streamService/0.0.1-SNAPSHOT/maven-metadata-local.xml b/stub-runner/stub-runner-messaging/stub-runner-messaging-stream/src/test/resources/m2repo/repository/io/codearte/accurest/stubs/streamService/0.0.1-SNAPSHOT/maven-metadata-local.xml new file mode 100644 index 0000000000..bad844ba2a --- /dev/null +++ b/stub-runner/stub-runner-messaging/stub-runner-messaging-stream/src/test/resources/m2repo/repository/io/codearte/accurest/stubs/streamService/0.0.1-SNAPSHOT/maven-metadata-local.xml @@ -0,0 +1,12 @@ + + + io.codearte.accurest.stubs + streamService + 0.0.1-SNAPSHOT + + + true + + 20160409062112 + + diff --git a/stub-runner/stub-runner-messaging/stub-runner-messaging-stream/src/test/resources/m2repo/repository/io/codearte/accurest/stubs/streamService/0.0.1-SNAPSHOT/streamService-0.0.1-SNAPSHOT-stubs.jar b/stub-runner/stub-runner-messaging/stub-runner-messaging-stream/src/test/resources/m2repo/repository/io/codearte/accurest/stubs/streamService/0.0.1-SNAPSHOT/streamService-0.0.1-SNAPSHOT-stubs.jar new file mode 100644 index 0000000000000000000000000000000000000000..86c61d52ec4b9571f84240dc880daa2e9e5f5b71 GIT binary patch literal 1746 zcmWIWW@h1HVBp|j&|{wF!2kqIAOZ+Df!NnI#8KDN&rP41Apk|;rh2A#(m(~0KrDi+ z(AUw=)6F$FM9W7$;qWfsl_EwJwREYr^0ql^9WtID{d1|?MEQiV35J8Cn-Na zJ1DiJv?wn%#ZWK3C_lffGBkvffjM}xRJbn?msW5yFtWU0W?%plroF!0O%4JM=U=an z*mH(UwdCzI5m~3!4|=PuXZ|qUxSLJs-}kb$dB%Ip^P{@5gEY1tjkxx8$;BHHGwt?e zE&5(lc3HvtiT8o3$i(xGi|2lc2y=<8Y-rf}ID6AP7961ES=3gdP0N#N2%2wI|U9La*jX!q(RaC(+5Y9PgfcBZ3DHgq-FmR zWAvPN|JzN?y$AZ5FPj&CoqwGl6n~H~i2{bnd$}npyMf_h#YkM37$JvA3@|)GF~g*_ z*B=xnN6)`r{=tmx>B8jgi|PelEsbtjW3_b0>l5#!Jbv6Q4qw6NXwW{>{Qcf|*F-7kF%T)__5$Z$tq9dMOLv*$5$!1-ViU9XS-^z{K3m zw=Nygy&0l$souP^NlvURE&cwNCDBG4b_?3J&9y1I(6;to<)Y^?$Il*Yc)D6ZOlr$g zlMKTLTNR~J6n`DJXe|-toB6OW+TX9%dDE|-(ng!D+;v^5Y#R=jYUaBLD(Tf9v~6-c zKT~s;&Xkmb#jZQGo*qB>M3v8AG5>MCrb(UEOzVob2ZnO#9{t3I$lzLNB>`GS%S|jO z$jnPG24^%zCJ|=bXL*rE(CSWgY zSRsWCT0w(s8)n8uw(TX*Qf%%;whfVufwqCNF&^76a{{t$Y`~Hbmu=|z0%#W~UtqBd omUghEIB-A$)6QQ + + 4.0.0 + io.codearte.accurest.stubs + streamService + 0.0.1-SNAPSHOT + pom + diff --git a/stub-runner/stub-runner-messaging/stub-runner-messaging-stream/src/test/resources/m2repo/repository/io/codearte/accurest/stubs/streamService/maven-metadata-local.xml b/stub-runner/stub-runner-messaging/stub-runner-messaging-stream/src/test/resources/m2repo/repository/io/codearte/accurest/stubs/streamService/maven-metadata-local.xml new file mode 100644 index 0000000000..dc32790f53 --- /dev/null +++ b/stub-runner/stub-runner-messaging/stub-runner-messaging-stream/src/test/resources/m2repo/repository/io/codearte/accurest/stubs/streamService/maven-metadata-local.xml @@ -0,0 +1,12 @@ + + + io.codearte.accurest.stubs + streamService + 0.0.1-SNAPSHOT + + + 0.0.1-SNAPSHOT + + 20160409062112 + +