Commit 9a4eab44 authored by yihua.huang's avatar yihua.huang

add DynamicClassException to DynamicClassService.compileAndSave

parent 09c43efc
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);
}
}
package us.codecraft.webmagic.service; package us.codecraft.webmagic.service;
import us.codecraft.webmagic.exception.DynamicClassCompileException;
/** /**
* @author code4crafter@gmail.com * @author code4crafter@gmail.com
*/ */
public interface DynamicClassService { public interface DynamicClassService {
public String compileAndSave(String sourceCode); public Class compileAndSave(String sourceCode) throws DynamicClassCompileException;
} }
package us.codecraft.webmagic.service.impl; package us.codecraft.webmagic.service.impl;
import org.codehaus.groovy.control.CompilationFailedException;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import us.codecraft.forger.Forger; import us.codecraft.forger.Forger;
import us.codecraft.forger.ForgerFactory; import us.codecraft.forger.ForgerFactory;
import us.codecraft.webmagic.dao.DynamicClassDao; import us.codecraft.webmagic.dao.DynamicClassDao;
import us.codecraft.webmagic.exception.DynamicClassCompileException;
import us.codecraft.webmagic.model.DynamicClass; import us.codecraft.webmagic.model.DynamicClass;
import us.codecraft.webmagic.service.DynamicClassService; import us.codecraft.webmagic.service.DynamicClassService;
...@@ -21,14 +23,19 @@ public class DynamicClassServiceImpl implements DynamicClassService { ...@@ -21,14 +23,19 @@ public class DynamicClassServiceImpl implements DynamicClassService {
private ForgerFactory forgerFactory; private ForgerFactory forgerFactory;
@Override @Override
public String compileAndSave(String sourceCode) { public Class compileAndSave(String sourceCode) throws DynamicClassCompileException {
Forger<Object> forger = forgerFactory.compile(sourceCode); Forger<Object> forger;
try {
forger = forgerFactory.compile(sourceCode);
} catch (CompilationFailedException e) {
throw new DynamicClassCompileException(e.getMessage(),e);
}
String className = forger.getClazz().getCanonicalName(); String className = forger.getClazz().getCanonicalName();
DynamicClass dynamicClass = new DynamicClass(); DynamicClass dynamicClass = new DynamicClass();
dynamicClass.setClassName(className); dynamicClass.setClassName(className);
dynamicClass.setSourceCode(sourceCode); dynamicClass.setSourceCode(sourceCode);
dynamicClassDao.add(dynamicClass); dynamicClassDao.add(dynamicClass);
return className; return forger.getClazz();
} }
} }
...@@ -13,9 +13,11 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; ...@@ -13,9 +13,11 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import us.codecraft.forger.ForgerFactory; import us.codecraft.forger.ForgerFactory;
import us.codecraft.webmagic.Foo; import us.codecraft.webmagic.Foo;
import us.codecraft.webmagic.dao.DynamicClassDao; import us.codecraft.webmagic.dao.DynamicClassDao;
import us.codecraft.webmagic.exception.DynamicClassCompileException;
import us.codecraft.webmagic.service.impl.DynamicClassServiceImpl; import us.codecraft.webmagic.service.impl.DynamicClassServiceImpl;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.failBecauseExceptionWasNotThrown;
/** /**
* @author code4crafter@gmail.com * @author code4crafter@gmail.com
...@@ -25,7 +27,7 @@ import static org.assertj.core.api.Assertions.assertThat; ...@@ -25,7 +27,7 @@ import static org.assertj.core.api.Assertions.assertThat;
public class DynamicClassServiceImplTest { public class DynamicClassServiceImplTest {
@Before @Before
public void setUp(){ public void setUp() {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
} }
...@@ -41,7 +43,16 @@ public class DynamicClassServiceImplTest { ...@@ -41,7 +43,16 @@ public class DynamicClassServiceImplTest {
@Test @Test
public void testCompileAndSave() throws Exception { public void testCompileAndSave() throws Exception {
String className = dynamicClassService.compileAndSave(Foo.SOURCE_CODE); Class aClass = dynamicClassService.compileAndSave(Foo.SOURCE_CODE);
assertThat(className).isEqualTo("us.codecraft.webmagic.Foo"); assertThat(aClass.getCanonicalName()).isEqualTo("us.codecraft.webmagic.Foo");
}
@Test
public void testCompileFail() {
try {
dynamicClassService.compileAndSave("class s((");
failBecauseExceptionWasNotThrown(DynamicClassCompileException.class);
} catch (DynamicClassCompileException e) {
}
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment