Skip to content

Bug/fixing android issues #325 and #326 #154

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

Merged
merged 5 commits into from
Nov 15, 2024
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
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
import javax.management.ObjectInstance;
import javax.management.ObjectName;

import org.eclipse.serializer.util.VMInfo;
import org.eclipse.serializer.util.logging.Logging;
import org.slf4j.Logger;

Expand Down Expand Up @@ -58,12 +59,38 @@ public interface MonitoringManager
*/
void shutdown();


/**
* Provide a platform dependent MonitoringManager.
* This is either the "JMX" implementation or the "Disabled" implementation
* on android systems.
*
* @param name a user defined name used to distinguish different instances.
* if null the Manager chooses a name internaly.
*
* @return a platform dependent MonitoringManage instance
*/
public static MonitoringManager PlatformDependent(final String name)
{
if(VMInfo.New().isAnyAndroid())
{
return Disabled();
}

if(name != null)
{
return JMX(name);
}

return JMX();
}

/**
* Provides a new instance of the default JMX MonitoringManager implementation.
*
* @return a MonitoringManager.JMX instance
*/
public static MonitoringManager New()
public static MonitoringManager JMX()
{
return new JMX();
}
Expand All @@ -75,14 +102,28 @@ public static MonitoringManager New()
*
* @return a MonitoringManager.JMX instance
*/
public static MonitoringManager New(final String name)
public static MonitoringManager JMX(final String name)
{
return new JMX(name);
}


/**
* Provides a new instance of the disabled monitor manager implementation
*
* @return a MonitoringManager.Disabled instance
*/
public static MonitoringManager Disabled()
{
return new MonitoringManager.Disabled();
}

/**
* MonitoringManager implementation using the java management extension to provide
* metrics and monitoring data.
*
* Please be aware that not all Java implementations may provide JMX support
* e.g. Android.
*
*/
public class JMX implements MonitoringManager
{
Expand Down Expand Up @@ -174,4 +215,25 @@ private ObjectName createObjectName(final MetricMonitor metric) throws Malformed

}

/**
* Disabled Monitoring Manager implementation.
* This implementation disables the monitoring by not registering
* MetricMonitors.
*/
public class Disabled implements MonitoringManager
{
@Override
public void registerMonitor(MetricMonitor metrics)
{
//NoOp
}

@Override
public void shutdown()
{
//NoOp
}

}

}
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@ public static LazyReferenceManager New(
checker,
_longReference.New(milliTimeCheckInterval),
_longReference.New(nanoTimeBudget) ,
MonitoringManager.New(null)
MonitoringManager.PlatformDependent(null)
);
}

Expand Down
127 changes: 127 additions & 0 deletions base/src/main/java/org/eclipse/serializer/util/VMInfo.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
package org.eclipse.serializer.util;

/*-
* #%L
* Eclipse Serializer Base
* %%
* Copyright (C) 2023 - 2024 MicroStream Software
* %%
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
* #L%
*/

