private void GenerateComment(Field field, string padding)
 {
     WriteLine("{0}        /// <summary>", padding);
     if (field.IsHeterogenous)
     {
         string types = string.Join(", ", field.Types.Select(x => x.Name).OrderBy(x => x));
         if (field.IsMultivalue)
         {
             WriteLine("{0}        /// <para>List of either: {1}</para>", padding, types);
         }
         else
         {
             WriteLine("{0}        /// <para>Can be one of: {1}</para>", padding, types);
         }
     }
     if (field.IsMandatory)
     {
         WriteLine("{0}        /// <para>Mandatory field</para>", padding);
     }
     else
     {
         WriteLine("{0}        /// <para>Optional field might be null</para>", padding);
     }
     WriteLine("{0}        /// </summary>", padding);
 }
        private string GetPropertyType(Field field)
        {
            string type;
            if (field.IsHeterogenous)
            {
                type = "ModelBase";
            }
            else
            {
                type = Util.GetPropertyType(field.Type);
            }

            if (field.IsMultivalue)
            {
                type = string.Format("IList<{0}>", type);
            }

            return type;
        }
        public FieldsBuilder(XElement fieldsElement, IList<Field> fields)
        {
            if (fieldsElement == null)
            {
                return;
            }

            foreach (XElement fieldElement in fieldsElement.Descendants(Constants.XSD_NAMESPACE + "element"))
            {
                Field field = new Field
                {
                    Name = fieldElement.Attribute("name").Value,
                    IsMandatory = fieldElement.Attribute("minOccurs").Value == "1",
                    IsMultivalue = fieldElement.Attribute("maxOccurs").Value == "unbounded"
                };
                fields.Add(field);

                TypesBuilder typeBuilder = new TypesBuilder(fieldElement);
                field.Types.UnionWith(typeBuilder.Types);
            }
        }
        protected string GetPropertyName(Field field)
        {
            string name = Util.MakePropertyName(field.Name);
            switch (name)
            {
                case "Id":
                case "Title":
                case "Schema":
                    name += "Field";
                    break;
            }

            return name;
        }
        protected string GetFieldInitializer(Field field, string baseName)
        {
            StringBuilder result = new StringBuilder();

            if (field.IsHeterogenous)
            {
                result.AppendFormat("HeterogenousBuilder.Instance.Build({0}.LinkedComponentValue{1}(\"{2}\"))",
                    baseName,
                    field.IsMultivalue ? "s" : "",
                    field.Name);
            }
            else
            {
                Mitza.ModelGenerator.Model.Type fieldType = field.Type;
                switch (fieldType.TypeKind)
                {
                    case TypeKind.ComponentLink:
                        result.AppendFormat("{0}.Instance.Build({1}.LinkedComponentValue{2}(\"{3}\"))",
                            Util.MakeBuilderClassName(fieldType.Name),
                            baseName,
                            field.IsMultivalue ? "s" : "",
                            field.Name);
                        break;

                    case TypeKind.Date:
                        result.AppendFormat("{0}.DateTimeValue{1}(\"{2}\")", baseName, field.IsMultivalue ? "s" : "", field.Name);
                        break;

                    case TypeKind.Embedded:
                        result.AppendFormat("{0}.Instance.Build({1}.EmbeddedValue{2}(\"{3}\"))",
                            Util.MakeEmbeddedBuilderClassName(fieldType.Name),
                            baseName,
                            field.IsMultivalue ? "s" : "",
                            field.Name);
                        break;

                    case TypeKind.Keyword:
                        result.AppendFormat("{0}.KeywordValue{1}(\"{2}\")", baseName, field.IsMultivalue ? "s" : "", field.Name);
                        break;

                    case TypeKind.MultimediaLink:
                        result.AppendFormat("{0}.Instance.Build({1}.LinkedComponentValue{2}(\"{3}\"))",
                            Util.MakeMultimediaBuilderClassName(fieldType.Name),
                            baseName,
                            field.IsMultivalue ? "s" : "",
                            field.Name);
                        break;

                    case TypeKind.Numeric:
                        result.AppendFormat("{0}.NumericValue{1}(\"{2}\")", baseName, field.IsMultivalue ? "s" : "", field.Name);
                        break;

                    case TypeKind.RichText:
                        result.AppendFormat("{0}.ResolveRichText{1}(\"{2}\")", baseName, field.IsMultivalue ? "s" : "", field.Name);
                        break;

                    case TypeKind.Text:
                    default:
                        result.AppendFormat("{0}.StringValue{1}(\"{2}\")", baseName, field.IsMultivalue ? "s" : "", field.Name);
                        break;
                }
            }

            return result.ToString();
        }
 private void GenerateField(Field field, string padding)
 {
     GenerateComment(field, padding);
     WriteLine("{0}        public {1} {2} {{ get; set; }}", padding, GetPropertyType(field), GetPropertyName(field));
 }