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

com.caucho.v5.bartender.link.LinkBartenderSystem 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.bartender.link;

import java.util.Objects;
import java.util.concurrent.atomic.AtomicLong;
import java.util.logging.Level;

import com.caucho.v5.amp.Amp;
import com.caucho.v5.amp.AmpSystem;
import com.caucho.v5.amp.ServicesAmp;
import com.caucho.v5.amp.ServiceRefAmp;
import com.caucho.v5.amp.service.ServiceRefAlias;
import com.caucho.v5.amp.spi.ServiceManagerBuilderAmp;
import com.caucho.v5.amp.spi.ShutdownModeAmp;
import com.caucho.v5.bartender.BartenderSystem;
import com.caucho.v5.bartender.ServerBartender;
import com.caucho.v5.bartender.hamp.AuthHampManager;
import com.caucho.v5.bartender.hamp.HampManager;
import com.caucho.v5.bartender.hamp.HampManagerBuilder;
import com.caucho.v5.bartender.heartbeat.HeartbeatSeedService;
import com.caucho.v5.bartender.heartbeat.HeartbeatSeedServiceImpl;
import com.caucho.v5.bartender.heartbeat.ServerHeartbeat;
import com.caucho.v5.bartender.pod.SchemeBartenderPodProxy;
import com.caucho.v5.config.ConfigException;
import com.caucho.v5.http.pod.PodContainer;
import com.caucho.v5.network.NetworkSystemBartender;
import com.caucho.v5.subsystem.SubSystemBase;
import com.caucho.v5.subsystem.SystemManager;
import com.caucho.v5.util.L10N;


/**
 * The link system manages connections between bartender servers.
 */
public class LinkBartenderSystem extends SubSystemBase
{
  private static final L10N L = new L10N(LinkBartenderSystem.class);
  
  // priority must be before network so it's available to handle incoming
  // messages
  public static final int START_PRIORITY
    = NetworkSystemBartender.START_PRIORITY + 1;
  
  private final AmpSystem _ampSystem;
  
  private final HampManager _linkManager;
  private final ServerBartender _serverSelf;
  
  private final AtomicLong _externalMessageReadCount = new AtomicLong();
  private final AtomicLong _externalMessageWriteCount = new AtomicLong();
  
  private AuthHampManager _authManager;
  
  private SchemeBartenderBase _schemeBartenderSystem;
  private SchemeBartenderBase _schemeBartenderPod;

  // private RampServiceRef _systemActorRef;

  private LinkBartenderService _linkService;

  //private RootBartender _rootBartender;

  private BartenderSystem _bartender;

  private HampManager _linkManagerPublic;
  
  private LinkBartenderSystem(BartenderSystem bartender)
  {
    Objects.requireNonNull(bartender);
    
    _bartender = bartender;
    _serverSelf = bartender.serverSelf();
    // _rootBartender = rootBartender;
    
    _ampSystem = AmpSystem.getCurrent();
    
    if (_ampSystem == null) {
      throw new ConfigException(L.l("{0} requires an active {1}",
                                    getClass().getSimpleName(),
                                    AmpSystem.class.getSimpleName()));
    }
    
    ServicesAmp rampManager = _ampSystem.getManager();
    
    _linkManager = createChampManager();
    _linkManagerPublic = createLinkManagerPublic();
    
    ServiceRefAmp systemRef = rampManager.service("system://");
    
    // String alias = HampServer.calculateHostName(selfServer) + "/system";
    String alias = "public:///system";

    ServiceRefAmp aliasSystemRef = new ServiceRefAlias(alias, systemRef);
    
    rampManager.registry().bind(alias, aliasSystemRef);
    
    init();
  }
  
  public static LinkBartenderSystem createAndAddSystem(BartenderSystem bartender)
  {
    SystemManager system = SystemManager.getCurrent();
    
    LinkBartenderSystem champ = new LinkBartenderSystem(bartender);
    
    system.addSystem(champ);
    
    return champ;
  }
  
  protected ServerBartender getServerSelf()
  {
    return _serverSelf;
  }

  private HampManager createChampManager()
  {
    ServicesAmp ampManager = AmpSystem.currentManager();
    
    LinkBartenderServiceImpl linkServiceImpl
      = new LinkBartenderServiceImpl(getServerSelf());
    
    _linkService = ampManager.newService(linkServiceImpl)
                             .as(LinkBartenderService.class);
    
    HeartbeatSeedServiceImpl seedService
      = new HeartbeatSeedServiceImpl((ServerHeartbeat) _serverSelf);
    
    ampManager.newService(seedService).address("public://" + HeartbeatSeedService.ADDRESS).ref();
    
    // .bind("/system/cluster")
    
    //_champService = ampManager.createProxy(_systemActorRef, 
    //                          ChampSystemService.class);
    
    // _champService = _systemActorRef.as(ChampSystemService.class);
   
    HampManagerBuilder builder = new HampManagerBuilder();
    builder.ampManager(()->ampManager);
    builder.serverSelf(_serverSelf);
    
    return new LinkBartenderManager(builder, _linkService);
  }

