/*******************************************************************************
* Copyright (c) 2007-2013 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
*
* Contributor:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.jsf.ui.test;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import junit.framework.TestCase;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.Path;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.palette.PaletteContainer;
import org.eclipse.gef.palette.PaletteEntry;
import org.eclipse.gef.palette.PaletteRoot;
import org.eclipse.gef.ui.palette.editparts.PaletteEditPart;
import org.eclipse.gef.ui.views.palette.PalettePage;
import org.eclipse.gef.ui.views.palette.PaletteView;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.TextSelection;
import org.eclipse.jface.text.source.ISourceViewer;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jst.j2ee.internal.common.classpath.J2EEComponentClasspathUpdater;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.part.IPage;
import org.jboss.tools.common.model.XModel;
import org.jboss.tools.common.model.XModelObject;
import org.jboss.tools.common.model.ui.views.palette.IPaletteAdapter;
import org.jboss.tools.common.model.ui.views.palette.PaletteInsertHelper;
import org.jboss.tools.common.model.util.EclipseResourceUtil;
import org.jboss.tools.jsf.ui.JsfUiPlugin;
import org.jboss.tools.jst.web.ui.internal.editor.jspeditor.JSPMultiPageEditor;
import org.jboss.tools.jst.web.ui.internal.editor.jspeditor.PagePaletteContents;
import org.jboss.tools.jst.web.ui.internal.editor.jspeditor.PalettePageImpl;
import org.jboss.tools.jst.web.ui.internal.editor.jspeditor.dnd.JSPPaletteInsertHelper;
import org.jboss.tools.jst.web.tld.model.helpers.TLDToPaletteHelper;
import org.jboss.tools.jst.web.ui.WebDevelopmentPerspectiveFactory;
import org.jboss.tools.jst.web.ui.palette.PaletteAdapter;
import org.jboss.tools.jst.web.ui.palette.PaletteViewer;
import org.jboss.tools.jst.web.ui.palette.model.IPaletteModel;
import org.jboss.tools.jst.web.ui.palette.model.PaletteItem;
import org.jboss.tools.jst.web.ui.palette.model.PaletteModel;
import org.jboss.tools.test.util.ProjectImportTestSetup;
public class TestPalette extends TestCase {
static String jsfProjectName = "testJSFProject";
static IProject jsfProject;
protected void setUp() throws Exception {
loadProjects();
List<IProject> projectList = new ArrayList<IProject>();
projectList.add(jsfProject);
J2EEComponentClasspathUpdater.getInstance().forceUpdate(projectList);
loadProjects();
}
private void loadProjects() throws Exception {
jsfProject = ProjectImportTestSetup.loadProject(jsfProjectName);
}
public void testPalette() throws Exception {
IWorkbench w = JsfUiPlugin.getDefault().getWorkbench();
IWorkbenchWindow window = w.getActiveWorkbenchWindow();
//open Web Development perspective
w.showPerspective(WebDevelopmentPerspectiveFactory.PERSPECTIVE_ID, window);
//open file
IFile f = jsfProject.getFile(new Path("WebContent/pages/hello.jsp"));
assertNotNull(f);
IEditorPart editor = IDE.openEditor(window.getActivePage(), f);
assertNotNull(editor);
PagePaletteContents contents = new PagePaletteContents(editor);
//check palette model
IPaletteModel paletteModel = PaletteModel.getInstance(contents);
assertNotNull(paletteModel);
PaletteRoot root = paletteModel.getPaletteRoot();
List<?> tabs = root.getChildren();
assertTrue(!tabs.isEmpty());
for (Object tab: tabs) {
assertTrue(tab instanceof PaletteContainer);
PaletteContainer c = (PaletteContainer)tab;
System.out.println(c);
List<?> macros = c.getChildren();
assertTrue(!macros.isEmpty());
for (Object m: macros) {
assertTrue(m instanceof PaletteEntry);
}
}
//get palette view
IViewPart part = window.getActivePage().findView("org.eclipse.gef.ui.palette_view");
assertNotNull(part);
assertTrue(part instanceof PaletteView);
PaletteView view = (PaletteView)part;
IPage page1 = view.getCurrentPage();
assertTrue(editor instanceof JSPMultiPageEditor);
PalettePage page = (PalettePage)editor.getAdapter(PalettePage.class);
//compare page obtained from view and editor, must be the same
assertTrue(page1 == page);
assertTrue(page instanceof PalettePageImpl);
PalettePageImpl palettePage = (PalettePageImpl)page;
IPaletteAdapter adapter = palettePage.getAdapter();
assertTrue(adapter instanceof PaletteAdapter);
//check edit parts
PaletteViewer viewer = ((PaletteAdapter)adapter).getViewer();
List<?> parts = viewer.getRootEditPart().getChildren();
for (Object p: parts) {
List<?> parts1 = ((EditPart)p).getChildren();
for (Object p1: parts1) {
List<?> parts2 = ((EditPart)p1).getChildren();
for (Object p2: parts2) {
assertTrue(p2 instanceof PaletteEditPart);
PaletteEditPart entry = (PaletteEditPart)p2;
Object o = entry.getModel();
assertTrue(o instanceof PaletteItem);
// viewer.setActiveTool((PaletteItem)o);
}
}
}
}
public void testTLDTagImport() throws Exception {
XModel model = EclipseResourceUtil.getModelNature(jsfProject).getModel();
XModelObject tld = model.getByPath("/META-INF/fmt.tld");
assertNotNull("Taglib /META-INF/fmt.tld is not found.", tld);
XModelObject g = new TLDToPaletteHelper().createGroupByTLD(tld, model);
assertNotNull(g);
XModelObject m = g.getChildByPath("timeZone");
assertNotNull("Macros timeZone was not created.", m);
assertEquals("Text of macros timeZone is not correct.", "<timeZone value=\"|\">", m.getAttributeValue("start text"));
}
public void testTLDFunctionImport() throws Exception {
XModel model = EclipseResourceUtil.getModelNature(jsfProject).getModel();
XModelObject tld = model.getByPath("/META-INF/fn.tld");
assertNotNull("Taglib /META-INF/fn.tld is not found.", tld);
XModelObject g = new TLDToPaletteHelper().createGroupByTLD(tld, model);
assertNotNull(g);
assertEquals("Library uri is not set correctly to the palette group.", "http://java.sun.com/jsp/jstl/functions", g.getAttributeValue("library uri"));
System.out.println(g.getAttributeValue("library uri"));
XModelObject m = g.getChildByPath("containsIgnoreCase");
assertNotNull("Macros containsIgnoreCase was not created.", m);
assertEquals("Text of macros containsIgnoreCase is not correct.", "${containsIgnoreCase('', '')}", m.getAttributeValue("start text"));
}
public void testFaceletTaglibImport() throws Exception {
XModel model = EclipseResourceUtil.getModelNature(jsfProject).getModel();
XModelObject tld = model.getByPath("/kgcomponents.taglib.xml");
assertNotNull("Facelet taglib kgcomponents.taglib.xml not found.", tld);
XModelObject g = new TLDToPaletteHelper().createGroupByTLD(tld, model);
assertNotNull(g);
assertEquals("Library uri is not set correctly to the palette group.", "http://www.krasig.org/paduan", g.getAttributeValue("library uri"));
XModelObject m = g.getChildByPath("myModal");
assertNotNull("Macros myModal was not created.", m);
assertEquals("Text of macros myModal is not correct.", "<myModal>", m.getAttributeValue("start text"));
assertTrue("Text of description of macro myModal is not correct.", m.getAttributeValue("description").endsWith("<code></code>"));
}
public void testPaletteInsertHelper() throws Exception {
IWorkbench w = JsfUiPlugin.getDefault().getWorkbench();
IWorkbenchWindow window = w.getActiveWorkbenchWindow();
//open Web Development perspective
w.showPerspective(WebDevelopmentPerspectiveFactory.PERSPECTIVE_ID, window);
//open file
IFile f = jsfProject.getFile(new Path("WebContent/pages/hello2.jsp"));
assertNotNull(f);
IEditorPart editor = IDE.openEditor(window.getActivePage(), f);
assertNotNull(editor);
assertTrue(editor instanceof JSPMultiPageEditor);
JSPMultiPageEditor jspEditor = (JSPMultiPageEditor)editor;
//Test applying prefix
String[] text = {"${containsIgnoreCase('', '')}"};
JSPPaletteInsertHelper.applyPrefix(text, jspEditor.getSourceEditor(), "containsIgnoreCase", "http://java.sun.com/jsp/jstl/functions", "fn");
assertEquals("Prefix is not substituted correctly.", "${fn2:containsIgnoreCase('', '')}", text[0]);
//Set selection in text editor.
int offset = 306;
ISelectionProvider selProvider = jspEditor.getSourceEditor().getSelectionProvider();
selProvider.setSelection(new TextSelection(offset, 0));
//Prepare parameters
ISourceViewer v = (ISourceViewer)jspEditor.getSourceEditor().getAdapter(ISourceViewer.class);
assertNotNull(v);
Properties p = new Properties();
p.setProperty(PaletteInsertHelper.PROPERTY_TAG_NAME, "containsIgnoreCase");
p.setProperty(PaletteInsertHelper.PROPERTY_START_TEXT, "${containsIgnoreCase('', '')}");
p.setProperty(JSPPaletteInsertHelper.PROPOPERTY_TAGLIBRARY_URI, "http://java.sun.com/jsp/jstl/functions");
//Execute insert into editor.
JSPPaletteInsertHelper.getInstance().insertIntoEditor(v, p);
IDocument doc = jspEditor.getSourceEditor().getDocumentProvider().getDocument(editor.getEditorInput());
assertTrue(doc.get().indexOf("${fn2:containsIgnoreCase('', '')}") >= 0);
}
}