/**
   * Update the types associated with a given service. Currently, this will clobber all types
   * associated with the given service.
   *
   * @param service
   * @param serviceDef
   */
  public void updateServiceTypes(
      Service service,
      ServiceDefinition serviceDef,
      String username,
      String password) { // salesforce

    if (service.getDataobjects() == null) {
      service.setDataobjects(new DataObjects());
    }
    List<DataObject> dos = service.getDataobjects().getDataobject();
    dos.clear();

    List<TypeDefinition> elementTypes;
    if (service.getId().equals(CommonConstants.SALESFORCE_SERVICE)) {
      elementTypes = serviceDef.getLocalTypes(username, password);
    } else {
      elementTypes = serviceDef.getLocalTypes();
    }

    for (TypeDefinition et : elementTypes) {
      // No need to check the existence of the types in other services as there is no problem if
      // there are two services using same dataObjects.
      /*if (findDataObjectFromJavaType(et.getTypeName()) != null) {
          throw new WMRuntimeException("Conflicting java type: " + et.getTypeName());
      }*/

      DataObject dso = new DataObject();
      dos.add(dso);

      dso.setJavaType(et.getTypeName());
      dso.setName(et.getShortName());
      dso.setSupportsQuickData(et.isLiveService());

      if (et instanceof ObjectTypeDefinition) {
        ObjectTypeDefinition otd = (ObjectTypeDefinition) et;
        List<Element> dsoelems = dso.getElement();
        for (Map.Entry<String, FieldDefinition> entry : otd.getFields().entrySet()) {

          Element e = new Element();
          dsoelems.add(e);
          if (0 != entry.getKey().compareTo(entry.getValue().getName())) {
            throw new WMRuntimeException(
                "key: " + entry.getKey() + " != " + entry.getValue().getName());
          }

          // key or value.name?
          e.setName(entry.getKey());

          if (entry.getValue().getTypeDefinition() != null) {
            e.setTypeRef(entry.getValue().getTypeDefinition().getTypeName());
          }
          e.setIsList(entry.getValue().getDimensions() > 0);
          e.setAllowNull(entry.getValue().isAllowNull());
          e.setSubType(entry.getValue().getSubType()); // salesforce

          for (OperationEnumeration oe : entry.getValue().getRequire()) {
            e.getRequire().add(oe);
          }
          for (OperationEnumeration oe : entry.getValue().getExclude()) {
            e.getExclude().add(oe);
          }
          for (OperationEnumeration oe : entry.getValue().getNoChange()) {
            e.getNoChange().add(oe);
          }
        }
      }
    }
  }