use of org.xwiki.extension.ExtensionId in project xwiki-platform by xwiki.
the class RepositoryManager method importExtension.
public DocumentReference importExtension(String extensionId, ExtensionRepository repository, Type type) throws QueryException, XWikiException, ResolveException {
TreeMap<Version, String> versions = new TreeMap<Version, String>();
Version lastVersion = getVersions(extensionId, repository, type, versions);
if (lastVersion == null) {
throw new ExtensionNotFoundException("Can't find any version for the extension [" + extensionId + "] on repository [" + repository + "]");
} else if (versions.isEmpty()) {
// If no valid version import the last version
versions.put(lastVersion, extensionId);
} else {
// Select the last valid version
lastVersion = versions.lastKey();
}
Extension extension = repository.resolve(new ExtensionId(extensionId, lastVersion));
// Get former ids versions
Collection<ExtensionId> features = extension.getExtensionFeatures();
for (ExtensionId feature : features) {
try {
getVersions(feature.getId(), repository, type, versions);
} catch (ResolveException e) {
// Ignore
}
}
XWikiContext xcontext = this.xcontextProvider.get();
boolean needSave = false;
XWikiDocument document = getExistingExtensionDocumentById(extensionId);
if (document == null) {
// Create document
document = xcontext.getWiki().getDocument(new DocumentReference(xcontext.getWikiId(), Arrays.asList("Extension", extension.getName()), "WebHome"), xcontext);
for (int i = 1; !document.isNew(); ++i) {
document = xcontext.getWiki().getDocument(new DocumentReference(xcontext.getWikiId(), Arrays.asList("Extension", extension.getName() + ' ' + i), "WebHome"), xcontext);
}
document.readFromTemplate(this.currentResolver.resolve(XWikiRepositoryModel.EXTENSION_TEMPLATEREFERENCE), xcontext);
needSave = true;
}
// Update document
BaseObject extensionObject = document.getXObject(XWikiRepositoryModel.EXTENSION_CLASSREFERENCE);
if (extensionObject == null) {
extensionObject = document.newXObject(XWikiRepositoryModel.EXTENSION_CLASSREFERENCE, xcontext);
needSave = true;
}
if (!StringUtils.equals(extensionId, getValue(extensionObject, XWikiRepositoryModel.PROP_EXTENSION_ID, (String) null))) {
extensionObject.set(XWikiRepositoryModel.PROP_EXTENSION_ID, extensionId, xcontext);
needSave = true;
}
// Update extension informations
needSave |= updateExtension(extension, extensionObject, xcontext);
// Proxy marker
BaseObject extensionProxyObject = document.getXObject(XWikiRepositoryModel.EXTENSIONPROXY_CLASSREFERENCE);
if (extensionProxyObject == null) {
extensionProxyObject = document.newXObject(XWikiRepositoryModel.EXTENSIONPROXY_CLASSREFERENCE, xcontext);
extensionProxyObject.setIntValue(XWikiRepositoryModel.PROP_PROXY_AUTOUPDATE, 1);
needSave = true;
}
needSave |= update(extensionProxyObject, XWikiRepositoryModel.PROP_PROXY_REPOSITORYID, repository.getDescriptor().getId());
needSave |= update(extensionProxyObject, XWikiRepositoryModel.PROP_PROXY_REPOSITORYTYPE, repository.getDescriptor().getType());
needSave |= update(extensionProxyObject, XWikiRepositoryModel.PROP_PROXY_REPOSITORYURI, repository.getDescriptor().getURI().toString());
// Remove unexisting versions
Set<String> validVersions = new HashSet<String>();
List<BaseObject> versionObjects = document.getXObjects(XWikiRepositoryModel.EXTENSIONVERSION_CLASSREFERENCE);
if (versionObjects != null) {
for (BaseObject versionObject : versionObjects) {
if (versionObject != null) {
String version = getValue(versionObject, XWikiRepositoryModel.PROP_VERSION_VERSION);
if (StringUtils.isBlank(version) || (isVersionProxyingEnabled(document) && !new DefaultVersion(version).equals(extension.getId().getVersion()))) {
// Empty version OR old versions should be proxied
document.removeXObject(versionObject);
needSave = true;
} else {
if (!versions.containsKey(new DefaultVersion(version))) {
// The version does not exist on remote repository
if (!isVersionValid(document, versionObject, xcontext)) {
// The version is invalid, removing it to not make the whole extension invalid
document.removeXObject(versionObject);
needSave = true;
} else {
// The version is valid, lets keep it
validVersions.add(version);
}
} else {
// This version exist on remote repository
validVersions.add(version);
}
}
}
}
}
List<BaseObject> dependencyObjects = document.getXObjects(XWikiRepositoryModel.EXTENSIONDEPENDENCY_CLASSREFERENCE);
if (dependencyObjects != null) {
for (BaseObject dependencyObject : dependencyObjects) {
if (dependencyObject != null) {
String version = getValue(dependencyObject, XWikiRepositoryModel.PROP_DEPENDENCY_EXTENSIONVERSION);
if (!validVersions.contains(version)) {
// The version is invalid, removing it to not make the whole extension invalid
document.removeXObject(dependencyObject);
needSave = true;
}
}
}
}
for (Map.Entry<Version, String> entry : versions.entrySet()) {
Version version = entry.getKey();
String id = entry.getValue();
try {
Extension versionExtension;
if (version.equals(extension.getId().getVersion())) {
versionExtension = extension;
} else if (isVersionProxyingEnabled(document)) {
continue;
} else {
versionExtension = repository.resolve(new ExtensionId(id, version));
}
// Update version related informations
needSave |= updateExtensionVersion(document, versionExtension);
} catch (Exception e) {
this.logger.error("Failed to resolve extension with id [" + id + "] and version [" + version + "] on repository [" + repository + "]", e);
}
}
if (needSave) {
document.setAuthorReference(xcontext.getUserReference());
if (document.isNew()) {
document.setContentAuthorReference(xcontext.getUserReference());
document.setCreatorReference(xcontext.getUserReference());
}
xcontext.getWiki().saveDocument(document, "Imported extension [" + extensionId + "] from repository [" + repository.getDescriptor() + "]", true, xcontext);
}
return document.getDocumentReference();
}
use of org.xwiki.extension.ExtensionId in project xwiki-platform by xwiki.
the class AllTests method initExtensions.
public static void initExtensions(PersistentTestContext context) throws Exception {
// Initialize extensions and repositories
RepositoryTestUtils repositoryTestUtil = new RepositoryTestUtils(context.getUtil(), repositoryUtil, new SolrTestUtils(context.getUtil()));
repositoryTestUtil.init();
// Set integration repository and extension utils.
context.getProperties().put(RepositoryTestUtils.PROPERTY_KEY, repositoryTestUtil);
// Populate maven repository
File extensionFile = repositoryTestUtil.getTestExtension(new ExtensionId("emptyjar", "1.0"), "jar").getFile().getFile();
FileUtils.copyFile(extensionFile, new File(repositoryTestUtil.getRepositoryUtil().getMavenRepository(), "maven/extension/1.0/extension-1.0.jar"));
FileUtils.copyFile(extensionFile, new File(repositoryTestUtil.getRepositoryUtil().getMavenRepository(), "maven/extension/2.0/extension-2.0.jar"));
FileUtils.copyFile(extensionFile, new File(repositoryTestUtil.getRepositoryUtil().getMavenRepository(), "maven/oldextension/0.9/oldextension-0.9.jar"));
FileUtils.copyFile(extensionFile, new File(repositoryTestUtil.getRepositoryUtil().getMavenRepository(), "maven/dependency/version/dependency-version.jar"));
}
use of org.xwiki.extension.ExtensionId in project xwiki-platform by xwiki.
the class RepositoryTest method testRestAccessToImportedExtension.
private void testRestAccessToImportedExtension() throws Exception {
// 2.0
TestExtension emptyExtension = getRepositoryTestUtils().getTestExtension(new ExtensionId("emptyjar", "1.0"), "jar");
long fileSize = FileUtils.sizeOf(emptyExtension.getFile().getFile());
ExtensionVersion extension = getUtil().rest().getResource(Resources.EXTENSION_VERSION, null, "maven:extension", "2.0");
Assert.assertEquals("maven:extension", extension.getId());
Assert.assertEquals("jar", extension.getType());
Assert.assertEquals("2.0", extension.getVersion());
Assert.assertEquals("name", extension.getName());
Assert.assertEquals("summary2", extension.getSummary());
Assert.assertEquals("summary2\n some more details", extension.getDescription());
Assert.assertEquals(this.baseAuthor.getName(), extension.getAuthors().get(0).getName());
Assert.assertEquals(this.baseAuthor.getURL().toString(), extension.getAuthors().get(0).getUrl());
Assert.assertEquals(Arrays.asList("maven:oldextension", "maven:oldversionnedextension"), extension.getFeatures());
Assert.assertEquals("maven:oldextension", extension.getExtensionFeatures().get(0).getId());
Assert.assertEquals("2.0", extension.getExtensionFeatures().get(0).getVersion());
Assert.assertEquals("maven:oldversionnedextension", extension.getExtensionFeatures().get(1).getId());
Assert.assertEquals("10.0", extension.getExtensionFeatures().get(1).getVersion());
Assert.assertEquals("GNU Lesser General Public License 2.1", extension.getLicenses().get(0).getName());
Assert.assertEquals(fileSize, getUtil().rest().getBuffer(Resources.EXTENSION_VERSION_FILE, null, "maven:extension", "2.0").length);
// 1.0
extension = getUtil().rest().getResource(Resources.EXTENSION_VERSION, null, "maven:extension", "1.0");
Assert.assertEquals("maven:extension", extension.getId());
Assert.assertEquals("jar", extension.getType());
Assert.assertEquals("1.0", extension.getVersion());
Assert.assertEquals("name", extension.getName());
Assert.assertEquals("summary2", extension.getSummary());
Assert.assertEquals("summary2\n some more details", extension.getDescription());
Assert.assertEquals(this.baseAuthor.getName(), extension.getAuthors().get(0).getName());
Assert.assertEquals(this.baseAuthor.getURL().toString(), extension.getAuthors().get(0).getUrl());
Assert.assertEquals(Arrays.asList("maven:oldextension", "maven:oldversionnedextension"), extension.getFeatures());
Assert.assertEquals("maven:oldextension", extension.getExtensionFeatures().get(0).getId());
Assert.assertEquals("1.0", extension.getExtensionFeatures().get(0).getVersion());
Assert.assertEquals("maven:oldversionnedextension", extension.getExtensionFeatures().get(1).getId());
Assert.assertEquals("10.0", extension.getExtensionFeatures().get(1).getVersion());
Assert.assertEquals("GNU Lesser General Public License 2.1", extension.getLicenses().get(0).getName());
Assert.assertEquals(FileUtils.sizeOf(emptyExtension.getFile().getFile()), getUtil().rest().getBuffer(Resources.EXTENSION_VERSION_FILE, null, "maven:extension", "1.0").length);
// 0.9
extension = getUtil().rest().getResource(Resources.EXTENSION_VERSION, null, "maven:extension", "0.9");
Assert.assertEquals("maven:extension", extension.getId());
Assert.assertEquals("jar", extension.getType());
Assert.assertEquals("0.9", extension.getVersion());
Assert.assertEquals("name", extension.getName());
Assert.assertEquals("summary2", extension.getSummary());
Assert.assertEquals("summary2\n some more details", extension.getDescription());
Assert.assertEquals(this.baseAuthor.getName(), extension.getAuthors().get(0).getName());
Assert.assertEquals(this.baseAuthor.getURL().toString(), extension.getAuthors().get(0).getUrl());
Assert.assertEquals(Arrays.asList(), extension.getFeatures());
Assert.assertEquals(Arrays.asList(), extension.getExtensionFeatures());
Assert.assertEquals("GNU Lesser General Public License 2.1", extension.getLicenses().get(0).getName());
Assert.assertEquals(fileSize, getUtil().rest().getBuffer(Resources.EXTENSION_VERSION_FILE, null, "maven:extension", "0.9").length);
}
use of org.xwiki.extension.ExtensionId in project xwiki-platform by xwiki.
the class WikiCopiedEventListenerTest method setUp.
@Before
public void setUp() throws Exception {
this.localExtensionRepository = this.repositoryUtil.getComponentManager().getInstance(LocalExtensionRepository.class);
this.installedExtensionRepository = this.repositoryUtil.getComponentManager().getInstance(InstalledExtensionRepository.class);
this.observation = this.repositoryUtil.getComponentManager().getInstance(ObservationManager.class);
// Extensions
EmptyExtension extension = new EmptyExtension(new ExtensionId("id", "version"), "xar");
EmptyExtension extensionDependency = new EmptyExtension(new ExtensionId("dependency", "version"), "xar");
extension.addDependency(new DefaultExtensionDependency(extensionDependency.getId().getId(), new DefaultVersionConstraint(null, extensionDependency.getId().getVersion())));
this.localExtensionDependency1 = this.localExtensionRepository.storeExtension(extensionDependency);
this.localExtension1 = this.localExtensionRepository.storeExtension(extension);
}
use of org.xwiki.extension.ExtensionId in project xwiki-platform by xwiki.
the class XarExtensionHandlerTest method setUp.
@Before
public void setUp() throws Exception {
// mock
this.contextUser = new DocumentReference(getXWikiContext().getWikiId(), "XWiki", "ExtensionUser");
this.localXarExtensiontId1 = new ExtensionId("test", "1.0");
this.localXarExtensiontId2 = new ExtensionId("test", "2.0");
this.collisionextension1 = new ExtensionId("collisionextension1", "version");
this.collisionextension2 = new ExtensionId("collisionextension2", "version");
// classes
BaseClass styleSheetClass = new BaseClass();
this.classes.put("StyleSheetExtension", styleSheetClass);
// checking
doReturn(true).when(this.oldcore.getSpyXWiki()).hasAttachmentRecycleBin(any(XWikiContext.class));
getXWikiContext().setUserReference(this.contextUser);
((XWikiStubContextProvider) this.componentManager.getInstance(XWikiStubContextProvider.class)).initialize(getXWikiContext());
CoreConfiguration coreConfiguration = this.componentManager.getInstance(CoreConfiguration.class);
doReturn(Syntax.PLAIN_1_0).when(coreConfiguration).getDefaultDocumentSyntax();
// lookup
this.jobExecutor = this.componentManager.getInstance(JobExecutor.class);
this.xarExtensionRepository = this.componentManager.getInstance(InstalledExtensionRepository.class, XarExtensionHandler.TYPE);
this.observation = this.repositoryUtil.getComponentManager().getInstance(ObservationManager.class);
// Get rid of wiki macro listener
this.componentManager.<ObservationManager>getInstance(ObservationManager.class).removeListener("RegisterMacrosOnImportListener");
this.installedExtensionRepository = this.componentManager.getInstance(InstalledExtensionRepository.class, "xar");
// Programming right is not required for XAR extensions
doThrow(AccessDeniedException.class).when(this.oldcore.getMockAuthorizationManager()).checkAccess(eq(Right.PROGRAM), any(), any());
}
Aggregations