blob: 1d010864b6f47660d1744c7c96029b822546b71b [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 java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.sling.distribution.agent.DistributionAgent;
import org.apache.sling.distribution.agent.impl.DistributionRequestAuthorizationStrategy;
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.DistributionPackageExporter;
import org.apache.sling.distribution.packaging.DistributionPackageImporter;
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.queue.DistributionQueueProvider;
import org.apache.sling.distribution.queue.impl.DistributionQueueDispatchingStrategy;
import org.apache.sling.distribution.serialization.DistributionPackageBuilder;
import org.apache.sling.distribution.serialization.impl.vlt.VaultDistributionPackageBuilderFactory;
import org.apache.sling.distribution.transport.DistributionTransportSecretProvider;
import org.apache.sling.distribution.transport.impl.UserCredentialsDistributionTransportSecretProvider;
import org.apache.sling.distribution.trigger.DistributionTrigger;
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;
/**
* Enum that represents the main distribution component kinds that can be configured for distribution.
*/
public enum DistributionComponentKind {
AGENT("agent"),
IMPORTER("importer"),
EXPORTER("exporter"),
QUEUE_PROVIDER("queueProvider"),
QUEUE_STRATEGY("queueStrategy"),
TRANSPORT_SECRET_PROVIDER("transportSecretProvider"),
PACKAGE_BUILDER("packageBuilder"),
REQUEST_AUTHORIZATION("requestAuthorization"),
TRIGGER("trigger");
private static Map<DistributionComponentKind, Class> classMap = new HashMap<DistributionComponentKind, Class>();
private static Map<DistributionComponentKind, Map<String, Class>> factoryMap = new HashMap<DistributionComponentKind, Map<String, Class>>();
static {
registerKind(AGENT, DistributionAgent.class);
registerKind(IMPORTER, DistributionPackageImporter.class);
registerKind(EXPORTER, DistributionPackageExporter.class);
registerKind(QUEUE_PROVIDER, DistributionQueueProvider.class);
registerKind(QUEUE_STRATEGY, DistributionQueueDispatchingStrategy.class);
registerKind(TRANSPORT_SECRET_PROVIDER, DistributionTransportSecretProvider.class);
registerKind(REQUEST_AUTHORIZATION, DistributionRequestAuthorizationStrategy.class);
registerKind(PACKAGE_BUILDER, DistributionPackageBuilder.class);
registerKind(TRIGGER, DistributionTrigger.class);
// register "core" factories kind, type -> ComponentFactoryClass
registerFactory(DistributionComponentKind.AGENT, "simple", SimpleDistributionAgentFactory.class);
registerFactory(DistributionComponentKind.AGENT, "sync", SyncDistributionAgentFactory.class);
registerFactory(DistributionComponentKind.AGENT, "forward", ForwardDistributionAgentFactory.class);
registerFactory(DistributionComponentKind.AGENT, "reverse", ReverseDistributionAgentFactory.class);
registerFactory(DistributionComponentKind.AGENT, "queue", QueueDistributionAgentFactory.class);
registerFactory(DistributionComponentKind.EXPORTER, "local", LocalDistributionPackageExporterFactory.class);
registerFactory(DistributionComponentKind.EXPORTER, "remote", RemoteDistributionPackageExporterFactory.class);
registerFactory(DistributionComponentKind.EXPORTER, "agent", AgentDistributionPackageExporterFactory.class);
registerFactory(DistributionComponentKind.IMPORTER, "local", LocalDistributionPackageImporterFactory.class);
registerFactory(DistributionComponentKind.IMPORTER, "remote", RemoteDistributionPackageImporterFactory.class);
registerFactory(DistributionComponentKind.PACKAGE_BUILDER, "filevlt", VaultDistributionPackageBuilderFactory.class);
registerFactory(DistributionComponentKind.PACKAGE_BUILDER, "jcrvlt", VaultDistributionPackageBuilderFactory.class);
registerFactory(DistributionComponentKind.REQUEST_AUTHORIZATION, "privilege", PrivilegeDistributionRequestAuthorizationStrategy.class);
registerFactory(DistributionComponentKind.TRANSPORT_SECRET_PROVIDER, "user", UserCredentialsDistributionTransportSecretProvider.class);
registerFactory(DistributionComponentKind.TRIGGER, "resourceEvent", ResourceEventDistributionTriggerFactory.class);
registerFactory(DistributionComponentKind.TRIGGER, "scheduledEvent", ScheduledDistributionTriggerFactory.class);
registerFactory(DistributionComponentKind.TRIGGER, "distributionEvent", DistributionEventDistributeDistributionTriggerFactory.class);
registerFactory(DistributionComponentKind.TRIGGER, "persistedJcrEvent", PersistedJcrEventDistributionTriggerFactory.class);
registerFactory(DistributionComponentKind.TRIGGER, "jcrEvent", JcrEventDistributionTriggerFactory.class);
}
private final String name;
DistributionComponentKind(String name) {
this.name = name;
}
public Class asClass() {
return classMap.get(this);
}
public static DistributionComponentKind fromClass(Class type) {
for (DistributionComponentKind kind : classMap.keySet()) {
Class kindClass = classMap.get(kind);
if (kindClass.equals(type)) {
return kind;
}
}
return null;
}
public static DistributionComponentKind fromName(String name) {
for (DistributionComponentKind kind : classMap.keySet()) {
if (kind.getName().equals(name)) {
return kind;
}
}
return null;
}
public String getName() {
return name;
}
private static void registerKind(DistributionComponentKind kind, Class kindClass) {
classMap.put(kind, kindClass);
}
private static void registerFactory(DistributionComponentKind kind, String type, Class factoryClass) {
if (!factoryMap.containsKey(kind)) {
factoryMap.put(kind, new HashMap<String, Class>());
}
Map<String, Class> kindMap = factoryMap.get(kind);
kindMap.put(type, factoryClass);
}
public String getFactory(String type) {
Class factory = factoryMap.get(this).get(type);
return factory.getName();
}
public List<String> getFactories() {
List<String> result = new ArrayList<String>();
for (Class factory : factoryMap.get(this).values()) {
result.add(factory.getName());
}
return result;
}
public String getType(String factory) {
for (String type : factoryMap.get(this).keySet()) {
Class factoryClass = factoryMap.get(this).get(type);
if (factoryClass.getName().equals(factory)) {
return type;
}
}
return null;
}
}