I'm a little bit behind on my CS releases, as I just got around to installing a fresh copy of Community Server 2.0 to test things out for one of my sites. Since I was going to upgrade an existing CS 1.1 install, I tried that method first, but ended up starting over because the original config I had was single blog and I didn't have the time nor the patience to figure out how to hack 2.0 into a single-blog install with existing content.

However, thanks to Keyvan (che khabbar!), I was able to export the 1.1 content using an HttpHandler I hacked up for exporting CS 1.1 content to BlogML and import into a new, multi-blog install of 2.0. The first thing I did was nuke both the sample weblog and the sample weblog group. Then I created a new group and weblog and used the application key assigned to the new blog to import my posts. Here is the code I used to import a blogML file into a fresh copy of Community Server 2.0

<%@ Page Language="VB" %>
<%@ Import Namespace="System.Collections"%>
<%@ Import Namespace="System.IO"%>
<%@ Import Namespace="BlogML"%>
<%@ Import Namespace="BlogML.Xml"%>
<%@ Import Namespace="CommunityServer"%>
<%@ Import Namespace="CommunityServer.Components"%>
<%@ Import Namespace="CommunityServer.Blogs"%>
<script runat="server">
'Community Server 2.0 BlogML converter Beta
'Copyright Keyvan Nayyeri (www.nayyeri.net) - 2006
'BlogML Writer and Reader classes are provided by BlogML project (www.blogml.com)


    Public Class Reader

        Private _ApplicationKey As String
        Private _Blog As CommunityServer.Blogs.Components.Weblog
        Private _SitePath As String
        Private _BlogCommentCount As Integer
        Private _BlogTrackBackCount As Integer

        Sub New(ByVal ApplicationKey As String, ByVal SitePath As String)
            Me._ApplicationKey = ApplicationKey
            Me._SitePath = SitePath


            Dim objCSWeblogs As CommunityServer.Blogs.Components.Weblogs
            Me._Blog = objCSWeblogs.GetWeblog(Me._ApplicationKey)
        End Sub

        Public Sub LoadBlog(ByVal XML As String)
            Dim Blog As New BlogMLBlog
            Try
                Blog = BlogMLSerializer.Deserialize(New StringReader(XML))
            Catch ex As Exception
                Throw New Exception("Couldn't load your BlogML file. Maybe it is wellformedness")
            End Try
            Dim Categories As Hashtable
            Categories = ReadCategories(Blog)

            LoadPosts(Blog, Categories)

            UpdateStats(Blog)
        End Sub

        Private Function ReadCategories(ByVal Blog As BlogMLBlog) As Hashtable
            Dim CategoriesHash As New Hashtable
            For Each Category As BlogMLCategory In Blog.Categories
                Dim NewCategory As New PostCategory
                With NewCategory
                    .DateCreated = Category.DateCreated
                    .Description = Category.Description
                    .IsEnabled = Category.Approved
                    .Name = Category.Title
                    .ParentID = 0
                    .SectionID = Me._Blog.SectionID

                    Dim objCSCats As PostCategories
                    Try
                        objCSCats.CreateCategory(NewCategory)
                    Catch ex As Exception
                        Throw New ArgumentException("Error when tried to add categories to database")
                    End Try
                    CategoriesHash.Add(Category.ID, Category.Title)
                End With
            Next
            Return CategoriesHash
        End Function
        Private Sub LoadPosts(ByVal Blog As BlogMLBlog, ByVal CategoryHash As Hashtable)
            Dim LastPostAuthor As String
            Dim LastPostAuthorID As Integer
            Dim LastPostDate As Date
            Dim LastPostName As String
            Dim LastPostSubject As String




            For Each Post As BlogMLPost In Blog.Posts
                Dim NewPost As New CommunityServer.Blogs.Components.WeblogPost
                Dim objCSPosts As CommunityServer.Blogs.Components.WeblogPosts

                With NewPost
                    .PostID = Post.ID
                    .Body = Post.Content.UncodedText
                    .BlogPostType = CommunityServer.Blogs.Components.BlogPostType.Post
                    .Subject = Post.Title
                    .ThreadDate = Post.DateCreated
                    .UserTime = Post.DateCreated
                    .PostDate = Post.DateCreated
                    .UserTime = Post.DateCreated
                    .SectionID = Me._Blog.SectionID
                    .SetExtendedAttribute("EverPublished", CType(Post.Approved, Boolean))
                    .IndexInThread = True
                    .IsApproved = True
                    .IsAggregated = True
                    .IsLocked = False
                    .PostConfig = CommunityServer.Blogs.Components.BlogPostConfig.IsAggregated

                End With
                'Add categories
                If Post.Categories.Count > 0 Then
                    Dim NewPostCats(Post.Categories.Count) As String
                    For i As Integer = 0 To Post.Categories.Count - 1
                        NewPostCats(i) = CategoryHash(Post.Categories(i).Ref)
                    Next
                    NewPost.Categories = NewPostCats
                End If

                'Add attachments
                'TO DO: Check to add attachments with checking the source code when RTM version has been released.
                'Currently we can't load post attachments

                objCSPosts.Add(NewPost)

                'Temporary saving stats
                LastPostAuthor = NewPost.Username
                LastPostAuthorID = NewPost.AuthorID
                LastPostDate = NewPost.PostDate
                LastPostName = NewPost.Name
                LastPostSubject = NewPost.Subject

                LoadComments(NewPost, Post)
                LoadTrackBacks(NewPost, Post)
            Next

            'Update blog stats
            Me._Blog.MostRecentPostAuthor = LastPostAuthor
            Me._Blog.MostRecentPostAuthorID = LastPostAuthorID
            Me._Blog.MostRecentPostDate = LastPostDate
            Me._Blog.MostRecentPostName = LastPostName
            Me._Blog.MostRecentPostSubject = LastPostSubject
        End Sub
        Private Sub LoadComments(ByVal NewPost As Post, ByVal Post As BlogMLPost)
            If Post.Comments.Count > 0 Then
                For Each Comment As BlogMLComment In Post.Comments
                    Dim NewComment As New CommunityServer.Blogs.Components.WeblogPost
                    Dim objCSComments As CommunityServer.Blogs.Components.WeblogPosts

                    With NewComment
                        .Body = Comment.Content.UncodedText
                        .BlogPostType = Blogs.Components.BlogPostType.Comment
                        .Subject = Comment.Title
                        .ThreadDate = Comment.DateCreated
                        .UserTime = Comment.DateCreated
                        .PostDate = Comment.DateCreated
                        .UserTime = Comment.DateCreated
                        .SectionID = Me._Blog.SectionID
                        .SetExtendedAttribute("EverPublished", True)
                        .SetExtendedAttribute("TitleUrl", Comment.UserUrl)
                        .SetExtendedAttribute("SubmittedUserName", Comment.UserName)
                        .IsApproved = CType(Comment.Approved, Boolean)
                        .ParentID = NewPost.PostID
                        .ThreadID = NewPost.ThreadID

                    End With

                    objCSComments.Add(NewComment)

                    'Update blog counter
                    Me._BlogCommentCount += 1
                Next
            End If
        End Sub
        Private Sub LoadTrackBacks(ByVal NewPost As Post, ByVal Post As BlogMLPost)
            If Post.Trackbacks.Count > 0 Then
                For Each TrackBack As BlogMLTrackback In Post.Trackbacks
                    Dim NewTrackBack As New Blogs.Components.WeblogPost
                    Dim objCSTrackBacks As Blogs.Components.WeblogPosts

                    With NewTrackBack
                        .Body = TrackBack.Title
                        .BlogPostType = Blogs.Components.BlogPostType.Trackback
                        .Subject = TrackBack.Title
                        .ThreadDate = TrackBack.DateCreated
                        .UserTime = TrackBack.DateCreated
                        .PostDate = TrackBack.DateCreated
                        .UserTime = TrackBack.DateCreated
                        .SectionID = Me._Blog.SectionID
                        .SetExtendedAttribute("EverPublished", True)
                        .SetExtendedAttribute("TitleUrl", TrackBack.Url)
                        .SetExtendedAttribute("trackbackName", "TrackBack")
                        .IsApproved = CType(TrackBack.Approved, Boolean)
                        .ParentID = NewPost.PostID
                        .ThreadID = NewPost.ThreadID

                    End With

                    objCSTrackBacks.Add(NewTrackBack)

                    'Update blog counter
                    Me._BlogTrackBackCount += 1
                Next
            End If
        End Sub
        Private Sub UpdateStats(ByVal Blog As BlogMLBlog)
            Me._Blog.PostCount += Blog.Posts.Count
            Me._Blog.CommentCount = Me._BlogCommentCount
            Me._Blog.TrackbackCount = Me._BlogTrackBackCount
        End Sub

    End Class

    Sub Page_Load(sender as Object, e as EventArgs)
    	Dim Path as String = "d:\tmp\BlogML\BlogML.xml"
    	Dim reader as New Reader("chris", Request.PhysicalApplicationPath)

    	If File.Exists(Path) Then
    		Dim sr as New StreamReader(File.Open(Path, FileMode.Open))
    		Dim xml as string = sr.ReadToEnd

    		reader.LoadBlog(xml)

    		Response.Write("Content moved successfully!")
    	Else
    		Response.Write("Uh-oh. Something crapped.")
    	End If

    End Sub

