示例#1
0
        public static void Call(Arebis.CodeGeneration.IGenerationHost host,
            IZetboxContext ctx,
            Templates.Serialization.SerializationMembersList serializationList,
            ObjectReferenceProperty prop)
        {
            if (host == null) { throw new ArgumentNullException("host"); }
            if (ctx == null) { throw new ArgumentNullException("ctx"); }
            if (prop == null) { throw new ArgumentNullException("prop"); }
            if (!prop.IsList()) { throw new ArgumentOutOfRangeException("prop", "prop must be a List-valued property"); }

            var rel = RelationExtensions.Lookup(ctx, prop);
            var relEnd = rel.GetEnd(prop);
            var otherEnd = rel.GetOtherEnd(relEnd);

            string name = prop.Name;

            // whether or not the collection will be eagerly loaded
            bool eagerLoading = relEnd.Navigator != null && relEnd.Navigator.EagerLoading;

            string wrapperName = "_" + name;
            string wrapperClass = "OneNRelationList";

            var exposedListType = otherEnd.HasPersistentOrder ? "IList" : "ICollection";
            // the name of the position property
            var positionPropertyName = rel.NeedsPositionStorage(otherEnd.GetRole()) ? Construct.ListPositionPropertyName(otherEnd) : String.Empty;
            var otherName = otherEnd.Navigator == null ? relEnd.RoleName : otherEnd.Navigator.Name;
            var referencedInterface = otherEnd.Type.GetDataTypeString();
            var referencedProxy = Mappings.ObjectClassHbm.GetProxyTypeReference(otherEnd.Type, host.Settings);

            Call(host, ctx, serializationList, name, eagerLoading, wrapperName, wrapperClass, exposedListType, positionPropertyName, otherName, referencedInterface, referencedProxy);
        }
示例#2
0
        public static ObjectClass GetReferencedObjectClass(this ObjectReferenceProperty prop)
        {
            if (prop == null)
            {
                throw new ArgumentNullException("prop");
            }

            var rel = prop.RelationEnd.GetParent();

            if (rel == null)
            {
                return(null);
            }

            var relEnd = prop.RelationEnd;

            if (relEnd == null)
            {
                return(null);
            }

            var otherEnd = rel.GetOtherEnd(relEnd);

            if (otherEnd == null)
            {
                return(null);
            }

            return(otherEnd.Type);
        }
示例#3
0
        protected override void ApplyObjectReferencePropertyTemplate(ObjectReferenceProperty prop)
        {
            var rel = Zetbox.App.Extensions.RelationExtensions.Lookup(ctx, prop);

            // Navigator can be NULL
            // Debug.Assert(rel.A.Navigator.ID == prop.ID || rel.B.Navigator.ID == prop.ID);
            RelationEnd relEnd   = rel.GetEnd(prop);
            RelationEnd otherEnd = rel.GetOtherEnd(relEnd);

            if (rel.Storage == StorageType.Separate)
            {
                throw new InvalidOperationException("Separate Storage not implemented for ObjectReferenceProperty in 1:N");
            }

            this.WriteLine("    /*");
            RelationDebugTemplate.Call(Host, ctx, rel);
            this.WriteLine("    */");

            this.WriteLine("        // object reference property");
            Templates.Properties.ObjectReferencePropertyTemplate.Call(
                Host,
                ctx,
                this.MembersToSerialize,
                prop, true, true);
        }
示例#4
0
        public static void ToString(ObjectReferenceProperty obj, MethodReturnEventArgs <string> e)
        {
            e.Result = "-> " + e.Result;

            // already handled by base OnToString_Property()
            // ToStringHelper.FixupFloatingObjects(obj, e);
        }
示例#5
0
        public static void Call(Arebis.CodeGeneration.IGenerationHost host,
                                IZetboxContext ctx,
                                Serialization.SerializationMembersList serializationList,
                                ObjectReferenceProperty prop)
        {
            if (ctx == null)
            {
                throw new ArgumentNullException("ctx");
            }
            if (prop == null)
            {
                throw new ArgumentNullException("prop");
            }
            if (!prop.IsList())
            {
                throw new ArgumentOutOfRangeException("prop", "prop must be a List-valued property");
            }

            string name            = prop.Name;
            string wrapperClass    = "OneNRelationList";
            var    rel             = RelationExtensions.Lookup(ctx, prop);
            var    relEnd          = rel.GetEnd(prop);
            var    otherEnd        = rel.GetOtherEnd(relEnd);
            var    exposedListType = rel.NeedsPositionStorage(otherEnd.GetRole()) ? "IList" : "ICollection";
            // the name of the position property
            var positionPropertyName = rel.NeedsPositionStorage(otherEnd.GetRole()) ? Construct.ListPositionPropertyName(otherEnd) : String.Empty;

            Call(host, ctx, serializationList, name, wrapperClass, exposedListType, rel, relEnd.GetRole(), positionPropertyName);
        }
        public static void ToString(ObjectReferenceProperty obj, MethodReturnEventArgs<string> e)
        {
            e.Result = "-> " + e.Result;

            // already handled by base OnToString_Property()
            // ToStringHelper.FixupFloatingObjects(obj, e);
        }
