From 3d9b009255ffd897a9bd84ca3977cd3f553da8ef Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Wed, 3 Aug 2016 10:17:09 +0200 Subject: Imported Upstream version 6.7.6 --- .../serialization/impl/GenericEnumMarshaller.java | 49 ++++++++++++++-------- 1 file changed, 32 insertions(+), 17 deletions(-) (limited to 'lang/src/main/java/net/openhft/lang/io/serialization/impl/GenericEnumMarshaller.java') diff --git a/lang/src/main/java/net/openhft/lang/io/serialization/impl/GenericEnumMarshaller.java b/lang/src/main/java/net/openhft/lang/io/serialization/impl/GenericEnumMarshaller.java index 8a1b52d..8ed4590 100644 --- a/lang/src/main/java/net/openhft/lang/io/serialization/impl/GenericEnumMarshaller.java +++ b/lang/src/main/java/net/openhft/lang/io/serialization/impl/GenericEnumMarshaller.java @@ -1,25 +1,25 @@ /* - * Copyright 2013 Peter Lawrey + * Copyright (C) 2015 higherfrequencytrading.com * - * 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 + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License. * - * http://www.apache.org/licenses/LICENSE-2.0 + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. * - * 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. + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . */ package net.openhft.lang.io.serialization.impl; import net.openhft.lang.io.Bytes; import net.openhft.lang.io.serialization.BytesMarshaller; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import net.openhft.lang.model.constraints.NotNull; +import net.openhft.lang.model.constraints.Nullable; import java.lang.reflect.Constructor; import java.lang.reflect.Method; @@ -30,17 +30,20 @@ import java.util.Map; * @author peter.lawrey */ public class GenericEnumMarshaller implements BytesMarshaller { - @NotNull - private final Class classMarshaled; + private final int capacity; @Nullable - private final Constructor constructor; + private transient final Constructor constructor; @Nullable - private final Method valueOf; + private transient final Method valueOf; @NotNull private final Map map; + //used by the read resolve method + private final Class classMarshaled; + public GenericEnumMarshaller(@NotNull Class classMarshaled, final int capacity) { this.classMarshaled = classMarshaled; + this.capacity = capacity; Constructor constructor = null; Method valueOf = null; try { @@ -48,6 +51,7 @@ public class GenericEnumMarshaller implements BytesMarshaller { } catch (NoSuchMethodException e) { try { constructor = classMarshaled.getConstructor(String.class); + constructor.setAccessible(true); } catch (NoSuchMethodException e1) { throw new IllegalArgumentException(classMarshaled + " doesn't have a valueOf(String) or a Constructor(String)"); } @@ -62,6 +66,10 @@ public class GenericEnumMarshaller implements BytesMarshaller { }; } + private Object readResolve() { + return new GenericEnumMarshaller(classMarshaled, capacity); + } + @Override public void write(@NotNull Bytes bytes, @Nullable E e) { bytes.writeUTFΔ(e == null ? null : e.toString()); @@ -74,19 +82,26 @@ public class GenericEnumMarshaller implements BytesMarshaller { return s == null ? null : valueOf(s); } + @Nullable + @Override + public E read(Bytes bytes, @Nullable E e) { + return read(bytes); + } + private E valueOf(String s) { E e = map.get(s); if (e == null) try { if (constructor != null) { map.put(s, e = constructor.newInstance(s)); + } else { @SuppressWarnings("unchecked") E invoke = (E) valueOf.invoke(null, s); map.put(s, e = invoke); } } catch (Exception t) { - throw new AssertionError(t.getCause()); + throw new AssertionError(t); } return e; } -- cgit v1.2.3