org.openhab.habdroid.model.OpenHABWidgetDataSource.java Source code

Java tutorial

Introduction

Here is the source code for org.openhab.habdroid.model.OpenHABWidgetDataSource.java

Source

/*
 * Copyright (c) 2010-2016, openHAB.org and others.
 *
 *   All rights reserved. This program and the accompanying materials
 *   are made available under the terms of the Eclipse Public License v1.0
 *   which accompanies this distribution, and is available at
 *   http://www.eclipse.org/legal/epl-v10.html
 */

package org.openhab.habdroid.model;

import android.util.Log;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import java.util.ArrayList;

/**
 * This class provides datasource for openHAB widgets from sitemap page.
 * It uses a sitemap page XML document to create a list of widgets
 */

public class OpenHABWidgetDataSource {
    private static final String TAG = OpenHABWidgetDataSource.class.getSimpleName();
    private final String iconFormat;
    private OpenHABWidget rootWidget;
    private String title;
    private String id;
    private String icon;
    private String link;

    public OpenHABWidgetDataSource(String iconFormat) {
        this.iconFormat = iconFormat;
    }

    public void setSourceNode(Node rootNode) {
        Log.i(TAG, "Loading new data");
        if (rootNode == null)
            return;
        rootWidget = new OpenHAB1Widget();
        rootWidget.setType("root");
        if (rootNode.hasChildNodes()) {
            NodeList childNodes = rootNode.getChildNodes();
            for (int i = 0; i < childNodes.getLength(); i++) {
                Node childNode = childNodes.item(i);
                if (childNode.getNodeName().equals("widget")) {
                    OpenHAB1Widget.createOpenHABWidgetFromNode(rootWidget, childNode);
                } else if (childNode.getNodeName().equals("title")) {
                    this.setTitle(childNode.getTextContent());
                } else if (childNode.getNodeName().equals("id")) {
                    this.setId(childNode.getTextContent());
                } else if (childNode.getNodeName().equals("icon")) {
                    this.setIcon(childNode.getTextContent());
                } else if (childNode.getNodeName().equals("link")) {
                    this.setLink(childNode.getTextContent());
                }
            }
        }
    }

    public void setSourceJson(JSONObject jsonObject) {
        Log.d(TAG, jsonObject.toString());
        if (!jsonObject.has("widgets"))
            return;
        rootWidget = new OpenHAB2Widget();
        rootWidget.setType("root");
        try {
            JSONArray jsonWidgetArray = jsonObject.getJSONArray("widgets");
            for (int i = 0; i < jsonWidgetArray.length(); i++) {
                JSONObject widgetJson = jsonWidgetArray.getJSONObject(i);
                // Log.d(TAG, widgetJson.toString());
                OpenHAB2Widget.createOpenHABWidgetFromJson(rootWidget, widgetJson, iconFormat);
            }
            if (jsonObject.has("title"))
                this.setTitle(jsonObject.getString("title"));
            if (jsonObject.has("id"))
                this.setId(jsonObject.getString("id"));
            if (jsonObject.has("icon"))
                this.setIcon(jsonObject.getString("icon"));
            if (jsonObject.has("link"))
                this.setLink(jsonObject.getString("link"));
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    public OpenHABWidget getRootWidget() {
        return this.rootWidget;
    }

    public OpenHABWidget getWidgetById(String widgetId) {
        ArrayList<OpenHABWidget> widgets = this.getWidgets();
        for (int i = 0; i < widgets.size(); i++) {
            if (widgets.get(i).getId().equals(widgetId))
                return widgets.get(i);
        }
        return null;
    }

    public ArrayList<OpenHABWidget> getWidgets() {
        ArrayList<OpenHABWidget> result = new ArrayList<OpenHABWidget>();
        if (rootWidget != null)
            if (this.rootWidget.hasChildren()) {
                for (int i = 0; i < rootWidget.getChildren().size(); i++) {
                    OpenHABWidget openHABWidget = this.rootWidget.getChildren().get(i);
                    result.add(openHABWidget);
                    if (openHABWidget.hasChildren()) {
                        for (int j = 0; j < openHABWidget.getChildren().size(); j++) {
                            result.add(openHABWidget.getChildren().get(j));
                        }
                    }
                }
            }
        return result;
    }

    public ArrayList<OpenHABWidget> getLinkWidgets() {
        ArrayList<OpenHABWidget> result = new ArrayList<OpenHABWidget>();
        if (rootWidget != null)
            if (this.rootWidget.hasChildren()) {
                for (int i = 0; i < rootWidget.getChildren().size(); i++) {
                    OpenHABWidget openHABWidget = this.rootWidget.getChildren().get(i);
                    if (openHABWidget.hasLinkedPage() || openHABWidget.childrenHasLinkedPages())
                        result.add(openHABWidget);
                    if (openHABWidget.hasChildren()) {
                        for (int j = 0; j < openHABWidget.getChildren().size(); j++) {
                            if (openHABWidget.getChildren().get(j).hasLinkedPage())
                                result.add(openHABWidget.getChildren().get(j));
                        }
                    }
                }
            }
        return result;
    }

    public ArrayList<OpenHABWidget> getNonlinkWidgets() {
        ArrayList<OpenHABWidget> result = new ArrayList<OpenHABWidget>();
        if (rootWidget != null)
            if (this.rootWidget.hasChildren()) {
                for (int i = 0; i < rootWidget.getChildren().size(); i++) {
                    OpenHABWidget openHABWidget = this.rootWidget.getChildren().get(i);
                    if ((openHABWidget.getType().equals("Frame") && openHABWidget.childrenHasNonlinkedPages())
                            || (!openHABWidget.getType().equals("Frame") && !openHABWidget.hasLinkedPage()))
                        result.add(openHABWidget);
                    if (openHABWidget.hasChildren()) {
                        for (int j = 0; j < openHABWidget.getChildren().size(); j++) {
                            if (!openHABWidget.getChildren().get(j).hasLinkedPage())
                                result.add(openHABWidget.getChildren().get(j));
                        }
                    }
                }
            }
        return result;
    }

    public void logWidget(OpenHABWidget widget) {
        Log.i(TAG, "Widget <" + widget.getLabel() + "> (" + widget.getType() + ")");
        if (widget.hasChildren()) {
            for (int i = 0; i < widget.getChildren().size(); i++) {
                logWidget(widget.getChildren().get(i));
            }
        }
    }

    public String getTitle() {
        String[] splitString;
        if (title != null) {
            splitString = title.split("\\[|\\]");
            if (splitString.length > 0) {
                return splitString[0];
            } else {
                return title;
            }
        }
        return "";
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getIcon() {
        return icon;
    }

    public void setIcon(String icon) {
        this.icon = icon;
    }

    public String getLink() {
        return link;
    }

    public void setLink(String link) {
        this.link = link;
    }

}