Skip to content

Commit

Permalink
Add KeyFormat implementations for org.wildfly.clustering.ejb.infinisp…
Browse files Browse the repository at this point in the history
…an module.
  • Loading branch information
pferraro committed Mar 14, 2017
1 parent a615fd4 commit 0ed6b61
Show file tree
Hide file tree
Showing 6 changed files with 132 additions and 31 deletions.
@@ -0,0 +1,39 @@
/*
* JBoss, Home of Professional Open Source.
* Copyright 2017, Red Hat, Inc., and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This 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 2.1 of
* the License, or (at your option) any later version.
*
* This software 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.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/

package org.wildfly.clustering.ejb.infinispan;

import org.infinispan.persistence.keymappers.TwoWayKey2StringMapper;
import org.kohsuke.MetaInfServices;
import org.wildfly.clustering.infinispan.spi.persistence.DynamicKeyFormatMapper;

/**
* {@link TwoWayKey2StringMapper} for EJB cache keys.
* @author Paul Ferraro
*/
@MetaInfServices(TwoWayKey2StringMapper.class)
public class KeyMapper extends DynamicKeyFormatMapper {

public KeyMapper() {
super(KeyMapper.class.getClassLoader());
}
}
Expand Up @@ -24,24 +24,25 @@
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.util.Base64;

import org.jboss.ejb.client.BasicSessionID;
import org.jboss.ejb.client.SessionID;
import org.jboss.ejb.client.UUIDSessionID;
import org.jboss.ejb.client.UnknownSessionID;
import org.kohsuke.MetaInfServices;
import org.wildfly.clustering.infinispan.spi.persistence.SimpleKeyFormat;
import org.wildfly.clustering.marshalling.Externalizer;
import org.wildfly.clustering.marshalling.spi.IndexExternalizer;

