org.openscada.configurator.GenericMasterConfiguration.java Source code

Java tutorial

Introduction

Here is the source code for org.openscada.configurator.GenericMasterConfiguration.java

Source

/*
 * This file is part of the openSCADA project
 * Copyright (C) 2006-2012 TH4 SYSTEMS GmbH (http://th4-systems.com)
 *
 * openSCADA is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License version 3
 * only, as published by the Free Software Foundation.
 *
 * openSCADA is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License version 3 for more details
 * (a copy is included in the LICENSE file that accompanied this code).
 *
 * You should have received a copy of the GNU Lesser General Public License
 * version 3 along with openSCADA. If not, see
 * <http://opensource.org/licenses/lgpl-3.0.html> for a copy of the LGPLv3 License.
 */

package org.openscada.configurator;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Pattern;

import org.openscada.configurator.data.rule.RuleEncoder;
import org.openscada.configurator.sec.Rule;
import org.openscada.configurator.sec.Rules;
import org.openscada.utils.str.StringHelper;

import com.google.common.collect.Lists;

public class GenericMasterConfiguration extends GenericConfiguration {

    private static final String FACTORY_DA_MASTER_HANDLER_SUM = "da.master.handler.sum";

    private static class PriorityEntry {
        private final String factoryId;

        private final Pattern configurationFilter;

        private final int defaultPriority;

        public PriorityEntry(final String factoryId, final Pattern configurationFilter, final int defaultPriority) {
            super();
            this.factoryId = factoryId;
            this.configurationFilter = configurationFilter;
            this.defaultPriority = defaultPriority;
        }

        public Pattern getConfigurationFilter() {
            return this.configurationFilter;
        }

        public int getDefaultPriority() {
            return this.defaultPriority;
        }

        public String getFactoryId() {
            return this.factoryId;
        }
    }

    private final List<PriorityEntry> priorities = new LinkedList<GenericMasterConfiguration.PriorityEntry>();

    public void addMaster(final String id, final String dataSourceId) {
        final Map<String, String> data = new HashMap<String, String>();

        data.put("datasource.id", dataSourceId); //$NON-NLS-1$

        addData("master.item", id, data); //$NON-NLS-1$
    }

    public void addConnection(final String id, final String connectionUri) {
        final Map<String, String> data = new HashMap<String, String>();

        data.put("connection.uri", connectionUri); //$NON-NLS-1$

        addData("da.connection", id, data); //$NON-NLS-1$
    }

    public void addConnection(final String id, final String type, final String connectionUri) {
        final Map<String, String> data = new HashMap<String, String>();

        data.put("connection.uri", connectionUri); //$NON-NLS-1$

        addData(type + ".connection", id, data); //$NON-NLS-1$
    }

    public void addAlias(final String id, final String itemId, final String dataSourceId,
            final String description) {
        final Map<String, String> data = new HashMap<String, String>();

        data.put("datasource.id", dataSourceId); //$NON-NLS-1$
        data.put("item.id", itemId); //$NON-NLS-1$
        if (description != null) {
            data.put("description", description); //$NON-NLS-1$
        }

        addData("da.dataitem.datasource", id, data); //$NON-NLS-1$
    }

