Pablo Galiano : DSL VS10 / Locking policies

Subscriptions

<March 2010>
SuMoTuWeThFrSa
28123456
78910111213
14151617181920
21222324252627
28293031123
45678910

News

Subscribe to Pablo Galiano by Email

Post Categories

DSL VS10 / Locking policies

***Disclaimer: This information applies to Visual Studio 2010 Beta 1 only.***

 

Another new feature of the new version of the DSL toolkit is the ability to locks certain operations in a DSL. The idea is that we can define locking policies for a DSL and those policies are executed at runtime to constraint specific operations such as Add/Delete/Update etc.

These locking policies can be defined at three different levels , Store, Partition and ModelElement respectively.

Defining our own locking policies

It is really simple to create our own policy class, we just need to create a class that inherits from ILockingPolicy.

Then we need to define the locks that we are going to return, and for that we have three levels of granularity:

  • Store
  • Partition
  • ModelElement

Locks are transitive following the “Store –> Partition –> ModelElement” object hierarchy.

That means that if we set locks at the Store level, those locks also apply to the Partition and the ModelElement levels.

The lock types are:

image

 

public class MyLockingPolicy : ILockingPolicy
{
    public Locks RefineLocks(ModelElement element, Locks proposedLocks)
    {
        return proposedLocks;
    }

    public Locks RefineLocks(Partition partition, Locks proposedLocks)
    {
        return proposedLocks;
    }

    public Locks RefineLocks(Store store, Locks proposedLocks)
    {
        // TODO: return corresponding locks and they will also apply to Partition and ModelElement
    }

}

 

Injecting our own ILockingPolicy

The Store class constructor sets the locking policy by querying for a ILockingPolicy service. That means that one possible way to inject our own locking policy is to override the GetService method and return our policy class:

internal partial class MyDocData
{
    private ILockingPolicy myLockingPolicy;

    public override object GetService(Type serviceType)
    {
        if (serviceType == typeof(SLockingPolicy) || serviceType == typeof(ILockingPolicy))
        {
            if (myLockingPolicy == null)
            {
                myLockingPolicy = new MyLockingPolicy();
            }

            return myLockingPolicy;
        }

        return base.GetService(serviceType);
    }
}

 

At runtime the DSL infrastructure will query for existing locks using a set of extension methods located in the new ImmutabilityExtensionMethods class and constraint or not an operation accordingly.

 

The hardware model sample

I published a sample that shows how to lock a DSL.

The scenario is that there are two personas:

  • Developer: He uses the VS full IDE to author a hardware model.
  • Architect: He uses an Isolated shell to review the model and cannot do any modifications to it.

The locks are being set by detecting the shell SKU.

 

Pablo

posted on Thursday, July 16, 2009 5:32 AM by pga