I think implementing constructors that perform checks on the URL is the way to go. 

The constructors can check the protocol, make sure both a username/password exist or neither, and check that the database name doesn't have an unencoded '/', returning nil on all cases.

And then I'll get rid of setSource, setTarget (so it's "readonly"). I won't make them properties, but just a getter (unless there's some advantage of leaving them as properties that I don't see). Would also make localDatastore and remoteDatastore in CDTAbstractReplication readonly to further batten down the hatch. 

What do you think? 

And then I'll will think of some more failure cases.