[mapguide-users] .NET Objects for working with Mapguide Resources

Kenneth Skovhede, GEOGRAF A/S ks at geograf.dk
Sun May 25 08:44:53 EDT 2008


Hi Maksim.

Yes, it is possible.

Darrin has introduced me to a method with LinQ.
Jason has shown me the xsd.exe tool from Visual Studio.

My "own" method comes from this website:
http://weblogs.asp.net/cazzu/archive/2003/10/24/33302.aspx

I have cleaned up the code (which I can't find online anymore?), and 
wrapped it with a GUI.
The code is avalible in the SVN, in the folder "MaestroAPI/XSD Generator".

The problem with xsd.exe is that in VS 2003, it did not create 
properties, only fields.
In 2003/2005/2008 it does not generate collections, so all list methods 
are arrays, which is annoying.

I am working on another solution that uses xsd.exe for the first run, 
and then updates the code to use generic List<> properties.
It works by replacing all fields/properties of the array type with a 
List<> type, pretty basic.

With the LinQ method list properties are collections as expected. The 
LinQ classes have static methods for serializing/deserializing objects.

The xsd.exe based ones can be serialized with the XmlSerializer class 
from the .Net Xml standard package.

Regards, Kenneth Skovhede, GEOGRAF A/S



Maksim Sestic skrev:
> Hi Kenneth, Darrin,
>  
> Regarding the LinQ and XSD codegen - is it possible to generate a 
> C#/VB.NET serializable codebase out of XSD? I have been experimenting 
> a while ago with some custom codegen engine based on .NET 2.0 (due to 
> generics support), and I think it's doable - even without LinQ. The 
> basic concept is similar to VS.NET's own codegen tools:
>  
> 1) Fetch the XSD (or XML with embedded schema)
> 2) Generate codebase of desired flawour (C#, VB.NET, J#...)
> 3) Generated serializable object definitions, according to (compatible 
> with) source schema
>  
> ...generate codebase-embedded FDO-based spatial queries based on 
> entity relationships?... :-)
>  
> Kenneth, I presume you were thinking of the same thing (1, 2 and 3)?
>  
> Regards,
> Maksim Sestic
>
> ------------------------------------------------------------------------
> *From:* mapguide-users-bounces at lists.osgeo.org 
> [mailto:mapguide-users-bounces at lists.osgeo.org] *On Behalf Of *Kenneth 
> Skovhede, GEOGRAF A/S
> *Sent:* Sunday, May 25, 2008 00:13
> *To:* MapGuide Users Mail List
> *Subject:* Re: [mapguide-users] .NET Objects for working with Mapguide 
> Resources
>
> I'm not sure what you mean by "work with the web tier API".
> There are two different API's that are refered to as Web tier, the 
> MapGuideDotNetApi.dll and the http interface.
> Both of them are supported by MaestroAPI, using the 
> LocalNativeConnetion and HttpServerConnection.
>
> You can set up a http connection like this:
> ServerConnectionI connection = new HttpServerConnection(new 
> Uri("http://localhost/mapguide/mapagent/mapagent.fcgi"), "Anonymous", "");
> And one using the local connection like this:
> ServerConnectionI connection = new 
> LocalNativeConnection("serverconfig.ini", "Anonymous", "");
>
> The http connection is portable and does not require the mapguide 
> dll's. The native is a bit faster, because the http protocol and 
> webserver introduces overhead.
>
> Once you have a connection, you can read an object from the 
> repository, using either interface, by issuing the following:
> LayerDefinition layer = 
> connection.GetLayerDefinition("Library://layer.LayerDefinition");
>
> And write it back like this:
> connection.SaveResource(layer);
>
> Or modify, and save under a new name:
> layer.BackgroundColor = Color.Blue;
> connection.SaveResource(layer, "Library://new layer.LayerDefinition");
>
> There are also functions to generate the full paths, from name and type.
>
> Regards, Kenneth Skovhede, GEOGRAF A/S
>   
>
>
> Kenneth Skovhede, GEOGRAF A/S skrev:
>> Yes. I have moved the entire site over on the MapGuide wiki.
>> Documentation can now be found here:
>> http://trac.osgeo.org/mapguide/wiki/maestro
>> And for the API:
>> http://trac.osgeo.org/mapguide/wiki/maestro/MaestroAPI
>>
>> Too bad about the LinQ dependancy, it would be a lot cleaner to do it 
>> that way.
>>
>> I have not exposed functionality in the way you ask, but it is there.
>> You can do it with code like this:
>> Stream s = ... stream with Xml data ...
>> LayerDefinition layer = 
>> (LayerDefinition)con.DeserializeObject(typeof(LayerDefinition), s);
>> layer.BackgroundColor = Color.White;
>> s = con.SerializeObject(s);
>>
>> The methods could actually be static, but they are not because they 
>> use the server version to restrict/convert the version's of the 
>> documents.
>>
>> It is possible to serialize/deserialise the objects manually, using 
>> the XmlSerializer from .Net:
>> XmlSerializer ser = new XmlSerializer(typeof(LayerDefinition));
>> layer = (LayerDefinition)con.Deserialize(s);
>> layer.BackgroundColor = Color.Green;
>> ser.Serialize(s, layer);
>>
>> There is a function in the Utility class that strips the UTF-8 BOM:
>> s = Utility.RemoveUTF8BOM(s);
>>
>>
>> Regards, Kenneth Skovhede, GEOGRAF A/S
>>   
>>
>>
>> Darrin Maidlow skrev:
>>>
>>> Hi Kenneth,
>>>
>>> Thanks for the feedback.  You are very right in that dual 
>>> development streams would be a bad thing and a waste of a lot of 
>>> time.   What I was hoping to accomplish with that XSD codegen was to 
>>> create a set of relatively light weight objects to roundtrip the 
>>> xml.  Eliminate the use of XML tools for working with the mapguide 
>>> entities, then return the entities back to XML for use with the 
>>> Mapguide API.    I was not planning a full API project.  Again, you 
>>> are right in that there is still some messing around needed to be 
>>> done with the linq code -- I had problems with nulls just as you 
>>> mentioned =)
>>>
>>> To answer your question, as far as I can see, the linq dll is 
>>> required for the generated code to function.  A lot of the generated 
>>> functionality requires methods that exist within the linq to XSD dll 
>>> file.
>>>
>>> I spent some time trying to find more info on the MeastroAPI today, 
>>> but was not able to find much.  Likely because of the move over to 
>>> osgeo.  I have not had a chance to actually work with the API again 
>>> yet, but perhaps you could answer a couple questions for me.
>>>
>>> Does Meastro API come with the abovementioned objects I was looking 
>>> for?  Can I shove some XML from the repository into a new object, do 
>>> some work, and then spit the new XML back out?  If so, I'm assuming 
>>> that I could continue to work with the web tier API from Mapguide?
>>>
>>> thx
>>>
>>> darrin
>>>
>>> *From:* mapguide-users-bounces at lists.osgeo.org 
>>> [mailto:mapguide-users-bounces at lists.osgeo.org] *On Behalf Of 
>>> *Kenneth Skovhede, GEOGRAF A/S
>>> *Sent:* Thursday, May 22, 2008 12:04 PM
>>> *To:* MapGuide Users Mail List
>>> *Subject:* Re: [mapguide-users] .NET Objects for working with 
>>> Mapguide Resources
>>>
>>> That is a smart way to convert Xsd to classes. Is it possible to 
>>> extract the generated code and use it without LinQ for .Net 2.0?
>>>
>>> I'm not sure what you mean by "wanted to stay closer to the core 
>>> API". Your generated classes expose the MapGuide Xml as .Net classes.
>>> You can then use .Net objects "directly" instead of handling Xml. 
>>> That is exactly what the MaestroAPI does.
>>>
>>> I have implemented a connection interface that enables you to 
>>> communicate with MapGuide either via the MapGuide API, or through Http.
>>> If you use the LocalNativeConnection exclusively, MaestroAPI is 
>>> doing the exact same thing your code does.
>>>
>>> If you (or someone else) has questions about MaestroAPI usage, 
>>> please ask away.
>>> If you (or someone else) find missing functionality, or has 
>>> improvements for MaestroAPI, let me know.
>>> I have a short introduction to MaestroAPI usage here:
>>> http://code.google.com/p/mapstudioos/wiki/HowToUseMapGuideAPI
>>> (The site is being migrated to here: 
>>> http://trac.osgeo.org/mapguide/wiki/maestro)
>>>
>>> I like your code, and if you are up for it, I think we both could 
>>> benefit from one great API extension, rather than two good ones.
>>> I have learned that after you have the serialization in place there 
>>> are many places where you must handle trivial stuff like
>>> converting null string to empty string, empty collections to null 
>>> collections, etc. MaestroAPI handles much of this already,
>>> and I would be sad to see you spend your time implementing that for 
>>> another project.
>>>
>>> Regards, Kenneth Skovhede, GEOGRAF A/S
>>>
>>>
>>>
>>> Darrin Maidlow skrev:
>>>
>>> Hi Maksim,
>>>
>>> I looked at early on in my learnage, but wanted to stay closer to 
>>> the core API provided by Mapguide Project / Autodesk.   ADN support 
>>> could offer some help with the built in API, and if needed escalate 
>>> off to the devs.  I did also have some problems getting the Maestro 
>>> API running -- but that was right around the transition between 1.1 
>>> and 2.0 -- and working all night with too much redbull probably 
>>> didn't help either =)
>>>
>>> darrin
>>>
>>> *From:* mapguide-users-bounces at lists.osgeo.org 
>>> <mailto:mapguide-users-bounces at lists.osgeo.org> 
>>> [mailto:mapguide-users-bounces at lists.osgeo.org] *On Behalf Of 
>>> *Maksim Sestic
>>> *Sent:* Thursday, May 22, 2008 7:40 AM
>>> *To:* 'MapGuide Users Mail List'
>>> *Subject:* RE: [mapguide-users] .NET Objects for working with 
>>> Mapguide Resources
>>>
>>> Hi Darrin,
>>>
>>> Thanks for the tip. Please take a look at Kenneth's Meastro API:
>>>
>>> http://trac.osgeo.org/mapguide/browser/trunk/Tools/Maestro/MaestroAPI
>>>
>>> It relies on .NET 2.0 for MG types (de)serialization.
>>>
>>> Regards,
>>>
>>> Maksim Sestic
>>>
>>> ------------------------------------------------------------------------
>>>
>>> *From:* mapguide-users-bounces at lists.osgeo.org 
>>> <mailto:mapguide-users-bounces at lists.osgeo.org> 
>>> [mailto:mapguide-users-bounces at lists.osgeo.org] *On Behalf Of 
>>> *Darrin Maidlow
>>> *Sent:* Thursday, May 22, 2008 15:28
>>> *To:* mapguide-users at lists.osgeo.org 
>>> <mailto:mapguide-users at lists.osgeo.org>
>>> *Subject:* [mapguide-users] .NET Objects for working with Mapguide 
>>> Resources
>>>
>>> Hi List,
>>>
>>> I've written two posts I thought I would share with you on the topic 
>>> of .NET based MG dev.  The first describes a method I've worked out 
>>> to create relatively robust .NET based objects based on the Xml 
>>> Schema Definitions provided with the server.    Please note, I 
>>> currently am only working with MGE 2009.  I have not tried this code 
>>> on MGOS.  If you do try them on MGOS, please let me know what 
>>> results have.
>>>
>>> In a nutshell, one can get the resource XML from the resource 
>>> service, load it into the object with the provided .parse method, 
>>> manipulate the object (without having to use xml) e.g. add child 
>>> objects, change properties etc, and finally spit it back out to XML 
>>> for saving back to the repository.  Yay no longer need to be jealous 
>>> of the PHP guys and their object factories =D
>>>
>>> The second is a dynamic authoring example using these objects, 
>>> manipulating the MapDefinition before the viewer has loaded it.
>>>
>>> Both come with full source code, and Visual Studio 2008 projects.   
>>> I hope they are helpful to the other .NET devs out there.
>>>
>>> http://www.webrade.com/blogs/darrin/2008/05/16/CreatingNETObjectsForMapguideXMLSchemaDefinitionsXSDUsingLINQ.aspx
>>>
>>> http://www.webrade.com/blogs/darrin/2008/05/21/DynamicAuthoringInMapguideEnterpriseBeforeTheViewerHasLoaded.aspx
>>>
>>> Enjoy.
>>>
>>> darrin
>>>
>>>
>>>
>>> __________ NOD32 3118 (20080521) Information __________
>>>
>>> This message was checked by NOD32 antivirus system.
>>> http://www.eset.com
>>>
>>>  
>>> ------------------------------------------------------------------------
>>>
>>>
>>>   
>>>  
>>> _______________________________________________
>>> mapguide-users mailing list
>>> mapguide-users at lists.osgeo.org <mailto:mapguide-users at lists.osgeo.org>
>>> http://lists.osgeo.org/mailman/listinfo/mapguide-users
>>>   
>>> ------------------------------------------------------------------------
>>>
>>> _______________________________________________
>>> mapguide-users mailing list
>>> mapguide-users at lists.osgeo.org
>>> http://lists.osgeo.org/mailman/listinfo/mapguide-users
>>>   
>> ------------------------------------------------------------------------
>>
>> _______________________________________________
>> mapguide-users mailing list
>> mapguide-users at lists.osgeo.org
>> http://lists.osgeo.org/mailman/listinfo/mapguide-users
>>   
>
>
> __________ NOD32 3128 (20080523) Information __________
>
> This message was checked by NOD32 antivirus system.
> http://www.eset.com
> ------------------------------------------------------------------------
>
> _______________________________________________
> mapguide-users mailing list
> mapguide-users at lists.osgeo.org
> http://lists.osgeo.org/mailman/listinfo/mapguide-users
>   
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.osgeo.org/pipermail/mapguide-users/attachments/20080525/81aa45d4/attachment.html


More information about the mapguide-users mailing list