/**
* Helper class to identify the current VM
*/
public interface VMInfo
{
/**
* Returns true if the current jvm is the default jvm.
* that supports all java features.
*
* @return true if default jvm
*/
public boolean isStandardJava();

/**
* Returns true if the current jvm is a default android jvm.
*
* @return true if default android
*/
public boolean isStandardAndroid();

/**
* Returns true if the current jvm a GraalVm native image.
*
* @return if GraalVm native image.
*/
public boolean isGraalVmNativeImage();

/**
* Returns true if the current jvm any kind if android.
*
* @return true if any android.
*/
public boolean isAnyAndroid();

public static VMInfo New()
{
return new VMInfo.Default();
}

public static class Default implements VMInfo
{
private static final String ANY_ANDROID_VENDOR = "android";
private static final String DEFAULT_ANDROID_VENDOR = "The Android Project";

private static final String JAVA_VENDOR = System.getProperty("java.vendor", "").toLowerCase();
private static final String JAVA_VM_VENDOR = System.getProperty("java.vm.vendor", "").toLowerCase();
private static final String ORG_GRAALVM_NATIVEIMAGE_IMAGECODE = System.getProperty("org.graalvm.nativeimage.imagecode","").toLowerCase();

private static final boolean ANY_ANDROID = checkAnyAndroid();
private static final boolean GRAALVM_NATIVEIMAGE = checkGraalVMNativeImage();
private static final boolean DEFAULT_ANDROID = checkStandardAndroid();
private static final boolean DEFAULT_JAVA = checkStandardJavaVM();


@Override
public final boolean isStandardJava()
{
return DEFAULT_JAVA;
}

@Override
public final boolean isAnyAndroid()
{
return ANY_ANDROID;
}

@Override
public final boolean isGraalVmNativeImage()
{
return GRAALVM_NATIVEIMAGE;
}

@Override
public final boolean isStandardAndroid()
{
return DEFAULT_ANDROID;
}

private static boolean checkStandardJavaVM()
{
return
!checkStandardAndroid() &&
!checkAnyAndroid() &&
!checkGraalVMNativeImage()
;
}

private static boolean checkStandardAndroid()
{
return
JAVA_VENDOR.equalsIgnoreCase(DEFAULT_ANDROID_VENDOR) ||
JAVA_VM_VENDOR.equalsIgnoreCase(DEFAULT_ANDROID_VENDOR)
;
}

private static boolean checkAnyAndroid()
{
return
JAVA_VENDOR.contains(ANY_ANDROID_VENDOR) ||
JAVA_VM_VENDOR.contains(ANY_ANDROID_VENDOR)
;
}

private static boolean checkGraalVMNativeImage()
{
return !ORG_GRAALVM_NATIVEIMAGE_IMAGECODE.isBlank();
}

}

}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import org.eclipse.serializer.memory.XMemory;
import org.eclipse.serializer.persistence.binary.types.AbstractBinaryHandlerCustom;
Expand All @@ -29,26 +30,27 @@
/**
* Binary Handler for private class "java.util.Collections$SetFromMap"
*/
public class BinaryHandlerSetFromMap<T> extends AbstractBinaryHandlerCustom<T>
public class BinaryHandlerSetFromMap<T> extends AbstractBinaryHandlerCustom<Set<T>>
{
private static long offsetMap;
private static long offsetSet;

public static BinaryHandlerSetFromMap<?> New()

@SuppressWarnings({ "rawtypes", "unchecked" })
public static BinaryHandlerSetFromMap New()
{
Class<?> clazz = XReflect.getDeclaredNestedClass(Collections.class, "java.util.Collections$SetFromMap");

offsetMap = XMemory.objectFieldOffset(XReflect.getAnyField(clazz, "m"));
offsetSet = XMemory.objectFieldOffset(XReflect.getAnyField(clazz, "s"));

return new BinaryHandlerSetFromMap<>(clazz);
return new BinaryHandlerSetFromMap(clazz);
}

///////////////////////////////////////////////////////////////////////////
// constructors //
/////////////////

protected BinaryHandlerSetFromMap(final Class<T> type)
protected BinaryHandlerSetFromMap(Class<Set<T>> type)
{
super(type,
CustomFields(
Expand All @@ -67,7 +69,7 @@ public void iterateLoadableReferences(final Binary data, final PersistenceRefere
}

@Override
public void updateState(final Binary data, T instance, final PersistenceLoadHandler handler)
public void updateState(final Binary data, Set<T> instance, final PersistenceLoadHandler handler)
{
final Map<?,?> hashmap = (Map<?, ?>) handler.lookupObject(data.read_long(0));

Expand All @@ -76,19 +78,18 @@ public void updateState(final Binary data, T instance, final PersistenceLoadHand
}

@Override
public void store(final Binary data, final T instance, final long objectId, final PersistenceStoreHandler<Binary> handler)
public void store(final Binary data, final Set<T> instance, final long objectId, final PersistenceStoreHandler<Binary> handler)
{
data.storeEntityHeader(Binary.referenceBinaryLength(1), this.typeId(), objectId);

Object mapInstance = XMemory.getObject(instance, offsetMap);
data.storeReference(0, handler, mapInstance);
}

@SuppressWarnings("unchecked")
@Override
public T create(final Binary data, final PersistenceLoadHandler handler)
public Set<T> create(final Binary data, final PersistenceLoadHandler handler)
{
return (T) Collections.newSetFromMap(new HashMap<Object,Boolean>());
return Collections.newSetFromMap(new HashMap<T,Boolean>());
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import java.util.Optional;

import org.eclipse.serializer.afs.types.AFile;
import org.eclipse.serializer.collections.BulkList;
import org.eclipse.serializer.collections.ConstList;
import org.eclipse.serializer.collections.types.XGettingCollection;
import org.eclipse.serializer.collections.types.XGettingSequence;
Expand Down Expand Up @@ -128,6 +129,7 @@
import org.eclipse.serializer.reference.Referencing;
import org.eclipse.serializer.reference.Swizzling;
import org.eclipse.serializer.typing.XTypes;
import org.eclipse.serializer.util.VMInfo;

public final class BinaryPersistence extends Persistence
{
Expand Down Expand Up @@ -169,6 +171,7 @@ public static final PersistenceCustomTypeHandlerRegistry<Binary> createDefaultCu
.registerTypeHandlers(nativeHandlersReferencingTypes)
.registerTypeHandlers(defaultCustomHandlers(controller))
.registerTypeHandlers(lazyCollectionsHandlers())
.registerTypeHandlers(platformDependentHandlers())
.registerTypeHandlers(customHandlers)
;

Expand Down Expand Up @@ -331,8 +334,7 @@ static final void initializeNativeTypeId(
BinaryHandlerArrayDeque.New() ,
BinaryHandlerConcurrentSkipListMap.New(),
BinaryHandlerConcurrentSkipListSet.New(),
BinaryHandlerSetFromMap.New(),


// JDK 1.7 collections
BinaryHandlerConcurrentLinkedDeque.New(),

Expand Down Expand Up @@ -388,6 +390,22 @@ static final void initializeNativeTypeId(

return lazyCollectionsHandlers;
}

@SuppressWarnings("unchecked")
public static final XGettingSequence<? extends PersistenceTypeHandler<Binary, ?>> platformDependentHandlers()
{
VMInfo vmInfo = new VMInfo.Default();

final BulkList<PersistenceTypeHandler<Binary, ?>> platformDependentHandlers = BulkList.New();

if(!vmInfo.isAnyAndroid())
{
platformDependentHandlers.add(BinaryHandlerSetFromMap.New());
}

return platformDependentHandlers;
}


public static final long resolveFieldBinaryLength(final Class<?> fieldType)
{
Expand Down
Loading