/**
   * Converts a JSIDL data binding to a CJSIDL object
   *
   * @param declaredMessageDef - JSIDL data binding
   * @return - resulting CJSIDL object
   */
  public static messageRef convert(
      org.jts.jsidl.binding.DeclaredMessageDef declaredMessageDef, EObject root) {
    CjsidlFactoryImpl factory = new CjsidlFactoryImpl();
    messageRef ref = factory.createmessageRef();
    ref.setName(declaredMessageDef.getName());

    // need to extract the EObject from the model
    String refName = declaredMessageDef.getDeclaredTypeRef();
    ref.setRef(
        (org.jts.eclipse.cjsidl.messageDef)
            Conversion.referenceHelper.getEObjectByName(refName, root));
    ref.setComment(JSIDLInterpToCJSIDLComment(declaredMessageDef.getInterpretation()));

    return ref;
  }
  /**
   * Converts a JSIDL message reference into a messageRef or messageScopedRef
   *
   * @param declDef - the input JSIDL message reference
   * @param root - the root object containing the message reference
   * @return - the corresponding CJSIDL object
   */
  public static EObject convertToRef(
      org.jts.jsidl.binding.DeclaredMessageDef declDef, EObject root) {
    String typename = declDef.getDeclaredTypeRef();
    String tmpArr[] = typename.split("[.]");
    if (tmpArr.length == 1) {
      // local type reference, convert to typeReference
      CjsidlFactoryImpl factory = new CjsidlFactoryImpl();
      org.jts.eclipse.cjsidl.messageRef ref = factory.createmessageRef();

      ref.setComment(JSIDLInterpToCJSIDLComment(declDef.getInterpretation()));
      String name = declDef.getName();
      EObject tmpobj = Conversion.referenceHelper.getEObjectByName(name, root);
      if (tmpobj != null || name.equals(typename)) {
        name = name + ConversionUtil.mangled;
      }
      ref.setName(name);
      EObject result = Conversion.referenceHelper.getEObjectByName(typename, root);

      if (result instanceof messageDef) {
        ref.setRef((messageDef) result);
      } else if (result == null) {
        MessageSet.messageMap.put(ref, typename);
      } else {
        Logger.getLogger("CJSIDL")
            .log(
                Level.SEVERE,
                "Unexpected object type: expecting messageDef \""
                    + typename
                    + "\" to have been declared before this line.  No definition was found.");
      }

      return ref;

    } else {
      // reference located in a different file, convert to scopedTypeId
      CjsidlFactoryImpl factory = new CjsidlFactoryImpl();
      org.jts.eclipse.cjsidl.messageScopedRef ref = factory.createmessageScopedRef();

      ref.setComment(JSIDLInterpToCJSIDLComment(declDef.getInterpretation()));
      ref.setName(declDef.getName());
      EList<EObject> scopeList = ref.getScopes();
      EObject currentObj = root;
      EObject referenceObject = null;

      // convert array to array list
      java.util.List<String> subnames = new ArrayList<String>();
      for (int i = 0; i < tmpArr.length; i++) {
        subnames.add(tmpArr[i]);
      }
      String typeName = null;
      for (String subname : subnames) {
        // the last subname is the name of the type, so its not a root object reference
        if (subnames.indexOf(subname) == subnames.size() - 1) {
          typeName = subname;
          continue;
        }
        // this is the first name and is only separate from the rest of the names
        // to avoid making a fix to the grammar and scope provider
        else if (subnames.indexOf(subname) == 0) {
          referenceObject = Conversion.referenceHelper.getEObjectByRef(subname, currentObj);
          EObject refObj = Conversion.referenceHelper.findRefEObject(subname, currentObj);
          ref.setScope(refObj);
        } else {
          currentObj = referenceObject;
          referenceObject = Conversion.referenceHelper.getEObjectByRef(subname, referenceObject);
          EObject refObj = Conversion.referenceHelper.findRefEObject(subname, currentObj);
          scopeList.add(refObj);
        }
      }
      EObject result = Conversion.referenceHelper.findEObject(typeName, referenceObject);
      if (result instanceof messageDef) {
        ref.setRef((messageDef) result);
      }

      return ref;
    }
  }