package jenkins.plugins.nodejs.configfiles;
import hudson.Extension;
import hudson.Util;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Nonnull;
import jenkins.model.Jenkins;
import jenkins.plugins.nodejs.Messages;
import org.apache.commons.io.IOUtils;
import org.jenkinsci.lib.configprovider.AbstractConfigProviderImpl;
import org.jenkinsci.lib.configprovider.ConfigProvider;
import org.jenkinsci.lib.configprovider.model.Config;
import org.jenkinsci.lib.configprovider.model.ContentType;
import org.kohsuke.stapler.DataBoundConstructor;
/**
* A config/provider to handle the special case of a npmrc config file
*
* @author Nikolas Falco
* @since 1.0
*/
public class NPMConfig extends Config {
private static final long serialVersionUID = 1L;
private final List<NPMRegistry> registries;
@DataBoundConstructor
public NPMConfig(@Nonnull String id, String name, String comment, String content, @Nonnull String providerId, List<NPMRegistry> registries) {
super(id, Util.fixEmptyAndTrim(name), Util.fixEmptyAndTrim(comment), Util.fixEmptyAndTrim(content), providerId);
this.registries = registries == null ? new ArrayList<NPMRegistry>(3) : registries;
}
public List<NPMRegistry> getRegistries() {
return registries;
}
/**
* Perform a validation of the configuration.
* <p>
* If validation pass then no {@link VerifyConfigProviderException} will be
* raised.
*
* @throws VerifyConfigProviderException
* in case this configuration is not valid.
*/
public void doVerify() throws VerifyConfigProviderException {
// check if more than registry is setup to be global
NPMRegistry globalRegistry = null;
for (NPMRegistry registry : registries) {
registry.doVerify();
if (!registry.isHasScopes()) {
if (globalRegistry != null) {
throw new VerifyConfigProviderException(Messages.NPMConfig_verifyTooGlobalRegistry());
}
globalRegistry = registry;
}
}
}
/*
* (non-Javadoc)
* @see org.jenkinsci.lib.configprovider.model.Config#getDescriptor()
*/
@Override
public ConfigProvider getDescriptor() {
// boilerplate template
return (ConfigProvider) Jenkins.getActiveInstance().getDescriptorOrDie(getClass());
}
@Extension
public static class NPMConfigProvider extends AbstractConfigProviderImpl {
public NPMConfigProvider() {
load();
}
@Override
public ContentType getContentType() {
return null;
}
@Override
public String getDisplayName() {
return Messages.NPMConfig_displayName();
}
@Override
public Config newConfig(@Nonnull String configId) {
return new NPMConfig(configId, "MyNpmrcConfig", "user config", loadTemplateContent(), getProviderId(), null);
}
protected String loadTemplateContent() {
try (InputStream is = this.getClass().getResourceAsStream("template.npmrc")) {
return IOUtils.toString(is, "UTF-8");
} catch (IOException e) { // NOSONAR
return null;
}
}
}
}