diff --git a/source/contract/contract-maven-plugin/ReadME.MD b/source/contract/contract-maven-plugin/ReadME.MD new file mode 100644 index 00000000..fce27392 --- /dev/null +++ b/source/contract/contract-maven-plugin/ReadME.MD @@ -0,0 +1,274 @@ +# 合约编译插件使用教程 + +### 1、maven引入 + +在pom.xml文件中引入合约编译插件: +```xml + + com.jd.blockchain + contract-maven-plugin + 1.0.0.RELEASE + + + make-contract + package + + compile + + + + + + + com.jd.chain.contracts.ContractTestInfImpl + + + contract + + + +``` + +需要说明的几点如下: + + 1)version:请根据实际JDChain发布版本确认,不同版本会有区别; + + 2)executions->execution->id:该值请随意指定; + + 3)executions->execution->phase:建议使用package及其后续阶段(若不了解phase含义,请自行查阅相关信息); + + 4)executions->execution->goals->goal:必须使用compile; + + 5)mainClass:必填,该类为需要发布的合约执行类(注意此处是类,不是接口),必须正确配置; + + 6)finalName:必填,最终在编译正常的情况下,会产生{finalName}-jdchain-contract.jar文件,只有该文件是可以发布到JDChain的合约包; + + +### 2、执行命令 +使用mvn执行命令,下面两种方式均可: + +方式一:只执行contract插件命令 +```shell + mvn clean compile contract:compile +``` + +方式二:直接执行打包命令: +```shell +mvn clean package +``` + + +### 3、合约编写要求 +合约的执行结果会对整条链产生比较深刻的影响,为了使用户能够更好、更合理的使用合约,目前JDChain约定合约编写规则包括以下几点: + +(违反其中任何一点都可能导致合约编译失败,但即使合约编译通过也不能保证合约可百分百运行正常) + + + 1)合约工程必须引入com.jd.blockchain:sdk-pack:该包中有合约正常编写需要使用的基本类; + + 2)com.jd.blockchain:sdk-pack的scope必须定义为provided; + + 3)合约发布必须通过合约编译插件进行打包:合约编译插件不但会对Jar包进行校验,同时也会加入JDChain独有的特征,只有具有该特征的Jar才能正常发布; + + 4)合约中严禁使用随机数、IO、NIO等操作; + + 5)合约打包时,请使用provided排除常用的工具包,例如FastJson、apache下的一些工具包等; + + 6)合约必须有一个接口和该接口的实现类,详细要求如下: + - a. 接口必须有@Contract注解; + - b. 接口的可调用方法上必须有@ContractEvent注解,且每个注解中的name属性不能重复; + - c. 合约方法支持入参和返回值,其主要包括所有基本类型; + + + +### 4、合约案例 + +#### 4.1、代码实例 +以下是一个可创建银行账户,指定具体金额,并可以转账的合约代码(逻辑较简单,仅供参考): + +合约接口代码如下: +```java +package com.jd.chain.contract; + + +@Contract +public interface TransferContract { + + @ContractEvent(name = "create") + String create(String address, String account, long money); + + @ContractEvent(name = "transfer") + String transfer(String address, String from, String to, long money); + + @ContractEvent(name = "read") + long read(String address, String account); + + @ContractEvent(name = "readAll") + String readAll(String address, String account); +} + +``` + +合约实现类代码如下: +```java +package com.jd.chain.contract; + +import com.alibaba.fastjson.JSON; +import com.jd.blockchain.crypto.HashDigest; +import com.jd.blockchain.ledger.KVDataEntry; +import com.jd.blockchain.ledger.KVDataVO; +import com.jd.blockchain.ledger.KVInfoVO; + +public class TransferContractImpl implements EventProcessingAware, TransferContract { + + private ContractEventContext eventContext; + + private HashDigest ledgerHash; + + @Override + public String create(String address, String account, long money) { + KVDataEntry[] kvDataEntries = eventContext.getLedger().getDataEntries(ledgerHash, address, account); + // 肯定有返回值,但若不存在则返回version=-1 + if (kvDataEntries != null && kvDataEntries.length > 0) { + long currVersion = kvDataEntries[0].getVersion(); + if (currVersion > -1) { + throw new IllegalStateException(String.format("%s -> %s already have created !!!", address, account)); + } + eventContext.getLedger().dataAccount(address).setInt64(account, money, -1L); + } else { + throw new IllegalStateException(String.format("Ledger[%s] inner Error !!!", ledgerHash.toBase58())); + } + return String.format("DataAccountAddress[%s] -> Create(By Contract Operation) Account = %s and Money = %s Success!!! \r\n", + address, account, money); + } + + @Override + public String transfer(String address, String from, String to, long money) { + // 首先查询余额 + KVDataEntry[] kvDataEntries = eventContext.getLedger().getDataEntries(ledgerHash, address, from, to); + if (kvDataEntries == null || kvDataEntries.length != 2) { + throw new IllegalStateException(String.format("%s -> %s - %s may be not created !!!", address, from, to)); + } else { + // 判断from账号中钱数量是否足够 + long fromMoney = 0L, toMoney = 0L, fromVersion = 0L, toVersion = 0L; + for (KVDataEntry kvDataEntry : kvDataEntries) { + if (kvDataEntry.getKey().equals(from)) { + fromMoney = (long) kvDataEntry.getValue(); + fromVersion = kvDataEntry.getVersion(); + } else { + toMoney = (long) kvDataEntry.getValue(); + toVersion = kvDataEntry.getVersion(); + } + } + if (fromMoney < money) { + throw new IllegalStateException(String.format("%s -> %s not have enough money !!!", address, from)); + } + long fromNewMoney = fromMoney - money; + long toNewMoney = toMoney + money; + // 重新设置 + eventContext.getLedger().dataAccount(address).setInt64(from, fromNewMoney, fromVersion); + eventContext.getLedger().dataAccount(address).setInt64(to, toNewMoney, toVersion); + } + + return String.format("DataAccountAddress[%s] transfer from [%s] to [%s] and [money = %s] Success !!!", address, from, to, money); + } + + @Override + public long read(String address, String account) { + KVDataEntry[] kvDataEntries = eventContext.getLedger().getDataEntries(ledgerHash, address, account); + if (kvDataEntries == null || kvDataEntries.length == 0) { + return -1; + } + return (long)kvDataEntries[0].getValue(); + } + + @Override + public String readAll(String address, String account) { + KVDataEntry[] kvDataEntries = eventContext.getLedger().getDataEntries(ledgerHash, address, account); + // 获取最新的版本号 + if (kvDataEntries == null || kvDataEntries.length == 0) { + return ""; + } + long newestVersion = kvDataEntries[0].getVersion(); + if (newestVersion == -1) { + return ""; + } + KVDataVO[] kvDataVOS = new KVDataVO[1]; + long[] versions = new long[(int)newestVersion + 1]; + for (int i = 0; i < versions.length; i++) { + versions[i] = i; + } + KVDataVO kvDataVO = new KVDataVO(account, versions); + + kvDataVOS[0] = kvDataVO; + + KVInfoVO kvInfoVO = new KVInfoVO(kvDataVOS); + + KVDataEntry[] allEntries = eventContext.getLedger().getDataEntries(ledgerHash, address, kvInfoVO); + + return JSON.toJSONString(allEntries); + } + + @Override + public void beforeEvent(ContractEventContext eventContext) { + this.eventContext = eventContext; + this.ledgerHash = eventContext.getCurrentLedgerHash(); + } + + @Override + public void postEvent(ContractEventContext eventContext, Exception error) { + + } +} +``` + + +#### 4.2、pom.xml文件实例 + +```xml + + + + + com.jd.chain + 1.0.0.RELEASE + 4.0.0 + + contract-samples + + contract-samples + + + + com.jd.blockchain + sdk-pack + 1.0.0.RELEASE + provided + + + + com.alibaba + fastjson + 1.2.32 + provided + + + + + + + com.jd.blockchain + contract-maven-plugin + 1.0.0.RELEASE + + + make-contract + package + + compile + + + + + + + com.jd.chain.contract.TransferContractImpl + + + contract + + + + + + +``` \ No newline at end of file diff --git a/source/contract/contract-maven-plugin/pom.xml b/source/contract/contract-maven-plugin/pom.xml index 63f0e64c..6cca1389 100644 --- a/source/contract/contract-maven-plugin/pom.xml +++ b/source/contract/contract-maven-plugin/pom.xml @@ -10,10 +10,6 @@ contract-maven-plugin maven-plugin - - 3.3.9 - - com.jd.blockchain @@ -42,56 +38,24 @@ com.github.javaparser javaparser-core - ${javaparser.version} - org.apache.maven maven-plugin-api 3.3.9 - - org.apache.maven - maven-core - 3.3.9 - - - 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 - org.apache.maven.shared - maven-invoker - 3.0.1 + org.apache.maven.plugins + maven-assembly-plugin + 2.6 @@ -103,27 +67,6 @@ maven-plugin-plugin 3.5 - - + diff --git a/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/ContractCheckMojo.java b/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/ContractCheckMojo.java index 2cd5dba6..81e5f272 100644 --- a/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/ContractCheckMojo.java +++ b/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/ContractCheckMojo.java @@ -1,216 +1,216 @@ -package com.jd.blockchain.contract.maven; - -import org.apache.commons.io.FileUtils; -import org.apache.maven.model.Model; -import org.apache.maven.model.Plugin; -import org.apache.maven.model.PluginExecution; -import org.apache.maven.model.io.xpp3.MavenXpp3Reader; -import org.apache.maven.model.io.xpp3.MavenXpp3Writer; -import org.apache.maven.plugin.AbstractMojo; -import org.apache.maven.plugin.MojoFailureException; -import org.apache.maven.plugins.annotations.Mojo; -import org.apache.maven.plugins.annotations.Parameter; -import org.apache.maven.project.MavenProject; -import org.apache.maven.shared.invoker.*; -import org.codehaus.plexus.util.xml.Xpp3Dom; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - - -@Mojo(name = "contractCheck") -public class ContractCheckMojo extends AbstractMojo { - - Logger LOG = LoggerFactory.getLogger(ContractCheckMojo.class); - - public static final String CONTRACT_VERIFY = "contractVerify"; - - private static final String CONTRACT_MAVEN_PLUGIN = "contract-maven-plugin"; - - private static final String MAVEN_ASSEMBLY_PLUGIN = "maven-assembly-plugin"; - - private static final String JDCHAIN_PACKAGE = "com.jd.blockchain"; - - private static final String APACHE_MAVEN_PLUGINS = "org.apache.maven.plugins"; - - private static final String GOALS_VERIFY = "package"; - - private static final String GOALS_PACKAGE = "package"; - - private static final String OUT_POM_XML = "ContractPom.xml"; - - @Parameter(defaultValue = "${project}", required = true, readonly = true) - private MavenProject project; - - /** - * jar's name; - */ - @Parameter - private String finalName; - - /** - * mainClass; - */ - @Parameter - private String mainClass; - /** - * ledgerVersion; - */ - @Parameter - private String ledgerVersion; - - /** - * mvnHome; - */ - @Parameter - private String mvnHome; - - /** - * first compile the class, then parse it; - */ - @Override - public void execute() throws MojoFailureException { - compileFiles(); - } - - private void compileFiles() throws MojoFailureException { - try (FileInputStream fis = new FileInputStream(project.getFile())) { - - MavenXpp3Reader reader = new MavenXpp3Reader(); - Model model = reader.read(fis); - - //delete this plugin(contractCheck) from destination pom.xml;then add the proper plugins; - Plugin plugin = model.getBuild().getPluginsAsMap() - .get(JDCHAIN_PACKAGE + ":" + CONTRACT_MAVEN_PLUGIN); - if(plugin == null){ - plugin = model.getBuild().getPluginsAsMap() - .get(APACHE_MAVEN_PLUGINS + ":" + CONTRACT_MAVEN_PLUGIN); - } - - if(plugin == null) { - return; - } - - model.getBuild().removePlugin(plugin); - - List plugins = new ArrayList<>(); - plugins.add(createAssembly()); - plugins.add(createContractVerify()); - - model.getBuild().setPlugins(plugins); - - handle(model); - - } catch (Exception e) { - LOG.error(e.getMessage()); - throw new MojoFailureException(e.getMessage()); - } - } - - private void invokeCompile(File file) { - InvocationRequest request = new DefaultInvocationRequest(); - - Invoker invoker = new DefaultInvoker(); - try { - request.setPomFile(file); - - request.setGoals(Collections.singletonList(GOALS_VERIFY)); - invoker.setMavenHome(new File(mvnHome)); - invoker.execute(request); - } catch (MavenInvocationException e) { - LOG.error(e.getMessage()); - throw new IllegalStateException(e); - } - } - - private Plugin createContractVerify() { - Plugin plugin = new Plugin(); - plugin.setGroupId(JDCHAIN_PACKAGE); - plugin.setArtifactId(CONTRACT_MAVEN_PLUGIN); - plugin.setVersion(ledgerVersion); - - Xpp3Dom finalNameNode = new Xpp3Dom("finalName"); - finalNameNode.setValue(finalName); - Xpp3Dom configuration = new Xpp3Dom("configuration"); - configuration.addChild(finalNameNode); - - plugin.setConfiguration(configuration); - plugin.setExecutions(pluginExecution("make-assembly", GOALS_VERIFY, CONTRACT_VERIFY)); - - return plugin; - } - - private Plugin createAssembly() { - Plugin plugin = new Plugin(); - plugin.setArtifactId(MAVEN_ASSEMBLY_PLUGIN); - - Xpp3Dom configuration = new Xpp3Dom("configuration"); - - Xpp3Dom mainClassNode = new Xpp3Dom("mainClass"); - mainClassNode.setValue(mainClass); - - Xpp3Dom manifest = new Xpp3Dom("manifest"); - manifest.addChild(mainClassNode); - - Xpp3Dom archive = new Xpp3Dom("archive"); - archive.addChild(manifest); - - Xpp3Dom finalNameNode = new Xpp3Dom("finalName"); - finalNameNode.setValue(finalName); - - Xpp3Dom appendAssemblyId = new Xpp3Dom("appendAssemblyId"); - appendAssemblyId.setValue("false"); - - Xpp3Dom descriptorRef = new Xpp3Dom("descriptorRef"); - descriptorRef.setValue("jar-with-dependencies"); - Xpp3Dom descriptorRefs = new Xpp3Dom("descriptorRefs"); - descriptorRefs.addChild(descriptorRef); - - configuration.addChild(finalNameNode); - configuration.addChild(appendAssemblyId); - configuration.addChild(archive); - configuration.addChild(descriptorRefs); - - plugin.setConfiguration(configuration); - plugin.setExecutions(pluginExecution("make-assembly", GOALS_PACKAGE, "single")); - - return plugin; - } - - private List pluginExecution(String id, String phase, String goal) { - PluginExecution pluginExecution = new PluginExecution(); - pluginExecution.setId(id); - pluginExecution.setPhase(phase); - List goals = new ArrayList<>(); - goals.add(goal); - pluginExecution.setGoals(goals); - List pluginExecutions = new ArrayList<>(); - pluginExecutions.add(pluginExecution); - - return pluginExecutions; - } - - private void handle(Model model) throws IOException { - - MavenXpp3Writer mavenXpp3Writer = new MavenXpp3Writer(); - - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - - mavenXpp3Writer.write(outputStream, model); - - byte[] buffer = outputStream.toByteArray(); - - File outPom = new File(project.getBasedir().getPath(), OUT_POM_XML); - - FileUtils.writeByteArrayToFile(outPom, buffer); - - invokeCompile(outPom); - } -} +//package com.jd.blockchain.contract.maven; +// +//import org.apache.commons.io.FileUtils; +//import org.apache.maven.model.Model; +//import org.apache.maven.model.Plugin; +//import org.apache.maven.model.PluginExecution; +//import org.apache.maven.model.io.xpp3.MavenXpp3Reader; +//import org.apache.maven.model.io.xpp3.MavenXpp3Writer; +//import org.apache.maven.plugin.AbstractMojo; +//import org.apache.maven.plugin.MojoFailureException; +//import org.apache.maven.plugins.annotations.Mojo; +//import org.apache.maven.plugins.annotations.Parameter; +//import org.apache.maven.project.MavenProject; +//import org.apache.maven.shared.invoker.*; +//import org.codehaus.plexus.util.xml.Xpp3Dom; +//import org.slf4j.Logger; +//import org.slf4j.LoggerFactory; +// +//import java.io.ByteArrayOutputStream; +//import java.io.File; +//import java.io.FileInputStream; +//import java.io.IOException; +//import java.util.ArrayList; +//import java.util.Collections; +//import java.util.List; +// +// +//@Mojo(name = "contractCheck") +//public class ContractCheckMojo extends AbstractMojo { +// +// Logger LOG = LoggerFactory.getLogger(ContractCheckMojo.class); +// +// public static final String CONTRACT_VERIFY = "contractVerify"; +// +// private static final String CONTRACT_MAVEN_PLUGIN = "contract-maven-plugin"; +// +// private static final String MAVEN_ASSEMBLY_PLUGIN = "maven-assembly-plugin"; +// +// private static final String JDCHAIN_PACKAGE = "com.jd.blockchain"; +// +// private static final String APACHE_MAVEN_PLUGINS = "org.apache.maven.plugins"; +// +// private static final String GOALS_VERIFY = "package"; +// +// private static final String GOALS_PACKAGE = "package"; +// +// private static final String OUT_POM_XML = "ContractPom.xml"; +// +// @Parameter(defaultValue = "${project}", required = true, readonly = true) +// private MavenProject project; +// +// /** +// * jar's name; +// */ +// @Parameter +// private String finalName; +// +// /** +// * mainClass; +// */ +// @Parameter +// private String mainClass; +// /** +// * ledgerVersion; +// */ +// @Parameter +// private String ledgerVersion; +// +// /** +// * mvnHome; +// */ +// @Parameter +// private String mvnHome; +// +// /** +// * first compile the class, then parse it; +// */ +// @Override +// public void execute() throws MojoFailureException { +// compileFiles(); +// } +// +// private void compileFiles() throws MojoFailureException { +// try (FileInputStream fis = new FileInputStream(project.getFile())) { +// +// MavenXpp3Reader reader = new MavenXpp3Reader(); +// Model model = reader.read(fis); +// +// //delete this plugin(contractCheck) from destination pom.xml;then add the proper plugins; +// Plugin plugin = model.getBuild().getPluginsAsMap() +// .get(JDCHAIN_PACKAGE + ":" + CONTRACT_MAVEN_PLUGIN); +// if(plugin == null){ +// plugin = model.getBuild().getPluginsAsMap() +// .get(APACHE_MAVEN_PLUGINS + ":" + CONTRACT_MAVEN_PLUGIN); +// } +// +// if(plugin == null) { +// return; +// } +// +// model.getBuild().removePlugin(plugin); +// +// List plugins = new ArrayList<>(); +// plugins.add(createAssembly()); +// plugins.add(createContractVerify()); +// +// model.getBuild().setPlugins(plugins); +// +// handle(model); +// +// } catch (Exception e) { +// LOG.error(e.getMessage()); +// throw new MojoFailureException(e.getMessage()); +// } +// } +// +// private void invokeCompile(File file) { +// InvocationRequest request = new DefaultInvocationRequest(); +// +// Invoker invoker = new DefaultInvoker(); +// try { +// request.setPomFile(file); +// +// request.setGoals(Collections.singletonList(GOALS_VERIFY)); +// invoker.setMavenHome(new File(mvnHome)); +// invoker.execute(request); +// } catch (MavenInvocationException e) { +// LOG.error(e.getMessage()); +// throw new IllegalStateException(e); +// } +// } +// +// private Plugin createContractVerify() { +// Plugin plugin = new Plugin(); +// plugin.setGroupId(JDCHAIN_PACKAGE); +// plugin.setArtifactId(CONTRACT_MAVEN_PLUGIN); +// plugin.setVersion(ledgerVersion); +// +// Xpp3Dom finalNameNode = new Xpp3Dom("finalName"); +// finalNameNode.setValue(finalName); +// Xpp3Dom configuration = new Xpp3Dom("configuration"); +// configuration.addChild(finalNameNode); +// +// plugin.setConfiguration(configuration); +// plugin.setExecutions(pluginExecution("make-assembly", GOALS_VERIFY, CONTRACT_VERIFY)); +// +// return plugin; +// } +// +// private Plugin createAssembly() { +// Plugin plugin = new Plugin(); +// plugin.setArtifactId(MAVEN_ASSEMBLY_PLUGIN); +// +// Xpp3Dom configuration = new Xpp3Dom("configuration"); +// +// Xpp3Dom mainClassNode = new Xpp3Dom("mainClass"); +// mainClassNode.setValue(mainClass); +// +// Xpp3Dom manifest = new Xpp3Dom("manifest"); +// manifest.addChild(mainClassNode); +// +// Xpp3Dom archive = new Xpp3Dom("archive"); +// archive.addChild(manifest); +// +// Xpp3Dom finalNameNode = new Xpp3Dom("finalName"); +// finalNameNode.setValue(finalName); +// +// Xpp3Dom appendAssemblyId = new Xpp3Dom("appendAssemblyId"); +// appendAssemblyId.setValue("false"); +// +// Xpp3Dom descriptorRef = new Xpp3Dom("descriptorRef"); +// descriptorRef.setValue("jar-with-dependencies"); +// Xpp3Dom descriptorRefs = new Xpp3Dom("descriptorRefs"); +// descriptorRefs.addChild(descriptorRef); +// +// configuration.addChild(finalNameNode); +// configuration.addChild(appendAssemblyId); +// configuration.addChild(archive); +// configuration.addChild(descriptorRefs); +// +// plugin.setConfiguration(configuration); +// plugin.setExecutions(pluginExecution("make-assembly", GOALS_PACKAGE, "single")); +// +// return plugin; +// } +// +// private List pluginExecution(String id, String phase, String goal) { +// PluginExecution pluginExecution = new PluginExecution(); +// pluginExecution.setId(id); +// pluginExecution.setPhase(phase); +// List goals = new ArrayList<>(); +// goals.add(goal); +// pluginExecution.setGoals(goals); +// List pluginExecutions = new ArrayList<>(); +// pluginExecutions.add(pluginExecution); +// +// return pluginExecutions; +// } +// +// private void handle(Model model) throws IOException { +// +// MavenXpp3Writer mavenXpp3Writer = new MavenXpp3Writer(); +// +// ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); +// +// mavenXpp3Writer.write(outputStream, model); +// +// byte[] buffer = outputStream.toByteArray(); +// +// File outPom = new File(project.getBasedir().getPath(), OUT_POM_XML); +// +// FileUtils.writeByteArrayToFile(outPom, buffer); +// +// invokeCompile(outPom); +// } +//} diff --git a/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/ContractCompileMojo.java b/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/ContractCompileMojo.java new file mode 100644 index 00000000..b0304ba0 --- /dev/null +++ b/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/ContractCompileMojo.java @@ -0,0 +1,30 @@ +package com.jd.blockchain.contract.maven; + +import org.apache.maven.plugin.MojoExecutionException; +import org.apache.maven.plugin.MojoFailureException; +import org.apache.maven.plugin.assembly.mojos.SingleAssemblyMojo; +import org.apache.maven.plugins.annotations.Mojo; + +@Mojo(name = "compile") +public class ContractCompileMojo extends SingleAssemblyMojo { + + public static final String JAR_DEPENDENCE = "jar-with-dependencies"; + + @Override + public void execute() throws MojoExecutionException, MojoFailureException { + // 要求必须有MainClass + try { + String mainClass = super.getJarArchiveConfiguration().getManifest().getMainClass(); + super.getLog().debug("MainClass is " + mainClass); + } catch (Exception e) { + throw new MojoFailureException("MainClass is null: " + e.getMessage(), e ); + } + super.setDescriptorRefs(new String[]{JAR_DEPENDENCE}); + + super.execute(); + + ContractResolveEngine engine = new ContractResolveEngine(getLog(), getProject(), getFinalName()); + + engine.compileAndVerify(); + } +} diff --git a/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/ContractDeployExeUtil.java b/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/ContractDeployExeUtil.java index 10aada08..bd6a1b23 100644 --- a/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/ContractDeployExeUtil.java +++ b/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/ContractDeployExeUtil.java @@ -1,176 +1,176 @@ -package com.jd.blockchain.contract.maven; - -import com.jd.blockchain.binaryproto.DataContractRegistry; -import com.jd.blockchain.crypto.HashDigest; -import com.jd.blockchain.crypto.PrivKey; -import com.jd.blockchain.crypto.PubKey; -import com.jd.blockchain.ledger.*; -import com.jd.blockchain.sdk.BlockchainService; -import com.jd.blockchain.sdk.client.GatewayServiceFactory; -import com.jd.blockchain.tools.keygen.KeyGenCommand; -import com.jd.blockchain.utils.Bytes; -import com.jd.blockchain.utils.codec.Base58Utils; -import com.jd.blockchain.utils.net.NetworkAddress; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; - -/** - * @Author zhaogw - * @Date 2018/11/2 10:18 - */ -public enum ContractDeployExeUtil { - instance; - private BlockchainService bcsrv; - private Bytes contractAddress; - - public BlockchainKeypair getKeyPair(String pubPath, String prvPath, String rawPassword){ - PubKey pub = null; - PrivKey prv = null; - try { - prv = KeyGenCommand.readPrivKey(prvPath, KeyGenCommand.encodePassword(rawPassword)); - pub = KeyGenCommand.readPubKey(pubPath); - - } catch (Exception e) { - e.printStackTrace(); - } - - return new BlockchainKeypair(pub, prv); - } - - public PubKey getPubKey(String pubPath){ - PubKey pub = null; - try { - if(pubPath == null){ - BlockchainKeypair contractKeyPair = BlockchainKeyGenerator.getInstance().generate(); - pub = contractKeyPair.getPubKey(); - }else { - pub = KeyGenCommand.readPubKey(pubPath); - } - - } catch (Exception e) { - e.printStackTrace(); - } - - return pub; - } - public byte[] getChainCode(String path){ - byte[] chainCode = null; - File file = null; - InputStream input = null; - try { - file = new File(path); - input = new FileInputStream(file); - chainCode = new byte[input.available()]; - input.read(chainCode); - - } catch (IOException e) { - e.printStackTrace(); - } finally { - try { - if(input!=null){ - input.close(); - } - } catch (IOException e) { - e.printStackTrace(); - } - } - return chainCode; - } - - private void register(){ - DataContractRegistry.register(TransactionContent.class); - DataContractRegistry.register(TransactionContentBody.class); - DataContractRegistry.register(TransactionRequest.class); - DataContractRegistry.register(NodeRequest.class); - DataContractRegistry.register(EndpointRequest.class); - DataContractRegistry.register(TransactionResponse.class); - DataContractRegistry.register(DataAccountKVSetOperation.class); - DataContractRegistry.register(DataAccountKVSetOperation.KVWriteEntry.class); - DataContractRegistry.register(Operation.class); - DataContractRegistry.register(ContractCodeDeployOperation.class); - DataContractRegistry.register(ContractEventSendOperation.class); - DataContractRegistry.register(DataAccountRegisterOperation.class); - DataContractRegistry.register(UserRegisterOperation.class); - } - - public BlockchainService initBcsrv(String host, int port) { - if(bcsrv!=null){ - return bcsrv; - } - NetworkAddress addr = new NetworkAddress(host, port); - GatewayServiceFactory gwsrvFact = GatewayServiceFactory.connect(addr); - bcsrv = gwsrvFact.getBlockchainService(); - return bcsrv; - } - - public boolean deploy(HashDigest ledgerHash, BlockchainIdentity contractIdentity, BlockchainKeypair ownerKey, byte[] chainCode){ - register(); - - TransactionTemplate txTpl = bcsrv.newTransaction(ledgerHash); - txTpl.contracts().deploy(contractIdentity, chainCode); - PreparedTransaction ptx = txTpl.prepare(); - ptx.sign(ownerKey); - // 提交并等待共识返回; - TransactionResponse txResp = ptx.commit(); - - // 验证结果; - contractAddress = contractIdentity.getAddress(); - this.setContractAddress(contractAddress); - System.out.println("contract's address="+contractAddress); - return txResp.isSuccess(); - } - public boolean deploy(String host, int port, HashDigest ledgerHash, BlockchainKeypair ownerKey, byte[] chainCode){ - register(); - - BlockchainIdentity contractIdentity = BlockchainKeyGenerator.getInstance().generate().getIdentity(); - initBcsrv(host,port); - return deploy(ledgerHash, contractIdentity, ownerKey, chainCode); - } - - // 根据用户指定的公钥生成合约地址 - public boolean deploy(String host, int port, String ledger,String ownerPubPath, String ownerPrvPath, - String ownerPassword, String chainCodePath,String pubPath){ - PubKey pubKey = getPubKey(pubPath); - BlockchainIdentity contractIdentity = new BlockchainIdentityData(pubKey); - byte[] chainCode = getChainCode(chainCodePath); - - BlockchainKeypair ownerKey = getKeyPair(ownerPubPath, ownerPrvPath, ownerPassword); - HashDigest ledgerHash = new HashDigest(Base58Utils.decode(ledger)); - initBcsrv(host,port); - return deploy(ledgerHash, contractIdentity, ownerKey, chainCode); - } - - -// 暂不支持从插件执行合约;此外,由于合约参数调用的格式发生变化,故此方法被废弃;by: huanghaiquan at 2019-04-30; - -// public boolean exeContract(String ledger,String ownerPubPath, String ownerPrvPath, -// String ownerPassword,String event,String contractArgs){ -// BlockchainKeypair ownerKey = getKeyPair(ownerPubPath, ownerPrvPath, ownerPassword); -// HashDigest ledgerHash = new HashDigest(Base58Utils.decode(ledger)); +//package com.jd.blockchain.contract.maven; // -// // 定义交易,传输最简单的数字、字符串、提取合约中的地址; -// TransactionTemplate txTpl = bcsrv.newTransaction(ledgerHash); -// txTpl.contractEvents().send(getContractAddress(),event,contractArgs.getBytes()); +//import com.jd.blockchain.binaryproto.DataContractRegistry; +//import com.jd.blockchain.crypto.HashDigest; +//import com.jd.blockchain.crypto.PrivKey; +//import com.jd.blockchain.crypto.PubKey; +//import com.jd.blockchain.ledger.*; +//import com.jd.blockchain.sdk.BlockchainService; +//import com.jd.blockchain.sdk.client.GatewayServiceFactory; +//import com.jd.blockchain.tools.keygen.KeyGenCommand; +//import com.jd.blockchain.utils.Bytes; +//import com.jd.blockchain.utils.codec.Base58Utils; +//import com.jd.blockchain.utils.net.NetworkAddress; +// +//import java.io.File; +//import java.io.FileInputStream; +//import java.io.IOException; +//import java.io.InputStream; +// +///** +// * @Author zhaogw +// * @Date 2018/11/2 10:18 +// */ +//public enum ContractDeployExeUtil { +// instance; +// private BlockchainService bcsrv; +// private Bytes contractAddress; +// +// public BlockchainKeypair getKeyPair(String pubPath, String prvPath, String rawPassword){ +// PubKey pub = null; +// PrivKey prv = null; +// try { +// prv = KeyGenCommand.readPrivKey(prvPath, KeyGenCommand.encodePassword(rawPassword)); +// pub = KeyGenCommand.readPubKey(pubPath); +// +// } catch (Exception e) { +// e.printStackTrace(); +// } +// +// return new BlockchainKeypair(pub, prv); +// } +// +// public PubKey getPubKey(String pubPath){ +// PubKey pub = null; +// try { +// if(pubPath == null){ +// BlockchainKeypair contractKeyPair = BlockchainKeyGenerator.getInstance().generate(); +// pub = contractKeyPair.getPubKey(); +// }else { +// pub = KeyGenCommand.readPubKey(pubPath); +// } +// +// } catch (Exception e) { +// e.printStackTrace(); +// } +// +// return pub; +// } +// public byte[] getChainCode(String path){ +// byte[] chainCode = null; +// File file = null; +// InputStream input = null; +// try { +// file = new File(path); +// input = new FileInputStream(file); +// chainCode = new byte[input.available()]; +// input.read(chainCode); +// +// } catch (IOException e) { +// e.printStackTrace(); +// } finally { +// try { +// if(input!=null){ +// input.close(); +// } +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return chainCode; +// } +// +// private void register(){ +// DataContractRegistry.register(TransactionContent.class); +// DataContractRegistry.register(TransactionContentBody.class); +// DataContractRegistry.register(TransactionRequest.class); +// DataContractRegistry.register(NodeRequest.class); +// DataContractRegistry.register(EndpointRequest.class); +// DataContractRegistry.register(TransactionResponse.class); +// DataContractRegistry.register(DataAccountKVSetOperation.class); +// DataContractRegistry.register(DataAccountKVSetOperation.KVWriteEntry.class); +// DataContractRegistry.register(Operation.class); +// DataContractRegistry.register(ContractCodeDeployOperation.class); +// DataContractRegistry.register(ContractEventSendOperation.class); +// DataContractRegistry.register(DataAccountRegisterOperation.class); +// DataContractRegistry.register(UserRegisterOperation.class); +// } +// +// public BlockchainService initBcsrv(String host, int port) { +// if(bcsrv!=null){ +// return bcsrv; +// } +// NetworkAddress addr = new NetworkAddress(host, port); +// GatewayServiceFactory gwsrvFact = GatewayServiceFactory.connect(addr); +// bcsrv = gwsrvFact.getBlockchainService(); +// return bcsrv; +// } +// +// public boolean deploy(HashDigest ledgerHash, BlockchainIdentity contractIdentity, BlockchainKeypair ownerKey, byte[] chainCode){ +// register(); // -// // 签名; +// TransactionTemplate txTpl = bcsrv.newTransaction(ledgerHash); +// txTpl.contracts().deploy(contractIdentity, chainCode); // PreparedTransaction ptx = txTpl.prepare(); // ptx.sign(ownerKey); -// // // 提交并等待共识返回; // TransactionResponse txResp = ptx.commit(); // // // 验证结果; +// contractAddress = contractIdentity.getAddress(); +// this.setContractAddress(contractAddress); +// System.out.println("contract's address="+contractAddress); // return txResp.isSuccess(); // } - - public Bytes getContractAddress() { - return contractAddress; - } - - public void setContractAddress(Bytes contractAddress) { - this.contractAddress = contractAddress; - } -} +// public boolean deploy(String host, int port, HashDigest ledgerHash, BlockchainKeypair ownerKey, byte[] chainCode){ +// register(); +// +// BlockchainIdentity contractIdentity = BlockchainKeyGenerator.getInstance().generate().getIdentity(); +// initBcsrv(host,port); +// return deploy(ledgerHash, contractIdentity, ownerKey, chainCode); +// } +// +// // 根据用户指定的公钥生成合约地址 +// public boolean deploy(String host, int port, String ledger,String ownerPubPath, String ownerPrvPath, +// String ownerPassword, String chainCodePath,String pubPath){ +// PubKey pubKey = getPubKey(pubPath); +// BlockchainIdentity contractIdentity = new BlockchainIdentityData(pubKey); +// byte[] chainCode = getChainCode(chainCodePath); +// +// BlockchainKeypair ownerKey = getKeyPair(ownerPubPath, ownerPrvPath, ownerPassword); +// HashDigest ledgerHash = new HashDigest(Base58Utils.decode(ledger)); +// initBcsrv(host,port); +// return deploy(ledgerHash, contractIdentity, ownerKey, chainCode); +// } +// +// +//// 暂不支持从插件执行合约;此外,由于合约参数调用的格式发生变化,故此方法被废弃;by: huanghaiquan at 2019-04-30; +// +//// public boolean exeContract(String ledger,String ownerPubPath, String ownerPrvPath, +//// String ownerPassword,String event,String contractArgs){ +//// BlockchainKeypair ownerKey = getKeyPair(ownerPubPath, ownerPrvPath, ownerPassword); +//// HashDigest ledgerHash = new HashDigest(Base58Utils.decode(ledger)); +//// +//// // 定义交易,传输最简单的数字、字符串、提取合约中的地址; +//// TransactionTemplate txTpl = bcsrv.newTransaction(ledgerHash); +//// txTpl.contractEvents().send(getContractAddress(),event,contractArgs.getBytes()); +//// +//// // 签名; +//// PreparedTransaction ptx = txTpl.prepare(); +//// ptx.sign(ownerKey); +//// +//// // 提交并等待共识返回; +//// TransactionResponse txResp = ptx.commit(); +//// +//// // 验证结果; +//// return txResp.isSuccess(); +//// } +// +// public Bytes getContractAddress() { +// return contractAddress; +// } +// +// public void setContractAddress(Bytes contractAddress) { +// this.contractAddress = contractAddress; +// } +//} diff --git a/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/ContractDeployMojo.java b/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/ContractDeployMojo.java index 25da2357..89a82a36 100644 --- a/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/ContractDeployMojo.java +++ b/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/ContractDeployMojo.java @@ -1,119 +1,120 @@ -package com.jd.blockchain.contract.maven; - -import com.jd.blockchain.crypto.HashDigest; -import com.jd.blockchain.crypto.PrivKey; -import com.jd.blockchain.crypto.PubKey; -import com.jd.blockchain.ledger.BlockchainKeypair; -import com.jd.blockchain.tools.keygen.KeyGenCommand; -import com.jd.blockchain.utils.StringUtils; -import com.jd.blockchain.utils.codec.Base58Utils; -import com.jd.blockchain.utils.io.FileUtils; -import org.apache.maven.plugin.AbstractMojo; -import org.apache.maven.plugin.MojoFailureException; -import org.apache.maven.plugins.annotations.Mojo; -import org.apache.maven.plugins.annotations.Parameter; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.Properties; - -/** - * for contract remote deploy; - * @goal contractDeploy - * @phase process-sources - * @Author zhaogw - * @Date 2018/10/18 10:12 - */ - -@Mojo(name = "deploy") -public class ContractDeployMojo extends AbstractMojo { - Logger logger = LoggerFactory.getLogger(ContractDeployMojo.class); - - @Parameter - private File config; - - @Override - public void execute()throws MojoFailureException { - Properties prop = new Properties(); - InputStream input = null; - - try { - input = new FileInputStream(config); - prop.load(input); - - } catch (IOException ex) { - logger.error(ex.getMessage()); - throw new MojoFailureException("io error"); - } finally { - if (input != null) { - try { - input.close(); - } catch (IOException e) { - logger.error(e.getMessage()); - } - } - } - int port; - try { - port = Integer.parseInt(prop.getProperty("port")); - }catch (NumberFormatException e){ - logger.error(e.getMessage()); - throw new MojoFailureException("invalid port"); - } - String host = prop.getProperty("host"); - String ledger = prop.getProperty("ledger"); - String pubKey = prop.getProperty("pubKey"); - String prvKey = prop.getProperty("prvKey"); - String password = prop.getProperty("password"); - String contractPath = prop.getProperty("contractPath"); - - - if(StringUtils.isEmpty(host)){ - logger.info("host不能为空"); - return; - } - - if(StringUtils.isEmpty(ledger)){ - logger.info("ledger不能为空."); - return; - } - if(StringUtils.isEmpty(pubKey)){ - logger.info("pubKey不能为空."); - return; - } - if(StringUtils.isEmpty(prvKey)){ - logger.info("prvKey不能为空."); - return; - } - if(StringUtils.isEmpty(contractPath)){ - logger.info("contractPath不能为空."); - return; - } - - File contract = new File(contractPath); - if (!contract.isFile()){ - logger.info("文件"+contractPath+"不存在"); - return; - } - byte[] contractBytes = FileUtils.readBytes(contractPath); - - - PrivKey prv = KeyGenCommand.decodePrivKeyWithRawPassword(prvKey, password); - PubKey pub = KeyGenCommand.decodePubKey(pubKey); - BlockchainKeypair blockchainKeyPair = new BlockchainKeypair(pub, prv); - HashDigest ledgerHash = new HashDigest(Base58Utils.decode(ledger)); - - StringBuffer sb = new StringBuffer(); - sb.append("host:"+ host).append(",port:"+port).append(",ledgerHash:"+ledgerHash.toBase58()). - append(",pubKey:"+pubKey).append(",prvKey:"+prv).append(",contractPath:"+contractPath); - logger.info(sb.toString()); - ContractDeployExeUtil.instance.deploy(host,port,ledgerHash, blockchainKeyPair, contractBytes); - } - -} - - +//package com.jd.blockchain.contract.maven; +// +//import com.jd.blockchain.crypto.HashDigest; +//import com.jd.blockchain.crypto.PrivKey; +//import com.jd.blockchain.crypto.PubKey; +//import com.jd.blockchain.ledger.BlockchainKeypair; +//import com.jd.blockchain.tools.keygen.KeyGenCommand; +//import com.jd.blockchain.utils.StringUtils; +//import com.jd.blockchain.utils.codec.Base58Utils; +//import com.jd.blockchain.utils.io.FileUtils; +//import org.apache.maven.plugin.AbstractMojo; +//import org.apache.maven.plugin.MojoFailureException; +//import org.apache.maven.plugins.annotations.Mojo; +//import org.apache.maven.plugins.annotations.Parameter; +//import org.slf4j.Logger; +//import org.slf4j.LoggerFactory; +// +//import java.io.File; +//import java.io.FileInputStream; +//import java.io.IOException; +//import java.io.InputStream; +//import java.util.Properties; +// +///** +// * for contract remote deploy; +// * @goal contractDeploy +// * @phase process-sources +// * @Author zhaogw +// * @Date 2018/10/18 10:12 +// */ +// +//@Mojo(name = "deploy") +//public class ContractDeployMojo extends AbstractMojo { +// Logger logger = LoggerFactory.getLogger(ContractDeployMojo.class); +// +// @Parameter +// private File config; +// +// @Override +// public void execute()throws MojoFailureException { +// +// Properties prop = new Properties(); +// InputStream input = null; +// +// try { +// input = new FileInputStream(config); +// prop.load(input); +// +// } catch (IOException ex) { +// logger.error(ex.getMessage()); +// throw new MojoFailureException("io error"); +// } finally { +// if (input != null) { +// try { +// input.close(); +// } catch (IOException e) { +// logger.error(e.getMessage()); +// } +// } +// } +// int port; +// try { +// port = Integer.parseInt(prop.getProperty("port")); +// }catch (NumberFormatException e){ +// logger.error(e.getMessage()); +// throw new MojoFailureException("invalid port"); +// } +// String host = prop.getProperty("host"); +// String ledger = prop.getProperty("ledger"); +// String pubKey = prop.getProperty("pubKey"); +// String prvKey = prop.getProperty("prvKey"); +// String password = prop.getProperty("password"); +// String contractPath = prop.getProperty("contractPath"); +// +// +// if(StringUtils.isEmpty(host)){ +// logger.info("host不能为空"); +// return; +// } +// +// if(StringUtils.isEmpty(ledger)){ +// logger.info("ledger不能为空."); +// return; +// } +// if(StringUtils.isEmpty(pubKey)){ +// logger.info("pubKey不能为空."); +// return; +// } +// if(StringUtils.isEmpty(prvKey)){ +// logger.info("prvKey不能为空."); +// return; +// } +// if(StringUtils.isEmpty(contractPath)){ +// logger.info("contractPath不能为空."); +// return; +// } +// +// File contract = new File(contractPath); +// if (!contract.isFile()){ +// logger.info("文件"+contractPath+"不存在"); +// return; +// } +// byte[] contractBytes = FileUtils.readBytes(contractPath); +// +// +// PrivKey prv = KeyGenCommand.decodePrivKeyWithRawPassword(prvKey, password); +// PubKey pub = KeyGenCommand.decodePubKey(pubKey); +// BlockchainKeypair blockchainKeyPair = new BlockchainKeypair(pub, prv); +// HashDigest ledgerHash = new HashDigest(Base58Utils.decode(ledger)); +// +// StringBuffer sb = new StringBuffer(); +// sb.append("host:"+ host).append(",port:"+port).append(",ledgerHash:"+ledgerHash.toBase58()). +// append(",pubKey:"+pubKey).append(",prvKey:"+prv).append(",contractPath:"+contractPath); +// logger.info(sb.toString()); +// ContractDeployExeUtil.instance.deploy(host,port,ledgerHash, blockchainKeyPair, contractBytes); +// } +// +//} +// +// diff --git a/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/ContractVerifyMojo.java b/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/ContractResolveEngine.java similarity index 80% rename from source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/ContractVerifyMojo.java rename to source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/ContractResolveEngine.java index 2ed416bc..7ce0b0a1 100644 --- a/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/ContractVerifyMojo.java +++ b/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/contract/maven/ContractResolveEngine.java @@ -6,13 +6,9 @@ import com.github.javaparser.ast.ImportDeclaration; import com.github.javaparser.ast.visitor.VoidVisitorAdapter; import com.jd.blockchain.contract.ContractType; import org.apache.commons.io.FileUtils; -import org.apache.maven.plugin.AbstractMojo; -import org.apache.maven.plugin.MojoExecutionException; -import org.apache.maven.plugins.annotations.Mojo; -import org.apache.maven.plugins.annotations.Parameter; +import org.apache.maven.plugin.MojoFailureException; +import org.apache.maven.plugin.logging.Log; import org.apache.maven.project.MavenProject; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.io.File; import java.io.IOException; @@ -24,32 +20,11 @@ import java.util.jar.Attributes; import java.util.jar.JarEntry; import java.util.jar.JarFile; -import static com.jd.blockchain.contract.maven.ContractCheckMojo.CONTRACT_VERIFY; +import static com.jd.blockchain.contract.maven.ContractCompileMojo.JAR_DEPENDENCE; import static com.jd.blockchain.utils.decompiler.utils.DecompilerUtils.decompileJarFile; import static com.jd.blockchain.utils.jar.ContractJarUtils.*; -/** - * 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 = CONTRACT_VERIFY) -public class ContractVerifyMojo extends AbstractMojo { - - Logger LOG = LoggerFactory.getLogger(ContractVerifyMojo.class); - - @Parameter(defaultValue = "${project}", required = true, readonly = true) - private MavenProject project; - - /** - * jar's name; - */ - @Parameter - private String finalName; +public class ContractResolveEngine { private static final String JAVA_SUFFIX = ".java"; @@ -66,19 +41,49 @@ public class ContractVerifyMojo extends AbstractMojo { private static final String BLACK_NAME_LIST = "black.name.list"; - @Override - public void execute() throws MojoExecutionException { + private Log LOGGER; + private MavenProject project; + + private String finalName; + + public ContractResolveEngine(Log LOGGER, MavenProject project, String finalName) { + this.LOGGER = LOGGER; + this.project = project; + this.finalName = finalName; + } + + public void compileAndVerify() throws MojoFailureException { try { + jarCopy(); + verify(compileCustomJar()); + } catch (IOException e) { + throw new MojoFailureException("IO Error : " + e.getMessage(), e); + } catch (MojoFailureException ex) { + throw ex; + } + } - File jarFile = copyAndManage(); + private void jarCopy() throws IOException { + String srcJarPath = project.getBuild().getDirectory() + + File.separator + finalName + "-" + JAR_DEPENDENCE + ".jar"; + String dstJarPath = project.getBuild().getDirectory() + + File.separator + finalName + ".jar"; + FileUtils.copyFile(new File(srcJarPath), new File(dstJarPath)); + } + + private File compileCustomJar() throws IOException { + return copyAndManage(project, finalName); + } + private void verify(File jarFile) throws MojoFailureException { + try { // 首先校验MainClass try { verifyMainClass(jarFile); } catch (Exception e) { jarFile.delete(); - LOG.error(e.getMessage()); + LOGGER.error(e.getMessage()); throw e; } @@ -101,9 +106,13 @@ public class ContractVerifyMojo extends AbstractMojo { boolean isOK = true; for (String clazz : totalClassList) { + + LOGGER.debug(String.format("Verify Class[%s] start......", clazz)); // 获取其包名 String packageName = packageName(clazz); + LOGGER.debug(String.format("Class[%s] 's package name = %s", clazz, packageName)); + // 包的名字黑名单,不能打包该类进入Jar包中,或者合约不能命名这样的名字 boolean isNameBlack = false; for (ContractPackage blackName : blackNameList) { @@ -116,7 +125,7 @@ public class ContractVerifyMojo extends AbstractMojo { // 假设是黑名单则打印日志 if (isNameBlack) { // 打印信息供检查 - LOG.error(String.format("Class[%s]'s Package-Name belong to BlackNameList !!!", clazz)); + LOGGER.error(String.format("Class[%s]'s Package-Name belong to BlackNameList !!!", clazz)); isOK = false; continue; } @@ -126,6 +135,7 @@ public class ContractVerifyMojo extends AbstractMojo { boolean isNeedDelete = false; if (!javaFile.exists()) { + LOGGER.debug(String.format("Class[%s] -> Java[%s] is not exist, start decompile ...", clazz, jarFile.getPath())); // 表明不是项目中的内容,需要通过反编译获取该文件 String source = null; try { @@ -134,15 +144,18 @@ public class ContractVerifyMojo extends AbstractMojo { throw new IllegalStateException(); } } catch (Exception e) { - LOG.warn(String.format("Decompile Jar[%s]->Class[%s] Fail !!!", jarFile.getPath(), clazz)); + LOGGER.warn(String.format("Decompile Jar[%s]->Class[%s] Fail !!!", jarFile.getPath(), clazz)); } // 将source写入Java文件 File sourceTempJavaFile = new File(tempPath(codeBaseDir, clazz)); FileUtils.writeStringToFile(sourceTempJavaFile, source == null ? "" : source); javaFile = sourceTempJavaFile; isNeedDelete = true; + } else { + LOGGER.debug(String.format("Class[%s] -> Java[%s] is exist", clazz, jarFile.getPath())); } + LOGGER.info(String.format("Parse Java File [%s] start......", javaFile.getPath())); // 解析文件中的内容 CompilationUnit compilationUnit = JavaParser.parse(javaFile); @@ -154,13 +167,14 @@ public class ContractVerifyMojo extends AbstractMojo { if (!imports.isEmpty()) { for (String importClass : imports) { + LOGGER.debug(String.format("Class[%s] read import -> [%s]", clazz, importClass)); if (importClass.endsWith("*")) { // 导入的是包 for (ContractPackage blackPackage : blackPackageList) { String importPackageName = importClass.substring(0, importClass.length() - 2); if (verifyPackage(importPackageName, blackPackage)) { // 打印信息供检查 - LOG.error(String.format("Class[%s]'s import class [%s] belong to BlackPackageList !!!", clazz, importClass)); + LOGGER.error(String.format("Class[%s]'s import class [%s] belong to BlackPackageList !!!", clazz, importClass)); isOK = false; break; } @@ -169,13 +183,13 @@ public class ContractVerifyMojo extends AbstractMojo { // 导入的是具体的类,则判断类黑名单 + 包黑名单 if (blackClassSet.contains(importClass)) { // 包含导入类,该方式无法通过验证 - LOG.error(String.format("Class[%s]'s import class [%s] belong to BlackClassList !!!", clazz, importClass)); + LOGGER.error(String.format("Class[%s]'s import class [%s] belong to BlackClassList !!!", clazz, importClass)); isOK = false; } else { // 判断导入的该类与黑名单导入包的对应关系 for (ContractPackage blackPackage : blackPackageList) { if (verifyClass(importClass, blackPackage)) { - LOG.error(String.format("Class[%s]'s import class [%s] belong to BlackPackageList !!!", clazz, importClass)); + LOGGER.error(String.format("Class[%s]'s import class [%s] belong to BlackPackageList !!!", clazz, importClass)); isOK = false; break; } @@ -187,6 +201,7 @@ public class ContractVerifyMojo extends AbstractMojo { if (isNeedDelete) { javaFile.delete(); } + LOGGER.debug(String.format("Verify Class[%s] end......", clazz)); } if (!isOK) { // 需要将该Jar删除 @@ -198,19 +213,21 @@ public class ContractVerifyMojo extends AbstractMojo { throw new IllegalStateException("There is none class !!!"); } } catch (Exception e) { - LOG.error(e.getMessage()); - throw new MojoExecutionException(e.getMessage()); + LOGGER.error(e.getMessage()); + throw new MojoFailureException(e.getMessage(), e); } } private void verifyMainClass(File jarFile) throws Exception { // 加载main-class,开始校验类型 + LOGGER.debug(String.format("Verify Jar [%s] 's MainClass start...", jarFile.getName())); 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); Class mainClass = classLoader.loadClass(contractMainClass); ContractType.resolve(mainClass); + LOGGER.debug(String.format("Verify Jar [%s] 's MainClass end...", jarFile.getName())); } private List blackNameList(Properties config) { @@ -223,6 +240,7 @@ public class ContractVerifyMojo extends AbstractMojo { if (attrProp != null && attrProp.length() > 0) { String[] attrPropArray = attrProp.split(","); for (String attr : attrPropArray) { + LOGGER.info(String.format("Config [%s] -> [%s]", BLACK_CLASS_LIST, attr)); blackClassSet.add(attr.trim()); } } @@ -239,6 +257,7 @@ public class ContractVerifyMojo extends AbstractMojo { if (attrProp != null || attrProp.length() > 0) { String[] attrPropArray = attrProp.split(","); for (String attr : attrPropArray) { + LOGGER.info(String.format("Config [%s] -> [%s]", attrName, attr)); list.add(new ContractPackage(attr)); } } @@ -310,7 +329,7 @@ public class ContractVerifyMojo extends AbstractMojo { return packageName.replaceAll("/", "."); } - private File copyAndManage() throws IOException { + private File copyAndManage(MavenProject project, String finalName) throws IOException { // 首先将Jar包转换为指定的格式 String srcJarPath = project.getBuild().getDirectory() + File.separator + finalName + ".jar"; @@ -320,8 +339,10 @@ public class ContractVerifyMojo extends AbstractMojo { File srcJar = new File(srcJarPath), dstJar = new File(dstJarPath); + LOGGER.debug(String.format("Jar from [%s] to [%s] Copying", srcJarPath, dstJarPath)); // 首先进行Copy处理 copy(srcJar, dstJar); + LOGGER.debug(String.format("Jar from [%s] to [%s] Copied", srcJarPath, dstJarPath)); byte[] txtBytes = contractMF(FileUtils.readFileToByteArray(dstJar)).getBytes(StandardCharsets.UTF_8); @@ -376,24 +397,6 @@ public class ContractVerifyMojo extends AbstractMojo { private List importClasses = new ArrayList<>(); -// @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 */ -// super.visit(n, arg); -// } -// -// @Override -// public void visit(ClassOrInterfaceDeclaration n, Void arg) { -// super.visit(n, arg); -// } -// -// @Override -// public void visit(PackageDeclaration n, Void arg) { -// super.visit(n, arg); -// } - @Override public void visit(ImportDeclaration n, Void arg) { importClasses.add(parseClass(n.toString())); diff --git a/source/contract/contract-maven-plugin/src/main/resources/sys-contract.properties b/source/contract/contract-maven-plugin/src/main/resources/sys-contract.properties deleted file mode 100644 index a7179906..00000000 --- a/source/contract/contract-maven-plugin/src/main/resources/sys-contract.properties +++ /dev/null @@ -1,19 +0,0 @@ -#PROJECT_BASE_DIR -PROJECT_BASE_DIR=E:\\gitCode\\block\\prototype\\ -#LEDGER_BASE_CLASS_PATH -LEDGER_BASE_CLASS_PATH=E:\\gitCode\\block\\prototype\\libs\\ - -#deploy and execute the contract; -cParam=com.jd.blockchain.contract.AssetContract3 -sParam=E:\\gitCode\\block\\prototype\\source\\sdk\\contract-sample\\src\\main\\java\\ -eParam=utf-8 -oParam=E:\\gitCode\\block\\prototype\\source\\contract\\contract-maven-plugin\\src\\test\\resources\\ -host=127.0.0.1 -port=8081 -event = issue-asset -ownerPassword=E:\\gitCode\\block\\prototype\\source\\contract\\contract-maven-plugin\\conf\\ownerPassword.txt -ownerPubPath=E:\\gitCode\\block\\prototype\\source\\contract\\contract-maven-plugin\\conf\\jd-com.pub -ownerPrvPath=E:\\gitCode\\block\\prototype\\source\\contract\\contract-maven-plugin\\conf\\jd-com.priv -chainCodePath=E:\\gitCode\\block\\prototype\\source\\contract\\contract-maven-plugin\\src\\test\\resources\\AssetContract3.contract -ledgerHash=6FEQDTQMnBGANpfX4haXuWHKHw5cZ6P1h2ocqwckYBxp4 -contractArgs=101##999##abc \ No newline at end of file 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 442f1ba0..bb907445 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,21 +1,21 @@ -package com.jd.blockchain.ledger; - -import com.jd.blockchain.contract.maven.ContractDeployMojo; - -import java.lang.reflect.Field; - -/** - * for contract deploy and exe; - * @Author zhaogw - * @Date 2018/11/02 09:06 - */ -public class ContractDeployMojoTest { - private ContractDeployMojo contractDeployMojo = new ContractDeployMojo(); - - 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(); - field.set(contractDeployMojo, objValue); - } -} +//package com.jd.blockchain.ledger; +// +//import com.jd.blockchain.contract.maven.ContractDeployMojo; +// +//import java.lang.reflect.Field; +// +///** +// * for contract deploy and exe; +// * @Author zhaogw +// * @Date 2018/11/02 09:06 +// */ +//public class ContractDeployMojoTest { +// private ContractDeployMojo contractDeployMojo = new ContractDeployMojo(); +// +// 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(); +// field.set(contractDeployMojo, objValue); +// } +//} diff --git a/source/contract/contract-maven-plugin/src/test/java/com/jd/blockchain/ledger/ContractTestBase.java b/source/contract/contract-maven-plugin/src/test/java/com/jd/blockchain/ledger/ContractTestBase.java index 09a5010f..e3065766 100644 --- a/source/contract/contract-maven-plugin/src/test/java/com/jd/blockchain/ledger/ContractTestBase.java +++ b/source/contract/contract-maven-plugin/src/test/java/com/jd/blockchain/ledger/ContractTestBase.java @@ -1,50 +1,50 @@ -package com.jd.blockchain.ledger; - -import org.apache.maven.model.Build; -import org.apache.maven.project.MavenProject; -import org.junit.Test; -import org.springframework.core.io.ClassPathResource; - -import java.io.File; - -public class ContractTestBase { - - public static MavenProject mavenProjectInit() { - MavenProject mavenProject = new MavenProject(); - mavenProject.setBuild(buildInit()); - mavenProject.setFile(file()); - return mavenProject; - } - - public static File file() { - String resDir = resourceDir(); - File file = new File(resDir); - String path = file.getParentFile().getParentFile().getPath(); - return new File(path + File.separator + "src"); - } - - public static Build buildInit() { - Build build = new Build(); - build.setDirectory(resourceDir()); - return build; - } - - public static String resourceDir() { - try { - ClassPathResource classPathResource = new ClassPathResource("complex.jar"); - return classPathResource.getFile().getParentFile().getPath(); - } catch (Exception e) { - throw new IllegalStateException(e); - } - } - - @Test - public void testResourceDir() { - System.out.println(resourceDir()); - } - - @Test - public void testFile() { - System.out.println(file().getPath()); - } -} +//package com.jd.blockchain.ledger; +// +//import org.apache.maven.model.Build; +//import org.apache.maven.project.MavenProject; +//import org.junit.Test; +//import org.springframework.core.io.ClassPathResource; +// +//import java.io.File; +// +//public class ContractTestBase { +// +// public static MavenProject mavenProjectInit() { +// MavenProject mavenProject = new MavenProject(); +// mavenProject.setBuild(buildInit()); +// mavenProject.setFile(file()); +// return mavenProject; +// } +// +// public static File file() { +// String resDir = resourceDir(); +// File file = new File(resDir); +// String path = file.getParentFile().getParentFile().getPath(); +// return new File(path + File.separator + "src"); +// } +// +// public static Build buildInit() { +// Build build = new Build(); +// build.setDirectory(resourceDir()); +// return build; +// } +// +// public static String resourceDir() { +// try { +// ClassPathResource classPathResource = new ClassPathResource("complex.jar"); +// return classPathResource.getFile().getParentFile().getPath(); +// } catch (Exception e) { +// throw new IllegalStateException(e); +// } +// } +// +// @Test +// public void testResourceDir() { +// System.out.println(resourceDir()); +// } +// +// @Test +// public void testFile() { +// System.out.println(file().getPath()); +// } +//} diff --git a/source/contract/contract-maven-plugin/src/test/java/com/jd/blockchain/ledger/ContractVerifyMojoTest.java b/source/contract/contract-maven-plugin/src/test/java/com/jd/blockchain/ledger/ContractVerifyMojoTest.java index 570cc8e6..119f5cbf 100644 --- a/source/contract/contract-maven-plugin/src/test/java/com/jd/blockchain/ledger/ContractVerifyMojoTest.java +++ b/source/contract/contract-maven-plugin/src/test/java/com/jd/blockchain/ledger/ContractVerifyMojoTest.java @@ -1,28 +1,28 @@ -package com.jd.blockchain.ledger; - -import com.jd.blockchain.contract.maven.ContractVerifyMojo; -import org.apache.maven.plugin.testing.AbstractMojoTestCase; -import org.junit.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.File; - -/** - * @Author zhaogw - * @Date 2019/3/1 21:27 - */ -public class ContractVerifyMojoTest extends AbstractMojoTestCase { - Logger logger = LoggerFactory.getLogger(ContractVerifyMojoTest.class); - - @Test - public void test1() throws Exception { - File pom = getTestFile( "src/test/resources/project-to-test/pom.xml" ); - assertNotNull( pom ); - assertTrue( pom.exists() ); - - ContractVerifyMojo myMojo = (ContractVerifyMojo) lookupMojo( "contractVerify", pom ); - assertNotNull( myMojo ); - myMojo.execute(); - } -} +//package com.jd.blockchain.ledger; +// +//import com.jd.blockchain.contract.maven.ContractVerifyMojo; +//import org.apache.maven.plugin.testing.AbstractMojoTestCase; +//import org.junit.Test; +//import org.slf4j.Logger; +//import org.slf4j.LoggerFactory; +// +//import java.io.File; +// +///** +// * @Author zhaogw +// * @Date 2019/3/1 21:27 +// */ +//public class ContractVerifyMojoTest extends AbstractMojoTestCase { +// Logger logger = LoggerFactory.getLogger(ContractVerifyMojoTest.class); +// +// @Test +// public void test1() throws Exception { +// File pom = getTestFile( "src/test/resources/project-to-test/pom.xml" ); +// assertNotNull( pom ); +// assertTrue( pom.exists() ); +// +// ContractVerifyMojo myMojo = (ContractVerifyMojo) lookupMojo( "contractVerify", pom ); +// assertNotNull( myMojo ); +// myMojo.execute(); +// } +//} diff --git a/source/contract/contract-maven-plugin/src/test/java/com/jd/blockchain/ledger/ContractVerifyTest_.java b/source/contract/contract-maven-plugin/src/test/java/com/jd/blockchain/ledger/ContractVerifyTest_.java index f3e8fea9..ea6828b6 100644 --- a/source/contract/contract-maven-plugin/src/test/java/com/jd/blockchain/ledger/ContractVerifyTest_.java +++ b/source/contract/contract-maven-plugin/src/test/java/com/jd/blockchain/ledger/ContractVerifyTest_.java @@ -1,47 +1,47 @@ -package com.jd.blockchain.ledger; - -import com.jd.blockchain.contract.maven.ContractVerifyMojo; -import org.apache.maven.project.MavenProject; -import org.junit.Before; -import org.junit.Test; - -import java.lang.reflect.Field; - -import static com.jd.blockchain.ledger.ContractTestBase.mavenProjectInit; - -public class ContractVerifyTest_ { - - private MavenProject project; - - private String finalName; - - @Before - public void testInit() { - project = mavenProjectInit(); - finalName = "complex"; - } - - @Test - public void test() throws Exception { - ContractVerifyMojo contractVerifyMojo = contractVerifyMojoConf(); - contractVerifyMojo.execute(); - } - - private ContractVerifyMojo contractVerifyMojoConf() throws Exception { - ContractVerifyMojo contractVerifyMojo = new ContractVerifyMojo(); - // 为不影响其内部结构,通过反射进行私有变量赋值 - Class clazz = contractVerifyMojo.getClass(); - Field projectField = clazz.getDeclaredField("project"); - Field finalNameField = clazz.getDeclaredField("finalName"); - - // 更新权限 - projectField.setAccessible(true); - finalNameField.setAccessible(true); - - // 设置具体值 - projectField.set(contractVerifyMojo, project); - finalNameField.set(contractVerifyMojo, finalName); - - return contractVerifyMojo; - } -} +//package com.jd.blockchain.ledger; +// +//import com.jd.blockchain.contract.maven.ContractVerifyMojo; +//import org.apache.maven.project.MavenProject; +//import org.junit.Before; +//import org.junit.Test; +// +//import java.lang.reflect.Field; +// +//import static com.jd.blockchain.ledger.ContractTestBase.mavenProjectInit; +// +//public class ContractVerifyTest_ { +// +// private MavenProject project; +// +// private String finalName; +// +// @Before +// public void testInit() { +// project = mavenProjectInit(); +// finalName = "complex"; +// } +// +// @Test +// public void test() throws Exception { +// ContractVerifyMojo contractVerifyMojo = contractVerifyMojoConf(); +// contractVerifyMojo.execute(); +// } +// +// private ContractVerifyMojo contractVerifyMojoConf() throws Exception { +// ContractVerifyMojo contractVerifyMojo = new ContractVerifyMojo(); +// // 为不影响其内部结构,通过反射进行私有变量赋值 +// Class clazz = contractVerifyMojo.getClass(); +// Field projectField = clazz.getDeclaredField("project"); +// Field finalNameField = clazz.getDeclaredField("finalName"); +// +// // 更新权限 +// projectField.setAccessible(true); +// finalNameField.setAccessible(true); +// +// // 设置具体值 +// projectField.set(contractVerifyMojo, project); +// finalNameField.set(contractVerifyMojo, finalName); +// +// return contractVerifyMojo; +// } +//} 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 index 473115af..34614e30 100644 --- 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 @@ -1,67 +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/" ); - } -} +//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/" ); +// } +//}