com.ponysdk.core.ui.selenium.PonySDKWebDriver.java Source code

Java tutorial

Introduction

Here is the source code for com.ponysdk.core.ui.selenium.PonySDKWebDriver.java

Source

/*
 * Copyright (c) 2017 PonySDK
 *  Owners:
 *  Luciano Broussal  <luciano.broussal AT gmail.com>
 *  Mathieu Barbier   <mathieu.barbier AT gmail.com>
 *  Nicolas Ciaravola <nicolas.ciaravola.pro AT gmail.com>
 *
 *  WebSite:
 *  http://code.google.com/p/pony-sdk/
 *
 * 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.ponysdk.core.ui.selenium;

import java.net.URI;
import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.websocket.MessageHandler;

import org.openqa.selenium.By;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.Point;
import org.openqa.selenium.Rectangle;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebDriverException;
import org.openqa.selenium.WebElement;

import com.ponysdk.core.model.ServerToClientModel;
import com.ponysdk.core.model.WidgetType;

public class PonySDKWebDriver implements WebDriver, MessageHandler.Whole<ByteBuffer> {

    private final Map<Integer, PonyWebElement> elements = new HashMap<>();

    private final WebsocketClient client = new WebsocketClient();

    public PonySDKWebDriver() {
        client.setMessageHandler(this);
    }

    @Override
    public void get(final String url) {
        try {
            client.connect(new URI(url));
        } catch (final Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public String getCurrentUrl() {
        return null;
    }

    @Override
    public String getTitle() {
        return null;
    }

    @Override
    public List<WebElement> findElements(final By by) {
        return null;
    }

    @Override
    public WebElement findElement(final By by) {
        return null;
    }

    @Override
    public String getPageSource() {
        return null;
    }

    @Override
    public void close() {
        client.close();
    }

    @Override
    public void quit() {

    }

    @Override
    public Set<String> getWindowHandles() {
        return null;
    }

    @Override
    public String getWindowHandle() {
        return null;
    }

    @Override
    public TargetLocator switchTo() {
        return null;
    }

    @Override
    public Navigation navigate() {
        return null;
    }

    @Override
    public Options manage() {
        return null;
    }

    class BinaryModel {

        ServerToClientModel model;
    }

    private ByteBuffer buffer;
    private int pos;

    @Override
    public void onMessage(final ByteBuffer message) {
        message.rewind();

        if (buffer == null || !buffer.hasRemaining()) {
            buffer = message;
        } else {
            buffer.put(message);
        }

        try {

            Object value = null;

            while (buffer.hasRemaining()) {
                final ServerToClientModel model = readModel(buffer);

                System.err.println("Model : " + model);

                switch (model.getTypeModel()) {
                case NULL:
                    break;
                case BOOLEAN:
                    if (buffer.hasRemaining()) {
                        value = buffer.get();
                    }
                    break;
                case BYTE:
                    value = buffer.get();
                    break;
                case SHORT:
                    value = buffer.getShort();
                    break;
                case INTEGER:
                    if (buffer.remaining() > 4)
                        value = buffer.getInt();
                    else
                        System.err.println("Not enough : ");
                    break;
                case STRING:
                case STRING_UTF8: {
                    final int size = buffer.getShort();

                    if (buffer.remaining() > size) {
                        final byte[] bytes = new byte[size];
                        buffer.get(bytes);
                        value = new String(bytes, Charset.forName("UTF8"));
                    } else {
                        System.err.println("Not enough : ");
                        return;
                    }
                    break;
                }
                case LONG: {
                    final int size = getUnsignedByte(buffer);

                    if (buffer.remaining() > size) {
                        final byte[] bytes = new byte[size];
                        buffer.get(bytes);
                        value = new String(bytes, Charset.forName("UTF8"));
                    } else {
                        System.err.println("Not enough : ");
                        return;
                    }
                    break;
                }
                case DOUBLE: {
                    final int size = buffer.getShort();

                    if (buffer.remaining() > size) {
                        final byte[] bytes = new byte[size];
                        buffer.get(bytes);
                        value = new String(bytes, Charset.forName("UTF8"));//Cast to Double
                    } else {
                        System.err.println("Not enough : ");
                        return;
                    }
                    break;
                }
                default:
                    System.err.println("not used " + model.getTypeModel());
                }

                switch (model) {
                case CREATE_CONTEXT:
                    elements.put((Integer) value, new PonyWebElement());
                    System.err.println("Create Object ID " + value);
                    break;
                case TYPE_CREATE: {
                    System.err.println("Create Object ID " + value);
                    final ServerToClientModel m = readModel(buffer);
                    System.err.println("Model " + m); //TODO ciaravola pas obligatoire ?
                    final WidgetType type = readWidgetType(buffer);
                    System.err.println("Type Object " + type);
                    break;
                }
                case TYPE_UPDATE:
                    System.err.println("Update Object ID " + value);
                    break;
                case TYPE_GC:
                    System.err.println("GC Object ID " + value);
                    elements.remove(value);
                    break;
                case TYPE_ADD:
                    System.err.println("Add Object ID " + value);
                    final ServerToClientModel m = readModel(buffer);
                    final int parent = buffer.getInt();
                    System.err.println("Read parent " + parent);
                    break;
                case TEXT:
                    System.err.println("Text " + value);
                    break;
                default:
                    break;
                }
            }
        } catch (final Exception e) {
            e.printStackTrace();
        }
    }

    private ServerToClientModel readModel(final ByteBuffer buffer) {
        return ServerToClientModel.fromRawValue(getUnsignedByte(buffer));
    }

    private WidgetType readWidgetType(final ByteBuffer buffer) {
        return WidgetType.fromRawValue(buffer.get());
    }

    private short getUnsignedByte(final ByteBuffer buffer) {
        return (short) (buffer.get() & 0xFF);
    }

    class PonyWebElement implements WebElement {

        private final Map<String, String> attributes = new HashMap<>();

        private PonyWebElement() {
        }

        @Override
        public void click() {

        }

        @Override
        public void submit() {

        }

        @Override
        public void sendKeys(final CharSequence... keysToSend) {

        }

        @Override
        public void clear() {

        }

        @Override
        public String getTagName() {
            return null;
        }

        @Override
        public String getAttribute(final String name) {
            return attributes.get(name);
        }

        @Override
        public boolean isSelected() {
            return false;
        }

        @Override
        public boolean isEnabled() {
            return false;
        }

        @Override
        public String getText() {
            return null;
        }

        @Override
        public List<WebElement> findElements(final By by) {
            return null;
        }

        @Override
        public WebElement findElement(final By by) {
            return null;
        }

        @Override
        public boolean isDisplayed() {
            return false;
        }

        @Override
        public Point getLocation() {
            return null;
        }

        @Override
        public Dimension getSize() {
            return null;
        }

        @Override
        public Rectangle getRect() {
            return null;
        }

        @Override
        public String getCssValue(final String propertyName) {
            return null;
        }

        @Override
        public <X> X getScreenshotAs(final OutputType<X> target) throws WebDriverException {
            return null;
        }
    }
}