示例#7
0
        public static void GetPropertyType(ObjectReferenceProperty obj, MethodReturnEventArgs <Type> e)
        {
            var def = obj.GetReferencedObjectClass();

            e.Result = Type.GetType(def.Module.Namespace + "." + def.Name + ", " + Zetbox.API.Helper.InterfaceAssembly, true);
            PropertyActions.DecorateParameterType(obj, e, false, obj.GetIsList(), obj.RelationEnd.Parent.GetOtherEnd(obj.RelationEnd).HasPersistentOrder);
        }
示例#8
0
        protected override void ApplyObjectReferenceListTemplate(ObjectReferenceProperty prop)
        {
            var rel = RelationExtensions.Lookup(ctx, prop);

            var relEnd = rel.GetEnd(prop);

            //var otherEnd = rel.GetOtherEnd(relEnd);

            // without navigator, there should be no property
            if (relEnd.Navigator == null)
            {
                return;
            }

            switch ((StorageType)rel.Storage)
            {
            case StorageType.MergeIntoA:
            case StorageType.MergeIntoB:
            case StorageType.Replicate:
                // simple and direct reference
                this.WriteLine("        // object list property");
                ApplyObjectListPropertyTemplate(prop);
                break;

            case StorageType.Separate:
                this.WriteLine("        // collection entry list property");
                ApplyCollectionEntryListTemplate(prop);
                break;

            default:
                throw new NotImplementedException("unknown StorageHint for ObjectReferenceProperty[IsList == true]");
            }
        }
示例#9
0
        public static void Call(Arebis.CodeGeneration.IGenerationHost host,
                                IZetboxContext ctx,
                                Templates.Serialization.SerializationMembersList serializationList,
                                ObjectReferenceProperty prop, bool callGetterSetterEvents,
                                bool updateInverseNavigator)
        {
            if (ctx == null)
            {
                throw new ArgumentNullException("ctx");
            }
            if (prop == null)
            {
                throw new ArgumentNullException("prop");
            }

            string name                = prop.Name;
            string ownInterface        = prop.ObjectClass.GetDataTypeString();
            string referencedInterface = String.Format(
                "{0}.{1}",
                prop.GetReferencedObjectClass().Module.Namespace,
                prop.GetReferencedObjectClass().Name);

            var rel             = RelationExtensions.Lookup(ctx, prop);
            var endRole         = rel.GetEnd(prop).GetRole();
            var assocNameSuffix = String.Empty;

            Call(host, ctx, serializationList,
                 ownInterface, name, referencedInterface, rel, endRole, callGetterSetterEvents, updateInverseNavigator, assocNameSuffix);
        }
 public static void GetPropertyTypeString(ObjectReferenceProperty obj, MethodReturnEventArgs<string> e)
 {
     GetElementTypeString(obj, e);
     if (obj.RelationEnd != null)
     {
         PropertyActions.DecorateParameterType(obj, e, false, obj.GetIsList(), obj.RelationEnd.Parent.GetOtherEnd(obj.RelationEnd).HasPersistentOrder);
     }
 }
示例#11
0
        protected virtual void ApplyCollectionEntryListTemplate(ObjectReferenceProperty prop)
        {
            var rel    = RelationExtensions.Lookup(ctx, prop);
            var relEnd = rel.GetEnd(prop);

            Properties.CollectionEntryListProperty.Call(Host, ctx,
                                                        this.MembersToSerialize,
                                                        rel, relEnd.GetRole());
        }
        public static void GetIsList(ObjectReferenceProperty prop, MethodReturnEventArgs<bool> e)
        {
            if (prop == null) { throw new ArgumentNullException("prop"); }
            RelationEnd relEnd = prop.RelationEnd;
            Relation rel = relEnd.GetParent();
            RelationEnd otherEnd = rel.GetOtherEnd(relEnd);

            e.Result = otherEnd.Multiplicity.UpperBound() > 1;
        }
示例#13
0
 public static void GetEnd(Relation rel, MethodReturnEventArgs<RelationEnd> e, ObjectReferenceProperty prop)
 {
     if (rel.A != null && rel.A.Navigator == prop)
         e.Result = rel.A;
     else if (rel.B != null && rel.B.Navigator == prop)
         e.Result = rel.B;
     else
         e.Result = null;
 }
示例#14
0
        protected override void ApplyCollectionEntryListTemplate(ObjectReferenceProperty prop)
        {
            var rel = RelationExtensions.Lookup(ctx, prop);
            var relEnd = rel.GetEnd(prop);
            //var otherEnd = rel.GetOtherEnd(relEnd);

            Properties.CollectionEntryListProperty.Call(Host, ctx,
                 this.MembersToSerialize,
                 rel, relEnd.GetRole());
        }
示例#15
0
        private static bool IsNullable(this ObjectReferenceProperty p)
        {
            if (p == null)
            {
                throw new ArgumentNullException("p");
            }
            var relEnd   = p.RelationEnd;
            var rel      = relEnd.GetParent();
            var otherEnd = rel.GetOtherEnd(relEnd);

            return(otherEnd.IsNullable());
        }
示例#16
0
        public static void GetIsList(ObjectReferenceProperty prop, MethodReturnEventArgs <bool> e)
        {
            if (prop == null)
            {
                throw new ArgumentNullException("prop");
            }
            RelationEnd relEnd   = prop.RelationEnd;
            Relation    rel      = relEnd.GetParent();
            RelationEnd otherEnd = rel.GetOtherEnd(relEnd);

            e.Result = otherEnd.Multiplicity.UpperBound() > 1;
        }
