Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add public serializer API #286

Merged
merged 8 commits into from
Dec 8, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions base/src/main/java/one/microstream/memory/XMemory.java
Original file line number Diff line number Diff line change
Expand Up @@ -1120,6 +1120,29 @@ public static final byte[] toArray(final ByteBuffer source, final int position,

return bytes;
}

public static final byte[] toArray(final ByteBuffer[] sources)
{
int overallLength = 0;
for(final ByteBuffer source : sources)
{
overallLength += source.remaining();
}
final byte[] bytes = new byte[overallLength];
int pos = 0;
for(final ByteBuffer source : sources)
{
final int length = source.remaining();
final int currentSourcePosition = source.position();

source.get(bytes, pos, length);
pos += length;

// why would a querying methode intrinsically increase the position? WHY?
source.position(currentSourcePosition);
}
return bytes;
}

public static final long getPositionLimit(final ByteBuffer buffer)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -478,7 +478,7 @@ public static Builder Builder()
return new XCsvConfiguration.Builder.Default();
}

public interface Builder
public interface Builder extends InstanceDispatcher
{
public char getLineSeparator();

Expand Down
10 changes: 7 additions & 3 deletions cache/cache/src/main/java/one/microstream/cache/types/Cache.java
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,9 @@
import one.microstream.collections.BulkList;
import one.microstream.collections.types.XList;
import one.microstream.exceptions.IORuntimeException;
import one.microstream.persistence.binary.util.Serializer;
import one.microstream.reference.Reference;
import one.microstream.reflect.ClassLoaderProvider;
import one.microstream.typing.KeyValue;

/**
Expand Down Expand Up @@ -212,9 +214,11 @@ public static class Default<K, V> implements Cache<K, V>

this.objectConverter = configuration.isStoreByValue()
? ObjectConverter.ByValue(
Serializer.get(
Thread.currentThread().getContextClassLoader(),
configuration.getSerializerFieldPredicate()
Serializer.Binary(
configuration.getSerializerFoundation()
.setClassLoaderProvider(
ClassLoaderProvider.New(Thread.currentThread().getContextClassLoader())
)
)
)
: ObjectConverter.ByReference()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,15 +27,13 @@

import java.io.File;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;
import java.nio.charset.Charset;
import java.nio.file.Path;
import java.util.Collections;
import java.util.HashSet;
import java.util.function.Predicate;

import javax.cache.CacheManager;
import javax.cache.configuration.CacheEntryListenerConfiguration;
Expand All @@ -53,15 +51,15 @@
import one.microstream.configuration.types.Configuration;
import one.microstream.configuration.types.ConfigurationLoader;
import one.microstream.configuration.types.ConfigurationParserIni;
import one.microstream.reflect.XReflect;
import one.microstream.persistence.binary.util.SerializerFoundation;
import one.microstream.storage.embedded.types.EmbeddedStorageManager;

/**
* Extended {@link CompleteConfiguration} used by MicroStream's {@link Cache}.
* <p>
* Added features:<br>
* - {@link #getEvictionManagerFactory()}<br>
* - {@link #getSerializerFieldPredicate()}
* - {@link #getSerializerFoundation()}
* </p>
* <p>
* Can be adapted to MicroStream's generic {@link Configuration} layer.
Expand Down Expand Up @@ -1194,11 +1192,11 @@ public static <K,V> CacheConfiguration<K, V> load(
public Factory<EvictionManager<K, V>> getEvictionManagerFactory();

/**
* Gets the Serializer {@link Field} {@link Predicate}, if any.
* Gets the serializer foundation.
*
* @return the {@link Field} {@link Predicate} for the Serializer, or null if none has been set
* @return the foundation which the serializer will be based on
*/
public Predicate<? super Field> getSerializerFieldPredicate();
public SerializerFoundation<?> getSerializerFoundation();

/**
* Creates a new {@link Builder} for a {@link CacheConfiguration}.
Expand Down Expand Up @@ -1534,18 +1532,12 @@ public default Builder<K, V> disableManagement()
public Builder<K, V> enableManagement(final boolean managementEnabled);

/**
* Set the Serializer {@link Field} {@link Predicate}. If <code>null</code>
* is specified the default {@link Predicate} is used.
* <p>
* Only one predicate can be set for a cache. The last one applied
* before cache construction will be the one used.
* Set the serializer foundation.
*
* @param serializerFieldPredicate the Serializer {@link Field} {@link Predicate}
* @param serializerFoundation the foundation which the serializer will be based on
* @return this
*
* @see CacheConfiguration#DefaultSerializerFieldPredicate()
*/
public Builder<K, V> serializerFieldPredicate(Predicate<? super Field> serializerFieldPredicate);
public Builder<K, V> serializerFoundation(SerializerFoundation<?> serializerFoundation);

/**
* Builds a {@link CacheConfiguration} based on the values of this {@link Builder}.
Expand All @@ -1568,7 +1560,7 @@ public static class Default<K, V> implements Builder<K, V>
private boolean storeByValue;
private boolean statisticsEnabled;
private boolean managementEnabled;
private Predicate<? super Field> serializerFieldPredicate;
private SerializerFoundation<?> serializerFoundation;

Default(final Class<K> keyType, final Class<V> valueType)
{
Expand Down Expand Up @@ -1650,9 +1642,9 @@ public Builder<K, V> enableManagement(final boolean managementEnabled)
}

@Override
public Builder<K, V> serializerFieldPredicate(final Predicate<? super Field> serializerFieldPredicate)
public Builder<K, V> serializerFoundation(final SerializerFoundation<?> serializerFoundation)
{
this.serializerFieldPredicate = serializerFieldPredicate;
this.serializerFoundation = serializerFoundation;
return this;
}

Expand All @@ -1669,9 +1661,9 @@ public CacheConfiguration<K, V> build()
DefaultEvictionManagerFactory()
);

final Predicate<? super Field> serializerFieldPredicate = coalesce(
this.serializerFieldPredicate,
DefaultSerializerFieldPredicate()
final SerializerFoundation<?> serializerFoundation = coalesce(
this.serializerFoundation,
SerializerFoundation.New()
);

return new CacheConfiguration.Default<>(this.keyType,
Expand All @@ -1686,7 +1678,7 @@ public CacheConfiguration<K, V> build()
this.storeByValue,
this.statisticsEnabled,
this.managementEnabled,
serializerFieldPredicate
serializerFoundation
);
}

Expand All @@ -1712,14 +1704,6 @@ public static <K, V> Factory<EvictionManager<K, V>> DefaultEvictionManagerFactor
return () -> null;
}

/**
* @return the default Serializer {@link Field} {@link Predicate}, which excludes transient fields.
*/
public static Predicate<? super Field> DefaultSerializerFieldPredicate()
{
return XReflect::isNotTransient;
}

/**
* Creates a new {@link CacheConfiguration} based on a {@link javax.cache.configuration.Configuration}.
*
Expand Down Expand Up @@ -1748,17 +1732,17 @@ public static <K, V> CacheConfiguration<K, V> New(final javax.cache.configuratio
);

final Factory<EvictionManager<K, V>> evictionManagerFactory;
final Predicate<? super Field> serializerFieldPredicate;
final SerializerFoundation<?> serializerFoundation;
if(other instanceof CacheConfiguration)
{
final CacheConfiguration<K, V> msCacheConfig = (CacheConfiguration<K, V>)other;
evictionManagerFactory = msCacheConfig.getEvictionManagerFactory();
serializerFieldPredicate = msCacheConfig.getSerializerFieldPredicate();
evictionManagerFactory = msCacheConfig.getEvictionManagerFactory();
serializerFoundation = msCacheConfig.getSerializerFoundation();
}
else
{
evictionManagerFactory = DefaultEvictionManagerFactory();
serializerFieldPredicate = DefaultSerializerFieldPredicate();
evictionManagerFactory = DefaultEvictionManagerFactory();
serializerFoundation = SerializerFoundation.New();
}

return new Default<>(
Expand All @@ -1774,7 +1758,7 @@ public static <K, V> CacheConfiguration<K, V> New(final javax.cache.configuratio
complete.isStoreByValue(),
complete.isStatisticsEnabled(),
complete.isManagementEnabled(),
serializerFieldPredicate
serializerFoundation
);
}

Expand All @@ -1791,13 +1775,13 @@ public static <K, V> CacheConfiguration<K, V> New(final javax.cache.configuratio
other.isStoreByValue(),
false,
false,
DefaultSerializerFieldPredicate());
SerializerFoundation.New());
}

public static class Default<K, V> extends MutableConfiguration<K, V> implements CacheConfiguration<K, V>
{
private final Factory<EvictionManager<K, V>> evictionManagerFactory;
private final Predicate<? super Field> serializerFieldPredicate;
private final Factory<EvictionManager<K, V>> evictionManagerFactory;
private final SerializerFoundation<?> serializerFoundation;

Default(
final Class<K> keyType,
Expand All @@ -1812,7 +1796,7 @@ public static class Default<K, V> extends MutableConfiguration<K, V> implements
final boolean isStoreByValue,
final boolean isStatisticsEnabled,
final boolean isManagementEnabled,
final Predicate<? super Field> serializerFieldPredicate
final SerializerFoundation<?> serializerFoundation
)
{
super();
Expand All @@ -1832,7 +1816,7 @@ public static class Default<K, V> extends MutableConfiguration<K, V> implements
this.isStatisticsEnabled = isStatisticsEnabled;
this.isStoreByValue = isStoreByValue;
this.isManagementEnabled = isManagementEnabled;
this.serializerFieldPredicate = serializerFieldPredicate;
this.serializerFoundation = serializerFoundation;
}

@Override
Expand Down Expand Up @@ -1862,9 +1846,9 @@ public Factory<EvictionManager<K, V>> getEvictionManagerFactory()
}

@Override
public Predicate<? super Field> getSerializerFieldPredicate()
public SerializerFoundation<?> getSerializerFoundation()
{
return this.serializerFieldPredicate;
return this.serializerFoundation;
}

@Override
Expand All @@ -1884,7 +1868,7 @@ public int hashCode()
result = prime * result + (this.listenerConfigurations == null ? 0 : this.listenerConfigurations.hashCode());
result = prime * result + (this.valueType == null ? 0 : this.valueType.hashCode());
result = prime * result + (this.evictionManagerFactory == null ? 0 : this.evictionManagerFactory.hashCode());
result = prime * result + (this.serializerFieldPredicate == null ? 0 : this.serializerFieldPredicate.hashCode());
result = prime * result + (this.serializerFoundation == null ? 0 : this.serializerFoundation.hashCode());
return result;
}

Expand Down Expand Up @@ -1997,14 +1981,14 @@ else if(!this.evictionManagerFactory.equals(other.getEvictionManagerFactory()))
{
return false;
}
if(this.serializerFieldPredicate == null)
if(this.serializerFoundation == null)
{
if(other.getSerializerFieldPredicate() != null)
if(other.getSerializerFoundation() != null)
{
return false;
}
}
else if(!this.serializerFieldPredicate.equals(other.getSerializerFieldPredicate()))
else if(!this.serializerFoundation.equals(other.getSerializerFoundation()))
{
return false;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@

package one.microstream.cache.types;

import one.microstream.persistence.binary.types.Binary;
import one.microstream.persistence.binary.util.Serializer;

/*-
* #%L
* microstream-cache
Expand Down Expand Up @@ -33,7 +36,7 @@ public static ObjectConverter ByReference()
return new ByReference();
}

public static ObjectConverter ByValue(final Serializer serializer)
public static ObjectConverter ByValue(final Serializer<Binary> serializer)
{
return new ByValue(serializer);
}
Expand Down Expand Up @@ -63,9 +66,9 @@ public <T> T externalize(final Object internal)

public static class ByValue implements ObjectConverter
{
private final Serializer serializer;
private final Serializer<Binary> serializer;

ByValue(final Serializer serializer)
ByValue(final Serializer<Binary> serializer)
{
super();

Expand All @@ -77,15 +80,14 @@ public <T> Object internalize(final T value)
{
return SerializedObject.New(
value.hashCode(),
this.serializer.write(value)
this.serializer.serialize(value)
);
}

@SuppressWarnings("unchecked")
@Override
public <T> T externalize(final Object internal)
{
return (T)this.serializer.read(
return this.serializer.deserialize(
((SerializedObject)internal).serializedData()
);
}
Expand Down
Loading