blob: 51af71dcb1cd4a0ae157b84ec1541b45467d54d9 [file] [log] [blame]
/********************************************************************************
* 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);
}
}