Skip to content

Commit

Permalink
fix extension locate issue
Browse files Browse the repository at this point in the history
  • Loading branch information
fulan.zjf committed Aug 20, 2020
1 parent 94fad64 commit e09d58d
Show file tree
Hide file tree
Showing 8 changed files with 199 additions and 48 deletions.
2 changes: 1 addition & 1 deletion cola-framework-common/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
<groupId>com.aliyun</groupId>
<artifactId>cola-common</artifactId>
<packaging>jar</packaging>
<version>3.0.0</version>
<version>3.0.1</version>

<name>cola common</name>
<url>https://github.com/alibaba/COLA</url>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@
* @date 2019-08-20 12:07
*/
public class BizScenario {
public final static String DEFAULT_BIZ_ID = "defaultBizId";
public final static String DEFAULT_USE_CASE = "defaultUseCase";
public final static String DEFAULT_SCENARIO = "defaultScenario";
public final static String DEFAULT_BIZ_ID = "#defaultBizId#";
public final static String DEFAULT_USE_CASE = "#defaultUseCase#";
public final static String DEFAULT_SCENARIO = "#defaultScenario#";
private final static String DOT_SEPARATOR = ".";

/**
Expand Down Expand Up @@ -46,15 +46,26 @@ public static BizScenario valueOf(String bizId, String useCase, String scenario)
return bizScenario;
}

public static BizScenario valueOf(String bizId){
return BizScenario.valueOf(bizId, DEFAULT_USE_CASE, DEFAULT_SCENARIO);
public static BizScenario valueOf(String bizId, String useCase){
return BizScenario.valueOf(bizId, useCase, DEFAULT_SCENARIO);
}

public static BizScenario valueOf(String useCase, String scenario){
return BizScenario.valueOf(DEFAULT_BIZ_ID, useCase, scenario);
public static BizScenario valueOf(String bizId){
return BizScenario.valueOf(bizId, DEFAULT_USE_CASE, DEFAULT_SCENARIO);
}

public static BizScenario newDefault(){
return BizScenario.valueOf(DEFAULT_BIZ_ID, DEFAULT_USE_CASE, DEFAULT_SCENARIO);
}

public String getIdentityWithDefaultScenario(){
this.scenario = DEFAULT_SCENARIO;
return getUniqueIdentity();
}

public String getIdentityWithDefaultUseCase(){
this.scenario = DEFAULT_SCENARIO;
this.useCase = DEFAULT_USE_CASE;
return getUniqueIdentity();
}
}
5 changes: 3 additions & 2 deletions cola-framework-core/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
<groupId>com.aliyun</groupId>
<artifactId>cola-core</artifactId>
<packaging>jar</packaging>
<version>3.0.0</version>
<version>3.0.1</version>

<name>Cola core</name>
<url>https://github.com/alibaba/COLA</url>
Expand Down Expand Up @@ -58,7 +58,7 @@
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>cola-common</artifactId>
<version>3.0.0</version>
<version>3.0.1</version>
</dependency>

<dependency>
Expand Down Expand Up @@ -151,6 +151,7 @@
</execution>
</executions>
</plugin>
<!-- end -->

<plugin>
<groupId>org.sonatype.plugins</groupId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,85 +8,105 @@
package com.alibaba.cola.extension;

import com.alibaba.cola.boot.AbstractComponentExecutor;
import com.alibaba.cola.common.ColaConstant;
import com.alibaba.cola.exception.framework.ColaException;
import com.alibaba.cola.logger.Logger;
import com.alibaba.cola.logger.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

/**
* ExtensionExecutor
* ExtensionExecutor
* @author fulan.zjf 2017-11-05
*/
@Component
public class ExtensionExecutor extends AbstractComponentExecutor {

private Logger logger = LoggerFactory.getLogger(ExtensionExecutor.class);

@Autowired
@Resource
private ExtensionRepository extensionRepository;

@Override
protected <C> C locateComponent(Class<C> targetClz, BizScenario bizScenario) {
C extension = locateExtension(targetClz, bizScenario);
logger.debug("[Located Extension]: "+extension.getClass().getSimpleName());
logger.debug("[Located Extension]: " + extension.getClass().getSimpleName());
return extension;
}

/**
* if the bizScenarioUniqueIdentity is "ali.tmall.supermarket"
* if the bizScenarioUniqueIdentity is "ali.tmall.88vip"
*
* the search path is as below:
* 1、first try to get extension by "ali.tmall.supermarket", if get, return it.
* 2、loop try to get extension by "ali.tmall", if get, return it.
* 3、loop try to get extension by "ali", if get, return it.
* 1、first try to get extension by "ali.tmall.88vip", if get, return it.
* 2、second try to get extension by "ali.tmall.#defaultScenario#", if get, return it.
* 3、third try to get extension by "ali.#defaultUseCase#.#defaultScenario#", if get, return it.
* 4、if not found, try the default extension
* @param targetClz
*/
protected <Ext> Ext locateExtension(Class<Ext> targetClz, BizScenario bizScenario) {
checkNull(bizScenario);

Ext extension;
String bizScenarioUniqueIdentity = bizScenario.getUniqueIdentity();
logger.debug("BizScenario in locateExtension is : " + bizScenarioUniqueIdentity);

// first try
extension = firstTry(targetClz, bizScenarioUniqueIdentity);
logger.debug("BizScenario in locateExtension is : " + bizScenario.getUniqueIdentity());

// first try with full namespace
extension = firstTry(targetClz, bizScenario);
if (extension != null) {
return extension;
}

// second try with default scenario
extension = secondTry(targetClz, bizScenario);
if (extension != null) {
return extension;
}

// loop try
extension = loopTry(targetClz, bizScenarioUniqueIdentity);
// third try with default use case + default scenario
extension = defaultUseCaseTry(targetClz, bizScenario);
if (extension != null) {
return extension;
}

throw new ColaException("Can not find extension with ExtensionPoint: "+targetClz+" BizScenario:"+bizScenarioUniqueIdentity);
throw new ColaException("Can not find extension with ExtensionPoint: "+targetClz+" BizScenario:"+bizScenario.getUniqueIdentity());
}

private <Ext> Ext firstTry(Class<Ext> targetClz, String bizScenario) {
return (Ext)extensionRepository.getExtensionRepo().get(new ExtensionCoordinate(targetClz.getName(), bizScenario));
/**
* first try with full namespace
*
* example: biz1.useCase1.scenario1
*/
private <Ext> Ext firstTry(Class<Ext> targetClz, BizScenario bizScenario) {
logger.debug("First trying with " + bizScenario.getUniqueIdentity());
return locate(targetClz.getName(), bizScenario.getUniqueIdentity());
}

private <Ext> Ext loopTry(Class<Ext> targetClz, String bizScenario){
Ext extension;
if (bizScenario == null){
return null;
}
int lastDotIndex = bizScenario.lastIndexOf(ColaConstant.DOT_SEPARATOR);
while(lastDotIndex != -1){
bizScenario = bizScenario.substring(0, lastDotIndex);
extension =(Ext)extensionRepository.getExtensionRepo().get(new ExtensionCoordinate(targetClz.getName(), bizScenario));
if (extension != null) {
return extension;
}
lastDotIndex = bizScenario.lastIndexOf(ColaConstant.DOT_SEPARATOR);
}
return null;
/**
* second try with default scenario
*
* example: biz1.useCase1.#defaultScenario#
*/
private <Ext> Ext secondTry(Class<Ext> targetClz, BizScenario bizScenario){
logger.debug("Second trying with " + bizScenario.getIdentityWithDefaultScenario());
return locate(targetClz.getName(), bizScenario.getIdentityWithDefaultScenario());
}

/**
* third try with default use case + default scenario
*
* example: biz1.#defaultUseCase#.#defaultScenario#
*/
private <Ext> Ext defaultUseCaseTry(Class<Ext> targetClz, BizScenario bizScenario){
logger.debug("Third trying with " + bizScenario.getIdentityWithDefaultUseCase());
return locate(targetClz.getName(), bizScenario.getIdentityWithDefaultUseCase());
}

private <Ext> Ext locate(String name, String uniqueIdentity) {
final Ext ext = (Ext) extensionRepository.getExtensionRepo().
get(new ExtensionCoordinate(name, uniqueIdentity));
return ext;
}

private void checkNull(BizScenario bizScenario){
if(bizScenario == null){
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
package com.alibaba.cola.test;

import com.alibaba.cola.TestSpringConfig;
import com.alibaba.cola.dto.Response;
import com.alibaba.cola.extension.BizScenario;
import com.alibaba.cola.test.customer.*;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;

import javax.annotation.Resource;

/**
* ExtensionTest
*
* @author Frank Zhang
* @date 2020-08-20 12:45 PM
*/
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = {TestSpringConfig.class})
public class ExtensionTest {

@Resource
private CustomerServiceI customerService;

@Test
public void testBiz1UseCase1Scenario1AddCustomerSuccess(){
//1. Prepare
AddCustomerCmd addCustomerCmd = new AddCustomerCmd();
CustomerCO customerCO = new CustomerCO();
customerCO.setCompanyName("alibaba");
customerCO.setSource(Constants.SOURCE_RFQ);
customerCO.setCustomerType(CustomerType.IMPORTANT);
addCustomerCmd.setCustomerCO(customerCO);
BizScenario scenario = BizScenario.valueOf(Constants.BIZ_1, Constants.USE_CASE_1, Constants.SCENARIO_1);
addCustomerCmd.setBizScenario(scenario);

//2. Execute
Response response = customerService.addCustomer(addCustomerCmd);

//3. Expect Success
Assert.assertTrue(response.isSuccess());
}

@Test
public void testBiz1UseCase1AddCustomerSuccess(){
//1. Prepare
AddCustomerCmd addCustomerCmd = new AddCustomerCmd();
CustomerCO customerCO = new CustomerCO();
customerCO.setCompanyName("alibaba");
customerCO.setSource(Constants.SOURCE_RFQ);
customerCO.setCustomerType(CustomerType.IMPORTANT);
addCustomerCmd.setCustomerCO(customerCO);
BizScenario scenario = BizScenario.valueOf(Constants.BIZ_1, Constants.USE_CASE_1);
addCustomerCmd.setBizScenario(scenario);

//2. Execute
Response response = customerService.addCustomer(addCustomerCmd);

//3. Expect Success
Assert.assertTrue(response.isSuccess());
}

@Test
public void testBiz1AddCustomerSuccess(){
//1. Prepare
AddCustomerCmd addCustomerCmd = new AddCustomerCmd();
CustomerCO customerCO = new CustomerCO();
customerCO.setCompanyName("jingdong");
customerCO.setSource(Constants.SOURCE_RFQ);
customerCO.setCustomerType(CustomerType.IMPORTANT);
addCustomerCmd.setCustomerCO(customerCO);
BizScenario scenario = BizScenario.valueOf(Constants.BIZ_1);
addCustomerCmd.setBizScenario(scenario);

//2. Execute
Response response = customerService.addCustomer(addCustomerCmd);

//3. Expect Success
Assert.assertTrue(response.isSuccess());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,11 @@
public class Constants {

public static final String BIZ_1 = "BIZ_ONE";
public static final String USE_CASE_1 = "USE_CASE_ONE";
public static final String SCENARIO_1 = "SCENARIO_ONE";
public static final String BIZ_2 = "BIZ_TWO";

public static final String TENANT_ID = "122344";


public static final String SOURCE_AD = "Advertisement";
public static final String SOURCE_WB = "Web site";
public static final String SOURCE_RFQ = "Request For Quota";
public static final String SOURCE_MARKETING = "Marketing";
public static final String SOURCE_OFFLINE = "Off Line";
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.alibaba.cola.test.customer.validator.extension;

import com.alibaba.cola.extension.Extension;
import com.alibaba.cola.test.customer.AddCustomerCmd;
import com.alibaba.cola.test.customer.Constants;
import com.alibaba.cola.test.customer.validator.extensionpoint.AddCustomerValidatorExtPt;

/**
* AddCustomerBiz1UseCase1Scenario1Validator
*
* @author Frank Zhang
* @date 2020-08-20 1:01 PM
*/
@Extension(bizId = Constants.BIZ_1, useCase = Constants.USE_CASE_1, scenario = Constants.SCENARIO_1)
public class AddCustomerBiz1UseCase1Scenario1Validator implements AddCustomerValidatorExtPt {
public void validate(AddCustomerCmd addCustomerCmd) {
System.out.println("Do validation for Biz_One's Use_Case_One's Scenario_One");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.alibaba.cola.test.customer.validator.extension;

import com.alibaba.cola.extension.Extension;
import com.alibaba.cola.test.customer.AddCustomerCmd;
import com.alibaba.cola.test.customer.Constants;
import com.alibaba.cola.test.customer.validator.extensionpoint.AddCustomerValidatorExtPt;

/**
* AddCustomerBiz1UseCase1Validator
*
* @author Frank Zhang
* @date 2020-08-20 12:58 PM
*/
@Extension(bizId = Constants.BIZ_1, useCase = Constants.USE_CASE_1)
public class AddCustomerBiz1UseCase1Validator implements AddCustomerValidatorExtPt {
public void validate(AddCustomerCmd addCustomerCmd) {
System.out.println("Do validation for Biz_One's Use_Case_One");
}
}

0 comments on commit e09d58d

Please sign in to comment.