Package org.snova.framework.proxy.gae

Source Code of org.snova.framework.proxy.gae.GAE

package org.snova.framework.proxy.gae;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.arch.event.Event;
import org.arch.event.EventHandler;
import org.arch.event.EventHeader;
import org.arch.util.ListSelector;
import org.arch.util.StringHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.snova.framework.event.CommonEventConstants;
import org.snova.framework.event.CommonEvents;
import org.snova.framework.event.gae.AdminResponseEvent;
import org.snova.framework.event.gae.AuthRequestEvent;
import org.snova.framework.event.gae.AuthResponseEvent;
import org.snova.framework.event.gae.RequestSharedAppIDEvent;
import org.snova.framework.event.gae.RequestSharedAppIDResultEvent;
import org.snova.framework.proxy.RemoteProxyHandler;
import org.snova.framework.proxy.RemoteProxyManager;
import org.snova.framework.proxy.RemoteProxyManagerHolder;
import org.snova.framework.proxy.c4.C4;

public class GAE
{
  protected static Logger             logger  = LoggerFactory
                                                      .getLogger(GAE.class);
  public static boolean             enable;
  static ListSelector<GAEServerAuth>  servers  = new ListSelector<GAEServerAuth>();
 
  public static class GAERemoteProxyManager implements RemoteProxyManager
  {
    @Override
    public String getName()
    {
      return "GAE";
    }
   
    @Override
    public RemoteProxyHandler createProxyHandler(Map<String, String> attr)
    {
      if (attr.containsKey("App"))
      {
        String appid = attr.get("App");
        for (int i = 0; i < servers.size(); i++)
        {
          if (servers.get(i).appid.equals(appid))
          {
            return new GAERemoteHandler(servers.get(i));
          }
        }
      }
      GAERemoteHandler handler = new GAERemoteHandler(null);
      handler.injectRange = attr.containsKey("Range");
      return handler;
    }
  }
 
  private static boolean auth(final GAEServerAuth server)
  {
    AuthRequestEvent event = new AuthRequestEvent();
    event.appid = server.appid.trim();
    event.user = server.user.trim();
    event.passwd = server.passwd.trim();
    final GAERemoteHandler handler = new GAERemoteHandler(server);
    handler.requestEvent(event, new EventHandler()
    {
      @Override
      public void onEvent(EventHeader header, Event event)
      {
        if (header.type == CommonEventConstants.AUTH_RESPONSE_EVENT_TYPE)
        {
          AuthResponseEvent res = (AuthResponseEvent) event;
          server.token = res.token;
          if (!StringHelper.isEmptyString(res.token))
          {
            logger.info("Auth token is " + res.token);
          }
          if (!StringHelper.isEmptyString(res.error))
          {
            logger.error("Failed to connect GAE server:"
                    + res.error);
          }
        }
        synchronized (handler)
        {
          handler.notify();
        }
      }
    });
    synchronized (handler)
    {
      try
      {
        handler.wait(60000);
      }
      catch (InterruptedException e)
      {
      }
    }
    return !StringHelper.isEmptyString(server.token);
  }
 
  private static List<GAEServerAuth> fetchSharedAppIDs()
  {
    GAEServerAuth auth = new GAEServerAuth();
    auth.appid = GAEConfig.masterAppID;
    auth.user = "anonymouse";
    auth.passwd = "anonymouse";
    final List<GAEServerAuth> appids = new ArrayList<GAEServerAuth>();
    GAERemoteHandler handler = new GAERemoteHandler(auth);
    handler.requestEvent(new RequestSharedAppIDEvent(), new EventHandler()
    {
      @Override
      public void onEvent(EventHeader header, Event event)
      {
        if (header.type == CommonEventConstants.REQUEST_SHARED_APPID_RESULT_EVENT_TYPE)
        {
          RequestSharedAppIDResultEvent res = (RequestSharedAppIDResultEvent) event;
          for (String s : res.appids)
          {
            GAEServerAuth tmp = new GAEServerAuth();
            tmp.appid = s;
            tmp.user = "anonymouse";
            tmp.passwd = "anonymouse";
            appids.add(tmp);
          }
        }
        else if (header.type == CommonEventConstants.ADMIN_RESPONSE_EVENT_TYPE)
        {
          AdminResponseEvent ev = (AdminResponseEvent) event;
          logger.error("Failed to get shared appid:" + ev.errorCause);
        }
        synchronized (appids)
        {
          appids.notify();
        }
      }
    });
    synchronized (appids)
    {
      try
      {
        appids.wait(30000);
      }
      catch (InterruptedException e)
      {
      }
      return appids;
    }
  }
 
  public static boolean init()
  {
   
    if (!GAEConfig.init())
    {
      return false;
    }
    logger.info("GAE init.");
    if (GAEConfig.appids.isEmpty())
    {
      if (C4.enable)
      {
        enable = false;
        logger.warn("Failed to init GAE since none appid configured.");
        return false;
      }
      GAEConfig.appids = fetchSharedAppIDs();
    }
   
    for (GAEServerAuth server : GAEConfig.appids)
    {
      if (auth(server))
      {
        servers.add(server);
      }
    }
    if (servers.size() == 0)
    {
      logger.warn("Failed to init GAE since none appid fetched.");
      return false;
    }
   
    RemoteProxyManagerHolder
            .registerRemoteProxyManager(new GAERemoteProxyManager());
    enable = true;
    return true;
  }
 
}
TOP

Related Classes of org.snova.framework.proxy.gae.GAE

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.