示例#17
0
        public static Relation Lookup(IZetboxContext ctx, ObjectReferenceProperty prop)
        {
            if (prop == null)
            {
                throw new ArgumentNullException("prop");
            }
            if (prop.RelationEnd == null)
            {
                return(null);
            }

            return(prop.RelationEnd.AParent ?? prop.RelationEnd.BParent);
        }
 public static void GetElementTypeString(ObjectReferenceProperty obj, MethodReturnEventArgs<string> e)
 {
     var def = obj.GetReferencedObjectClass();
     if (def == null)
     {
         e.Result = "<no class>";
     }
     else if (def.Module == null)
     {
         e.Result = "<no namespace>." + def.Name;
     }
     else
     {
         e.Result = def.Module.Namespace + "." + def.Name;
     }
     PropertyActions.DecorateElementType(obj, e, false);
 }
示例#19
0
        public static bool IsList(this ObjectReferenceProperty prop)
        {
            if (prop == null)
            {
                throw new ArgumentNullException("prop");
            }
            if (prop.RelationEnd == null)
            {
                throw new InvalidOperationException(string.Format("Error: object reference property {0} on ObjectClass {1} has no relation end", prop.Name, prop.ObjectClass));
            }

            RelationEnd relEnd   = prop.RelationEnd;
            Relation    rel      = relEnd.GetParent();
            RelationEnd otherEnd = rel.GetOtherEnd(relEnd);

            return(otherEnd.Multiplicity.UpperBound() > 1);
        }
示例#20
0
        public static void GetElementTypeString(ObjectReferenceProperty obj, MethodReturnEventArgs <string> e)
        {
            var def = obj.GetReferencedObjectClass();

            if (def == null)
            {
                e.Result = "<no class>";
            }
            else if (def.Module == null)
            {
                e.Result = "<no namespace>." + def.Name;
            }
            else
            {
                e.Result = def.Module.Namespace + "." + def.Name;
            }
            PropertyActions.DecorateElementType(obj, e, false);
        }
示例#21
0
        public static void Call(Arebis.CodeGeneration.IGenerationHost host,
                                IZetboxContext ctx,
                                Templates.Serialization.SerializationMembersList serializationList,
                                ObjectReferenceProperty prop)
        {
            if (host == null)
            {
                throw new ArgumentNullException("host");
            }
            if (ctx == null)
            {
                throw new ArgumentNullException("ctx");
            }
            if (prop == null)
            {
                throw new ArgumentNullException("prop");
            }
            if (!prop.IsList())
            {
                throw new ArgumentOutOfRangeException("prop", "prop must be a List-valued property");
            }

            var rel      = RelationExtensions.Lookup(ctx, prop);
            var relEnd   = rel.GetEnd(prop);
            var otherEnd = rel.GetOtherEnd(relEnd);

            string name = prop.Name;

            // whether or not the collection will be eagerly loaded
            bool eagerLoading = relEnd.Navigator != null && relEnd.Navigator.EagerLoading;

            string wrapperName  = "_" + name;
            string wrapperClass = "OneNRelationList";

            var exposedListType = otherEnd.HasPersistentOrder ? "IList" : "ICollection";
            // the name of the position property
            var positionPropertyName = rel.NeedsPositionStorage(otherEnd.GetRole()) ? Construct.ListPositionPropertyName(otherEnd) : String.Empty;
            var otherName            = otherEnd.Navigator == null ? relEnd.RoleName : otherEnd.Navigator.Name;
            var referencedInterface  = otherEnd.Type.GetDataTypeString();
            var referencedProxy      = Mappings.ObjectClassHbm.GetProxyTypeReference(otherEnd.Type, host.Settings);

            Call(host, ctx, serializationList, name, eagerLoading, wrapperName, wrapperClass, exposedListType, positionPropertyName, otherName, referencedInterface, referencedProxy);
        }
示例#22
0
        public static void Call(Arebis.CodeGeneration.IGenerationHost host,
            IZetboxContext ctx,
            Serialization.SerializationMembersList serializationList,
            ObjectReferenceProperty prop)
        {
            if (ctx == null) { throw new ArgumentNullException("ctx"); }
            if (prop == null) { throw new ArgumentNullException("prop"); }
            if (!prop.IsList()) { throw new ArgumentOutOfRangeException("prop", "prop must be a List-valued property"); }

            string name = prop.Name;
            string wrapperClass = "OneNRelationList";
            var rel = RelationExtensions.Lookup(ctx, prop);
            var relEnd = rel.GetEnd(prop);
            var otherEnd = rel.GetOtherEnd(relEnd);
            var exposedListType = rel.NeedsPositionStorage(otherEnd.GetRole()) ? "IList" : "ICollection";
            // the name of the position property
            var positionPropertyName = rel.NeedsPositionStorage(otherEnd.GetRole()) ? Construct.ListPositionPropertyName(otherEnd) : String.Empty;

            Call(host, ctx, serializationList, name, wrapperClass, exposedListType, rel, relEnd.GetRole(), positionPropertyName);
        }
