package org.archstudio.archlight.core; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; import org.archstudio.archlight.ArchlightDocTest; import org.archstudio.archlight.ArchlightTest; import org.archstudio.resources.IResources; import org.archstudio.sysutils.SystemUtils; import org.archstudio.xadl.XadlUtils; import org.archstudio.xadl3.archlight_3_0.Archlight_3_0Package; import org.archstudio.xarchadt.IXArchADT; import org.archstudio.xarchadt.ObjRef; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.swt.graphics.Image; import org.eclipse.ui.ISharedImages; import com.google.common.collect.Iterables; public class ArchlightUtils { public static final int APPLIED = 1; public static final int DISABLED = 2; public static final int NOT_APPLIED = 3; public static final String IMAGE_OVERLAY_CHECKBOX_CHECKED = "archlight:checkbox/checked"; public static final String IMAGE_OVERLAY_STOPSIGN = "archlight:stopsign"; public static final String IMAGE_OVERLAY_CHECKBOX_UNCHECKED = "archlight:checkbox/unchecked"; public static final String IMAGE_FOLDER_APPLIED = "archlight:folder/enabled"; public static final String IMAGE_FOLDER_DISABLED = "archlight:folder/disabled"; public static final String IMAGE_FOLDER_NOTAPPLIED = "archlight:folder/notapplied"; public static final String IMAGE_TEST_APPLIED = "archlight:test/enabled"; public static final String IMAGE_TEST_DISABLED = "archlight:test/disabled"; public static final String IMAGE_TEST_NOTAPPLIED = "archlight:test/notapplied"; public static final String IMAGE_RUN_TESTS = "archlight:runtests"; public static final String IMAGE_RELOAD_TESTS = "archlight:refreshtests"; private ArchlightUtils() { } public static void initResources(IResources resources) { try { resources.createImage(IMAGE_RUN_TESTS, SystemUtils.blt(ArchlightUtils.class.getResourceAsStream("res/icon-go.gif"))); resources.createImage(IMAGE_RELOAD_TESTS, SystemUtils.blt(ArchlightUtils.class.getResourceAsStream("res/icon-refresh.gif"))); resources.createImage(IMAGE_OVERLAY_CHECKBOX_CHECKED, SystemUtils.blt(ArchlightUtils.class.getResourceAsStream("res/decorator-checkbox-checked.gif"))); resources.createImage(IMAGE_OVERLAY_CHECKBOX_UNCHECKED, SystemUtils.blt(ArchlightUtils.class.getResourceAsStream("res/decorator-checkbox-unchecked.gif"))); resources.createImage(IMAGE_OVERLAY_STOPSIGN, SystemUtils.blt(ArchlightUtils.class.getResourceAsStream("res/decorator-stopsign.gif"))); resources.createOverlayImage(IMAGE_FOLDER_APPLIED, resources.getPlatformImage(ISharedImages.IMG_OBJ_FOLDER), new Image[] { resources.getImage(IMAGE_OVERLAY_CHECKBOX_CHECKED) }, new int[] { IResources.BOTTOM_RIGHT }); resources.createOverlayImage(IMAGE_FOLDER_DISABLED, resources.getPlatformImage(ISharedImages.IMG_OBJ_FOLDER), new Image[] { resources.getImage(IMAGE_OVERLAY_STOPSIGN) }, new int[] { IResources.BOTTOM_RIGHT }); resources.createOverlayImage(IMAGE_FOLDER_NOTAPPLIED, resources.getPlatformImage(ISharedImages.IMG_OBJ_FOLDER), new Image[] { resources.getImage(IMAGE_OVERLAY_CHECKBOX_UNCHECKED) }, new int[] { IResources.BOTTOM_RIGHT }); resources.createOverlayImage(IMAGE_TEST_APPLIED, resources.getPlatformImage(ISharedImages.IMG_OBJ_FILE), new Image[] { resources.getImage(IMAGE_OVERLAY_CHECKBOX_CHECKED) }, new int[] { IResources.BOTTOM_RIGHT }); resources.createOverlayImage(IMAGE_TEST_DISABLED, resources.getPlatformImage(ISharedImages.IMG_OBJ_FILE), new Image[] { resources.getImage(IMAGE_OVERLAY_STOPSIGN) }, new int[] { IResources.BOTTOM_RIGHT }); resources.createOverlayImage(IMAGE_TEST_NOTAPPLIED, resources.getPlatformImage(ISharedImages.IMG_OBJ_FILE), new Image[] { resources.getImage(IMAGE_OVERLAY_CHECKBOX_UNCHECKED) }, new int[] { IResources.BOTTOM_RIGHT }); } catch (IOException ioe) { throw new RuntimeException("This shouldn't happen."); } } public static List<ArchlightDocTest> loadDocTests(IXArchADT xarch, ObjRef docRootRef) { List<ArchlightDocTest> docTestList = new ArrayList<ArchlightDocTest>(); try { ObjRef xADLRef = (ObjRef) xarch.get(docRootRef, "xADL"); if (xADLRef != null) { List<ObjRef> archlightRefs = XadlUtils.getAllSubstitutionGroupElementsByTag(xarch, xADLRef, "topLevelElement", "archlight"); if (archlightRefs.size() > 0) { ObjRef archlightRef = archlightRefs.get(0); for (ObjRef testRef : Iterables.filter(xarch.getAll(archlightRef, "test"), ObjRef.class)) { String testUID = XadlUtils.getID(xarch, testRef); String testName = XadlUtils.getName(xarch, testRef); if (testName == null) { testName = "[no data]"; } Boolean enabled = (Boolean) xarch.get(testRef, "enabled"); if (enabled == null) { enabled = Boolean.FALSE; } ArchlightDocTest newDocTest = new ArchlightDocTest(testUID, testName, enabled.booleanValue()); docTestList.add(newDocTest); } } } } catch (Exception e) { e.printStackTrace(); } return Collections.unmodifiableList(docTestList); } public static void makeDocTestApplied(IXArchADT xarch, ObjRef documentRootRef, ArchlightTest testToUpdate, boolean isEnabled) { ObjRef xADLRef = (ObjRef) xarch.get(documentRootRef, "xADL"); if (xADLRef != null) { ObjRef archlightRef = null; List<ObjRef> archlightRefs = XadlUtils.getAllSubstitutionGroupElementsByTag(xarch, xADLRef, "topLevelElement", "archlight"); if (archlightRefs.size() > 0) { archlightRef = archlightRefs.get(0); } if (archlightRef != null) { for (ObjRef testRef : Iterables.filter(xarch.getAll(archlightRef, "test"), ObjRef.class)) { String testUID = (String) xarch.get(testRef, "id"); if (testUID != null && testUID.equals(testToUpdate.getUID())) { //Found it. Just update with the new status. xarch.set(testRef, "enabled", isEnabled); return; } } } //We didn't find it. Create ancestor elements if necessary. if (archlightRef == null) { archlightRef = XadlUtils.create(xarch, Archlight_3_0Package.Literals.ARCHLIGHT); xarch.add(xADLRef, "topLevelElement", archlightRef); } //Let's create the test. ObjRef testRef = XadlUtils.create(xarch, Archlight_3_0Package.Literals.TEST); xarch.set(testRef, "id", testToUpdate.getUID()); String nameString = "Tool: " + testToUpdate.getToolID() + "; Category: " + testToUpdate.getCategory(); XadlUtils.setName(xarch, testRef, nameString); try { xarch.set(testRef, "enabled", isEnabled); } catch (Throwable t) { t.printStackTrace(); } xarch.add(archlightRef, "test", testRef); } } public static void makeDocTestNotApplied(IXArchADT xarch, ObjRef documentRootRef, ArchlightTest testToUpdate) { ObjRef xADLRef = (ObjRef) xarch.get(documentRootRef, "xADL"); if (xADLRef != null) { ObjRef archlightRef = null; List<ObjRef> archlightRefs = XadlUtils.getAllSubstitutionGroupElementsByTag(xarch, xADLRef, "topLevelElement", "archlight"); if (archlightRefs.size() > 0) { archlightRef = archlightRefs.get(0); } if (archlightRef != null) { for (ObjRef testRef : Iterables.filter(xarch.getAll(archlightRef, "test"), ObjRef.class)) { String testUID = (String) xarch.get(testRef, "id"); if (testUID != null && testUID.equals(testToUpdate.getUID())) { //Found it. Remove it xarch.remove(archlightRef, "test", testRef); return; } } } } } public static void changeTestState(IXArchADT xarch, ObjRef xArchRef, Collection<? extends ArchlightTest> tests, Object element, int newState) { List<ArchlightTest> testsToChange = new ArrayList<ArchlightTest>(); if (element instanceof ObjRef) { testsToChange.addAll(tests); } else if (element instanceof FolderNode) { String[] basePathSegments = ((FolderNode) element).getPathSegments(); StringBuffer sb = new StringBuffer(); for (int i = 0; i < basePathSegments.length; i++) { sb.append(basePathSegments[i]); if (i != basePathSegments.length - 1) { sb.append("/"); } } String basePath = sb.toString(); for (ArchlightTest test : tests) { if (test.getCategory().startsWith(basePath)) { testsToChange.add(test); } } } else if (element instanceof ArchlightTest) { testsToChange.add((ArchlightTest) element); } for (ArchlightTest test : testsToChange) { if (newState == ArchlightUtils.APPLIED || newState == ArchlightUtils.DISABLED) { ArchlightUtils.makeDocTestApplied(xarch, xArchRef, test, newState == ArchlightUtils.APPLIED); } else if (newState == ArchlightUtils.NOT_APPLIED) { ArchlightUtils.makeDocTestNotApplied(xarch, xArchRef, test); } } } public static List<? extends IAction> createTestMenuActions(IXArchADT xarch, ObjRef documentRootRef, Collection<? extends ArchlightTest> tests, IResources resources, Object element) { final IXArchADT fxarch = xarch; final ObjRef fdocumentRootRef = documentRootRef; final Collection<? extends ArchlightTest> ftests = tests; List<Action> actions = new ArrayList<Action>(); boolean multi = !(element instanceof ArchlightTest); String kindOfThing = multi ? "All Tests" : "Test"; Image applyIcon = resources.getImage(multi ? IMAGE_FOLDER_APPLIED : IMAGE_TEST_APPLIED); Image disableIcon = resources.getImage(multi ? IMAGE_FOLDER_DISABLED : IMAGE_TEST_DISABLED); Image unapplyIcon = resources.getImage(multi ? IMAGE_FOLDER_NOTAPPLIED : IMAGE_TEST_NOTAPPLIED); final Object felement = element; Action applyAction = new Action("Make " + kindOfThing + " Applied/Enabled", ImageDescriptor.createFromImage(applyIcon)) { @Override public void run() { changeTestState(fxarch, fdocumentRootRef, ftests, felement, APPLIED); } }; actions.add(applyAction); Action disableAction = new Action("Make " + kindOfThing + " Applied/Disabled", ImageDescriptor.createFromImage(disableIcon)) { @Override public void run() { changeTestState(fxarch, fdocumentRootRef, ftests, felement, DISABLED); } }; actions.add(disableAction); Action unapplyAction = new Action("Make " + kindOfThing + " Unapplied", ImageDescriptor.createFromImage(unapplyIcon)) { @Override public void run() { changeTestState(fxarch, fdocumentRootRef, ftests, felement, NOT_APPLIED); } }; actions.add(unapplyAction); return Collections.unmodifiableList(actions); } }