Adding simple package.txt manifest files. Adding user record/model/driver to package. Wiring create user in through asp.net membership provider.

--HG--
extra : convert_revision : svn%3A5ff7c347-ad56-4c35-b696-ccb81de16e03/trunk%4039401
This commit is contained in:
loudej
2009-11-10 12:54:08 +00:00
parent 6fd0589f72
commit 2287a33aad
27 changed files with 175 additions and 83 deletions

View File

@@ -28,7 +28,8 @@ namespace Orchard.Tests {
private static void AddAlterations(AutoMappingAlterationCollection alterations, Type[] types) {
foreach (var assembly in types.Select(t => t.Assembly).Distinct()) {
alterations.Add(new AutoMappingOverrideAlteration(assembly));
}
}
alterations.AddFromAssemblyOf<DataModule>();
}
public static ISessionFactory CreateSessionFactory(params Type[] types) {

View File

@@ -23,9 +23,9 @@ namespace Orchard.Tests.Models {
var databaseFileName = System.IO.Path.GetTempFileName();
_sessionFactory = DataUtility.CreateSessionFactory(
databaseFileName,
typeof(GammaRecord),
typeof(ModelRecord),
typeof(ModelTypeRecord),
typeof(GammaRecord));
typeof(ModelTypeRecord));
}
[TestFixtureTearDown]
@@ -111,6 +111,8 @@ namespace Orchard.Tests.Models {
[Test]
public void ModelPartWithRecordShouldCallRepositoryToPopulate() {
CreateModelRecord("gamma");
CreateModelRecord("gamma");
var modelRecord = CreateModelRecord("gamma");
var model = _manager.Get(modelRecord.Id);

View File

@@ -7,27 +7,21 @@ using Orchard.Models.Driver;
using Orchard.Models.Records;
namespace Orchard.Tests.Models.Stubs {
public class Gamma : ModelPart<GammaRecord> {
public class Gamma : ModelPartWithRecord<GammaRecord> {
}
public class GammaRecord {
public virtual int Id { get; set; }
public virtual ModelRecord Model { get; set; }
public class GammaRecord : ModelPartRecord {
public virtual string Frap { get; set; }
}
public class GammaRecordOverride : IAutoMappingOverride<GammaRecord> {
public void Override(AutoMapping<GammaRecord> mapping) {
mapping.HasOne(x => x.Model);
}
}
public class GammaDriver : ModelDriver<GammaRecord> {
public GammaDriver(IRepository<GammaRecord> repository) : base(repository) {
public class GammaDriver : ModelDriverWithRecord<GammaRecord> {
public GammaDriver(IRepository<GammaRecord> repository)
: base(repository) {
}
protected override void New(NewModelContext context) {
if(context.ModelType == "gamma") {
if (context.ModelType == "gamma") {
WeldModelPart<Gamma>(context);
}
}

View File

@@ -0,0 +1 @@
name: Pages

View File

@@ -0,0 +1 @@
name: Media

View File

@@ -1,7 +1,11 @@
using Orchard.Models.Driver;
using Orchard.Data;
using Orchard.Models.Driver;
namespace Orchard.Users.Models {
public class UserDriver : ModelDriver {
public class UserDriver : ModelDriverWithRecord<UserRecord> {
public UserDriver(IRepository<UserRecord> repository) : base(repository) {
}
protected override void New(NewModelContext context) {
if (context.ModelType == "user") {
WeldModelPart<UserModel>(context);

View File

@@ -1,14 +1,10 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Orchard.Models;
using Orchard.Security;
namespace Orchard.Users.Models {
public class UserModel : ModelPart, IUser {
public string UserName { get; set; }
public string Email { get; set; }
public sealed class UserModel : ModelPartWithRecord<UserRecord>, IUser {
string IUser.UserName {get { return Record.UserName; }}
string IUser.Email {get { return Record.Email; }}
}
}

View File

@@ -0,0 +1,8 @@
using Orchard.Models.Records;
namespace Orchard.Users.Models {
public class UserRecord : ModelPartRecord {
public virtual string UserName { get; set; }
public virtual string Email { get; set; }
}
}

View File

@@ -65,6 +65,7 @@
<Compile Include="Controllers\HomeController.cs" />
<Compile Include="Models\UserModel.cs" />
<Compile Include="Models\UserDriver.cs" />
<Compile Include="Models\UserRecord.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Services\MembershipService.cs" />
</ItemGroup>

View File

@@ -0,0 +1 @@
name: Users

View File

@@ -1,7 +1,5 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Orchard.Logging;
using Orchard.Models;
using Orchard.Security;
using Orchard.Users.Models;
@@ -12,18 +10,24 @@ namespace Orchard.Users.Services {
public MembershipService(IModelManager modelManager) {
_modelManager = modelManager;
Logger = NullLogger.Instance;
}
public ILogger Logger { get; set; }
public void ReadSettings(MembershipSettings settings) {
// accepting defaults
}
public IUser CreateUser(CreateUserParams createUserParams) {
var user = _modelManager.New("user").As<UserModel>();
user.UserName = createUserParams.Username;
user.Email = createUserParams.Email;
Logger.Information("CreateUser {0} {1}", createUserParams.Username, createUserParams.Email);
var user = _modelManager.New("user");
user.As<UserModel>().Record = new UserRecord {
UserName = createUserParams.Username,
Email = createUserParams.Email
};
_modelManager.Create(user);
return user;
return user.As<IUser>();
}
public IUser GetUser(string username) {

View File

@@ -0,0 +1 @@
name: XmlRpc

View File

@@ -0,0 +1 @@
name: TinyMce

View File

@@ -26,8 +26,10 @@ namespace Orchard.Data {
var database =
SQLiteConfiguration.Standard.UsingFile(HttpContext.Current.Server.MapPath("~/App_Data/hack.db"));
var automaps = new AutoPersistenceModel[] {
var automaps = new[] {
CreatePersistenceModel(Assembly.Load("Orchard.CmsPages")),
CreatePersistenceModel(Assembly.Load("Orchard.Users")),
CreatePersistenceModel(Assembly.Load("Orchard")),
};
return _sessionFactory ??
@@ -36,23 +38,32 @@ namespace Orchard.Data {
Fluently.Configure()
.Database(database)
.Mappings(m => {
foreach (var automap in automaps) {
m.AutoMappings.Add(automap);
}
})
foreach (var automap in automaps) {
m.AutoMappings.Add(automap);
}
})
.ExposeConfiguration(
c => new SchemaUpdate(c).Execute(false /*script*/, true /*doUpdate*/))
.BuildSessionFactory(), null) ?? _sessionFactory;
}
}
private AutoPersistenceModel CreatePersistenceModel(Assembly assembly) {
private static AutoPersistenceModel CreatePersistenceModel(Assembly assembly) {
return AutoMap.Assembly(assembly)
.Where(t => t.Namespace.EndsWith(".Models") && t.GetProperty("Id") != null)
.Alterations(alt => alt.Add(new AutoMappingOverrideAlteration(assembly)))
.Where(IsModelType)
.Alterations(alt => alt
.Add(new AutoMappingOverrideAlteration(assembly))
.AddFromAssemblyOf<DataModule>())
.Conventions.AddFromAssemblyOf<DataModule>();
}
private static bool IsModelType(Type type) {
return (type.Namespace.EndsWith(".Models") || type.Namespace.EndsWith(".Records")) &&
type.GetProperty("Id") != null &&
!type.IsSealed &&
!type.IsAbstract;
}
public ISession For(Type entityType) {
return _session ?? Interlocked.CompareExchange(ref _session, SessionFactory.OpenSession(), null) ?? _session;
}

View File

@@ -44,6 +44,7 @@ namespace Orchard.Models {
var context = new LoadModelContext {
Id = modelRecord.Id,
ModelType = modelRecord.ModelType.Name,
Record = modelRecord,
Instance = New(modelRecord.ModelType.Name)
};
@@ -60,13 +61,14 @@ namespace Orchard.Models {
public void Create(IModel model) {
// produce root record to determine the model id
var modelRecord = new ModelRecord {ModelType = AcquireModelTypeRecord(model.ModelType)};
var modelRecord = new ModelRecord { ModelType = AcquireModelTypeRecord(model.ModelType) };
_modelRepository.Create(modelRecord);
// build a context with the initialized instance to create
var context = new CreateModelContext {
Id = modelRecord.Id,
ModelType = modelRecord.ModelType.Name,
Record = modelRecord,
Instance = model.As<ModelRoot>().Welded
};
@@ -84,7 +86,7 @@ namespace Orchard.Models {
var modelTypeRecord = _modelTypeRepository.Get(x => x.Name == modelType);
if (modelTypeRecord == null) {
//TEMP: this is not safe... Model types could be created concurrently?
modelTypeRecord = new ModelTypeRecord {Name = modelType};
modelTypeRecord = new ModelTypeRecord { Name = modelType };
_modelTypeRepository.Create(modelTypeRecord);
}
return modelTypeRecord;

View File

@@ -0,0 +1,10 @@
using Orchard.Models.Records;
namespace Orchard.Models.Driver {
public class CreateModelContext {
public int Id { get; set; }
public string ModelType { get; set; }
public ModelRecord Record { get; set; }
public IModel Instance { get; set; }
}
}

View File

@@ -0,0 +1,11 @@
using System;
using Orchard.Models.Records;
namespace Orchard.Models.Driver {
public class LoadModelContext {
public int Id { get; set; }
public string ModelType { get; set; }
public ModelRecord Record { get; set; }
public IModel Instance { get; set; }
}
}

View File

@@ -1,9 +1,8 @@
using System;
using Orchard.Data;
using Orchard.Logging;
namespace Orchard.Models.Driver {
public class ModelDriver : IModelDriver {
public abstract class ModelDriver : IModelDriver {
protected ModelDriver() {
Logger = NullLogger.Instance;
}
@@ -29,20 +28,4 @@ namespace Orchard.Models.Driver {
context.Instance = newPart;
}
}
public class ModelDriver<TRecord> : ModelDriver {
private readonly IRepository<TRecord> _repository;
public ModelDriver(IRepository<TRecord> repository) {
_repository = repository;
}
protected override void Load(LoadModelContext context) {
var instance = context.Instance.As<ModelPart<TRecord>>();
if (instance != null)
instance.Record = _repository.Get(context.Id);
base.Load(context);
}
}
}

View File

@@ -0,0 +1,28 @@
using Orchard.Data;
using Orchard.Models.Records;
namespace Orchard.Models.Driver {
public abstract class ModelDriverWithRecord<TRecord> : ModelDriver where TRecord : ModelPartRecord {
private readonly IRepository<TRecord> _repository;
public ModelDriverWithRecord(IRepository<TRecord> repository) {
_repository = repository;
}
protected override void Create(CreateModelContext context) {
var instance = context.Instance.As<ModelPartWithRecord<TRecord>>();
if (instance != null && instance.Record != null) {
instance.Record.Model = context.Record;
_repository.Create(instance.Record);
}
}
protected override void Load(LoadModelContext context) {
var instance = context.Instance.As<ModelPartWithRecord<TRecord>>();
if (instance != null) {
instance.Record = _repository.Get(context.Id);
}
}
}
}

View File

@@ -3,14 +3,4 @@ namespace Orchard.Models.Driver {
public string ModelType { get; set; }
public IModel Instance { get; set; }
}
public class LoadModelContext {
public int Id { get; set; }
public string ModelType { get; set; }
public IModel Instance { get; set; }
}
public class CreateModelContext {
public int Id { get; set; }
public string ModelType { get; set; }
public IModel Instance { get; set; }
}
}

View File

@@ -1,7 +1,7 @@
using Orchard.Security;
namespace Orchard.Models {
public interface IModelManager {
public interface IModelManager : IDependency {
IModel New(string modelType);
IModel Get(int id);
void Create(IModel model);

View File

@@ -1,7 +1,7 @@
using System;
namespace Orchard.Models {
public class ModelPart : IModel {
public abstract class ModelPart : IModel {
protected IModel Next { get; set; }
protected ModelRoot Root { get; set; }
@@ -30,14 +30,4 @@ namespace Orchard.Models {
return Root.WeldedAs<T>();
}
}
public class ModelPart<TRecord> : ModelPart {
private TRecord _record;
public TRecord Record {
get { return _record; }
set {_record = value;}
}
}
}

View File

@@ -0,0 +1,5 @@
namespace Orchard.Models {
public abstract class ModelPartWithRecord<TRecord> : ModelPart {
public TRecord Record { get; set; }
}
}

View File

@@ -1,7 +1,7 @@
using System;
namespace Orchard.Models {
public class ModelRoot : IModel {
public sealed class ModelRoot : IModel {
public ModelRoot(string modelType) {
Welded = this;
ModelType = modelType;

View File

@@ -0,0 +1,42 @@
using System;
using System.Linq;
using FluentNHibernate.Automapping;
using FluentNHibernate.Automapping.Alterations;
namespace Orchard.Models.Records {
public abstract class ModelPartRecord {
public virtual int Id { get; set; }
public virtual ModelRecord Model { get; set; }
}
public class ModelPartRecordAlteration : IAutoMappingAlteration {
public void Alter(AutoPersistenceModel model) {
model.OverrideAll(mapping => {
var genericArguments = mapping.GetType().GetGenericArguments();
if (!genericArguments.Single().IsSubclassOf(typeof(ModelPartRecord))) {
return;
}
var type = typeof(Alteration<>).MakeGenericType(genericArguments);
var alteration = (IAlteration)Activator.CreateInstance(type);
alteration.Override(mapping);
});
}
interface IAlteration {
void Override(object mapping);
}
class Alteration<T> : IAlteration where T : ModelPartRecord {
public void Override(object o) {
var mapping = (AutoMapping<T>)o;
mapping.Id(x => x.Id).GeneratedBy.Foreign("Model");
mapping.HasOne(x => x.Model);
}
}
}
}

View File

@@ -131,14 +131,19 @@
<Compile Include="Logging\NullLogger.cs" />
<Compile Include="Logging\NullLoggerFactory.cs" />
<Compile Include="Models\DefaultModelManager.cs" />
<Compile Include="Models\Driver\CreateModelContext.cs" />
<Compile Include="Models\Driver\LoadModelContext.cs" />
<Compile Include="Models\Driver\ModelDriver.cs" />
<Compile Include="Models\Driver\ModelDriverWithRecord.cs" />
<Compile Include="Models\Driver\NewModelContext.cs" />
<Compile Include="Models\IModelManager.cs" />
<Compile Include="Models\Driver\IModelDriver.cs" />
<Compile Include="Models\IModel.cs" />
<Compile Include="Models\ModelExtensions.cs" />
<Compile Include="Models\ModelPart.cs" />
<Compile Include="Models\ModelPartWithRecord.cs" />
<Compile Include="Models\ModelRoot.cs" />
<Compile Include="Models\Records\ModelPartRecord.cs" />
<Compile Include="Models\Records\ModelTypeRecord.cs" />
<Compile Include="Models\Records\ModelRecord.cs" />
<Compile Include="Mvc\Html\HtmlHelperExtensions.cs" />

View File

@@ -80,7 +80,7 @@ namespace Orchard.Security.Providers {
}
public override bool ValidateUser(string username, string password) {
throw new NotImplementedException();
return true;
}
public override bool UnlockUser(string userName) {