/*
   * Generates the top level panel for all Data Mappings of the Activity.
   */
  @SuppressWarnings("unchecked")
  public void generateForm() {
    List<Object> allOutMappings = getApplicationContext().getAllOutDataMappings();
    List<Object> allInMappings = getApplicationContext().getAllInDataMappings();

    // Process OUT Mappings first
    List<Object> allMappings = new ArrayList<Object>();
    allMappings.addAll(allOutMappings);
    allMappings.addAll(allInMappings);

    // Process All IN/OUT Mappings and collect all of them in ManualActivityPath
    Path path = null;
    ManualActivityPath manualActivityPath =
        new ManualActivityPath("MA" + activityInstance.getOID(), false);
    Map<Path, DataMapping> pathDataMappingMap = new HashMap<Path, DataMapping>();
    Map<String, DataMapping> dataMappingMap = new HashMap<String, DataMapping>();
    for (Object object : allMappings) {
      DataMapping dataMapping = (DataMapping) object;

      if (dataMappingMap.containsKey(dataMapping.getId())) {
        continue;
      }

      dataMappingMap.put(dataMapping.getId(), dataMapping);
      if (trace.isDebugEnabled()) {
        trace.debug(
            "Processing Data Mapping - " + dataMapping.getId() + ":" + dataMapping.getName());
      }

      // Handle Data Mapping as per Type
      if (ModelUtils.isSystemDefinedData(dataMapping)) {
        path = createSystemDataMapping(dataMapping, manualActivityPath);
      } else if (ModelUtils.isDMSType(getModel(), dataMapping)) {
        path = createDMSDataMapping(dataMapping, allInMappings, manualActivityPath);
      } else if (ModelUtils.isEnumerationType(getModel(), dataMapping)) {
        path = createStructureDataMapping(dataMapping, manualActivityPath);
      } else if (ModelUtils.isPrimitiveType(getModel(), dataMapping)) {
        path = createPrimitiveDataMapping(dataMapping, manualActivityPath);
      } else if (ModelUtils.isStructuredType(getModel(), dataMapping)) {
        path = createStructureDataMapping(dataMapping, manualActivityPath);
      }

      if (null != path) {
        manualActivityPath.getChildPaths().add(path);
        pathDataMappingMap.put(path, dataMapping);
      } else {
        trace.warn(
            "Skipping Data Mapping - Not supported - "
                + dataMapping.getId()
                + ":"
                + dataMapping.getName());
      }
    }

    // Set Label Provider along with required data for I18N
    formGenerator.setLabelProvider(new ManualActivityLabelProvider(getModel(), pathDataMappingMap));

    setRootContainer(formGenerator.createRootComponent());

    // Process ManualActivityPath and generate form
    processManualActivityPath(manualActivityPath, pathDataMappingMap);

    // Debug Information
    if (trace.isDebugEnabled()) {
      trace.debug("Full Path Map = " + getFullPathInputControllerMap());
      trace.debug("Top Level Map = " + getTopLevelInputControllerMap());
      trace.debug("Markup:\n" + generateMarkup());
    }
  }