/*******************************************************************************
* Copyright (c) 2010 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is made available under the terms of the
* Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.cdi.bot.test.beansxml.template;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.jboss.reddeer.eclipse.jdt.ui.NewJavaClassWizardDialog;
import org.jboss.reddeer.eclipse.jdt.ui.NewJavaClassWizardPage;
import org.jboss.reddeer.swt.impl.styledtext.DefaultStyledText;
import org.jboss.tools.cdi.bot.test.CDITestBase;
import org.jboss.tools.cdi.reddeer.common.model.ui.editor.EditorPartWrapper;
import org.junit.After;
import org.junit.Assert;
import org.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public abstract class BeansXMLBeansEditorTemplate extends CDITestBase {
@After
public void cleanup(){
deleteAllProjects();
}
@Test
public void testClasses() {
NewJavaClassWizardDialog jd = new NewJavaClassWizardDialog();
jd.open();
new NewJavaClassWizardPage().setName("Foo");
jd.finish();
jd.open();
new NewJavaClassWizardPage().setName("Bar");
jd.finish();
addClassItem(getPackageName() + ".Foo");
addClassItem(getPackageName() + ".Bar");
removeClassItem(getPackageName() + ".Foo");
checkResult("alternatives", ".Bar");
}
@Test
public void testInterceptors() {
beansHelper.createIBinding("B2",getPackageName(),"TYPE", false, true);
beansHelper.createIBinding("B4",getPackageName(),"TYPE", true, false);
beansHelper.createInterceptor("I1", getPackageName(), "B2", false,false);
beansHelper.createInterceptor("I2", getPackageName(), "B4", false, false);
addInterceptorItem(getPackageName() + ".I1");
removeInterceptorItem(getPackageName() + ".I1");
addInterceptorItem(getPackageName() + ".I2");
checkResult("interceptors", ".I2");
}
@Test
public void testDecorators() {
beansHelper.createDecorator("", getPackageName(), "java.util.Map", "field",
false, false, true, true,false);
beansHelper.createDecorator("", getPackageName(), "java.lang.Comparable", null,
true, true, false, false,false);
addDecoratorItem(getPackageName() + ".MapDecorator");
addDecoratorItem(getPackageName() + ".ComparableDecorator");
removeDecoratorItem(getPackageName() + ".ComparableDecorator");
checkResult("decorators", ".MapDecorator");
}
@Test
public void testStereotypes() {
beansHelper.createStereotype("S1",getPackageName(),false,false,false,false,false);
beansHelper.createStereotype("S2",getPackageName(),false,false,false,false,false);
beansHelper.createStereotype("S3",getPackageName(),false,false,false,false,false);
addStereotypeItem(getPackageName() + ".S2");
addStereotypeItem(getPackageName() + ".S3");
removeStereotypeItem(getPackageName() + ".S3");
addStereotypeItem(getPackageName() + ".S1");
removeStereotypeItem(getPackageName() + ".S2");
checkResult("alternatives", ".S1");
}
private String getDocumentText() {
EditorPartWrapper beans = new EditorPartWrapper();
beans.activateSourcePage();
String text = new DefaultStyledText().getText();
return text;
}
private void checkResult(String type, String elementName) {
String documentText = getDocumentText();
List<String> nodeList = getItems(documentText, type);
assertTrue(containsItem(nodeList, getPackageName() + elementName));
}
private void addClassItem(String className){
EditorPartWrapper beans = beansXMLHelper.openBeansXml(PROJECT_NAME);
beans.activateTreePage();
try {
beans.addClasses(className);
Assert.assertTrue(beans.isDirty());
beans.activateSourcePage();
String text = new DefaultStyledText().getText();
List<String> nl = getItems(text, "classes");
assertTrue(containsItem(nl, className));
} finally {
if (beans.isDirty()) {
beans.save();
}
}
}
private void addInterceptorItem(String interceptorName){
EditorPartWrapper beans = beansXMLHelper.openBeansXml(PROJECT_NAME);
beans.activateTreePage();
try {
beans.addInterceptors(interceptorName);
Assert.assertTrue(beans.isDirty());
beans.activateSourcePage();
String text = new DefaultStyledText().getText();
List<String> nl = getItems(text, "interceptors");
assertTrue(containsItem(nl, interceptorName));
} finally {
if (beans.isDirty()) {
beans.save();
}
}
}
private void addStereotypeItem(String stereotypeName){
EditorPartWrapper beans = beansXMLHelper.openBeansXml(PROJECT_NAME);
beans.activateTreePage();
try {
beans.addStereotypes(stereotypeName);
Assert.assertTrue(beans.isDirty());
beans.activateSourcePage();
String text = new DefaultStyledText().getText();
List<String> nl = getItems(text, "stereotypes");
assertTrue(containsItem(nl, stereotypeName));
} finally {
if (beans.isDirty()) {
beans.save();
}
}
}
private void addDecoratorItem(String decoratorName){
EditorPartWrapper beans = beansXMLHelper.openBeansXml(PROJECT_NAME);
beans.activateTreePage();
try {
beans.addDecorators(decoratorName);
Assert.assertTrue(beans.isDirty());
beans.activateSourcePage();
beans.save();
String text = new DefaultStyledText().getText();
List<String> nl = getItems(text, "decorators");
assertTrue(containsItem(nl, decoratorName));
} finally {
if (beans.isDirty()) {
beans.save();
}
}
}
private void removeDecoratorItem(String decoratorName){
EditorPartWrapper beans = new EditorPartWrapper();
beans.activateTreePage();
try {
beans.removeDecorators(decoratorName);
Assert.assertTrue(beans.isDirty());
beans.activateSourcePage();
String text = new DefaultStyledText().getText();
List<String> nl = getItems(text, "decorators");
assertFalse(containsItem(nl, decoratorName));
} finally {
if (beans.isDirty()) {
beans.save();
}
}
}
private void removeInterceptorItem(String interceptorName){
EditorPartWrapper beans = new EditorPartWrapper();
beans.activateTreePage();
try {
beans.removeInterceptors(interceptorName);
Assert.assertTrue(beans.isDirty());
beans.activateSourcePage();
String text = new DefaultStyledText().getText();
List<String> nl = getItems(text, "interceptors");
assertFalse(containsItem(nl, interceptorName));
} finally {
if (beans.isDirty()) {
beans.save();
}
}
}
private void removeClassItem(String className){
EditorPartWrapper beans = new EditorPartWrapper();
beans.activateTreePage();
try {
beans.removeClasses(className);
Assert.assertTrue(beans.isDirty());
beans.activateSourcePage();
String text = new DefaultStyledText().getText();
List<String> nl = getItems(text, "classes");
assertFalse(containsItem(nl, className));
} finally {
if (beans.isDirty()) {
beans.save();
}
}
}
private void removeStereotypeItem(String stereotypeName){
EditorPartWrapper beans = new EditorPartWrapper();
beans.activateTreePage();
try {
beans.removeStereotypes(stereotypeName);
Assert.assertTrue(beans.isDirty());
beans.activateSourcePage();
String text = new DefaultStyledText().getText();
List<String> nl = getItems(text, "stereotypes");
assertFalse(containsItem(nl, stereotypeName));
} finally {
if (beans.isDirty()) {
beans.save();
}
}
}
private Document getDocument(String text) {
Document d = null;
try {
d = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new ByteArrayInputStream(text.getBytes()));
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
return d;
}
private List<String> getItems(String doc, String item) {
Document d = getDocument(doc);
if(item.equals("classes") || item.equals("stereotypes")){
item = "alternatives";
}
NodeList nl = d.getElementsByTagName(item);
List<String> list = new ArrayList<String>();
for (int i = 0; i < nl.getLength(); i++) {
Node n = nl.item(i);
if (item.equals(n.getNodeName())) {
System.out.println("matched node "+n.getNodeName());
NodeList cl = n.getChildNodes();
for(int y=0;y< cl.getLength(); y++){
if(!cl.item(y).getNodeName().equals("#text")){
list.add(cl.item(y).getTextContent());
}
}
}
}
return list;
}
private boolean containsItem(List<String> nl, String name) {
if (nl == null) {
return false;
}
for(String s: nl){
if(name.equals(s)){
return true;
}
}
return false;
}
}