  private HampManager createLinkManagerPublic()
  {
    ServicesAmp ampManager = ServicesAmp.newManager().start();
    
    HeartbeatSeedServiceImpl seedService
      = new HeartbeatSeedServiceImpl((ServerHeartbeat) _serverSelf);
    
    ampManager.newService(seedService).address("public://" + HeartbeatSeedService.ADDRESS).ref();
   
    HampManagerBuilder builder = new HampManagerBuilder();
    builder.ampManager(()->ampManager);
    builder.serverSelf(_serverSelf);
    
    return new HampManager(builder);
  }
  
  protected void init()
  {
    ServicesAmp rampManager = getManager();
      
    ServerLinkBartenderBuilder builder = new ServerLinkBartenderBuilder();
    builder.rampManager(rampManager);
      
    _schemeBartenderSystem = new SchemeBartenderSystem(_bartender,
                                                       builder,
                                                       getServerSelf());
    
    _schemeBartenderSystem.bind("bartender:");
  }
  
  public void initNetworkService(NetworkSystemBartender networkSystem)
  {
    networkSystem.serviceBartender(_linkManager.serverPath(),
                                   _linkManager.serverFactory());
    networkSystem.serviceBartender(_linkManager.unidirPath(),
                                   _linkManager.unidirFactory());
    
    networkSystem.servicePublic(_linkManagerPublic.serverPath(),
                                _linkManagerPublic.serverFactory());
  }
  
  public String getAddress()
  {
    return _ampSystem.getAddress();
  }
  
  public ServicesAmp getManager()
  {
    return _ampSystem.getManager();
  }
  
  public SchemeBartenderBase getSchemeBartenderPod()
  {
    return _schemeBartenderPod;
  }

  @Override
  protected Level getLifecycleLogLevel()
  {
    return Level.FINER;
  }

  AuthHampManager getAuthManager()
  {
    return _authManager;
  }
  
  @Override
  public int getStartPriority()
  {
    return START_PRIORITY;
  }
  
  @Override
  public void start()
    throws Exception
  {
    super.start();
    
    PodContainer podContainer = PodContainer.getCurrent();
    
    if (podContainer != null) {
      ServiceManagerBuilderAmp ampBuilder = ServicesAmp.newManager();
      //ServiceManagerBartender ampManagerChamp = new ServiceManagerBartender(rampBuilder);
      // ServiceManagerAmp ampManagerPod = Amp.newManager();
      
      ampBuilder.name("system-pod," + _serverSelf.getDisplayName());
      ampBuilder.autoServices(true);
      ServicesAmp ampManagerPod = ampBuilder.start();
      
      ampManagerPod.inboxSystem().serviceRef().bind("public:///system");
      
      ServiceRefPodAppRoot podAppRootRef
        = new ServiceRefPodAppRoot(ampManagerPod, podContainer);
      
      podAppRootRef.bind("public:///s");

      // cluster: scheme for reply
      ServerLinkBartenderBuilder linkBuilder = new ServerLinkBartenderBuilder();
      linkBuilder.rampManager(ampManagerPod);
      linkBuilder.webSocketPath("/pod");

      SchemeBartenderBase schemeBartenderPod;
      schemeBartenderPod = new SchemeBartenderPod(_bartender, linkBuilder, 
                                                  getServerSelf());
      schemeBartenderPod.bind(schemeBartenderPod.address());

      _schemeBartenderPod = schemeBartenderPod;

      // bartender-pod: is bound in AmpSystem
      ServicesAmp ampManager = _ampSystem.getManager();
      SchemeBartenderPodProxy schemeBartenderPodProxy
        = new SchemeBartenderPodProxy(_bartender, ampManager, null);
      schemeBartenderPodProxy.bind(schemeBartenderPodProxy.address());

      // hamp protocol /pod manages the pod requests
      HampManagerBuilder builder = new HampManagerBuilder();
      builder.unidirPath("/pod");
      builder.replyScheme("bartender-pod:");
      builder.ampManager(()->ampManagerPod);
      builder.serverSelf(_serverSelf);

      HampManager hampManager = new HampManager(builder);

      if (true) { throw new UnsupportedOperationException(); }
      //NetworkSystem.getCurrent().publishBartender(hampManager.getUnidirEndpointConfig());
    }
    
    _linkManager.start();
  }
  
  @Override
  public void stop(ShutdownModeAmp mode)
    throws Exception
  {
    super.stop(mode);
    
    _schemeBartenderSystem.close();
  }

  public void addExternalMessageRead()
  {
    _externalMessageReadCount.incrementAndGet();
  }
  
  public long getExternalMessageReadCount()
  {
    return _externalMessageReadCount.get();
  }

  public void addExternalMessageWrite()
  {
    _externalMessageWriteCount.incrementAndGet();
  }
  
  public long getExternalMessageWriteCount()
  {
    return _externalMessageWriteCount.get();
  }
  
  @Override
  public String toString()
  {
    return getClass().getSimpleName() + "[" + getAddress() + "]";
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy