blob: 7116d4637c63bc39aaf1385c5aea041190ec7067 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.sling.distribution.component.impl;
import static java.lang.String.format;
import static org.apache.sling.distribution.component.impl.DistributionComponentKind.AGENT;
import static org.apache.sling.distribution.component.impl.DistributionComponentKind.EXPORTER;
import static org.apache.sling.distribution.component.impl.DistributionComponentKind.IMPORTER;
import static org.apache.sling.distribution.component.impl.DistributionComponentKind.PACKAGE_BUILDER;
import static org.apache.sling.distribution.component.impl.DistributionComponentKind.QUEUE_PROVIDER;
import static org.apache.sling.distribution.component.impl.DistributionComponentKind.QUEUE_STRATEGY;
import static org.apache.sling.distribution.component.impl.DistributionComponentKind.REQUEST_AUTHORIZATION;
import static org.apache.sling.distribution.component.impl.DistributionComponentKind.TRANSPORT_SECRET_PROVIDER;
import static org.apache.sling.distribution.component.impl.DistributionComponentKind.TRIGGER;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.sling.distribution.agent.impl.ForwardDistributionAgentFactory;
import org.apache.sling.distribution.agent.impl.PrivilegeDistributionRequestAuthorizationStrategy;
import org.apache.sling.distribution.agent.impl.QueueDistributionAgentFactory;
import org.apache.sling.distribution.agent.impl.ReverseDistributionAgentFactory;
import org.apache.sling.distribution.agent.impl.SimpleDistributionAgentFactory;
import org.apache.sling.distribution.agent.impl.SyncDistributionAgentFactory;
import org.apache.sling.distribution.packaging.impl.exporter.AgentDistributionPackageExporterFactory;
import org.apache.sling.distribution.packaging.impl.exporter.LocalDistributionPackageExporterFactory;
import org.apache.sling.distribution.packaging.impl.exporter.RemoteDistributionPackageExporterFactory;
import org.apache.sling.distribution.packaging.impl.importer.LocalDistributionPackageImporterFactory;
import org.apache.sling.distribution.packaging.impl.importer.RemoteDistributionPackageImporterFactory;
import org.apache.sling.distribution.serialization.impl.vlt.VaultDistributionPackageBuilderFactory;
import org.apache.sling.distribution.transport.impl.UserCredentialsDistributionTransportSecretProvider;
import org.apache.sling.distribution.trigger.impl.DistributionEventDistributeDistributionTriggerFactory;
import org.apache.sling.distribution.trigger.impl.JcrEventDistributionTriggerFactory;
import org.apache.sling.distribution.trigger.impl.PersistedJcrEventDistributionTriggerFactory;
import org.apache.sling.distribution.trigger.impl.ResourceEventDistributionTriggerFactory;
import org.apache.sling.distribution.trigger.impl.ScheduledDistributionTriggerFactory;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.metatype.annotations.AttributeDefinition;
import org.osgi.service.metatype.annotations.Designate;
import org.osgi.service.metatype.annotations.ObjectClassDefinition;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Component(service=DistributionComponentFactoryMap.class)
@Designate(ocd=DistributionComponentFactoryMap.Config.class)
public class DistributionComponentFactoryMap {
// Note: Before converting to OSGI annotations there were properties, but
// not metatype(s)!
@ObjectClassDefinition()
public @interface Config {
@AttributeDefinition()
String[] mapping_agent();
@AttributeDefinition()
String[] mapping_importer();
@AttributeDefinition()
String[] mapping_exporter();
@AttributeDefinition()
String[] mapping_queueProvider();
@AttributeDefinition()
String[] mapping_queueStrategy();
@AttributeDefinition()
String[] mapping_transportSecretProvider();
@AttributeDefinition()
String[] mapping_packageBuilder();
@AttributeDefinition()
String[] mapping_requestAuthorization();
@AttributeDefinition()
String[] mapping_trigger();
}
private final Logger log = LoggerFactory.getLogger(getClass());
private static final String[] MAPPING_AGENT_DEFAULT = {
format("simple:%s", SimpleDistributionAgentFactory.class.getName()),
format("sync:%s", SyncDistributionAgentFactory.class.getName()),
format("forward:%s", ForwardDistributionAgentFactory.class.getName()),
format("reverse:%s", ReverseDistributionAgentFactory.class.getName()),
format("queue:%s", QueueDistributionAgentFactory.class.getName()) };
private static final String[] MAPPING_IMPORTER_DEFAULT = {
format("local:%s", LocalDistributionPackageImporterFactory.class.getName()),
format("remote:%s", RemoteDistributionPackageImporterFactory.class.getName()) };
private static final String[] MAPPING_EXPORTER_DEFAULT = {
format("local:%s", LocalDistributionPackageExporterFactory.class.getName()),
format("remote:%s", RemoteDistributionPackageExporterFactory.class.getName()),
format("agent:%s", AgentDistributionPackageExporterFactory.class.getName()) };
private static final String[] MAPPING_QUEUE_PROVIDER_DEFAULT = {
format("simple:%s", SimpleDistributionAgentFactory.class.getName()),
format("sync:%s", SyncDistributionAgentFactory.class.getName()),
format("forward:%s", ForwardDistributionAgentFactory.class.getName()),
format("reverse:%s", ReverseDistributionAgentFactory.class.getName()),
format("queue:%s", QueueDistributionAgentFactory.class.getName()) };
private static final String[] MAPPING_QUEUE_STRATEGY_DEFAULT = {
format("simple:%s", SimpleDistributionAgentFactory.class.getName()),
format("sync:%s", SyncDistributionAgentFactory.class.getName()),
format("forward:%s", ForwardDistributionAgentFactory.class.getName()),
format("reverse:%s", ReverseDistributionAgentFactory.class.getName()),
format("queue:%s", QueueDistributionAgentFactory.class.getName()) };
private static final String[] MAPPING_TRANSPORT_SECRET_PROVIDER_DEFAULT = {
format("user:%s", UserCredentialsDistributionTransportSecretProvider.class.getName()) };
private static final String[] MAPPING_PACKAGE_BUILDER_DEFAULT = {
format("filevlt:%s", VaultDistributionPackageBuilderFactory.class.getName()),
format("jcrvlt:%s", VaultDistributionPackageBuilderFactory.class.getName()) };
private static final String[] MAPPING_REQUEST_AUTHORIZATION_DEFAULT = {
format("privilege:%s", PrivilegeDistributionRequestAuthorizationStrategy.class.getName()) };
private static final String[] MAPPING_TRIGGER_DEFAULT = {
format("resourceEvent:%s", ResourceEventDistributionTriggerFactory.class.getName()),
format("scheduledEvent:%s", ScheduledDistributionTriggerFactory.class.getName()),
format("distributionEvent:%s", DistributionEventDistributeDistributionTriggerFactory.class.getName()),
format("persistedJcrEvent:%s", PersistedJcrEventDistributionTriggerFactory.class.getName()),
format("jcrEvent:%s", JcrEventDistributionTriggerFactory.class.getName()) };
private final Map<DistributionComponentKind, Map<String, String>> mapping =
new HashMap<DistributionComponentKind, Map<String, String>>();
@Activate
protected void activate(Config conf) {
mapping.put(AGENT, parse(conf.mapping_agent(), MAPPING_AGENT_DEFAULT));
mapping.put(IMPORTER, parse(conf.mapping_importer(), MAPPING_IMPORTER_DEFAULT));
mapping.put(EXPORTER, parse(conf.mapping_exporter(), MAPPING_EXPORTER_DEFAULT));
mapping.put(QUEUE_PROVIDER, parse(conf.mapping_queueProvider(), MAPPING_QUEUE_PROVIDER_DEFAULT));
mapping.put(QUEUE_STRATEGY, parse(conf.mapping_queueStrategy(), MAPPING_QUEUE_STRATEGY_DEFAULT));
mapping.put(TRANSPORT_SECRET_PROVIDER, parse(conf.mapping_transportSecretProvider(), MAPPING_TRANSPORT_SECRET_PROVIDER_DEFAULT));
mapping.put(PACKAGE_BUILDER, parse(conf.mapping_packageBuilder(), MAPPING_PACKAGE_BUILDER_DEFAULT));
mapping.put(REQUEST_AUTHORIZATION, parse(conf.mapping_requestAuthorization(), MAPPING_REQUEST_AUTHORIZATION_DEFAULT));
mapping.put(TRIGGER, parse(conf.mapping_trigger(), MAPPING_TRIGGER_DEFAULT));
}
String getType(DistributionComponentKind kind, @NotNull String factoryPid) {
Map<String,String> entries = getEntries(kind);
for (Map.Entry<String, String> entry : entries.entrySet()) {
if (factoryPid.equals(entry.getValue())) {
return entry.getKey();
}
}
return null;
}
String getFactoryPid(DistributionComponentKind kind, String type) {
return getEntries(kind).get(type);
}
List<String> getFactoryPids(DistributionComponentKind kind) {
return new ArrayList<String>(getEntries(kind).values());
}
//
private Map<String,String> parse(@Nullable String[] mappings, @NotNull String[] defaultMappings) {
Map<String,String> parsed = new HashMap<String, String>();
parsed.putAll(parse(defaultMappings));
if (mappings != null) {
parsed.putAll(parse(mappings));
}
return parsed;
}
private Map<String,String> parse(@NotNull String[] mappings) {
Map<String, String> map = new HashMap<String, String>();
for (String mapping : mappings) {
String[] chunks = mapping.split(":");
if (chunks.length != 2) {
log.info(format("Skipping invalid mapping entry %s", mapping));
} else {
map.put(chunks[0], chunks[1]);
}
}
return map;
}
private Map<String,String> getEntries(DistributionComponentKind kind) {
Map<String,String> entries = mapping.get(kind);
if (entries == null) {
throw new IllegalArgumentException(format("No mapping for components kind %s", kind));
}
return entries;
}
}