Skip to content

Commit

Permalink
Fix #32 to add new ReactiveFurySerializer which implements ServerMess… (
Browse files Browse the repository at this point in the history
#37)

…ageBodyReader and SeverMessageBodyWriter
  • Loading branch information
zhfeng authored Nov 25, 2024
1 parent 7cc1fd0 commit b81e312
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import io.quarkiverse.fury.FuryRecorder;
import io.quarkiverse.fury.FurySerialization;
import io.quarkiverse.fury.FurySerializer;
import io.quarkiverse.fury.ReactiveFurySerializer;
import io.quarkus.arc.deployment.AdditionalBeanBuildItem;
import io.quarkus.arc.deployment.BeanContainerBuildItem;
import io.quarkus.arc.deployment.UnremovableBeanBuildItem;
Expand Down Expand Up @@ -90,12 +91,12 @@ public void registerResteasyIntegration(Capabilities capabilities,
.produce(new ResteasyJaxrsProviderBuildItem(FurySerializer.class.getName()));
} else if (capabilities.isPresent(Capability.RESTEASY_REACTIVE)) {
additionalReaders.produce(new MessageBodyReaderBuildItem.Builder(
FurySerializer.class.getName(), Object.class.getName())
ReactiveFurySerializer.class.getName(), Object.class.getName())
.setMediaTypeStrings(List.of("application/fury", "application/*+fury"))
.setRuntimeType(RuntimeType.SERVER)
.setBuiltin(true).build());
additionalWriters.produce(new MessageBodyWriterBuildItem.Builder(
FurySerializer.class.getName(), Object.class.getName())
ReactiveFurySerializer.class.getName(), Object.class.getName())
.setMediaTypeStrings(List.of("application/fury", "application/*+fury"))
.setRuntimeType(RuntimeType.SERVER)
.setBuiltin(true).build());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,7 @@
import org.apache.fury.serializer.Serializer;
import org.apache.fury.util.Preconditions;

import io.quarkus.runtime.annotations.RegisterForReflection;

@Path("/fury")
@RegisterForReflection
public class FuryResources {
public final static short BAR_CLASS_ID = 400;
@Inject
Expand Down
7 changes: 4 additions & 3 deletions runtime/src/main/java/io/quarkiverse/fury/FurySerializer.java
Original file line number Diff line number Diff line change
Expand Up @@ -58,11 +58,11 @@ public void writeTo(final Object obj, final Class<?> aClass, final Type type, fi
outputStream.write(getFury().serialize(obj));
}

private boolean isSupportedMediaType(MediaType mediaType) {
protected boolean isSupportedMediaType(MediaType mediaType) {
return mediaType.getType().equals("application") && mediaType.getSubtype().endsWith("fury");
}

private boolean canSerialize(final Class<?> aClass) {
protected boolean canSerialize(final Class<?> aClass) {
if (getFury() instanceof final ThreadSafeFury threadSafeFury) {
return (threadSafeFury).execute(f -> f.getClassResolver().getRegisteredClassId(aClass)) != null;
} else {
Expand All @@ -71,10 +71,11 @@ private boolean canSerialize(final Class<?> aClass) {
}
}

private BaseFury getFury() {
protected BaseFury getFury() {
if (fury == null) {
fury = Arc.container().instance(BaseFury.class).get();
}
return fury;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package io.quarkiverse.fury;

import java.io.IOException;
import java.lang.reflect.Type;

import jakarta.ws.rs.WebApplicationException;
import jakarta.ws.rs.core.MediaType;

import org.apache.fury.io.FuryInputStream;
import org.jboss.resteasy.reactive.server.spi.ResteasyReactiveResourceInfo;
import org.jboss.resteasy.reactive.server.spi.ServerMessageBodyReader;
import org.jboss.resteasy.reactive.server.spi.ServerMessageBodyWriter;
import org.jboss.resteasy.reactive.server.spi.ServerRequestContext;

public class ReactiveFurySerializer extends FurySerializer
implements ServerMessageBodyReader<Object>, ServerMessageBodyWriter<Object> {
@Override
public boolean isReadable(final Class<?> type, final Type genericType, final ResteasyReactiveResourceInfo lazyMethod,
final MediaType mediaType) {
return isSupportedMediaType(mediaType) && canSerialize(type);
}

@Override
public Object readFrom(final Class<Object> type, final Type genericType, final MediaType mediaType,
final ServerRequestContext context) throws WebApplicationException, IOException {
return getFury().deserialize(new FuryInputStream(context.getInputStream()));
}

@Override
public boolean isWriteable(final Class<?> type, final Type genericType, final ResteasyReactiveResourceInfo target,
final MediaType mediaType) {
return isSupportedMediaType(mediaType) && canSerialize(type);
}

@Override
public void writeResponse(final Object obj, final Type genericType, final ServerRequestContext context)
throws WebApplicationException, IOException {
context.getOrCreateOutputStream().write(getFury().serialize(obj));
}
}

0 comments on commit b81e312

Please sign in to comment.