/** * Merges configurations from all the additionalConfigs and returns a normalized {@link Service} * instance. */ public static Service normalizeService( Service service, DiagCollector diagCollector, List<FileWrapper> additionalConfigs) { Model model = createModel(service, additionalConfigs); model.establishStage(Normalized.KEY); for (Diag diag : model.getDiagReporter().getDiagCollector().getDiags()) { diagCollector.addDiag(diag); } if (model.getDiagReporter().getDiagCollector().hasErrors()) { return null; } return model.getNormalizedConfig(); }
/** * Returns the dependencies. */ public ImmutableList<ProtoFile> getDependencies() { ImmutableList.Builder<ProtoFile> builder = ImmutableList.builder(); for (ProtoFile file : model.getFiles()) { if (proto.getDependencyList().contains(file.getSimpleName())) { builder.add(file); } } return builder.build(); }
@Override public boolean run(Model model) { Service.Builder normalizedConfig = model.getServiceConfig().toBuilder(); // Normalize descriptor. new DescriptorNormalizer(model).run(normalizedConfig); normalizeAspects(model, model.getConfigAspects(), normalizedConfig); model.setNormalizedConfig(normalizedConfig.build()); model.putAttribute(Normalized.KEY, new Normalized()); return true; }
private static void registerValidators(Model model) { model.registerValidator(new HttpConfigAspectValidator(model.getDiagReporter())); model.registerValidator(new QuotaUnitValidator(model.getDiagReporter())); model.registerValidator(new QuotaLimitValuesValidator(model.getDiagReporter())); model.registerValidator(new QuotaLimitNameValidator(model.getDiagReporter())); model.registerValidator(new QuotaMetricRuleValidator(model.getDiagReporter())); model.registerValidator(new QuotaMetricsExistValidator(model.getDiagReporter())); model.registerValidator(new AuthenticationValidator(model.getDiagReporter())); }
/** Helper to extract the types from the underlying model. */ private List<TypeRef> getTypes(Model model) { List<TypeRef> types = new ArrayList<>(); for (Type type : model.getServiceConfig().getTypesList()) { types.add(model.getSymbolTable().lookupType(type.getName())); } return types; }
@Override protected void process() throws IOException { // Suppress all lint warnings if the flag is true. if (options.get(SUPPRESS_WARNINGS)) { model.getDiagReporter().getDiagSuppressor().suppressAllWarningsUnder(model); } // Generate the normalized config. model.establishStage(Normalized.KEY); }
@Override public boolean run(Model model) { int oldErrorCount = model.getDiagReporter().getDiagCollector().getErrorCount(); if (model.getServiceConfig() == null) { model.setServiceConfig(Service.getDefaultInstance()); Service config = model.getServiceConfig(); for (Api api : model.getServiceConfig().getApisList()) { Interface iface = model.getSymbolTable().lookupInterface(api.getName()); if (iface != null) { model.addRoot(iface); Location location = model.getLocationInConfig(api, "name"); model .getDiagReporter() .report(Diag.error(location, "Cannot resolve api '%s'.", api.getName())); List<Set<ConfigAspect>> orderedAspectGroup = sortForMerge(model.getConfigAspects()); model, model.getLocationInConfig(type, "name"), type.getName(), Type.TYPE_MESSAGE); model, model.getLocationInConfig(enumType, "name"), enumType.getName(), Type.TYPE_ENUM); model.setScoper(ScoperImpl.create(model.getRoots())); if (oldErrorCount == model.getDiagReporter().getDiagCollector().getErrorCount()) {
@Test public void resolvesOkFromProtoc() { Model testApi = Model.create(descriptors); testApi.registerProcessor(new Resolver()); Truth.assertThat(testApi.establishStage(Resolved.KEY)).isTrue(); Truth.assertThat(testApi.getDiagReporter().getDiagCollector().hasErrors()).isFalse(); StageValidator.assertStages(ImmutableList.<Key<?>>of(Resolved.KEY), testApi); }
/** Returns a {@link Model} generated from the {@link Service} and the additionalConfigs. */ private static Model createModel(Service service, List<FileWrapper> additionalConfigs) { Model model = Model.create(service); if (additionalConfigs != null) { List<ConfigSource> allConfigs = Lists.newArrayList(); allConfigs.add(model.getServiceConfigSource()); for (FileWrapper additionalConfig : additionalConfigs) { allConfigs.add( YamlReader.readConfig( model.getDiagReporter().getDiagCollector(), additionalConfig.getFilename(), additionalConfig.getFileContents().toStringUtf8())); } model.setConfigSources(allConfigs); } StandardSetup.registerStandardProcessors(model); StandardSetup.registerStandardConfigAspects(model); return model; } }
@Test public void mergesWithApiVersion() throws Exception { createApi("service_with_version.proto"); model.setConfigSources( testConfig.getApiYamlConfigSources( model.getDiagReporter().getDiagCollector(), ImmutableList.of("service_with_version.yaml"))); StandardSetup.registerStandardConfigAspects(model); model.establishStage(Merged.KEY); Interface iface = getInterface("protiary.test.v2.Storage"); Assert.assertEquals("v2", iface.getAttribute(VersionAttribute.KEY).majorVersion()); }
@Override public boolean run(final Model model) { int oldErrorCount = model.getDiagReporter().getDiagCollector().getErrorCount(); for (ConfigAspect aspect : model.getConfigAspects()) { aspect.startLinting(); } new Visitor(model.getScoper()) { @VisitsBefore void validate(ProtoElement element) { for (ConfigAspect aspect : model.getConfigAspects()) { aspect.lint(element); } } }.visit(model); for (ConfigAspect aspect : model.getConfigAspects()) { aspect.endLinting(); } if (oldErrorCount == model.getDiagReporter().getDiagCollector().getErrorCount()) { // No new errors produced -- success. model.putAttribute(Linted.KEY, new Linted()); return true; } return false; } }
if (!SELECTOR_PATTERN.matcher(typeName).matches()) { model .getDiagReporter() .report( Diag.error( List<TypeRef> typeRefs = model.getSymbolTable().lookupMatchingTypes(typeName, kind); .getDiagReporter() .report( Diag.error( for (TypeRef typeRef : typeRefs) { if (typeRef.isMessage()) { model.addRoot(typeRef.getMessageType()); } else if (typeRef.isEnum()) { model.addRoot(typeRef.getEnumType());
/** Validates the DNS name(s) of an endpoint. */ private boolean validateDns(String dns, String errorPrefix) { if (Strings.isNullOrEmpty(dns)) { error( ResolvedLocation.create(getModel().getLocation()), "%s in service '%s' must not be empty.", errorPrefix, getModel().getServiceConfig().getName()); return false; } return true; }
SymbolTable symbolTable = model.getSymbolTable(); .getFiles() .stream() .filter(f -> f.getProto().getPackage().equals(defaultPackage)) if (sourceProtos.isEmpty()) { model .getDiagReporter() .getDiagCollector() .addDiag( DiagCollector diagCollector = model.getDiagReporter().getDiagCollector(); LicenseHeaderUtil licenseHeaderUtil = LicenseHeaderUtil.create( configProto, settings, model.getDiagReporter().getDiagCollector()); copyrightLines = licenseHeaderUtil.loadCopyrightLines(); licenseLines = licenseHeaderUtil.loadLicenseLines(); } catch (Exception e) { model .getDiagReporter() .getDiagCollector() .addDiag(Diag.error(SimpleLocation.TOPLEVEL, "Exception: %s", e.getMessage())); if (Strings.isNullOrEmpty(configSchemaVersion)) { model .getDiagReporter() .getDiagCollector()
Set<String> sharedImportNames = new HashSet<>(); SymbolTable symbolTable = model.getSymbolTable(); Collection<ProtoFile> localImportFiles = productConfig .collect(ImmutableSet.toImmutableSet()); Iterable<ProtoFile> allFiles = model.reachable(model.getFiles());
@Override public ProtoInterfaceModel getInterface(String interfaceName) { return new ProtoInterfaceModel(protoModel.getSymbolTable().lookupInterface(interfaceName)); }
element .getModel() .getDiagReporter() .getDiagSuppressor() .addSuppressionDirective(element, arg, element.getModel().getConfigAspects()); break; case RESOURCE_INSTRUCTION: element .getModel() .getDiagReporter() .reportError( ResolvedLocation.create(element.getLocation()), element .getModel() .getDiagReporter() .reportError( ResolvedLocation.create(element.getLocation()), element.getFullName()); } else if (element instanceof MessageType && subCyclic((MessageType) element)) { if (!element.getModel().getExperiments() .isExperimentEnabled(DocumentationConfigAspect.INLINE_ALL_MESSAGES)) { element .getModel() .getDiagReporter() .reportError( ResolvedLocation.create(element.getLocation()),
/** Creates a model, based on the provided config files. */ public Model createModel(List<String> configFileNames) { try { Model model = Model.create(getDescriptor(), protoFiles, enabledExperiments, ExtensionPool.EMPTY); model.setConfigSources( getApiYamlConfigSources(model.getDiagReporter().getDiagCollector(), configFileNames)); return model; } catch (IOException e) { throw new RuntimeException(e); } }
@Override public void startMerging() { getModel().putAttribute(USAGE_KEY, getModel().getServiceConfig().getUsage()); for (int i = 0; i < getModel().getServiceConfig().getUsage().getRequirementsCount(); ++i) { validateRequirement( MessageLocationContext.createForRepeatedByFieldName( getModel().getServiceConfig().getUsage(), Usage.REQUIREMENTS_FIELD_NUMBER, i), getModel().getServiceConfig().getUsage().getRequirements(i)); } super.startMerging(); }
private SuperQuotaConfigAspect(Model model) { super( model, SuperQuotaAttribute.KEY, NAME, MetricRule.getDescriptor(), model.getServiceConfig().getQuota().getMetricRulesList()); this.serviceConfig = this.getModel().getServiceConfig(); }