From 7d1c7c59692b0c1422c3aded32375aeba43f4315 Mon Sep 17 00:00:00 2001 From: shaozhuguang Date: Tue, 4 Jun 2019 11:29:33 +0800 Subject: [PATCH 1/5] Change String.getBytes() to UTF-8 Encode ! --- .../transaction/DataAccountKVSetOperationBuilderImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/DataAccountKVSetOperationBuilderImpl.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/DataAccountKVSetOperationBuilderImpl.java index c0511e55..537efdf7 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/DataAccountKVSetOperationBuilderImpl.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/DataAccountKVSetOperationBuilderImpl.java @@ -32,10 +32,10 @@ public class DataAccountKVSetOperationBuilderImpl implements DataAccountKVSetOpe public DataAccountKVSetOperationBuilder set(String key, String value, long expVersion) { BytesValue bytesValue; if (JSONSerializeUtils.isJSON(value)) { - bytesValue = new BytesValueEntry(BytesValueType.JSON, value.getBytes()); + bytesValue = new BytesValueEntry(BytesValueType.JSON, BytesUtils.toBytes(value)); } else { - bytesValue = new BytesValueEntry(BytesValueType.TEXT, value.getBytes()); + bytesValue = new BytesValueEntry(BytesValueType.TEXT, BytesUtils.toBytes(value)); } operation.set(key, bytesValue, expVersion); return this; From 81bc88bcb3c74c809b86391eefec5f728323f066 Mon Sep 17 00:00:00 2001 From: zhaoguangwei Date: Tue, 4 Jun 2019 19:27:32 +0800 Subject: [PATCH 2/5] add MavenProject object in plugin's test; --- .../com/jd/blockchain/consts/DataCodes.java | 1 + source/contract/contract-maven-plugin/pom.xml | 52 +++++++--- .../com/jd/blockchain/CheckImportsMojo.java | 1 + .../ledger/CheckImportsMojoTest.java | 26 +++-- .../jd/blockchain/ledger/MyProjectStub.java | 67 +++++++++++++ .../project-to-test/AssetContract2.java | 40 ++++++++ .../project-to-test/AssetContractImpl2.java | 99 +++++++++++++++++++ .../jd/blockchain/ledger/ContractArgs.java | 14 +++ .../sdk/test/SDK_Contract_Test.java | 22 +++++ 9 files changed, 294 insertions(+), 28 deletions(-) create mode 100644 source/contract/contract-maven-plugin/src/test/java/com/jd/blockchain/ledger/MyProjectStub.java create mode 100644 source/contract/contract-maven-plugin/src/test/resources/project-to-test/AssetContract2.java create mode 100644 source/contract/contract-maven-plugin/src/test/resources/project-to-test/AssetContractImpl2.java create mode 100644 source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ContractArgs.java diff --git a/source/base/src/main/java/com/jd/blockchain/consts/DataCodes.java b/source/base/src/main/java/com/jd/blockchain/consts/DataCodes.java index a7382d0a..48cffbc7 100644 --- a/source/base/src/main/java/com/jd/blockchain/consts/DataCodes.java +++ b/source/base/src/main/java/com/jd/blockchain/consts/DataCodes.java @@ -90,6 +90,7 @@ public interface DataCodes { public static final int CONTRACT_BIG_INT = 0xA07; //...0xA19 public static final int CONTRACT_BIZ_CONTENT = 0xA20; + public static final int CONTRACT_ARGS = 0xA21; public static final int HASH = 0xB00; diff --git a/source/contract/contract-maven-plugin/pom.xml b/source/contract/contract-maven-plugin/pom.xml index 0a357e52..626790d1 100644 --- a/source/contract/contract-maven-plugin/pom.xml +++ b/source/contract/contract-maven-plugin/pom.xml @@ -10,6 +10,10 @@ contract-maven-plugin maven-plugin + + 3.3.9 + + com.jd.blockchain @@ -35,32 +39,54 @@ ${project.version} - - - org.apache.maven.plugin-tools - maven-plugin-annotations - 3.6.0 - provided + com.github.javaparser + javaparser-core + ${javaparser.version} + org.apache.maven maven-plugin-api - 2.0 + 3.3.9 org.apache.maven - maven-project - 2.0.6 + maven-core + 3.3.9 - - com.github.javaparser - javaparser-core - ${javaparser.version} + org.apache.maven + maven-artifact + 3.3.9 + provided + + + org.apache.maven + maven-compat + 3.3.9 + + + junit + junit + 4.12 + test + + + org.apache.maven.plugin-testing + maven-plugin-testing-harness + test + 3.3.0 + + + org.apache.maven.plugin-tools + maven-plugin-annotations + 3.6.0 + provided + diff --git a/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/CheckImportsMojo.java b/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/CheckImportsMojo.java index 7c62b31c..4f9279a7 100644 --- a/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/CheckImportsMojo.java +++ b/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/CheckImportsMojo.java @@ -49,6 +49,7 @@ public class CheckImportsMojo extends AbstractMojo { } } } + } } catch (IOException exception) { logger.error(exception.getMessage()); diff --git a/source/contract/contract-maven-plugin/src/test/java/com/jd/blockchain/ledger/CheckImportsMojoTest.java b/source/contract/contract-maven-plugin/src/test/java/com/jd/blockchain/ledger/CheckImportsMojoTest.java index 9a91e4f6..8cdce97a 100644 --- a/source/contract/contract-maven-plugin/src/test/java/com/jd/blockchain/ledger/CheckImportsMojoTest.java +++ b/source/contract/contract-maven-plugin/src/test/java/com/jd/blockchain/ledger/CheckImportsMojoTest.java @@ -1,32 +1,28 @@ package com.jd.blockchain.ledger; import com.jd.blockchain.CheckImportsMojo; +import org.apache.maven.plugin.testing.AbstractMojoTestCase; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.io.InputStream; -import java.util.Arrays; -import java.util.Properties; +import java.io.File; /** * @Author zhaogw * @Date 2019/3/1 21:27 */ -public class CheckImportsMojoTest { +public class CheckImportsMojoTest extends AbstractMojoTestCase { Logger logger = LoggerFactory.getLogger(CheckImportsMojo.class); @Test - public void test1() { - try { - InputStream inputStream = CheckImportsMojo.class.getClassLoader().getResourceAsStream("config.properties"); - Properties properties = new Properties(); - properties.load(inputStream); - String result[] = properties.getProperty("blacklist").split(","); - logger.info(Arrays.toString(result).toString()); - } catch (IOException e) { - logger.error(e.getMessage()); - } + public void test1() throws Exception { + File pom = getTestFile( "src/test/resources/project-to-test/pom.xml" ); + assertNotNull( pom ); + assertTrue( pom.exists() ); + + CheckImportsMojo myMojo = (CheckImportsMojo) lookupMojo( "checkImports", pom ); + assertNotNull( myMojo ); + myMojo.execute(); } } diff --git a/source/contract/contract-maven-plugin/src/test/java/com/jd/blockchain/ledger/MyProjectStub.java b/source/contract/contract-maven-plugin/src/test/java/com/jd/blockchain/ledger/MyProjectStub.java new file mode 100644 index 00000000..473115af --- /dev/null +++ b/source/contract/contract-maven-plugin/src/test/java/com/jd/blockchain/ledger/MyProjectStub.java @@ -0,0 +1,67 @@ +package com.jd.blockchain.ledger; + +import org.apache.maven.model.Build; +import org.apache.maven.model.Model; +import org.apache.maven.model.io.xpp3.MavenXpp3Reader; +import org.apache.maven.plugin.testing.stubs.MavenProjectStub; +import org.codehaus.plexus.util.ReaderFactory; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +/** + * @author zhaogw + * date 2019/6/4 18:33 + */ + +public class MyProjectStub extends MavenProjectStub +{ + /** + * Default constructor + */ + public MyProjectStub() + { + MavenXpp3Reader pomReader = new MavenXpp3Reader(); + Model model; + try + { + model = pomReader.read( ReaderFactory.newXmlReader( new File( getBasedir(), "pom.xml" ) ) ); + setModel( model ); + } + catch ( Exception e ) + { + throw new RuntimeException( e ); + } + + setGroupId( model.getGroupId() ); + setArtifactId( model.getArtifactId() ); + setVersion( model.getVersion() ); + setName( model.getName() ); + setUrl( model.getUrl() ); + setPackaging( model.getPackaging() ); + + Build build = new Build(); + build.setFinalName( model.getArtifactId() ); + build.setDirectory( getBasedir() + "/target" ); + build.setSourceDirectory( getBasedir() + "/src/main/java" ); + build.setOutputDirectory( getBasedir() + "/target/classes" ); + build.setTestSourceDirectory( getBasedir() + "/src/test/java" ); + build.setTestOutputDirectory( getBasedir() + "/target/test-classes" ); + setBuild( build ); + + List compileSourceRoots = new ArrayList(); + compileSourceRoots.add( getBasedir() + "/src/main/java" ); + setCompileSourceRoots( compileSourceRoots ); + + List testCompileSourceRoots = new ArrayList(); + testCompileSourceRoots.add( getBasedir() + "/src/test/java" ); + setTestCompileSourceRoots( testCompileSourceRoots ); + } + + /** {@inheritDoc} */ + public File getBasedir() + { + return new File( super.getBasedir() + "/src/test/resources/project-to-test/" ); + } +} diff --git a/source/contract/contract-maven-plugin/src/test/resources/project-to-test/AssetContract2.java b/source/contract/contract-maven-plugin/src/test/resources/project-to-test/AssetContract2.java new file mode 100644 index 00000000..b597558e --- /dev/null +++ b/source/contract/contract-maven-plugin/src/test/resources/project-to-test/AssetContract2.java @@ -0,0 +1,40 @@ +package com.jd.blockchain.contract; + +import com.jd.blockchain.ledger.ContractBizContent; +import com.jd.blockchain.utils.Bytes; + +/** + * 示例:一个“资产管理”智能合约; + * + * @author zhaogw + */ +@Contract +public interface AssetContract2 { + + /** + * 发行资产; + * 新发行的资产数量; + * @param assetHolderAddress + * 新发行的资产的持有账户; + */ + @ContractEvent(name = "issue-asset-0") + void issue(ContractBizContent contractBizContent, String assetHolderAddress); + + /** + * 发行资产; + * 新发行的资产数量; + * @param assetHolderAddress + * 新发行的资产的持有账户; + */ + @ContractEvent(name = "issue-asset") + void issue(ContractBizContent contractBizContent, String assetHolderAddress, long cashNumber); + + @ContractEvent(name = "issue-asset-2") + void issue(Bytes bytes, String assetHolderAddress, long cashNumber); + + @ContractEvent(name = "issue-asset-3") + void issue(Byte byteObj, String assetHolderAddress, long cashNumber); + + @ContractEvent(name = "issue-asset-4") + void issue(Byte byteObj, String assetHolderAddress, Bytes cashNumber); +} \ No newline at end of file diff --git a/source/contract/contract-maven-plugin/src/test/resources/project-to-test/AssetContractImpl2.java b/source/contract/contract-maven-plugin/src/test/resources/project-to-test/AssetContractImpl2.java new file mode 100644 index 00000000..06af2632 --- /dev/null +++ b/source/contract/contract-maven-plugin/src/test/resources/project-to-test/AssetContractImpl2.java @@ -0,0 +1,99 @@ +package com.jd.blockchain.contract; + +import com.jd.blockchain.ledger.ContractBizContent; +import com.jd.blockchain.ledger.KVDataEntry; +import com.jd.blockchain.ledger.KVDataObject; +import com.jd.blockchain.utils.Bytes; + +import java.util.Arrays; + +/** + * 示例:一个“资产管理”智能合约的实现; + * + * 注: 1、实现 EventProcessingAwire 接口以便合约实例在运行时可以从上下文获得合约生命周期事件的通知; 2、实现 + * AssetContract 接口定义的合约方法; + * + * @author huanghaiquan + * + */ +@Contract +public class AssetContractImpl2 implements EventProcessingAwire, AssetContract2 { + public static String KEY_TOTAL = "total"; + // 合约事件上下文; + private ContractEventContext eventContext; + + @Override + @ContractEvent(name = "issue-asset-0") + public void issue(ContractBizContent contractBizContent, String assetHolderAddress) { + System.out.println("input addr="+ Arrays.toString(contractBizContent.getAttrs())); + } + + @Override + @ContractEvent(name = "issue-asset") + public void issue(ContractBizContent contractBizContent, String assetHolderAddress, long cashNumber) { + System.out.println("eventContext="+eventContext.getCurrentLedgerHash().toBase58()); + System.out.println("getAttrs: "+Arrays.toString(contractBizContent.getAttrs())+",address="+assetHolderAddress+",cashNumber="+cashNumber); + + eventContext.getLedger().dataAccount(assetHolderAddress).set(contractBizContent.getAttrs()[0], "value1",-1); + eventContext.getLedger().dataAccount(assetHolderAddress).set(contractBizContent.getAttrs()[1], 888,-1); + } + + @Override + @ContractEvent(name = "issue-asset-2") + public void issue(Bytes bytes, String assetHolderAddress, long cashNumber){ + System.out.println(String.format("bytes=%s,assetHolderAddress=%s,cashNumber=%d",new String(bytes.toBytes()),assetHolderAddress,cashNumber)); + } + + @ContractEvent(name = "issue-asset-3") + @Override + public void issue(Byte byteObj, String assetHolderAddress, long cashNumber) { + System.out.println(String.format("issue(),bytes=%d,assetHolderAddress=%s,cashNumber=%d",byteObj.intValue(),assetHolderAddress,cashNumber)); + } + + @ContractEvent(name = "issue-asset-4") + @Override + public void issue(Byte byteObj, String assetHolderAddress, Bytes cashNumber) { + System.out.println(String.format("issue(),bytes=%d,assetHolderAddress=%s,cashNumber=%s",byteObj.intValue(),assetHolderAddress,cashNumber.toString())); + System.out.println("current LedgerHash="+eventContext.getCurrentLedgerHash().toBase58()); + // 查询当前值; + KVDataEntry[] kvEntries = eventContext.getLedger().getDataEntries(eventContext.getCurrentLedgerHash(), assetHolderAddress, KEY_TOTAL); +// 计算资产的发行总数; + KVDataObject curTotal = (KVDataObject) kvEntries[0]; + System.out.println("currTotal version="+curTotal.getVersion()+",value="+curTotal.getValue().toString()); + eventContext.getLedger().dataAccount(assetHolderAddress).set(KEY_TOTAL, 100,curTotal.getVersion()); + } + + /* + * (non-Javadoc) + * + * @see + * com.jd.blockchain.contract.model.EventProcessingAwire#beforeEvent(com.jd. + * blockchain.contract.model.ContractEventContext) + */ + @Override + public void beforeEvent(ContractEventContext eventContext) { + this.eventContext = eventContext; + } + + /* + * (non-Javadoc) + * + * @see com.jd.blockchain.contract.model.EventProcessingAwire#postEvent(com.jd. + * blockchain.contract.model.ContractEventContext, + * com.jd.blockchain.contract.model.ContractError) + */ + @Override + public void postEvent(ContractEventContext eventContext, ContractException error) { + this.eventContext = null; + } + + @Override + public void postEvent(ContractException error) { + + } + + @Override + public void postEvent() { + + } +} diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ContractArgs.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ContractArgs.java new file mode 100644 index 00000000..9cce0cee --- /dev/null +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ContractArgs.java @@ -0,0 +1,14 @@ +package com.jd.blockchain.ledger; +import com.jd.blockchain.binaryproto.DataContract; +import com.jd.blockchain.consts.DataCodes; + +import java.lang.reflect.Method; + +/** + * contract's args; + */ +@DataContract(code = DataCodes.CONTRACT_ARGS) +public interface ContractArgs { + Method getMethod(); + Object[] getArgs(); +} diff --git a/source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_Contract_Test.java b/source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_Contract_Test.java index 359b4dd4..9a1ff31d 100644 --- a/source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_Contract_Test.java +++ b/source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_Contract_Test.java @@ -18,10 +18,12 @@ import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.io.ClassPathResource; +import org.springframework.util.ReflectionUtils; import java.io.File; import java.io.FileInputStream; import java.io.IOException; +import java.lang.reflect.Method; import static org.junit.Assert.*; @@ -351,4 +353,24 @@ public class SDK_Contract_Test { ContractBizContent actualObj = BinaryProtocol.decodeAs(bizBytes,ContractBizContent.class); assertArrayEquals(contractBizContent.getAttrs(),actualObj.getAttrs()); } + + @Test + public void testContractArgs(){ + ContractBizContent contractBizContent = () -> new String[]{"param1"}; + Method method = ReflectionUtils.findMethod(AssetContract2.class,"issue",ContractBizContent.class,String.class); + ContractArgs contractArgs = new ContractArgs() { + @Override + public Method getMethod() { + return method; + } + + @Override + public Object[] getArgs() { + return new Object[]{contractBizContent,"hello"}; + } + }; + + //add the annotation; + + } } From a45da26d54cc6bcf90e6e351289c8de4049c2e6c Mon Sep 17 00:00:00 2001 From: zhaoguangwei Date: Thu, 6 Jun 2019 09:52:34 +0800 Subject: [PATCH 3/5] after compile then check the contract, test OK. --- .../com/jd/blockchain/CheckImportsMojo.java | 68 ++++++++++++++++++- .../ledger/CheckImportsMojoTest.java | 2 +- .../ledger/ContractDeployMojoTest.java | 5 +- 3 files changed, 69 insertions(+), 6 deletions(-) diff --git a/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/CheckImportsMojo.java b/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/CheckImportsMojo.java index 4f9279a7..64a12e20 100644 --- a/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/CheckImportsMojo.java +++ b/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/CheckImportsMojo.java @@ -4,6 +4,12 @@ import com.github.javaparser.JavaParser; import com.github.javaparser.ast.CompilationUnit; import com.github.javaparser.ast.ImportDeclaration; import com.github.javaparser.ast.NodeList; +import com.github.javaparser.ast.PackageDeclaration; +import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; +import com.github.javaparser.ast.body.MethodDeclaration; +import com.github.javaparser.ast.visitor.VoidVisitorAdapter; +import com.jd.blockchain.transaction.ContractType; +import com.jd.blockchain.utils.IllegalDataException; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.plugins.annotations.Mojo; @@ -12,15 +18,28 @@ import org.apache.maven.project.MavenProject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.net.URL; +import java.net.URLClassLoader; import java.nio.file.Files; import java.nio.file.Path; import java.util.List; import java.util.Properties; +import java.util.jar.Attributes; +import java.util.jar.JarFile; import java.util.stream.Collectors; - +/** + * first step, we want to parse the source code by javaParse. But it's repeated and difficult to parse the source. + * This is a try of "from Initail to Abandoned". + * Since we are good at the class, why not? + * Now we change a way of thinking, first we pre-compile the source code, then parse the *.jar. + * + * by zhaogw + * date 2019-06-05 16:17 + */ @Mojo(name = "checkImports") public class CheckImportsMojo extends AbstractMojo { Logger logger = LoggerFactory.getLogger(CheckImportsMojo.class); @@ -28,6 +47,12 @@ public class CheckImportsMojo extends AbstractMojo { @Parameter(defaultValue = "${project}", required = true, readonly = true) private MavenProject project; + /** + * jar's name; + */ + @Parameter + private String finalName; + @Override public void execute() throws MojoFailureException { List sources; @@ -40,6 +65,9 @@ public class CheckImportsMojo extends AbstractMojo { sources = Files.find(baseDirPath, Integer.MAX_VALUE, (file, attrs) -> (file.toString().endsWith(".java"))).collect(Collectors.toList()); for (Path path : sources) { CompilationUnit compilationUnit = JavaParser.parse(path); + + compilationUnit.accept(new MethodVisitor(), null); + NodeList imports = compilationUnit.getImports(); for (ImportDeclaration imp : imports) { String importName = imp.getName().asString(); @@ -50,6 +78,19 @@ public class CheckImportsMojo extends AbstractMojo { } } + //now we parse the jar; + String jarPath = project.getBuild().getDirectory()+ File.separator+finalName+".jar"; + File jarFile = new File(jarPath); + URL jarURL = jarFile.toURI().toURL(); + ClassLoader classLoader = new URLClassLoader(new URL[]{jarURL},this.getClass().getClassLoader()); + Attributes m = new JarFile(jarFile).getManifest().getMainAttributes(); + String contractMainClass = m.getValue(Attributes.Name.MAIN_CLASS); + try { + Class mainClass = classLoader.loadClass(contractMainClass); + ContractType.resolve(mainClass); + } catch (ClassNotFoundException e) { + throw new IllegalDataException(e.getMessage()); + } } } catch (IOException exception) { logger.error(exception.getMessage()); @@ -58,4 +99,29 @@ public class CheckImportsMojo extends AbstractMojo { logger.error(e.getMessage()); } } + + private class MethodVisitor extends VoidVisitorAdapter { + @Override + public void visit(MethodDeclaration n, Void arg) { + /* here you can access the attributes of the method. + this method will be called for all methods in this + CompilationUnit, including inner class methods */ + logger.info("method:"+n.getName()); + super.visit(n, arg); + } + + @Override + public void visit(ClassOrInterfaceDeclaration n, Void arg) { + logger.info("class:"+n.getName()+" extends:"+n.getExtendedTypes()+" implements:"+n.getImplementedTypes()); + + super.visit(n, arg); + } + + @Override + public void visit(PackageDeclaration n, Void arg) { + logger.info("package:"+n.getName()); + super.visit(n, arg); + } + + } } diff --git a/source/contract/contract-maven-plugin/src/test/java/com/jd/blockchain/ledger/CheckImportsMojoTest.java b/source/contract/contract-maven-plugin/src/test/java/com/jd/blockchain/ledger/CheckImportsMojoTest.java index 8cdce97a..66b194c0 100644 --- a/source/contract/contract-maven-plugin/src/test/java/com/jd/blockchain/ledger/CheckImportsMojoTest.java +++ b/source/contract/contract-maven-plugin/src/test/java/com/jd/blockchain/ledger/CheckImportsMojoTest.java @@ -13,7 +13,7 @@ import java.io.File; * @Date 2019/3/1 21:27 */ public class CheckImportsMojoTest extends AbstractMojoTestCase { - Logger logger = LoggerFactory.getLogger(CheckImportsMojo.class); + Logger logger = LoggerFactory.getLogger(CheckImportsMojoTest.class); @Test public void test1() throws Exception { diff --git a/source/contract/contract-maven-plugin/src/test/java/com/jd/blockchain/ledger/ContractDeployMojoTest.java b/source/contract/contract-maven-plugin/src/test/java/com/jd/blockchain/ledger/ContractDeployMojoTest.java index 85c02021..0d205758 100644 --- a/source/contract/contract-maven-plugin/src/test/java/com/jd/blockchain/ledger/ContractDeployMojoTest.java +++ b/source/contract/contract-maven-plugin/src/test/java/com/jd/blockchain/ledger/ContractDeployMojoTest.java @@ -1,10 +1,8 @@ package com.jd.blockchain.ledger; import com.jd.blockchain.ContractDeployMojo; -import org.junit.Test; import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; /** * for contract deploy and exe; @@ -14,8 +12,7 @@ import java.lang.reflect.InvocationTargetException; public class ContractDeployMojoTest { private ContractDeployMojo contractDeployMojo = new ContractDeployMojo(); - private void fieldHandle(String fieldName,Object objValue) throws NoSuchFieldException, - IllegalAccessException, NoSuchMethodException, InvocationTargetException, InstantiationException { + private void fieldHandle(String fieldName,Object objValue) throws NoSuchFieldException, IllegalAccessException { Field field = contractDeployMojo.getClass().getDeclaredField(fieldName);//name为类Instance中的private属性 field.setAccessible(true);//=true,可访问私有变量。 Class typeClass = field.getType(); From 7a9d5e5bbfb1d6383380700bfc7f34362f545c13 Mon Sep 17 00:00:00 2001 From: zhaoguangwei Date: Thu, 6 Jun 2019 09:55:52 +0800 Subject: [PATCH 4/5] after compile then check the contract, test OK. --- .../test/resources/project-to-test/pom.xml | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 source/contract/contract-maven-plugin/src/test/resources/project-to-test/pom.xml diff --git a/source/contract/contract-maven-plugin/src/test/resources/project-to-test/pom.xml b/source/contract/contract-maven-plugin/src/test/resources/project-to-test/pom.xml new file mode 100644 index 00000000..ea7962e8 --- /dev/null +++ b/source/contract/contract-maven-plugin/src/test/resources/project-to-test/pom.xml @@ -0,0 +1,24 @@ + + 4.0.0 + + com.jd.blockchain + project-to-test + 1.0-SNAPSHOT + jar + Test MyMojo + + + + + contract-maven-plugin + + + + + contract1 + + + + + \ No newline at end of file From 9fa2eb3272ef21923e43fe1913fffa3670efe9f4 Mon Sep 17 00:00:00 2001 From: zhaoguangwei Date: Thu, 6 Jun 2019 09:56:36 +0800 Subject: [PATCH 5/5] after compile then check the contract, test OK. --- .../project-to-test/target/contract.jar | Bin 0 -> 8016 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 source/contract/contract-maven-plugin/src/test/resources/project-to-test/target/contract.jar diff --git a/source/contract/contract-maven-plugin/src/test/resources/project-to-test/target/contract.jar b/source/contract/contract-maven-plugin/src/test/resources/project-to-test/target/contract.jar new file mode 100644 index 0000000000000000000000000000000000000000..7c172d0edcb2a34e5aeecddac90a767afd4c204a GIT binary patch literal 8016 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