示例#23
0
        public static void Call(Arebis.CodeGeneration.IGenerationHost _host, IZetboxContext ctx, ObjectReferenceProperty prop)
        {
            if (_host == null) { throw new ArgumentNullException("_host"); }
            if (ctx == null) { throw new ArgumentNullException("ctx"); }
            if (prop == null) { throw new ArgumentNullException("prop"); }

            Relation rel = Zetbox.App.Extensions.RelationExtensions.Lookup(ctx, prop);
            RelationEnd relEnd = rel.GetEnd(prop);
            RelationEnd otherEnd = rel.GetOtherEnd(relEnd);

            string referencedInterface = otherEnd.Type.Module.Namespace + "." + otherEnd.Type.Name;
            string referencedImplementation = Mappings.ObjectClassHbm.GetWrapperTypeReference(otherEnd.Type, _host.Settings);
            string name = prop.Name;
            string implNameUnused = null;
            string fkBackingName = "_fk_" + name;
            string fkGuidBackingName = "_fk_guid_" + name;
            bool isExportable = relEnd.Type.ImplementsIExportable() && otherEnd.Type.ImplementsIExportable();

            ReloadOneReference.Call(_host, ctx, referencedInterface, referencedImplementation, name, implNameUnused, fkBackingName, fkGuidBackingName, isExportable);
        }
        public static void Call(Arebis.CodeGeneration.IGenerationHost host,
            IZetboxContext ctx,
            Templates.Serialization.SerializationMembersList serializationList,
            ObjectReferenceProperty prop, bool callGetterSetterEvents,
            bool updateInverseNavigator)
        {
            if (ctx == null) { throw new ArgumentNullException("ctx"); }
            if (prop == null) { throw new ArgumentNullException("prop"); }

            string name = prop.Name;
            string ownInterface = prop.ObjectClass.GetDataTypeString();
            string referencedInterface = String.Format(
                "{0}.{1}",
                prop.GetReferencedObjectClass().Module.Namespace,
                prop.GetReferencedObjectClass().Name);

            var rel = RelationExtensions.Lookup(ctx, prop);
            var endRole = rel.GetEnd(prop).GetRole();
            Call(host, ctx, serializationList,
                ownInterface, name, referencedInterface, rel, endRole, callGetterSetterEvents, updateInverseNavigator, String.Empty);
        }
示例#25
0
        protected override void ApplyObjectReferenceListTemplate(ObjectReferenceProperty prop)
        {
            // TODO: move debugging output into Templates
            this.WriteLine("    /*");
            RelationDebugTemplate.Call(Host, ctx, Zetbox.App.Extensions.RelationExtensions.Lookup(ctx, prop));
            this.WriteLine("    */");

            var rel = RelationExtensions.Lookup(ctx, prop);

            var relEnd   = rel.GetEnd(prop);
            var otherEnd = rel.GetOtherEnd(relEnd);

            // without navigator, there should be no property
            if (relEnd.Navigator == null)
            {
                return;
            }

            switch ((StorageType)rel.Storage)
            {
            case StorageType.MergeIntoA:
            case StorageType.MergeIntoB:
            case StorageType.Replicate:
                // simple and direct reference
                this.WriteLine("        // object list property");
                base.ApplyObjectReferenceListTemplate(relEnd.Navigator as ObjectReferenceProperty);
                break;

            case StorageType.Separate:
                this.WriteLine("        // collection reference property");
                ApplyCollectionEntryListTemplate(rel, relEnd.GetRole());
                break;

            default:
                throw new NotImplementedException("unknown StorageHint for ObjectReferenceProperty[IsList == true]");
            }
        }
示例#26
0
        private void ApplyNMProperty(
            Relation rel, RelationEnd relEnd, RelationEnd otherEnd,
            ObjectReferenceProperty prop)
        {
            this.WriteLine("        <!-- NMProperty -->");
            this.WriteLine("        <!-- rel={0} -->", rel.GetRelationClassName());
            this.WriteLine("        <!-- relEnd={0} otherEnd={1} -->", relEnd.RoleName, otherEnd.RoleName);

            string nameAttr  = String.Format("name=\"{0}\"", prop.Name);
            string tableName = rel.GetRelationTableName();
            string tableAttr = String.Format("table=\"`{0}`\"", tableName);

            string relationEntryClassAttr = String.Format("class=\"{0}.{1}{2}+{1}Proxy,Zetbox.Objects.NHibernateImpl\"",
                                                          rel.Module.Namespace,
                                                          rel.GetRelationClassName(),
                                                          ImplementationSuffix);

            string fkThisColumnAttr = String.Format("column=\"`{0}`\"", Construct.ForeignKeyColumnName(relEnd));

            //string fkOtherColumnAttr = String.Format("column=\"`{0}`\"", Construct.ForeignKeyColumnName(otherEnd));

            // always map as set, the wrapper has to translate/order the elements
            this.WriteObjects("        <set ", nameAttr, " ", tableAttr, " inverse=\"true\" cascade=\"all-delete-orphan\" batch-size=\"100\" ");
            if (prop.EagerLoading)
            {
                // TODO: re-think and re-test eagerloading
                //this.WriteObjects("lazy=\"false\" fetch=\"join\" ");
            }
            this.WriteLine(">");

            this.WriteObjects("            <key ", fkThisColumnAttr, " />");
            this.WriteLine();
            this.WriteObjects("            <one-to-many ", relationEntryClassAttr, " />");
            this.WriteLine();
            this.WriteObjects("        </set>");
            this.WriteLine();
        }
示例#27
0
 public ObjectCollectionPropertyValueModel(INotifyingObject obj, ObjectReferenceProperty prop)
     : base(obj, prop)
 {
 }
示例#28
0
 public BaseObjectCollectionPropertyValueModel(INotifyingObject obj, ObjectReferenceProperty prop)
     : base(obj, prop)
 {
     this.objRefProp = prop;
 }
