X-Git-Url: https://git.hedgecode.org/?p=chesshog.git;a=blobdiff_plain;f=chesshog-dbetude%2Fsrc%2Fmain%2Fjava%2Forg%2Fhedgecode%2Fchess%2Fservice%2FServiceRegistry.java;fp=chesshog-dbetude%2Fsrc%2Fmain%2Fjava%2Forg%2Fhedgecode%2Fchess%2Fservice%2FServiceRegistry.java;h=a892bb95b5b0efc2bcd4aaba54c39a4e1c1462fb;hp=0000000000000000000000000000000000000000;hb=4d2b7f345d8079775373d95ab7c1a486cac96519;hpb=ccafd673bfcda89a75f428e58dc06525e1b0a368 diff --git a/chesshog-dbetude/src/main/java/org/hedgecode/chess/service/ServiceRegistry.java b/chesshog-dbetude/src/main/java/org/hedgecode/chess/service/ServiceRegistry.java new file mode 100644 index 0000000..a892bb9 --- /dev/null +++ b/chesshog-dbetude/src/main/java/org/hedgecode/chess/service/ServiceRegistry.java @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2018. Developed by Hedgecode. + * + * 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.hedgecode.chess.service; + +import java.util.Iterator; +import java.util.ServiceLoader; + +import org.hedgecode.chess.domain.Adapter; +import org.hedgecode.chess.domain.EtudeAdapter; +import org.hedgecode.chess.dto.EtudeDTO; +import org.hedgecode.chess.persistence.PersistenceManager; + +/** + * Service Provider Interface (SPI) Registry. + * + * @author Dmitry Samoshin aka gotty + */ +public final class ServiceRegistry { + + private ServiceRegistry() { + } + + public static Iterator providers(Class serviceClass) { + final Iterator providers = ServiceLoader.load(serviceClass).iterator(); + + if (!providers.hasNext()) { + throw new ServiceRegistryException("service.provider.not.found", serviceClass.getName()); + } + + return providers; + } + + public static ServiceType singleProvider(Class serviceClass) { + final Iterator providers = providers(serviceClass); + + ServiceType provider = providers.next(); + if (providers.hasNext()) { + throw new ServiceRegistryException("service.too.many.providers", serviceClass.getName()); + } + + return provider; + } + + public static AdapterType singleAdapter( + Class adapterClass, + Class targetClass) + { + AdapterType targetAdapter = null; + + final Iterator providers = providers(adapterClass); + + while (providers.hasNext()) { + AdapterType adapter = providers.next(); + if (adapter.getTargetClass().equals(targetClass)) { + if (targetAdapter != null) + throw new ServiceRegistryException( + "service.too.many.adapters", adapterClass.getName(), targetClass.getName() + ); + targetAdapter = adapter; + } + } + if (targetAdapter == null) + throw new ServiceRegistryException( + "service.adapter.not.found", adapterClass.getName(), targetClass.getName() + ); + + return targetAdapter; + } + + + public static void main(String... args) { + + AuthorService as = ServiceRegistry.singleProvider(AuthorService.class); + System.out.println(as); + PersistenceManager pm = ServiceRegistry.singleProvider(PersistenceManager.class); + System.out.println(pm); + EtudeAdapter ea = ServiceRegistry.singleAdapter(EtudeAdapter.class, EtudeDTO.class); + System.out.println(ea); + + } + +}