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

Posted on

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 !!!

Responses