Package net.kuujo.vertigo.util

Source Code of net.kuujo.vertigo.util.Contexts

/*
* Copyright 2014 the original author or authors.
*
* 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 net.kuujo.vertigo.util;

import net.kuujo.vertigo.Context;
import net.kuujo.vertigo.component.ComponentContext;
import net.kuujo.vertigo.component.InstanceContext;
import net.kuujo.vertigo.io.IOContext;
import net.kuujo.vertigo.io.InputContext;
import net.kuujo.vertigo.io.OutputContext;
import net.kuujo.vertigo.io.port.InputPortContext;
import net.kuujo.vertigo.io.port.OutputPortContext;
import net.kuujo.vertigo.network.NetworkContext;
import net.kuujo.vertigo.util.serialization.SerializerFactory;

import org.vertx.java.core.json.JsonObject;

/**
* Context serialization helpers.
*
* @author <a href="http://github.com/kuujo">Jordan Halterman</a>
*/
public class Contexts {

  /**
   * Serializes a context to JSON.
   *
   * @param context The context to serialize.
   * @return The serialized context.
   */
  public static JsonObject serialize(Context<?> context) {
    if (context instanceof NetworkContext) {
      return serialize(NetworkContext.class.cast(context));
    } else if (context instanceof ComponentContext) {
      return serialize(ComponentContext.class.cast(context));
    } else if (context instanceof InstanceContext) {
      return serialize(InstanceContext.class.cast(context));
    } else if (context instanceof IOContext) {
      return serialize(IOContext.class.cast(context));
    } else if (context instanceof InputPortContext) {
      return serialize(InputPortContext.class.cast(context));
    } else if (context instanceof OutputPortContext) {
      return serialize(OutputPortContext.class.cast(context));
    } else {
      throw new UnsupportedOperationException("Cannot serialize " + context.getClass().getCanonicalName() + " type contexts");
    }
  }

  /**
   * Serializes a network context to JSON.
   *
   * @param context The context to serialize.
   * @return The serialized context.
   */
  public static JsonObject serialize(NetworkContext context) {
    return serialize(context.uri(), context);
  }

  /**
   * Serializes a component context to JSON.
   *
   * @param context The context to serialize.
   * @return The serialized context.
   */
  public static JsonObject serialize(ComponentContext<?> context) {
    return serialize(context.uri(), context.network());
  }

  /**
   * Serializes an instance context to JSON.
   *
   * @param context The context to serialize.
   * @return The serialized context.
   */
  public static JsonObject serialize(InstanceContext context) {
    return serialize(context.uri(), context.component().network());
  }

  /**
   * Serializes an I/O context to JSON.
   *
   * @param context The context to serialize.
   * @return The serialized context.
   */
  public static JsonObject serialize(IOContext<?> context) {
    return serialize(context.uri(), context.instance().component().network());
  }

  /**
   * Serializes an input port context to JSON.
   *
   * @param context The context to serialize.
   * @return The serialized context.
   */
  public static JsonObject serialize(InputPortContext context) {
    return serialize(context.uri(), context.input().instance().component().network());
  }

  /**
   * Serializes an output port context to JSON.
   *
   * @param context The context to serialize.
   * @return The serialized context.
   */
  public static JsonObject serialize(OutputPortContext context) {
    return serialize(context.uri(), context.output().instance().component().network());
  }

  private static JsonObject serialize(String uri, NetworkContext context) {
    return new JsonObject()
        .putString("uri", uri)
        .putObject("context", SerializerFactory.getSerializer(Context.class).serializeToObject(context));
  }

  /**
   * Deserializes a context from JSON.
   *
   * @param context The serialized context.
   * @return The deserialized context.
   */
  public static <T extends Context<T>> T deserialize(JsonObject context) {
    return deserialize(context.getString("uri"), context.getObject("context"));
  }

  @SuppressWarnings("unchecked")
  private static <T extends Context<T>> T deserialize(String uri, JsonObject context) {
    ContextUri curi = new ContextUri(uri);
    NetworkContext network = SerializerFactory.getSerializer(Context.class).deserializeObject(context, NetworkContext.class);
    if (!curi.getCluster().equals(network.cluster()) || !curi.getNetwork().equals(network.name())) {
      throw new IllegalArgumentException("The given URI does not match the given context configuration");
    }

    if (curi.hasComponent()) {
      ComponentContext<?> component = network.component(curi.getComponent());
      if (component == null) {
        throw new IllegalArgumentException("The URI component " + curi.getComponent() + " does not exist in the given network configuration");
      }
      if (curi.hasInstance()) {
        InstanceContext instance = component.instance(curi.getInstance());
        if (instance == null) {
          throw new IllegalArgumentException("The URI instance " + curi.getInstance() + " does not exist in the given component configuration");
        }
        if (curi.hasEndpoint()) {
          switch (curi.getEndpoint()) {
            case ContextUri.ENDPOINT_IN:
              InputContext input = instance.input();
              if (curi.hasPort()) {
                InputPortContext inPort = input.port(curi.getPort());
                if (inPort == null) {
                  throw new IllegalArgumentException("The URI port " + curi.getPort() + " does not exist in the given input configuration");
                }
                return (T) inPort;
              }
              return (T) input;
            case ContextUri.ENDPOINT_OUT:
              OutputContext output = instance.output();
              if (curi.hasPort()) {
                OutputPortContext outPort = output.port(curi.getPort());
                if (outPort == null) {
                  throw new IllegalArgumentException("The URI port " + curi.getPort() + " does not exist in the given output configuration");
                }
                return (T) outPort;
              }
              return (T) output;
            default:
              throw new IllegalArgumentException("The URI endpoint " + curi.getEndpoint() + " is not a valid endpoint type");
          }
        }
        return (T) instance;
      }
      return (T) component;
    }
    return (T) network;
  }

}
TOP

Related Classes of net.kuujo.vertigo.util.Contexts

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.