com.bayesian.network.client.factory.BayesianFactory.java Source code

Java tutorial

Introduction

Here is the source code for com.bayesian.network.client.factory.BayesianFactory.java

Source

/*
 * Copyright 2014 JBoss Inc
 *
 * 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 com.bayesian.network.client.factory;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.event.Event;
import javax.inject.Inject;

import com.bayesian.network.client.events.RenderBayesianNetworkEvent;
import com.bayesian.network.client.shapes.EditableBayesianNode;
import com.bayesian.network.client.utils.BayesianUtils;
import com.bayesian.parser.client.model.BayesNetwork;
import com.bayesian.parser.client.model.BayesVariable;
import com.bayesian.parser.client.service.BayesianService;
import com.emitrom.lienzo.client.core.shape.Rectangle;
import com.emitrom.lienzo.client.core.shape.Text;
import com.emitrom.lienzo.shared.core.types.Color;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.gwt.user.client.Window;
import org.jboss.errai.common.client.api.Caller;
import org.jboss.errai.common.client.api.ErrorCallback;
import org.jboss.errai.common.client.api.RemoteCallback;
import org.kie.wires.core.client.progressbar.ProgressBar;

@ApplicationScoped
public class BayesianFactory extends BaseFactory {

    @Inject
    private Caller<BayesianService> bayesianService;

    @Inject
    private Event<RenderBayesianNetworkEvent> readyEvent;

    private String[][] colors;
    private List<EditableBayesianNode> bayesianNodes = new ArrayList<EditableBayesianNode>();

    public void init(final String xml03File) {
        bayesianService.call(new RemoteCallback<BayesNetwork>() {
            @Override
            public void callback(final BayesNetwork response) {
                bayesianNodes.clear();
                for (BayesVariable bay : response.getNodos()) {
                    drawBayesianNode(bay);
                }
                readyEvent.fire(new RenderBayesianNetworkEvent(bayesianNodes));

            }
        }, new ErrorCallback<Object>() {

            @Override
            public boolean error(Object message, Throwable throwable) {
                Window.alert("Sorry.. the " + xml03File + " could not be read..");
                ProgressBar.setInfinite(false);
                return false;
            }
        }).buildXml03(BayesianUtils.XML3_RESOURCE_PATH + xml03File);
    }

    private void drawBayesianNode(BayesVariable node) {
        colors = BayesianUtils.getNodeColors();
        double position[][] = node.getPosition();
        int positionX = (int) (BayesianUtils.POSITION_X_BASE + Math.round(position[0][0]));
        int positionY = (int) (BayesianUtils.POSITION_Y_BASE + Math.round(position[0][1]));
        String fillNodeColor = colors[0][0];

        EditableBayesianNode bayesianNode = new EditableBayesianNode(BayesianUtils.WIDTH_NODE,
                BayesianUtils.HEIGHT_NODE, positionX, positionY, fillNodeColor, node);

        this.setHeader(node, bayesianNode);
        this.setPorcentualBar(node, bayesianNode);

        bayesianNode.buildNode();

        bayesianNodes.add(bayesianNode);
    }

    private void setHeader(BayesVariable node, EditableBayesianNode bayesianNode) {
        bayesianNode.setHeader(new Rectangle(bayesianNode.getWidth(), BayesianUtils.HEIGHT_HEADER));
        bayesianNode.getHeader().setFillColor(colors[0][1]);
        bayesianNode.getHeader().setX(bayesianNode.getHeader().getX());
        bayesianNode.setTextHeader(drawText(node.getName(), BayesianUtils.FONT_SIZE_HEADER_NODE,
                BayesianUtils.LABEL_POSITION_X_DEFAULT, BayesianUtils.LABEL_POSITION_Y_DEFAULT));
    }

    private void setPorcentualBar(BayesVariable node, EditableBayesianNode bayesianNode) {
        String fillColor = colors[0][1];
        int widthFill;
        int positionY = 18;
        positionY = (node.getOutcomes().size() > 3) ? positionY - 10 : positionY;
        String borderColor = fillColor;

        List<Rectangle> componentsProgressBar = Lists.newArrayList();
        Text labelPorcentual;
        Map<Text, List<Rectangle>> porcentualsBar = Maps.newHashMap();
        for (int i = 0; i < node.getOutcomes().size(); i++) {
            // Porcentual bar
            positionY += 14;
            labelPorcentual = this.drawText(node.getOutcomes().get(i), BayesianUtils.FONT_SIZE_PORCENTUAL_BAR,
                    BayesianUtils.LABEL_POSITION_X_DEFAULT, positionY + 7);
            componentsProgressBar.add(this.drawComponent(Color.rgbToBrowserHexColor(255, 255, 255),
                    BayesianUtils.POSITION_X_PORCENTUAL_BAR, positionY, BayesianUtils.WIDTH_PORCENTUAL_BAR,
                    BayesianUtils.HEIGHT_PORCENTUAL_BAR, borderColor, 3));
            // fill bar
            widthFill = calculatePorcentage(node.getProbabilities(), BayesianUtils.WIDTH_PORCENTUAL_BAR, i);
            componentsProgressBar.add(drawComponent(fillColor, BayesianUtils.POSITION_X_PORCENTUAL_BAR, positionY,
                    widthFill, BayesianUtils.HEIGHT_PORCENTUAL_BAR, borderColor, 0));
            bayesianNode.getPorcentualsBar().put(labelPorcentual, componentsProgressBar);

            porcentualsBar.put(labelPorcentual, componentsProgressBar);
        }
        bayesianNode.setPorcentualBars(porcentualsBar);
    }

    private int calculatePorcentage(double probabilities[][], int maxWidthFill, int position) {
        double porcentual = 0;
        if (position == 0) {
            porcentual = probabilities[0][0];
        } else if (position == 1) {
            porcentual = probabilities[0][1];
        }
        porcentual *= 100;
        return (int) ((porcentual * maxWidthFill) / 100);
    }

}