示例#29
0
        public static IValueModel GetDetachedValueModel(this Property prop, bool allowNullInput)
        {
            if (prop == null)
            {
                throw new ArgumentNullException("prop");
            }

            var lb = prop.GetLabel();

            if (prop is IntProperty)
            {
                return(new NullableStructValueModel <int>(lb, prop.Description, allowNullInput, false, prop.RequestedKind));
            }
            else if (prop is BoolProperty)
            {
                return(new BoolValueModel(lb, prop.Description, allowNullInput, false, prop.RequestedKind));
            }
            else if (prop is DoubleProperty)
            {
                return(new NullableStructValueModel <double>(lb, prop.Description, allowNullInput, false, prop.RequestedKind));
            }
            else if (prop is DecimalProperty)
            {
                return(new DecimalValueModel(lb, prop.Description, allowNullInput, false, prop.RequestedKind));
            }
            else if (prop is GuidProperty)
            {
                return(new NullableStructValueModel <Guid>(lb, prop.Description, allowNullInput, false, prop.RequestedKind));
            }
            else if (prop is DateTimeProperty)
            {
                var dtp = (DateTimeProperty)prop;
                return(new DateTimeValueModel(lb, prop.Description, allowNullInput, false, dtp.DateTimeStyle ?? DateTimeStyles.DateTime, prop.RequestedKind));
            }
            else if (prop is EnumerationProperty)
            {
                return(new EnumerationValueModel(lb, prop.Description, allowNullInput, false, prop.RequestedKind, ((EnumerationProperty)prop).Enumeration));
            }
            else if (prop is StringProperty)
            {
                return(new ClassValueModel <string>(lb, prop.Description, allowNullInput, false, prop.RequestedKind));
            }
            else if (prop is ObjectReferenceProperty)
            {
                ObjectReferenceProperty objRefProp = (ObjectReferenceProperty)prop;
                if (objRefProp.GetIsList())
                {
                    //var sorted = objRefProp.RelationEnd.Parent.GetOtherEnd(objRefProp.RelationEnd).HasPersistentOrder;
                    //if (sorted)
                    //{
                    //    return new ObjectListValueModel(obj, objRefProp);
                    //}
                    //else
                    //{
                    //    return new ObjectCollectionValueModel(obj, objRefProp);
                    //}
                }
                else
                {
                    return(new ObjectReferenceValueModel(lb, prop.Description, allowNullInput, false, prop.RequestedKind, objRefProp.GetReferencedObjectClass()));
                }
            }
            else if (prop is CompoundObjectProperty)
            {
                return(new CompoundObjectValueModel(lb, prop.Description, allowNullInput, false, prop.RequestedKind, ((CompoundObjectProperty)prop).CompoundObjectDefinition));
            }

            throw new NotImplementedException(string.Format("GetValueModel is not implemented for {0} properties yet", prop.GetPropertyTypeString()));
        }
示例#30
0
 public static void GetEnd(Relation rel, MethodReturnEventArgs <RelationEnd> e, ObjectReferenceProperty prop)
 {
     if (rel.A != null && rel.A.Navigator == prop)
     {
         e.Result = rel.A;
     }
     else if (rel.B != null && rel.B.Navigator == prop)
     {
         e.Result = rel.B;
     }
     else
     {
         e.Result = null;
     }
 }
示例#31
0
        protected virtual void ApplyObjectReferenceProperty(string prefix, ObjectReferenceProperty prop)
        {
            this.WriteLine("<!-- ObjectReferenceProperty -->");

            var rel      = Zetbox.App.Extensions.RelationExtensions.Lookup(ctx, prop);
            var relEnd   = rel.GetEnd(prop);
            var otherEnd = rel.GetOtherEnd(relEnd);

            string nameAttr  = String.Format("name=\"{0}\"", prop.Name);
            string classAttr = String.Format("class=\"{0}\"",
                                             ObjectClassHbm.GetAssemblyQualifiedProxy(otherEnd.Type, this.Settings));

            //string tableAttr = String.Format("table =\"`{0}`\" ", rel.GetAssociationName());

            switch (rel.GetRelationType())
            {
            case RelationType.one_one:
                if (rel.HasStorage(relEnd.GetRole()))
                {
                    string columnAttr = String.Format("column=\"`{0}`\"", Construct.ForeignKeyColumnName(otherEnd, prefix));
                    this.WriteObjects("        <many-to-one ", nameAttr, " ", columnAttr, " ", classAttr, " unique=\"true\" ");
                    if (prop.EagerLoading)
                    {
                        // TODO: re-think and re-test eagerloading
                        //this.WriteObjects("fetch=\"join\" ");
                    }
                    this.WriteLine("/>");
                }
                else
                {
                    this.WriteObjects("        <one-to-one ", nameAttr, " ", classAttr,
                                      " constrained=\"false\" ", // constrained must be false, because else the reference is not optional(!)
                                                                 // TODO: re-think and re-test eagerloading
                                                                 //prop.EagerLoading ? "fetch=\"join\" " : String.Empty,
                                      "property-ref=\"" + (otherEnd.Navigator != null ? otherEnd.Navigator.Name : "(no nav)") + "\" />");
                }
                break;

            case RelationType.one_n:
                if (otherEnd.Multiplicity.UpperBound() > 1)     // we are 1-side
                {
                    // always map as set, the wrapper has to translate/order the elements
                    this.WriteObjects("        <set ", nameAttr, " batch-size=\"100\" cascade=\"none\" inverse=\"true\" ");
                    if (prop.EagerLoading)
                    {
                        // TODO: re-think and re-test eagerloading
                        //this.WriteObjects("lazy=\"false\" fetch=\"join\" ");
                    }
                    this.WriteLine(">");
                    string columnAttr = String.Format("column=\"`{0}`\"", Construct.ForeignKeyColumnName(relEnd, prefix));
                    this.WriteObjects("            <key ", columnAttr, " />");
                    this.WriteLine();
                    this.WriteObjects("            <one-to-many ", classAttr, " />");
                    this.WriteLine();
                    this.WriteLine("        </set>");
                }
                else     // we are n-side
                {
                    string columnAttr = String.Format("column=\"`{0}`\"", Construct.ForeignKeyColumnName(otherEnd, prefix));
                    this.WriteObjects("        <many-to-one ", nameAttr, " ", columnAttr, " ", classAttr, " ");
                    if (prop.EagerLoading)
                    {
                        // TODO: re-think and re-test eagerloading
                        //this.WriteObjects("fetch=\"join\" ");
                    }
                    this.WriteLine("/>");
                    if (rel.NeedsPositionStorage(relEnd.GetRole()))
                    {
                        string posNameAttr   = String.Format("name=\"{0}\"", Construct.ListPositionPropertyName(relEnd));
                        string posColumnAttr = String.Format("column=\"`{0}`\"", Construct.ListPositionColumnName(otherEnd, prefix));
                        this.WriteObjects("        <property ", posNameAttr, " ", posColumnAttr, " />");
                        this.WriteLine();
                    }
                }
                break;

            case RelationType.n_m:
                ApplyNMProperty(rel, relEnd, otherEnd, prop);
                break;

            default:
                throw new NotImplementedException(String.Format("Unknown RelationType {0} found", rel.GetRelationType()));
            }

            this.WriteLine();
        }
