/******************************************************************************** | |
* Copyright (c) 2015-2021 Contributors to the Eclipse Foundation | |
* | |
* See the NOTICE file(s) distributed with this work for additional | |
* information regarding copyright ownership. | |
* | |
* This program and the accompanying materials are made available under the | |
* terms of the Eclipse Public License v. 2.0 which is available at | |
* http://www.eclipse.org/legal/epl-2.0. | |
* | |
* SPDX-License-Identifier: EPL-2.0 | |
* | |
********************************************************************************/ | |
package org.eclipse.mdm.nodeprovider.control; | |
import java.io.Serializable; | |
import java.security.Principal; | |
import java.util.HashMap; | |
import java.util.List; | |
import java.util.Map; | |
import javax.annotation.PostConstruct; | |
import javax.enterprise.context.SessionScoped; | |
import javax.inject.Inject; | |
import org.eclipse.mdm.connector.boundary.ConnectorService; | |
import org.eclipse.mdm.nodeprovider.entity.NodeProvider; | |
import org.eclipse.mdm.nodeprovider.entity.NodeProviderRoot; | |
import org.eclipse.mdm.nodeprovider.utils.SerializationUtil; | |
import org.eclipse.mdm.preferences.controller.PreferenceService; | |
import org.eclipse.mdm.preferences.entity.PreferenceMessage; | |
import org.slf4j.Logger; | |
import org.slf4j.LoggerFactory; | |
/** | |
* Repository for NodeProviders in a specific session. | |
* | |
*/ | |
@SessionScoped | |
public class NodeProviderRepository implements Serializable { | |
private static final long serialVersionUID = -3081666937067348673L; | |
private static final Logger LOG = LoggerFactory.getLogger(NodeProviderRepository.class); | |
private Map<String, NodeProvider> nodeProviders = new HashMap<>(); | |
@Inject | |
private ConnectorService connectorService; | |
@Inject | |
private PreferenceService preferenceService; | |
@Inject | |
Principal principal; | |
/** | |
* Default constructor | |
*/ | |
public NodeProviderRepository() { | |
} | |
/** | |
* Constructor for unit tests. | |
* | |
* @param connectorService | |
* @param preferenceService | |
*/ | |
public NodeProviderRepository(ConnectorService connectorService, PreferenceService preferenceService) { | |
this.connectorService = connectorService; | |
this.preferenceService = preferenceService; | |
init(); | |
} | |
/** | |
* Initializes the NodeProviderRepository | |
*/ | |
@PostConstruct | |
public void init() { | |
LOG.debug("Initializing NodeProviderRepository for user ", principal.getName()); | |
DefaultNodeProvider defaultNP = new DefaultNodeProvider(connectorService); | |
putNodeProvider("default", defaultNP); | |
LOG.trace("Registered default nodeprovider."); | |
MDMExpressionLanguageService expressionLanguageService = new MDMExpressionLanguageService(); | |
List<PreferenceMessage> msgs = preferenceService.getPreferences("system", "nodeprovider."); | |
for (PreferenceMessage msg : msgs) { | |
try { | |
NodeProviderRoot root = parsePreference(msg.getValue()); | |
putNodeProvider(root.getId(), | |
new GenericNodeProvider(connectorService, root, expressionLanguageService)); | |
LOG.trace("Registered generic nodeprovider '{}'.", root.getId()); | |
} catch (RuntimeException e) { | |
e.printStackTrace(); | |
LOG.warn("Could not deserialize nodeprovider configuration: {}", msg.getValue(), e); | |
} | |
} | |
} | |
/** | |
* Add a nodeprovider to the repository. | |
* | |
* @param id ID of the nodeprovider | |
* @param nodeProvider {@link NodeProvider} | |
*/ | |
public void putNodeProvider(String id, NodeProvider nodeProvider) { | |
nodeProviders.put(id, nodeProvider); | |
} | |
/** | |
* @return a map of all registered nodeproviders indexed by ID | |
*/ | |
public Map<String, NodeProvider> getNodeProviders() { | |
return nodeProviders; | |
} | |
/** | |
* Parse a JSON string representing a {@link NodeProviderRoot} | |
* | |
* @param json JSON string | |
* @return parsed {@link NodeProviderRoot} | |
*/ | |
private NodeProviderRoot parsePreference(String json) { | |
return SerializationUtil.deserializeNodeProviderRoot(connectorService, json); | |
} | |
} |