diff --git a/src/main/java/org/ayfaar/app/controllers/TermController.java b/src/main/java/org/ayfaar/app/controllers/TermController.java
index 3f3d3d13..285047e2 100644
--- a/src/main/java/org/ayfaar/app/controllers/TermController.java
+++ b/src/main/java/org/ayfaar/app/controllers/TermController.java
@@ -4,12 +4,10 @@
import org.ayfaar.app.dao.CommonDao;
import org.ayfaar.app.dao.LinkDao;
import org.ayfaar.app.dao.TermDao;
+import org.ayfaar.app.dao.TermMorphDao;
import org.ayfaar.app.model.*;
import org.ayfaar.app.spring.Model;
-import org.ayfaar.app.utils.AliasesMap;
-import org.ayfaar.app.utils.Morpher;
-import org.ayfaar.app.utils.TermUtils;
-import org.ayfaar.app.utils.ValueObjectUtils;
+import org.ayfaar.app.utils.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
@@ -31,6 +29,7 @@ public class TermController {
@Autowired CommonDao commonDao;
@Autowired TermDao termDao;
+ @Autowired TermMorphDao termMorphDao;
@Autowired LinkDao linkDao;
@Autowired AliasesMap aliasesMap;
@Autowired
@@ -284,4 +283,26 @@ public void remove(@PathVariable String name) {
public void reloadAliasesMap() {
aliasesMap.reload();
}
+
+
+ @RequestMapping(value = "rename")
+ @ResponseBody
+ public void renameTerm(@RequestParam("oldTerm") String oldName, @RequestParam("newTerm") String newName) {
+ Term oldTerm = aliasesMap.getTerm(oldName);
+ add(newName, oldTerm.getShortDescription(), oldTerm.getDescription());
+
+ Term newTerm = termDao.getByName(newName);
+
+ List links = linkDao.getAllLinks(oldTerm.getUri());
+ for(Link link : links) {
+ if(link.getUid1().getUri().equals(oldTerm.getUri())) {
+ link.setUid1(newTerm);
+ }
+ else if(link.getUid2().getUri().equals(oldTerm.getUri())) {
+ link.setUid2(newTerm);
+ }
+ linkDao.save(link);
+ }
+ remove(oldName);
+ }
}
diff --git a/src/test/java/issues/issue66/TermControllerIntegrationTest.java b/src/test/java/issues/issue66/TermControllerIntegrationTest.java
new file mode 100644
index 00000000..11f28a28
--- /dev/null
+++ b/src/test/java/issues/issue66/TermControllerIntegrationTest.java
@@ -0,0 +1,68 @@
+package issues.issue66;
+
+import org.ayfaar.app.IntegrationTest;
+import org.ayfaar.app.controllers.TermController;
+import org.ayfaar.app.dao.LinkDao;
+import org.ayfaar.app.dao.TermDao;
+import org.ayfaar.app.model.Item;
+import org.ayfaar.app.model.Link;
+import org.ayfaar.app.model.Term;
+import org.ayfaar.app.utils.AliasesMap;
+import org.ayfaar.app.utils.UriGenerator;
+import org.junit.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+import static org.junit.Assert.*;
+
+
+public class TermControllerIntegrationTest extends IntegrationTest {
+ @Autowired private TermController termController;
+ @Autowired private TermDao termDao;
+ @Autowired private LinkDao linkDao;
+ @Autowired private AliasesMap aliasesMap;
+
+ @Test
+ @Transactional
+ public void testRenameTerm1() {
+ String oldName = "ВСЕ-Воля-ВСЕ-Разума";
+ String newName = "test new name";
+ termController.renameTerm(oldName, newName);
+
+ Term term = aliasesMap.getTerm(newName);
+ List links = linkDao.getAllLinks(term.getUri());
+
+ assertEquals(UriGenerator.generate(Term.class, "Разум"), links.get(0).getUid1().getUri());
+ assertEquals(UriGenerator.generate(Term.class, "Test new name"), links.get(0).getUid2().getUri());
+ assertEquals(UriGenerator.generate(Term.class, "Test new name"), links.get(1).getUid1().getUri());
+ assertEquals(UriGenerator.generate(Item.class, "2.0170"), links.get(1).getUid2().getUri());
+ assertEquals(UriGenerator.generate(Term.class, "Test new name"), links.get(2).getUid1().getUri());
+ assertEquals(UriGenerator.generate(Term.class, "КРА-АГГА-АГГА"), links.get(2).getUid2().getUri());
+ assertEquals(UriGenerator.generate(Term.class, "Test new name"), links.get(3).getUid1().getUri());
+ assertEquals(UriGenerator.generate(Item.class, "2.0148"), links.get(3).getUid2().getUri());
+ assertNull(termDao.getByName("ВСЕ-Воля-ВСЕ-Разума"));
+ assertEquals("Test new name", termDao.getByName("test new name").getName());
+ }
+
+ @Test
+ @Transactional
+ public void testRenameTerm2() {
+ String oldName = "Временная Сущность";
+ String newName = "Новая Сущность";
+ termController.renameTerm(oldName, newName);
+
+ Term term = aliasesMap.getTerm(newName);
+ List links = linkDao.getAllLinks(term.getUri());
+
+ assertEquals(UriGenerator.generate(Term.class, "Время"), links.get(0).getUid1().getUri());
+ assertEquals(UriGenerator.generate(Term.class, "Новая Сущность"), links.get(0).getUid2().getUri());
+ assertEquals(UriGenerator.generate(Term.class, "Вселенская Временная Сущность"), links.get(1).getUid1().getUri());
+ assertEquals(UriGenerator.generate(Term.class, "Новая Сущность"), links.get(1).getUid2().getUri());
+ assertEquals(UriGenerator.generate(Term.class, "Новая Сущность"), links.get(2).getUid1().getUri());
+ assertEquals(UriGenerator.generate(Item.class, "1.1036"), links.get(2).getUid2().getUri());
+ assertNull(termDao.getByName("Временная Сущность"));
+ assertEquals("Новая Сущность", termDao.getByName("Новая Сущность").getName());
+ }
+}
diff --git a/src/test/java/issues/issue66/TermControllerUnitTest.java b/src/test/java/issues/issue66/TermControllerUnitTest.java
new file mode 100644
index 00000000..f3963dcc
--- /dev/null
+++ b/src/test/java/issues/issue66/TermControllerUnitTest.java
@@ -0,0 +1,73 @@
+package issues.issue66;
+
+import org.ayfaar.app.controllers.TermController;
+import org.ayfaar.app.dao.LinkDao;
+import org.ayfaar.app.dao.TermDao;
+import org.ayfaar.app.model.Item;
+import org.ayfaar.app.model.Link;
+import org.ayfaar.app.model.Term;
+import org.ayfaar.app.utils.AliasesMap;
+import org.ayfaar.app.utils.UriGenerator;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Spy;
+import org.mockito.runners.MockitoJUnitRunner;
+
+import java.util.List;
+
+import static java.util.Arrays.asList;
+import static org.mockito.Mockito.*;
+
+@RunWith(MockitoJUnitRunner.class)
+public class TermControllerUnitTest {
+ @InjectMocks @Spy TermController termController;
+ @Mock TermDao termDao;
+ @Mock AliasesMap aliasesMap;
+ @Mock LinkDao linkDao;
+
+ private List links;
+
+ @Before
+ public void init() {
+ Term term1 = new Term("Разум");
+ term1.setUri(UriGenerator.generate(term1));
+ Term term2 = new Term("New name");
+ term2.setUri(UriGenerator.generate(term2));
+ Term term3 = new Term("КРА-АГГА-АГГА");
+ term3.setUri(UriGenerator.generate(term3));
+ Item item1= new Item("2.0170");
+ item1.setUri(UriGenerator.generate(item1));
+ Item item2 = new Item("2.0148");
+ item2.setUri(UriGenerator.generate(item2));
+
+ links = asList(new Link(term1, term2), new Link(term2, item1),
+ new Link(term2, term3), new Link(term2, item2));
+ }
+
+ @Test
+ public void testRenameTerm() {
+ String oldName = "ВСЕ-Воля-ВСЕ-Разума";
+ String newName = "New name";
+ Term oldTerm = new Term(oldName);
+ Term newTerm = new Term(newName);
+
+
+ when(aliasesMap.getTerm(oldName)).thenReturn(oldTerm);
+ when(termDao.getByName(newName)).thenReturn(newTerm);
+ when(linkDao.getAllLinks(oldTerm.getUri())).thenReturn(links);
+ doNothing().when(termController).remove(anyString());
+ when(linkDao.save((Link)anyObject())).thenReturn(new Link());
+
+ termController.renameTerm(oldName, newName);
+
+ verify(termController, times(1)).add(anyString(), anyString(), anyString());
+ verify(termController, times(1)).remove(oldName);
+ verify(aliasesMap, times(1)).getTerm(oldName);
+ verify(termDao, times(2)).getByName(anyString());
+ verify(linkDao, times(1)).getAllLinks(anyString());
+ verify(linkDao, times(1)).save(links.get(0));
+ }
+}