use of org.xwiki.extension.ExtensionId in project xwiki-platform by xwiki.
the class ExtensionIT method testUpgrade.
/**
* Tests how an extension is upgraded.
*/
@Test
public void testUpgrade() throws Exception {
// Setup the extension.
String extensionId = "alice-xar-extension";
String oldVersion = "1.3";
String newVersion = "2.1.4";
TestExtension oldExtension = getRepositoryTestUtils().getTestExtension(new ExtensionId(extensionId, oldVersion), "xar");
getRepositoryTestUtils().addExtension(oldExtension);
TestExtension newExtension = getRepositoryTestUtils().getTestExtension(new ExtensionId(extensionId, newVersion), "xar");
getRepositoryTestUtils().attachFile(newExtension);
getRepositoryTestUtils().addVersionObject(newExtension, newVersion, "attach:" + newExtension.getFile().getName());
// Make sure the old version is installed.
getExtensionTestUtils().install(new ExtensionId(extensionId, oldVersion));
// Upgrade the extension.
ExtensionAdministrationPage adminPage = ExtensionAdministrationPage.gotoPage();
ExtensionPane extensionPane = adminPage.getSearchBar().clickAdvancedSearch().search(extensionId, newVersion).getExtension(0);
assertEquals("remote-installed", extensionPane.getStatus());
assertEquals("Version 1.3 is installed", extensionPane.getStatusMessage());
extensionPane = extensionPane.upgrade();
// Check the upgrade plan.
List<DependencyPane> upgradePlan = extensionPane.openProgressSection().getJobPlan();
assertEquals(1, upgradePlan.size());
assertEquals(extensionId, upgradePlan.get(0).getName());
assertEquals(newVersion, upgradePlan.get(0).getVersion());
assertEquals("remote-installed", upgradePlan.get(0).getStatus());
assertEquals("Version 1.3 is installed", upgradePlan.get(0).getStatusMessage());
// Finish the upgrade and check the upgrade log.
extensionPane = extensionPane.confirm();
assertEquals("installed", extensionPane.getStatus());
assertEquals("Installed", extensionPane.getStatusMessage());
List<LogItemPane> log = extensionPane.openProgressSection().getJobLog();
assertTrue(log.size() > 2);
assertEquals("info", log.get(2).getLevel());
assertEquals("Resolving extension [alice-xar-extension 2.1.4] on namespace [Home]", log.get(2).getMessage());
assertEquals("info", log.get(log.size() - 1).getLevel());
assertEquals("Finished job of type [install] with identifier " + "[extension/action/alice-xar-extension/wiki:xwiki]", log.get(log.size() - 1).getMessage());
// Assert the changes.
ViewPage viewPage = getUtil().gotoPage("ExtensionTest", "Alice");
assertEquals("Alice Wiki Macro (upgraded)", viewPage.getDocumentTitle());
assertTrue(viewPage.getContent().contains("Alice says hi guys!"));
}
use of org.xwiki.extension.ExtensionId in project xwiki-platform by xwiki.
the class ExtensionIT method testUpgradeWithMergeConflict.
/**
* Tests how an extension is upgraded when there is a merge conflict.
*/
@Test
public void testUpgradeWithMergeConflict() throws Exception {
// Setup the extension.
String extensionId = "alice-xar-extension";
String oldVersion = "1.3";
String newVersion = "2.1.4";
TestExtension oldExtension = getRepositoryTestUtils().getTestExtension(new ExtensionId(extensionId, oldVersion), "xar");
getRepositoryTestUtils().addExtension(oldExtension);
TestExtension newExtension = getRepositoryTestUtils().getTestExtension(new ExtensionId(extensionId, newVersion), "xar");
getRepositoryTestUtils().attachFile(newExtension);
getRepositoryTestUtils().addVersionObject(newExtension, newVersion, "attach:" + newExtension.getFile().getName());
// Make sure the old version is installed.
getExtensionTestUtils().install(new ExtensionId(extensionId, oldVersion));
// Edit the installed version so that we have a merge conflict.
Map<String, String> queryParameters = new HashMap<String, String>();
queryParameters.put("title", "Alice Extension");
queryParameters.put("content", "== Usage ==\n\n{{code language=\"none\"}}\n" + "{{alice/}}\n{{/code}}\n\n== Output ==\n\n{{alice/}}");
queryParameters.put("XWiki.WikiMacroClass_0_code", "{{info}}Alice says hello!{{/info}}");
getUtil().gotoPage("ExtensionTest", "Alice", "save", queryParameters);
// Initiate the upgrade process.
ExtensionAdministrationPage adminPage = ExtensionAdministrationPage.gotoPage();
SearchResultsPane searchResults = adminPage.getSearchBar().clickAdvancedSearch().search(extensionId, newVersion);
ExtensionPane extensionPane = searchResults.getExtension(0);
extensionPane = extensionPane.upgrade().confirm();
// Check the merge conflict UI.
assertEquals("loading", extensionPane.getStatus());
assertNull(extensionPane.getStatusMessage());
ProgressBarPane progressBar = extensionPane.getProgressBar();
assertEquals(66, progressBar.getPercent());
assertEquals("Conflict between [@@ -1,1 +1,1 @@] and [@@ -1,1 +1,1 @@]", progressBar.getMessage());
ExtensionProgressPane progressPane = extensionPane.openProgressSection();
WebElement jobLogLabel = progressPane.getJobLogLabel();
assertEquals("INSTALL LOG".toLowerCase(), jobLogLabel.getText().toLowerCase());
// The job log is collapsed when the job is waiting for user input so we need to expand it before asserting its
// content (otherwise #getText() returns the empty string because the text is not visible).
jobLogLabel.click();
List<LogItemPane> upgradeLog = progressPane.getJobLog();
LogItemPane lastLogItem = upgradeLog.get(upgradeLog.size() - 1);
assertEquals("loading", lastLogItem.getLevel());
assertEquals(progressBar.getMessage(), lastLogItem.getMessage());
MergeConflictPane mergeConflictPane = progressPane.getMergeConflict();
ChangesPane changesPane = mergeConflictPane.getChanges();
assertEquals(Arrays.asList("Page properties", "XWiki.WikiMacroClass[0]"), changesPane.getChangedEntities());
EntityDiff pagePropertiesDiff = changesPane.getEntityDiff("Page properties");
assertEquals(Arrays.asList("Parent", "Content"), pagePropertiesDiff.getPropertyNames());
assertFalse(pagePropertiesDiff.getDiff("Content").isEmpty());
EntityDiff macroDiff = changesPane.getEntityDiff("XWiki.WikiMacroClass[0]");
assertEquals(Arrays.asList("Macro description"), macroDiff.getPropertyNames());
assertEquals(Arrays.asList("@@ -1,1 +1,1 @@", "-<del>Test</del> macro.", "+<ins>A</ins> <ins>cool </ins>macro."), macroDiff.getDiff("Macro description"));
mergeConflictPane.getFromVersionSelect().selectByVisibleText("Previous version");
mergeConflictPane.getToVersionSelect().selectByVisibleText("Current version");
mergeConflictPane = mergeConflictPane.clickShowChanges();
changesPane = mergeConflictPane.getChanges();
List<String> expectedDiff = new ArrayList<>();
expectedDiff.add("@@ -1,9 +1,9 @@");
expectedDiff.add("-= Usage =");
expectedDiff.add("+=<ins>=</ins> Usage =<ins>=</ins>");
expectedDiff.add(" ");
expectedDiff.add("-{{code}}");
expectedDiff.add("+{{code<ins> language=\"none\"</ins>}}");
expectedDiff.add(" {{alice/}}");
expectedDiff.add(" {{/code}}");
expectedDiff.add(" ");
expectedDiff.add("-= <del>Res</del>u<del>l</del>t =");
expectedDiff.add("+=<ins>=</ins> <ins>O</ins>ut<ins>put</ins> =<ins>=</ins>");
expectedDiff.add(" ");
expectedDiff.add(" {{alice/}}");
assertEquals(expectedDiff, changesPane.getEntityDiff("Page properties").getDiff("Content"));
assertEquals(1, changesPane.getDiffSummary().toggleObjectsDetails().getModifiedObjects().size());
assertEquals(Arrays.asList("@@ -1,1 +1,1 @@", "-Alice says hello!", "+<ins>{{info}}</ins>Alice says hello!<ins>{{/info}}</ins>"), changesPane.getEntityDiff("XWiki.WikiMacroClass[0]").getDiff("Macro code"));
// Finish the merge.
mergeConflictPane.getVersionToKeepSelect().selectByValue("NEXT");
// FIXME: We get the extension pane from the search results because it is reloaded when we compare the versions.
extensionPane = searchResults.getExtension(0).confirm();
assertEquals("installed", extensionPane.getStatus());
assertNull(extensionPane.getProgressBar());
upgradeLog = extensionPane.openProgressSection().getJobLog();
lastLogItem = upgradeLog.get(upgradeLog.size() - 1);
assertEquals("info", lastLogItem.getLevel());
assertEquals("Finished job of type [install] with identifier " + "[extension/action/alice-xar-extension/wiki:xwiki]", lastLogItem.getMessage());
// Check the merge result.
ViewPage mergedPage = getUtil().gotoPage("ExtensionTest", "Alice");
assertEquals("Alice Wiki Macro (upgraded)", mergedPage.getDocumentTitle());
}
use of org.xwiki.extension.ExtensionId in project xwiki-platform by xwiki.
the class ExtensionIT method testFilterRecommended.
/**
* Make sure recommended extension are properly filtered.
*/
@Test
public void testFilterRecommended() throws Exception {
// Add recommended extension
ExtensionId recommendedExtensionId = new ExtensionId("alice-xar-extension", "1.3");
TestExtension recommendedExtension = getRepositoryTestUtils().getTestExtension(recommendedExtensionId, "xar");
recommendedExtension.setRecommended(true);
getRepositoryTestUtils().addExtension(recommendedExtension);
// Add not recommended extension
ExtensionId notRecommendedExtensionId = new ExtensionId("bob-xar-extension", "2.5-milestone-2");
TestExtension notRecommendedExtension = getRepositoryTestUtils().getTestExtension(notRecommendedExtensionId, "xar");
getRepositoryTestUtils().addExtension(notRecommendedExtension);
// Make sure everything is ready
getRepositoryTestUtils().waitUntilReady();
ExtensionAdministrationPage adminPage = ExtensionAdministrationPage.gotoPage();
// Empty search
SearchResultsPane searchResults = adminPage.getSearchResults();
assertNotNull(searchResults.getExtension(recommendedExtensionId));
assertNull(searchResults.getExtension(notRecommendedExtensionId));
// Search among recommended extensions
SimpleSearchPane searchBar = adminPage.getSearchBar();
searchResults = searchBar.search("alice-xar-extension");
assertNotNull(searchResults.getExtension(recommendedExtensionId));
assertNull(searchResults.getExtension(notRecommendedExtensionId));
// Fallback on all extensions
searchResults = searchBar.search("bob-xar-extension");
assertNull(searchResults.getExtension(recommendedExtensionId));
assertNotNull(searchResults.getExtension(notRecommendedExtensionId));
}
use of org.xwiki.extension.ExtensionId in project xwiki-platform by xwiki.
the class RepairXarJob method runInternal.
@Override
protected void runInternal() throws Exception {
this.progressManager.pushLevelProgress(getRequest().getExtensions().size(), this);
try {
for (ExtensionId extensionId : getRequest().getExtensions()) {
this.progressManager.startStep(this);
if (getRequest().getNamespaces() != null) {
this.progressManager.pushLevelProgress(getRequest().getNamespaces().size(), this);
try {
for (String namespace : getRequest().getNamespaces()) {
this.progressManager.startStep(this);
repairExtension(extensionId, namespace, false, Collections.emptyMap());
this.progressManager.endStep(this);
}
} finally {
this.progressManager.popLevelProgress(this);
}
} else {
repairExtension(extensionId, null, false, Collections.emptyMap());
}
this.progressManager.endStep(this);
}
} finally {
this.progressManager.popLevelProgress(this);
}
}
use of org.xwiki.extension.ExtensionId in project xwiki-platform by xwiki.
the class ExtensionManagerScriptService method resolve.
/**
* Get the extension handler corresponding to the given extension ID and version. The returned handler can be used
* to get more information about the extension, such as the authors, an extension description, its license...
*
* @param id the extension id or provided feature (virtual extension) of the extension to resolve
* @param version the specific version to resolve
* @return the read-only handler corresponding to the requested extension, or {@code null} if the extension couldn't
* be resolved, in which case {@link #getLastError()} contains the failure reason
*/
public Extension resolve(String id, String version) {
setError(null);
Extension extension = null;
try {
extension = safe(this.extensionManager.resolveExtension(new ExtensionId(id, version)));
} catch (Exception e) {
setError(e);
}
return extension;
}
Aggregations