示例#32
0
文件: Template.cs 项目: daszat/zetbox
        protected override void ApplyObjectReferenceListTemplate(ObjectReferenceProperty prop)
        {
            var rel = RelationExtensions.Lookup(ctx, prop);

            var relEnd = rel.GetEnd(prop);
            //var otherEnd = rel.GetOtherEnd(relEnd);

            // without navigator, there should be no property
            if (relEnd.Navigator == null)
                return;

            switch ((StorageType)rel.Storage)
            {
                case StorageType.MergeIntoA:
                case StorageType.MergeIntoB:
                case StorageType.Replicate:
                    // simple and direct reference
                    this.WriteLine("        // object list property");
                    ApplyObjectListPropertyTemplate(prop);
                    break;
                case StorageType.Separate:
                    this.WriteLine("        // collection entry list property");
                    ApplyCollectionEntryListTemplate(prop);
                    break;
                default:
                    throw new NotImplementedException("unknown StorageHint for ObjectReferenceProperty[IsList == true]");
            }
        }
示例#33
0
 protected virtual void ApplyObjectReferenceListTemplate(ObjectReferenceProperty prop)
 {
     this.WriteLine("        // object reference list property");
     ApplyListProperty(prop, this.MembersToSerialize);
 }
示例#34
0
        private void ApplyNMProperty(
            Relation rel, RelationEnd relEnd, RelationEnd otherEnd,
            ObjectReferenceProperty prop)
        {
            this.WriteLine("        <!-- NMProperty -->");
            this.WriteLine("        <!-- rel={0} -->", rel.GetRelationClassName());
            this.WriteLine("        <!-- relEnd={0} otherEnd={1} -->", relEnd.RoleName, otherEnd.RoleName);

            string nameAttr = String.Format("name=\"{0}\"", prop.Name);
            string tableName = rel.GetRelationTableName();
            string tableAttr = String.Format("table=\"`{0}`\"", tableName);

            string relationEntryClassAttr = String.Format("class=\"{0}.{1}{2}+{1}Proxy,Zetbox.Objects.NHibernateImpl\"",
                rel.Module.Namespace,
                rel.GetRelationClassName(),
                ImplementationSuffix);

            string fkThisColumnAttr = String.Format("column=\"`{0}`\"", Construct.ForeignKeyColumnName(relEnd));
            //string fkOtherColumnAttr = String.Format("column=\"`{0}`\"", Construct.ForeignKeyColumnName(otherEnd));

            // always map as set, the wrapper has to translate/order the elements
            this.WriteObjects("        <set ", nameAttr, " ", tableAttr, " inverse=\"true\" cascade=\"all-delete-orphan\" batch-size=\"100\" ");
            if (prop.EagerLoading)
            {
                // TODO: re-think and re-test eagerloading
                //this.WriteObjects("lazy=\"false\" fetch=\"join\" ");
            }
            this.WriteLine(">");

            this.WriteObjects("            <key ", fkThisColumnAttr, " />");
            this.WriteLine();
            this.WriteObjects("            <one-to-many ", relationEntryClassAttr, " />");
            this.WriteLine();
            this.WriteObjects("        </set>");
            this.WriteLine();
        }
示例#35
0
 protected virtual void ApplyObjectReferencePropertyTemplate(ObjectReferenceProperty prop)
 {
     this.WriteLine("        // object reference property");
     ApplyNotifyingValueProperty(prop, this.MembersToSerialize);
 }
