/**
* Copyright 2010 JBoss Inc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.drools.repository;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import javax.jcr.Node;
import javax.jcr.Property;
import javax.jcr.PropertyIterator;
import javax.jcr.Repository;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.SimpleCredentials;
import javax.jcr.Value;
import javax.jcr.Workspace;
import org.junit.Ignore;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
public class CategoryItemTest extends RepositoryTestCase {
@Test
public void testTagItem() throws Exception {
final CategoryItem root = getRepo().loadCategory("/");
root.addCategory("TestTag", "nothing to see");
CategoryItem tagItem1 = getRepo().loadCategory("TestTag");
assertNotNull(tagItem1);
assertEquals("TestTag", tagItem1.getName());
CategoryItem tagItem2 = getRepo().loadCategory("TestTag");
assertNotNull(tagItem2);
assertEquals("TestTag", tagItem2.getName());
assertEquals(tagItem1, tagItem2);
List originalCats = getRepo().loadCategory("/").getChildTags(); // listCategoryNames();
assertTrue(originalCats.size() > 0);
CategoryItem rootCat = (CategoryItem)originalCats.get(0);
assertNotNull(rootCat.getName());
assertNotNull(rootCat.getFullPath());
root.addCategory("FootestTagItem", "nothing");
List cats = root.getChildTags();
assertEquals(originalCats.size() + 1, cats.size());
boolean found = false;
for (Iterator iter = cats.iterator(); iter.hasNext();) {
CategoryItem element = (CategoryItem)iter.next();
if (element.getName().equals("FootestTagItem")) {
found = true;
break;
}
}
assertTrue(found);
}
@Test
public void testCreateCateories() throws Exception {
RulesRepository repo = getRepo();
// load the root
CategoryItem root = repo.loadCategory("/");
CategoryItem item = root.addCategory("testCreateCategories", "this is a top level one");
assertEquals("testCreateCategories", item.getName());
assertEquals("testCreateCategories", item.getFullPath());
item = repo.loadCategory("testCreateCategories");
assertEquals("testCreateCategories", item.getName());
item.remove();
repo.save();
try {
repo.loadCategory("testCreateCategories");
fail("this should not exist");
} catch (RulesRepositoryException e) {
assertNotNull(e.getCause());
}
}
@Test
public void testGetChildTags() {
final CategoryItem root = getRepo().loadCategory("/");
root.addCategory("TestTag", "nothing to see");
CategoryItem tagItem1 = getRepo().loadCategory("TestTag");
assertNotNull(tagItem1);
assertEquals("TestTag", tagItem1.getName());
List childTags = tagItem1.getChildTags();
assertNotNull(childTags);
assertEquals(0, childTags.size());
tagItem1.addCategory("TestChildTag1", "description");
childTags = tagItem1.getChildTags();
assertNotNull(childTags);
assertEquals(1, childTags.size());
assertEquals("TestChildTag1", ((CategoryItem)childTags.get(0)).getName());
tagItem1.addCategory("AnotherChild", "ignore me");
childTags = tagItem1.getChildTags();
assertNotNull(childTags);
assertEquals(2, childTags.size());
}
@Test
public void testGetChildTag() {
CategoryItem root = getRepo().loadCategory("/");
CategoryItem tagItem1 = root.addCategory("testGetChildTag", "yeah");
assertNotNull(tagItem1);
assertEquals("testGetChildTag", tagItem1.getName());
// test that child is added if not already in existence
List childTags = tagItem1.getChildTags();
assertNotNull(childTags);
assertEquals(0, childTags.size());
CategoryItem childTagItem1 = tagItem1.addCategory("TestChildTag1", "woo");
assertNotNull(childTagItem1);
assertEquals("TestChildTag1", childTagItem1.getName());
// test that if already there, it is returned
CategoryItem childTagItem2 = getRepo().loadCategory("testGetChildTag/TestChildTag1");
assertNotNull(childTagItem2);
assertEquals("TestChildTag1", childTagItem2.getName());
assertEquals(childTagItem1, childTagItem2);
}
@Test
public void testGetFullPath() {
CategoryItem root = getRepo().loadCategory("/");
CategoryItem tagItem1 = root.addCategory("testGetFullPath", "foo");
assertNotNull(tagItem1);
assertEquals("testGetFullPath", tagItem1.getFullPath());
CategoryItem childTagItem1 = tagItem1.addCategory("TestChildTag1", "foo");
assertNotNull(childTagItem1);
assertEquals("testGetFullPath/TestChildTag1", childTagItem1.getFullPath());
CategoryItem childTagItem2 = childTagItem1.addCategory("TestChildTag2", "wee");
assertNotNull(childTagItem2);
assertEquals("testGetFullPath/TestChildTag1/TestChildTag2", childTagItem2.getFullPath());
}
@Test
public void testRemoveCategoryUneeded() {
RulesRepository repo = getRepo();
repo.loadCategory("/").addCategory("testRemoveCat", "a");
AssetItem as = repo.loadDefaultPackage().addAsset("testRemoveCategory", "a", "testRemoveCat", "drl");
as.checkin("a");
as.updateCategoryList(new String[] {});
as.checkin("a");
as = repo.loadDefaultPackage().loadAsset("testRemoveCategory");
assertEquals(0, as.getCategories().size());
repo.loadCategory("testRemoveCat").remove();
repo.save();
}
@Test
public void testRemoveCategoryLinkedWithArchived() {
RulesRepository repo = getRepo();
repo.loadCategory("/").addCategory("testRemoveCategoryWithArchivedCat", "a");
AssetItem as = repo.loadDefaultPackage().addAsset("testRemoveCategoryWithArchivedAsset",
"a",
"testRemoveCategoryWithArchivedCat",
"drl");
as.checkin("a");
as.archiveItem(true);
repo.loadCategory("testRemoveCategoryWithArchivedCat").remove();
repo.save();
as.remove();
}
/**
* This removed the complexity of testRemoveCategoryLinkedWithArchived, and
* was added to show a problem in ModeShape: https://jira.jboss.org/browse/MODE-877
*/
@Test
public void simpleRemoveCategoryLinkedWithArchived() {
try {
RulesRepository repo = getRepo();
Session session = repo.getSession();
Node rn = session.getRootNode();
Node asset = rn.addNode("asset","drools:assetNodeType");
//Adding some required properties
asset.setProperty("drools:packageName", "one");
asset.setProperty("drools:title", "title");
asset.setProperty("drools:format", "format");
asset.setProperty("drools:description", "description");
Calendar lastModified = Calendar.getInstance();
asset.setProperty("drools:lastModified", lastModified);
//Adding a category
Node category = rn.addNode("category","drools:categoryNodeType");
//adding the category to the asset
Value[] newTagValues = new Value[1];
newTagValues[0] = asset.getSession().getValueFactory().createValue( category );
asset.setProperty( "drools:categoryReference",
newTagValues );
//save the session
session.save();
//checking that is there.
PropertyIterator pi = category.getReferences();
while (pi.hasNext()) {
Property property = pi.nextProperty();
String name = property.getName();
System.out.println("Name=" + name);
assertEquals("drools:categoryReference", name);
}
//removing the category from the asset
Value[] updatedTagValues = new Value[1];
updatedTagValues[0] = null;
asset.setProperty( "drools:categoryReference",
updatedTagValues );
//session.save();
//removing the category itself
category.remove();
//saving the session, leads to a Referential Integrity Exception on ModeShape:
//https://jira.jboss.org/browse/MODE-877
session.save();
} catch (RepositoryException e) {
// TODO Auto-generated catch block
e.printStackTrace();
fail();
}
}
}