public KeyModuleListPair(ConnectModuleMeta key, List<ModuleBean> modules) { this.key = key.getDescriptorKey(); this.modules = modules; } }
@Nullable public ConnectModuleMeta getModuleMeta(String type) { for (ConnectModuleMeta moduleMeta : moduleMetas) { if (moduleMeta.getDescriptorKey().equals(type)) { return moduleMeta; } } return null; }
@Nullable public ConnectModuleMeta getModuleMeta(String type) { for (ConnectModuleMeta moduleMeta : moduleMetas) { if (moduleMeta.getDescriptorKey().equals(type)) { return moduleMeta; } } return null; }
public RegistrationResult(ConnectModuleProvider<?> provider, List<ModuleDescriptor<?>> moduleDescriptors, Collection<ConnectModuleProvider.TypedPluginModule> pluginModules) { this.moduleDescriptors = moduleDescriptors; this.pluginModules = pluginModules; providerDescriptorKey = provider.getMeta().getDescriptorKey(); // Warning, do NOT hang on to the provider }
public ConnectAddonDeserializeFailedEvent(ConnectAddonBean addon, ConnectModuleMeta meta, Collection<?> beans, boolean isExpectedException, String deserializerIdentifier) { super(addon.getKey()); descriptorKey = meta.getDescriptorKey(); moduleBeanCount = beans.size(); this.isExpectedException = isExpectedException; this.deserializerIdentifier = deserializerIdentifier; }
public ConnectAddonSerializeFailedEvent(ConnectAddonBean addon, ConnectModuleMeta meta, Collection<?> beans, boolean isEventExpected) { super(addon.getKey()); descriptorKey = meta.getDescriptorKey(); moduleBeanCount = beans.size(); isExpectedException = isEventExpected; }
private ConnectModuleProvider<?> findProviderOrThrow(String descriptorKey, Collection<ConnectModuleProvider<?>> moduleProviders) throws ConnectModuleRegistrationException { return moduleProviders.stream() .filter(provider -> provider.getMeta().getDescriptorKey().equals(descriptorKey)) .findFirst() .orElseThrow(() -> new ConnectModuleRegistrationException(String.format("Could not find module provider %s for descriptor registration", descriptorKey))); }
private Map<String, ConnectModuleProvider<? extends ModuleBean>> getModuleProviders() { return pluginAccessor.getModules(new ModuleDescriptorOfClassPredicate<>(ConnectModuleProviderModuleDescriptor.class)) .stream().collect(Collectors.toMap(provider -> provider.getMeta().getDescriptorKey(), identity())); } }
private Map<String, ConnectModuleProvider<? extends ModuleBean>> getModuleProviders() { return pluginAccessor.getModules(new ModuleDescriptorOfClassPredicate<>(ConnectModuleProviderModuleDescriptor.class)) .stream().collect(Collectors.toMap(provider -> provider.getMeta().getDescriptorKey(), identity())); }
private Map<String, ConnectModuleProvider<?>> getModuleProviders() { return pluginAccessor.getModules(new ModuleDescriptorOfClassPredicate<>(ConnectModuleProviderModuleDescriptor.class)) .stream().collect(Collectors.toMap(provider -> provider.getMeta().getDescriptorKey(), identity())); }
private void validateJsonModuleListEntryAgainstSchema(ConnectModuleProvider<ModuleBean> moduleProvider, ConnectModuleMeta<ModuleBean> moduleMeta, String jsonModuleListEntry) throws ConnectModuleSchemaValidationException { Optional<URL> optionalJsonSchemaResource = moduleProvider.getJsonSchemaResource(); if (optionalJsonSchemaResource.isPresent()) { String modules = String.format("{\"%s\": %s}", moduleMeta.getDescriptorKey(), jsonModuleListEntry); try { descriptorSchemaValidator.assertValidDescriptor(modules, optionalJsonSchemaResource.get()); } catch (ConnectJsonSchemaValidationException e) { throw new ConnectModuleSchemaValidationException(addon, moduleMeta, e); } } } }
private void validateJsonModuleListEntryAgainstSchema(ConnectModuleProvider<ModuleBean> moduleProvider, ConnectModuleMeta<ModuleBean> moduleMeta, String jsonModuleListEntry) throws ConnectModuleSchemaValidationException { Optional<URL> optionalJsonSchemaResource = moduleProvider.getJsonSchemaResource(); if (optionalJsonSchemaResource.isPresent()) { String modules = String.format("{\"%s\": %s}", moduleMeta.getDescriptorKey(), jsonModuleListEntry); try { descriptorSchemaValidator.assertValidDescriptor(Optional.of(addon.getKey()), modules, optionalJsonSchemaResource.get()); } catch (ConnectJsonSchemaValidationException e) { throw new ConnectModuleSchemaValidationException(addon, moduleMeta, e); } } } }
private Map<String, ConnectModuleProvider<?>> getModuleProviders() { return Maps.uniqueIndex( pluginAccessor.getModules(new ModuleDescriptorOfClassPredicate<>(ConnectModuleProviderModuleDescriptor.class)), input -> input.getMeta().getDescriptorKey() ); }
@Override public void validateModules(ConnectAddonBean addon, Map<String, List<ModuleBean>> validModulesByDescriptorKey) throws ConnectModuleValidationException { final Map<String, List<DescriptorKeyAndBean>> descriptorKeyAndBeanByRawKey = validModulesByDescriptorKey.entrySet().stream() .flatMap(e -> e.getValue().stream().filter(moduleBean -> moduleBean instanceof RequiredKeyBean).map(moduleBean -> new DescriptorKeyAndBean(e.getKey(), (RequiredKeyBean) moduleBean))) .collect(Collectors.groupingBy(e -> e.getModuleBean().getRawKey())); final Map<String, List<DescriptorKeyAndBean>> duplicateDescriptorKeyAndBeans = descriptorKeyAndBeanByRawKey.entrySet().stream() .filter(e -> e.getValue().size() > 1) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); if(!duplicateDescriptorKeyAndBeans.isEmpty()) { final List<DescriptorKeyAndBean> firstDuplicateKeyAndBean = Iterables.getFirst(duplicateDescriptorKeyAndBeans.values(), null); final DescriptorKeyAndBean firstDuplicate = Iterables.getFirst(firstDuplicateKeyAndBean, null); final String firstDuplicateDescriptorKey = firstDuplicate.getDescriptorKey(); final ConnectModuleMeta<? extends ModuleBean> firstModuleMeta = pluginAccessor.getEnabledModuleDescriptorsByClass(ConnectModuleProviderModuleDescriptor.class).stream() .map(ConnectModuleProviderModuleDescriptor::getModule) .map(ConnectModuleProvider::getMeta) .filter(e -> e.getDescriptorKey().equals(firstDuplicateDescriptorKey)) .findFirst().orElseThrow(() -> new IllegalArgumentException("There is no Atlassian Connect module with the descriptor key: " + firstDuplicateDescriptorKey)); final Set<String> duplicateKeys = duplicateDescriptorKeyAndBeans.keySet(); final String errorMessage = "Could not install add-on. Detected duplicate add-on module keys in '" + addon.getKey() + "'. Duplicate keys: " + duplicateKeys; if(DUPLICATES_ALLOWED_ADDON_RATCHET.contains(addon.getKey())) { log.error(errorMessage); } else { throw new ConnectModuleValidationException(addon, firstModuleMeta, errorMessage, "connect.install.error.duplicate.module.keys", addon.getKey(), duplicateKeys.toString()); } } }
public ConnectAddonModuleValidationFailedAfterInstallEvent(ConnectModuleValidationException e) { addonKey = e.getAddon().getKey(); moduleType = e.getModuleMeta().getDescriptorKey(); message = e.getMessage(); }
public ConnectAddonModuleValidationFailedAfterInstallEvent(ConnectModuleValidationException e) { addonKey = e.getAddon().getKey(); moduleType = e.getModuleMeta().getDescriptorKey(); message = e.getMessage(); }
/** * Validates the given JSON module list entry against the given JSON schema and asserts that the result is valid. * * @param jsonModuleListEntry the string representation of the module list entry JSON element * @param descriptor the add-on descriptor (without the module list) * @param schemaUrl the URL of the JSON schema resource * @param schemaValidator the JSON schema validator to use * @throws IllegalStateException if a valid JSON schema cannot be read from the provided URL * @throws ConnectModuleSchemaValidationException if the module list entry was not well-formed or did not match the schema */ protected void assertDescriptorValidatesAgainstSchema(String jsonModuleListEntry, ShallowConnectAddonBean descriptor, URL schemaUrl, ConnectJsonSchemaValidator schemaValidator) throws ConnectModuleSchemaValidationException { String modules = String.format("{\"%s\": %s}", getMeta().getDescriptorKey(), jsonModuleListEntry); try { schemaValidator.assertValidDescriptor(modules, schemaUrl); } catch (ConnectJsonSchemaValidationException e) { throw new ConnectModuleSchemaValidationException(descriptor, getMeta(), e); } }
@SuppressWarnings("unchecked") @Override public RegistrationResult onModule(ConnectModuleProviderModuleDescriptor moduleDescriptor, ConnectModuleProvider<?> provider) { final String descriptorKey = provider.getMeta().getDescriptorKey(); final Collection moduleBeans = builtModuleList.get(descriptorKey); if (moduleBeans == null) return RegistrationResult.emptyFor(provider); if (vertigoState.isVertigoSpiEnabled()) { final Either<GenerationResult, RegistrationResult> potentialDescriptors = BeanToModuleRegistrar.this.getDescriptorsToRegisterForModulesVertigoStyle(provider, moduleBeans, addon, translations); if (potentialDescriptors.isRight()) { return potentialDescriptors.right().get(); } else { if (potentialDescriptors.left().get() != GenerationResult.NOT_IMPLEMENTED && systemPropertyService.isVertigoFallbackDisabled()) { throw new IllegalStateException("The module provider " + provider.getClass() + " implemented serializeToPluginModules but failed to run the whole process. Fallback disabled: failing hard."); } } } return new RegistrationResult(provider, provider.createPluginModuleDescriptors(ImmutableList.copyOf(moduleBeans), addon), ImmutableList.of()); } });
public static void runAllPerformanceTests(String product, String productBaseUrl, List<PluginModulePerformanceTest> performanceTests) throws Exception { final TestPluginModuleStorageClient testPluginModuleStorageClient = new TestPluginModuleStorageClient(productBaseUrl, "admin", "admin"); final ImmutableList.Builder<PerformanceResultsPublisherClient.PerformanceTestResult> testResults = ImmutableList.builder(); for (PluginModulePerformanceTest performanceTest : performanceTests) { final ConnectRunner remotePlugin = newRemotePlugin(product, productBaseUrl) .addModules(performanceTest.getModuleMeta().getDescriptorKey(), modules(performanceTest)) .addModuleMeta(performanceTest.getModuleMeta()) .setTranslations(Translations.empty() .withMapping(Language.EN_UK, I18nKeysMapping.of(ImmutableMap.of(I18N_KEY, "lift"))) .withMapping(Language.EN_US, I18nKeysMapping.of(ImmutableMap.of(I18N_KEY, "elevator"))) .withMapping(Language.DE_DE, I18nKeysMapping.of(ImmutableMap.of(I18N_KEY, "Fahrstuhl"))) .withMapping(Language.ES_ES, I18nKeysMapping.of(ImmutableMap.of(I18N_KEY, "ascensor"))) .withMapping(Language.FR_FR, I18nKeysMapping.of(ImmutableMap.of(I18N_KEY, "élévateur"))) .withMapping(Language.JA_JP, I18nKeysMapping.of(ImmutableMap.of(I18N_KEY, "エレベーター"))) .withMapping(Language.KO_KR, I18nKeysMapping.of(ImmutableMap.of(I18N_KEY, "엘리베이터"))) .withMapping(Language.PT_PT, I18nKeysMapping.of(ImmutableMap.of(I18N_KEY, "elevador"))) .withMapping(Language.RU_RU, I18nKeysMapping.of(ImmutableMap.of(I18N_KEY, "поднимающая мышца")))); for (PluginModulePerformanceTest.KeyModuleListPair keyModuleListPair : performanceTest.getRequiredModules()) { remotePlugin.addModules(keyModuleListPair.key, keyModuleListPair.modules); } try { log.info("Starting performance test for {}", performanceTest.getDeserializerIdentifier()); remotePlugin.start(); testResults.add(runPerformanceTest(testPluginModuleStorageClient, performanceTest)); } finally { remotePlugin.stopAndUninstall(); } } PerformanceResultsPublisherClient.publishPerformanceResults(product, testResults.build()); }