</script>
<html>
    <head>
    </head>
    <body>
        <form runat="server">
            <!-- Insert content here -->
        </form>
    </body>
</html>

I hacked up this file in WebMatrix and slapped it into the webroot of my new CommunityServer install. This way I was able to copy the content to a local install before pushing the final product out into the wild, and I didn't have to recompile any of CS to get it working. Merci, Keyvan!

posted on Tuesday, June 06, 2006 1:32 PM | Filed Under [ CS::Blogs BlogML ]

Comments

Gravatar
# re: Community Server 2.0 BlogML Converter Beta - success!
Posted by Keyvan Nayyeri
on 6/6/2006 1:24 PM
"Khabarhaye Khub" (Good news) :-D
Also you could use my BlogML converter final version.
I'm glad to see that it could help you ;-)
Gravatar
#  Community Server Daily News for Wednesday, June 7, 2006
on 6/7/2006 2:38 PM
Ve have vays of making you talk. Efforts continue in providing more and better Community Server documentation
Gravatar
# re: Community Server 2.0 BlogML Converter Beta - success!
Posted by Darren Neimke
on 6/10/2006 4:09 PM
Hi Chris, just thought that I'd let you know that BlogML is now truly open source:

http://codeplex.com/Wiki/View.aspx?ProjectName=BlogML
Gravatar
# re: Community Server 2.0 BlogML Converter Beta - success!
Posted by vern
on 6/13/2006 11:35 PM
I'm curious; will this import/export gallery stuff also, or is this strictly limited to the blog portion of CS?

If it does do the gallery, this is the answer to my prayers!

I am trying to move a CS1.1 site to 2.0, however, it's not going well. The last 123 times I tried it didn't work...

I wish there was a straight import/export tool for CS that did Blog/Gallery/Forum as well as User/Role data. Wouldn't that be nice?
Gravatar
# re: Community Server 2.0 BlogML Converter Beta - success!
Posted by Chris Frazier
on 6/14/2006 12:20 AM
I actually tried a straight upgrade first by copying the database to a new one and running the upgrade script on the new db. I was trying to upgrade a single blog install tho and decided to start with a fresh db instead and import from BlogML into what would be one of n blogs.

It was more about convenience than anything else.
Gravatar
# Import a blogML file into a fresh copy of Community Server 2.0
on 11/22/2006 10:58 AM
Chris Frazier shares the code he used to import a blogML file into a fresh copy of Community Server 2.0
Comments have been closed on this topic.