示例#36
0
 protected virtual void ApplyObjectReferenceListTemplate(ObjectReferenceProperty prop)
 {
     this.WriteLine("        // object reference list property");
     ApplyListProperty(prop, this.MembersToSerialize);
 }
示例#37
0
文件: Template.cs 项目: daszat/zetbox
        protected override void ApplyObjectReferencePropertyTemplate(ObjectReferenceProperty prop)
        {
            var rel = Zetbox.App.Extensions.RelationExtensions.Lookup(ctx, prop);

            // Navigator can be NULL
            // Debug.Assert(rel.A.Navigator.ID == prop.ID || rel.B.Navigator.ID == prop.ID);
            RelationEnd relEnd = rel.GetEnd(prop);
            RelationEnd otherEnd = rel.GetOtherEnd(relEnd);

            if (rel.Storage == StorageType.Separate)
            {
                throw new InvalidOperationException("Separate Storage not implemented for ObjectReferenceProperty in 1:N");
            }

            this.WriteLine("    /*");
            RelationDebugTemplate.Call(Host, ctx, rel);
            this.WriteLine("    */");

            this.WriteLine("        // object reference property");
            Templates.Properties.ObjectReferencePropertyTemplate.Call(
                Host,
                ctx,
                this.MembersToSerialize,
                prop, true, true);
        }
示例#38
0
文件: Template.cs 项目: daszat/zetbox
        protected override void ApplyObjectReferenceListTemplate(ObjectReferenceProperty prop)
        {
            // TODO: move debugging output into Templates
            this.WriteLine("    /*");
            RelationDebugTemplate.Call(Host, ctx, Zetbox.App.Extensions.RelationExtensions.Lookup(ctx, prop));
            this.WriteLine("    */");

            var rel = RelationExtensions.Lookup(ctx, prop);

            var relEnd = rel.GetEnd(prop);
            var otherEnd = rel.GetOtherEnd(relEnd);

            // without navigator, there should be no property
            if (relEnd.Navigator == null)
                return;

            switch ((StorageType)rel.Storage)
            {
                case StorageType.MergeIntoA:
                case StorageType.MergeIntoB:
                case StorageType.Replicate:
                    // simple and direct reference
                    this.WriteLine("        // object list property");
                    base.ApplyObjectReferenceListTemplate(relEnd.Navigator as ObjectReferenceProperty);
                    break;
                case StorageType.Separate:
                    this.WriteLine("        // collection reference property");
                    ApplyCollectionEntryListTemplate(rel, relEnd.GetRole());
                    break;
                default:
                    throw new NotImplementedException("unknown StorageHint for ObjectReferenceProperty[IsList == true]");
            }
        }
示例#39
0
 protected override void ApplyObjectListPropertyTemplate(ObjectReferenceProperty prop)
 {
     Properties.ObjectListProperty.Call(Host, ctx,
                                        this.MembersToSerialize,
                                        prop);
 }
示例#40
0
文件: Template.cs 项目: daszat/zetbox
 protected virtual void ApplyObjectListPropertyTemplate(ObjectReferenceProperty prop)
 {
     Properties.ObjectListProperty.Call(Host, ctx,
          this.MembersToSerialize,
          prop);
 }
示例#41
0
        public static Relation Lookup(IZetboxContext ctx, ObjectReferenceProperty prop)
        {
            if (prop == null) { throw new ArgumentNullException("prop"); }
            if (prop.RelationEnd == null) { return null; }

            return prop.RelationEnd.AParent ?? prop.RelationEnd.BParent;
        }
示例#42
0
 protected virtual void ApplyObjectReferencePropertyTemplate(ObjectReferenceProperty prop)
 {
     this.WriteLine("        // object reference property");
     ApplyNotifyingValueProperty(prop, this.MembersToSerialize);
 }
示例#43
0
 protected override void ApplyObjectReferencePropertyTemplate(ObjectReferenceProperty prop)
 {
     base.ApplyObjectReferencePropertyTemplate(prop);
 }
 public static void GetPropertyType(ObjectReferenceProperty obj, MethodReturnEventArgs<Type> e)
 {
     var def = obj.GetReferencedObjectClass();
     e.Result = Type.GetType(def.Module.Namespace + "." + def.Name + ", " + Zetbox.API.Helper.InterfaceAssembly, true);
     PropertyActions.DecorateParameterType(obj, e, false, obj.GetIsList(), obj.RelationEnd.Parent.GetOtherEnd(obj.RelationEnd).HasPersistentOrder);
 }
示例#45
0
文件: Template.cs 项目: daszat/zetbox
 protected override void ApplyObjectReferencePropertyTemplate(ObjectReferenceProperty prop)
 {
     Properties.ObjectReferencePropertyTemplate.Call(
         Host, ctx, this.MembersToSerialize,
         prop, true, true);
 }
示例#46
0
 protected override void ApplyObjectReferencePropertyTemplate(ObjectReferenceProperty prop)
 {
     base.ApplyObjectReferencePropertyTemplate(prop);
 }
示例#47
0
 public static void GetPropertyTypeString(ObjectReferenceProperty obj, MethodReturnEventArgs <string> e)
 {
     GetElementTypeString(obj, e);
     PropertyActions.DecorateParameterType(obj, e, false, obj.GetIsList(), obj.RelationEnd.Parent.GetOtherEnd(obj.RelationEnd).HasPersistentOrder);
 }
