private DatasetField copy(Object version, DatasetFieldCompoundValue parent) {
    DatasetField dsf = new DatasetField();
    dsf.setDatasetFieldType(datasetFieldType);

    if (version != null) {
      if (version.getClass().getName().equals("edu.harvard.iq.dataverse.DatasetVersion")) {
        dsf.setDatasetVersion((DatasetVersion) version);
      } else {
        dsf.setTemplate((Template) version);
      }
    }

    dsf.setParentDatasetFieldCompoundValue(parent);
    dsf.setControlledVocabularyValues(controlledVocabularyValues);

    for (DatasetFieldValue dsfv : datasetFieldValues) {
      dsf.getDatasetFieldValues().add(dsfv.copy(dsf));
    }

    for (DatasetFieldCompoundValue compoundValue : datasetFieldCompoundValues) {
      dsf.getDatasetFieldCompoundValues().add(compoundValue.copy(dsf));
    }

    return dsf;
  }
  private static DatasetField createNewEmptyDatasetField(DatasetFieldType dsfType) {
    DatasetField dsfv = new DatasetField();
    dsfv.setDatasetFieldType(dsfType);

    if (dsfType.isPrimitive()) {
      if (!dsfType.isControlledVocabulary()) {
        dsfv.getDatasetFieldValues().add(new DatasetFieldValue(dsfv));
      }
    } else { // compound field
      dsfv.getDatasetFieldCompoundValues()
          .add(DatasetFieldCompoundValue.createNewEmptyDatasetFieldCompoundValue(dsfv));
    }

    return dsfv;
  }