private void generateStage(
      Element[] parents, Class stage, Set<Class<? extends Stage>> generatedStages) {
    if (generatedStages.contains(stage)) return;
    boolean hasParentStage = Stage.class.isAssignableFrom(stage.getSuperclass());
    if (hasParentStage) {
      generateStage(parents, stage.getSuperclass(), generatedStages);
    }
    org.radargun.config.Stage stageAnnotation =
        (org.radargun.config.Stage) stage.getAnnotation(org.radargun.config.Stage.class);
    if (stageAnnotation == null) return; // not a proper stage

    String stageType = generateClass(stage);
    if (!Modifier.isAbstract(stage.getModifiers()) && !stageAnnotation.internal()) {
      for (Element parent : parents) {
        createReference(
            parent, XmlHelper.camelCaseToDash(StageHelper.getStageName(stage)), stageType);
      }
      if (!stageAnnotation.deprecatedName().equals(org.radargun.config.Stage.NO_DEPRECATED_NAME)) {
        for (Element parent : parents) {
          createReference(
              parent, XmlHelper.camelCaseToDash(stageAnnotation.deprecatedName()), stageType);
        }
      }
    }
    generatedStages.add(stage);
  }
  /**
   * Generate the XSD file. First argument is directory where the XSD file should be placed (it will
   * be named radargun-{version}.xsd.
   */
  public static void main(String[] args) {
    if (args.length < 1 || args[0] == null)
      throw new IllegalArgumentException("No schema location directory specified!");

    for (Class<? extends Stage> stage : StageHelper.getStages().values()) {
      stages.put(stage, stage.getProtectionDomain().getCodeSource().getLocation().getPath());
    }
    new ConfigSchemaGenerator().generate(args[0], String.format("radargun-%s.xsd", VERSION));
  }
  private static void generateStage(
      Document doc, Element schema, Element[] parents, Class stage, Set<Class> generatedStages) {
    if (generatedStages.contains(stage)) return;
    boolean hasParentStage = Stage.class.isAssignableFrom(stage.getSuperclass());
    if (hasParentStage) {
      generateStage(doc, schema, parents, stage.getSuperclass(), generatedStages);
    }
    org.radargun.config.Stage stageAnnotation =
        (org.radargun.config.Stage) stage.getAnnotation(org.radargun.config.Stage.class);
    if (stageAnnotation == null) return; // not a proper stage

    String stageName = StageHelper.getStageName(stage);
    String stageDocText = stageAnnotation.doc();
    Element stageType =
        createComplexType(
            doc,
            schema,
            stageName,
            hasParentStage ? RG_PREFIX + StageHelper.getStageName(stage.getSuperclass()) : null,
            Modifier.isAbstract(stage.getModifiers()),
            stageDocText);
    for (Element parent : parents) {
      createReference(doc, parent, stageName, RG_PREFIX + stageName);
    }
    if (!stageAnnotation.deprecatedName().equals(org.radargun.config.Stage.NO_DEPRECATED_NAME)) {
      for (Element parent : parents) {
        createReference(doc, parent, stageAnnotation.deprecatedName(), RG_PREFIX + stageName);
      }
    }
    for (Map.Entry<String, Field> property :
        PropertyHelper.getDeclaredProperties(stage).entrySet()) {
      Property propertyAnnotation = property.getValue().getAnnotation(Property.class);
      if (propertyAnnotation.readonly()) continue; // cannot be configured
      String propertyDocText = propertyAnnotation.doc();
      if (property.getKey().equals(propertyAnnotation.deprecatedName())) {
        propertyDocText = "*DEPRECATED* " + propertyDocText;
      }
      String type =
          generateType(doc, schema, property.getValue().getType(), propertyAnnotation.converter());
      addAttribute(
          doc, stageType, property.getKey(), type, propertyDocText, !propertyAnnotation.optional());
    }
    generatedStages.add(stage);
  }
 private static void generateStageDefinitions(Document doc, Element schema, Element[] parents) {
   File dir = new File(stageDirectory);
   if (!dir.exists() || !dir.isDirectory()) {
     throw new IllegalArgumentException(dir + " is not an existing directory!");
   }
   for (File file : dir.listFiles()) {
     if (!file.getName().startsWith("radargun-framework-") || !file.getName().endsWith(".jar"))
       continue;
     Set<Class> generatedStages = new HashSet<Class>();
     for (Class<?> stage : StageHelper.getStagesFromJar(file.getPath()).values()) {
       generateStage(doc, schema, parents, stage, generatedStages);
     }
   }
 }
  @Override
  public List<AbstractBean> getAllActiveFilterRecords(String array, String field, String username) {
    List<AbstractBean> retValue = new ArrayList<AbstractBean>();
    String query =
        "select * from tbl_crm_lead where type = 0 and status = ? and userId = ? and "
            + field
            + " IN ("
            + array
            + ") UNION select * from tbl_crm_lead where leadId IN (select leadId from tbl_crm_share where userId = ?) and type = 0 and status = ? and "
            + field
            + " IN ("
            + array
            + ");";
    try {
      preparedStatement = DBUtility.connection.prepareStatement(query);
      preparedStatement.setBoolean(1, true);
      preparedStatement.setString(2, username);
      preparedStatement.setString(3, username);
      preparedStatement.setBoolean(4, true);
    } catch (SQLException e) {
      ZLog.err("VNC CRM for Zimbra", "Error in getting all active records in LeadHelper", e);
    }
    ResultSet rs = dbu.select(preparedStatement);
    LeadBean leadBean = null;
    CountryHelper countryHelper = new CountryHelper();
    StateHelper stateHelper = new StateHelper();
    ChannelHelper channelHelper = new ChannelHelper();
    SectionHelper sectionHelper = new SectionHelper();
    CategoryHelper categoryHelper = new CategoryHelper();
    PriorityHelper priorityHelper = new PriorityHelper();
    StageHelper stageHelper = new StageHelper();
    CompanyHelper companyHelper = new CompanyHelper();
    LeadClassHelper leadClassHelper = new LeadClassHelper();

    try {
      while (rs.next()) {
        leadBean = new LeadBean();
        leadBean.setLeadId(rs.getInt("leadId"));
        leadBean.setSubjectName(rs.getString("subjectName"));
        leadBean.setLeadDescription(rs.getString("leadDescription"));
        leadBean.setContactName(rs.getString("contactName"));
        leadBean.setCompanyBean(
            (CompanyBean) (companyHelper.getRecordById(rs.getString("companyId"))));
        leadBean.setValuation(rs.getString("valuation"));
        leadBean.setLeadState(rs.getString("leadState"));
        leadBean.setLeadClassBean(
            (LeadClassBean) (leadClassHelper.getRecordById(rs.getString("leadClassId"))));
        leadBean.setPartnerName(rs.getString("partnerName"));
        leadBean.setPhone(rs.getString("phone"));
        leadBean.setFax(rs.getString("fax"));
        leadBean.setEmail(rs.getString("email"));
        leadBean.setWorkPhone(rs.getString("workPhone"));
        leadBean.setMobile(rs.getString("mobile"));
        leadBean.setStreet1(rs.getString("street1"));
        leadBean.setStreet2(rs.getString("street2"));
        leadBean.setCity(rs.getString("city"));
        leadBean.setZip(rs.getString("zip"));
        leadBean.setCountryBean(
            (CountryBean) (countryHelper.getRecordById(rs.getString("countryId"))));
        leadBean.setStateBean((StateBean) (stateHelper.getRecordById(rs.getString("stateId"))));
        leadBean.setChannelBean(
            (ChannelBean) (channelHelper.getRecordById(rs.getString("channelId"))));
        leadBean.setPriorityBean(
            (PriorityBean) (priorityHelper.getRecordById(rs.getString("priorityId"))));
        leadBean.setStageBean((StageBean) (stageHelper.getRecordById(rs.getString("stageId"))));
        leadBean.setCategoryBean(
            (CategoryBean) (categoryHelper.getRecordById(rs.getString("categoryId"))));
        leadBean.setSectionBean(
            (SectionBean) (sectionHelper.getRecordById(rs.getString("sectionId"))));
        leadBean.setType(rs.getString("type"));
        leadBean.setDateOpen(rs.getString("dateOpen"));
        leadBean.setDateClose(rs.getString("dateClose"));
        leadBean.setExpectedDateClose(rs.getString("expectedDateClose"));
        leadBean.setProbability(rs.getString("probability"));
        leadBean.setDayClose(rs.getString("dayClose"));
        leadBean.setDayOpen(rs.getString("dayOpen"));
        leadBean.setReferredBy(rs.getString("referredBy"));
        leadBean.setUserId(rs.getString("userId"));
        leadBean.setNextActionDate(rs.getString("nextActionDate"));
        leadBean.setNextAction(rs.getString("nextAction"));
        leadBean.setStatus(rs.getBoolean("status"));
        leadBean.setCreateBy(rs.getString("createBy"));
        leadBean.setCreateDate(rs.getString("createDate"));
        leadBean.setWriteBy(rs.getString("writeBy"));
        leadBean.setWriteDate(rs.getString("writeDate"));
        retValue.add(leadBean);
      }
    } catch (SQLException e) {
      ZLog.err("VNC CRM for Zimbra", "Error in Lead Helper Class", e);
    }
    return retValue;
  }