    protected void addAttributeSummaries(final String masterId, final int level) {
        final int num = (level - 1) * 2 + 1;

        // we set the prefix but not the id, since that won't collide

        addSum(masterId + ".sum.phase1", masterId, new String[] { "error" }, String.format("phase%d", num)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
        addSum(masterId + ".sum.phase2", masterId, new String[] { "manual", "error", "alarm", "warning", "info", //$NON-NLS-1$//$NON-NLS-2$
                "error.ackRequired", "alarm.ackRequired", "warning.ackRequired", "blocked" },
                String.format("phase%d", num + 1));
    }

    protected void addSum(final String id, final String masterId, final String[] tags, final String prefix) {
        final Map<String, String> data = new HashMap<String, String>();

        data.put("master.id", masterId); //$NON-NLS-1$
        fillMasterHandlerPriority(FACTORY_DA_MASTER_HANDLER_SUM, id, data, null);

        data.put("tag", StringHelper.join(tags, ", ")); //$NON-NLS-1$

        for (final String tag : tags) {
            if (prefix != null) {
                data.put("tag." + tag + ".prefix", prefix); //$NON-NLS-1$
            }
        }
        addData(FACTORY_DA_MASTER_HANDLER_SUM, id, data);
    }

    public void addSource(final String id, final String itemId, final String connectionId) {
        final Map<String, String> data = new HashMap<String, String>();

        data.put("item.id", itemId); //$NON-NLS-1$
        data.put("connection.id", connectionId); //$NON-NLS-1$

        addData("da.datasource.dataitem", id, data); //$NON-NLS-1$
    }

    public void addProxy(final String id, final String... sources) {
        addProxy(id, new HashSet<String>(Arrays.asList(sources)));
    }

    public void addProxy(final String id, final Set<String> sources) {
        final Map<String, String> data = new HashMap<String, String>();

        final List<String> sourceList = new ArrayList<String>(sources);
        Collections.sort(sourceList);

        data.put("sources", StringHelper.join(sourceList, ", "));

        addData("da.datasource.proxy", id, data); //$NON-NLS-1$
    }

    protected void addMapperHandler(final String masterId, final String id, final String mapperId,
            final String fromAttribute, final String toAttribute) {
        final Map<String, String> data = new HashMap<String, String>();

        data.put("master.id", masterId);
        data.put("mapper.id", mapperId);
        if (fromAttribute != null && !fromAttribute.isEmpty()) {
            data.put("sourceAttributeName", fromAttribute);
        }
        if (toAttribute != null && !toAttribute.isEmpty()) {
            data.put("targetAttributeName", toAttribute);
        }

        addData("org.openscada.da.master.mapper", id, data);
    }

    protected void fillMasterHandlerPriority(final String factoryId, final String configurationId,
            final Map<String, String> data, final Integer handlerPriority) {
        if (handlerPriority != null) {
            data.put("handlerPriority", "" + handlerPriority); //$NON-NLS-1$
        } else {
            final Integer priority = getDefaultPriority(factoryId, configurationId, null);
            if (priority != null) {
                data.put("handlerPriority", "" + priority);
            }
        }
    }

    public void addPriority(final String factoryId, final Pattern configurationFilter, final int defaultPriority) {
        this.priorities.add(new PriorityEntry(factoryId, configurationFilter, defaultPriority));
    }

    protected Integer getDefaultPriority(final String factoryId, final String configurationId,
            final Integer defaultPriority) {
        for (final PriorityEntry entry : this.priorities) {
            if (entry.getFactoryId() != null && !entry.getFactoryId().equals(factoryId)) {
                continue;
            }
            if (entry.getConfigurationFilter() != null
                    && !entry.getConfigurationFilter().matcher(configurationId).matches()) {
                continue;
            }
            return entry.getDefaultPriority();
        }
        System.out.println(String.format("WARN: no defaultPriority for %s / %s", factoryId, configurationId));
        return defaultPriority;
    }

    public void addAuthorizationScript(final String id, final String script, final int priority,
            final String idFilter, final String typeFilter, final String actionFilter) {
        final Map<String, String> data = new HashMap<String, String>();
        data.put("script", script); //$NON-NLS-1$
        data.put("priority", "" + priority); //$NON-NLS-1$ //$NON-NLS-2$
        data.put("for.id", idFilter); //$NON-NLS-1$
        data.put("for.type", typeFilter); //$NON-NLS-1$
        data.put("for.action", actionFilter); //$NON-NLS-1$
        addData("org.openscada.sec.provider.script.factory", id, data); //$NON-NLS-1$
    }

    public void addSecurityRules(final Rules rules) {
        int priority = 1000;

        for (final Rule rule : Lists.reverse(rules.getRules())) {
            final RuleEncoder encoder = RuleEncoder.findEncoder(rule);
            if (encoder != null) {
                encoder.encodeRule(this, priority += 100);
            }
        }
    }

}