/**
   * @param groupFileUri
   * @return
   */
  private File toDestinationFolder(URI groupFileUri) {
    String toReplace = TstGeneral.GROUP_PATH_STR;
    String forReplace = toReplace + "Y";

    String path = URI.decode(groupFileUri.devicePath());
    // modify to destination folder
    path = path.replace(toReplace, forReplace);
    File destFile = new File(path);
    return destFile;
  }
 public static void dumpURI(URI uri, Logger logger) {
   logger.debug("URI: " + uri);
   logger.debug("authority: " + uri.authority());
   logger.debug("device: " + uri.device());
   logger.debug("devicePath: " + uri.devicePath());
   logger.debug("fileExtension: " + uri.fileExtension());
   logger.debug("fragment: " + uri.fragment());
   logger.debug("host: " + uri.host());
   logger.debug("lastSegment: " + uri.lastSegment());
   logger.debug("opaquePart: " + uri.opaquePart());
   logger.debug("path: " + uri.path());
   logger.debug("port: " + uri.port());
   logger.debug("query: " + uri.query());
   logger.debug("scheme: " + uri.scheme());
   logger.debug("segmentCount: " + uri.segmentCount());
   logger.debug("toFileString: " + uri.toFileString());
   logger.debug("userInfo: " + uri.userInfo());
   logger.debug("hasAbsolutePath: " + uri.hasAbsolutePath());
   logger.debug("schemehasAbsolutePath: " + uri.hasAbsolutePath());
   logger.debug("hasAuthority: " + uri.hasAuthority());
   logger.debug("hasDevice: " + uri.hasDevice());
   logger.debug("hasEmptyPath: " + uri.hasEmptyPath());
   logger.debug("hasFragment: " + uri.hasFragment());
   logger.debug("hasOpaquePart: " + uri.hasOpaquePart());
   logger.debug("hasPath: " + uri.hasPath());
   logger.debug("hasQuery: " + uri.hasQuery());
   logger.debug("hasRelativePath: " + uri.hasRelativePath());
   logger.debug("hasTrailingPathSeparator: " + uri.hasTrailingPathSeparator());
   logger.debug("isCurrentDocumentReference: " + uri.isCurrentDocumentReference());
   logger.debug("isEmpty: " + uri.isEmpty());
   logger.debug("isFile: " + uri.isFile());
   logger.debug("isHierarchical: " + uri.isHierarchical());
   logger.debug("isPrefix: " + uri.isPrefix());
   logger.debug("isRelative: " + uri.isRelative());
   logger.debug("segments: " + uri.segments());
 }
  /** Build elements one by one */
  public void testGroupReviewCreate() {
    R4EReviewGroup group = null;
    // required folder path and group name to build the new group file
    try {
      group = fFactory.createR4EReviewGroup(fGroupPath, GROUP_NAME);
    } catch (ResourceHandlingException e) {
      e.printStackTrace();
    }

    assertNotNull(group);
    URI uri = group.eResource().getURI();
    String expectedURI = fGroupPath.appendSegment("Group_One_group_root.xrer").toString();
    assertEquals(expectedURI, uri.toString());

    // Deserialise and assert
    group = null;
    try {
      group = fFactory.openR4EReviewGroup(uri);
    } catch (ResourceHandlingException e) {
      e.printStackTrace();
    } catch (CompatibilityException e) {
      e.printStackTrace();
    }

    // validate
    assertNotNull(group);
    assertEquals(GROUP_NAME, group.getName());

    // crate a review
    R4EReview review = null;
    try {
      review = fFactory.createR4EReview(group, REVIEW_NAME1, fUser1);
    } catch (ResourceHandlingException e) {
      e.printStackTrace();
      fail("Exception");
    }

    assertEquals(REVIEW_NAME1, review.getName());

    // re-open the group
    group = null;
    try {
      group = fFactory.openR4EReviewGroup(uri);
    } catch (ResourceHandlingException e) {
      e.printStackTrace();
      fail("Exception");
    } catch (CompatibilityException e) {
      e.printStackTrace();
      fail("Exception");
    }

    uri = review.eResource().getURI();
    // read the review
    try {
      review = fFactory.openR4EReview(group, review.getName());
    } catch (ResourceHandlingException e) {
      e.printStackTrace();
      fail("Exception");
    } catch (CompatibilityException e) {
      e.printStackTrace();
      fail("Exception");
    }

    assertEquals(REVIEW_NAME1, review.getName());

    // read the participant
    R4EUser participant = review.getUsersMap().values().iterator().next();
    uri = participant.eResource().getURI();
    try {
      ResourceSet resSet = participant.eResource().getResourceSet();
      participant = fReader.deserializeTopElement(uri, resSet, R4EParticipant.class);
    } catch (ResourceHandlingException e) {
      e.printStackTrace();
      fail("Exception");
    }

    assertEquals(fUser1, participant.getId());

    // Clean up
    File folder = new File(URI.decode(fGroupPath.devicePath()));
    try {
      FileUtils.deleteDirectory(folder);
    } catch (IOException e) {
      e.printStackTrace();
      fail("Exception");
    }
  }
  /**
   * Create a new empty model from an existing model that applies the same profiles and has the same
   * imports
   *
   * @param existingModel
   * @return
   */
  public ModelManagement createTargetModel(Model existingModel, String name, boolean copyImports)
      throws TransformationException {
    ModelManagement mm = new ModelManagement();
    Model newModel = mm.getModel();
    newModel.setName(name);

    try {
      // copy profile application
      for (Profile profile : existingModel.getAppliedProfiles()) {
        // reload profile in resource of new model
        monitor.subTask(Messages.InstantiateDepPlan_InfoApplyProfile + profile.getQualifiedName());

        if (profile.eResource() == null) {
          String profileName = profile.getQualifiedName();
          if (profileName == null) {
            if (profile instanceof MinimalEObjectImpl.Container) {
              URI uri = ((MinimalEObjectImpl.Container) profile).eProxyURI();
              if (uri != null) {
                throw new TransformationException(
                    String.format(Messages.InstantiateDepPlan_CheckInputModelProfileNoRes, uri));
              }
            }
            throw new TransformationException(
                Messages.InstantiateDepPlan_CheckInputModelProfileNoResNoName);
          }
          throw new TransformationException(
              String.format(Messages.InstantiateDepPlan_CheckInputModelProfile3, profileName));
        }

        Resource profileResource = null;
        try {
          profileResource =
              ModelManagement.getResourceSet().getResource(profile.eResource().getURI(), true);
        } catch (WrappedException e) {
          // read 2nd time (some diagnostic errors are raised only
          // once)
          Log.log(
              IStatus.WARNING,
              Log.DEPLOYMENT,
              "Warning: exception in profile.eResource() " + e.getMessage()); // $NON-NLS-1$
          profileResource =
              ModelManagement.getResourceSet().getResource(profile.eResource().getURI(), true);
        }
        Profile newProfileTop = (Profile) profileResource.getContents().get(0);
        Profile newProfile;
        String qname = profile.getQualifiedName();
        if ((qname != null) && qname.contains("::")) { // $NON-NLS-1$
          // profile is a sub-profile within same resource
          // TODO: should Copy class copy profile applications?
          // Should be handled in shallowContainer class.
          // if we put profile/newProfile pair into copy map, copy
          // would find (and copy profile
          // applications in sub-folders
          qname = qname.substring(qname.indexOf("::") + 2); // $NON-NLS-1$
          newProfile = (Profile) Utils.getQualifiedElement(newProfileTop, qname);
        } else {
          newProfile = newProfileTop;
        }
        newProfile.getMember("dummy"); // force profile loading //$NON-NLS-1$
        newModel.applyProfile(newProfile);
      }
    } catch (IllegalArgumentException e) {
      throw new TransformationException(
          Messages.InstantiateDepPlan_IllegalArgumentDuringCopy + e.toString());
    }

    // copy imports (and load resources associated - TODO: might not be
    // necessary)
    // While this is useful in general, it implies that code for imported
    // models
    // has been generated and compiled (for the right target) into a
    // library. This may be
    // quite tedious, unless automatically managed.
    // Therefore we do not activate this option in a first pass of the model
    // transformations.
    if (copyImports) {
      for (Package importedPackage : existingModel.getImportedPackages()) {
        if (importedPackage == null) {
          throw new TransformationException(Messages.InstantiateDepPlan_CheckInputImportPkg);
        }
        if (importedPackage.eResource() == null) {
          String errorMsg = Messages.InstantiateDepPlan_CheckInputImportPkgNoRes;
          if (importedPackage instanceof MinimalEObjectImpl.Container) {
            URI uri = ((MinimalEObjectImpl.Container) importedPackage).eProxyURI();
            if (uri != null) {
              errorMsg += " - URI: " + uri.devicePath(); // $NON-NLS-1$
            }
          }
          throw new TransformationException(errorMsg);
        }
        newModel.createPackageImport(importedPackage);
        monitor.subTask(
            String.format(
                Messages.InstantiateDepPlan_InfoImportPackage, importedPackage.getName()));

        try {
          importedPackage.eResource().load(null);
          newModel.getMember("dummy"); // force loading of model //$NON-NLS-1$
        } catch (IOException e) {
          throw new TransformationException(e.getMessage());
        }
      }
    }

    StUtils.copyStereotypes(existingModel, newModel);

    return mm;
  }