/* * Copyright 2016 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.api; import org.kie.workbench.common.stunner.core.definition.adapter.binding.BindableAdapterUtils; import org.kie.workbench.common.stunner.core.diagram.Diagram; import org.kie.workbench.common.stunner.core.diagram.Metadata; 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.graph.Element; import org.kie.workbench.common.stunner.core.graph.Graph; import org.kie.workbench.common.stunner.core.graph.content.definition.Definition; import org.kie.workbench.common.stunner.core.graph.content.definition.DefinitionSet; import org.kie.workbench.common.stunner.core.registry.RegistryFactory; import org.kie.workbench.common.stunner.core.registry.factory.FactoryRegistry; import org.kie.workbench.common.stunner.core.util.UUID; public abstract class AbstractFactoryManager { private final FactoryRegistry factoryRegistry; private final DefinitionManager definitionManager; public AbstractFactoryManager(final RegistryFactory registryFactory, final DefinitionManager definitionManager) { this.factoryRegistry = null != registryFactory ? registryFactory.newFactoryRegistry() : null; this.definitionManager = definitionManager; } @SuppressWarnings("unchecked") public <T> T newDefinition(final String id) { final DefinitionFactory<T> factory = factoryRegistry.getDefinitionFactory(id); return factory.build(id); } public <T> T newDefinition(final Class<T> type) { final String id = BindableAdapterUtils.getDefinitionId(type, definitionManager.adapters().registry()); return newDefinition(id); } public Element<?> newElement(final String uuid, final String id) { final Object defSet = getDefinitionSet(id); final boolean isDefSet = null != defSet; return !isDefSet ? doBuildElement(uuid, id) : doBuildGraph(uuid, id, defSet); } public Element<?> newElement(final String uuid, final Class<?> type) { final String id = BindableAdapterUtils.getGenericClassName(type); return newElement(uuid, id); } private Object getDefinitionSet(final String id) { return definitionManager.definitionSets().getDefinitionSetById(id); } @SuppressWarnings("unchecked") public <M extends Metadata, D extends Diagram> D newDiagram(final String name, final String id, final M metadata) { final Graph<DefinitionSet, ?> graph = (Graph<DefinitionSet, ?>) newElement(UUID.uuid(), id); return (D) checkDiagramFactoryNotNull(graph.getContent().getDefinition(), metadata).build(name, metadata, graph); } @SuppressWarnings("unchecked") private <M extends Metadata> DiagramFactory<M, ?> checkDiagramFactoryNotNull(final String defSetid, final M metadata) { final DiagramFactory<M, ?> factory = registry().getDiagramFactory(defSetid, metadata.getMetadataType()); if (null == factory) { throw new IllegalArgumentException("No diagram factory found for [" + defSetid + "] and " + "metadata type [" + metadata.getClass() + "]"); } return factory; } public <M extends Metadata, D extends Diagram> D newDiagram(final String uuid, final Class<?> type, final M metadata) { final String id = BindableAdapterUtils.getDefinitionSetId(type, definitionManager.adapters().registry()); return newDiagram(uuid, id, metadata); } public FactoryRegistry registry() { return factoryRegistry; } protected DefinitionManager getDefinitionManager() { return definitionManager; } @SuppressWarnings("unchecked") private <T, C extends Definition<T>> Element<C> doBuildElement(final String uuid, final String definitionId) { final T definition = newDefinition(definitionId); final Class<? extends ElementFactory> factoryType = definitionManager.adapters().forDefinition().getGraphFactoryType(definition); final ElementFactory<T, C, Element<C>> factory = factoryRegistry.getElementFactory(factoryType); return factory.build(uuid, definition); } @SuppressWarnings("unchecked") private <C extends DefinitionSet> Element<C> doBuildGraph(final String uuid, final String defSetId, final Object defSet) { final Class<? extends ElementFactory> factoryType = definitionManager.adapters().forDefinitionSet().getGraphFactoryType(defSet); final ElementFactory<String, DefinitionSet, Element<DefinitionSet>> factory = factoryRegistry.getElementFactory(factoryType); return (Element<C>) factory.build(uuid, defSetId); } }