Package com.bj58.spat.gaea.server.deploy.bytecode

Source Code of com.bj58.spat.gaea.server.deploy.bytecode.ProxyFactoryCreater

/*
*  Copyright Beijing 58 Information Technology Co.,Ltd.
*
*  Licensed to the Apache Software Foundation (ASF) under one
*  or more contributor license agreements.  See the NOTICE file
*  distributed with this work for additional information
*  regarding copyright ownership.  The ASF licenses this file
*  to you under the Apache License, Version 2.0 (the
*  "License"); you may not use this file except in compliance
*  with the License.  You may obtain a copy of the License at
*
*        http://www.apache.org/licenses/LICENSE-2.0
*
*  Unless required by applicable law or agreed to in writing,
*  software distributed under the License is distributed on an
*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
*  KIND, either express or implied.  See the License for the
*  specific language governing permissions and limitations
*  under the License.
*/
package com.bj58.spat.gaea.server.deploy.bytecode;

import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtConstructor;
import javassist.CtField;
import javassist.CtMethod;

import com.bj58.spat.gaea.server.contract.context.Global;
import com.bj58.spat.gaea.server.contract.log.ILog;
import com.bj58.spat.gaea.server.contract.log.LogFactory;
import com.bj58.spat.gaea.server.deploy.hotdeploy.DynamicClassLoader;

/**
*
* @author Service Platform Architecture Team (spat@58.com)
*/
public class ProxyFactoryCreater {

  private static ILog logger = LogFactory.getLogger(ProxyFactoryCreater.class);
 
  @SuppressWarnings("rawtypes")
  public ClassFile createProxy(DynamicClassLoader classLoader, ContractInfo serviceContract, long time) throws Exception {
    String pfClsName = "ProxyFactory" + time;
    logger.info("begin create ProxyFactory:" + pfClsName);
    ClassPool pool = ClassPool.getDefault();
    List<String> jarList = classLoader.getJarList();
    for(String jar : jarList) {
      pool.appendClassPath(jar);
    }
   
    CtClass ctProxyClass = pool.makeClass(pfClsName, null);

    CtClass proxyFactory = pool.getCtClass(Constant.IPROXYFACTORY_CLASS_NAME);
    ctProxyClass.addInterface(proxyFactory);
   
    //createProxy
    StringBuilder sbBody = new StringBuilder();
    sbBody.append("public " + Constant.IPROXYSTUB_CLASS_NAME + " getProxy(String lookup) {");
    StringBuilder sbConstructor = new StringBuilder();
    sbConstructor.append("{");
    int proxyCount = 0;
    for (ContractInfo.SessionBean sessionBean : serviceContract.getSessionBeanList()) {
      Iterator it = sessionBean.getInstanceMap().entrySet().iterator();
      while (it.hasNext()) {
        Map.Entry entry = (Map.Entry) it.next();
        String lookup = entry.getKey().toString();

        sbBody.append("if(lookup.equalsIgnoreCase(\"" + lookup + "\")){");
        sbBody.append("return proxy");
        sbBody.append(lookup);
        sbBody.append(Global.getSingleton().getServiceConfig().getString("gaea.service.name"));
        sbBody.append(";}");
       
        sbConstructor.append("proxy");
        sbConstructor.append(lookup);
        sbConstructor.append(Global.getSingleton().getServiceConfig().getString("gaea.service.name"));
        sbConstructor.append("=(");
        sbConstructor.append(Constant.IPROXYSTUB_CLASS_NAME);
        sbConstructor.append(")$1.get(");
        sbConstructor.append(proxyCount);
        sbConstructor.append(");");
       
        CtField proxyField = CtField.make(
            "private "
             + Constant.IPROXYSTUB_CLASS_NAME+" proxy"
             + lookup + Global.getSingleton().getServiceConfig().getString("gaea.service.name")
             + " = null;",
            ctProxyClass);
       
        ctProxyClass.addField(proxyField);
       
        proxyCount++;
      }
    }
    sbBody.append("return null;}}");
    sbConstructor.append("}");

    CtMethod methodItem = CtMethod.make(sbBody.toString(), ctProxyClass);
    ctProxyClass.addMethod(methodItem);
   
      CtConstructor cc = new CtConstructor(new CtClass[]{pool.get("java.util.List")}, ctProxyClass);
      cc.setBody(sbConstructor.toString());
      ctProxyClass.addConstructor(cc);

    logger.debug("ProxyFactory source code:"+sbBody.toString());

      logger.info("create ProxyFactory success!!!");
     
    return new ClassFile(pfClsName, ctProxyClass.toBytecode());
  }
}
TOP

Related Classes of com.bj58.spat.gaea.server.deploy.bytecode.ProxyFactoryCreater

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.