/* * See the NOTICE file distributed with this work for additional * information regarding copyright ownership. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.xwiki.repository.test; import java.io.File; import java.io.InputStream; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import org.xwiki.extension.Extension; import org.xwiki.extension.ExtensionAuthor; import org.xwiki.extension.ExtensionDependency; import org.xwiki.extension.ExtensionId; import org.xwiki.extension.RemoteExtension; import org.xwiki.extension.internal.converter.ExtensionIdConverter; import org.xwiki.extension.test.RepositoryUtils; import org.xwiki.model.reference.LocalDocumentReference; import org.xwiki.repository.internal.XWikiRepositoryModel; import org.xwiki.rest.model.jaxb.Objects; import org.xwiki.rest.model.jaxb.Page; import org.xwiki.test.ui.TestUtils; import static org.xwiki.test.ui.TestUtils.RestTestUtils.object; import static org.xwiki.test.ui.TestUtils.RestTestUtils.property; /** * @version $Id: 06f676b943cf3c64705be18669a9983b27f6ade9 $ * @since 4.2M1 */ public class RepositoryTestUtils { public final static String PROPERTY_KEY = "repositoryutils"; private final static String SPACENAME_EXTENSION = "Extension"; /** * @since 7.3M1 */ public static org.xwiki.rest.model.jaxb.Object extensionObject(RemoteExtension extension) { org.xwiki.rest.model.jaxb.Object extensionObject = object(XWikiRepositoryModel.EXTENSION_CLASSNAME); extensionObject.getProperties() .add(property(XWikiRepositoryModel.PROP_EXTENSION_ID, extension.getId().getId())); extensionObject.getProperties().add(property(XWikiRepositoryModel.PROP_EXTENSION_TYPE, extension.getType())); extensionObject.getProperties().add(property(XWikiRepositoryModel.PROP_EXTENSION_NAME, extension.getName())); extensionObject.getProperties() .add(property(XWikiRepositoryModel.PROP_EXTENSION_SUMMARY, extension.getSummary())); extensionObject.getProperties() .add(property(XWikiRepositoryModel.PROP_EXTENSION_RECOMMENDED, extension.isRecommended() ? 1 : 0)); if (!extension.getLicenses().isEmpty()) { extensionObject.getProperties().add(property(XWikiRepositoryModel.PROP_EXTENSION_LICENSENAME, extension.getLicenses().iterator().next().getName())); } extensionObject.getProperties().add(property(XWikiRepositoryModel.PROP_EXTENSION_FEATURES, ExtensionIdConverter.toStringList(extension.getExtensionFeatures()))); List<String> authors = new ArrayList<String>(); for (ExtensionAuthor author : extension.getAuthors()) { authors.add(author.getName()); } extensionObject.getProperties().add(property(XWikiRepositoryModel.PROP_EXTENSION_AUTHORS, authors)); extensionObject.getProperties() .add(property(XWikiRepositoryModel.PROP_EXTENSION_WEBSITE, extension.getWebSite())); if (extension.getAllowedNamespaces() != null) { extensionObject.getProperties() .add(property(XWikiRepositoryModel.PROP_EXTENSION_ALLOWEDNAMESPACES, extension.getAllowedNamespaces())); extensionObject.getProperties().add(property(XWikiRepositoryModel.PROP_EXTENSION_ALLOWEDNAMESPACES_EMPTY, extension.getAllowedNamespaces() != null && extension.getAllowedNamespaces().isEmpty() ? 1 : 0)); } if (extension.getScm() != null) { extensionObject.getProperties() .add(property(XWikiRepositoryModel.PROP_EXTENSION_SCMURL, extension.getScm().getUrl())); } return extensionObject; } /** * @since 7.3M1 */ public static org.xwiki.rest.model.jaxb.Object extensionVersionObject(Extension extension) { org.xwiki.rest.model.jaxb.Object extensionVersionObject = extensionVersionObject(extension.getId().getVersion(), null, XWikiRepositoryModel.toStringList(extension.getRepositories())); extensionVersionObject.getProperties().add(property(XWikiRepositoryModel.PROP_VERSION_FEATURES, ExtensionIdConverter.toStringList(extension.getExtensionFeatures()))); return extensionVersionObject; } /** * @since 7.3M1 */ public static org.xwiki.rest.model.jaxb.Object extensionVersionObject(Object version, Object download, Object repositories) { org.xwiki.rest.model.jaxb.Object versionObject = object(XWikiRepositoryModel.EXTENSIONVERSION_CLASSNAME); if (version != null) { versionObject.getProperties().add(property(XWikiRepositoryModel.PROP_VERSION_VERSION, version)); } if (download != null) { versionObject.getProperties().add(property(XWikiRepositoryModel.PROP_VERSION_DOWNLOAD, download)); } if (repositories != null) { versionObject.getProperties().add(property(XWikiRepositoryModel.PROP_VERSION_REPOSITORIES, repositories)); } return versionObject; } /** * @since 7.3M1 */ public static List<org.xwiki.rest.model.jaxb.Object> extensionDependencyObjects(Extension extension) { List<org.xwiki.rest.model.jaxb.Object> dependencies = new ArrayList<>(extension.getDependencies().size()); int number = 0; for (ExtensionDependency dependency : extension.getDependencies()) { org.xwiki.rest.model.jaxb.Object dependencyObject = extensionDependencyObject(extension.getId().getVersion(), dependency); dependencyObject.setNumber(number++); dependencies.add(dependencyObject); } return dependencies; } /** * @since 7.3M1 */ public static org.xwiki.rest.model.jaxb.Object extensionDependencyObject(Object version, ExtensionDependency dependency) { org.xwiki.rest.model.jaxb.Object dependencyObject = object(XWikiRepositoryModel.EXTENSIONDEPENDENCY_CLASSNAME); dependencyObject.getProperties() .add(property(XWikiRepositoryModel.PROP_DEPENDENCY_CONSTRAINT, dependency.getVersionConstraint())); dependencyObject.getProperties().add(property(XWikiRepositoryModel.PROP_DEPENDENCY_EXTENSIONVERSION, version)); dependencyObject.getProperties().add(property(XWikiRepositoryModel.PROP_DEPENDENCY_ID, dependency.getId())); return dependencyObject; } private final TestUtils testUtils; private RepositoryUtils repositoryUtil; private SolrTestUtils solrUtils; public RepositoryTestUtils(TestUtils testUtils, RepositoryUtils repositoryUtil, SolrTestUtils solrUtils) { this.testUtils = testUtils; this.repositoryUtil = repositoryUtil != null ? repositoryUtil : new RepositoryUtils(); this.solrUtils = solrUtils; } public RepositoryUtils getRepositoryUtil() { return this.repositoryUtil; } // Test init public void init() throws Exception { // Initialize extensions and repositories this.repositoryUtil.setup(); } // Test utils public TestExtension getTestExtension(ExtensionId id, String type) { File extensionFile = this.repositoryUtil.getExtensionPackager().getExtensionFile(id); return extensionFile != null ? new TestExtension(id, type, extensionFile) : null; } private LocalDocumentReference getExtensionPageReference(Extension extension) { String extensionName = extension.getName() != null ? extension.getName() : extension.getId().getId(); return getExtensionPageReference(extensionName); } /** * @since 7.3M2 */ private LocalDocumentReference getExtensionPageReference(String extensionName) { return new LocalDocumentReference(Arrays.asList(SPACENAME_EXTENSION, extensionName), "WebHome"); } public void deleteExtension(Extension extension) throws Exception { this.testUtils.rest().delete(getExtensionPageReference(extension)); } /** * @since 7.3M2 */ public void deleteExtension(String extensionName) throws Exception { this.testUtils.rest().delete(getExtensionPageReference(extensionName)); } public void addExtension(RemoteExtension extension) throws Exception { // Delete any pre existing extension this.testUtils.rest().delete(getExtensionPageReference(extension)); // Create Page Page extensionPage = this.testUtils.rest().page(getExtensionPageReference(extension)); extensionPage.setObjects(new Objects()); // Add extension object extensionPage.getObjects().getObjectSummaries().add(extensionObject(extension)); // Add the ExtensionVersion object extensionPage.getObjects().getObjectSummaries().add(extensionVersionObject(extension)); // Add the ExtensionDependency objects extensionPage.getObjects().getObjectSummaries().addAll(extensionDependencyObjects(extension)); // Save the extension page this.testUtils.rest().save(extensionPage, TestUtils.STATUS_CREATED); // Attach the extension file attachFile(extension); } public void addVersionObject(Extension extension) { addVersionObject(extension, extension.getId().getVersion(), null); } public void addVersionObject(Extension extension, Object version, Object download) { Map<String, Object> queryParameters = new HashMap<String, Object>(); if (version != null) { queryParameters.put(XWikiRepositoryModel.PROP_VERSION_VERSION, version); } if (download != null) { queryParameters.put(XWikiRepositoryModel.PROP_VERSION_DOWNLOAD, download); } this.testUtils.addObject(getExtensionPageReference(extension), XWikiRepositoryModel.EXTENSIONVERSION_CLASSNAME, queryParameters); } public void addDependencies(Extension extension) { addDependencies(extension, extension.getId().getVersion()); } public void addDependencies(Extension extension, Object version) { for (ExtensionDependency dependency : extension.getDependencies()) { addDependency(extension, version, dependency); } } public void addDependency(Extension extension, ExtensionDependency dependency) { addDependency(extension, extension.getId().getVersion(), dependency); } public void addDependency(Extension extension, Object version, ExtensionDependency dependency) { this.testUtils.addObject(getExtensionPageReference(extension), XWikiRepositoryModel.EXTENSIONDEPENDENCY_CLASSNAME, XWikiRepositoryModel.PROP_DEPENDENCY_CONSTRAINT, dependency.getVersionConstraint(), XWikiRepositoryModel.PROP_DEPENDENCY_ID, dependency.getId(), XWikiRepositoryModel.PROP_DEPENDENCY_EXTENSIONVERSION, version); } public void attachFile(Extension extension) throws Exception { InputStream is = extension.getFile().openStream(); try { this.testUtils.attachFile(getExtensionPageReference(extension), extension.getId().getId() + "-" + extension.getId().getVersion() + "." + extension.getType(), is, true); } finally { is.close(); } } /** * Make sure any change done in extension has been taken into account by Solr. */ public void waitUntilReady() throws Exception { // Make sure Solr queue is empty this.solrUtils.waitEmpyQueue(); } }