/*
* Copyright 2017 Red Hat, Inc. and/or its affiliates.
*
* Licensed 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.kie.workbench.common.stunner.core.registry.impl;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.kie.workbench.common.stunner.core.definition.adapter.AdapterManager;
import org.kie.workbench.common.stunner.core.definition.adapter.binding.BindableAdapterUtils;
import org.kie.workbench.common.stunner.core.diagram.Metadata;
import org.kie.workbench.common.stunner.core.factory.Factory;
import org.kie.workbench.common.stunner.core.factory.definition.DefinitionFactory;
import org.kie.workbench.common.stunner.core.factory.diagram.DiagramFactory;
import org.kie.workbench.common.stunner.core.factory.graph.ElementFactory;
import org.kie.workbench.common.stunner.core.registry.factory.TypeFactoryRegistry;
class FactoryRegistryImpl<T extends Factory<?>> implements TypeFactoryRegistry<T> {
private final AdapterManager adapterManager;
private final List<DefinitionFactory<?>> definitionFactories = new LinkedList<>();
private final Map<Class<? extends ElementFactory>, ElementFactory<?, ?, ?>> graphFactories =
new HashMap<>();
private final List<DiagramFactory<?, ?>> diagramFactories
= new LinkedList<>();
FactoryRegistryImpl(final AdapterManager adapterManager) {
this.adapterManager = adapterManager;
}
@Override
public DefinitionFactory<?> getDefinitionFactory(final String id) {
for (final DefinitionFactory<?> factory : definitionFactories) {
if (factory.accepts(id)) {
return factory;
}
}
return null;
}
@Override
public ElementFactory<?, ?, ?> getElementFactory(final Class<? extends ElementFactory> type) {
return graphFactories.get(type);
}
@Override
@SuppressWarnings("unchecked")
public DiagramFactory<?, ?> getDiagramFactory(final String defSetId,
final Class<? extends Metadata> metadataType) {
return diagramFactories.stream()
.filter(factory -> !factory.isDefault()
&& factory.accepts(defSetId)
&& metadataType.equals(factory.getMetadataType()))
.findFirst()
.orElseGet(() -> getDefaultDiagramFactory(defSetId,
metadataType));
}
private DiagramFactory<?, ?> getDefaultDiagramFactory(final String defSetId,
final Class<? extends Metadata> metadataType) {
return diagramFactories.stream()
.filter(factory -> factory.isDefault()
&& factory.accepts(defSetId)
&& metadataType.equals(factory.getMetadataType()))
.findFirst()
.orElse(null);
}
@Override
@SuppressWarnings("unchecked")
public void register(final T item) {
if (item instanceof DefinitionFactory) {
definitionFactories.add((DefinitionFactory<?>) item);
} else if (item instanceof ElementFactory) {
graphFactories.put(((ElementFactory) item).getFactoryType(),
(ElementFactory<?, ?, ?>) item);
} else if (item instanceof DiagramFactory) {
diagramFactories.add((DiagramFactory<?, ?>) item);
}
}
@Override
public boolean remove(final T item) {
if (item instanceof DefinitionFactory) {
return definitionFactories.remove(item);
} else if (item instanceof ElementFactory) {
return null != graphFactories.remove(((ElementFactory) item).getFactoryType());
} else if (item instanceof DiagramFactory) {
return diagramFactories.remove(item);
}
return false;
}
@Override
public void clear() {
definitionFactories.clear();
graphFactories.clear();
diagramFactories.clear();
}
@Override
public boolean contains(final T item) {
if (item instanceof DefinitionFactory) {
return definitionFactories.contains(item);
} else if (item instanceof ElementFactory) {
return graphFactories.containsValue(item);
} else if (item instanceof DiagramFactory) {
return diagramFactories.contains(item);
}
return false;
}
@Override
public boolean isEmpty() {
return definitionFactories.isEmpty() && graphFactories.isEmpty();
}
@Override
@SuppressWarnings("unchecked")
public Collection<T> getAllFactories() {
return new LinkedList<T>() {{
addAll((Collection<? extends T>) definitionFactories);
addAll((Collection<? extends T>) diagramFactories);
addAll((Collection<? extends T>) graphFactories.values());
}};
}
@Override
public DefinitionFactory<?> getDefinitionFactory(final Class<?> type) {
final String id = BindableAdapterUtils.getDefinitionId(type,
adapterManager.registry());
return getDefinitionFactory(id);
}
}