/* * 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.registry.impl; import java.util.ArrayList; import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.logging.Logger; import org.kie.workbench.common.stunner.core.api.AbstractDefinitionManager; import org.kie.workbench.common.stunner.core.definition.adapter.Adapter; import org.kie.workbench.common.stunner.core.definition.adapter.DefinitionAdapter; import org.kie.workbench.common.stunner.core.definition.adapter.DefinitionSetAdapter; import org.kie.workbench.common.stunner.core.definition.adapter.DefinitionSetRuleAdapter; import org.kie.workbench.common.stunner.core.definition.adapter.MorphAdapter; import org.kie.workbench.common.stunner.core.definition.adapter.PriorityAdapter; import org.kie.workbench.common.stunner.core.definition.adapter.PropertyAdapter; import org.kie.workbench.common.stunner.core.definition.adapter.PropertySetAdapter; import org.kie.workbench.common.stunner.core.definition.adapter.exception.AdapterNotFoundException; import org.kie.workbench.common.stunner.core.registry.DynamicRegistry; import org.kie.workbench.common.stunner.core.registry.definition.AdapterRegistry; public class AdapterRegistryImpl implements AdapterRegistry, DynamicRegistry<Adapter> { private static Logger LOGGER = Logger.getLogger(AbstractDefinitionManager.class.getName()); private final List<DefinitionSetAdapter> definitionSetAdapters = new LinkedList<>(); private final List<DefinitionSetRuleAdapter> definitionSetRuleAdapters = new LinkedList<>(); private final List<DefinitionAdapter> definitionAdapters = new LinkedList<>(); private final List<PropertySetAdapter> propertySetAdapters = new ArrayList<PropertySetAdapter>(); private final List<PropertyAdapter> propertyAdapters = new LinkedList<>(); private final List<MorphAdapter> morphAdapters = new LinkedList<>(); @Override @SuppressWarnings("unchecked") public <T> DefinitionSetAdapter<T> getDefinitionSetAdapter(final Class<?> type) { for (DefinitionSetAdapter adapter : definitionSetAdapters) { if (adapter.accepts(type)) { return adapter; } } return nullHandling(DefinitionSetAdapter.class, type); } @Override @SuppressWarnings("unchecked") public <T> DefinitionSetRuleAdapter<T> getDefinitionSetRuleAdapter(final Class<?> type) { for (DefinitionSetRuleAdapter adapter : definitionSetRuleAdapters) { if (adapter.accepts(type)) { return adapter; } } return nullHandling(DefinitionSetRuleAdapter.class, type); } @Override @SuppressWarnings("unchecked") public <T> DefinitionAdapter<T> getDefinitionAdapter(final Class<?> type) { for (DefinitionAdapter adapter : definitionAdapters) { if (adapter.accepts(type)) { return adapter; } } return nullHandling(DefinitionAdapter.class, type); } @Override @SuppressWarnings("unchecked") public <T> PropertySetAdapter<T> getPropertySetAdapter(final Class<?> type) { for (PropertySetAdapter adapter : propertySetAdapters) { if (adapter.accepts(type)) { return adapter; } } return nullHandling(PropertySetAdapter.class, type); } @Override @SuppressWarnings("unchecked") public <T> PropertyAdapter<T, ?> getPropertyAdapter(final Class<?> type) { for (PropertyAdapter adapter : propertyAdapters) { if (adapter.accepts(type)) { return adapter; } } return nullHandling(PriorityAdapter.class, type); } @Override @SuppressWarnings("unchecked") public <T> MorphAdapter<T> getMorphAdapter(final Class<?> type) { for (MorphAdapter adapter : morphAdapters) { if (adapter.accepts(type)) { return adapter; } } return null; } @Override @SuppressWarnings("unchecked") public void register(final Adapter item) { boolean registered = false; if (item instanceof DefinitionSetAdapter) { definitionSetAdapters.add((DefinitionSetAdapter) item); sortAdapters(definitionSetAdapters); registered = true; } else if (item instanceof DefinitionSetRuleAdapter) { definitionSetRuleAdapters.add((DefinitionSetRuleAdapter) item); sortAdapters(definitionSetRuleAdapters); registered = true; } else if (item instanceof DefinitionAdapter) { definitionAdapters.add((DefinitionAdapter) item); sortAdapters(definitionAdapters); registered = true; } else if (item instanceof PropertySetAdapter) { propertySetAdapters.add((PropertySetAdapter) item); sortAdapters(propertySetAdapters); registered = true; } else if (item instanceof PropertyAdapter) { propertyAdapters.add((PropertyAdapter) item); sortAdapters(propertyAdapters); registered = true; } else if (item instanceof MorphAdapter) { morphAdapters.add((MorphAdapter) item); registered = true; } if (!registered) { final String em = "Cannot register Adapter for type [" + item.getClass().getName() + "]. Type not supported."; LOGGER.severe(em); throw new IllegalArgumentException(em); } } @Override @SuppressWarnings("unchecked") public boolean contains(final Adapter item) { if (item instanceof DefinitionSetAdapter) { return definitionSetAdapters.contains(item); } else if (item instanceof DefinitionSetRuleAdapter) { return definitionSetRuleAdapters.contains(item); } else if (item instanceof DefinitionAdapter) { return definitionAdapters.contains(item); } else if (item instanceof PropertySetAdapter) { return propertySetAdapters.contains(item); } else if (item instanceof PropertyAdapter) { return propertyAdapters.contains(item); } else if (item instanceof MorphAdapter) { return morphAdapters.contains(item); } return false; } @Override public boolean isEmpty() { return definitionSetAdapters.isEmpty() && definitionSetRuleAdapters.isEmpty() && definitionAdapters.isEmpty() && propertySetAdapters.isEmpty() && propertyAdapters.isEmpty() && morphAdapters.isEmpty(); } @Override @SuppressWarnings("unchecked") public boolean remove(final Adapter item) { if (item instanceof DefinitionSetAdapter) { return definitionSetAdapters.remove(item); } else if (item instanceof DefinitionSetRuleAdapter) { return definitionSetRuleAdapters.remove(item); } else if (item instanceof DefinitionAdapter) { return definitionAdapters.remove(item); } else if (item instanceof PropertySetAdapter) { return propertySetAdapters.remove(item); } else if (item instanceof PropertyAdapter) { return propertyAdapters.remove(item); } else if (item instanceof MorphAdapter) { return morphAdapters.remove(item); } return false; } private static <T extends PriorityAdapter> void sortAdapters(final List<T> adapters) { Collections.sort(adapters, (o1, o2) -> o1.getPriority() - o2.getPriority()); } private <T> T nullHandling(final Class<? extends Adapter> adapterType, Class<?> type) { final AdapterNotFoundException exception = new AdapterNotFoundException(adapterType, type); LOGGER.severe(exception.getMessage()); throw exception; } }