From 27d58fc2007fe0d8e9b0239b7a03d4bf1e80a5c8 Mon Sep 17 00:00:00 2001 From: bdragan Date: Sun, 19 Jun 2016 23:36:22 +0200 Subject: [PATCH 01/24] Code examples for the 'Binary Data Formats in a Spring REST API' article. --- spring-rest/pom.xml | 11 +- .../java/org/baeldung/config/WebConfig.java | 5 +- .../converter/KryoHttpMessageConverter.java | 73 +++ .../web/controller/FooController.java | 6 + .../java/org/baeldung/web/dto/FooProtos.java | 620 ++++++++++++++++++ ...MessageConvertersIntegrationTestsCase.java | 35 + 6 files changed, 748 insertions(+), 2 deletions(-) create mode 100644 spring-rest/src/main/java/org/baeldung/config/converter/KryoHttpMessageConverter.java create mode 100644 spring-rest/src/main/java/org/baeldung/web/dto/FooProtos.java diff --git a/spring-rest/pom.xml b/spring-rest/pom.xml index 767f90a6a6..b05a795c6d 100644 --- a/spring-rest/pom.xml +++ b/spring-rest/pom.xml @@ -155,7 +155,16 @@ spring-test ${spring.version} - + + com.google.protobuf + protobuf-java + 2.6.1 + + + com.esotericsoftware.kryo + kryo + 2.24.0 + diff --git a/spring-rest/src/main/java/org/baeldung/config/WebConfig.java b/spring-rest/src/main/java/org/baeldung/config/WebConfig.java index 999f890ebb..120f1b272a 100644 --- a/spring-rest/src/main/java/org/baeldung/config/WebConfig.java +++ b/spring-rest/src/main/java/org/baeldung/config/WebConfig.java @@ -3,11 +3,13 @@ package org.baeldung.config; import java.text.SimpleDateFormat; import java.util.List; +import org.baeldung.config.converter.KryoHttpMessageConverter; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; +import org.springframework.http.converter.protobuf.ProtobufHttpMessageConverter; import org.springframework.http.converter.xml.MarshallingHttpMessageConverter; import org.springframework.oxm.xstream.XStreamMarshaller; import org.springframework.web.servlet.config.annotation.EnableWebMvc; @@ -33,7 +35,8 @@ public class WebConfig extends WebMvcConfigurerAdapter { builder.indentOutput(true).dateFormat(new SimpleDateFormat("dd-MM-yyyy hh:mm")); messageConverters.add(new MappingJackson2HttpMessageConverter(builder.build())); // messageConverters.add(new MappingJackson2XmlHttpMessageConverter(builder.createXmlMapper(true).build())); - + messageConverters.add(new ProtobufHttpMessageConverter()); + messageConverters.add(new KryoHttpMessageConverter()); super.configureMessageConverters(messageConverters); } diff --git a/spring-rest/src/main/java/org/baeldung/config/converter/KryoHttpMessageConverter.java b/spring-rest/src/main/java/org/baeldung/config/converter/KryoHttpMessageConverter.java new file mode 100644 index 0000000000..371ad333c8 --- /dev/null +++ b/spring-rest/src/main/java/org/baeldung/config/converter/KryoHttpMessageConverter.java @@ -0,0 +1,73 @@ +/* + * Copyright 2002-2014 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.baeldung.config.converter; + +import java.io.IOException; + +import org.baeldung.web.dto.Foo; +import org.springframework.http.HttpInputMessage; +import org.springframework.http.HttpOutputMessage; +import org.springframework.http.MediaType; +import org.springframework.http.converter.AbstractHttpMessageConverter; + +import com.esotericsoftware.kryo.Kryo; +import com.esotericsoftware.kryo.io.Input; +import com.esotericsoftware.kryo.io.Output; + +/** + * An {@code HttpMessageConverter} that can read and write Kryo messages. + */ +public class KryoHttpMessageConverter extends AbstractHttpMessageConverter { + + public static final MediaType KRYO = new MediaType("application", "x-kryo"); + + private static final ThreadLocal kryoThreadLocal = new ThreadLocal() { + @Override + protected Kryo initialValue() { + final Kryo kryo = new Kryo(); + kryo.register(Foo.class, 1); + return kryo; + } + }; + + public KryoHttpMessageConverter() { + super(KRYO); + } + + @Override + protected boolean supports(final Class clazz) { + return Object.class.isAssignableFrom(clazz); + } + + @Override + protected Object readInternal(final Class clazz, final HttpInputMessage inputMessage) throws IOException { + final Input input = new Input(inputMessage.getBody()); + return kryoThreadLocal.get().readClassAndObject(input); + } + + @Override + protected void writeInternal(final Object object, final HttpOutputMessage outputMessage) throws IOException { + final Output output = new Output(outputMessage.getBody()); + kryoThreadLocal.get().writeClassAndObject(output, object); + output.flush(); + } + + @Override + protected MediaType getDefaultContentType(final Object object) { + return KRYO; + } +} diff --git a/spring-rest/src/main/java/org/baeldung/web/controller/FooController.java b/spring-rest/src/main/java/org/baeldung/web/controller/FooController.java index ed6b150403..386c64bb09 100644 --- a/spring-rest/src/main/java/org/baeldung/web/controller/FooController.java +++ b/spring-rest/src/main/java/org/baeldung/web/controller/FooController.java @@ -4,6 +4,7 @@ import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; import static org.apache.commons.lang3.RandomStringUtils.randomNumeric; import org.baeldung.web.dto.Foo; +import org.baeldung.web.dto.FooProtos; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; @@ -38,4 +39,9 @@ public class FooController { return foo; } + @RequestMapping(method = RequestMethod.GET, value = "/foos/{id}", produces = { "application/x-protobuf" }) + @ResponseBody + public FooProtos.Foo findProtoById(@PathVariable final long id) { + return FooProtos.Foo.newBuilder().setId(1).setName("Foo Name").build(); + } } diff --git a/spring-rest/src/main/java/org/baeldung/web/dto/FooProtos.java b/spring-rest/src/main/java/org/baeldung/web/dto/FooProtos.java new file mode 100644 index 0000000000..61251ea33a --- /dev/null +++ b/spring-rest/src/main/java/org/baeldung/web/dto/FooProtos.java @@ -0,0 +1,620 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: FooProtos.proto + +package org.baeldung.web.dto; + +public final class FooProtos { + private FooProtos() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + } + public interface FooOrBuilder extends + // @@protoc_insertion_point(interface_extends:baeldung.Foo) + com.google.protobuf.MessageOrBuilder { + + /** + * required int64 id = 1; + */ + boolean hasId(); + /** + * required int64 id = 1; + */ + long getId(); + + /** + * required string name = 2; + */ + boolean hasName(); + /** + * required string name = 2; + */ + java.lang.String getName(); + /** + * required string name = 2; + */ + com.google.protobuf.ByteString + getNameBytes(); + } + /** + * Protobuf type {@code baeldung.Foo} + */ + public static final class Foo extends + com.google.protobuf.GeneratedMessage implements + // @@protoc_insertion_point(message_implements:baeldung.Foo) + FooOrBuilder { + // Use Foo.newBuilder() to construct. + private Foo(com.google.protobuf.GeneratedMessage.Builder builder) { + super(builder); + this.unknownFields = builder.getUnknownFields(); + } + private Foo(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } + + private static final Foo defaultInstance; + public static Foo getDefaultInstance() { + return defaultInstance; + } + + public Foo getDefaultInstanceForType() { + return defaultInstance; + } + + private final com.google.protobuf.UnknownFieldSet unknownFields; + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + private Foo( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + initFields(); + int mutable_bitField0_ = 0; + com.google.protobuf.UnknownFieldSet.Builder unknownFields = + com.google.protobuf.UnknownFieldSet.newBuilder(); + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: { + if (!parseUnknownField(input, unknownFields, + extensionRegistry, tag)) { + done = true; + } + break; + } + case 8: { + bitField0_ |= 0x00000001; + id_ = input.readInt64(); + break; + } + case 18: { + com.google.protobuf.ByteString bs = input.readBytes(); + bitField0_ |= 0x00000002; + name_ = bs; + break; + } + } + } + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(this); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException( + e.getMessage()).setUnfinishedMessage(this); + } finally { + this.unknownFields = unknownFields.build(); + makeExtensionsImmutable(); + } + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.baeldung.web.dto.FooProtos.internal_static_baeldung_Foo_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.baeldung.web.dto.FooProtos.internal_static_baeldung_Foo_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.baeldung.web.dto.FooProtos.Foo.class, org.baeldung.web.dto.FooProtos.Foo.Builder.class); + } + + public static com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + public Foo parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return new Foo(input, extensionRegistry); + } + }; + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + private int bitField0_; + public static final int ID_FIELD_NUMBER = 1; + private long id_; + /** + * required int64 id = 1; + */ + public boolean hasId() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * required int64 id = 1; + */ + public long getId() { + return id_; + } + + public static final int NAME_FIELD_NUMBER = 2; + private java.lang.Object name_; + /** + * required string name = 2; + */ + public boolean hasName() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * required string name = 2; + */ + public java.lang.String getName() { + java.lang.Object ref = name_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + name_ = s; + } + return s; + } + } + /** + * required string name = 2; + */ + public com.google.protobuf.ByteString + getNameBytes() { + java.lang.Object ref = name_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private void initFields() { + id_ = 0L; + name_ = ""; + } + private byte memoizedIsInitialized = -1; + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + if (!hasId()) { + memoizedIsInitialized = 0; + return false; + } + if (!hasName()) { + memoizedIsInitialized = 0; + return false; + } + memoizedIsInitialized = 1; + return true; + } + + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeInt64(1, id_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeBytes(2, getNameBytes()); + } + getUnknownFields().writeTo(output); + } + + private int memoizedSerializedSize = -1; + public int getSerializedSize() { + int size = memoizedSerializedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeInt64Size(1, id_); + } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(2, getNameBytes()); + } + size += getUnknownFields().getSerializedSize(); + memoizedSerializedSize = size; + return size; + } + + private static final long serialVersionUID = 0L; + @java.lang.Override + protected java.lang.Object writeReplace() + throws java.io.ObjectStreamException { + return super.writeReplace(); + } + + public static org.baeldung.web.dto.FooProtos.Foo parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.baeldung.web.dto.FooProtos.Foo parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.baeldung.web.dto.FooProtos.Foo parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static org.baeldung.web.dto.FooProtos.Foo parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static org.baeldung.web.dto.FooProtos.Foo parseFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.baeldung.web.dto.FooProtos.Foo parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + public static org.baeldung.web.dto.FooProtos.Foo parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input); + } + public static org.baeldung.web.dto.FooProtos.Foo parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseDelimitedFrom(input, extensionRegistry); + } + public static org.baeldung.web.dto.FooProtos.Foo parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return PARSER.parseFrom(input); + } + public static org.baeldung.web.dto.FooProtos.Foo parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return PARSER.parseFrom(input, extensionRegistry); + } + + public static Builder newBuilder() { return Builder.create(); } + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder(org.baeldung.web.dto.FooProtos.Foo prototype) { + return newBuilder().mergeFrom(prototype); + } + public Builder toBuilder() { return newBuilder(this); } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code baeldung.Foo} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessage.Builder implements + // @@protoc_insertion_point(builder_implements:baeldung.Foo) + org.baeldung.web.dto.FooProtos.FooOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return org.baeldung.web.dto.FooProtos.internal_static_baeldung_Foo_descriptor; + } + + protected com.google.protobuf.GeneratedMessage.FieldAccessorTable + internalGetFieldAccessorTable() { + return org.baeldung.web.dto.FooProtos.internal_static_baeldung_Foo_fieldAccessorTable + .ensureFieldAccessorsInitialized( + org.baeldung.web.dto.FooProtos.Foo.class, org.baeldung.web.dto.FooProtos.Foo.Builder.class); + } + + // Construct using org.baeldung.web.dto.FooProtos.Foo.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder( + com.google.protobuf.GeneratedMessage.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { + } + } + private static Builder create() { + return new Builder(); + } + + public Builder clear() { + super.clear(); + id_ = 0L; + bitField0_ = (bitField0_ & ~0x00000001); + name_ = ""; + bitField0_ = (bitField0_ & ~0x00000002); + return this; + } + + public Builder clone() { + return create().mergeFrom(buildPartial()); + } + + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return org.baeldung.web.dto.FooProtos.internal_static_baeldung_Foo_descriptor; + } + + public org.baeldung.web.dto.FooProtos.Foo getDefaultInstanceForType() { + return org.baeldung.web.dto.FooProtos.Foo.getDefaultInstance(); + } + + public org.baeldung.web.dto.FooProtos.Foo build() { + org.baeldung.web.dto.FooProtos.Foo result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + public org.baeldung.web.dto.FooProtos.Foo buildPartial() { + org.baeldung.web.dto.FooProtos.Foo result = new org.baeldung.web.dto.FooProtos.Foo(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.id_ = id_; + if (((from_bitField0_ & 0x00000002) == 0x00000002)) { + to_bitField0_ |= 0x00000002; + } + result.name_ = name_; + result.bitField0_ = to_bitField0_; + onBuilt(); + return result; + } + + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof org.baeldung.web.dto.FooProtos.Foo) { + return mergeFrom((org.baeldung.web.dto.FooProtos.Foo)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(org.baeldung.web.dto.FooProtos.Foo other) { + if (other == org.baeldung.web.dto.FooProtos.Foo.getDefaultInstance()) return this; + if (other.hasId()) { + setId(other.getId()); + } + if (other.hasName()) { + bitField0_ |= 0x00000002; + name_ = other.name_; + onChanged(); + } + this.mergeUnknownFields(other.getUnknownFields()); + return this; + } + + public final boolean isInitialized() { + if (!hasId()) { + + return false; + } + if (!hasName()) { + + return false; + } + return true; + } + + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + org.baeldung.web.dto.FooProtos.Foo parsedMessage = null; + try { + parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + parsedMessage = (org.baeldung.web.dto.FooProtos.Foo) e.getUnfinishedMessage(); + throw e; + } finally { + if (parsedMessage != null) { + mergeFrom(parsedMessage); + } + } + return this; + } + private int bitField0_; + + private long id_ ; + /** + * required int64 id = 1; + */ + public boolean hasId() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * required int64 id = 1; + */ + public long getId() { + return id_; + } + /** + * required int64 id = 1; + */ + public Builder setId(long value) { + bitField0_ |= 0x00000001; + id_ = value; + onChanged(); + return this; + } + /** + * required int64 id = 1; + */ + public Builder clearId() { + bitField0_ = (bitField0_ & ~0x00000001); + id_ = 0L; + onChanged(); + return this; + } + + private java.lang.Object name_ = ""; + /** + * required string name = 2; + */ + public boolean hasName() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * required string name = 2; + */ + public java.lang.String getName() { + java.lang.Object ref = name_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + if (bs.isValidUtf8()) { + name_ = s; + } + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * required string name = 2; + */ + public com.google.protobuf.ByteString + getNameBytes() { + java.lang.Object ref = name_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * required string name = 2; + */ + public Builder setName( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + name_ = value; + onChanged(); + return this; + } + /** + * required string name = 2; + */ + public Builder clearName() { + bitField0_ = (bitField0_ & ~0x00000002); + name_ = getDefaultInstance().getName(); + onChanged(); + return this; + } + /** + * required string name = 2; + */ + public Builder setNameBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000002; + name_ = value; + onChanged(); + return this; + } + + // @@protoc_insertion_point(builder_scope:baeldung.Foo) + } + + static { + defaultInstance = new Foo(true); + defaultInstance.initFields(); + } + + // @@protoc_insertion_point(class_scope:baeldung.Foo) + } + + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_baeldung_Foo_descriptor; + private static + com.google.protobuf.GeneratedMessage.FieldAccessorTable + internal_static_baeldung_Foo_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\017FooProtos.proto\022\010baeldung\"\037\n\003Foo\022\n\n\002id" + + "\030\001 \002(\003\022\014\n\004name\030\002 \002(\tB!\n\024org.baeldung.web" + + ".dtoB\tFooProtos" + }; + com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = + new com.google.protobuf.Descriptors.FileDescriptor. InternalDescriptorAssigner() { + public com.google.protobuf.ExtensionRegistry assignDescriptors( + com.google.protobuf.Descriptors.FileDescriptor root) { + descriptor = root; + return null; + } + }; + com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + }, assigner); + internal_static_baeldung_Foo_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_baeldung_Foo_fieldAccessorTable = new + com.google.protobuf.GeneratedMessage.FieldAccessorTable( + internal_static_baeldung_Foo_descriptor, + new java.lang.String[] { "Id", "Name", }); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/spring-rest/src/test/java/org/baeldung/web/test/SpringHttpMessageConvertersIntegrationTestsCase.java b/spring-rest/src/test/java/org/baeldung/web/test/SpringHttpMessageConvertersIntegrationTestsCase.java index c21641ca22..1536f14bc8 100644 --- a/spring-rest/src/test/java/org/baeldung/web/test/SpringHttpMessageConvertersIntegrationTestsCase.java +++ b/spring-rest/src/test/java/org/baeldung/web/test/SpringHttpMessageConvertersIntegrationTestsCase.java @@ -7,7 +7,9 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import org.baeldung.config.converter.KryoHttpMessageConverter; import org.baeldung.web.dto.Foo; +import org.baeldung.web.dto.FooProtos; import org.junit.Assert; import org.junit.Test; import org.springframework.http.HttpEntity; @@ -17,6 +19,7 @@ import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; +import org.springframework.http.converter.protobuf.ProtobufHttpMessageConverter; import org.springframework.http.converter.xml.MarshallingHttpMessageConverter; import org.springframework.oxm.xstream.XStreamMarshaller; import org.springframework.web.client.RestTemplate; @@ -94,6 +97,38 @@ public class SpringHttpMessageConvertersIntegrationTestsCase { Assert.assertEquals(resource.getId(), fooResponse.getId()); } + @Test + public void givenConsumingProtobuf_whenReadingTheFoo_thenCorrect() { + final String URI = BASE_URI + "foos/{id}"; + + final RestTemplate restTemplate = new RestTemplate(); + restTemplate.setMessageConverters(Arrays.asList(new ProtobufHttpMessageConverter())); + final HttpHeaders headers = new HttpHeaders(); + headers.setAccept(Arrays.asList(ProtobufHttpMessageConverter.PROTOBUF)); + final HttpEntity entity = new HttpEntity(headers); + + final ResponseEntity response = restTemplate.exchange(URI, HttpMethod.GET, entity, FooProtos.Foo.class, "1"); + final FooProtos.Foo resource = response.getBody(); + + assertThat(resource, notNullValue()); + } + + @Test + public void givenConsumingKryo_whenReadingTheFoo_thenCorrect() { + final String URI = BASE_URI + "foos/{id}"; + + final RestTemplate restTemplate = new RestTemplate(); + restTemplate.setMessageConverters(Arrays.asList(new KryoHttpMessageConverter())); + final HttpHeaders headers = new HttpHeaders(); + headers.setAccept(Arrays.asList(KryoHttpMessageConverter.KRYO)); + final HttpEntity entity = new HttpEntity(headers); + + final ResponseEntity response = restTemplate.exchange(URI, HttpMethod.GET, entity, Foo.class, "1"); + final Foo resource = response.getBody(); + + assertThat(resource, notNullValue()); + } + // UTIL private List> getMessageConverters() { From 57411aa1c297b90aa20b51d36411a7310529d93a Mon Sep 17 00:00:00 2001 From: bdragan Date: Sun, 19 Jun 2016 23:43:13 +0200 Subject: [PATCH 02/24] Removed copy-pasted comments. --- .../converter/KryoHttpMessageConverter.java | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/spring-rest/src/main/java/org/baeldung/config/converter/KryoHttpMessageConverter.java b/spring-rest/src/main/java/org/baeldung/config/converter/KryoHttpMessageConverter.java index 371ad333c8..7e63a3ba9e 100644 --- a/spring-rest/src/main/java/org/baeldung/config/converter/KryoHttpMessageConverter.java +++ b/spring-rest/src/main/java/org/baeldung/config/converter/KryoHttpMessageConverter.java @@ -1,19 +1,3 @@ -/* - * Copyright 2002-2014 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - package org.baeldung.config.converter; import java.io.IOException; From c786e113b0966141e3b34a0abc4f7d48a5bfc5b8 Mon Sep 17 00:00:00 2001 From: Zeger Hendrikse Date: Fri, 1 Jul 2016 02:07:08 +0200 Subject: [PATCH 03/24] Modified indentation --- spring-rest/pom.xml | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/spring-rest/pom.xml b/spring-rest/pom.xml index 00631d816c..09a50b9579 100644 --- a/spring-rest/pom.xml +++ b/spring-rest/pom.xml @@ -145,16 +145,18 @@ org.springframework spring-test - - com.google.protobuf - protobuf-java - 2.6.1 - - - com.esotericsoftware.kryo - kryo - 2.24.0 - + + + com.google.protobuf + protobuf-java + 2.6.1 + + + + com.esotericsoftware.kryo + kryo + 2.24.0 + @@ -263,4 +265,4 @@ - \ No newline at end of file + From 25cb16d4738e77c5ae36278bee19dd832a9bc686 Mon Sep 17 00:00:00 2001 From: Alex Theedom Date: Fri, 1 Jul 2016 18:24:17 +0100 Subject: [PATCH 04/24] Remove XML configuration. Remove gradle build file. Update Java Version in POM. Remove diagrams. --- dependency-injection/build.gradle | 43 ------------------ .../inject-qualifier-demo-classdiagram.png | Bin 43724 -> 0 bytes .../inject-qualifier-demo-classdiagram.xml | 1 - dependency-injection/pom.xml | 8 ++-- ...applicationContextTest-@Autowired-Name.xml | 12 ----- ...cationContextTest-@Autowired-Qualifier.xml | 12 ----- ...applicationContextTest-@Autowired-Type.xml | 10 ---- .../applicationContextTest-@Inject-Name.xml | 11 ----- ...plicationContextTest-@Inject-Qualifier.xml | 12 ----- .../applicationContextTest-@Inject-Type.xml | 10 ---- ...licationContextTest-@Resource-NameType.xml | 12 ----- ...icationContextTest-@Resource-Qualifier.xml | 16 ------- 12 files changed, 4 insertions(+), 143 deletions(-) delete mode 100644 dependency-injection/build.gradle delete mode 100644 dependency-injection/docs/inject-qualifier-demo-classdiagram.png delete mode 100644 dependency-injection/docs/inject-qualifier-demo-classdiagram.xml delete mode 100644 dependency-injection/src/test/resources/applicationContextTest-@Autowired-Name.xml delete mode 100644 dependency-injection/src/test/resources/applicationContextTest-@Autowired-Qualifier.xml delete mode 100644 dependency-injection/src/test/resources/applicationContextTest-@Autowired-Type.xml delete mode 100644 dependency-injection/src/test/resources/applicationContextTest-@Inject-Name.xml delete mode 100644 dependency-injection/src/test/resources/applicationContextTest-@Inject-Qualifier.xml delete mode 100644 dependency-injection/src/test/resources/applicationContextTest-@Inject-Type.xml delete mode 100644 dependency-injection/src/test/resources/applicationContextTest-@Resource-NameType.xml delete mode 100644 dependency-injection/src/test/resources/applicationContextTest-@Resource-Qualifier.xml diff --git a/dependency-injection/build.gradle b/dependency-injection/build.gradle deleted file mode 100644 index 968636154d..0000000000 --- a/dependency-injection/build.gradle +++ /dev/null @@ -1,43 +0,0 @@ -apply plugin: 'java' -apply plugin: 'eclipse' - -allprojects { - apply plugin: 'java' - sourceCompatibility = 1.6 - targetCompatibility = 1.6 -} - -repositories { - mavenCentral() -} - -sourceSets { - main { - resources.srcDirs = ["src/main/java","src/main/resources"] - } - test { - resources.srcDirs = ["src/main/java", "src/main/resources", "src/test/resources"] - } -} - -configurations { - compile -} - -test { - testLogging { - events 'started', 'passed' - } -} - -dependencies { - testCompile('junit:junit:4.11') - testCompile('org.mockito:mockito-all:1.10.19') - testCompile group: 'org.springframework', name: 'spring-test', version: '4.2.6.RELEASE' - testCompile group: 'org.springframework', name: 'spring-core', version: '4.2.6.RELEASE' - testCompile group: 'org.springframework', name: 'spring-beans', version: '4.2.6.RELEASE' - testCompile group: 'org.springframework', name: 'spring-context', version: '4.2.6.RELEASE' - testCompile group: 'javax.inject', name: 'javax.inject', version: '1' - - testRuntime('junit:junit:4.11') -} diff --git a/dependency-injection/docs/inject-qualifier-demo-classdiagram.png b/dependency-injection/docs/inject-qualifier-demo-classdiagram.png deleted file mode 100644 index 7366999ec163aaf6f0d2e817c62daea57f6ac5c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43724 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 \ No newline at end of file diff --git a/dependency-injection/pom.xml b/dependency-injection/pom.xml index f87d061a53..8fdc22999f 100644 --- a/dependency-injection/pom.xml +++ b/dependency-injection/pom.xml @@ -9,8 +9,8 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xs 0.0.1-SNAPSHOT war - @Resource vs @Inject vs @Autowired - Accompanying the demonstration of the use of the annotations related to injection mechanisms, namely @Resource, @Inject, and @Autowired + Resource vs Inject vs Autowired + Accompanying the demonstration of the use of the annotations related to injection mechanisms, namely Resource, Inject, and Autowired @@ -56,8 +56,8 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xs maven-compiler-plugin - 1.6 - 1.6 + 1.8 + 1.8 diff --git a/dependency-injection/src/test/resources/applicationContextTest-@Autowired-Name.xml b/dependency-injection/src/test/resources/applicationContextTest-@Autowired-Name.xml deleted file mode 100644 index d7fe3abcb3..0000000000 --- a/dependency-injection/src/test/resources/applicationContextTest-@Autowired-Name.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - diff --git a/dependency-injection/src/test/resources/applicationContextTest-@Autowired-Qualifier.xml b/dependency-injection/src/test/resources/applicationContextTest-@Autowired-Qualifier.xml deleted file mode 100644 index d7fe3abcb3..0000000000 --- a/dependency-injection/src/test/resources/applicationContextTest-@Autowired-Qualifier.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - diff --git a/dependency-injection/src/test/resources/applicationContextTest-@Autowired-Type.xml b/dependency-injection/src/test/resources/applicationContextTest-@Autowired-Type.xml deleted file mode 100644 index c65b85ccf4..0000000000 --- a/dependency-injection/src/test/resources/applicationContextTest-@Autowired-Type.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - diff --git a/dependency-injection/src/test/resources/applicationContextTest-@Inject-Name.xml b/dependency-injection/src/test/resources/applicationContextTest-@Inject-Name.xml deleted file mode 100644 index 610e8687a7..0000000000 --- a/dependency-injection/src/test/resources/applicationContextTest-@Inject-Name.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - diff --git a/dependency-injection/src/test/resources/applicationContextTest-@Inject-Qualifier.xml b/dependency-injection/src/test/resources/applicationContextTest-@Inject-Qualifier.xml deleted file mode 100644 index 627ec37914..0000000000 --- a/dependency-injection/src/test/resources/applicationContextTest-@Inject-Qualifier.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - diff --git a/dependency-injection/src/test/resources/applicationContextTest-@Inject-Type.xml b/dependency-injection/src/test/resources/applicationContextTest-@Inject-Type.xml deleted file mode 100644 index 405164e603..0000000000 --- a/dependency-injection/src/test/resources/applicationContextTest-@Inject-Type.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - diff --git a/dependency-injection/src/test/resources/applicationContextTest-@Resource-NameType.xml b/dependency-injection/src/test/resources/applicationContextTest-@Resource-NameType.xml deleted file mode 100644 index 82cbe97157..0000000000 --- a/dependency-injection/src/test/resources/applicationContextTest-@Resource-NameType.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - diff --git a/dependency-injection/src/test/resources/applicationContextTest-@Resource-Qualifier.xml b/dependency-injection/src/test/resources/applicationContextTest-@Resource-Qualifier.xml deleted file mode 100644 index 1680a6f66a..0000000000 --- a/dependency-injection/src/test/resources/applicationContextTest-@Resource-Qualifier.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - From da0cd158e789deb2ac1c15a798f6dc5f0d323839 Mon Sep 17 00:00:00 2001 From: Alex Theedom Date: Fri, 1 Jul 2016 18:48:43 +0100 Subject: [PATCH 05/24] Reformat code style --- dependency-injection/pom.xml | 150 +++++++++--------- .../autowired/FieldAutowiredNameTest.java | 20 ++- .../autowired/FieldAutowiredTest.java | 13 +- .../FieldQualifierAutowiredTest.java | 20 ++- .../ApplicationContextTestAutowiredName.java | 2 +- ...licationContextTestAutowiredQualifier.java | 25 ++- .../ApplicationContextTestAutowiredType.java | 3 +- .../ApplicationContextTestInjectName.java | 5 +- ...ApplicationContextTestInjectQualifier.java | 25 ++- .../ApplicationContextTestInjectType.java | 13 +- ...pplicationContextTestResourceNameType.java | 6 +- ...plicationContextTestResourceQualifier.java | 8 +- .../dependency/ArbitraryDependency.java | 2 +- .../inject/FieldByNameInjectTest.java | 22 ++- .../com/baeldung/inject/FieldInjectTest.java | 21 ++- .../inject/FieldQualifierInjectTest.java | 27 ++-- .../resource/FieldResourceInjectionTest.java | 21 ++- .../MethodByQualifierResourceTest.java | 56 ++++--- .../resource/MethodByTypeResourceTest.java | 20 ++- .../resource/MethodResourceInjectionTest.java | 22 ++- .../baeldung/resource/NamedResourceTest.java | 19 ++- .../QualifierResourceInjectionTest.java | 23 ++- .../resource/SetterResourceInjectionTest.java | 18 +-- 23 files changed, 258 insertions(+), 283 deletions(-) diff --git a/dependency-injection/pom.xml b/dependency-injection/pom.xml index 8fdc22999f..667ea87402 100644 --- a/dependency-injection/pom.xml +++ b/dependency-injection/pom.xml @@ -1,81 +1,83 @@ - + - 4.0.0 + 4.0.0 - com.baeldung - dependency-injection - 0.0.1-SNAPSHOT - war + com.baeldung + dependency-injection + 0.0.1-SNAPSHOT + war - Resource vs Inject vs Autowired - Accompanying the demonstration of the use of the annotations related to injection mechanisms, namely Resource, Inject, and Autowired + Resource vs Inject vs Autowired + Accompanying the demonstration of the use of the annotations related to injection mechanisms, namely + Resource, Inject, and Autowired + - - - junit - junit - 4.11 - test - - - org.mockito - mockito-all - 1.10.19 - - - org.springframework - spring-test - 4.2.6.RELEASE - - - org.springframework - spring-core - 4.2.6.RELEASE - - - org.springframework - spring-beans - 4.2.6.RELEASE - - - org.springframework - spring-context - 4.2.6.RELEASE - - - javax.inject - javax.inject - 1 - - + + + junit + junit + 4.11 + test + + + org.mockito + mockito-all + 1.10.19 + + + org.springframework + spring-test + 4.2.6.RELEASE + + + org.springframework + spring-core + 4.2.6.RELEASE + + + org.springframework + spring-beans + 4.2.6.RELEASE + + + org.springframework + spring-context + 4.2.6.RELEASE + + + javax.inject + javax.inject + 1 + + - - - - maven-compiler-plugin - - 1.8 - 1.8 - - - - org.apache.maven.plugins - maven-surefire-plugin - - - **/*Test.java - - - - - + + + + maven-compiler-plugin + + 1.8 + 1.8 + + + + org.apache.maven.plugins + maven-surefire-plugin + + + **/*Test.java + + + + + - - - java.net - https://maven.java.net/content/repositories/releases/ - - + + + java.net + https://maven.java.net/content/repositories/releases/ + + diff --git a/dependency-injection/src/test/java/com/baeldung/autowired/FieldAutowiredNameTest.java b/dependency-injection/src/test/java/com/baeldung/autowired/FieldAutowiredNameTest.java index 0455ca500c..cbdac68543 100644 --- a/dependency-injection/src/test/java/com/baeldung/autowired/FieldAutowiredNameTest.java +++ b/dependency-injection/src/test/java/com/baeldung/autowired/FieldAutowiredNameTest.java @@ -1,8 +1,7 @@ package com.baeldung.autowired; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - +import com.baeldung.configuration.ApplicationContextTestAutowiredName; +import com.baeldung.dependency.ArbitraryDependency; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -10,22 +9,21 @@ import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.support.AnnotationConfigContextLoader; -import com.baeldung.configuration.ApplicationContextTestAutowiredName; -import com.baeldung.dependency.ArbitraryDependency; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration( - loader=AnnotationConfigContextLoader.class, - classes=ApplicationContextTestAutowiredName.class) + loader = AnnotationConfigContextLoader.class, + classes = ApplicationContextTestAutowiredName.class) public class FieldAutowiredNameTest { @Autowired private ArbitraryDependency autowiredFieldDependency; @Test - public void givenAutowiredAnnotation_WhenOnField_ThenDependencyValid(){ + public void givenAutowiredAnnotation_WhenOnField_ThenDependencyValid() { assertNotNull(autowiredFieldDependency); - assertEquals("Arbitrary Dependency", - autowiredFieldDependency.toString()); - } + assertEquals("Arbitrary Dependency", autowiredFieldDependency.toString()); + } } diff --git a/dependency-injection/src/test/java/com/baeldung/autowired/FieldAutowiredTest.java b/dependency-injection/src/test/java/com/baeldung/autowired/FieldAutowiredTest.java index 811daebaf6..b736871f85 100644 --- a/dependency-injection/src/test/java/com/baeldung/autowired/FieldAutowiredTest.java +++ b/dependency-injection/src/test/java/com/baeldung/autowired/FieldAutowiredTest.java @@ -1,8 +1,7 @@ package com.baeldung.autowired; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - +import com.baeldung.configuration.ApplicationContextTestAutowiredType; +import com.baeldung.dependency.ArbitraryDependency; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -10,13 +9,13 @@ import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.support.AnnotationConfigContextLoader; -import com.baeldung.configuration.ApplicationContextTestAutowiredType; -import com.baeldung.dependency.ArbitraryDependency; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration( - loader=AnnotationConfigContextLoader.class, - classes=ApplicationContextTestAutowiredType.class) + loader = AnnotationConfigContextLoader.class, + classes = ApplicationContextTestAutowiredType.class) public class FieldAutowiredTest { @Autowired diff --git a/dependency-injection/src/test/java/com/baeldung/autowired/FieldQualifierAutowiredTest.java b/dependency-injection/src/test/java/com/baeldung/autowired/FieldQualifierAutowiredTest.java index d72d38e9a8..cbc3d56f67 100644 --- a/dependency-injection/src/test/java/com/baeldung/autowired/FieldQualifierAutowiredTest.java +++ b/dependency-injection/src/test/java/com/baeldung/autowired/FieldQualifierAutowiredTest.java @@ -1,8 +1,7 @@ package com.baeldung.autowired; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - +import com.baeldung.configuration.ApplicationContextTestAutowiredQualifier; +import com.baeldung.dependency.ArbitraryDependency; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -11,13 +10,13 @@ import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.support.AnnotationConfigContextLoader; -import com.baeldung.configuration.ApplicationContextTestAutowiredQualifier; -import com.baeldung.dependency.ArbitraryDependency; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration( - loader=AnnotationConfigContextLoader.class, - classes=ApplicationContextTestAutowiredQualifier.class) + loader = AnnotationConfigContextLoader.class, + classes = ApplicationContextTestAutowiredQualifier.class) public class FieldQualifierAutowiredTest { @Autowired @@ -29,15 +28,14 @@ public class FieldQualifierAutowiredTest { private ArbitraryDependency fieldDependency2; @Test - public void givenAutowiredQualifier_WhenOnField_ThenDep1Valid(){ + public void givenAutowiredQualifier_WhenOnField_ThenDep1Valid() { assertNotNull(fieldDependency1); assertEquals("Arbitrary Dependency", fieldDependency1.toString()); } @Test - public void givenAutowiredQualifier_WhenOnField_ThenDep2Valid(){ + public void givenAutowiredQualifier_WhenOnField_ThenDep2Valid() { assertNotNull(fieldDependency2); - assertEquals("Another Arbitrary Dependency", - fieldDependency2.toString()); + assertEquals("Another Arbitrary Dependency", fieldDependency2.toString()); } } diff --git a/dependency-injection/src/test/java/com/baeldung/configuration/ApplicationContextTestAutowiredName.java b/dependency-injection/src/test/java/com/baeldung/configuration/ApplicationContextTestAutowiredName.java index 41dfdb09e2..48c4495465 100644 --- a/dependency-injection/src/test/java/com/baeldung/configuration/ApplicationContextTestAutowiredName.java +++ b/dependency-injection/src/test/java/com/baeldung/configuration/ApplicationContextTestAutowiredName.java @@ -4,6 +4,6 @@ import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @Configuration -@ComponentScan(basePackages={"com.baeldung.dependency"}) +@ComponentScan(basePackages = {"com.baeldung.dependency"}) public class ApplicationContextTestAutowiredName { } diff --git a/dependency-injection/src/test/java/com/baeldung/configuration/ApplicationContextTestAutowiredQualifier.java b/dependency-injection/src/test/java/com/baeldung/configuration/ApplicationContextTestAutowiredQualifier.java index 138fbc46c5..ef6690ab4b 100644 --- a/dependency-injection/src/test/java/com/baeldung/configuration/ApplicationContextTestAutowiredQualifier.java +++ b/dependency-injection/src/test/java/com/baeldung/configuration/ApplicationContextTestAutowiredQualifier.java @@ -1,25 +1,24 @@ package com.baeldung.configuration; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - import com.baeldung.dependency.AnotherArbitraryDependency; import com.baeldung.dependency.ArbitraryDependency; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; @Configuration public class ApplicationContextTestAutowiredQualifier { - @Bean - public ArbitraryDependency autowiredFieldDependency() { - ArbitraryDependency autowiredFieldDependency = new ArbitraryDependency(); + @Bean + public ArbitraryDependency autowiredFieldDependency() { + ArbitraryDependency autowiredFieldDependency = new ArbitraryDependency(); - return autowiredFieldDependency; - } + return autowiredFieldDependency; + } - @Bean - public ArbitraryDependency anotherAutowiredFieldDependency() { - ArbitraryDependency anotherAutowiredFieldDependency = new AnotherArbitraryDependency(); + @Bean + public ArbitraryDependency anotherAutowiredFieldDependency() { + ArbitraryDependency anotherAutowiredFieldDependency = new AnotherArbitraryDependency(); - return anotherAutowiredFieldDependency; - } + return anotherAutowiredFieldDependency; + } } diff --git a/dependency-injection/src/test/java/com/baeldung/configuration/ApplicationContextTestAutowiredType.java b/dependency-injection/src/test/java/com/baeldung/configuration/ApplicationContextTestAutowiredType.java index 703a8214b9..240bc466b7 100644 --- a/dependency-injection/src/test/java/com/baeldung/configuration/ApplicationContextTestAutowiredType.java +++ b/dependency-injection/src/test/java/com/baeldung/configuration/ApplicationContextTestAutowiredType.java @@ -1,10 +1,9 @@ package com.baeldung.configuration; +import com.baeldung.dependency.ArbitraryDependency; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import com.baeldung.dependency.ArbitraryDependency; - @Configuration public class ApplicationContextTestAutowiredType { diff --git a/dependency-injection/src/test/java/com/baeldung/configuration/ApplicationContextTestInjectName.java b/dependency-injection/src/test/java/com/baeldung/configuration/ApplicationContextTestInjectName.java index 7fe8306a39..851aa0b8ee 100644 --- a/dependency-injection/src/test/java/com/baeldung/configuration/ApplicationContextTestInjectName.java +++ b/dependency-injection/src/test/java/com/baeldung/configuration/ApplicationContextTestInjectName.java @@ -1,10 +1,9 @@ package com.baeldung.configuration; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - import com.baeldung.dependency.ArbitraryDependency; import com.baeldung.dependency.YetAnotherArbitraryDependency; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; @Configuration public class ApplicationContextTestInjectName { diff --git a/dependency-injection/src/test/java/com/baeldung/configuration/ApplicationContextTestInjectQualifier.java b/dependency-injection/src/test/java/com/baeldung/configuration/ApplicationContextTestInjectQualifier.java index 557ba78aca..59af5a91bb 100644 --- a/dependency-injection/src/test/java/com/baeldung/configuration/ApplicationContextTestInjectQualifier.java +++ b/dependency-injection/src/test/java/com/baeldung/configuration/ApplicationContextTestInjectQualifier.java @@ -1,23 +1,22 @@ package com.baeldung.configuration; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - import com.baeldung.dependency.AnotherArbitraryDependency; import com.baeldung.dependency.ArbitraryDependency; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; @Configuration public class ApplicationContextTestInjectQualifier { - @Bean - public ArbitraryDependency defaultFile() { - ArbitraryDependency defaultFile = new ArbitraryDependency(); - return defaultFile; - } + @Bean + public ArbitraryDependency defaultFile() { + ArbitraryDependency defaultFile = new ArbitraryDependency(); + return defaultFile; + } - @Bean - public ArbitraryDependency namedFile() { - ArbitraryDependency namedFile = new AnotherArbitraryDependency(); - return namedFile; - } + @Bean + public ArbitraryDependency namedFile() { + ArbitraryDependency namedFile = new AnotherArbitraryDependency(); + return namedFile; + } } diff --git a/dependency-injection/src/test/java/com/baeldung/configuration/ApplicationContextTestInjectType.java b/dependency-injection/src/test/java/com/baeldung/configuration/ApplicationContextTestInjectType.java index f84fa8f3a2..1e1f01f269 100644 --- a/dependency-injection/src/test/java/com/baeldung/configuration/ApplicationContextTestInjectType.java +++ b/dependency-injection/src/test/java/com/baeldung/configuration/ApplicationContextTestInjectType.java @@ -1,16 +1,15 @@ package com.baeldung.configuration; +import com.baeldung.dependency.ArbitraryDependency; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import com.baeldung.dependency.ArbitraryDependency; - @Configuration public class ApplicationContextTestInjectType { - @Bean - public ArbitraryDependency injectDependency() { - ArbitraryDependency injectDependency = new ArbitraryDependency(); - return injectDependency; - } + @Bean + public ArbitraryDependency injectDependency() { + ArbitraryDependency injectDependency = new ArbitraryDependency(); + return injectDependency; + } } diff --git a/dependency-injection/src/test/java/com/baeldung/configuration/ApplicationContextTestResourceNameType.java b/dependency-injection/src/test/java/com/baeldung/configuration/ApplicationContextTestResourceNameType.java index f53002feca..cb1b5981e8 100644 --- a/dependency-injection/src/test/java/com/baeldung/configuration/ApplicationContextTestResourceNameType.java +++ b/dependency-injection/src/test/java/com/baeldung/configuration/ApplicationContextTestResourceNameType.java @@ -1,14 +1,14 @@ package com.baeldung.configuration; -import java.io.File; - import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import java.io.File; + @Configuration public class ApplicationContextTestResourceNameType { - @Bean(name="namedFile") + @Bean(name = "namedFile") public File namedFile() { File namedFile = new File("namedFile.txt"); return namedFile; diff --git a/dependency-injection/src/test/java/com/baeldung/configuration/ApplicationContextTestResourceQualifier.java b/dependency-injection/src/test/java/com/baeldung/configuration/ApplicationContextTestResourceQualifier.java index 18f5af4282..c9aa2f4a7d 100644 --- a/dependency-injection/src/test/java/com/baeldung/configuration/ApplicationContextTestResourceQualifier.java +++ b/dependency-injection/src/test/java/com/baeldung/configuration/ApplicationContextTestResourceQualifier.java @@ -1,20 +1,20 @@ package com.baeldung.configuration; -import java.io.File; - import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import java.io.File; + @Configuration public class ApplicationContextTestResourceQualifier { - @Bean(name="defaultFile") + @Bean(name = "defaultFile") public File defaultFile() { File defaultFile = new File("defaultFile.txt"); return defaultFile; } - @Bean(name="namedFile") + @Bean(name = "namedFile") public File namedFile() { File namedFile = new File("namedFile.txt"); return namedFile; diff --git a/dependency-injection/src/test/java/com/baeldung/dependency/ArbitraryDependency.java b/dependency-injection/src/test/java/com/baeldung/dependency/ArbitraryDependency.java index d120e8daf7..3c90492d2c 100644 --- a/dependency-injection/src/test/java/com/baeldung/dependency/ArbitraryDependency.java +++ b/dependency-injection/src/test/java/com/baeldung/dependency/ArbitraryDependency.java @@ -2,7 +2,7 @@ package com.baeldung.dependency; import org.springframework.stereotype.Component; -@Component(value="autowiredFieldDependency") +@Component(value = "autowiredFieldDependency") public class ArbitraryDependency { private final String label = "Arbitrary Dependency"; diff --git a/dependency-injection/src/test/java/com/baeldung/inject/FieldByNameInjectTest.java b/dependency-injection/src/test/java/com/baeldung/inject/FieldByNameInjectTest.java index 0f0429ea94..665c9f1ddc 100644 --- a/dependency-injection/src/test/java/com/baeldung/inject/FieldByNameInjectTest.java +++ b/dependency-injection/src/test/java/com/baeldung/inject/FieldByNameInjectTest.java @@ -1,24 +1,23 @@ package com.baeldung.inject; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -import javax.inject.Inject; -import javax.inject.Named; - +import com.baeldung.configuration.ApplicationContextTestInjectName; +import com.baeldung.dependency.ArbitraryDependency; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.support.AnnotationConfigContextLoader; -import com.baeldung.configuration.ApplicationContextTestInjectName; -import com.baeldung.dependency.ArbitraryDependency; +import javax.inject.Inject; +import javax.inject.Named; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration( - loader=AnnotationConfigContextLoader.class, - classes=ApplicationContextTestInjectName.class) + loader = AnnotationConfigContextLoader.class, + classes = ApplicationContextTestInjectName.class) public class FieldByNameInjectTest { @Inject @@ -28,7 +27,6 @@ public class FieldByNameInjectTest { @Test public void givenInjectQualifier_WhenSetOnField_ThenDependencyValid() { assertNotNull(yetAnotherFieldInjectDependency); - assertEquals("Yet Another Arbitrary Dependency", - yetAnotherFieldInjectDependency.toString()); + assertEquals("Yet Another Arbitrary Dependency", yetAnotherFieldInjectDependency.toString()); } } diff --git a/dependency-injection/src/test/java/com/baeldung/inject/FieldInjectTest.java b/dependency-injection/src/test/java/com/baeldung/inject/FieldInjectTest.java index 7cbba63113..7561c39e76 100644 --- a/dependency-injection/src/test/java/com/baeldung/inject/FieldInjectTest.java +++ b/dependency-injection/src/test/java/com/baeldung/inject/FieldInjectTest.java @@ -1,31 +1,30 @@ package com.baeldung.inject; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -import javax.inject.Inject; +import com.baeldung.configuration.ApplicationContextTestInjectType; +import com.baeldung.dependency.ArbitraryDependency; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.support.AnnotationConfigContextLoader; -import com.baeldung.configuration.ApplicationContextTestInjectType; -import com.baeldung.dependency.ArbitraryDependency; +import javax.inject.Inject; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration( - loader=AnnotationConfigContextLoader.class, - classes=ApplicationContextTestInjectType.class) + loader = AnnotationConfigContextLoader.class, + classes = ApplicationContextTestInjectType.class) public class FieldInjectTest { @Inject private ArbitraryDependency fieldInjectDependency; @Test - public void givenInjectAnnotation_WhenOnField_ThenValidDependency(){ + public void givenInjectAnnotation_WhenOnField_ThenValidDependency() { assertNotNull(fieldInjectDependency); - assertEquals("Arbitrary Dependency", - fieldInjectDependency.toString()); + assertEquals("Arbitrary Dependency", fieldInjectDependency.toString()); } } diff --git a/dependency-injection/src/test/java/com/baeldung/inject/FieldQualifierInjectTest.java b/dependency-injection/src/test/java/com/baeldung/inject/FieldQualifierInjectTest.java index f0fc5866a3..7e5f7e7453 100644 --- a/dependency-injection/src/test/java/com/baeldung/inject/FieldQualifierInjectTest.java +++ b/dependency-injection/src/test/java/com/baeldung/inject/FieldQualifierInjectTest.java @@ -1,10 +1,7 @@ package com.baeldung.inject; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -import javax.inject.Inject; - +import com.baeldung.configuration.ApplicationContextTestInjectQualifier; +import com.baeldung.dependency.ArbitraryDependency; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Qualifier; @@ -12,12 +9,14 @@ import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.support.AnnotationConfigContextLoader; -import com.baeldung.configuration.ApplicationContextTestInjectQualifier; -import com.baeldung.dependency.ArbitraryDependency; +import javax.inject.Inject; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; @RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(loader=AnnotationConfigContextLoader.class, - classes=ApplicationContextTestInjectQualifier.class) +@ContextConfiguration(loader = AnnotationConfigContextLoader.class, + classes = ApplicationContextTestInjectQualifier.class) public class FieldQualifierInjectTest { @Inject @@ -29,16 +28,14 @@ public class FieldQualifierInjectTest { private ArbitraryDependency namedDependency; @Test - public void givenInjectQualifier_WhenOnField_ThenDefaultFileValid(){ + public void givenInjectQualifier_WhenOnField_ThenDefaultFileValid() { assertNotNull(defaultDependency); - assertEquals("Arbitrary Dependency", - defaultDependency.toString()); + assertEquals("Arbitrary Dependency", defaultDependency.toString()); } @Test - public void givenInjectQualifier_WhenOnField_ThenNamedFileValid(){ + public void givenInjectQualifier_WhenOnField_ThenNamedFileValid() { assertNotNull(defaultDependency); - assertEquals("Another Arbitrary Dependency", - namedDependency.toString()); + assertEquals("Another Arbitrary Dependency", namedDependency.toString()); } } diff --git a/dependency-injection/src/test/java/com/baeldung/resource/FieldResourceInjectionTest.java b/dependency-injection/src/test/java/com/baeldung/resource/FieldResourceInjectionTest.java index ed73ae8d59..ef7e7b0aeb 100644 --- a/dependency-injection/src/test/java/com/baeldung/resource/FieldResourceInjectionTest.java +++ b/dependency-injection/src/test/java/com/baeldung/resource/FieldResourceInjectionTest.java @@ -1,30 +1,29 @@ package com.baeldung.resource; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -import java.io.File; - -import javax.annotation.Resource; +import com.baeldung.configuration.ApplicationContextTestResourceNameType; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.support.AnnotationConfigContextLoader; -import com.baeldung.configuration.ApplicationContextTestResourceNameType; +import javax.annotation.Resource; +import java.io.File; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration( - loader=AnnotationConfigContextLoader.class, - classes=ApplicationContextTestResourceNameType.class) + loader = AnnotationConfigContextLoader.class, + classes = ApplicationContextTestResourceNameType.class) public class FieldResourceInjectionTest { - @Resource(name="namedFile") + @Resource(name = "namedFile") private File defaultFile; @Test - public void givenResourceAnnotation_WhenOnField_ThenDependencyValid(){ + public void givenResourceAnnotation_WhenOnField_ThenDependencyValid() { assertNotNull(defaultFile); assertEquals("namedFile.txt", defaultFile.getName()); } diff --git a/dependency-injection/src/test/java/com/baeldung/resource/MethodByQualifierResourceTest.java b/dependency-injection/src/test/java/com/baeldung/resource/MethodByQualifierResourceTest.java index e512b6fe0a..95e9fc0bd5 100644 --- a/dependency-injection/src/test/java/com/baeldung/resource/MethodByQualifierResourceTest.java +++ b/dependency-injection/src/test/java/com/baeldung/resource/MethodByQualifierResourceTest.java @@ -1,12 +1,6 @@ package com.baeldung.resource; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -import java.io.File; - -import javax.annotation.Resource; - +import com.baeldung.configuration.ApplicationContextTestResourceQualifier; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Qualifier; @@ -14,34 +8,38 @@ import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.support.AnnotationConfigContextLoader; -import com.baeldung.configuration.ApplicationContextTestResourceQualifier; +import javax.annotation.Resource; +import java.io.File; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration( - loader=AnnotationConfigContextLoader.class, - classes=ApplicationContextTestResourceQualifier.class) + loader = AnnotationConfigContextLoader.class, + classes = ApplicationContextTestResourceQualifier.class) public class MethodByQualifierResourceTest { - private File arbDependency; - private File anotherArbDependency; + private File arbDependency; + private File anotherArbDependency; - @Test - public void givenResourceQualifier_WhenSetter_ThenValidDependencies(){ - assertNotNull(arbDependency); - assertEquals("namedFile.txt", arbDependency.getName()); - assertNotNull(anotherArbDependency); - assertEquals("defaultFile.txt", anotherArbDependency.getName()); - } + @Test + public void givenResourceQualifier_WhenSetter_ThenValidDependencies() { + assertNotNull(arbDependency); + assertEquals("namedFile.txt", arbDependency.getName()); + assertNotNull(anotherArbDependency); + assertEquals("defaultFile.txt", anotherArbDependency.getName()); + } - @Resource - @Qualifier("namedFile") - public void setArbDependency(File arbDependency) { - this.arbDependency = arbDependency; - } + @Resource + @Qualifier("namedFile") + public void setArbDependency(File arbDependency) { + this.arbDependency = arbDependency; + } - @Resource - @Qualifier("defaultFile") - public void setAnotherArbDependency(File anotherArbDependency) { - this.anotherArbDependency = anotherArbDependency; - } + @Resource + @Qualifier("defaultFile") + public void setAnotherArbDependency(File anotherArbDependency) { + this.anotherArbDependency = anotherArbDependency; + } } diff --git a/dependency-injection/src/test/java/com/baeldung/resource/MethodByTypeResourceTest.java b/dependency-injection/src/test/java/com/baeldung/resource/MethodByTypeResourceTest.java index edcf9b12ea..ad9a9a4fb6 100644 --- a/dependency-injection/src/test/java/com/baeldung/resource/MethodByTypeResourceTest.java +++ b/dependency-injection/src/test/java/com/baeldung/resource/MethodByTypeResourceTest.java @@ -1,24 +1,22 @@ package com.baeldung.resource; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -import java.io.File; - -import javax.annotation.Resource; - +import com.baeldung.configuration.ApplicationContextTestResourceNameType; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.support.AnnotationConfigContextLoader; -import com.baeldung.configuration.ApplicationContextTestResourceNameType; +import javax.annotation.Resource; +import java.io.File; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration( - loader=AnnotationConfigContextLoader.class, - classes=ApplicationContextTestResourceNameType.class) + loader = AnnotationConfigContextLoader.class, + classes = ApplicationContextTestResourceNameType.class) public class MethodByTypeResourceTest { private File defaultFile; @@ -29,7 +27,7 @@ public class MethodByTypeResourceTest { } @Test - public void givenResourceAnnotation_WhenSetter_ThenValidDependency(){ + public void givenResourceAnnotation_WhenSetter_ThenValidDependency() { assertNotNull(defaultFile); assertEquals("namedFile.txt", defaultFile.getName()); } diff --git a/dependency-injection/src/test/java/com/baeldung/resource/MethodResourceInjectionTest.java b/dependency-injection/src/test/java/com/baeldung/resource/MethodResourceInjectionTest.java index 38e9db8737..1622d8896c 100644 --- a/dependency-injection/src/test/java/com/baeldung/resource/MethodResourceInjectionTest.java +++ b/dependency-injection/src/test/java/com/baeldung/resource/MethodResourceInjectionTest.java @@ -1,35 +1,33 @@ package com.baeldung.resource; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -import java.io.File; - -import javax.annotation.Resource; - +import com.baeldung.configuration.ApplicationContextTestResourceNameType; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.support.AnnotationConfigContextLoader; -import com.baeldung.configuration.ApplicationContextTestResourceNameType; +import javax.annotation.Resource; +import java.io.File; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration( - loader=AnnotationConfigContextLoader.class, - classes=ApplicationContextTestResourceNameType.class) + loader = AnnotationConfigContextLoader.class, + classes = ApplicationContextTestResourceNameType.class) public class MethodResourceInjectionTest { private File defaultFile; - @Resource(name="namedFile") + @Resource(name = "namedFile") protected void setDefaultFile(File defaultFile) { this.defaultFile = defaultFile; } @Test - public void givenResourceAnnotation_WhenSetter_ThenDependencyValid(){ + public void givenResourceAnnotation_WhenSetter_ThenDependencyValid() { assertNotNull(defaultFile); assertEquals("namedFile.txt", defaultFile.getName()); } diff --git a/dependency-injection/src/test/java/com/baeldung/resource/NamedResourceTest.java b/dependency-injection/src/test/java/com/baeldung/resource/NamedResourceTest.java index 6dbe77da39..da104ecaae 100644 --- a/dependency-injection/src/test/java/com/baeldung/resource/NamedResourceTest.java +++ b/dependency-injection/src/test/java/com/baeldung/resource/NamedResourceTest.java @@ -1,25 +1,24 @@ package com.baeldung.resource; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -import java.io.File; - -import javax.annotation.Resource; +import com.baeldung.configuration.ApplicationContextTestResourceNameType; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.support.AnnotationConfigContextLoader; -import com.baeldung.configuration.ApplicationContextTestResourceNameType; +import javax.annotation.Resource; +import java.io.File; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; @RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(loader=AnnotationConfigContextLoader.class, - classes=ApplicationContextTestResourceNameType.class) +@ContextConfiguration(loader = AnnotationConfigContextLoader.class, + classes = ApplicationContextTestResourceNameType.class) public class NamedResourceTest { - @Resource(name="namedFile") + @Resource(name = "namedFile") private File testFile; @Test diff --git a/dependency-injection/src/test/java/com/baeldung/resource/QualifierResourceInjectionTest.java b/dependency-injection/src/test/java/com/baeldung/resource/QualifierResourceInjectionTest.java index 9afa0cf4f9..024c8e2bbe 100644 --- a/dependency-injection/src/test/java/com/baeldung/resource/QualifierResourceInjectionTest.java +++ b/dependency-injection/src/test/java/com/baeldung/resource/QualifierResourceInjectionTest.java @@ -1,11 +1,6 @@ package com.baeldung.resource; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -import java.io.File; - -import javax.annotation.Resource; +import com.baeldung.configuration.ApplicationContextTestResourceQualifier; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Qualifier; @@ -13,30 +8,34 @@ import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.support.AnnotationConfigContextLoader; -import com.baeldung.configuration.ApplicationContextTestResourceQualifier; +import javax.annotation.Resource; +import java.io.File; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration( - loader=AnnotationConfigContextLoader.class, - classes=ApplicationContextTestResourceQualifier.class) + loader = AnnotationConfigContextLoader.class, + classes = ApplicationContextTestResourceQualifier.class) public class QualifierResourceInjectionTest { @Resource @Qualifier("defaultFile") private File dependency1; - + @Resource @Qualifier("namedFile") private File dependency2; @Test - public void givenResourceAnnotation_WhenField_ThenDependency1Valid(){ + public void givenResourceAnnotation_WhenField_ThenDependency1Valid() { assertNotNull(dependency1); assertEquals("defaultFile.txt", dependency1.getName()); } @Test - public void givenResourceQualifier_WhenField_ThenDependency2Valid(){ + public void givenResourceQualifier_WhenField_ThenDependency2Valid() { assertNotNull(dependency2); assertEquals("namedFile.txt", dependency2.getName()); } diff --git a/dependency-injection/src/test/java/com/baeldung/resource/SetterResourceInjectionTest.java b/dependency-injection/src/test/java/com/baeldung/resource/SetterResourceInjectionTest.java index 8a249fea4e..aa7cfda975 100644 --- a/dependency-injection/src/test/java/com/baeldung/resource/SetterResourceInjectionTest.java +++ b/dependency-injection/src/test/java/com/baeldung/resource/SetterResourceInjectionTest.java @@ -1,23 +1,21 @@ package com.baeldung.resource; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -import java.io.File; - -import javax.annotation.Resource; - +import com.baeldung.configuration.ApplicationContextTestResourceNameType; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.support.AnnotationConfigContextLoader; -import com.baeldung.configuration.ApplicationContextTestResourceNameType; +import javax.annotation.Resource; +import java.io.File; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; @RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(loader=AnnotationConfigContextLoader.class, - classes=ApplicationContextTestResourceNameType.class) +@ContextConfiguration(loader = AnnotationConfigContextLoader.class, + classes = ApplicationContextTestResourceNameType.class) public class SetterResourceInjectionTest { private File defaultFile; From f78ba6566473b1c09449e0260228b50d2497e212 Mon Sep 17 00:00:00 2001 From: Alex Theedom Date: Fri, 1 Jul 2016 18:57:58 +0100 Subject: [PATCH 06/24] Put code under test in own package --- .../configuration/ApplicationContextTestAutowiredName.java | 0 .../configuration/ApplicationContextTestAutowiredQualifier.java | 0 .../configuration/ApplicationContextTestAutowiredType.java | 0 .../baeldung/configuration/ApplicationContextTestInjectName.java | 0 .../configuration/ApplicationContextTestInjectQualifier.java | 0 .../baeldung/configuration/ApplicationContextTestInjectType.java | 0 .../configuration/ApplicationContextTestResourceNameType.java | 0 .../configuration/ApplicationContextTestResourceQualifier.java | 0 .../java/com/baeldung/dependency/AnotherArbitraryDependency.java | 0 .../java/com/baeldung/dependency/ArbitraryDependency.java | 0 .../com/baeldung/dependency/YetAnotherArbitraryDependency.java | 0 11 files changed, 0 insertions(+), 0 deletions(-) rename dependency-injection/src/{test => main}/java/com/baeldung/configuration/ApplicationContextTestAutowiredName.java (100%) rename dependency-injection/src/{test => main}/java/com/baeldung/configuration/ApplicationContextTestAutowiredQualifier.java (100%) rename dependency-injection/src/{test => main}/java/com/baeldung/configuration/ApplicationContextTestAutowiredType.java (100%) rename dependency-injection/src/{test => main}/java/com/baeldung/configuration/ApplicationContextTestInjectName.java (100%) rename dependency-injection/src/{test => main}/java/com/baeldung/configuration/ApplicationContextTestInjectQualifier.java (100%) rename dependency-injection/src/{test => main}/java/com/baeldung/configuration/ApplicationContextTestInjectType.java (100%) rename dependency-injection/src/{test => main}/java/com/baeldung/configuration/ApplicationContextTestResourceNameType.java (100%) rename dependency-injection/src/{test => main}/java/com/baeldung/configuration/ApplicationContextTestResourceQualifier.java (100%) rename dependency-injection/src/{test => main}/java/com/baeldung/dependency/AnotherArbitraryDependency.java (100%) rename dependency-injection/src/{test => main}/java/com/baeldung/dependency/ArbitraryDependency.java (100%) rename dependency-injection/src/{test => main}/java/com/baeldung/dependency/YetAnotherArbitraryDependency.java (100%) diff --git a/dependency-injection/src/test/java/com/baeldung/configuration/ApplicationContextTestAutowiredName.java b/dependency-injection/src/main/java/com/baeldung/configuration/ApplicationContextTestAutowiredName.java similarity index 100% rename from dependency-injection/src/test/java/com/baeldung/configuration/ApplicationContextTestAutowiredName.java rename to dependency-injection/src/main/java/com/baeldung/configuration/ApplicationContextTestAutowiredName.java diff --git a/dependency-injection/src/test/java/com/baeldung/configuration/ApplicationContextTestAutowiredQualifier.java b/dependency-injection/src/main/java/com/baeldung/configuration/ApplicationContextTestAutowiredQualifier.java similarity index 100% rename from dependency-injection/src/test/java/com/baeldung/configuration/ApplicationContextTestAutowiredQualifier.java rename to dependency-injection/src/main/java/com/baeldung/configuration/ApplicationContextTestAutowiredQualifier.java diff --git a/dependency-injection/src/test/java/com/baeldung/configuration/ApplicationContextTestAutowiredType.java b/dependency-injection/src/main/java/com/baeldung/configuration/ApplicationContextTestAutowiredType.java similarity index 100% rename from dependency-injection/src/test/java/com/baeldung/configuration/ApplicationContextTestAutowiredType.java rename to dependency-injection/src/main/java/com/baeldung/configuration/ApplicationContextTestAutowiredType.java diff --git a/dependency-injection/src/test/java/com/baeldung/configuration/ApplicationContextTestInjectName.java b/dependency-injection/src/main/java/com/baeldung/configuration/ApplicationContextTestInjectName.java similarity index 100% rename from dependency-injection/src/test/java/com/baeldung/configuration/ApplicationContextTestInjectName.java rename to dependency-injection/src/main/java/com/baeldung/configuration/ApplicationContextTestInjectName.java diff --git a/dependency-injection/src/test/java/com/baeldung/configuration/ApplicationContextTestInjectQualifier.java b/dependency-injection/src/main/java/com/baeldung/configuration/ApplicationContextTestInjectQualifier.java similarity index 100% rename from dependency-injection/src/test/java/com/baeldung/configuration/ApplicationContextTestInjectQualifier.java rename to dependency-injection/src/main/java/com/baeldung/configuration/ApplicationContextTestInjectQualifier.java diff --git a/dependency-injection/src/test/java/com/baeldung/configuration/ApplicationContextTestInjectType.java b/dependency-injection/src/main/java/com/baeldung/configuration/ApplicationContextTestInjectType.java similarity index 100% rename from dependency-injection/src/test/java/com/baeldung/configuration/ApplicationContextTestInjectType.java rename to dependency-injection/src/main/java/com/baeldung/configuration/ApplicationContextTestInjectType.java diff --git a/dependency-injection/src/test/java/com/baeldung/configuration/ApplicationContextTestResourceNameType.java b/dependency-injection/src/main/java/com/baeldung/configuration/ApplicationContextTestResourceNameType.java similarity index 100% rename from dependency-injection/src/test/java/com/baeldung/configuration/ApplicationContextTestResourceNameType.java rename to dependency-injection/src/main/java/com/baeldung/configuration/ApplicationContextTestResourceNameType.java diff --git a/dependency-injection/src/test/java/com/baeldung/configuration/ApplicationContextTestResourceQualifier.java b/dependency-injection/src/main/java/com/baeldung/configuration/ApplicationContextTestResourceQualifier.java similarity index 100% rename from dependency-injection/src/test/java/com/baeldung/configuration/ApplicationContextTestResourceQualifier.java rename to dependency-injection/src/main/java/com/baeldung/configuration/ApplicationContextTestResourceQualifier.java diff --git a/dependency-injection/src/test/java/com/baeldung/dependency/AnotherArbitraryDependency.java b/dependency-injection/src/main/java/com/baeldung/dependency/AnotherArbitraryDependency.java similarity index 100% rename from dependency-injection/src/test/java/com/baeldung/dependency/AnotherArbitraryDependency.java rename to dependency-injection/src/main/java/com/baeldung/dependency/AnotherArbitraryDependency.java diff --git a/dependency-injection/src/test/java/com/baeldung/dependency/ArbitraryDependency.java b/dependency-injection/src/main/java/com/baeldung/dependency/ArbitraryDependency.java similarity index 100% rename from dependency-injection/src/test/java/com/baeldung/dependency/ArbitraryDependency.java rename to dependency-injection/src/main/java/com/baeldung/dependency/ArbitraryDependency.java diff --git a/dependency-injection/src/test/java/com/baeldung/dependency/YetAnotherArbitraryDependency.java b/dependency-injection/src/main/java/com/baeldung/dependency/YetAnotherArbitraryDependency.java similarity index 100% rename from dependency-injection/src/test/java/com/baeldung/dependency/YetAnotherArbitraryDependency.java rename to dependency-injection/src/main/java/com/baeldung/dependency/YetAnotherArbitraryDependency.java From 06dd18a18430ea87b03aa1fc330f14cf2b12024f Mon Sep 17 00:00:00 2001 From: egimaben Date: Fri, 1 Jul 2016 21:21:30 +0300 Subject: [PATCH 07/24] added hamcrest api tutorial --- .../java/org/baeldung/hamcrest/Animal.java | 33 ++ .../test/java/org/baeldung/hamcrest/Cat.java | 13 + .../hamcrest/HamcrestMatcherTest.java | 340 ++++++++++++++++++ .../baeldung/hamcrest/IsPositiveInteger.java | 24 ++ .../java/org/baeldung/hamcrest/Person.java | 37 ++ 5 files changed, 447 insertions(+) create mode 100644 guava/src/test/java/org/baeldung/hamcrest/Animal.java create mode 100644 guava/src/test/java/org/baeldung/hamcrest/Cat.java create mode 100644 guava/src/test/java/org/baeldung/hamcrest/HamcrestMatcherTest.java create mode 100644 guava/src/test/java/org/baeldung/hamcrest/IsPositiveInteger.java create mode 100644 guava/src/test/java/org/baeldung/hamcrest/Person.java diff --git a/guava/src/test/java/org/baeldung/hamcrest/Animal.java b/guava/src/test/java/org/baeldung/hamcrest/Animal.java new file mode 100644 index 0000000000..1a0266f5a3 --- /dev/null +++ b/guava/src/test/java/org/baeldung/hamcrest/Animal.java @@ -0,0 +1,33 @@ +package org.baeldung.hamcrest; + +public class Animal { + String name; + boolean wild; + String sound; + + public Animal(String name, boolean wild, String sound) { + super(); + this.name = name; + this.wild = wild; + this.sound = sound; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public boolean isWild() { + return wild; + } + public void setWild(boolean wild) { + this.wild = wild; + } + public String getSound() { + return sound; + } + public void setSound(String sound) { + this.sound = sound; + } + +} diff --git a/guava/src/test/java/org/baeldung/hamcrest/Cat.java b/guava/src/test/java/org/baeldung/hamcrest/Cat.java new file mode 100644 index 0000000000..892e5b6e30 --- /dev/null +++ b/guava/src/test/java/org/baeldung/hamcrest/Cat.java @@ -0,0 +1,13 @@ +package org.baeldung.hamcrest; + +public class Cat extends Animal { + + public Cat() { + super("cat", false, "meow"); + } + + public String makeSound() { + return getSound(); + } + +} diff --git a/guava/src/test/java/org/baeldung/hamcrest/HamcrestMatcherTest.java b/guava/src/test/java/org/baeldung/hamcrest/HamcrestMatcherTest.java new file mode 100644 index 0000000000..fb8fd463c4 --- /dev/null +++ b/guava/src/test/java/org/baeldung/hamcrest/HamcrestMatcherTest.java @@ -0,0 +1,340 @@ +package org.baeldung.hamcrest; + +import static org.baeldung.hamcrest.IsPositiveInteger.isAPositiveInteger; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.greaterThan; +import static org.hamcrest.Matchers.greaterThanOrEqualTo; +import static org.hamcrest.Matchers.lessThan; +import static org.hamcrest.Matchers.lessThanOrEqualTo; +import static org.hamcrest.Matchers.closeTo; +import static org.hamcrest.beans.HasProperty.hasProperty; +import static org.hamcrest.beans.HasPropertyWithValue.hasProperty; +import static org.hamcrest.beans.SamePropertyValuesAs.samePropertyValuesAs; +import static org.hamcrest.collection.IsArrayContaining.hasItemInArray; +import static org.hamcrest.collection.IsArrayContainingInAnyOrder.arrayContainingInAnyOrder; +import static org.hamcrest.collection.IsArrayContainingInOrder.arrayContaining; +import static org.hamcrest.collection.IsArrayWithSize.arrayWithSize; +import static org.hamcrest.collection.IsCollectionWithSize.hasSize; +import static org.hamcrest.collection.IsEmptyCollection.empty; +import static org.hamcrest.collection.IsIn.isIn; +import static org.hamcrest.collection.IsIn.isOneOf; +import static org.hamcrest.collection.IsMapContaining.hasKey; +import static org.hamcrest.collection.IsMapContaining.hasEntry; +import static org.hamcrest.collection.IsMapContaining.hasValue; +import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder; +import static org.hamcrest.collection.IsIterableContainingInOrder.contains; +import static org.hamcrest.text.IsEqualIgnoringCase.equalToIgnoringCase; +import static org.hamcrest.text.IsEmptyString.isEmptyOrNullString; +import static org.hamcrest.text.IsEmptyString.isEmptyString; +import static org.hamcrest.text.IsEqualIgnoringWhiteSpace.equalToIgnoringWhiteSpace; +import static org.hamcrest.text.StringContainsInOrder.stringContainsInOrder; +import static org.hamcrest.object.HasToString.hasToString; +import static org.hamcrest.object.IsCompatibleType.typeCompatibleWith; +import static org.hamcrest.core.AllOf.allOf; +import static org.hamcrest.core.AnyOf.anyOf; +import static org.hamcrest.core.Every.everyItem; +import static org.hamcrest.core.Is.is;//class +import static org.hamcrest.core.IsInstanceOf.instanceOf; +import static org.hamcrest.core.IsNot.not;//matcher +import static org.hamcrest.core.IsNull.notNullValue;//without arg +import static org.hamcrest.core.IsSame.sameInstance; +import static org.hamcrest.core.StringContains.containsString; +import static org.hamcrest.core.StringEndsWith.endsWith; +import static org.hamcrest.core.StringStartsWith.startsWith; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.junit.Test; + +public class HamcrestMatcherTest { + @Test + public void given2Strings_whenEqual_thenCorrect() { + String a = "foo"; + String b = "FOO"; + assertThat(a, equalToIgnoringCase(b)); + } + + @Test + public void givenBean_whenHasValue_thenCorrect() { + Person person = new Person("Baeldung", "New York"); + assertThat(person, hasProperty("name")); + } + + @Test + public void givenBean_whenHasCorrectValue_thenCorrect() { + Person person = new Person("Baeldung", "New York"); + assertThat(person, hasProperty("address", equalTo("New York"))); + } + + @Test + public void given2Beans_whenHavingSameValues_thenCorrect() { + Person person1 = new Person("Baeldung", "New York"); + Person person2 = new Person("Baeldung", "New York"); + assertThat(person1, samePropertyValuesAs(person2)); + } + + @Test + public void givenAList_whenChecksSize_thenCorrect() { + List hamcrestMatchers = Arrays.asList("collections", "beans", + "text", "number"); + assertThat(hamcrestMatchers, hasSize(4)); + } + + @Test + public void givenArray_whenChecksSize_thenCorrect() { + String[] hamcrestMatchers = { "collections", "beans", "text", "number" }; + assertThat(hamcrestMatchers, arrayWithSize(4)); + } + + @Test + public void givenAListAndValues_whenChecksListForGivenValues_thenCorrect() { + List hamcrestMatchers = Arrays.asList("collections", "beans", + "text", "number"); + assertThat(hamcrestMatchers, + containsInAnyOrder("beans", "text", "collections", "number")); + } + + @Test + public void givenAListAndValues_whenChecksListForGivenValuesWithOrder_thenCorrect() { + List hamcrestMatchers = Arrays.asList("collections", "beans", + "text", "number"); + assertThat(hamcrestMatchers, + contains("collections", "beans", "text", "number")); + } + + @Test + public void givenArrayAndValue_whenValueFoundInArray_thenCorrect() { + String[] hamcrestMatchers = { "collections", "beans", "text", "number" }; + assertThat(hamcrestMatchers, hasItemInArray("text")); + + } + + @Test + public void givenValueAndArray_whenValueIsOneOfArrayElements_thenCorrect() { + String[] hamcrestMatchers = { "collections", "beans", "text", "number" }; + assertThat("text", isOneOf(hamcrestMatchers)); + + } + + @Test + public void givenArrayAndValues_whenValuesFoundInArray_thenCorrect() { + String[] hamcrestMatchers = { "collections", "beans", "text", "number" }; + assertThat( + hamcrestMatchers, + arrayContainingInAnyOrder("beans", "collections", "number", + "text")); + + } + + @Test + public void givenArrayAndValues_whenValuesFoundInArrayInOrder_thenCorrect() { + String[] hamcrestMatchers = { "collections", "beans", "text", "number" }; + assertThat(hamcrestMatchers, + arrayContaining("collections", "beans", "text", "number")); + + } + + @Test + public void givenCollection_whenEmpty_thenCorrect() { + List emptyList = new ArrayList<>(); + assertThat(emptyList, empty()); + + } + + @Test + public void givenValueAndArray_whenValueFoundInArray_thenCorrect() { + String[] array = new String[] { "collections", "beans", "text", + "number" }; + assertThat("bean", isIn(array)); + + } + + @Test + public void givenMapAndKey_whenKeyFoundInMap_thenCorrect() { + Map map = new HashMap<>(); + map.put("blogname", "baeldung"); + assertThat(map, hasKey("blogname")); + } + + @Test + public void givenMapAndEntry_whenEntryFoundInMap_thenCorrect() { + Map map = new HashMap<>(); + map.put("blogname", "baeldung"); + assertThat(map, hasEntry("blogname", "baeldung")); + } + + @Test + public void givenMapAndValue_whenValueFoundInMap_thenCorrect() { + Map map = new HashMap<>(); + map.put("blogname", "baeldung"); + assertThat(map, hasValue("baeldung")); + } + + @Test + public void givenString_whenEmpty_thenCorrect() { + String str = ""; + assertThat(str, isEmptyString()); + } + + @Test + public void givenString_whenEmptyOrNull_thenCorrect() { + String str = null; + assertThat(str, isEmptyOrNullString()); + } + + @Test + public void given2Strings_whenEqualRegardlessWhiteSpace_thenCorrect() { + String str1 = "text"; + String str2 = " text "; + assertThat(str1, equalToIgnoringWhiteSpace(str2)); + } + + @Test + public void givenString_whenContainsGivenSubstring_thenCorrect() { + String str = "calligraphy"; + assertThat(str, stringContainsInOrder(Arrays.asList("call", "graph"))); + } + + @Test + public void givenBean_whenToStringReturnsRequiredString_thenCorrect() { + Person person = new Person("Barrack", "Washington"); + String str = person.toString(); + assertThat(person, hasToString(str)); + } + + @Test + public void given2Classes_whenOneInheritsFromOther_thenCorrect() { + assertThat(Cat.class, typeCompatibleWith(Animal.class)); + } + + + @Test + public void given2Strings_whenIsEqualRegardlessWhiteSpace_thenCorrect() { + String str1 = "text"; + String str2 = " text "; + assertThat(str1, is(equalToIgnoringWhiteSpace(str2))); + } + + @Test + public void given2Strings_whenIsNotEqualRegardlessWhiteSpace_thenCorrect() { + String str1 = "text"; + String str2 = " texts "; + assertThat(str1, not(equalToIgnoringWhiteSpace(str2))); + } + + @Test + public void given2Strings_whenNotEqual_thenCorrect() { + String str1 = "text"; + String str2 = "texts"; + assertThat(str1, not(str2)); + } + + @Test + public void given2Strings_whenIsEqual_thenCorrect() { + String str1 = "text"; + String str2 = "text"; + assertThat(str1, is(str2)); + } + + @Test + public void givenAStrings_whenContainsAnotherGivenString_thenCorrect() { + String str1 = "calligraphy"; + String str2 = "call"; + assertThat(str1, containsString(str2)); + } + + @Test + public void givenAString_whenEndsWithAnotherGivenString_thenCorrect() { + String str1 = "calligraphy"; + String str2 = "phy"; + assertThat(str1, endsWith(str2)); + } + + @Test + public void givenAString_whenStartsWithAnotherGivenString_thenCorrect() { + String str1 = "calligraphy"; + String str2 = "call"; + assertThat(str1, startsWith(str2)); + } + + @Test + public void given2Objects_whenSameInstance_thenCorrect() { + Cat cat = new Cat(); + assertThat(cat, sameInstance(cat)); + } + + @Test + public void givenAnObject_whenInstanceOfGivenClass_thenCorrect() { + Cat cat = new Cat(); + assertThat(cat, instanceOf(Cat.class)); + } + + @Test + public void givenList_whenEachElementGreaterThan0_thenCorrect() { + List list = Arrays.asList(1, 2, 3); + int baseCase = 0; + assertThat(list, everyItem(greaterThan(baseCase))); + } + + @Test + public void givenString_whenNotNull_thenCorrect() { + String str = "notnull"; + assertThat(str, notNullValue()); + } + + @Test + public void givenString_whenMeetsAnyOfGivenConditions_thenCorrect() { + String str = "calligraphy"; + String start = "call"; + String end = "foo"; + assertThat(str, anyOf(startsWith(start), containsString(end))); + } + + @Test + public void givenString_whenMeetsAllOfGivenConditions_thenCorrect() { + String str = "calligraphy"; + String start = "call"; + String end = "foo"; + assertThat(str, allOf(startsWith(start), endsWith(end))); + } + + @Test + public void givenInteger_whenAPositiveValue_thenCorrect() { + int num = 1; + assertThat(num, isAPositiveInteger()); + } + + @Test + public void givenAnInteger_whenGreaterThan0_thenCorrect() { + int num = 1; + assertThat(num, greaterThan(0)); + } + + @Test + public void givenAnInteger_whenGreaterThanOrEqTo5_thenCorrect() { + int num = 5; + assertThat(num, greaterThanOrEqualTo(5)); + } + + @Test + public void givenAnInteger_whenLessThan0_thenCorrect() { + int num = -1; + assertThat(num, lessThan(0)); + } + + @Test + public void givenAnInteger_whenLessThanOrEqTo5_thenCorrect() { + assertThat(-1, lessThanOrEqualTo(5)); + } + + @Test + public void givenADouble_whenCloseTo_thenCorrect() { + assertThat(1.2, closeTo(1, 0.5)); + } + +} diff --git a/guava/src/test/java/org/baeldung/hamcrest/IsPositiveInteger.java b/guava/src/test/java/org/baeldung/hamcrest/IsPositiveInteger.java new file mode 100644 index 0000000000..0d8d262538 --- /dev/null +++ b/guava/src/test/java/org/baeldung/hamcrest/IsPositiveInteger.java @@ -0,0 +1,24 @@ +package org.baeldung.hamcrest; + +import org.hamcrest.Description; +import org.hamcrest.Factory; +import org.hamcrest.Matcher; +import org.hamcrest.TypeSafeMatcher; + +public class IsPositiveInteger extends TypeSafeMatcher { + + public void describeTo(Description description) { + description.appendText("a positive integer"); + } + + @Factory + public static Matcher isAPositiveInteger() { + return new IsPositiveInteger(); + } + + @Override + protected boolean matchesSafely(Integer integer) { + return integer > 0; + } + +} diff --git a/guava/src/test/java/org/baeldung/hamcrest/Person.java b/guava/src/test/java/org/baeldung/hamcrest/Person.java new file mode 100644 index 0000000000..0053c98043 --- /dev/null +++ b/guava/src/test/java/org/baeldung/hamcrest/Person.java @@ -0,0 +1,37 @@ +package org.baeldung.hamcrest; + +public class Person { + String name; + String address; + + public Person(String personName, String personAddress) { + name = personName; + address = personAddress; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + @Override + public String toString() { + String str="[address:"+address+",name:"+name+"]"; + return str; + } + + + + +} From a9a5a3d79fcd6e760bc4ff7701b302a1c873b943 Mon Sep 17 00:00:00 2001 From: Grzegorz Piwowarek Date: Sat, 2 Jul 2016 21:13:59 +0200 Subject: [PATCH 08/24] Add examples --- assertj/pom.xml | 11 +++ .../introduction/AssertJGuavaTest.java | 91 +++++++++++++++++++ 2 files changed, 102 insertions(+) create mode 100644 assertj/src/test/java/com/baeldung/assertj/introduction/AssertJGuavaTest.java diff --git a/assertj/pom.xml b/assertj/pom.xml index ce97278a97..26f45cfa26 100644 --- a/assertj/pom.xml +++ b/assertj/pom.xml @@ -9,10 +9,16 @@ 1.0.0-SNAPSHOT + + com.google.guava + guava + 19.0 + junit junit 4.12 + test org.assertj @@ -20,6 +26,11 @@ 3.4.1 test + + org.assertj + assertj-guava + 3.0.0 + diff --git a/assertj/src/test/java/com/baeldung/assertj/introduction/AssertJGuavaTest.java b/assertj/src/test/java/com/baeldung/assertj/introduction/AssertJGuavaTest.java new file mode 100644 index 0000000000..95faaec3d0 --- /dev/null +++ b/assertj/src/test/java/com/baeldung/assertj/introduction/AssertJGuavaTest.java @@ -0,0 +1,91 @@ +package com.baeldung.assertj.introduction; + +import com.google.common.base.Optional; +import com.google.common.collect.HashBasedTable; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Multimaps; +import com.google.common.collect.Range; +import com.google.common.collect.SetMultimap; +import com.google.common.collect.TreeRangeMap; +import com.google.common.io.Files; +import org.assertj.guava.data.MapEntry; +import org.junit.Test; + +import java.io.File; + +import static org.assertj.guava.api.Assertions.assertThat; +import static org.assertj.guava.api.Assertions.entry; + +public class AssertJGuavaTest { + + @Test + public void givenTwoEmptyFiles_whenComparingContent_thenEqual() throws Exception { + final File temp = File.createTempFile("bael", "dung"); + final File temp2 = File.createTempFile("bael", "dung2"); + + assertThat(Files.asByteSource(temp)) + .hasSize(0) + .hasSameContentAs(Files.asByteSource(temp2)); + } + + @Test + public void givenMultimap_whenVerifying_thenCorrect() throws Exception { + final SetMultimap mmap = Multimaps.forMap(ImmutableMap.of(1, "one")); + + assertThat(mmap) + .hasSize(1) + .containsKeys(1) + .contains(entry(1, "one")); + } + + @Test + public void givenOptional_whenVerifyingContent_thenShouldBeEqual() throws Exception { + final Optional something = Optional.of("something"); + + assertThat(something) + .isPresent() + .extractingValue() + .isEqualTo("something"); + } + + @Test + public void givenRange_whenVerifying_thenShouldBeCorrect() throws Exception { + final Range range = Range.openClosed("a", "g"); + + assertThat(range) + .hasOpenedLowerBound() + .isNotEmpty() + .hasClosedUpperBound() + .contains("b"); + } + + @Test + public void givenRangeMap_whenVerifying_thenShouldBeCorrect() throws Exception { + final TreeRangeMap map = TreeRangeMap.create(); + + map.put(Range.closed(0, 60), "F"); + map.put(Range.closed(61, 70), "D"); + + assertThat(map) + .isNotEmpty() + .containsKeys(0) + .contains(MapEntry.entry(34, "F")); + } + + @Test + public void givenTable_whenVerifying_thenShouldBeCorrect() throws Exception { + final HashBasedTable table = HashBasedTable.create(2, 2); + + table.put(1, "A", "PRESENT"); + table.put(1, "B", "ABSENT"); + + assertThat(table) + .hasRowCount(1) + .containsValues("ABSENT") + .containsCell(1, "B", "ABSENT"); + } + + + + +} From b0565a2882a416583a70dab723e64454562d9cac Mon Sep 17 00:00:00 2001 From: Alex Theedom Date: Sun, 3 Jul 2016 12:35:08 +0100 Subject: [PATCH 09/24] Mkae minor amendments to make tests pass --- .../hamcrest/HamcrestMatcherTest.java | 49 ++++++++----------- 1 file changed, 20 insertions(+), 29 deletions(-) diff --git a/guava/src/test/java/org/baeldung/hamcrest/HamcrestMatcherTest.java b/guava/src/test/java/org/baeldung/hamcrest/HamcrestMatcherTest.java index fb8fd463c4..b3756d609f 100644 --- a/guava/src/test/java/org/baeldung/hamcrest/HamcrestMatcherTest.java +++ b/guava/src/test/java/org/baeldung/hamcrest/HamcrestMatcherTest.java @@ -1,13 +1,12 @@ package org.baeldung.hamcrest; +import org.junit.Test; + +import java.util.*; + import static org.baeldung.hamcrest.IsPositiveInteger.isAPositiveInteger; import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.Matchers.greaterThan; -import static org.hamcrest.Matchers.greaterThanOrEqualTo; -import static org.hamcrest.Matchers.lessThan; -import static org.hamcrest.Matchers.lessThanOrEqualTo; -import static org.hamcrest.Matchers.closeTo; +import static org.hamcrest.Matchers.*; import static org.hamcrest.beans.HasProperty.hasProperty; import static org.hamcrest.beans.HasPropertyWithValue.hasProperty; import static org.hamcrest.beans.SamePropertyValuesAs.samePropertyValuesAs; @@ -19,37 +18,29 @@ import static org.hamcrest.collection.IsCollectionWithSize.hasSize; import static org.hamcrest.collection.IsEmptyCollection.empty; import static org.hamcrest.collection.IsIn.isIn; import static org.hamcrest.collection.IsIn.isOneOf; -import static org.hamcrest.collection.IsMapContaining.hasKey; -import static org.hamcrest.collection.IsMapContaining.hasEntry; -import static org.hamcrest.collection.IsMapContaining.hasValue; import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder; import static org.hamcrest.collection.IsIterableContainingInOrder.contains; -import static org.hamcrest.text.IsEqualIgnoringCase.equalToIgnoringCase; -import static org.hamcrest.text.IsEmptyString.isEmptyOrNullString; -import static org.hamcrest.text.IsEmptyString.isEmptyString; -import static org.hamcrest.text.IsEqualIgnoringWhiteSpace.equalToIgnoringWhiteSpace; -import static org.hamcrest.text.StringContainsInOrder.stringContainsInOrder; -import static org.hamcrest.object.HasToString.hasToString; -import static org.hamcrest.object.IsCompatibleType.typeCompatibleWith; +import static org.hamcrest.collection.IsMapContaining.hasEntry; +import static org.hamcrest.collection.IsMapContaining.hasKey; +import static org.hamcrest.collection.IsMapContaining.hasValue; import static org.hamcrest.core.AllOf.allOf; import static org.hamcrest.core.AnyOf.anyOf; import static org.hamcrest.core.Every.everyItem; -import static org.hamcrest.core.Is.is;//class +import static org.hamcrest.core.Is.is; import static org.hamcrest.core.IsInstanceOf.instanceOf; -import static org.hamcrest.core.IsNot.not;//matcher -import static org.hamcrest.core.IsNull.notNullValue;//without arg +import static org.hamcrest.core.IsNot.not; +import static org.hamcrest.core.IsNull.notNullValue; import static org.hamcrest.core.IsSame.sameInstance; import static org.hamcrest.core.StringContains.containsString; import static org.hamcrest.core.StringEndsWith.endsWith; import static org.hamcrest.core.StringStartsWith.startsWith; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.junit.Test; +import static org.hamcrest.object.HasToString.hasToString; +import static org.hamcrest.object.IsCompatibleType.typeCompatibleWith; +import static org.hamcrest.text.IsEmptyString.isEmptyOrNullString; +import static org.hamcrest.text.IsEmptyString.isEmptyString; +import static org.hamcrest.text.IsEqualIgnoringCase.equalToIgnoringCase; +import static org.hamcrest.text.IsEqualIgnoringWhiteSpace.equalToIgnoringWhiteSpace; +import static org.hamcrest.text.StringContainsInOrder.stringContainsInOrder; public class HamcrestMatcherTest { @Test @@ -150,7 +141,7 @@ public class HamcrestMatcherTest { public void givenValueAndArray_whenValueFoundInArray_thenCorrect() { String[] array = new String[] { "collections", "beans", "text", "number" }; - assertThat("bean", isIn(array)); + assertThat("beans", isIn(array)); } @@ -299,7 +290,7 @@ public class HamcrestMatcherTest { public void givenString_whenMeetsAllOfGivenConditions_thenCorrect() { String str = "calligraphy"; String start = "call"; - String end = "foo"; + String end = "phy"; assertThat(str, allOf(startsWith(start), endsWith(end))); } From 010c6b3ace491d44472d113babea6bfda4732407 Mon Sep 17 00:00:00 2001 From: Grzegorz Piwowarek Date: Mon, 4 Jul 2016 13:30:34 +0200 Subject: [PATCH 10/24] Refactor multimap example --- .../assertj/introduction/AssertJGuavaTest.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/assertj/src/test/java/com/baeldung/assertj/introduction/AssertJGuavaTest.java b/assertj/src/test/java/com/baeldung/assertj/introduction/AssertJGuavaTest.java index 95faaec3d0..9c51af3ee9 100644 --- a/assertj/src/test/java/com/baeldung/assertj/introduction/AssertJGuavaTest.java +++ b/assertj/src/test/java/com/baeldung/assertj/introduction/AssertJGuavaTest.java @@ -2,16 +2,17 @@ package com.baeldung.assertj.introduction; import com.google.common.base.Optional; import com.google.common.collect.HashBasedTable; -import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Multimap; import com.google.common.collect.Multimaps; import com.google.common.collect.Range; -import com.google.common.collect.SetMultimap; +import com.google.common.collect.Sets; import com.google.common.collect.TreeRangeMap; import com.google.common.io.Files; import org.assertj.guava.data.MapEntry; import org.junit.Test; import java.io.File; +import java.util.HashMap; import static org.assertj.guava.api.Assertions.assertThat; import static org.assertj.guava.api.Assertions.entry; @@ -30,12 +31,15 @@ public class AssertJGuavaTest { @Test public void givenMultimap_whenVerifying_thenCorrect() throws Exception { - final SetMultimap mmap = Multimaps.forMap(ImmutableMap.of(1, "one")); + final Multimap mmap = Multimaps.newMultimap(new HashMap<>(), Sets::newHashSet); + mmap.put(1, "one"); + mmap.put(1, "1"); assertThat(mmap) - .hasSize(1) + .hasSize(2) .containsKeys(1) - .contains(entry(1, "one")); + .contains(entry(1, "one")) + .contains(entry(1, "1")); } @Test From 2f4079ddf2531f3994fc3c2d7b5733083bad786e Mon Sep 17 00:00:00 2001 From: k0l0ssus Date: Tue, 5 Jul 2016 00:53:43 -0400 Subject: [PATCH 11/24] Add files via upload Backing bean to support el intro article --- .../springintegration/ELSampleBean.java | 118 ++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 jsf/src/main/java/com/baeldung/springintegration/ELSampleBean.java diff --git a/jsf/src/main/java/com/baeldung/springintegration/ELSampleBean.java b/jsf/src/main/java/com/baeldung/springintegration/ELSampleBean.java new file mode 100644 index 0000000000..32076bcbad --- /dev/null +++ b/jsf/src/main/java/com/baeldung/springintegration/ELSampleBean.java @@ -0,0 +1,118 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +package com.baeldung.el.controllers; + +import java.util.Random; +import javax.annotation.PostConstruct; +import javax.faces.application.Application; +import javax.faces.application.FacesMessage; +import javax.faces.bean.ManagedBean; +import javax.faces.bean.ViewScoped; +import javax.faces.component.html.HtmlInputText; +import javax.faces.context.FacesContext; + +/** + * + * @author Tayo + */ +@ManagedBean(name = "ELBean") +@ViewScoped +public class ELSampleBean { + + private String firstName; + private String lastName; + private String pageDescription = "This page demos JSF EL Basics"; + private int pageCounter; + private Random randomIntGen = new Random(); + + @PostConstruct + public void init() { + pageCounter = randomIntGen.nextInt(); + } + + public void save(){ + + } + + public void saveFirstName(String firstName) { + this.firstName = firstName; + } + + + public void saveByELEvaluation(){ + firstName = (String)evaluateEL("#{firstName.value}", String.class); + FacesContext ctx = FacesContext.getCurrentInstance(); + FacesMessage theMessage = new FacesMessage("Name component Evaluated: "+firstName); + theMessage.setSeverity(FacesMessage.SEVERITY_INFO); + ctx.addMessage(null,theMessage); + + } + + private Object evaluateEL(String elExpression, Class clazz) { + Object toReturn = null; + FacesContext ctx = FacesContext.getCurrentInstance(); + Application app = ctx.getApplication(); + toReturn = app.evaluateExpressionGet(ctx, elExpression, clazz); + + return toReturn; + + } + + /** + * @return the firstName + */ + public String getFirstName() { + return firstName; + } + + /** + * @param firstName the firstName to set + */ + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + /** + * @return the lastName + */ + public String getLastName() { + return lastName; + } + + /** + * @param lastName the lastName to set + */ + public void setLastName(String lastName) { + this.lastName = lastName; + } + + /** + * @return the pageDescription + */ + public String getPageDescription() { + return pageDescription; + } + + /** + * @param pageDescription the pageDescription to set + */ + public void setPageDescription(String pageDescription) { + this.pageDescription = pageDescription; + } + + /** + * @return the pageCounter + */ + public int getPageCounter() { + return pageCounter; + } + + /** + * @param pageCounter the pageCounter to set + */ + public void setPageCounter(int pageCounter) { + this.pageCounter = pageCounter; + } +} From 8a19546b1ab38ca0bcee745007b2c9363ea2d1fa Mon Sep 17 00:00:00 2001 From: k0l0ssus Date: Tue, 5 Jul 2016 00:57:27 -0400 Subject: [PATCH 12/24] Add files via upload Page to demo EL examples --- jsf/src/main/webapp/el_intro.xhtml | 38 ++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 jsf/src/main/webapp/el_intro.xhtml diff --git a/jsf/src/main/webapp/el_intro.xhtml b/jsf/src/main/webapp/el_intro.xhtml new file mode 100644 index 0000000000..3b58d6288d --- /dev/null +++ b/jsf/src/main/webapp/el_intro.xhtml @@ -0,0 +1,38 @@ + + + + + Baeldung | The EL Intro + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 89373cd1ebbaabc063833944500795cbfa68de4c Mon Sep 17 00:00:00 2001 From: Sergey Petunin Date: Wed, 6 Jul 2016 01:44:00 +0600 Subject: [PATCH 13/24] Samples for the Intro to QueryDSL article, merged with existing querydsl module. Updated module dependencies. (#476) --- querydsl/pom.xml | 56 ++--- .../java/org/baeldung/dao/PersonDaoImpl.java | 22 +- .../querydsl/intro/entities/BlogPost.java | 56 +++++ .../querydsl/intro/entities/User.java | 55 +++++ .../main/resources/META-INF/persistence.xml | 13 ++ .../main/resources/{log4j.xml => logback.xml} | 19 +- .../baeldung/querydsl/intro/QueryDSLTest.java | 215 ++++++++++++++++++ 7 files changed, 377 insertions(+), 59 deletions(-) create mode 100644 querydsl/src/main/java/org/baeldung/querydsl/intro/entities/BlogPost.java create mode 100644 querydsl/src/main/java/org/baeldung/querydsl/intro/entities/User.java rename querydsl/src/main/resources/{log4j.xml => logback.xml} (53%) create mode 100644 querydsl/src/test/java/org/baeldung/querydsl/intro/QueryDSLTest.java diff --git a/querydsl/pom.xml b/querydsl/pom.xml index cf50144d3f..bed0cf90e5 100644 --- a/querydsl/pom.xml +++ b/querydsl/pom.xml @@ -14,30 +14,25 @@ UTF-8 - 1.6 - 4.10 - 3.1.0.RELEASE - 4.3.11.Final - 2.5.0 - 1.5.10 + 1.8 + 4.12 + 4.3.1.RELEASE + 5.2.1.Final + 4.1.3 + 1.7.21 - - com.mysema.querydsl - querydsl-core - ${querydsl.version} - - com.mysema.querydsl + com.querydsl querydsl-jpa ${querydsl.version} - com.mysema.querydsl + com.querydsl querydsl-apt ${querydsl.version} provided @@ -53,7 +48,7 @@ org.hibernate.javax.persistence - hibernate-jpa-2.0-api + hibernate-jpa-2.1-api 1.0.0.Final compile @@ -69,7 +64,7 @@ commons-pool commons-pool - 1.5.5 + 1.6 jar compile @@ -77,8 +72,8 @@ org.hsqldb - hsqldb-j5 - 2.2.4 + hsqldb + 2.3.4 @@ -118,9 +113,9 @@ - org.slf4j - slf4j-api - ${slf4j.version} + ch.qos.logback + logback-classic + 1.1.7 org.slf4j @@ -128,17 +123,6 @@ ${slf4j.version} runtime - - org.slf4j - slf4j-log4j12 - ${slf4j.version} - runtime - - - log4j - log4j - 1.2.16 - @@ -157,7 +141,7 @@ org.apache.maven.plugins maven-compiler-plugin - 2.3.2 + 3.5.1 ${java.version} ${java.version} @@ -168,16 +152,16 @@ com.mysema.maven - maven-apt-plugin - 1.0.3 + apt-maven-plugin + 1.1.3 process - target/metamodel - com.mysema.query.apt.jpa.JPAAnnotationProcessor + target/generated-sources/java + com.querydsl.apt.jpa.JPAAnnotationProcessor diff --git a/querydsl/src/main/java/org/baeldung/dao/PersonDaoImpl.java b/querydsl/src/main/java/org/baeldung/dao/PersonDaoImpl.java index 555ec226ce..9acaf1dd18 100644 --- a/querydsl/src/main/java/org/baeldung/dao/PersonDaoImpl.java +++ b/querydsl/src/main/java/org/baeldung/dao/PersonDaoImpl.java @@ -10,8 +10,8 @@ import org.baeldung.entity.Person; import org.baeldung.entity.QPerson; import org.springframework.stereotype.Repository; -import com.mysema.query.group.GroupBy; -import com.mysema.query.jpa.impl.JPAQuery; +import com.querydsl.core.group.GroupBy; +import com.querydsl.jpa.impl.JPAQuery; @Repository public class PersonDaoImpl implements PersonDao { @@ -27,39 +27,39 @@ public class PersonDaoImpl implements PersonDao { @Override public List findPersonsByFirstnameQueryDSL(final String firstname) { - final JPAQuery query = new JPAQuery(em); + final JPAQuery query = new JPAQuery<>(em); final QPerson person = QPerson.person; - return query.from(person).where(person.firstname.eq(firstname)).list(person); + return query.from(person).where(person.firstname.eq(firstname)).fetch(); } @Override public List findPersonsByFirstnameAndSurnameQueryDSL(final String firstname, final String surname) { - final JPAQuery query = new JPAQuery(em); + final JPAQuery query = new JPAQuery<>(em); final QPerson person = QPerson.person; - return query.from(person).where(person.firstname.eq(firstname).and(person.surname.eq(surname))).list(person); + return query.from(person).where(person.firstname.eq(firstname).and(person.surname.eq(surname))).fetch(); } @Override public List findPersonsByFirstnameInDescendingOrderQueryDSL(final String firstname) { - final JPAQuery query = new JPAQuery(em); + final JPAQuery query = new JPAQuery<>(em); final QPerson person = QPerson.person; - return query.from(person).where(person.firstname.eq(firstname)).orderBy(person.surname.desc()).list(person); + return query.from(person).where(person.firstname.eq(firstname)).orderBy(person.surname.desc()).fetch(); } @Override public int findMaxAge() { - final JPAQuery query = new JPAQuery(em); + final JPAQuery query = new JPAQuery<>(em); final QPerson person = QPerson.person; - return query.from(person).list(person.age.max()).get(0); + return query.from(person).select(person.age.max()).fetchFirst(); } @Override public Map findMaxAgeByName() { - final JPAQuery query = new JPAQuery(em); + final JPAQuery query = new JPAQuery<>(em); final QPerson person = QPerson.person; return query.from(person).transform(GroupBy.groupBy(person.firstname).as(GroupBy.max(person.age))); diff --git a/querydsl/src/main/java/org/baeldung/querydsl/intro/entities/BlogPost.java b/querydsl/src/main/java/org/baeldung/querydsl/intro/entities/BlogPost.java new file mode 100644 index 0000000000..241bc50b03 --- /dev/null +++ b/querydsl/src/main/java/org/baeldung/querydsl/intro/entities/BlogPost.java @@ -0,0 +1,56 @@ +/* + * (c) Центр ИТ, 2016. Все права защищены. + */ +package org.baeldung.querydsl.intro.entities; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.ManyToOne; + +@Entity +public class BlogPost { + + @Id + @GeneratedValue + private Long id; + + private String title; + + private String body; + + @ManyToOne + private User user; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String code) { + this.title = code; + } + + public String getBody() { + return body; + } + + public void setBody(String body) { + this.body = body; + } + + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } +} diff --git a/querydsl/src/main/java/org/baeldung/querydsl/intro/entities/User.java b/querydsl/src/main/java/org/baeldung/querydsl/intro/entities/User.java new file mode 100644 index 0000000000..c0681e15d1 --- /dev/null +++ b/querydsl/src/main/java/org/baeldung/querydsl/intro/entities/User.java @@ -0,0 +1,55 @@ +/* + * (c) Центр ИТ, 2016. Все права защищены. + */ +package org.baeldung.querydsl.intro.entities; + +import java.util.HashSet; +import java.util.Set; +import javax.persistence.*; + +@Entity +public class User { + + @Id + @GeneratedValue + private Long id; + + private String login; + + private Boolean disabled; + + @OneToMany(cascade = CascadeType.PERSIST, mappedBy = "user") + private Set blogPosts = new HashSet<>(0); + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getLogin() { + return login; + } + + public void setLogin(String name) { + this.login = name; + } + + public Set getBlogPosts() { + return blogPosts; + } + + public void setBlogPosts(Set blogPosts) { + this.blogPosts = blogPosts; + } + + public Boolean getDisabled() { + return disabled; + } + + public void setDisabled(Boolean disabled) { + this.disabled = disabled; + } +} diff --git a/querydsl/src/main/resources/META-INF/persistence.xml b/querydsl/src/main/resources/META-INF/persistence.xml index 111d7933c3..2964382d48 100644 --- a/querydsl/src/main/resources/META-INF/persistence.xml +++ b/querydsl/src/main/resources/META-INF/persistence.xml @@ -16,4 +16,17 @@ + + + org.hibernate.jpa.HibernatePersistenceProvider + + + + + + + + + + \ No newline at end of file diff --git a/querydsl/src/main/resources/log4j.xml b/querydsl/src/main/resources/logback.xml similarity index 53% rename from querydsl/src/main/resources/log4j.xml rename to querydsl/src/main/resources/logback.xml index a7f96b38a4..d0a1dc06ac 100644 --- a/querydsl/src/main/resources/log4j.xml +++ b/querydsl/src/main/resources/logback.xml @@ -1,12 +1,9 @@ - - + - - - - - + + + %d{yyyy-MM-dd HH:mm:ss} [%t] %-5p: %c - %m%n @@ -33,10 +30,8 @@ - - - - + + - \ No newline at end of file + \ No newline at end of file diff --git a/querydsl/src/test/java/org/baeldung/querydsl/intro/QueryDSLTest.java b/querydsl/src/test/java/org/baeldung/querydsl/intro/QueryDSLTest.java new file mode 100644 index 0000000000..682fa2c245 --- /dev/null +++ b/querydsl/src/test/java/org/baeldung/querydsl/intro/QueryDSLTest.java @@ -0,0 +1,215 @@ +/* + * (c) Центр ИТ, 2016. Все права защищены. + */ +package org.baeldung.querydsl.intro; + +import java.util.List; +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.Persistence; + +import org.baeldung.querydsl.intro.entities.BlogPost; +import org.baeldung.querydsl.intro.entities.QBlogPost; +import org.baeldung.querydsl.intro.entities.QUser; +import org.baeldung.querydsl.intro.entities.User; +import com.querydsl.core.Tuple; +import com.querydsl.core.types.dsl.Expressions; +import com.querydsl.core.types.dsl.NumberPath; +import com.querydsl.jpa.JPAExpressions; +import com.querydsl.jpa.impl.JPAQueryFactory; +import org.junit.*; + +import static org.junit.Assert.*; + +public class QueryDSLTest { + + private static EntityManagerFactory emf; + + private EntityManager em; + + private JPAQueryFactory queryFactory; + + @BeforeClass + public static void populateDatabase() { + emf = Persistence.createEntityManagerFactory("org.baeldung.querydsl.intro"); + EntityManager em = emf.createEntityManager(); + + em.getTransaction().begin(); + User user1 = new User(); + user1.setLogin("David"); + em.persist(user1); + + User user2 = new User(); + user2.setLogin("Ash"); + em.persist(user2); + + User user3 = new User(); + user3.setLogin("Call"); + em.persist(user3); + + User user4 = new User(); + user4.setLogin("Bishop"); + em.persist(user4); + + BlogPost blogPost1 = new BlogPost(); + blogPost1.setTitle("Hello World!"); + blogPost1.setUser(user1); + em.persist(blogPost1); + + BlogPost blogPost2 = new BlogPost(); + blogPost2.setTitle("My Second Post"); + blogPost2.setUser(user1); + em.persist(blogPost2); + + BlogPost blogPost3 = new BlogPost(); + blogPost3.setTitle("Hello World!"); + blogPost3.setUser(user3); + em.persist(blogPost3); + + em.getTransaction().commit(); + + em.close(); + + } + + @Before + public void setUp() { + em = emf.createEntityManager(); + em.getTransaction().begin(); + queryFactory = new JPAQueryFactory(em); + } + + @Test + public void whenFindByLogin_thenShouldReturnUser() { + + QUser user = QUser.user; + User aUser = queryFactory.selectFrom(user) + .where(user.login.eq("David")) + .fetchOne(); + + assertNotNull(aUser); + assertEquals(aUser.getLogin(), "David"); + + } + + @Test + public void whenUsingOrderBy_thenResultsShouldBeOrdered() { + + QUser user = QUser.user; + List users = queryFactory.selectFrom(user) + .orderBy(user.login.asc()) + .fetch(); + + assertEquals(users.size(), 4); + assertEquals(users.get(0).getLogin(), "Ash"); + assertEquals(users.get(1).getLogin(), "Bishop"); + assertEquals(users.get(2).getLogin(), "Call"); + assertEquals(users.get(3).getLogin(), "David"); + + } + + @Test + public void whenGroupingByTitle_thenReturnsTuples() { + + QBlogPost blogPost = QBlogPost.blogPost; + + NumberPath count = Expressions.numberPath(Long.class, "c"); + + List userTitleCounts = queryFactory.select(blogPost.title, blogPost.id.count().as(count)) + .from(blogPost) + .groupBy(blogPost.title) + .orderBy(count.desc()) + .fetch(); + + assertEquals("Hello World!", userTitleCounts.get(0).get(blogPost.title)); + assertEquals(new Long(2), userTitleCounts.get(0).get(count)); + + assertEquals("My Second Post", userTitleCounts.get(1).get(blogPost.title)); + assertEquals(new Long(1), userTitleCounts.get(1).get(count)); + + } + + @Test + public void whenJoiningWithCondition_thenResultCountShouldMatch() { + + QUser user = QUser.user; + QBlogPost blogPost = QBlogPost.blogPost; + + List users = queryFactory.selectFrom(user) + .innerJoin(user.blogPosts, blogPost) + .on(blogPost.title.eq("Hello World!")) + .fetch(); + + assertEquals(2, users.size()); + } + + @Test + public void whenRefiningWithSubquery_thenResultCountShouldMatch() { + + QUser user = QUser.user; + QBlogPost blogPost = QBlogPost.blogPost; + + List users = queryFactory.selectFrom(user) + .where(user.id.in( + JPAExpressions.select(blogPost.user.id) + .from(blogPost) + .where(blogPost.title.eq("Hello World!")))) + .fetch(); + + assertEquals(2, users.size()); + } + + @Test + public void whenUpdating_thenTheRecordShouldChange() { + + QUser user = QUser.user; + + queryFactory.update(user) + .where(user.login.eq("Ash")) + .set(user.login, "Ash2") + .set(user.disabled, true) + .execute(); + + em.getTransaction().commit(); + + em.getTransaction().begin(); + + assertEquals(Boolean.TRUE, + queryFactory.select(user.disabled) + .from(user) + .where(user.login.eq("Ash2")) + .fetchOne()); + + } + + @Test + public void whenDeleting_thenTheRecordShouldBeAbsent() { + + QUser user = QUser.user; + + queryFactory.delete(user) + .where(user.login.eq("Bishop")) + .execute(); + + em.getTransaction().commit(); + + em.getTransaction().begin(); + + assertNull(queryFactory.selectFrom(user) + .where(user.login.eq("Bishop")) + .fetchOne()); + + } + + @After + public void tearDown() { + em.getTransaction().commit(); + em.close(); + } + + @AfterClass + public static void afterClass() { + emf.close(); + } + +} From 710182ff920d97b8f6bfdc6af8739486e4a6a79e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Gonz=C3=A1lez?= Date: Wed, 6 Jul 2016 09:36:46 +0200 Subject: [PATCH 14/24] Code for JMockit 101 (#479) * Add new module for mocks comparison. * Add sources for testing. * Changes on testCase. * Enter some tests for mockito. * More tests for Mockito. * Even more tests. * Add the rest of the mocking libraries. * Javadoc on test. * Test bare bones for EasyMock. * Fist kind of test and setup. * Add tests using EasyMock with a change on LoginService. * Create LoginControllerTest.java * Test setup * [JMockit] No method called test. * [JMockit] Two methods called test. * [JMockit] One method called test. * [JMockit] Exception mock test * [JMockit] Mocked object to pass around test. * [JMockit] Custom matcher test. * [JMockit] Partial mocking test. * [JMockit] Fix with IDE. * Not stubs. Mocks. MOCKS!!! * Remove unnecesary import. * Use correct encoding. Was having problems with buildings. * Remove failing module. * Create new module mocks and move mock-comparisons there. * Add jmockit module. * Add model class. * Add collaborator class. * Add performer class. * Add performer test. --- mocks/jmockit/README.md | 7 ++ mocks/jmockit/pom.xml | 68 +++++++++++++++++++ .../baeldung/mocks/jmockit/Collaborator.java | 10 +++ .../org/baeldung/mocks/jmockit/Model.java | 7 ++ .../org/baeldung/mocks/jmockit/Performer.java | 10 +++ .../baeldung/mocks/jmockit/PerformerTest.java | 30 ++++++++ .../mock-comparisons}/README.md | 0 .../mock-comparisons}/pom.xml | 13 ++-- .../mocks/testCase/LoginController.java | 0 .../org/baeldung/mocks/testCase/LoginDao.java | 0 .../baeldung/mocks/testCase/LoginService.java | 0 .../org/baeldung/mocks/testCase/UserForm.java | 0 .../mocks/easymock/LoginControllerTest.java | 0 .../mocks/jmockit/LoginControllerTest.java | 0 .../mocks/mockito/LoginControllerTest.java | 0 mocks/pom.xml | 20 ++++++ pom.xml | 8 ++- 17 files changed, 167 insertions(+), 6 deletions(-) create mode 100644 mocks/jmockit/README.md create mode 100644 mocks/jmockit/pom.xml create mode 100644 mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Collaborator.java create mode 100644 mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Model.java create mode 100644 mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Performer.java create mode 100644 mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/PerformerTest.java rename {mock-comparisons => mocks/mock-comparisons}/README.md (100%) rename {mock-comparisons => mocks/mock-comparisons}/pom.xml (90%) rename {mock-comparisons => mocks/mock-comparisons}/src/main/java/org/baeldung/mocks/testCase/LoginController.java (100%) rename {mock-comparisons => mocks/mock-comparisons}/src/main/java/org/baeldung/mocks/testCase/LoginDao.java (100%) rename {mock-comparisons => mocks/mock-comparisons}/src/main/java/org/baeldung/mocks/testCase/LoginService.java (100%) rename {mock-comparisons => mocks/mock-comparisons}/src/main/java/org/baeldung/mocks/testCase/UserForm.java (100%) rename {mock-comparisons => mocks/mock-comparisons}/src/test/java/org/baeldung/mocks/easymock/LoginControllerTest.java (100%) rename {mock-comparisons => mocks/mock-comparisons}/src/test/java/org/baeldung/mocks/jmockit/LoginControllerTest.java (100%) rename {mock-comparisons => mocks/mock-comparisons}/src/test/java/org/baeldung/mocks/mockito/LoginControllerTest.java (100%) create mode 100644 mocks/pom.xml diff --git a/mocks/jmockit/README.md b/mocks/jmockit/README.md new file mode 100644 index 0000000000..f5b0f5ae2b --- /dev/null +++ b/mocks/jmockit/README.md @@ -0,0 +1,7 @@ +========= + +## JMockit realated tutorials + + +### Relevant Articles: +- [JMockit 101](http://www.baeldung.com/jmockit-101) diff --git a/mocks/jmockit/pom.xml b/mocks/jmockit/pom.xml new file mode 100644 index 0000000000..8b03313a51 --- /dev/null +++ b/mocks/jmockit/pom.xml @@ -0,0 +1,68 @@ + + 4.0.0 + + + com.baeldung + mocks + 1.0.0-SNAPSHOT + ../pom.xml + + + jmockit + jmockit + + + 4.12 + 1.24 + + + 3.3 + 2.18.1 + + + + + junit + junit + ${junit.version} + test + + + + org.jmockit + jmockit + ${jmockit.version} + test + + + + + jmockit + + + src/main/resources + true + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + 1.8 + 1.8 + + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + + + + + \ No newline at end of file diff --git a/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Collaborator.java b/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Collaborator.java new file mode 100644 index 0000000000..ef271b9aff --- /dev/null +++ b/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Collaborator.java @@ -0,0 +1,10 @@ +package org.baeldung.mocks.jmockit; + +public class Collaborator { + public boolean collaborate(String string){ + return false; + } + public void receive(boolean bool){ + //NOOP + } +} diff --git a/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Model.java b/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Model.java new file mode 100644 index 0000000000..54249dcd1d --- /dev/null +++ b/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Model.java @@ -0,0 +1,7 @@ +package org.baeldung.mocks.jmockit; + +public class Model { + public String getInfo(){ + return "info"; + } +} diff --git a/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Performer.java b/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Performer.java new file mode 100644 index 0000000000..4f8e8adb24 --- /dev/null +++ b/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Performer.java @@ -0,0 +1,10 @@ +package org.baeldung.mocks.jmockit; + +public class Performer { + private Collaborator collaborator; + + public void perform(Model model){ + boolean value = collaborator.collaborate(model.getInfo()); + collaborator.receive(value); + } +} diff --git a/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/PerformerTest.java b/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/PerformerTest.java new file mode 100644 index 0000000000..c99ae844c3 --- /dev/null +++ b/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/PerformerTest.java @@ -0,0 +1,30 @@ +package org.baeldung.mocks.jmockit; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import mockit.*; +import mockit.integration.junit4.JMockit; + +@RunWith(JMockit.class) +public class PerformerTest { + + @Injectable + private Collaborator collaborator; + + @Tested + private Performer performer; + + @Test + public void testThePerformMethod(@Mocked Model model) { + new Expectations() {{ + model.getInfo();result = "bar"; + collaborator.collaborate("bar"); result = true; + }}; + performer.perform(model); + new Verifications() {{ + collaborator.receive(true); + }}; + } + +} diff --git a/mock-comparisons/README.md b/mocks/mock-comparisons/README.md similarity index 100% rename from mock-comparisons/README.md rename to mocks/mock-comparisons/README.md diff --git a/mock-comparisons/pom.xml b/mocks/mock-comparisons/pom.xml similarity index 90% rename from mock-comparisons/pom.xml rename to mocks/mock-comparisons/pom.xml index c5424d262d..692bfffd53 100644 --- a/mock-comparisons/pom.xml +++ b/mocks/mock-comparisons/pom.xml @@ -1,11 +1,16 @@ 4.0.0 - org.baeldung - mock-comparisons - 0.1-SNAPSHOT - mockito + + com.baeldung + mocks + 1.0.0-SNAPSHOT + ../pom.xml + + + mock-comparisons + mock-comparisons 4.12 diff --git a/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginController.java b/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginController.java similarity index 100% rename from mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginController.java rename to mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginController.java diff --git a/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginDao.java b/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginDao.java similarity index 100% rename from mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginDao.java rename to mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginDao.java diff --git a/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginService.java b/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginService.java similarity index 100% rename from mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginService.java rename to mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginService.java diff --git a/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/UserForm.java b/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/UserForm.java similarity index 100% rename from mock-comparisons/src/main/java/org/baeldung/mocks/testCase/UserForm.java rename to mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/UserForm.java diff --git a/mock-comparisons/src/test/java/org/baeldung/mocks/easymock/LoginControllerTest.java b/mocks/mock-comparisons/src/test/java/org/baeldung/mocks/easymock/LoginControllerTest.java similarity index 100% rename from mock-comparisons/src/test/java/org/baeldung/mocks/easymock/LoginControllerTest.java rename to mocks/mock-comparisons/src/test/java/org/baeldung/mocks/easymock/LoginControllerTest.java diff --git a/mock-comparisons/src/test/java/org/baeldung/mocks/jmockit/LoginControllerTest.java b/mocks/mock-comparisons/src/test/java/org/baeldung/mocks/jmockit/LoginControllerTest.java similarity index 100% rename from mock-comparisons/src/test/java/org/baeldung/mocks/jmockit/LoginControllerTest.java rename to mocks/mock-comparisons/src/test/java/org/baeldung/mocks/jmockit/LoginControllerTest.java diff --git a/mock-comparisons/src/test/java/org/baeldung/mocks/mockito/LoginControllerTest.java b/mocks/mock-comparisons/src/test/java/org/baeldung/mocks/mockito/LoginControllerTest.java similarity index 100% rename from mock-comparisons/src/test/java/org/baeldung/mocks/mockito/LoginControllerTest.java rename to mocks/mock-comparisons/src/test/java/org/baeldung/mocks/mockito/LoginControllerTest.java diff --git a/mocks/pom.xml b/mocks/pom.xml new file mode 100644 index 0000000000..ec02c255ef --- /dev/null +++ b/mocks/pom.xml @@ -0,0 +1,20 @@ + + 4.0.0 + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + ../pom.xml + + + mocks + mocks + pom + + + mock-comparisons + jmockit + + + diff --git a/pom.xml b/pom.xml index 75281ce80d..f6dda4efd1 100644 --- a/pom.xml +++ b/pom.xml @@ -7,8 +7,12 @@ parent-modules pom + + + UTF-8 + + - apache-fop assertj core-java @@ -25,7 +29,7 @@ jooq-spring json-path mockito - mock-comparisons + mocks jee7schedule querydsl From 10b57805768041eab3b501da560a1b27d06ee71b Mon Sep 17 00:00:00 2001 From: Grzegorz Piwowarek Date: Wed, 6 Jul 2016 09:40:50 +0200 Subject: [PATCH 15/24] Fix typo --- mocks/jmockit/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mocks/jmockit/README.md b/mocks/jmockit/README.md index f5b0f5ae2b..c310463c26 100644 --- a/mocks/jmockit/README.md +++ b/mocks/jmockit/README.md @@ -1,6 +1,6 @@ ========= -## JMockit realated tutorials +## JMockit related tutorials ### Relevant Articles: From 3b9e4c7a567054f3113aa3554e2c59eaa30d1f93 Mon Sep 17 00:00:00 2001 From: Slavisa Baeldung Date: Wed, 6 Jul 2016 13:24:52 +0200 Subject: [PATCH 16/24] BAEL-151 - Adding EL dependency --- jsf/pom.xml | 7 + .../{ => controllers}/ELSampleBean.java | 228 +++++++++--------- 2 files changed, 117 insertions(+), 118 deletions(-) rename jsf/src/main/java/com/baeldung/springintegration/{ => controllers}/ELSampleBean.java (80%) diff --git a/jsf/pom.xml b/jsf/pom.xml index c4801996de..b5fbae4cf0 100644 --- a/jsf/pom.xml +++ b/jsf/pom.xml @@ -25,6 +25,12 @@ jsf-impl ${com.sun.faces.version} + + javax.el + el-api + ${javax.el.version} + + @@ -114,6 +120,7 @@ 2.1.7 + 2.2 1.7.13 diff --git a/jsf/src/main/java/com/baeldung/springintegration/ELSampleBean.java b/jsf/src/main/java/com/baeldung/springintegration/controllers/ELSampleBean.java similarity index 80% rename from jsf/src/main/java/com/baeldung/springintegration/ELSampleBean.java rename to jsf/src/main/java/com/baeldung/springintegration/controllers/ELSampleBean.java index 32076bcbad..a13f0890b5 100644 --- a/jsf/src/main/java/com/baeldung/springintegration/ELSampleBean.java +++ b/jsf/src/main/java/com/baeldung/springintegration/controllers/ELSampleBean.java @@ -1,118 +1,110 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ -package com.baeldung.el.controllers; - -import java.util.Random; -import javax.annotation.PostConstruct; -import javax.faces.application.Application; -import javax.faces.application.FacesMessage; -import javax.faces.bean.ManagedBean; -import javax.faces.bean.ViewScoped; -import javax.faces.component.html.HtmlInputText; -import javax.faces.context.FacesContext; - -/** - * - * @author Tayo - */ -@ManagedBean(name = "ELBean") -@ViewScoped -public class ELSampleBean { - - private String firstName; - private String lastName; - private String pageDescription = "This page demos JSF EL Basics"; - private int pageCounter; - private Random randomIntGen = new Random(); - - @PostConstruct - public void init() { - pageCounter = randomIntGen.nextInt(); - } - - public void save(){ - - } - - public void saveFirstName(String firstName) { - this.firstName = firstName; - } - - - public void saveByELEvaluation(){ - firstName = (String)evaluateEL("#{firstName.value}", String.class); - FacesContext ctx = FacesContext.getCurrentInstance(); - FacesMessage theMessage = new FacesMessage("Name component Evaluated: "+firstName); - theMessage.setSeverity(FacesMessage.SEVERITY_INFO); - ctx.addMessage(null,theMessage); - - } - - private Object evaluateEL(String elExpression, Class clazz) { - Object toReturn = null; - FacesContext ctx = FacesContext.getCurrentInstance(); - Application app = ctx.getApplication(); - toReturn = app.evaluateExpressionGet(ctx, elExpression, clazz); - - return toReturn; - - } - - /** - * @return the firstName - */ - public String getFirstName() { - return firstName; - } - - /** - * @param firstName the firstName to set - */ - public void setFirstName(String firstName) { - this.firstName = firstName; - } - - /** - * @return the lastName - */ - public String getLastName() { - return lastName; - } - - /** - * @param lastName the lastName to set - */ - public void setLastName(String lastName) { - this.lastName = lastName; - } - - /** - * @return the pageDescription - */ - public String getPageDescription() { - return pageDescription; - } - - /** - * @param pageDescription the pageDescription to set - */ - public void setPageDescription(String pageDescription) { - this.pageDescription = pageDescription; - } - - /** - * @return the pageCounter - */ - public int getPageCounter() { - return pageCounter; - } - - /** - * @param pageCounter the pageCounter to set - */ - public void setPageCounter(int pageCounter) { - this.pageCounter = pageCounter; - } -} +package com.baeldung.springintegration.controllers; + +import java.util.Random; +import javax.annotation.PostConstruct; +import javax.faces.application.Application; +import javax.faces.application.FacesMessage; +import javax.faces.bean.ManagedBean; +import javax.faces.bean.ViewScoped; +import javax.faces.component.html.HtmlInputText; +import javax.faces.context.FacesContext; + +@ManagedBean(name = "ELBean") +@ViewScoped +public class ELSampleBean { + + private String firstName; + private String lastName; + private String pageDescription = "This page demos JSF EL Basics"; + private int pageCounter; + private Random randomIntGen = new Random(); + + @PostConstruct + public void init() { + pageCounter = randomIntGen.nextInt(); + } + + public void save() { + + } + + public void saveFirstName(String firstName) { + this.firstName = firstName; + } + + + public void saveByELEvaluation() { + firstName = (String) evaluateEL("#{firstName.value}", String.class); + FacesContext ctx = FacesContext.getCurrentInstance(); + FacesMessage theMessage = new FacesMessage("Name component Evaluated: " + firstName); + theMessage.setSeverity(FacesMessage.SEVERITY_INFO); + ctx.addMessage(null, theMessage); + + } + + private Object evaluateEL(String elExpression, Class clazz) { + Object toReturn = null; + FacesContext ctx = FacesContext.getCurrentInstance(); + Application app = ctx.getApplication(); + toReturn = app.evaluateExpressionGet(ctx, elExpression, clazz); + + return toReturn; + + } + + /** + * @return the firstName + */ + public String getFirstName() { + return firstName; + } + + /** + * @param firstName the firstName to set + */ + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + /** + * @return the lastName + */ + public String getLastName() { + return lastName; + } + + /** + * @param lastName the lastName to set + */ + public void setLastName(String lastName) { + this.lastName = lastName; + } + + /** + * @return the pageDescription + */ + public String getPageDescription() { + return pageDescription; + } + + /** + * @param pageDescription the pageDescription to set + */ + public void setPageDescription(String pageDescription) { + this.pageDescription = pageDescription; + } + + /** + * @return the pageCounter + */ + public int getPageCounter() { + return pageCounter; + } + + /** + * @param pageCounter the pageCounter to set + */ + public void setPageCounter(int pageCounter) { + this.pageCounter = pageCounter; + } +} From 551272306e00d261f9bc087526a6b8a7b0180513 Mon Sep 17 00:00:00 2001 From: GuenHamza Date: Thu, 7 Jul 2016 03:25:28 +0000 Subject: [PATCH 17/24] Added SQL file to insert stored procedures in the MySQL database --- .../src/main/stored_procedure.sql | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 spring-hibernate4/src/main/stored_procedure.sql diff --git a/spring-hibernate4/src/main/stored_procedure.sql b/spring-hibernate4/src/main/stored_procedure.sql new file mode 100644 index 0000000000..8e1bdf57dd --- /dev/null +++ b/spring-hibernate4/src/main/stored_procedure.sql @@ -0,0 +1,20 @@ +DELIMITER // + CREATE PROCEDURE GetFoosByName(IN fooName VARCHAR(255)) + LANGUAGE SQL + DETERMINISTIC + SQL SECURITY DEFINER + BEGIN + SELECT * FROM foo WHERE name = fooName; + END // +DELIMITER ; + + +DELIMITER // + CREATE PROCEDURE GetAllFoos() + LANGUAGE SQL + DETERMINISTIC + SQL SECURITY DEFINER + BEGIN + SELECT * FROM foo; + END // +DELIMITER ; \ No newline at end of file From 2fff05a4b51ec7bababf50dac512ec412150284d Mon Sep 17 00:00:00 2001 From: GuenHamza Date: Thu, 7 Jul 2016 03:27:03 +0000 Subject: [PATCH 18/24] Added SQL file to insert stored procedures in the MySQL database --- .../src/main/resources/stored_procedure.sql | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 spring-hibernate4/src/main/resources/stored_procedure.sql diff --git a/spring-hibernate4/src/main/resources/stored_procedure.sql b/spring-hibernate4/src/main/resources/stored_procedure.sql new file mode 100644 index 0000000000..8e1bdf57dd --- /dev/null +++ b/spring-hibernate4/src/main/resources/stored_procedure.sql @@ -0,0 +1,20 @@ +DELIMITER // + CREATE PROCEDURE GetFoosByName(IN fooName VARCHAR(255)) + LANGUAGE SQL + DETERMINISTIC + SQL SECURITY DEFINER + BEGIN + SELECT * FROM foo WHERE name = fooName; + END // +DELIMITER ; + + +DELIMITER // + CREATE PROCEDURE GetAllFoos() + LANGUAGE SQL + DETERMINISTIC + SQL SECURITY DEFINER + BEGIN + SELECT * FROM foo; + END // +DELIMITER ; \ No newline at end of file From ff4b5d26b0ebc50aa36499711508ca9ae8fa4854 Mon Sep 17 00:00:00 2001 From: GuenHamza Date: Thu, 7 Jul 2016 03:28:12 +0000 Subject: [PATCH 19/24] Removed SQL file, to move to resources folder --- .../src/main/stored_procedure.sql | 20 ------------------- 1 file changed, 20 deletions(-) delete mode 100644 spring-hibernate4/src/main/stored_procedure.sql diff --git a/spring-hibernate4/src/main/stored_procedure.sql b/spring-hibernate4/src/main/stored_procedure.sql deleted file mode 100644 index 8e1bdf57dd..0000000000 --- a/spring-hibernate4/src/main/stored_procedure.sql +++ /dev/null @@ -1,20 +0,0 @@ -DELIMITER // - CREATE PROCEDURE GetFoosByName(IN fooName VARCHAR(255)) - LANGUAGE SQL - DETERMINISTIC - SQL SECURITY DEFINER - BEGIN - SELECT * FROM foo WHERE name = fooName; - END // -DELIMITER ; - - -DELIMITER // - CREATE PROCEDURE GetAllFoos() - LANGUAGE SQL - DETERMINISTIC - SQL SECURITY DEFINER - BEGIN - SELECT * FROM foo; - END // -DELIMITER ; \ No newline at end of file From 95e6cb16d72bda59a9321702d6f681f77c461cbc Mon Sep 17 00:00:00 2001 From: GuenHamza Date: Thu, 7 Jul 2016 03:30:06 +0000 Subject: [PATCH 20/24] Added named queries to Foo Model --- .../com/baeldung/persistence/model/Foo.java | 136 +++++++++--------- 1 file changed, 70 insertions(+), 66 deletions(-) diff --git a/spring-hibernate4/src/main/java/com/baeldung/persistence/model/Foo.java b/spring-hibernate4/src/main/java/com/baeldung/persistence/model/Foo.java index 6b48c1fa66..bdd48d6aa6 100644 --- a/spring-hibernate4/src/main/java/com/baeldung/persistence/model/Foo.java +++ b/spring-hibernate4/src/main/java/com/baeldung/persistence/model/Foo.java @@ -11,93 +11,97 @@ import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; +import javax.persistence.NamedNativeQueries; +import javax.persistence.NamedNativeQuery; import org.hibernate.envers.Audited; +@NamedNativeQueries({ + @NamedNativeQuery(name = "callGetAllFoos", query = "CALL GetAllFoos()", resultClass = Foo.class), + @NamedNativeQuery(name = "callGetFoosByName", query = "CALL GetFoosByName(:fooName)", resultClass = Foo.class) }) @Entity @Audited // @Proxy(lazy = false) public class Foo implements Serializable { - @Id - @GeneratedValue(strategy = GenerationType.AUTO) - @Column(name = "id") - private long id; + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name = "id") + private long id; - @Column(name = "name") - private String name; + @Column(name = "name") + private String name; - @ManyToOne(targetEntity = Bar.class, cascade = CascadeType.ALL, fetch = FetchType.EAGER) - @JoinColumn(name = "BAR_ID") - private Bar bar = new Bar(); + @ManyToOne(targetEntity = Bar.class, cascade = CascadeType.ALL, fetch = FetchType.EAGER) + @JoinColumn(name = "BAR_ID") + private Bar bar = new Bar(); - public Foo() { - super(); - } + public Foo() { + super(); + } - public Foo(final String name) { - super(); - this.name = name; - } + public Foo(final String name) { + super(); + this.name = name; + } - // + // - public Bar getBar() { - return bar; - } + public Bar getBar() { + return bar; + } - public void setBar(final Bar bar) { - this.bar = bar; - } + public void setBar(final Bar bar) { + this.bar = bar; + } - public long getId() { - return id; - } + public long getId() { + return id; + } - public void setId(final long id) { - this.id = id; - } + public void setId(final long id) { + this.id = id; + } - public String getName() { - return name; - } + public String getName() { + return name; + } - public void setName(final String name) { - this.name = name; - } + public void setName(final String name) { + this.name = name; + } - // + // - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((name == null) ? 0 : name.hashCode()); - return result; - } + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((name == null) ? 0 : name.hashCode()); + return result; + } - @Override - public boolean equals(final Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - final Foo other = (Foo) obj; - if (name == null) { - if (other.name != null) - return false; - } else if (!name.equals(other.name)) - return false; - return true; - } - - @Override - public String toString() { - final StringBuilder builder = new StringBuilder(); - builder.append("Foo [name=").append(name).append("]"); - return builder.toString(); - } + @Override + public boolean equals(final Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + final Foo other = (Foo) obj; + if (name == null) { + if (other.name != null) + return false; + } else if (!name.equals(other.name)) + return false; + return true; + } + @Override + public String toString() { + final StringBuilder builder = new StringBuilder(); + builder.append("Foo [name=").append(name).append("]"); + return builder.toString(); + } } From 7eb04b4ea5679755520ab6256ba4bf8c804b7829 Mon Sep 17 00:00:00 2001 From: GuenHamza Date: Thu, 7 Jul 2016 03:32:37 +0000 Subject: [PATCH 21/24] Added Foo stored procedures tests --- .../FooStoredProceduresIntegrationTest.java | 128 ++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 spring-hibernate4/src/test/java/com/baeldung/persistence/service/FooStoredProceduresIntegrationTest.java diff --git a/spring-hibernate4/src/test/java/com/baeldung/persistence/service/FooStoredProceduresIntegrationTest.java b/spring-hibernate4/src/test/java/com/baeldung/persistence/service/FooStoredProceduresIntegrationTest.java new file mode 100644 index 0000000000..b9cc8bc474 --- /dev/null +++ b/spring-hibernate4/src/test/java/com/baeldung/persistence/service/FooStoredProceduresIntegrationTest.java @@ -0,0 +1,128 @@ +package com.baeldung.persistence.service; + +import java.util.List; + +import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; +import static org.junit.Assert.assertEquals; + +import org.hibernate.Query; +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.exception.SQLGrammarException; +import org.junit.After; +import org.junit.Assume; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.support.AnnotationConfigContextLoader; + +import com.baeldung.persistence.model.Foo; +import com.baeldung.spring.PersistenceConfig; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = { PersistenceConfig.class }, loader = AnnotationConfigContextLoader.class) +public class FooStoredProceduresIntegrationTest { + + @Autowired + private SessionFactory sessionFactory; + + @Autowired + private IFooService fooService; + + private Session session; + + @Before + public final void before() { + session = sessionFactory.openSession(); + Assume.assumeTrue(getAllFoosExists()); + Assume.assumeTrue(getFoosByNameExists()); + } + + private boolean getFoosByNameExists() { + try { + Query sqlQuery = session.createSQLQuery("CALL GetAllFoos()") + .addEntity(Foo.class); + sqlQuery.list(); + return true; + } catch (SQLGrammarException e) { + System.out + .println("WARNING : GetFoosByName() Procedure is may be missing "); + return false; + } + } + + private boolean getAllFoosExists() { + try { + Query sqlQuery = session.createSQLQuery("CALL GetAllFoos()") + .addEntity(Foo.class); + sqlQuery.list(); + return true; + } catch (SQLGrammarException e) { + System.out + .println("WARNING : GetAllFoos() Procedure is may be missing "); + return false; + } + } + + @After + public final void after() { + session.close(); + } + + @Test + public final void getAllFoosUsingStoredProcedures() { + + fooService.create(new Foo(randomAlphabetic(6))); + + // Stored procedure getAllFoos using createSQLQuery + Query sqlQuery = session.createSQLQuery("CALL GetAllFoos()").addEntity( + Foo.class); + @SuppressWarnings("unchecked") + List allFoos = sqlQuery.list(); + for (Foo foo : allFoos) { + System.out.println("getAllFoos() SQL Query result : " + + foo.getName()); + } + assertEquals(allFoos.size(), fooService.findAll().size()); + + // Stored procedure getAllFoos using a Named Query + Query namedQuery = session.getNamedQuery("callGetAllFoos"); + @SuppressWarnings("unchecked") + List allFoos2 = namedQuery.list(); + for (Foo foo : allFoos2) { + System.out.println("getAllFoos() NamedQuery result : " + + foo.getName()); + } + assertEquals(allFoos2.size(), fooService.findAll().size()); + } + + @Test + public final void getFoosByNameUsingStoredProcedures() { + + fooService.create(new Foo("NewFooName")); + + // Stored procedure getFoosByName using createSQLQuery() + Query sqlQuery = session.createSQLQuery("CALL GetFoosByName(:fooName)") + .addEntity(Foo.class).setParameter("fooName", "NewFooName"); + @SuppressWarnings("unchecked") + List allFoosByName = sqlQuery.list(); + for (Foo foo : allFoosByName) { + System.out.println("getFoosByName() using SQL Query : found => " + + foo.toString()); + } + + // Stored procedure getFoosByName using getNamedQuery() + Query namedQuery = session.getNamedQuery("callGetFoosByName") + .setParameter("fooName", "NewFooName"); + @SuppressWarnings("unchecked") + List allFoosByName2 = namedQuery.list(); + for (Foo foo : allFoosByName2) { + System.out.println("getFoosByName() using Native Query : found => " + + foo.toString()); + } + + } +} From 11bc145948b515274b94ea542a345b6edc6ceb99 Mon Sep 17 00:00:00 2001 From: GuenHamza Date: Thu, 7 Jul 2016 03:38:09 +0000 Subject: [PATCH 22/24] Update README.md - added link to stored procedure article --- spring-hibernate4/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-hibernate4/README.md b/spring-hibernate4/README.md index 4c0c6706d6..4b48fe7064 100644 --- a/spring-hibernate4/README.md +++ b/spring-hibernate4/README.md @@ -8,7 +8,7 @@ - [Hibernate Pagination](http://www.baeldung.com/hibernate-pagination) - [Sorting with Hibernate](http://www.baeldung.com/hibernate-sort) - [Auditing with JPA, Hibernate, and Spring Data JPA](http://www.baeldung.com/database-auditing-jpa) - +- [Stored Procedures with Hibernate](http://www.baeldung.com/stored-procedures-with-hibernate-tutorial) ### Quick Start From 30f00a34afe22abb35d9f69c2238354e71846bde Mon Sep 17 00:00:00 2001 From: Slavisa Baeldung Date: Thu, 7 Jul 2016 15:42:13 +0200 Subject: [PATCH 23/24] BAEL-65 - moving from sout to logger --- .../FooStoredProceduresIntegrationTest.java | 168 +++++++++--------- 1 file changed, 83 insertions(+), 85 deletions(-) diff --git a/spring-hibernate4/src/test/java/com/baeldung/persistence/service/FooStoredProceduresIntegrationTest.java b/spring-hibernate4/src/test/java/com/baeldung/persistence/service/FooStoredProceduresIntegrationTest.java index b9cc8bc474..238b228101 100644 --- a/spring-hibernate4/src/test/java/com/baeldung/persistence/service/FooStoredProceduresIntegrationTest.java +++ b/spring-hibernate4/src/test/java/com/baeldung/persistence/service/FooStoredProceduresIntegrationTest.java @@ -14,6 +14,8 @@ import org.junit.Assume; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @@ -23,106 +25,102 @@ import com.baeldung.persistence.model.Foo; import com.baeldung.spring.PersistenceConfig; @RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = { PersistenceConfig.class }, loader = AnnotationConfigContextLoader.class) +@ContextConfiguration(classes = {PersistenceConfig.class}, loader = AnnotationConfigContextLoader.class) public class FooStoredProceduresIntegrationTest { - @Autowired - private SessionFactory sessionFactory; + private static final Logger LOGGER = LoggerFactory.getLogger(FooStoredProceduresIntegrationTest.class); - @Autowired - private IFooService fooService; + @Autowired + private SessionFactory sessionFactory; - private Session session; + @Autowired + private IFooService fooService; - @Before - public final void before() { - session = sessionFactory.openSession(); - Assume.assumeTrue(getAllFoosExists()); - Assume.assumeTrue(getFoosByNameExists()); - } + private Session session; - private boolean getFoosByNameExists() { - try { - Query sqlQuery = session.createSQLQuery("CALL GetAllFoos()") - .addEntity(Foo.class); - sqlQuery.list(); - return true; - } catch (SQLGrammarException e) { - System.out - .println("WARNING : GetFoosByName() Procedure is may be missing "); - return false; - } - } + @Before + public final void before() { + session = sessionFactory.openSession(); + Assume.assumeTrue(getAllFoosExists()); + Assume.assumeTrue(getFoosByNameExists()); + } - private boolean getAllFoosExists() { - try { - Query sqlQuery = session.createSQLQuery("CALL GetAllFoos()") - .addEntity(Foo.class); - sqlQuery.list(); - return true; - } catch (SQLGrammarException e) { - System.out - .println("WARNING : GetAllFoos() Procedure is may be missing "); - return false; - } - } + private boolean getFoosByNameExists() { + try { + Query sqlQuery = session.createSQLQuery("CALL GetAllFoos()") + .addEntity(Foo.class); + sqlQuery.list(); + return true; + } catch (SQLGrammarException e) { + LOGGER.error("WARNING : GetFoosByName() Procedure is may be missing ", e); + return false; + } + } - @After - public final void after() { - session.close(); - } + private boolean getAllFoosExists() { + try { + Query sqlQuery = session.createSQLQuery("CALL GetAllFoos()") + .addEntity(Foo.class); + sqlQuery.list(); + return true; + } catch (SQLGrammarException e) { + LOGGER.error("WARNING : GetAllFoos() Procedure is may be missing ", e); + return false; + } + } - @Test - public final void getAllFoosUsingStoredProcedures() { + @After + public final void after() { + session.close(); + } - fooService.create(new Foo(randomAlphabetic(6))); + @Test + public final void getAllFoosUsingStoredProcedures() { - // Stored procedure getAllFoos using createSQLQuery - Query sqlQuery = session.createSQLQuery("CALL GetAllFoos()").addEntity( - Foo.class); - @SuppressWarnings("unchecked") - List allFoos = sqlQuery.list(); - for (Foo foo : allFoos) { - System.out.println("getAllFoos() SQL Query result : " - + foo.getName()); - } - assertEquals(allFoos.size(), fooService.findAll().size()); + fooService.create(new Foo(randomAlphabetic(6))); - // Stored procedure getAllFoos using a Named Query - Query namedQuery = session.getNamedQuery("callGetAllFoos"); - @SuppressWarnings("unchecked") - List allFoos2 = namedQuery.list(); - for (Foo foo : allFoos2) { - System.out.println("getAllFoos() NamedQuery result : " - + foo.getName()); - } - assertEquals(allFoos2.size(), fooService.findAll().size()); - } + // Stored procedure getAllFoos using createSQLQuery + Query sqlQuery = session.createSQLQuery("CALL GetAllFoos()").addEntity( + Foo.class); + @SuppressWarnings("unchecked") + List allFoos = sqlQuery.list(); + for (Foo foo : allFoos) { + LOGGER.info("getAllFoos() SQL Query result : {}", foo.getName()); + } + assertEquals(allFoos.size(), fooService.findAll().size()); - @Test - public final void getFoosByNameUsingStoredProcedures() { + // Stored procedure getAllFoos using a Named Query + Query namedQuery = session.getNamedQuery("callGetAllFoos"); + @SuppressWarnings("unchecked") + List allFoos2 = namedQuery.list(); + for (Foo foo : allFoos2) { + LOGGER.info("getAllFoos() NamedQuery result : {}", foo.getName()); + } + assertEquals(allFoos2.size(), fooService.findAll().size()); + } - fooService.create(new Foo("NewFooName")); + @Test + public final void getFoosByNameUsingStoredProcedures() { - // Stored procedure getFoosByName using createSQLQuery() - Query sqlQuery = session.createSQLQuery("CALL GetFoosByName(:fooName)") - .addEntity(Foo.class).setParameter("fooName", "NewFooName"); - @SuppressWarnings("unchecked") - List allFoosByName = sqlQuery.list(); - for (Foo foo : allFoosByName) { - System.out.println("getFoosByName() using SQL Query : found => " - + foo.toString()); - } + fooService.create(new Foo("NewFooName")); - // Stored procedure getFoosByName using getNamedQuery() - Query namedQuery = session.getNamedQuery("callGetFoosByName") - .setParameter("fooName", "NewFooName"); - @SuppressWarnings("unchecked") - List allFoosByName2 = namedQuery.list(); - for (Foo foo : allFoosByName2) { - System.out.println("getFoosByName() using Native Query : found => " - + foo.toString()); - } + // Stored procedure getFoosByName using createSQLQuery() + Query sqlQuery = session.createSQLQuery("CALL GetFoosByName(:fooName)") + .addEntity(Foo.class).setParameter("fooName", "NewFooName"); + @SuppressWarnings("unchecked") + List allFoosByName = sqlQuery.list(); + for (Foo foo : allFoosByName) { + LOGGER.info("getFoosByName() using SQL Query : found => {}", foo.toString()); + } - } + // Stored procedure getFoosByName using getNamedQuery() + Query namedQuery = session.getNamedQuery("callGetFoosByName") + .setParameter("fooName", "NewFooName"); + @SuppressWarnings("unchecked") + List allFoosByName2 = namedQuery.list(); + for (Foo foo : allFoosByName2) { + LOGGER.info("getFoosByName() using Native Query : found => {}", foo.toString()); + } + + } } From 9257da4b4480bb07c1ec5919093cdbca2c263259 Mon Sep 17 00:00:00 2001 From: Grzegorz Piwowarek Date: Thu, 7 Jul 2016 22:45:27 +0200 Subject: [PATCH 24/24] Use interface instead of the implementation --- .../com/baeldung/assertj/introduction/AssertJGuavaTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/assertj/src/test/java/com/baeldung/assertj/introduction/AssertJGuavaTest.java b/assertj/src/test/java/com/baeldung/assertj/introduction/AssertJGuavaTest.java index 9c51af3ee9..558ce87d70 100644 --- a/assertj/src/test/java/com/baeldung/assertj/introduction/AssertJGuavaTest.java +++ b/assertj/src/test/java/com/baeldung/assertj/introduction/AssertJGuavaTest.java @@ -6,6 +6,7 @@ import com.google.common.collect.Multimap; import com.google.common.collect.Multimaps; import com.google.common.collect.Range; import com.google.common.collect.Sets; +import com.google.common.collect.Table; import com.google.common.collect.TreeRangeMap; import com.google.common.io.Files; import org.assertj.guava.data.MapEntry; @@ -78,7 +79,7 @@ public class AssertJGuavaTest { @Test public void givenTable_whenVerifying_thenShouldBeCorrect() throws Exception { - final HashBasedTable table = HashBasedTable.create(2, 2); + final Table table = HashBasedTable.create(2, 2); table.put(1, "A", "PRESENT"); table.put(1, "B", "ABSENT");