diff --git a/jOOQ-postgres-extensions/pom.xml b/jOOQ-postgres-extensions/pom.xml index e408b07d4d..af624161ff 100644 --- a/jOOQ-postgres-extensions/pom.xml +++ b/jOOQ-postgres-extensions/pom.xml @@ -53,6 +53,13 @@ postgresql + + org.jetbrains + annotations + provided + true + + diff --git a/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/bindings/HstoreBinding.java b/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/bindings/HstoreBinding.java index 91200a8a06..7ee6a950b7 100644 --- a/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/bindings/HstoreBinding.java +++ b/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/bindings/HstoreBinding.java @@ -39,7 +39,6 @@ package org.jooq.postgres.extensions.bindings; import java.sql.SQLException; import java.sql.Types; -import java.util.Map; import org.jooq.BindingGetResultSetContext; import org.jooq.BindingGetStatementContext; @@ -47,6 +46,7 @@ import org.jooq.BindingRegisterContext; import org.jooq.BindingSetStatementContext; import org.jooq.Converter; import org.jooq.postgres.extensions.converters.HstoreConverter; +import org.jooq.postgres.extensions.types.Hstore; /** * A binding for the PostgreSQL hstore data type. @@ -54,16 +54,16 @@ import org.jooq.postgres.extensions.converters.HstoreConverter; * @author Dmitry Baev * @author Lukas Eder */ -public class HstoreBinding extends AbstractPostgresBinding> { +public class HstoreBinding extends AbstractPostgresBinding { /** * Generated UID */ - private static final long serialVersionUID = 5809336497608771915L; - private static final Converter> CONVERTER = new HstoreConverter(); + private static final long serialVersionUID = 5809336497608771915L; + private static final Converter CONVERTER = new HstoreConverter(); @Override - public Converter> converter() { + public Converter converter() { return CONVERTER; } @@ -73,12 +73,12 @@ public class HstoreBinding extends AbstractPostgresBinding> ctx) throws SQLException { + public void register(final BindingRegisterContext ctx) throws SQLException { ctx.statement().registerOutParameter(ctx.index(), Types.VARCHAR); } @Override - public void set(final BindingSetStatementContext> ctx) throws SQLException { + public void set(final BindingSetStatementContext ctx) throws SQLException { Object value = ctx.convert(converter()).value(); ctx.statement().setString(ctx.index(), value == null ? null : "" + value); @@ -86,12 +86,12 @@ public class HstoreBinding extends AbstractPostgresBinding> ctx) throws SQLException { + public void get(final BindingGetResultSetContext ctx) throws SQLException { ctx.convert(converter()).value(ctx.resultSet().getString(ctx.index())); } @Override - public void get(final BindingGetStatementContext> ctx) throws SQLException { + public void get(final BindingGetStatementContext ctx) throws SQLException { ctx.convert(converter()).value(ctx.statement().getString(ctx.index())); } } diff --git a/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/converters/HstoreConverter.java b/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/converters/HstoreConverter.java index 06e78e5098..dfffe9a7fb 100644 --- a/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/converters/HstoreConverter.java +++ b/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/converters/HstoreConverter.java @@ -37,9 +37,10 @@ */ package org.jooq.postgres.extensions.converters; -import java.util.Map; +import static org.jooq.postgres.extensions.types.Hstore.hstore; import org.jooq.impl.AbstractConverter; +import org.jooq.postgres.extensions.types.Hstore; /** * A binding for the PostgreSQL hstore data type. @@ -47,25 +48,24 @@ import org.jooq.impl.AbstractConverter; * @author Dmitry Baev * @author Lukas Eder */ -public class HstoreConverter extends AbstractConverter> { +public class HstoreConverter extends AbstractConverter { /** * Generated UID */ private static final long serialVersionUID = -2852275331366617696L; - @SuppressWarnings({ "unchecked", "rawtypes" }) public HstoreConverter() { - super(Object.class, (Class>) (Class) Map.class); + super(Object.class, Hstore.class); } @Override - public Map from(Object t) { - return t == null ? null : org.postgresql.util.HStoreConverter.fromString("" + t); + public Hstore from(Object t) { + return t == null ? null : hstore(org.postgresql.util.HStoreConverter.fromString("" + t)); } @Override - public Object to(Map u) { - return u == null ? null : org.postgresql.util.HStoreConverter.toString(u); + public Object to(Hstore u) { + return u == null ? null : org.postgresql.util.HStoreConverter.toString(u.data()); } } diff --git a/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/types/Hstore.java b/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/types/Hstore.java new file mode 100644 index 0000000000..9805a3300a --- /dev/null +++ b/jOOQ-postgres-extensions/src/main/java/org/jooq/postgres/extensions/types/Hstore.java @@ -0,0 +1,101 @@ +/* + * 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. + * + * Other licenses: + * ----------------------------------------------------------------------------- + * Commercial licenses for this work are available. These replace the above + * ASL 2.0 and offer limited warranties, support, maintenance, and commercial + * database integrations. + * + * For more information, please visit: http://www.jooq.org/licenses + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + */ +package org.jooq.postgres.extensions.types; + +import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; + +import org.jetbrains.annotations.NotNull; + +/** + * A data type representing the PostgreSQL hstore type. + * + * @author Lukas Eder + */ +public final class Hstore implements Serializable { + + private static final long serialVersionUID = 860591239448066408L; + private final Map data; + + private Hstore(Map data) { + this.data = data == null ? new HashMap<>() : data; + } + + @NotNull + public final Map data() { + return data; + } + + /** + * Create a new {@link Hstore} instance from string data input. + */ + @NotNull + public static final Hstore valueOf(Map data) { + return new Hstore(data); + } + + /** + * Create a new {@link Hstore} instance from map data input. + *

+ * This is the same as {@link #valueOf(Map)}, but it can be static imported. + */ + @NotNull + public static final Hstore hstore(Map data) { + return new Hstore(data); + } + + @Override + public int hashCode() { + return data.hashCode(); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj instanceof Hstore) + return data.equals(((Hstore) obj).data); + return false; + } + + @Override + public String toString() { + return String.valueOf(data); + } +}