示例#48
0
        protected virtual void ApplyObjectReferenceProperty(string prefix, ObjectReferenceProperty prop)
        {
            this.WriteLine("<!-- ObjectReferenceProperty -->");

            var rel = Zetbox.App.Extensions.RelationExtensions.Lookup(ctx, prop);
            var relEnd = rel.GetEnd(prop);
            var otherEnd = rel.GetOtherEnd(relEnd);

            string nameAttr = String.Format("name=\"{0}\"", prop.Name);
            string classAttr = String.Format("class=\"{0}\"",
                ObjectClassHbm.GetAssemblyQualifiedProxy(otherEnd.Type, this.Settings));
            //string tableAttr = String.Format("table =\"`{0}`\" ", rel.GetAssociationName());

            switch (rel.GetRelationType())
            {
                case RelationType.one_one:
                    if (rel.HasStorage(relEnd.GetRole()))
                    {
                        string columnAttr = String.Format("column=\"`{0}`\"", Construct.ForeignKeyColumnName(otherEnd, prefix));
                        this.WriteObjects("        <many-to-one ", nameAttr, " ", columnAttr, " ", classAttr, " unique=\"true\" ");
                        if (prop.EagerLoading)
                        {
                            // TODO: re-think and re-test eagerloading
                            //this.WriteObjects("fetch=\"join\" ");
                        }
                        this.WriteLine("/>");
                    }
                    else
                    {
                        this.WriteObjects("        <one-to-one ", nameAttr, " ", classAttr,
                            " constrained=\"false\" ", // constrained must be false, because else the reference is not optional(!)
                            // TODO: re-think and re-test eagerloading
                            //prop.EagerLoading ? "fetch=\"join\" " : String.Empty,
                            "property-ref=\"" + (otherEnd.Navigator != null ? otherEnd.Navigator.Name : "(no nav)") + "\" />");
                    }
                    break;
                case RelationType.one_n:
                    if (otherEnd.Multiplicity.UpperBound() > 1) // we are 1-side
                    {
                        // always map as set, the wrapper has to translate/order the elements
                        this.WriteObjects("        <set ", nameAttr, " batch-size=\"100\" cascade=\"none\" inverse=\"true\" ");
                        if (prop.EagerLoading)
                        {
                            // TODO: re-think and re-test eagerloading
                            //this.WriteObjects("lazy=\"false\" fetch=\"join\" ");
                        }
                        this.WriteLine(">");
                        string columnAttr = String.Format("column=\"`{0}`\"", Construct.ForeignKeyColumnName(relEnd, prefix));
                        this.WriteObjects("            <key ", columnAttr, " />");
                        this.WriteLine();
                        this.WriteObjects("            <one-to-many ", classAttr, " />");
                        this.WriteLine();
                        this.WriteLine("        </set>");
                    }
                    else // we are n-side
                    {
                        string columnAttr = String.Format("column=\"`{0}`\"", Construct.ForeignKeyColumnName(otherEnd, prefix));
                        this.WriteObjects("        <many-to-one ", nameAttr, " ", columnAttr, " ", classAttr, " ");
                        if (prop.EagerLoading)
                        {
                            // TODO: re-think and re-test eagerloading
                            //this.WriteObjects("fetch=\"join\" ");
                        }
                        this.WriteLine("/>");
                        if (rel.NeedsPositionStorage(relEnd.GetRole()))
                        {
                            string posNameAttr = String.Format("name=\"{0}\"", Construct.ListPositionPropertyName(relEnd));
                            string posColumnAttr = String.Format("column=\"`{0}`\"", Construct.ListPositionColumnName(otherEnd, prefix));
                            this.WriteObjects("        <property ", posNameAttr, " ", posColumnAttr, " />");
                            this.WriteLine();
                        }
                    }
                    break;
                case RelationType.n_m:
                    ApplyNMProperty(rel, relEnd, otherEnd, prop);
                    break;
                default:
                    throw new NotImplementedException(String.Format("Unknown RelationType {0} found", rel.GetRelationType()));
            }

            this.WriteLine();
        }
示例#49
0
        public static void Call(Arebis.CodeGeneration.IGenerationHost _host, IZetboxContext ctx, ObjectReferenceProperty prop)
        {
            if (_host == null)
            {
                throw new ArgumentNullException("_host");
            }
            if (ctx == null)
            {
                throw new ArgumentNullException("ctx");
            }
            if (prop == null)
            {
                throw new ArgumentNullException("prop");
            }

            Relation    rel      = Zetbox.App.Extensions.RelationExtensions.Lookup(ctx, prop);
            RelationEnd relEnd   = rel.GetEnd(prop);
            RelationEnd otherEnd = rel.GetOtherEnd(relEnd);

            string referencedInterface      = otherEnd.Type.Module.Namespace + "." + otherEnd.Type.Name;
            string referencedImplementation = Mappings.ObjectClassHbm.GetWrapperTypeReference(otherEnd.Type, _host.Settings);
            string name              = prop.Name;
            string implNameUnused    = null;
            string fkBackingName     = "_fk_" + name;
            string fkGuidBackingName = "_fk_guid_" + name;
            bool   isExportable      = relEnd.Type.ImplementsIExportable() && otherEnd.Type.ImplementsIExportable();

            ReloadOneReference.Call(_host, ctx, referencedInterface, referencedImplementation, name, implNameUnused, fkBackingName, fkGuidBackingName, isExportable);
        }