class RemoteIncomingServerSession extends RemoteSession implements IncomingServerSession {

    private String localDomain;
    private AuthenticationMethod authenticationMethod;
    private Collection<String> validatedDomains;

    public RemoteIncomingServerSession(byte[] nodeID, StreamID streamID) {
        super(nodeID, null);
        this.streamID = streamID;
    }

    @Override
    public AuthenticationMethod getAuthenticationMethod() {<FILL_FUNCTION_BODY>}

    public JID getAddress() {
        if (address == null) {
            RemoteSessionTask task = getRemoteSessionTask(RemoteSessionTask.Operation.getAddress);
            address = (JID) doSynchronousClusterTask(task);
        }
        return address;
    }

    public Collection<String> getValidatedDomains() {
        if (validatedDomains == null) {
            RemoteSessionTask task = getRemoteSessionTask(RemoteSessionTask.Operation.getValidatedDomains);
            validatedDomains = (Collection<String>) doSynchronousClusterTask(task);
        }
        return validatedDomains;
    }

    public String getLocalDomain() {
        if (localDomain == null) {
            RemoteSessionTask task = getRemoteSessionTask(RemoteSessionTask.Operation.getLocalDomain);
            localDomain = (String) doSynchronousClusterTask(task);
        }
        return localDomain;
    }

    RemoteSessionTask getRemoteSessionTask(RemoteSessionTask.Operation operation) {
        return new IncomingServerSessionTask(operation, streamID);
    }

    ClusterTask getDeliverRawTextTask(String text) {
        return new DeliverRawTextTask(streamID, text);
    }

    ClusterTask getProcessPacketTask(Packet packet) {
        return new ProcessPacketTask(streamID, packet);
    }
}

        if (authenticationMethod == null) {
            ClusterTask task = getRemoteSessionTask(RemoteSessionTask.Operation.getAuthenticationMethod);
            authenticationMethod = (AuthenticationMethod) doSynchronousClusterTask(task);
        }
        return authenticationMethod;
    
<methods>public void <init>(byte[], JID) ,public void close() ,public void deliverRawText(java.lang.String) ,public JID getAddress() ,public java.lang.String getCipherSuiteName() ,public java.util.Date getCreationDate() ,public java.lang.String getHostAddress() throws java.net.UnknownHostException,public java.lang.String getHostName() throws java.net.UnknownHostException,public final java.util.Locale getLanguage() ,public java.util.Date getLastActiveDate() ,public long getNumClientPackets() ,public long getNumServerPackets() ,public java.security.cert.Certificate[] getPeerCertificates() ,public java.lang.String getServerName() ,public Map<java.lang.String,java.lang.String> getSoftwareVersion() ,public org.jivesoftware.openfire.session.Session.Status getStatus() ,public org.jivesoftware.openfire.StreamID getStreamID() ,public java.lang.String getTLSProtocolName() ,public boolean isClosed() ,public boolean isEncrypted() ,public boolean isSecure() ,public void process(Packet) ,public boolean validate() <variables>protected JID address,private java.util.Date creationDate,private java.lang.String hostAddress,private java.lang.String hostName,protected byte[] nodeID,private java.lang.String serverName,protected org.jivesoftware.openfire.StreamID streamID