diff --git a/webmagic-avalon/webmagic-avalon-common/src/main/java/us/codecraft/webmagic/exception/DynamicClassCompileException.java b/webmagic-avalon/webmagic-avalon-common/src/main/java/us/codecraft/webmagic/exception/DynamicClassCompileException.java new file mode 100644 index 0000000..8512ae5 --- /dev/null +++ b/webmagic-avalon/webmagic-avalon-common/src/main/java/us/codecraft/webmagic/exception/DynamicClassCompileException.java @@ -0,0 +1,15 @@ +package us.codecraft.webmagic.exception; + +/** + * @author code4crafter@gmail.com + */ +public class DynamicClassCompileException extends Exception{ + + public DynamicClassCompileException(String message) { + super(message); + } + + public DynamicClassCompileException(String message, Throwable cause) { + super(message, cause); + } +} 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 index 389ab01..1cd719c 100644 --- 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 @@ -1,10 +1,12 @@ package us.codecraft.webmagic.service; +import us.codecraft.webmagic.exception.DynamicClassCompileException; + /** * @author code4crafter@gmail.com */ public interface DynamicClassService { - public String compileAndSave(String sourceCode); + public Class compileAndSave(String sourceCode) throws DynamicClassCompileException; } 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 index c063a50..ec83efd 100644 --- 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 @@ -1,10 +1,12 @@ package us.codecraft.webmagic.service.impl; +import org.codehaus.groovy.control.CompilationFailedException; 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.exception.DynamicClassCompileException; import us.codecraft.webmagic.model.DynamicClass; import us.codecraft.webmagic.service.DynamicClassService; @@ -21,14 +23,19 @@ public class DynamicClassServiceImpl implements DynamicClassService { private ForgerFactory forgerFactory; @Override - public String compileAndSave(String sourceCode) { - Forger forger = forgerFactory.compile(sourceCode); + public Class compileAndSave(String sourceCode) throws DynamicClassCompileException { + Forger forger; + try { + forger = forgerFactory.compile(sourceCode); + } catch (CompilationFailedException e) { + throw new DynamicClassCompileException(e.getMessage(),e); + } String className = forger.getClazz().getCanonicalName(); DynamicClass dynamicClass = new DynamicClass(); dynamicClass.setClassName(className); dynamicClass.setSourceCode(sourceCode); dynamicClassDao.add(dynamicClass); - return className; + return forger.getClazz(); } } 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 index 108de62..185252b 100644 --- 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 @@ -13,9 +13,11 @@ 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.exception.DynamicClassCompileException; import us.codecraft.webmagic.service.impl.DynamicClassServiceImpl; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.failBecauseExceptionWasNotThrown; /** * @author code4crafter@gmail.com @@ -25,7 +27,7 @@ import static org.assertj.core.api.Assertions.assertThat; public class DynamicClassServiceImplTest { @Before - public void setUp(){ + public void setUp() { MockitoAnnotations.initMocks(this); } @@ -41,7 +43,16 @@ public class DynamicClassServiceImplTest { @Test public void testCompileAndSave() throws Exception { - String className = dynamicClassService.compileAndSave(Foo.SOURCE_CODE); - assertThat(className).isEqualTo("us.codecraft.webmagic.Foo"); + Class aClass = dynamicClassService.compileAndSave(Foo.SOURCE_CODE); + assertThat(aClass.getCanonicalName()).isEqualTo("us.codecraft.webmagic.Foo"); + } + + @Test + public void testCompileFail() { + try { + dynamicClassService.compileAndSave("class s(("); + failBecauseExceptionWasNotThrown(DynamicClassCompileException.class); + } catch (DynamicClassCompileException e) { + } } }