package org.axway.grapes.server.core;
import org.axway.grapes.commons.datamodel.License;
import org.axway.grapes.server.core.options.FiltersHolder;
import org.axway.grapes.server.core.options.filters.LicenseIdFilter;
import org.axway.grapes.server.db.ModelMapper;
import org.axway.grapes.server.db.RepositoryHandler;
import org.axway.grapes.server.db.datamodel.DbArtifact;
import org.axway.grapes.server.db.datamodel.DbLicense;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Response;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.PatternSyntaxException;
/**
* License Handler
*
* <p>Handles the license resolution. It stores the licenses names and the regexp to avoid db access. It must be updated at license addition / deletion.</p>
*
* @author jdcoffre
*/
public class LicenseHandler {
private static final Logger LOG = LoggerFactory.getLogger(LicenseHandler.class);
private final Map<String, DbLicense> licensesRegexp = new HashMap<String, DbLicense>();
private final RepositoryHandler repoHandler;
public LicenseHandler(final RepositoryHandler repoHandler) {
this.repoHandler = repoHandler;
init(repoHandler.getAllLicenses());
}
/**
* Init the licenses cache
*
* @param licenses
*/
private void init(final List<DbLicense> licenses){
licensesRegexp.clear();
for(DbLicense license: licenses){
if(license.getRegexp() == null ||
license.getRegexp().isEmpty()){
licensesRegexp.put(license.getName(), license);
}
else{
licensesRegexp.put(license.getRegexp(), license);
}
}
}
/**
* Add or update a license to the database
*
* @param dbLicense DbLicense
*/
public void store(final DbLicense dbLicense) {
repoHandler.store(dbLicense);
}
/**
* Return a list of license names. This list can either be serialized in HTML or in JSON
*
* @param filters FiltersHolder
* @return List<String>
*/
public List<String> getLicensesNames(final FiltersHolder filters) {
return repoHandler.getLicenseNames(filters);
}
/**
* Return a html view that contains the targeted license
*
* @param name String
* @return DbLicense
*/
public DbLicense getLicense(final String name) {
final DbLicense license = repoHandler.getLicense(name);
if(license == null){
throw new WebApplicationException(Response.status(Response.Status.NOT_FOUND)
.entity("License " + name + " does not exist.").build());
}
return license;
}
/**
* Delete a license from the repository
*
* @param name
*/
public void deleteLicense(final String name) {
final DbLicense dbLicense = getLicense(name);
repoHandler.deleteLicense(dbLicense.getName());
final FiltersHolder filters = new FiltersHolder();
final LicenseIdFilter licenseIdFilter = new LicenseIdFilter(name);
filters.addFilter(licenseIdFilter);
for(DbArtifact artifact: repoHandler.getArtifacts(filters)){
repoHandler.removeLicenseFromArtifact(artifact, name);
}
}
/**
* Approve or reject a license
*
* @param name String
* @param approved Boolean
*/
public void approveLicense(final String name, final Boolean approved) {
final DbLicense license = getLicense(name);
repoHandler.approveLicense(license, approved);
}
/**
* Resolve the targeted license thanks to the license ID
* Return null if no license is matching the licenseId
*
* @param licenseId
* @return DbLicense
*/
public DbLicense resolve(final String licenseId){
for(String regexp : licensesRegexp.keySet()){
try{
if(licenseId.matches(regexp)){
return licensesRegexp.get(regexp);
}
}
catch (PatternSyntaxException e){
LOG.error("Wrong pattern for the following license " + licensesRegexp.get(regexp).getName());
continue;
}
}
LOG.warn("No matching pattern for license " + licenseId);
return null;
}
/**
* Returns all the available license in client/server data model
*
* @return List<License>
*/
public List<License> getLicenses(){
final ModelMapper modelMapper = new ModelMapper(repoHandler);
final List<License> licenses = new ArrayList<License>();
for(DbLicense dbLicense: licensesRegexp.values()){
licenses.add(modelMapper.getLicense(dbLicense));
}
return licenses;
}
}