0 Replies Latest reply on Feb 22, 2017 6:41 AM by birari.kumar

    How to Register Marshaller and Schema for pojo containing LinkedHashMap<String,Object>

    birari.kumar

      Hello Team,

       

      I am using infinispan server 8.2.4.

      I need to store the data into RemoteCache<String, Employee> where Employee class contains one instance variable i.e LinkedHashMap<String, InnerEmployee > pair = new LinkedHashMap<String,InnerEmployee>();

      I have created .proto file for the same and registered using ctx.registerProtoFiles().

      But I am facing difficulty while registering marshallers for linkedHashMap I can not use writer.writeCollection().

      How to register this marshaller containing LinkedHashMap ?

      1] createRemoteCacheManager :

      public RemoteCacheManager createRemoteCacheManager(String remoteAddress) throws TransportException{
              RemoteCacheManager remoteCacheManager = null;
              try {
                  ConfigurationBuilder clientBuilder = new ConfigurationBuilder();
                  Properties properties = getConfigurationProperties();
                  properties.put("infinispan.client.hotrod.server_list", remoteAddress + ":11222");
                  clientBuilder.connectionPool().withProperties(properties);
                  clientBuilder.marshaller(new ProtoStreamMarshaller());
                  remoteCacheManager = new RemoteCacheManager(clientBuilder.build());
                  registerSchemasAndMarshallers(remoteCacheManager);
              }catch (TransportException exception) {
                  LOG.error("TransportException in createRemoteCacheManager : " + exception.getMessage());
                  throw new TransportException("TransportException",new InetSocketAddress(11222));
              }catch (Exception exception) {
                  LOG.error("Exception in createRemoteCacheManager : " + exception.getMessage());
              }
              return remoteCacheManager;
          }
      

      2] 2] registerSchemasAndMarshallers :

      private void registerSchemasAndMarshallers(RemoteCacheManager remoteCacheManager) throws IOException {
              SerializationContext ctx = ProtoStreamMarshaller.getSerializationContext(remoteCacheManager);
              ctx.registerProtoFiles(FileDescriptorSource.fromResources(InfinispanConstant.EMPLOYEE_RESOURCE));
         
              ctx.registerMarshaller(new EmployeeMarshaller());
              ctx.registerMarshaller(new InnerEmployeeMarshaller());
         
              // Register the schemas with the server too
              RemoteCache<String, String> metadataCache = remoteCacheManager.getCache(ProtobufMetadataManagerConstants.PROTOBUF_METADATA_CACHE_NAME);
              metadataCache.put(InfinispanConstant.EMPLOYEE_RESOURCE, readResource(InfinispanConstant.EMPLOYEE_RESOURCE));
              String errors = metadataCache.get(ProtobufMetadataManagerConstants.ERRORS_KEY_SUFFIX);
              if (errors != null) {
                  throw new IllegalStateException("Some Protobuf schema files contain errors:\n" + errors);
              }
          }
      

      3] Employee.java

      import java.util.LinkedHashMap;
      
      public class Employee {
          private LinkedHashMap<String, InnerEmployee> pair;
      
          public Employee() {
              this.pair = new LinkedHashMap<String, Employee.InnerEmployee>();
          }
      
          public LinkedHashMap<String, InnerEmployee> getPair() {
              return pair;
          }
      
          public void setPair(LinkedHashMap<String, InnerEmployee> pair) {
              this.pair = pair;
          }
      
          public class InnerEmployee {
              private String empNo;
              private String name;
              private String dateOfBirth;
      
              public String getEmpNo() {
                  return empNo;
              }
      
              public void setEmpNo(String empNo) {
                  this.empNo = empNo;
              }
      
              public String getName() {
                  return name;
              }
      
              public void setName(String name) {
                  this.name = name;
              }
      
              public String getDateOfBirth() {
                  return dateOfBirth;
              }
      
              public void setDateOfBirth(String dateOfBirth) {
                  this.dateOfBirth = dateOfBirth;
              }
      
              @Override
              public String toString() {
                  return "Employee [empNo=" + empNo + ", name=" + name
                          + ", dateOfBirth=" + dateOfBirth + "]";
              }
          }
      }
      

      4] EMPLOYEE_RESOURCE.proto

      option java_package = "com.auruspay.infinispan.pojo";
      option java_outer_classname = "Employee";
      /*
      @Indexed(true)
      */
      message Employee {
          repeated MapFieldEntry pairs = 1;
      }
      message MapFieldEntry {
        optional string key = 1;
        optional InnerEmployee value = 2;
      }
      message InnerEmployee {
             optional string empNo = 1;
          optional string name = 2;
          optional string dateOfBirth = 3;
      }
      

      5] InnerEmployeeMarshaller.java

       package com.auruspay.infinispan.marshaller;
      
      import java.io.IOException;
      import org.infinispan.protostream.MessageMarshaller;
      import com.auruspay.infinispan.pojo.Employee;
      
      public class InnerEmployeeMarshaller implements MessageMarshaller<Employee.InnerEmployee> {
      
          @Override
          public Class<? extends Employee.InnerEmployee> getJavaClass() {
              return Employee.InnerEmployee.class;
          }
      
          @Override
          public String getTypeName() {
              return "com.auruspay.infinispan.proto.InnerEmployee";
          }
        
          @Override
          public Employee.InnerEmployee readFrom(ProtoStreamReader reader) throws IOException {
              Employee employee = new Employee();
              Employee.InnerEmployee emp = employee. new InnerEmployee();
              emp.setEmpNo(reader.readString("empNo"));
              emp.setName(reader.readString("name"));
              emp.setDateOfBirth(reader.readString("dateOfBirth"));
              return emp;
          }
        
          @Override
          public void writeTo(ProtoStreamWriter writer,Employee.InnerEmployee emp) throws IOException {
              writer.writeString("empNo", emp.getEmpNo());
              writer.writeString("name", emp.getName());
              writer.writeString("dateOfBirth", emp.getDateOfBirth());
          }
      }
      

      6] How EmployeeMarshaller should be designed ?

       

      Thanks In Advance !!!