/** * * Copyright (C) norad.fr * * 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 fr.norad.visuwall.core.business.service; import java.net.URL; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.ServiceLoader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import com.google.common.base.Preconditions; import fr.norad.visuwall.api.domain.SoftwareId; import fr.norad.visuwall.api.exception.SoftwareNotFoundException; import fr.norad.visuwall.api.plugin.VisuwallPlugin; import fr.norad.visuwall.api.plugin.capability.BasicCapability; import fr.norad.visuwall.api.plugin.capability.ViewCapability; import fr.norad.visuwall.core.business.domain.CapabilityEnum; import fr.norad.visuwall.core.business.domain.PluginInfo; import fr.norad.visuwall.core.business.domain.SoftwareInfo; @Service public class VisuwallSpiService implements PluginServiceInterface { private static final Logger LOG = LoggerFactory.getLogger(VisuwallSpiService.class); @SuppressWarnings("rawtypes") private ServiceLoader<VisuwallPlugin> pluginLoader = ServiceLoader.load(VisuwallPlugin.class); @Override public List<VisuwallPlugin<BasicCapability>> getPlugins() { @SuppressWarnings("rawtypes") Iterator<VisuwallPlugin> pluginIt = pluginLoader.iterator(); List<VisuwallPlugin<BasicCapability>> result = new ArrayList<VisuwallPlugin<BasicCapability>>(); while (pluginIt.hasNext()) { @SuppressWarnings("unchecked") VisuwallPlugin<BasicCapability> plugin = pluginIt.next(); result.add(plugin); } return result; } @Override public BasicCapability getPluginConnectionFromUrl(URL url, Map<String, String> properties) { for (VisuwallPlugin<BasicCapability> visuwallPlugin : getPlugins()) { try { visuwallPlugin.getSoftwareId(url, properties); return visuwallPlugin.getConnection(url, properties); } catch (SoftwareNotFoundException e) { if (LOG.isInfoEnabled()) { LOG.info("Plugin " + visuwallPlugin + " can't manage url " + url); } } catch (Throwable e) { LOG.warn("Plugin " + visuwallPlugin + " throws exception on url " + url, e); } } throw new RuntimeException("no plugin to manage url " + url); } @Override public SoftwareInfo getSoftwareInfoFromUrl(URL url, Map<String, String> properties) { for (VisuwallPlugin<BasicCapability> visuwallPlugin : getPlugins()) { SoftwareId softwareId = null; BasicCapability connectionPlugin = null; try { softwareId = visuwallPlugin.getSoftwareId(url, properties); Preconditions.checkNotNull(softwareId, "isManageable() should not return null", visuwallPlugin); SoftwareInfo softwareInfo = new SoftwareInfo(); softwareInfo.setSoftwareId(softwareId); softwareInfo.setPluginInfo(getPluginInfo(visuwallPlugin)); connectionPlugin = visuwallPlugin.getConnection(url, properties); softwareInfo.setProjectNames(connectionPlugin.listSoftwareProjectIds()); if (connectionPlugin instanceof ViewCapability) { softwareInfo.setViewNames(((ViewCapability) connectionPlugin).findViews()); } return softwareInfo; } catch (SoftwareNotFoundException e) { LOG.debug("Plugin " + visuwallPlugin + " can not manage url " + url); } catch (Throwable e) { LOG.warn("Plugin " + visuwallPlugin + " throws exception on url " + url, e); } finally { if (connectionPlugin != null) { connectionPlugin.close(); } } } throw new RuntimeException("no plugin to manage url " + url); } @Override public PluginInfo getPluginInfo(VisuwallPlugin<BasicCapability> visuwallPlugin) { PluginInfo pluginInfo = new PluginInfo(); pluginInfo.setName(visuwallPlugin.getName()); pluginInfo.setVersion(visuwallPlugin.getVersion()); pluginInfo.setProperties(visuwallPlugin.getPropertiesWithDefaultValue()); Class<BasicCapability> connectionClass = visuwallPlugin.getConnectionClass(); pluginInfo.setCapabilities(CapabilityEnum.getCapabilitiesForClass(connectionClass)); return pluginInfo; } @Override public List<PluginInfo> getPluginsInfo() { List<VisuwallPlugin<BasicCapability>> visuwallPlugins = getPlugins(); List<PluginInfo> pluginInfos = new ArrayList<PluginInfo>(visuwallPlugins.size()); for (VisuwallPlugin<BasicCapability> visuwallPlugin : visuwallPlugins) { PluginInfo pluginInfo = getPluginInfo(visuwallPlugin); pluginInfos.add(pluginInfo); } return pluginInfos; } }