mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-08-14 17:58:59 +00:00
REPO-1394: Discovery: merge back to 5.2.N (from feature branch)
Merged WEBAPP-API (5.2.1) to 5.2.N (5.2.1) 130980 jkaabimofrad: REPO-224: API for retrieving detailed repository information. Merged WEBAPP-API (5.2.1) to 5.2.N (5.2.1) 131056 jkaabimofrad: REPO-224: Removed "transformationServerExpiresAt" attribute from the license JSON response as it is not part of AC. Merged WEBAPP-API (5.2.1) to 5.2.N (5.2.1) 131179 jkaabimofrad: REPO-224: Modified the license's entitlement response to always return "isClusterEnabled" and "isCryptodocEnabled". git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/BRANCHES/DEV/5.2.N/root@131344 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
@@ -861,6 +861,16 @@
|
||||
<property name="nodes" ref="Nodes" />
|
||||
</bean>
|
||||
|
||||
<bean id="webscript.org.alfresco.api.DiscoveryApiWebscript.get"
|
||||
class="org.alfresco.rest.api.discovery.DiscoveryApiWebscript" parent="webscript">
|
||||
<property name="descriptorService" ref="DescriptorService" />
|
||||
<property name="repoAdminService" ref="repoAdminService" />
|
||||
<property name="auditService" ref="auditService" />
|
||||
<property name="quickShareService" ref="QuickShareService" />
|
||||
<property name="moduleService" ref="ModuleService" />
|
||||
<property name="assistant" ref="apiAssistant" />
|
||||
</bean>
|
||||
|
||||
<!-- OpenCMIS -->
|
||||
|
||||
<bean id="publicApiCMISServiceFactory" class="org.alfresco.opencmis.PublicApiAlfrescoCmisServiceFactory" init-method="init">
|
||||
|
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<webscript>
|
||||
<shortname>Handles GET for the Discovery api</shortname>
|
||||
<description>Returns repository information</description>
|
||||
<url>/discovery</url>
|
||||
<authentication>user</authentication>
|
||||
<transaction>required</transaction>
|
||||
<format default="json">argument</format>
|
||||
<lifecycle>public_api</lifecycle>
|
||||
</webscript>
|
@@ -54,6 +54,13 @@ public class PublicApiTenantWebScriptServletRequest extends TenantWebScriptServl
|
||||
tenant = TenantUtil.DEFAULT_TENANT;
|
||||
pathInfo = NETWORKS_PATH;
|
||||
}
|
||||
else if (realPathInfo.equals("/discovery"))
|
||||
{
|
||||
// The '/discovery' API is special and doesn't need network info, however,
|
||||
// we set the tenant to default, to satisfy PublicApiTenantAuthentication logic.
|
||||
tenant = TenantUtil.DEFAULT_TENANT;
|
||||
pathInfo = realPathInfo;
|
||||
}
|
||||
else
|
||||
{
|
||||
// optimisation - don't need to lowercase the whole path
|
||||
|
@@ -86,7 +86,7 @@ public class PublicApiTenantWebScriptServletRuntime extends TenantWebScriptServl
|
||||
}
|
||||
else
|
||||
{
|
||||
if(!pathInfo.substring(0, 6).toLowerCase().equals("/cmis/"))
|
||||
if(!pathInfo.substring(0, 6).toLowerCase().equals("/cmis/") && !pathInfo.equals("/discovery"))
|
||||
{
|
||||
// remove tenant
|
||||
int idx = pathInfo.indexOf('/', 1);
|
||||
|
@@ -0,0 +1,168 @@
|
||||
/*
|
||||
* #%L
|
||||
* Alfresco Remote API
|
||||
* %%
|
||||
* Copyright (C) 2005 - 2016 Alfresco Software Limited
|
||||
* %%
|
||||
* This file is part of the Alfresco software.
|
||||
* If the software was purchased under a paid Alfresco license, the terms of
|
||||
* the paid license agreement will prevail. Otherwise, the software is
|
||||
* provided under the following open source license terms:
|
||||
*
|
||||
* Alfresco 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Alfresco 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 Alfresco. If not, see <http://www.gnu.org/licenses/>.
|
||||
* #L%
|
||||
*/
|
||||
package org.alfresco.rest.api.discovery;
|
||||
|
||||
import org.alfresco.rest.api.model.DiscoveryDetails;
|
||||
import org.alfresco.rest.api.model.ModulePackage;
|
||||
import org.alfresco.rest.api.model.RepositoryInfo;
|
||||
import org.alfresco.rest.api.model.RepositoryInfo.LicenseInfo;
|
||||
import org.alfresco.rest.api.model.RepositoryInfo.StatusInfo;
|
||||
import org.alfresco.rest.api.model.RepositoryInfo.VersionInfo;
|
||||
import org.alfresco.rest.framework.jacksonextensions.JacksonHelper;
|
||||
import org.alfresco.rest.framework.tools.ApiAssistant;
|
||||
import org.alfresco.rest.framework.tools.RecognizedParamsExtractor;
|
||||
import org.alfresco.rest.framework.tools.ResponseWriter;
|
||||
import org.alfresco.service.cmr.admin.RepoAdminService;
|
||||
import org.alfresco.service.cmr.audit.AuditService;
|
||||
import org.alfresco.service.cmr.module.ModuleDetails;
|
||||
import org.alfresco.service.cmr.module.ModuleService;
|
||||
import org.alfresco.service.cmr.quickshare.QuickShareService;
|
||||
import org.alfresco.service.descriptor.Descriptor;
|
||||
import org.alfresco.service.descriptor.DescriptorService;
|
||||
import org.alfresco.util.PropertyCheck;
|
||||
import org.json.simple.JSONObject;
|
||||
import org.springframework.beans.factory.InitializingBean;
|
||||
import org.springframework.extensions.webscripts.AbstractWebScript;
|
||||
import org.springframework.extensions.webscripts.WebScriptRequest;
|
||||
import org.springframework.extensions.webscripts.WebScriptResponse;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author Jamal Kaabi-Mofrad
|
||||
*/
|
||||
public class DiscoveryApiWebscript extends AbstractWebScript implements RecognizedParamsExtractor, ResponseWriter, InitializingBean
|
||||
{
|
||||
private DescriptorService descriptorService;
|
||||
private RepoAdminService repoAdminService;
|
||||
private AuditService auditService;
|
||||
private QuickShareService quickShareService;
|
||||
private ModuleService moduleService;
|
||||
private ApiAssistant assistant;
|
||||
|
||||
public void setDescriptorService(DescriptorService descriptorService)
|
||||
{
|
||||
this.descriptorService = descriptorService;
|
||||
}
|
||||
|
||||
public void setRepoAdminService(RepoAdminService repoAdminService)
|
||||
{
|
||||
this.repoAdminService = repoAdminService;
|
||||
}
|
||||
|
||||
public void setAuditService(AuditService auditService)
|
||||
{
|
||||
this.auditService = auditService;
|
||||
}
|
||||
|
||||
public void setQuickShareService(QuickShareService quickShareService)
|
||||
{
|
||||
this.quickShareService = quickShareService;
|
||||
}
|
||||
|
||||
public void setModuleService(ModuleService moduleService)
|
||||
{
|
||||
this.moduleService = moduleService;
|
||||
}
|
||||
|
||||
public void setAssistant(ApiAssistant assistant)
|
||||
{
|
||||
this.assistant = assistant;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterPropertiesSet() throws Exception
|
||||
{
|
||||
PropertyCheck.mandatory(this, "descriptorService", descriptorService);
|
||||
PropertyCheck.mandatory(this, "repoAdminService", repoAdminService);
|
||||
PropertyCheck.mandatory(this, "auditService", auditService);
|
||||
PropertyCheck.mandatory(this, "quickShareService", quickShareService);
|
||||
PropertyCheck.mandatory(this, "moduleService", moduleService);
|
||||
PropertyCheck.mandatory(this, "assistant", assistant);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(WebScriptRequest webScriptRequest, WebScriptResponse webScriptResponse) throws IOException
|
||||
{
|
||||
try
|
||||
{
|
||||
DiscoveryDetails discoveryDetails = new DiscoveryDetails(getRepositoryInfo());
|
||||
// Write response
|
||||
setResponse(webScriptResponse, DEFAULT_SUCCESS);
|
||||
renderJsonResponse(webScriptResponse, discoveryDetails, assistant.getJsonHelper());
|
||||
}
|
||||
catch (Exception exception)
|
||||
{
|
||||
renderException(exception, webScriptResponse, assistant);
|
||||
}
|
||||
}
|
||||
|
||||
protected RepositoryInfo getRepositoryInfo()
|
||||
{
|
||||
LicenseInfo licenseInfo = null;
|
||||
if(descriptorService.getLicenseDescriptor() != null)
|
||||
{
|
||||
licenseInfo = new LicenseInfo(descriptorService.getLicenseDescriptor());
|
||||
}
|
||||
Descriptor serverDescriptor = descriptorService.getServerDescriptor();
|
||||
return new RepositoryInfo()
|
||||
.setEdition(serverDescriptor.getEdition())
|
||||
.setVersion(new VersionInfo(serverDescriptor))
|
||||
.setLicense(licenseInfo)
|
||||
.setModules(getModules())
|
||||
.setStatus(new StatusInfo()
|
||||
.setReadOnly(repoAdminService.getUsage().isReadOnly())
|
||||
.setAuditEnabled(auditService.isAuditEnabled())
|
||||
.setQuickShareEnabled(quickShareService.isQuickShareEnabled()));
|
||||
}
|
||||
|
||||
private List<ModulePackage> getModules()
|
||||
{
|
||||
List<ModuleDetails> details = moduleService.getAllModules();
|
||||
if (details.isEmpty())
|
||||
{
|
||||
return null;
|
||||
}
|
||||
List<ModulePackage> packages = new ArrayList<>(details.size());
|
||||
for (ModuleDetails detail : details)
|
||||
{
|
||||
packages.add(ModulePackage.fromModuleDetails(detail));
|
||||
}
|
||||
return packages;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void renderJsonResponse(final WebScriptResponse res, final Object toSerialize, final JacksonHelper jsonHelper) throws IOException
|
||||
{
|
||||
jsonHelper.withWriter(res.getOutputStream(), (generator, objectMapper) -> {
|
||||
JSONObject obj = new JSONObject();
|
||||
obj.put("entry", toSerialize);
|
||||
objectMapper.writeValue(generator, obj);
|
||||
});
|
||||
}
|
||||
}
|
@@ -0,0 +1,65 @@
|
||||
/*
|
||||
* #%L
|
||||
* Alfresco Remote API
|
||||
* %%
|
||||
* Copyright (C) 2005 - 2016 Alfresco Software Limited
|
||||
* %%
|
||||
* This file is part of the Alfresco software.
|
||||
* If the software was purchased under a paid Alfresco license, the terms of
|
||||
* the paid license agreement will prevail. Otherwise, the software is
|
||||
* provided under the following open source license terms:
|
||||
*
|
||||
* Alfresco 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Alfresco 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 Alfresco. If not, see <http://www.gnu.org/licenses/>.
|
||||
* #L%
|
||||
*/
|
||||
package org.alfresco.rest.api.model;
|
||||
|
||||
/**
|
||||
* Representation of the discovery information
|
||||
*
|
||||
* @author Jamal Kaabi-Mofrad
|
||||
*/
|
||||
public class DiscoveryDetails
|
||||
{
|
||||
private RepositoryInfo repository;
|
||||
|
||||
public DiscoveryDetails()
|
||||
{
|
||||
}
|
||||
|
||||
public DiscoveryDetails(RepositoryInfo repository)
|
||||
{
|
||||
this.repository = repository;
|
||||
}
|
||||
|
||||
public RepositoryInfo getRepository()
|
||||
{
|
||||
return repository;
|
||||
}
|
||||
|
||||
public DiscoveryDetails setRepository(RepositoryInfo repository)
|
||||
{
|
||||
this.repository = repository;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
sb.append("DiscoveryDetails [repository=").append(repository)
|
||||
.append(']');
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
455
source/java/org/alfresco/rest/api/model/RepositoryInfo.java
Normal file
455
source/java/org/alfresco/rest/api/model/RepositoryInfo.java
Normal file
@@ -0,0 +1,455 @@
|
||||
/*
|
||||
* #%L
|
||||
* Alfresco Remote API
|
||||
* %%
|
||||
* Copyright (C) 2005 - 2016 Alfresco Software Limited
|
||||
* %%
|
||||
* This file is part of the Alfresco software.
|
||||
* If the software was purchased under a paid Alfresco license, the terms of
|
||||
* the paid license agreement will prevail. Otherwise, the software is
|
||||
* provided under the following open source license terms:
|
||||
*
|
||||
* Alfresco 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Alfresco 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 Alfresco. If not, see <http://www.gnu.org/licenses/>.
|
||||
* #L%
|
||||
*/
|
||||
package org.alfresco.rest.api.model;
|
||||
|
||||
import org.alfresco.service.descriptor.Descriptor;
|
||||
import org.alfresco.service.license.LicenseDescriptor;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* Representation of the repository information.
|
||||
*
|
||||
* @author Jamal Kaabi-Mofrad
|
||||
*/
|
||||
public class RepositoryInfo
|
||||
{
|
||||
private String edition;
|
||||
private VersionInfo version;
|
||||
private LicenseInfo license;
|
||||
private StatusInfo status;
|
||||
private List<ModulePackage> modules;
|
||||
|
||||
public String getEdition()
|
||||
{
|
||||
return edition;
|
||||
}
|
||||
|
||||
public RepositoryInfo setEdition(String edition)
|
||||
{
|
||||
this.edition = edition;
|
||||
return this;
|
||||
}
|
||||
|
||||
public VersionInfo getVersion()
|
||||
{
|
||||
return version;
|
||||
}
|
||||
|
||||
public RepositoryInfo setVersion(VersionInfo version)
|
||||
{
|
||||
this.version = version;
|
||||
return this;
|
||||
}
|
||||
|
||||
public LicenseInfo getLicense()
|
||||
{
|
||||
return license;
|
||||
}
|
||||
|
||||
public RepositoryInfo setLicense(LicenseInfo license)
|
||||
{
|
||||
this.license = license;
|
||||
return this;
|
||||
}
|
||||
|
||||
public StatusInfo getStatus()
|
||||
{
|
||||
return status;
|
||||
}
|
||||
|
||||
public RepositoryInfo setStatus(StatusInfo status)
|
||||
{
|
||||
this.status = status;
|
||||
return this;
|
||||
}
|
||||
|
||||
public List<ModulePackage> getModules()
|
||||
{
|
||||
return modules;
|
||||
}
|
||||
|
||||
public RepositoryInfo setModules(List<ModulePackage> modules)
|
||||
{
|
||||
this.modules = modules;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
final StringBuilder sb = new StringBuilder(450);
|
||||
sb.append("RepositoryInfo [edition=").append(edition)
|
||||
.append(", version=").append(version)
|
||||
.append(", license=").append(license)
|
||||
.append(", status=").append(status)
|
||||
.append(", modules=").append(modules)
|
||||
.append(']');
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Representation of the repository version information.
|
||||
*
|
||||
* @author Jamal Kaabi-Mofrad
|
||||
*/
|
||||
public static class VersionInfo
|
||||
{
|
||||
private static final Pattern HOTFIX_PATTERN = Pattern.compile("^[0-9]+$");
|
||||
private String major;
|
||||
private String minor;
|
||||
private String patch;
|
||||
private String hotfix;
|
||||
private int schema;
|
||||
private String label;
|
||||
private String display;
|
||||
|
||||
// Default constructor required for test purposes
|
||||
public VersionInfo()
|
||||
{
|
||||
}
|
||||
|
||||
public VersionInfo(Descriptor descriptor)
|
||||
{
|
||||
this.major = descriptor.getVersionMajor();
|
||||
this.minor = descriptor.getVersionMinor();
|
||||
this.patch = descriptor.getVersionRevision();
|
||||
this.hotfix = getHotfix(descriptor.getVersionLabel());
|
||||
this.schema = descriptor.getSchema();
|
||||
this.label = descriptor.getVersionBuild();
|
||||
this.display = getVersionDisplay();
|
||||
}
|
||||
|
||||
public String getMajor()
|
||||
{
|
||||
return major;
|
||||
}
|
||||
|
||||
public String getMinor()
|
||||
{
|
||||
return minor;
|
||||
}
|
||||
|
||||
public String getPatch()
|
||||
{
|
||||
return patch;
|
||||
}
|
||||
|
||||
public String getHotfix()
|
||||
{
|
||||
return hotfix;
|
||||
}
|
||||
|
||||
public int getSchema()
|
||||
{
|
||||
return schema;
|
||||
}
|
||||
|
||||
public String getLabel()
|
||||
{
|
||||
return label;
|
||||
}
|
||||
|
||||
public String getDisplay()
|
||||
{
|
||||
return display;
|
||||
}
|
||||
|
||||
private String getHotfix(String versionLabel)
|
||||
{
|
||||
/*
|
||||
* if the label starts with a dot, then digit(s), or just digit(s), we return the number only.
|
||||
* for anything else zero will be returned.
|
||||
*/
|
||||
if (StringUtils.isNotEmpty(versionLabel))
|
||||
{
|
||||
if (versionLabel.startsWith("."))
|
||||
{
|
||||
versionLabel = versionLabel.substring(1);
|
||||
}
|
||||
Matcher matcher = HOTFIX_PATTERN.matcher(versionLabel);
|
||||
if (matcher.find())
|
||||
{
|
||||
return versionLabel;
|
||||
}
|
||||
}
|
||||
return Integer.toString(0);
|
||||
}
|
||||
|
||||
private String getVersionDisplay()
|
||||
{
|
||||
StringBuilder version = new StringBuilder(major);
|
||||
version.append('.')
|
||||
.append(minor)
|
||||
.append('.')
|
||||
.append(patch)
|
||||
.append('.')
|
||||
.append(getHotfix());
|
||||
|
||||
if (StringUtils.isNotEmpty(label))
|
||||
{
|
||||
version.append(" (").append(label).append(") ");
|
||||
}
|
||||
version.append("schema ").append(schema);
|
||||
|
||||
// Display example: "5.2.0.1 (r123456-b0) schema 10001"
|
||||
return version.toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
final StringBuilder sb = new StringBuilder(250);
|
||||
sb.append("VersionInfo [major=").append(major)
|
||||
.append(", minor=").append(minor)
|
||||
.append(", patch=").append(patch)
|
||||
.append(", hotfix=").append(hotfix)
|
||||
.append(", schema=").append(schema)
|
||||
.append(", label=").append(label)
|
||||
.append(", display=").append(display)
|
||||
.append(']');
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Representation of the license information.
|
||||
*
|
||||
* @author Jamal Kaabi-Mofrad
|
||||
*/
|
||||
public static class LicenseInfo
|
||||
{
|
||||
private Date issuedAt;
|
||||
private Date expiresAt;
|
||||
private Integer remainingDays;
|
||||
private String holder;
|
||||
private String mode;
|
||||
private LicenseEntitlement entitlements;
|
||||
|
||||
// Default constructor required for test purposes
|
||||
public LicenseInfo()
|
||||
{
|
||||
}
|
||||
|
||||
public LicenseInfo(LicenseDescriptor licenseDescriptor)
|
||||
{
|
||||
this.issuedAt = licenseDescriptor.getIssued();
|
||||
this.expiresAt = licenseDescriptor.getValidUntil();
|
||||
this.remainingDays = licenseDescriptor.getRemainingDays();
|
||||
this.holder = licenseDescriptor.getHolderOrganisation();
|
||||
this.mode = licenseDescriptor.getLicenseMode().name();
|
||||
this.entitlements = new LicenseEntitlement()
|
||||
.setMaxDocs(licenseDescriptor.getMaxDocs())
|
||||
.setMaxUsers(licenseDescriptor.getMaxUsers())
|
||||
.setClusterEnabled(licenseDescriptor.isClusterEnabled())
|
||||
.setCryptodocEnabled(licenseDescriptor.isCryptodocEnabled());
|
||||
}
|
||||
|
||||
public Date getIssuedAt()
|
||||
{
|
||||
return issuedAt;
|
||||
}
|
||||
|
||||
public Date getExpiresAt()
|
||||
{
|
||||
return expiresAt;
|
||||
}
|
||||
|
||||
public Integer getRemainingDays()
|
||||
{
|
||||
return remainingDays;
|
||||
}
|
||||
|
||||
public String getHolder()
|
||||
{
|
||||
return holder;
|
||||
}
|
||||
|
||||
public String getMode()
|
||||
{
|
||||
return mode;
|
||||
}
|
||||
|
||||
public LicenseEntitlement getEntitlements()
|
||||
{
|
||||
return entitlements;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
final StringBuilder sb = new StringBuilder(250);
|
||||
sb.append("LicenseInfo [issuedAt=").append(issuedAt)
|
||||
.append(", expiresAt=").append(expiresAt)
|
||||
.append(", remainingDays=").append(remainingDays)
|
||||
.append(", holder=").append(holder)
|
||||
.append(", mode=").append(mode)
|
||||
.append(", entitlements=").append(entitlements)
|
||||
.append(']');
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Representation of the license's entitlement.
|
||||
*
|
||||
* @author Jamal Kaabi-Mofrad
|
||||
*/
|
||||
public static class LicenseEntitlement
|
||||
{
|
||||
private Long maxUsers;
|
||||
private Long maxDocs;
|
||||
private boolean isClusterEnabled;
|
||||
private boolean isCryptodocEnabled;
|
||||
|
||||
public LicenseEntitlement()
|
||||
{
|
||||
}
|
||||
|
||||
public Long getMaxUsers()
|
||||
{
|
||||
return maxUsers;
|
||||
}
|
||||
|
||||
public LicenseEntitlement setMaxUsers(Long maxUsers)
|
||||
{
|
||||
this.maxUsers = maxUsers;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Long getMaxDocs()
|
||||
{
|
||||
return maxDocs;
|
||||
}
|
||||
|
||||
public LicenseEntitlement setMaxDocs(Long maxDocs)
|
||||
{
|
||||
this.maxDocs = maxDocs;
|
||||
return this;
|
||||
}
|
||||
|
||||
public boolean getIsClusterEnabled()
|
||||
{
|
||||
return isClusterEnabled;
|
||||
}
|
||||
|
||||
public LicenseEntitlement setClusterEnabled(boolean clusterEnabled)
|
||||
{
|
||||
isClusterEnabled = clusterEnabled;
|
||||
return this;
|
||||
}
|
||||
|
||||
public boolean getIsCryptodocEnabled()
|
||||
{
|
||||
return isCryptodocEnabled;
|
||||
}
|
||||
|
||||
public LicenseEntitlement setCryptodocEnabled(boolean cryptodocEnabled)
|
||||
{
|
||||
isCryptodocEnabled = cryptodocEnabled;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
final StringBuilder sb = new StringBuilder(100);
|
||||
sb.append("LicenseEntitlement [maxUsers=").append(maxUsers)
|
||||
.append(", maxDocs=").append(maxDocs)
|
||||
.append(", isClusterEnabled=").append(isClusterEnabled)
|
||||
.append(", isCryptodocEnabled=").append(isCryptodocEnabled)
|
||||
.append(']');
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Representation of the repository status information.
|
||||
*
|
||||
* @author Jamal Kaabi-Mofrad
|
||||
*/
|
||||
public static class StatusInfo
|
||||
{
|
||||
private boolean isReadOnly;
|
||||
private boolean isAuditEnabled;
|
||||
private boolean isQuickShareEnabled;
|
||||
|
||||
public StatusInfo()
|
||||
{
|
||||
}
|
||||
|
||||
public boolean getIsReadOnly()
|
||||
{
|
||||
return isReadOnly;
|
||||
}
|
||||
|
||||
public StatusInfo setReadOnly(boolean readOnly)
|
||||
{
|
||||
isReadOnly = readOnly;
|
||||
return this;
|
||||
}
|
||||
|
||||
public boolean getIsAuditEnabled()
|
||||
{
|
||||
return isAuditEnabled;
|
||||
}
|
||||
|
||||
public StatusInfo setAuditEnabled(boolean auditEnabled)
|
||||
{
|
||||
isAuditEnabled = auditEnabled;
|
||||
return this;
|
||||
}
|
||||
|
||||
public boolean getIsQuickShareEnabled()
|
||||
{
|
||||
return isQuickShareEnabled;
|
||||
}
|
||||
|
||||
public StatusInfo setQuickShareEnabled(boolean quickShareEnabled)
|
||||
{
|
||||
isQuickShareEnabled = quickShareEnabled;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
final StringBuilder sb = new StringBuilder(250);
|
||||
sb.append("StatusInfo [isReadOnly=").append(isReadOnly)
|
||||
.append(", isAuditEnabled=").append(isAuditEnabled)
|
||||
.append(", isQuickShareEnabled=").append(isQuickShareEnabled)
|
||||
.append(']');
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
||||
}
|
@@ -328,6 +328,14 @@ public abstract class AbstractBaseApiTest extends EnterpriseTestApi
|
||||
return getSingle(url, entityId, null, expectedStatus);
|
||||
}
|
||||
|
||||
public HttpResponse get(String url, Map<String, String> params, int expectedStatus) throws IOException
|
||||
{
|
||||
HttpResponse response = publicApiClient.get(url, params);
|
||||
checkStatus(expectedStatus, response.getStatusCode());
|
||||
|
||||
return response;
|
||||
}
|
||||
|
||||
protected HttpResponse getSingle(String url, String entityId, Map<String, String> params, int expectedStatus) throws Exception
|
||||
{
|
||||
HttpResponse response = publicApiClient.get(getScope(), url, entityId, null, null, params);
|
||||
|
@@ -57,6 +57,7 @@ import org.junit.runners.Suite;
|
||||
AuthenticationsTest.class,
|
||||
ModulePackagesApiTest.class,
|
||||
WherePredicateApiTest.class,
|
||||
DiscoveryApiTest.class,
|
||||
TestSites.class,
|
||||
TestNodeComments.class,
|
||||
TestFavouriteSites.class,
|
||||
|
@@ -0,0 +1,315 @@
|
||||
/*
|
||||
* #%L
|
||||
* Alfresco Remote API
|
||||
* %%
|
||||
* Copyright (C) 2005 - 2016 Alfresco Software Limited
|
||||
* %%
|
||||
* This file is part of the Alfresco software.
|
||||
* If the software was purchased under a paid Alfresco license, the terms of
|
||||
* the paid license agreement will prevail. Otherwise, the software is
|
||||
* provided under the following open source license terms:
|
||||
*
|
||||
* Alfresco 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Alfresco 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 Alfresco. If not, see <http://www.gnu.org/licenses/>.
|
||||
* #L%
|
||||
*/
|
||||
package org.alfresco.rest.api.tests;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.assertNull;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.when;
|
||||
import org.alfresco.rest.AbstractSingleNetworkSiteTest;
|
||||
import org.alfresco.rest.api.discovery.DiscoveryApiWebscript;
|
||||
import org.alfresco.rest.api.model.DiscoveryDetails;
|
||||
import org.alfresco.rest.api.model.ModulePackage;
|
||||
import org.alfresco.rest.api.model.RepositoryInfo;
|
||||
import org.alfresco.rest.api.model.RepositoryInfo.LicenseEntitlement;
|
||||
import org.alfresco.rest.api.model.RepositoryInfo.LicenseInfo;
|
||||
import org.alfresco.rest.api.model.RepositoryInfo.StatusInfo;
|
||||
import org.alfresco.rest.api.model.RepositoryInfo.VersionInfo;
|
||||
import org.alfresco.rest.api.tests.client.HttpResponse;
|
||||
import org.alfresco.rest.api.tests.util.RestApiUtil;
|
||||
import org.alfresco.service.cmr.admin.RepoUsage.LicenseMode;
|
||||
import org.alfresco.service.descriptor.Descriptor;
|
||||
import org.alfresco.service.descriptor.DescriptorService;
|
||||
import org.alfresco.service.license.LicenseDescriptor;
|
||||
import org.joda.time.DateTime;
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.mockito.Mock;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* V1 REST API tests for retrieving detailed repository information.
|
||||
* <ul>
|
||||
* <li> {@literal <host>:<port>/alfresco/api/discovery} </li>
|
||||
* </ul>
|
||||
*
|
||||
* @author Jamal Kaabi-Mofrad
|
||||
*/
|
||||
public class DiscoveryApiTest extends AbstractSingleNetworkSiteTest
|
||||
{
|
||||
|
||||
private static final DateTime NOW = DateTime.now();
|
||||
|
||||
@Mock
|
||||
private DescriptorService descriptorServiceMock;
|
||||
@Mock
|
||||
private Descriptor serverDescriptor;
|
||||
@Mock
|
||||
private LicenseDescriptor licenseDescriptorMock;
|
||||
|
||||
private Date licenseIssuedAt;
|
||||
private Date licenseExpiresAt;
|
||||
|
||||
@Before
|
||||
public void setup() throws Exception
|
||||
{
|
||||
super.setup();
|
||||
|
||||
this.licenseIssuedAt = NOW.toDate();
|
||||
this.licenseExpiresAt = NOW.plusDays(5).toDate();
|
||||
|
||||
// Mock the required descriptors
|
||||
this.descriptorServiceMock = mock(DescriptorService.class);
|
||||
this.serverDescriptor = mock(Descriptor.class);
|
||||
this.licenseDescriptorMock = mock(LicenseDescriptor.class);
|
||||
|
||||
when(descriptorServiceMock.getServerDescriptor()).thenReturn(serverDescriptor);
|
||||
when(serverDescriptor.getEdition()).thenReturn("Enterprise");
|
||||
when(serverDescriptor.getVersionMajor()).thenReturn("5");
|
||||
when(serverDescriptor.getVersionMinor()).thenReturn("2");
|
||||
when(serverDescriptor.getVersionRevision()).thenReturn("1");
|
||||
when(serverDescriptor.getVersionLabel()).thenReturn(".3");
|
||||
when(serverDescriptor.getVersionBuild()).thenReturn("r123456-b0");
|
||||
when(serverDescriptor.getSchema()).thenReturn(10051);
|
||||
|
||||
when(descriptorServiceMock.getLicenseDescriptor()).thenReturn(licenseDescriptorMock);
|
||||
when(licenseDescriptorMock.getIssued()).thenReturn(this.licenseIssuedAt);
|
||||
when(licenseDescriptorMock.getValidUntil()).thenReturn(this.licenseExpiresAt);
|
||||
when(licenseDescriptorMock.getRemainingDays()).thenReturn(5);
|
||||
when(licenseDescriptorMock.getLicenseMode()).thenReturn(LicenseMode.ENTERPRISE);
|
||||
when(licenseDescriptorMock.getHolderOrganisation()).thenReturn("Alfresco Dev Test");
|
||||
when(licenseDescriptorMock.getMaxUsers()).thenReturn(20L);
|
||||
when(licenseDescriptorMock.getMaxDocs()).thenReturn(1000L);
|
||||
when(licenseDescriptorMock.isClusterEnabled()).thenReturn(true);
|
||||
|
||||
// Override the descriptor service
|
||||
DiscoveryApiWebscript discoveryApiWebscript = applicationContext
|
||||
.getBean("webscript.org.alfresco.api.DiscoveryApiWebscript.get", DiscoveryApiWebscript.class);
|
||||
discoveryApiWebscript.setDescriptorService(descriptorServiceMock);
|
||||
}
|
||||
|
||||
@After
|
||||
public void tearDown() throws Exception
|
||||
{
|
||||
super.tearDown();
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests get discovery.
|
||||
* <p>GET:</p>
|
||||
* {@literal <host>:<port>/alfresco/api/discovery}
|
||||
*/
|
||||
@Test
|
||||
public void testGetDiscovery() throws Exception
|
||||
{
|
||||
setRequestContext(null, user1, "wrongPassword");
|
||||
get("discovery", null, 401);
|
||||
|
||||
setRequestContext(null, user1, null);
|
||||
HttpResponse response = get("discovery", null, 200);
|
||||
|
||||
DiscoveryDetails discoveryDetails = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), DiscoveryDetails.class);
|
||||
assertNotNull(discoveryDetails);
|
||||
RepositoryInfo repositoryInfo = discoveryDetails.getRepository();
|
||||
assertNotNull(repositoryInfo);
|
||||
assertEquals("Enterprise", repositoryInfo.getEdition());
|
||||
|
||||
// Check version info
|
||||
VersionInfo versionInfo = repositoryInfo.getVersion();
|
||||
assertNotNull(versionInfo);
|
||||
assertEquals("5", versionInfo.getMajor());
|
||||
assertEquals("2", versionInfo.getMinor());
|
||||
assertEquals("1", versionInfo.getPatch());
|
||||
assertEquals("3", versionInfo.getHotfix());
|
||||
assertEquals("r123456-b0", versionInfo.getLabel());
|
||||
assertEquals(10051, versionInfo.getSchema());
|
||||
assertEquals("5.2.1.3 (r123456-b0) schema 10051", versionInfo.getDisplay());
|
||||
|
||||
// Check license info
|
||||
LicenseInfo licenseInfo = repositoryInfo.getLicense();
|
||||
assertNotNull(licenseInfo);
|
||||
assertEquals(LicenseMode.ENTERPRISE.name(), licenseInfo.getMode());
|
||||
assertEquals(licenseIssuedAt.toString(), licenseInfo.getIssuedAt().toString());
|
||||
assertEquals(licenseExpiresAt.toString(), licenseInfo.getExpiresAt().toString());
|
||||
assertEquals(Integer.valueOf(5), licenseInfo.getRemainingDays());
|
||||
assertEquals("Alfresco Dev Test", licenseInfo.getHolder());
|
||||
LicenseEntitlement entitlements = licenseInfo.getEntitlements();
|
||||
assertNotNull(entitlements);
|
||||
assertNotNull(entitlements.getMaxUsers());
|
||||
assertEquals(20L, entitlements.getMaxUsers().longValue());
|
||||
assertNotNull(entitlements.getMaxDocs());
|
||||
assertEquals(1000L, entitlements.getMaxDocs().longValue());
|
||||
assertTrue(entitlements.getIsClusterEnabled());
|
||||
assertFalse(entitlements.getIsCryptodocEnabled());
|
||||
|
||||
// Check status
|
||||
StatusInfo statusInfo = repositoryInfo.getStatus();
|
||||
assertNotNull(statusInfo);
|
||||
assertFalse(statusInfo.getIsReadOnly());
|
||||
assertTrue(statusInfo.getIsAuditEnabled());
|
||||
assertTrue(statusInfo.getIsQuickShareEnabled());
|
||||
|
||||
// Check modules
|
||||
List<ModulePackage> modulePackageList = repositoryInfo.getModules();
|
||||
assertNotNull(modulePackageList);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests get discovery.
|
||||
* <p>GET:</p>
|
||||
* {@literal <host>:<port>/alfresco/api/discovery}
|
||||
*/
|
||||
@Test
|
||||
public void testGetDiscovery_hotfixValue() throws Exception
|
||||
{
|
||||
/*
|
||||
* The agreement was that if the hotfix value (versionLabel) does not follow the standard
|
||||
* of "dot then digits" or just "digits", the API should return zero.
|
||||
*/
|
||||
|
||||
when(serverDescriptor.getVersionLabel()).thenReturn("4");
|
||||
setRequestContext(null, user1, null);
|
||||
HttpResponse response = get("discovery", null, 200);
|
||||
|
||||
DiscoveryDetails discoveryDetails = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), DiscoveryDetails.class);
|
||||
assertNotNull(discoveryDetails);
|
||||
RepositoryInfo repositoryInfo = discoveryDetails.getRepository();
|
||||
assertNotNull(repositoryInfo);
|
||||
assertEquals("Enterprise", repositoryInfo.getEdition());
|
||||
|
||||
// Check version info
|
||||
VersionInfo versionInfo = repositoryInfo.getVersion();
|
||||
assertNotNull(versionInfo);
|
||||
assertEquals("5", versionInfo.getMajor());
|
||||
assertEquals("2", versionInfo.getMinor());
|
||||
assertEquals("1", versionInfo.getPatch());
|
||||
assertEquals("4", versionInfo.getHotfix());
|
||||
assertEquals("r123456-b0", versionInfo.getLabel());
|
||||
assertEquals(10051, versionInfo.getSchema());
|
||||
assertEquals("5.2.1.4 (r123456-b0) schema 10051", versionInfo.getDisplay());
|
||||
|
||||
when(serverDescriptor.getVersionLabel()).thenReturn("d");
|
||||
response = get("discovery", null, 200);
|
||||
|
||||
discoveryDetails = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), DiscoveryDetails.class);
|
||||
assertNotNull(discoveryDetails);
|
||||
repositoryInfo = discoveryDetails.getRepository();
|
||||
assertNotNull(repositoryInfo);
|
||||
// Check version info
|
||||
versionInfo = repositoryInfo.getVersion();
|
||||
assertNotNull(versionInfo);
|
||||
assertEquals("5", versionInfo.getMajor());
|
||||
assertEquals("2", versionInfo.getMinor());
|
||||
assertEquals("1", versionInfo.getPatch());
|
||||
assertEquals("0", versionInfo.getHotfix());
|
||||
assertEquals("r123456-b0", versionInfo.getLabel());
|
||||
assertEquals(10051, versionInfo.getSchema());
|
||||
assertEquals("5.2.1.0 (r123456-b0) schema 10051", versionInfo.getDisplay());
|
||||
|
||||
when(serverDescriptor.getVersionLabel()).thenReturn("39.4");
|
||||
response = get("discovery", null, 200);
|
||||
|
||||
discoveryDetails = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), DiscoveryDetails.class);
|
||||
assertNotNull(discoveryDetails);
|
||||
repositoryInfo = discoveryDetails.getRepository();
|
||||
assertNotNull(repositoryInfo);
|
||||
// Check version info
|
||||
versionInfo = repositoryInfo.getVersion();
|
||||
assertNotNull(versionInfo);
|
||||
assertEquals("5", versionInfo.getMajor());
|
||||
assertEquals("2", versionInfo.getMinor());
|
||||
assertEquals("1", versionInfo.getPatch());
|
||||
assertEquals("0", versionInfo.getHotfix());
|
||||
assertEquals("r123456-b0", versionInfo.getLabel());
|
||||
assertEquals(10051, versionInfo.getSchema());
|
||||
assertEquals("5.2.1.0 (r123456-b0) schema 10051", versionInfo.getDisplay());
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests get discovery.
|
||||
* <p>GET:</p>
|
||||
* {@literal <host>:<port>/alfresco/api/discovery}
|
||||
*/
|
||||
@Test
|
||||
public void testGetDiscovery_licenseEntitlement() throws Exception
|
||||
{
|
||||
// Override maxUsers
|
||||
when(licenseDescriptorMock.getMaxUsers()).thenReturn(null);
|
||||
|
||||
setRequestContext(null, user1, null);
|
||||
HttpResponse response = get("discovery", null, 200);
|
||||
|
||||
DiscoveryDetails discoveryDetails = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), DiscoveryDetails.class);
|
||||
assertNotNull(discoveryDetails);
|
||||
RepositoryInfo repositoryInfo = discoveryDetails.getRepository();
|
||||
assertNotNull(repositoryInfo);
|
||||
assertEquals("Enterprise", repositoryInfo.getEdition());
|
||||
|
||||
// Check license info
|
||||
LicenseInfo licenseInfo = repositoryInfo.getLicense();
|
||||
assertNotNull(licenseInfo);
|
||||
assertEquals(LicenseMode.ENTERPRISE.name(), licenseInfo.getMode());
|
||||
assertEquals(licenseIssuedAt.toString(), licenseInfo.getIssuedAt().toString());
|
||||
assertEquals(licenseExpiresAt.toString(), licenseInfo.getExpiresAt().toString());
|
||||
assertEquals(Integer.valueOf(5), licenseInfo.getRemainingDays());
|
||||
assertEquals("Alfresco Dev Test", licenseInfo.getHolder());
|
||||
LicenseEntitlement entitlements = licenseInfo.getEntitlements();
|
||||
assertNotNull(entitlements);
|
||||
assertNull(entitlements.getMaxUsers());
|
||||
assertEquals(1000L, entitlements.getMaxDocs().longValue());
|
||||
assertTrue(entitlements.getIsClusterEnabled());
|
||||
assertFalse(entitlements.getIsCryptodocEnabled());
|
||||
|
||||
// Override entitlements
|
||||
when(licenseDescriptorMock.getMaxDocs()).thenReturn(null);
|
||||
when(licenseDescriptorMock.isClusterEnabled()).thenReturn(false);
|
||||
when(licenseDescriptorMock.isCryptodocEnabled()).thenReturn(true);
|
||||
|
||||
response = get("discovery", null, 200);
|
||||
|
||||
discoveryDetails = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), DiscoveryDetails.class);
|
||||
assertNotNull(discoveryDetails);
|
||||
repositoryInfo = discoveryDetails.getRepository();
|
||||
assertNotNull(repositoryInfo);
|
||||
|
||||
// Check license info
|
||||
licenseInfo = repositoryInfo.getLicense();
|
||||
assertNotNull(licenseInfo);
|
||||
entitlements = licenseInfo.getEntitlements();
|
||||
assertNotNull(entitlements);
|
||||
assertNull(entitlements.getMaxUsers());
|
||||
assertNull(entitlements.getMaxDocs());
|
||||
assertFalse(entitlements.getIsClusterEnabled());
|
||||
assertTrue(entitlements.getIsCryptodocEnabled());
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user