/**
* @author Paul Ferraro
*/
public class SessionIDExternalizer<T extends SessionID> implements Externalizer<T> {

private final Class<T> targetClass;
public class SessionIDExternalizer<T extends SessionID> extends SimpleKeyFormat<T> implements Externalizer<T> {

@SuppressWarnings("unchecked")
public SessionIDExternalizer(Class<T> targetClass) {
this.targetClass = targetClass;
super(targetClass, value -> (T) SessionID.createSessionID(Base64.getDecoder().decode(value)), id -> Base64.getEncoder().encodeToString(id.getEncodedForm()));
}

@Override
Expand All @@ -59,11 +60,6 @@ public T readObject(ObjectInput input) throws IOException, ClassNotFoundExceptio
return (T) SessionID.createSessionID(encoded);
}

@Override
public Class<T> getTargetClass() {
return this.targetClass;
}

@MetaInfServices(Externalizer.class)
public static class BasicSessionIDExternalizer extends SessionIDExternalizer<BasicSessionID> {
public BasicSessionIDExternalizer() {
Expand Down
Expand Up @@ -28,29 +28,30 @@
import org.jboss.ejb.client.SessionID;
import org.kohsuke.MetaInfServices;
import org.wildfly.clustering.ejb.infinispan.SessionIDExternalizer;
import org.wildfly.clustering.infinispan.spi.persistence.KeyFormat;
import org.wildfly.clustering.infinispan.spi.persistence.SimpleKeyFormat;
import org.wildfly.clustering.marshalling.Externalizer;

/**
* @author Paul Ferraro
*/
@MetaInfServices(Externalizer.class)
public class InfinispanBeanKeyExternalizer implements Externalizer<InfinispanBeanKey<SessionID>> {
@MetaInfServices({ Externalizer.class, KeyFormat.class })
public class InfinispanBeanKeyExternalizer extends SimpleKeyFormat<InfinispanBeanKey<SessionID>> implements Externalizer<InfinispanBeanKey<SessionID>> {

private final Externalizer<SessionID> externalizer = new SessionIDExternalizer<>(SessionID.class);
private static final SessionIDExternalizer<SessionID> EXTERNALIZER = new SessionIDExternalizer<>(SessionID.class);

@Override
public void writeObject(ObjectOutput output, InfinispanBeanKey<SessionID> key) throws IOException {
this.externalizer.writeObject(output, key.getId());
@SuppressWarnings("unchecked")
public InfinispanBeanKeyExternalizer() {
super((Class<InfinispanBeanKey<SessionID>>) (Class<?>) InfinispanBeanKey.class, value -> new InfinispanBeanKey<>(EXTERNALIZER.parse(value)), key -> EXTERNALIZER.format(key.getId()));
}

@Override
public InfinispanBeanKey<SessionID> readObject(ObjectInput input) throws IOException, ClassNotFoundException {
return new InfinispanBeanKey<>(this.externalizer.readObject(input));
public void writeObject(ObjectOutput output, InfinispanBeanKey<SessionID> key) throws IOException {
EXTERNALIZER.writeObject(output, key.getId());
}

@SuppressWarnings("unchecked")
@Override
public Class<InfinispanBeanKey<SessionID>> getTargetClass() {
return (Class<InfinispanBeanKey<SessionID>>) (Class<?>) InfinispanBeanKey.class;
public InfinispanBeanKey<SessionID> readObject(ObjectInput input) throws IOException, ClassNotFoundException {
return new InfinispanBeanKey<>(EXTERNALIZER.readObject(input));
}
}
Expand Up @@ -29,29 +29,30 @@
import org.jboss.ejb.client.SessionID;
import org.kohsuke.MetaInfServices;
import org.wildfly.clustering.ejb.infinispan.SessionIDExternalizer;
import org.wildfly.clustering.infinispan.spi.persistence.KeyFormat;
import org.wildfly.clustering.infinispan.spi.persistence.SimpleKeyFormat;
import org.wildfly.clustering.marshalling.Externalizer;

/**
* @author Paul Ferraro
*/
@MetaInfServices(Externalizer.class)
public class InfinispanBeanGroupKeyExternalizer implements Externalizer<InfinispanBeanGroupKey<SessionID>> {
@MetaInfServices({ Externalizer.class, KeyFormat.class })
public class InfinispanBeanGroupKeyExternalizer extends SimpleKeyFormat<InfinispanBeanGroupKey<SessionID>> implements Externalizer<InfinispanBeanGroupKey<SessionID>> {

private final Externalizer<SessionID> externalizer = new SessionIDExternalizer<>(SessionID.class);
private static final SessionIDExternalizer<SessionID> EXTERNALIZER = new SessionIDExternalizer<>(SessionID.class);

@Override
public void writeObject(ObjectOutput output, InfinispanBeanGroupKey<SessionID> key) throws IOException {
this.externalizer.writeObject(output, key.getId());
@SuppressWarnings("unchecked")
public InfinispanBeanGroupKeyExternalizer() {
super((Class<InfinispanBeanGroupKey<SessionID>>) (Class<?>) InfinispanBeanGroupKey.class, value -> new InfinispanBeanGroupKey<>(EXTERNALIZER.parse(value)), key -> EXTERNALIZER.format(key.getId()));
}

@Override
public InfinispanBeanGroupKey<SessionID> readObject(ObjectInput input) throws IOException, ClassNotFoundException {
return new InfinispanBeanGroupKey<>(this.externalizer.readObject(input));
public void writeObject(ObjectOutput output, InfinispanBeanGroupKey<SessionID> key) throws IOException {
EXTERNALIZER.writeObject(output, key.getId());
}

@SuppressWarnings("unchecked")
@Override
public Class<InfinispanBeanGroupKey<SessionID>> getTargetClass() {
return (Class<InfinispanBeanGroupKey<SessionID>>) (Class<?>) InfinispanBeanGroupKey.class;
public InfinispanBeanGroupKey<SessionID> readObject(ObjectInput input) throws IOException, ClassNotFoundException {
return new InfinispanBeanGroupKey<>(EXTERNALIZER.readObject(input));
}
}
@@ -0,0 +1,62 @@
/*
* JBoss, Home of Professional Open Source.
* Copyright 2017, Red Hat, Inc., and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This 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 2.1 of
* the License, or (at your option) any later version.
*
* This software 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.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/

package org.wildfly.clustering.ejb.infinispan;

import java.util.HashSet;
import java.util.Set;
import java.util.UUID;

import org.infinispan.persistence.keymappers.TwoWayKey2StringMapper;
import org.jboss.ejb.client.SessionID;
import org.jboss.ejb.client.UUIDSessionID;
import org.junit.Assert;
import org.junit.Test;
import org.wildfly.clustering.ejb.infinispan.bean.InfinispanBeanKey;
import org.wildfly.clustering.ejb.infinispan.group.InfinispanBeanGroupKey;

/**
* @author Paul Ferraro
*/
public class KeyMapperTestCase {
@Test
public void test() {
TwoWayKey2StringMapper mapper = new KeyMapper();
Assert.assertTrue(mapper.isSupportedType(InfinispanBeanKey.class));
Assert.assertTrue(mapper.isSupportedType(InfinispanBeanGroupKey.class));

Set<String> formatted = new HashSet<>();

SessionID id = new UUIDSessionID(UUID.randomUUID());
BeanKey<SessionID> beanKey = new InfinispanBeanKey<>(id);

String formattedBeanKey = mapper.getStringMapping(beanKey);
Assert.assertEquals(beanKey, mapper.getKeyMapping(formattedBeanKey));
Assert.assertTrue(formatted.add(formattedBeanKey));

BeanGroupKey<SessionID> beanGroupKey = new InfinispanBeanGroupKey<>(id);

String formattedBeanGroupKey = mapper.getStringMapping(beanGroupKey);
Assert.assertEquals(beanGroupKey, mapper.getKeyMapping(formattedBeanGroupKey));
Assert.assertTrue(formatted.add(formattedBeanGroupKey));
}
}
Expand Up @@ -24,6 +24,7 @@

import java.util.ServiceLoader;

import org.infinispan.persistence.keymappers.TwoWayKey2StringMapper;
import org.junit.Test;
import org.wildfly.clustering.ejb.BeanManagerFactoryBuilderFactoryProvider;
import org.wildfly.clustering.marshalling.Externalizer;
Expand All @@ -50,5 +51,6 @@ public void load() {
load(DistributedCacheBuilderProvider.class);
load(LocalCacheBuilderProvider.class);
load(CacheAliasBuilderProvider.class);
load(TwoWayKey2StringMapper.class);
}
}

0 comments on commit 0ed6b61

Please sign in to comment.