diff --git a/pom.xml b/pom.xml index 86f4885..bcc219c 100644 --- a/pom.xml +++ b/pom.xml @@ -125,6 +125,12 @@ jsoup 1.7.2 + + org.mockito + mockito-all + 1.9.5 + test + diff --git a/webmagic-avalon/sql/create-tables.sql b/webmagic-avalon/sql/create-tables.sql index 9312e01..6c361b1 100644 --- a/webmagic-avalon/sql/create-tables.sql +++ b/webmagic-avalon/sql/create-tables.sql @@ -1,6 +1,6 @@ CREATE TABLE `DynamicClass` ( `Id` int(11) unsigned NOT NULL AUTO_INCREMENT, - `ClassName` varchar(20) NOT NULL, + `ClassName` varchar(200) NOT NULL, `SourceCode` text NOT NULL, `AddTime` datetime NOT NULL, `UpdateTime` datetime NOT NULL, diff --git a/webmagic-avalon/webmagic-avalon-common/pom.xml b/webmagic-avalon/webmagic-avalon-common/pom.xml index e7c6380..388c4f1 100644 --- a/webmagic-avalon/webmagic-avalon-common/pom.xml +++ b/webmagic-avalon/webmagic-avalon-common/pom.xml @@ -22,6 +22,12 @@ mybatis + + us.codecraft + forger + 0.1.0-SNAPSHOT + + org.mybatis mybatis-spring @@ -82,6 +88,11 @@ spring-webmvc + + org.mockito + mockito-all + + javax.servlet javax.servlet-api diff --git a/webmagic-avalon/webmagic-avalon-common/src/main/java/us/codecraft/webmagic/service/DynamicClassService.java b/webmagic-avalon/webmagic-avalon-common/src/main/java/us/codecraft/webmagic/service/DynamicClassService.java new file mode 100644 index 0000000..389ab01 --- /dev/null +++ b/webmagic-avalon/webmagic-avalon-common/src/main/java/us/codecraft/webmagic/service/DynamicClassService.java @@ -0,0 +1,10 @@ +package us.codecraft.webmagic.service; + +/** + * @author code4crafter@gmail.com + */ +public interface DynamicClassService { + + public String compileAndSave(String sourceCode); + +} diff --git a/webmagic-avalon/webmagic-avalon-common/src/main/java/us/codecraft/webmagic/service/impl/DynamicClassServiceImpl.java b/webmagic-avalon/webmagic-avalon-common/src/main/java/us/codecraft/webmagic/service/impl/DynamicClassServiceImpl.java new file mode 100644 index 0000000..c063a50 --- /dev/null +++ b/webmagic-avalon/webmagic-avalon-common/src/main/java/us/codecraft/webmagic/service/impl/DynamicClassServiceImpl.java @@ -0,0 +1,34 @@ +package us.codecraft.webmagic.service.impl; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import us.codecraft.forger.Forger; +import us.codecraft.forger.ForgerFactory; +import us.codecraft.webmagic.dao.DynamicClassDao; +import us.codecraft.webmagic.model.DynamicClass; +import us.codecraft.webmagic.service.DynamicClassService; + +/** + * @author code4crafter@gmail.com + */ +@Service +public class DynamicClassServiceImpl implements DynamicClassService { + + @Autowired + private DynamicClassDao dynamicClassDao; + + @Autowired + private ForgerFactory forgerFactory; + + @Override + public String compileAndSave(String sourceCode) { + Forger forger = forgerFactory.compile(sourceCode); + String className = forger.getClazz().getCanonicalName(); + DynamicClass dynamicClass = new DynamicClass(); + dynamicClass.setClassName(className); + dynamicClass.setSourceCode(sourceCode); + dynamicClassDao.add(dynamicClass); + return className; + } + +} diff --git a/webmagic-avalon/webmagic-avalon-common/src/main/resources/spring/applicationContext-service.xml b/webmagic-avalon/webmagic-avalon-common/src/main/resources/spring/applicationContext-service.xml new file mode 100644 index 0000000..f854d3d --- /dev/null +++ b/webmagic-avalon/webmagic-avalon-common/src/main/resources/spring/applicationContext-service.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/webmagic-avalon/webmagic-avalon-common/src/test/java/us/codecraft/webmagic/Foo.java b/webmagic-avalon/webmagic-avalon-common/src/test/java/us/codecraft/webmagic/Foo.java new file mode 100644 index 0000000..9078eb4 --- /dev/null +++ b/webmagic-avalon/webmagic-avalon-common/src/test/java/us/codecraft/webmagic/Foo.java @@ -0,0 +1,45 @@ +package us.codecraft.webmagic; + +import us.codecraft.forger.property.Inject; +import us.codecraft.forger.property.format.Formatter; + +/** + * @author code4crafter@gmail.com + */ +public class Foo { + + @Formatter("") + @Inject("fooa") + private String foo; + + public static final String SOURCE_CODE="package us.codecraft.webmagic;\n" + + "\n" + + "import us.codecraft.forger.property.Inject;\n" + + "import us.codecraft.forger.property.format.Formatter;\n" + + "\n" + + "/**\n" + + " * @author code4crafter@gmail.com\n" + + " */\n" + + "public class Foo {\n" + + "\n" + + " @Formatter(\"\")\n" + + " @Inject(\"fooa\")\n" + + " private String foo;\n" + + "\n" + + " public String getFoo() {\n" + + " return foo;\n" + + " }\n" + + "\n" + + " public String foo() {\n" + + " return foo;\n" + + " }\n" + + "}"; + + public String getFoo() { + return foo; + } + + public String foo() { + return foo; + } +} diff --git a/webmagic-avalon/webmagic-avalon-common/src/test/java/us/codecraft/webmagic/service/DynamicClassServiceImplTest.java b/webmagic-avalon/webmagic-avalon-common/src/test/java/us/codecraft/webmagic/service/DynamicClassServiceImplTest.java new file mode 100644 index 0000000..108de62 --- /dev/null +++ b/webmagic-avalon/webmagic-avalon-common/src/test/java/us/codecraft/webmagic/service/DynamicClassServiceImplTest.java @@ -0,0 +1,47 @@ +package us.codecraft.webmagic.service; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.mockito.Spy; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import us.codecraft.forger.ForgerFactory; +import us.codecraft.webmagic.Foo; +import us.codecraft.webmagic.dao.DynamicClassDao; +import us.codecraft.webmagic.service.impl.DynamicClassServiceImpl; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * @author code4crafter@gmail.com + */ +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(locations = {"classpath*:/spring/applicationContext*.xml"}) +public class DynamicClassServiceImplTest { + + @Before + public void setUp(){ + MockitoAnnotations.initMocks(this); + } + + @Spy + @Autowired + private ForgerFactory forgerFactory; + + @InjectMocks + private DynamicClassService dynamicClassService = new DynamicClassServiceImpl(); + + @Mock + private DynamicClassDao dynamicClassDao; + + @Test + public void testCompileAndSave() throws Exception { + String className = dynamicClassService.compileAndSave(Foo.SOURCE_CODE); + assertThat(className).isEqualTo("us.codecraft.webmagic.Foo"); + } +} diff --git a/webmagic-avalon/webmagic-avalon-common/src/test/resources/spring/applicationContext.xml b/webmagic-avalon/webmagic-avalon-common/src/test/resources/spring/applicationContext.xml index 3296bdd..550d810 100644 --- a/webmagic-avalon/webmagic-avalon-common/src/test/resources/spring/applicationContext.xml +++ b/webmagic-avalon/webmagic-avalon-common/src/test/resources/spring/applicationContext.xml @@ -9,6 +9,7 @@ http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> +