All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.caucho.v5.amp.service.MethodRefBase Maven / Gradle / Ivy

There is a newer version: 1.0.1
Show newest version
/*
 * Copyright (c) 1998-2015 Caucho Technology -- all rights reserved
 *
 * This file is part of Baratine(TM)
 *
 * Each copy or derived work must preserve the copyright notice and this
 * notice unmodified.
 *
 * Baratine is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * Baratine 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, or any warranty
 * of NON-INFRINGEMENT.  See the GNU General Public License for more
 * details.
 *
 * You should have received a copy of the GNU General Public License
 * along with Baratine; if not, write to the
 *
 *   Free Software Foundation, Inc.
 *   59 Temple Place, Suite 330
 *   Boston, MA 02111-1307  USA
 *
 * @author Scott Ferguson
 */

package com.caucho.v5.amp.service;

import java.io.Serializable;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import java.util.concurrent.TimeUnit;

import com.caucho.v5.amp.ServicesAmp;
import com.caucho.v5.amp.ServiceRefAmp;
import com.caucho.v5.amp.message.HeadersNull;
import com.caucho.v5.amp.message.QueryWithResultMessage_N;
import com.caucho.v5.amp.message.ResultStreamAmp;
import com.caucho.v5.amp.message.SendMessage_N;
import com.caucho.v5.amp.message.StreamCallMessage;
import com.caucho.v5.amp.spi.HeadersAmp;
import com.caucho.v5.amp.spi.InboxAmp;
import com.caucho.v5.amp.spi.MessageAmp;
import com.caucho.v5.amp.spi.MethodRefAmp;
import com.caucho.v5.amp.spi.OutboxAmp;
import com.caucho.v5.amp.stub.MethodAmp;
import com.caucho.v5.amp.stub.ParameterAmp;
import com.caucho.v5.amp.stub.StubAmp;

import io.baratine.service.Result;
import io.baratine.spi.Headers;
import io.baratine.stream.ResultStream;

/**
 * Sender for an actor ref.
 */
abstract public class MethodRefBase implements MethodRefAmp, Serializable
{
  @Override
  public boolean isUp()
  {
    return true;
  }
  
  @Override
  public boolean isClosed()
  {
    return false;
  }
  
  @Override
  public void offer(MessageAmp msg)
  {
    throw new UnsupportedOperationException(getClass().getName());
  }
  
  @Override
  public Type getReturnType()
  {
    return method().getReturnType();
  }

  @Override
  public MethodAmp method()
  {
    throw new UnsupportedOperationException(getClass().getName());
  }

  @Override
  public ServiceRefAmp serviceRef()
  {
    throw new UnsupportedOperationException(getClass().getName());
  }

  @Override
  public InboxAmp inbox()
  {
    return serviceRef().inbox();
  }
  
  @Override
  public StubAmp stubActive(StubAmp actorDeliver)
  {
    return actorDeliver;
  }
  
  public Annotation []getAnnotations()
  {
    return method().getAnnotations();
  }
  
  @Override
  public ParameterAmp []parameters()
  {
    return method().parameters();
  }
  
  @Override
  public boolean isVarArgs()
  {
    return method().isVarArgs();
  }

  @Override
  public void send(Headers headers, Object... args)
  {
    try (OutboxAmp outbox = OutboxAmp.currentOrCreate(serviceRef().manager())) {
      HeadersAmp headersAmp = (HeadersAmp) headers;
      MessageAmp msg = new SendMessage_N(outbox, headersAmp, serviceRef(), method(), args);
    
      long timeout = Integer.MAX_VALUE; // use queue default timeout
    
      msg.offer(timeout);
    }
  }

  @Override
  public void send(Object... args)
  {
    send(HeadersNull.NULL, args);
  }

  @Override
  public  void query(Headers headers,
                        Result result,
                        Object... args)
  {
    long timeout = 15000;
    
    query(headers, result, timeout, TimeUnit.MILLISECONDS, args);
  }

  @Override
  public  void query(Result result, Object... args)
  {
    query(HeadersNull.NULL, result, args);
  }

  @Override
  public  void query(Headers headers,
                        Result result, 
                        long timeout, TimeUnit timeUnit,
                        Object... args)
  {
    QueryWithResultMessage_N msg;
    
    if (timeUnit != null) {
      timeout = timeUnit.toMillis(timeout);
    }
    
    ServicesAmp manager = serviceRef().manager();
    try (OutboxAmp outbox = OutboxAmp.currentOrCreate(manager)) {
      // OutboxAmp outbox = manager.getCurrentOutbox();
      // InboxAmp inbox = outbox.getInbox();
      
      msg = new QueryWithResultMessage_N(outbox, result, timeout,
                                            serviceRef(), method(),
                                            args);
    
      msg.offer(timeout);
    } catch (Throwable e) {
      result.fail(e);
    }
  }

  @Override
  public  void stream(Headers headers,
                         ResultStream result,
                         Object... args)
  {
    StreamCallMessage msg;
    
    long timeout = -1;
    
    try (OutboxAmp outbox = OutboxAmp.currentOrCreate(serviceRef().manager())) {
      HeadersAmp headersAmp = HeadersNull.NULL;
      
      InboxAmp inboxCaller;
      
      if (result instanceof ResultStreamAmp) {
        inboxCaller = ((ResultStreamAmp) result).getInbox();
      }
      else {
        inboxCaller = outbox.inbox();
      }
    
      msg = new StreamCallMessage(outbox, inboxCaller, headersAmp,
                                     serviceRef(), method(), result,
                                     timeout, args);
    
      msg.offer(timeout);
    }
  }
  
  private Object writeReplace()
  {
    return new MethodRefHandle(serviceRef().address(), getName());
  }

  @Override
  public String toString()
  {
    return getClass().getSimpleName() + "[]";
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy