Compare commits

..

1320 Commits

Author SHA1 Message Date
Sebastiaan Janssen 4935525591 Merge pull request #147 from AndyButland/u4-2958
Fix for issue U4-2958 Member can edit & Show on profile do not persist on Member Type editor
2013-10-05 10:04:08 -07:00
Andy Butland 693778fe74 Fixed issue where member type properties would not persist after first save without reloading page 2013-10-02 21:20:05 +02:00
Sebastiaan Janssen 8eee7cae2f Merge branch '6.1.6' 2013-09-30 16:10:14 +02:00
Sebastiaan Janssen 226e35d65a NuSpec update: we can only accept a specific version of MySQL 2013-09-30 14:32:06 +02:00
Sebastiaan Janssen cdda69c4cd U4-2788 Error installing Umbraco 6.1.5 with SQL CE 4 option 2013-09-30 12:39:28 +02:00
Shannon 0cff484113 fixes unit test 2013-09-30 12:12:17 +02:00
Shannon 830fde372e Fixes EditUser.aspx 2013-09-30 11:49:31 +02:00
Shannon 35f65a2c64 re-enables LoadMinimalDocument and adds this to the optimized check, even in optimized model the OnRenderNode can still execute with a minimal doc. 2013-09-30 10:55:38 +02:00
Shannon e5320f0abd Obsoletes the LoadMinimalDocument flag since it no longer serves a purpose. 2013-09-30 10:55:26 +02:00
Sebastiaan Janssen 965a7fc500 Fixes: U4-2925 Tree performance is very poor in 6.1.x when having event subscriptions 2013-09-30 10:55:13 +02:00
Sebastiaan Janssen abbf8aeb42 U4-2709 Error after upgrading from 6.1.3 to 6.1.4 2013-09-30 10:49:33 +02:00
Sebastiaan Janssen 328ada2f38 Bump version number 2013-09-30 10:46:08 +02:00
Sebastiaan Janssen 767252cdf1 Creates IDisposeOnRequestEnd and ensures UmbracoContext and UmbracoDatabase implement it, then we only dispose of these types of objects at the end of the request if they are part of the httpcontext items (U4-2738). Fixes: U4-2988 UmbracoObjectTypesExtensions is not thread safe 2013-09-30 10:31:45 +02:00
Sebastiaan Janssen 010d47c68b Fixes U4-2822 Datepicker throws "Specified cast is not valid" when saving through API 2013-09-30 10:23:43 +02:00
Shandem a353f6fb74 Merge pull request #135 from Myster/master
Fix multiple words in search U4-2509
2013-09-11 19:33:47 -07:00
Murray Roke a64efb93b3 Improved search with "and", partial match U4-2509
- added partial matching on each word.
- fixed bug so 'all' words match rather than 'any' words.
2013-09-12 14:30:42 +12:00
Murray Roke cf9f11ff45 Improved admin search splitting query U4-2509 2013-09-12 13:22:14 +12:00
Murray Roke d7481b5ca4 Fix multiple words in search U4-2509
When multiple words are entered in the search field no results are
returned.
This pull req. contains the fix suggested by Tony.
2013-09-12 10:22:59 +12:00
Niels Hartvig 2fb55cb831 Enhanced permission checking on views and snippets
Thanks to Richard Turnbull from NGS Secure Research who discovered a
minor issue that made it possible for authenticated Umbraco Users to
view files beyond their permissions
2013-09-02 14:23:27 +02:00
Sebastiaan Janssen 0e6a926a3f Merge branch '6.1.5' 2013-09-02 12:24:26 +02:00
Sebastiaan Janssen 173ac65eb5 Remove misleading comment as this has been moved out of the if statement 2013-09-02 11:41:13 +02:00
Sebastiaan Janssen 7c28e1aeba Fixed U4-2763 Content rollback generates duplicates 2013-09-02 10:56:42 +02:00
Shannon 5989d19f7f Re-fixes the issue with using IDataValueSetter.SetValue on the DefaultData implementation and ensures that when there is a null value that it reverts to an empty string since this was what the default value was in the Value getter of DefaultData when there was no value. Have added a couple unit tests to support. 2013-09-02 13:27:48 +10:00
Shannon da1c33a034 Fixes unit test 2013-09-02 12:57:56 +10:00
Sebastiaan Janssen 2111a5e31e Fix MySQL install failing on UmbracoServer table 2013-09-01 17:28:22 +02:00
Sebastiaan Janssen 5478de911b Merge pull request #115 from stocksr/6.2.0
U4-516 - Fix DatePicker with time default value
2013-09-01 17:24:03 +02:00
Sebastiaan Janssen 7765acb130 Merge pull request #124 from AndyButland/wip-u4-2759
U4-2759 - member authorise attribute was not restricting for group
2013-09-01 17:23:53 +02:00
Morten Christensen 5640daff32 Fixes U4-2752 ContentService.DeleteVersion and DeleteVersions fail
Signed-off-by: Sebastiaan Janssen <sebastiaan@umbraco.com>
2013-08-31 19:19:25 +02:00
Morten Christensen a1cae3f286 Fixes U4-2731 Document.BeforeMove + Document.AfterMove Doesn't get fired.
Using the legacy Document and Media classes for the .Move and .Copy calls as they already use the new services under the hood, so shouldn't make any noticeable difference except that the legacy events will also work.

Signed-off-by: Sebastiaan Janssen <sebastiaan@umbraco.com>
2013-08-31 19:18:47 +02:00
Shannon d22dbb4654 Fixes U4-2734 Don't set the cache references to null when disposing the UmbracoContext 2013-08-31 11:11:25 +02:00
Stephan 4d5a8298b0 U4-2549 - fix it differently 2013-08-30 12:22:58 +02:00
Stephan 9e2733ce69 U4-2549 - fix issue with last chance content finder
Conflicts:
	src/Umbraco.Web/Umbraco.Web.csproj

Conflicts:
	src/Umbraco.Web/Umbraco.Web.csproj
2013-08-30 12:22:36 +02:00
Sebastiaan Janssen fbfdd8d398 Bump version number 2013-08-30 12:00:33 +02:00
Stephan 2552dffdad U4-2691 - fix issue with alt template and internal redirects 2013-08-30 11:59:28 +02:00
Sebastiaan Janssen 52540165f1 Creating a partial view now inherits from UmbracoTemplatePage (in 6.2.0 there will be 2 snippets, one for UmbracoViewPage<dynamic>, for MVC experts and one for UmbracoTemplatePage, the default). 2013-08-30 11:47:39 +02:00
Shannon 2b408df24c Fixes: U4-2727 PluginManager's TypeList can contain duplicates - updates the locks to be upgradeable read locks, changes over all lists/collecitons to be HashSet<T> this ensures no duplicates and also improves performance. 2013-08-30 10:51:06 +02:00
Shannon d559411187 Fixes U4-2300 6.1.0: Changing a template's parent causes tree to collapse 2013-08-30 10:45:13 +02:00
Sebastiaan Janssen 3a4a6579d3 Fixes: U4-2711 DAMP throws unknown exception on image upload with image cropper 2013-08-30 10:40:29 +02:00
Sebastiaan Janssen 1e76cf67d3 Fix merge problem 2013-08-23 08:57:02 +02:00
Sebastiaan Janssen 61149f8112 Merge branch '6.1.4'
Conflicts:
	.gitignore
	src/Umbraco.Web.UI/install/steps/database.ascx
	src/Umbraco.Web/Umbraco.Web.csproj
	src/Umbraco.Web/umbraco.presentation/umbraco/controls/Images/ImageViewer.ascx.cs
	src/umbraco.editorControls/mediapicker/mediaChooser.cs
2013-08-22 14:46:11 +02:00
Sebastiaan Janssen adb059e0da Revert U4-2511 Locallink:NODEID not working as it was breaking expectations of people running site without this fix 2013-08-22 13:13:32 +02:00
Morten Christensen 4337976887 Merge branch '6.1.4' of https://github.com/umbraco/Umbraco-CMS into 6.1.4 2013-08-22 12:59:08 +02:00
Morten Christensen efe5de87a6 Updating readme for nuget packages 2013-08-22 12:58:53 +02:00
Sebastiaan Janssen 389642946e Merge pull request #85 from rolfis/patch-1
Update sv.xml
2013-08-21 09:03:37 -07:00
rolfis 53d30aa3cb Update sv.xml
Changed {0} to %0% in login screen bottomText to display correct end year of copyright notice.
2013-08-21 16:55:53 +02:00
Shannon e233cffb9d Changes the cache keys in PluginManager to reference a const to make it a bit more clear. 2013-08-21 11:19:27 +10:00
Shannon 9e58ebed24 Merge branch '6.1.4' of https://github.com/umbraco/Umbraco-CMS into 6.1.4 2013-08-21 11:14:59 +10:00
Shannon f51c4e332e Fixes: U4-2653 BeginUmbracoForm should use absolute path with query string URLs without the protocol 2013-08-21 11:14:37 +10:00
Sebastiaan Janssen 03a0a0a0e9 Fix a strange VS2012 build targets problem 2013-08-20 18:06:09 +02:00
Sebastiaan Janssen dcb381770f Fix unit test that was looking at the wrong filename 2013-08-19 12:54:20 +02:00
Sebastiaan Janssen 65db0e69a9 Fixes: U4-2642 Make SQL CE more resilient to server crashes 2013-08-19 12:26:01 +02:00
Sebastiaan Janssen 23c6a91e9c Fixes merge issue 2013-08-19 11:47:53 +02:00
Sebastiaan Janssen a03c6dcf13 Merge pull request #80 from ThomasSkyldahl/6.1.4
UmbracoViewPage.WriteLiteral(object value)  optimized memory usage and combined markup injection
2013-08-19 02:34:13 -07:00
Sebastiaan Janssen 3029d97f33 Merge pull request #78 from dprothero/6.1.4
Fixed membership provider to correctly log failed attempts.
2013-08-19 02:06:15 -07:00
Sebastiaan Janssen f41d967864 Fixes: U4-2637 Error adding a User using AD Membership Provider when no Email Address Defined 2013-08-19 10:41:49 +02:00
Thomas Skyldahl Sørensen 4a481b05d4 Optimized WriteLiteral 2013-08-16 10:09:09 +02:00
Shannon 66c6b5b524 Fixes: U4-2632 Remove the recursive permissions check on the move/copy dialog 2013-08-16 12:46:40 +10:00
Shannon e3b0f71549 Merge branch '6.1.4' of https://github.com/umbraco/Umbraco-CMS into 6.1.4 2013-08-16 12:25:55 +10:00
Shannon 973b466798 Fixes: U4-2627 Ensure that the plugins cache files are named with the machine name 2013-08-16 12:25:38 +10:00
Shandem fa0eef4333 Merge pull request #79 from sniffdk/6.1.4
Moved WriteLiteral method to UmbracoViewPage
2013-08-15 19:12:54 -07:00
Mads Krohn a343a76a26 Moved WriteLiteral method to UmbracoViewPage
When we use a custom model through a custom controller, in our view, we
inherit from UmbracoViewPage, so the WriteLiteral method, which provides
preview badge and miniprofiler code, should be placed there.
2013-08-16 00:01:31 +02:00
Morten Christensen d0a9e3236e Promise for the changed unit test was incorrect, so correcting it in this commit 2013-08-15 10:26:24 +02:00
Morten Christensen b899805ec9 Correcting issue introduced in d3b69e04e1 where the returned IProfile would contain the Username and not the Name. This will have changed the Creator and Writer name in the xml cache to be the Login instead of the Name of the user, so for those that use these fields its important to republish to update the xml cache.
Fixes U4-2628 creatorName and writerName should use username - not loginname. Also verified through file history back to v4.
2013-08-15 10:08:59 +02:00
Morten Christensen 766497e355 Refactoring QueryHelper to be a base class instead.
Fix U4-2607 Creating nodes with special characters causes YSOD
2013-08-14 17:07:21 +02:00
Morten Christensen 67a2a9cfe4 Refactoring the optimized Recycle Bin, so that the Recycle Bin's repository is more independent and easier to use with the new events added to the Content- and MediaService. 2013-08-14 16:12:13 +02:00
dprothero 766ba0c8f5 Fixed membership provider to correctly log failed attempts. 2013-08-13 13:46:32 -07:00
Morten Christensen ca71c59880 Fixes U4-2218 Document Type copy looses property tab assignment 2013-08-13 17:41:35 +02:00
Morten Christensen 6c87cf729a Fixes U4-2592 Cannot delete a node when the node has just a closing bracket in the name. 2013-08-13 11:27:39 +02:00
Shannon 5c63afa31a removed my test examine settings 2013-08-13 18:26:32 +10:00
Shannon fa88768c91 removed my test examine settings 2013-08-13 18:25:39 +10:00
Shannon bfabfd9fa5 Updated to latest Examine version (contains bug fix for U4-2180 Problem with Examine MultiIndexSearcher after upgrading from 4.11.3 to 4.11.8) and removes the partially trusted callers attribute from the PDF lib because itextsharp by default doesn't support med trust. 2013-08-13 15:41:40 +10:00
Shannon aa1c411c8c Fixes U4-2618 PDF indexer does not ensure spaces are added to textual content and fixes med trust compat relating to U4-2180 Problem with Examine MultiIndexSearcher after upgrading from 4.11.3 to 4.11.8 2013-08-13 13:47:57 +10:00
Shannon c52c452b36 Fixes issue relating to the fix for U4-2589 where we need to clear the published db flag for previous versions when creating a new published version. 2013-08-13 11:01:49 +10:00
Morten Christensen 86811fe507 Fixes U4-2397 IContent Properties added with incorrect Value when read from Cache, and adds unit test for verifying types saved and returned for 24 standard DataTypes. 2013-08-12 16:20:32 +02:00
Morten Christensen 363de53b82 Updates query to limit results in subquery for MySql according to U4-2329 Browsing Media Slow in 6.1.1 2013-08-12 12:42:21 +02:00
Shandem 958fb66f2c Merge pull request #73 from florisrobbemont/6.1.3
U4-2596: UmbracoControllerFactory method ReleaseController should be virtual
2013-08-11 18:13:06 -07:00
Morten Christensen 30e12c1367 Final piece to the puzzle for U4-2571 Need to optimize empty recycle bin. Needed to hack around the ordering of items in the recycle bin because of the self-referencing constraint - parentID to id in the umbracoNode table by updating all parentID entries, which bypasses any reference issues with the foreignkey. 2013-08-11 21:12:02 +02:00
Morten Christensen 89ff7d85e2 Correcting DELETE FROM query so it works with sql ce as well. 2013-08-09 17:44:57 +02:00
Shannon 61fbf2cfc6 reverts PersistDeletedItem transaction because i forgot that the Commit() method of the UOW already takes care of the transaction. 2013-08-09 10:52:24 +10:00
Shannon ce847e97a8 Updates the PetaPocoRepositoryBase to ensure that the deletion process is wrapped in a transaction so if any of the processes fail, it all gets rolled back. 2013-08-09 10:07:03 +10:00
Shannon 1e61563f79 Ensures the deletions are wrapped in a transaction - for performance and to mitigate db corruption if one of the deletes fails. 2013-08-09 10:01:28 +10:00
Morten Christensen b4f9985695 Last bits to implement U4-2571 Need to optimize empty recycle bin 2013-08-08 15:12:26 +02:00
Morten Christensen 82f19ede8c Merge branch '6.1.4' of https://github.com/umbraco/Umbraco-CMS into 6.1.4 2013-08-08 10:22:38 +02:00
Shannon 0fbc32a87f Fixes up logic for creating new versions (U4-2589 Save and Publish is not creating version of document) 2013-08-08 10:42:06 +10:00
Floris Robbemont dc2de4b5e7 U4-2596: UmbracoControllerFactory method ReleaseController should be virtual 2013-08-07 15:06:41 +02:00
Shannon 5fce741940 another sln update 2013-08-07 11:53:09 +10:00
Shannon 14e4a8061c removes the vs profiling files from the sln. 2013-08-07 11:49:48 +10:00
Shannon 1b9f071581 Fixes: U4-2589 Save and Publish is not creating version of document and adds a few unit tests 2013-08-07 11:39:25 +10:00
Morten Christensen 79141ef86d Initial work on U4-2571 Need to optimize empty recycle bin 2013-08-06 15:08:05 +02:00
Sebastiaan Janssen 08609a887c Merge branch '6.1.4' of github.com:umbraco/Umbraco-CMS into 6.1.4 2013-08-06 10:24:42 +02:00
Sebastiaan Janssen b11932240c Fixes U4-2587 Regression: Hide Preview Button on nodes that have no template
Now also checks if the template still exists and if it's allowed on that document to determine when to enable the preview button
2013-08-06 10:24:20 +02:00
Shannon d47b4517c1 Fixes unit tests 2013-08-06 13:06:25 +10:00
Morten Christensen 226a13c6e1 Minor adjustment related to U4-2560 Working with ContentService can give 2 versions of a document as "newest" 2013-08-05 14:30:03 +02:00
Shannon d78a03a610 Massively improves performance for the packaging service (converting docs to XML) which is used in republishing the tree. 2013-08-05 13:11:47 +10:00
Shannon b7a1123319 U4-2579 BulkPublishController causes YSOD when there are invalid child elements due to InvalidProperties having a null reference 2013-08-02 16:23:32 +10:00
Shannon 7e9cad34db Creates an SQL Server version check for bulk sql imports. 2013-08-02 16:01:54 +10:00
Shannon c4b44ea0e3 Fixes: U4-2577 Can't save umbraco user - without re-filling in the password
Fixes: U4-541 Wrong dictionary key when using in backend template names
This changes the way that the value that is stored in the auth cookie. Previously we just stored a GUID which was the user's contextid stored in the db, now we store encrypted values of a few necessary user objects. In 6.2 we'll actually set a real .Net user object on the HttpContext. For now, the http module will simply just ensure that the culture is set correctly for the currently logged in user.
2013-08-02 15:16:04 +10:00
Sebastiaan Janssen 3435a75e9e U4-2553 Double tabs when installing package that makes use of Dictionary Items to translate document types
Forgto to commit a file :)
2013-08-01 14:39:22 +02:00
Sebastiaan Janssen bdb6c5768a U4-2553 Double tabs when installing package that makes use of Dictionary Items to translate document types
Added GetRawCaptionById method for the packager so the generated XML is correct
2013-08-01 13:40:23 +02:00
Sebastiaan Janssen 87a3c53e22 Merge branch '6.1.4' of github.com:umbraco/Umbraco-CMS into 6.1.4 2013-07-31 18:31:56 +02:00
Sebastiaan Janssen 898d25f3cb Include lang files in project so they'll actually end up in the final build 2013-07-31 18:31:39 +02:00
Shannon 9bc3fdd555 Makes UmbracoContext disposable and fixes the module's DisposeHttpContextItems to actual perform the disposal of each item. 2013-07-31 17:34:42 +10:00
Shannon cbda86fe92 Fixes build error, streamlines all calls to validate a user for base controllers. 2013-07-31 17:24:36 +10:00
Shannon b48f0f52e0 updates uri extensions + tests
Conflicts:
	src/Umbraco.Core/UriExtensions.cs
2013-07-31 17:08:10 +10:00
Shannon e2eeafcbfc Fixes: U4-2232 UmbracoAuthorizeAttribute breaks Relfection methods - ensures that no singleton instances are passed into attributes since they only ever get created once, meaning we're left with a stale version in the attribute. 2013-07-31 16:45:11 +10:00
Shannon ad697db42b Fixes an issue with WebSecurity logout 2013-07-31 11:10:33 +10:00
Shannon 9bb31e9456 Merge branch '6.1.4-cmsContentXml_Optimizations' into 6.1.4 2013-07-29 17:45:48 +10:00
Shannon a195d33332 Added another benchmark for removing/re-inserting records for cmsContentXml table using one transaction which again improves performance. Now have changed the rebuild xml method in the content service to : Lookup all data that it needs to insert first, then we begin a transaction and inside of the one transaction we clear the data and re-insert it so if anything fails in this process it should be rolled back. 2013-07-29 17:45:05 +10:00
Shannon 82a87cbd92 Doh, missed file 2013-07-29 16:46:30 +10:00
Shannon 5b26436862 Removes all references to the legacy Document.RepublishAll and replaces it's logic with the correct logic. 2013-07-29 16:45:54 +10:00
Shannon eed61f9053 Adds unit test for U4-2556 to ensure that it is solved. 2013-07-29 16:42:53 +10:00
Shannon 55c68485e9 Changed the logic of the GetByPublishedVersion to only return from cache if the cache item is published. 2013-07-29 16:03:37 +10:00
Shannon b9ba350a2f Updated the RebuildXmlStructures method with performance improvements. Added cache checking to the GetByPublishedVersion method since published content should always be 'latest' this will speed things up tremendously if items are found there. Added 2 more performance tests which show very large perf improvements, namely the Get_All_Published_Content_Of_Type shows a 77% improvement. 2013-07-29 15:49:56 +10:00
Shannon 696306e7c9 Implements the bulk insert procedure for re-populating the cmsContentXml tables, removes the need to rebuild all xml structures when sorting if in LB environments 2013-07-29 13:25:02 +10:00
Sebastiaan Janssen 9bf86aff09 Merge branch '6.1.4' of github.com:umbraco/Umbraco-CMS into 6.1.4 2013-07-26 15:17:20 +02:00
Sebastiaan Janssen f50de5b049 U4-2550 Could not load file or assembly 'HtmlAgilityPack, Version=1.4.5.0 2013-07-26 15:16:55 +02:00
Sebastiaan Janssen d734ba6136 U4-2543 In the back office its possible to get Response Validation errors 2013-07-26 12:43:19 +02:00
Morten Christensen c49becea53 Cleanup of unused using statements in a few files 2013-07-26 12:35:40 +02:00
Shannon 614aea203d Merge remote-tracking branch 'origin/6.1.4' into 6.1.4-cmsContentXml_Optimizations 2013-07-26 18:14:13 +10:00
Shannon ed88bbf75f Fixed up BaseDatabaseFactoryTests so that it only loads in one db factory with the correct conn strings, now we can easily override to use a custom db. Added benchmark tests for bulk inserting records for the cmsContentXml table which shows how we can improve performance quite a bit especially for larger node sets. Added more unit tests for bulk inserting and fixed it up a bit more. 2013-07-26 18:13:56 +10:00
Sebastiaan Janssen e41d3c7e84 Increase version to 6.1.4 2013-07-25 11:59:37 +02:00
Sebastiaan Janssen a099af39c2 xmlrpcnet was missing from nuspecs 2013-07-25 11:50:56 +02:00
Shannon 118f9b02e2 Fixes: U4-1027 Media Sort Usability -> changed the sorting to use Web API instead of asmx web service. 2013-07-25 12:29:41 +10:00
Sebastiaan Janssen 38778cc7c7 Fixes U4-2488 Edit datatype: Media Picker appears incorrectly 2013-07-24 14:52:25 +02:00
Shannon ffff9efaa8 Fixes: U4-2535 The actions/publish.aspx page does not publish correctly and show the correct publish result 2013-07-24 13:06:25 +10:00
Shannon 7f4abb4893 Fixed editContent.aspx to let the business logic handle the property validation when trying to publish and show the correct status message result (if it was not publishable). Adds the invalid properties collection to the PublishStatus so those can be shown too. 2013-07-24 12:54:10 +10:00
Shannon 4d39ce1202 Fixes Allow At Root styling 2013-07-24 11:44:26 +10:00
Shannon 7164f23a98 Fixes up validation styling and the validation summary close button display. 2013-07-24 11:31:31 +10:00
Shannon 8b2d1b8eab Fixed Template model class to not have it's own NodePath property which was always null since it wasn't mapped (and there was no point in it). 2013-07-24 10:11:05 +10:00
Shannon 80394f08fb Fixed runtime cache provider issues & unit tests. 2013-07-24 09:36:01 +10:00
Sebastiaan Janssen ca1fe5ff2a Unit test for: U4-2514 Checkboxlist prevalues in packages broken 2013-07-23 16:13:20 +02:00
Sebastiaan Janssen a1037ce43c Fixes U4-2187 - Enable support for MySQL on Linux 2013-07-23 15:38:26 +02:00
Sebastiaan Janssen 2cd2f3741d Merge branch '6.1.2' of https://github.com/stevetemple/Umbraco-CMS into stevetemple-6.1.3 2013-07-23 15:20:28 +02:00
Sebastiaan Janssen e634dba4ea 2nd attempt: U4-2514 Checkboxlist prevalues in packages broken 2013-07-23 13:16:18 +02:00
Shannon d1eb8fd9eb Obsoletes UmbracoFile with new UmbracoMediaFile in the Core assembly and wraps the legacy class to use the new one. Improves performance of UmbracoMediaFile by ensuring any IO is lazy loaded and then saved to a local property so it doesn't need to re-read the file for things like length/size.
Conflicts:
	src/Umbraco.Core/Umbraco.Core.csproj
2013-07-23 17:59:44 +10:00
Shannon 2e91c89c02 Fixes null check for changes to RuntimeCacheProvider 2013-07-23 14:00:52 +10:00
Shannon 8be54ba0cc Fixes: U4-1970 v6 API - need to implement caching for templates since we're doing a db lookup on a front-end request. This is a temporary fix until we implement the ApplicationCache properly but it still works by utilizing the existing RuntimeCacheProvider singleton. I've tweaked this provider as well to ensure we use the HttpRuntime.Cache when it is available (during a web session). We don't want to have a seperate caching bucket so that IIS can manage cache memory properly. Have ensured that the template cache is cleared when templates are updated/removed. 2013-07-23 11:46:18 +10:00
Shannon 3da7682415 reverted change for U4-2514 as this change will cause other unwanted problems. Added logging for DefaultDataKeyValue instead of blindly swallowing an exception. 2013-07-23 10:50:48 +10:00
Sebastiaan Janssen 775892ff5a U4-2514 Checkboxlist prevalues in packages broken 2013-07-22 16:23:16 +02:00
Sebastiaan Janssen f30b4c8184 Slight refactor of UmbracoFile 2013-07-22 13:55:10 +02:00
Sebastiaan Janssen 319ba5c791 U4-2524 If tinyMCEImageHelper.DoResize fails, the src gets removed from the img tag 2013-07-22 13:51:13 +02:00
Sebastiaan Janssen 398bc6d767 Fix merge issue 2013-07-22 12:15:54 +02:00
Sebastiaan Janssen 5d3ef8d97f Merge branch '6.1.3' of https://github.com/Myster/Umbraco-CMS into Myster-6.1.3
Conflicts:
	src/Umbraco.Web.UI/umbraco/config/lang/de.xml
	src/Umbraco.Web.UI/umbraco/config/lang/no.xml
2013-07-22 12:09:41 +02:00
Sebastiaan Janssen 08a300fbe5 U4-2370 Style sheet property sorting broken 2013-07-22 10:47:01 +02:00
Sebastiaan Janssen 845770c4bb Merge pull request #69 from abryukhov/patch-2
tinyMCE internal language pack - RU
2013-07-22 00:05:22 -07:00
Sebastiaan Janssen 771dc10c85 Merge pull request #68 from abryukhov/patch-3
tinyMCE internal language pack - RU
2013-07-22 00:04:23 -07:00
Sebastiaan Janssen 2ac76202e5 Merge pull request #67 from abryukhov/patch-4
tinyMCE internal language pack - RU
2013-07-22 00:04:11 -07:00
Sebastiaan Janssen a5ecbe96e2 Merge pull request #66 from abryukhov/patch-5
tinyMCE internal language pack - RU
2013-07-22 00:04:03 -07:00
Sebastiaan Janssen 7240b22e48 Merge pull request #65 from abryukhov/patch-6
tinyMCE internal language pack - RU
2013-07-22 00:03:51 -07:00
Sebastiaan Janssen 1f00589cb4 Merge pull request #64 from abryukhov/patch-7
tinyMCE internal language pack - RU
2013-07-22 00:03:33 -07:00
Sebastiaan Janssen 60b14487a9 Merge pull request #63 from abryukhov/patch-8
tinyMCE internal language pack - RU
2013-07-22 00:03:24 -07:00
Sebastiaan Janssen 33bc85a843 Merge pull request #62 from abryukhov/patch-9
tinyMCE internal language pack - RU
2013-07-22 00:03:14 -07:00
Sebastiaan Janssen e6642674d4 Merge pull request #61 from abryukhov/patch-10
tinyMCE internal language pack - RU
2013-07-22 00:03:01 -07:00
Sebastiaan Janssen 8ad5fb3c44 Merge pull request #60 from abryukhov/patch-11
tinyMCE internal language pack - RU
2013-07-22 00:02:50 -07:00
Sebastiaan Janssen 1752d14c57 Merge pull request #59 from abryukhov/patch-12
tinyMCE internal language pack - RU
2013-07-22 00:02:40 -07:00
Sebastiaan Janssen ec4ccba1a7 Merge pull request #58 from abryukhov/patch-13
tinyMCE internal language pack - RU
2013-07-22 00:02:32 -07:00
Sebastiaan Janssen 0244492a89 Merge pull request #57 from abryukhov/patch-14
tinyMCE internal language pack - RU
2013-07-22 00:02:22 -07:00
Sebastiaan Janssen 546cf2c84d Merge pull request #56 from abryukhov/patch-15
tinyMCE internal language pack - RU
2013-07-22 00:02:14 -07:00
Sebastiaan Janssen d354dde774 Merge pull request #55 from abryukhov/patch-16
tinyMCE internal language pack - RU
2013-07-22 00:02:03 -07:00
Sebastiaan Janssen 22c9e9acd9 Merge pull request #54 from abryukhov/patch-17
tinyMCE internal language pack - RU
2013-07-22 00:01:47 -07:00
Alexander Bryukhov 5dd14723e9 tinyMCE internal language pack - RU 2013-07-22 10:29:12 +07:00
Alexander Bryukhov 7134e80c44 tinyMCE internal language pack - RU 2013-07-22 10:27:31 +07:00
Alexander Bryukhov f7196ee8f9 tinyMCE internal language pack - RU 2013-07-22 10:26:47 +07:00
Alexander Bryukhov fdecd697b7 tinyMCE internal language pack - RU 2013-07-22 10:26:04 +07:00
Alexander Bryukhov 6c03dac869 tinyMCE internal language pack - RU 2013-07-22 10:25:18 +07:00
Alexander Bryukhov 6cdb564a9f tinyMCE internal language pack - RU 2013-07-22 10:24:31 +07:00
Alexander Bryukhov 0da8a8db36 tinyMCE internal language pack - RU 2013-07-22 10:23:51 +07:00
Alexander Bryukhov a4a9620889 tinyMCE internal language pack - RU 2013-07-22 10:22:46 +07:00
Alexander Bryukhov 2307424fb6 tinyMCE internal language pack - RU 2013-07-22 10:22:01 +07:00
Alexander Bryukhov ca124fb662 tinyMCE internal language pack - RU 2013-07-22 10:21:16 +07:00
Alexander Bryukhov 6787252f9b tinyMCE internal language pack - RU 2013-07-22 10:20:36 +07:00
Alexander Bryukhov ef3094f8d9 tinyMCE internal language pack - RU 2013-07-22 10:19:51 +07:00
Alexander Bryukhov a2a20133aa tinyMCE internal language pack - RU 2013-07-22 10:18:38 +07:00
Alexander Bryukhov bb750d186a tinyMCE internal language pack - RU 2013-07-22 10:17:56 +07:00
Alexander Bryukhov f2a7dde5ce tinyMCE internal language pack - RU 2013-07-22 10:16:00 +07:00
Alexander Bryukhov 73e2559a13 tinyMCE internal language pack - RU 2013-07-22 10:14:48 +07:00
Shannon 80f8a9d01c Merge branch '6.1.3' of https://github.com/umbraco/Umbraco-CMS into 6.1.3 2013-07-22 12:44:06 +10:00
Shannon 6f9883d373 Fixes MNTP required validation (U4-1975) 2013-07-22 12:30:12 +10:00
Shannon 41c920a4ec Updated to latest CDF version which contains some fixes. 2013-07-22 11:29:32 +10:00
Sebastiaan Janssen 1f79b71738 Merge branch '6.1.3' of github.com:umbraco/Umbraco-CMS into 6.1.3 2013-07-19 15:59:09 +02:00
Sebastiaan Janssen 64fb588556 defaultDocumentTypeProperty is no longer case-sensitive. Added to the Release config as well so it makes it into the umbraco downloadable package. 2013-07-19 15:41:29 +02:00
Sebastiaan Janssen 90cfd004cb Merge branch 'wip-u4-1949' of https://github.com/AndyButland/Umbraco-CMS into AndyButland-wip-u4-1949 2013-07-19 15:41:15 +02:00
Sebastiaan Janssen b5494546c7 defaultDocumentTypeProperty is no longer case-sensitive. Added to the Release config as well so it makes it into the umbraco downloadable package. 2013-07-19 15:40:12 +02:00
Sebastiaan Janssen 7bac1ef1cd Merge branch 'wip-u4-1949' of https://github.com/AndyButland/Umbraco-CMS into AndyButland-wip-u4-1949 2013-07-19 15:22:05 +02:00
Sebastiaan Janssen ad927ec6c1 Merge pull request #53 from abryukhov/patch-1
Update of ru.xml with latest keys
2013-07-19 06:20:55 -07:00
Sebastiaan Janssen 8a19d28859 Merge pull request #52 from enkelmedia/patch-1
Update to readme to contain info about the support for MVC
2013-07-19 06:20:37 -07:00
Sebastiaan Janssen 7e24af9daf Merge branch '6.1.3' of github.com:umbraco/Umbraco-CMS into 6.1.3 2013-07-19 15:19:27 +02:00
Sebastiaan Janssen 7518b514a7 Merge pull request #51 from kipusoep/master
Updated the download link
2013-07-19 15:19:01 +02:00
Sebastiaan Janssen da15d40b04 Merge pull request #51 from kipusoep/master
Updated the download link
2013-07-19 06:18:13 -07:00
Sebastiaan Janssen 96c38f50e4 Merge pull request #49 from lars-erik/6.1.3
Prettifying norwegian translation
2013-07-19 06:17:48 -07:00
Sebastiaan Janssen e723f1169f Merge pull request #48 from marc303/patch-1
Updated DE to 6.1.2
2013-07-19 06:16:48 -07:00
Sebastiaan Janssen 914005b2b6 Merge pull request #46 from michielvoo/u4-2417
U4-2417 Could the preview thumbnail link to the full image
Conflicts:
	src/Umbraco.Web/Umbraco.Web.csproj
	src/Umbraco.Web/umbraco.presentation/umbraco/controls/Images/ImageViewer.ascx.cs
	src/umbraco.editorControls/mediapicker/mediaChooser.cs
2013-07-19 15:09:07 +02:00
Sebastiaan Janssen 67bd303173 Merge pull request #46 from michielvoo/u4-2417
U4-2417 Could the preview thumbnail link to the full image
2013-07-19 06:02:51 -07:00
Sebastiaan Janssen 972b903f52 Merge pull request #32 from AndyButland/wip-u4-1285
Fix for U4-1285: Apostrophes in member groups cause exceptions
2013-07-19 14:40:28 +02:00
Sebastiaan Janssen 20e6843bf0 Merge pull request #32 from AndyButland/wip-u4-1285
Fix for U4-1285: Apostrophes in member groups cause exceptions
2013-07-19 05:39:38 -07:00
Sebastiaan Janssen 61d072c8d6 Fix merge issue 2013-07-19 13:32:24 +02:00
Sebastiaan Janssen 8740848aac Merge pull request #42 from michielvoo/u4-232
Enabled support for integrated security for SQL Server to the installer.
Conflicts:
	src/Umbraco.Web.UI/install/steps/database.ascx
2013-07-19 13:29:07 +02:00
Sebastiaan Janssen 85c80b07f9 Merge pull request #42 from michielvoo/u4-232
Enabled support for integrated security for SQL Server to the installer.
2013-07-19 04:26:50 -07:00
Sebastiaan Janssen 6766aa9732 Merge pull request #41 from michielvoo/u4-667
U4-667
2013-07-19 13:19:30 +02:00
Sebastiaan Janssen 557dccd88b Merge pull request #41 from michielvoo/u4-667
U4-667
2013-07-19 04:18:29 -07:00
Sebastiaan Janssen a57334d1f7 Merge pull request #40 from michielvoo/u4-663
U4-663
2013-07-19 12:55:16 +02:00
Sebastiaan Janssen 334f0bfd2b Merge pull request #40 from michielvoo/u4-663
U4-663
2013-07-19 03:53:15 -07:00
Sebastiaan Janssen 3dea16fad1 U4-2309 BackOffice / ExamineMngr : "Optimize index" don't ends correctly when website has not members. 2013-07-19 12:39:50 +02:00
Shannon 1bf4121796 Fixes a null check in UmbracoTemplatePage 2013-07-19 12:36:02 +10:00
Shannon 93bebdd50b Merge branch '6.1.3' of https://github.com/umbraco/Umbraco-CMS into 6.1.3 2013-07-19 12:27:59 +10:00
Shannon 6a9532f10a Fixes: U4-1599 [MVC] ChangeContentType doesn't work in macros rendered from a View -> We need to manually reset the ContentType after we execute a webforms based macro because Server.Execute resets the ContentType back to the default. 2013-07-19 12:27:37 +10:00
AndyButland 986d37afd6 Removed debugging console.log reference 2013-07-18 21:23:05 +02:00
Sebastiaan Janssen d88494e90e U4-638 Bug (and fix/solution): Saving inline base64 image (or any attribute value with equal sign at the end) 2013-07-18 17:09:26 +02:00
Sebastiaan Janssen e48f08b657 When using Public Access > Single User Protection the email of the member is empty, this caused errors because the result of GetMembersFromEmail is null 2013-07-18 16:07:39 +02:00
Sebastiaan Janssen a79e349f3d U4-2467 v4.11.1: Membership search does not search on email address anymore 2013-07-18 11:00:56 +02:00
Shannon 1c70570078 Fixes : U4-2055 Unpublish Date Bug in Umbraco 6.0.3 -> with unit test to ensure that all dates are formatted as ISO date standards when used in SQL 2013-07-17 14:16:38 +10:00
Alexander Bryukhov 197dacfae7 Update of ru.xml with latest keys 2013-07-17 09:56:50 +07:00
Shannon d8aad718d5 Fixed broken unit test 2013-07-17 11:28:46 +10:00
Sebastiaan Janssen 1d7bfc2781 U4-2465 "Login Name already exists" when creating a new member that existed before 2013-07-16 13:33:52 +02:00
Sebastiaan Janssen 8063717e4c U4-2511 Locallink:NODEID not working 2013-07-16 13:21:27 +02:00
Lars-Erik Aabech 3900b7ebc8 Remove WebForms from nuspec file
Not just WebForms anymore. :)
2013-07-16 13:09:53 +02:00
Shannon 0296c646cb Fixes up a small code issue for U4-2505 2013-07-16 11:45:28 +10:00
enkelmedia 275dbc83dd Update to readme to contain info about the support for MVC 2013-07-15 19:38:10 +02:00
Sebastiaan Janssen 1cd2dc8a42 Fixes U4-2436 Editing an existing property changes its alias 2013-07-15 16:52:23 +02:00
Sebastiaan Janssen 60867af1a7 Fixes U4-2444 Missing image - /umbraco/images/pinnedIcons/umb.ico
Also fixes casing of folder names
2013-07-15 16:31:19 +02:00
Sebastiaan Janssen 1e129bcc4d Fixes U4-2505 umbraco 6.1.2 throws System.NullReferenceException on the first publish after site compilation 2013-07-15 16:16:39 +02:00
Sebastiaan Janssen e5c758bbc1 Fixes U4-1838 uGoLive Success/Failure Images not showing 2013-07-15 16:07:42 +02:00
Shannon 25780663a6 Fixes: U4-1304 Umbraco.Field not replacing localLink when recursive:true . 2013-07-15 15:26:18 +10:00
Stefan Kip 63ea79a4d6 Updated the download link 2013-07-11 10:03:25 +02:00
Sebastiaan Janssen aa327696fe Fixes U4-2354 MiniProfiler - Show SQL parameter values and more stacktrace info
Refactored duplicate code
2013-07-10 12:35:21 +02:00
Lars-Erik Aabech 1272a7c74b Prettifying norwegian translation
Removed obsolete, translated new, removed incorrect spacing and
hyphenation, misc. improvements in term usage. Ref.
http://i18n.skulelinux.no/nb/Fellesordl.eng-no.html.
2013-07-09 12:56:13 +02:00
esn303 dcbe6726b0 Updated DE to 6.1.2
Markup encoded instead of CDATA blocks
2013-07-09 10:30:20 +02:00
Shannon ba68da5736 Makes Domain.GetDomains public (#U4-2483) 2013-07-09 11:55:29 +10:00
Shannon fdabd945dc Merge branch '6.1.3' of https://github.com/umbraco/Umbraco-CMS into 6.1.3 2013-07-09 11:48:03 +10:00
Shannon 868edee5e6 Fixes: #U4-2161 - permissions inheritance. Fixes up how user permissions cache is invalidated and looked up (it is now lazy and not forced). User permissions are also cached as a low priority for now and only for 20 mins based on #U4-2474. 2013-07-09 11:47:46 +10:00
Shannon b91d0bb117 Updates ContentRepository to bulk insert all parent permissions at once (overload to the AssignEntityPermissions method) 2013-07-09 10:08:31 +10:00
Murray Roke cc91977e94 Fix notification-email link to unpublished page
http://issues.umbraco.org/issue/U4-2482
I've added links to language files which did not contain it.
I used the %5% syntax in the sv.xml file which seems to otherwise use
{5} syntax
2013-07-09 11:19:51 +12:00
Shannon 90b94f6ffb Fixes: #U4-2476 2013-07-08 18:58:38 +10:00
Shannon 3c4cf56309 Fixes: #U4-2475 2013-07-08 18:47:53 +10:00
Shannon b7f6195791 Started adding base PermissionsRepository for sub classes to use for assigning permissions, created a BulkImport extension methods for PetaPoco with tests since we'll be needing that for assigning permissions in a nice way. Wrote unit tests for all sql gen for permissions and assigning permissions. This all starts fixing #U4-2161 but there's still a bit more work to do. 2013-07-08 17:29:26 +10:00
Morten Christensen 42eb82e6ca Merge branch '6.1.3' of https://github.com/umbraco/Umbraco-CMS into 6.1.3 2013-07-05 10:55:12 +02:00
Morten Christensen 93def731ef Fixes #U4-2466 2013-07-05 10:51:19 +02:00
Shannon 60805f91d6 bit of code cleaning. 2013-07-05 16:58:51 +10:00
Shannon 048480d5be Fixes: #U4-2460 - UmbracoHelper.RenderTemplate will now execute the complete MVC cycle when rendering MVC templates whereas before it would only execute the view which means any actionfilters, etc... applied would never have fired (as well as other things) 2013-07-05 14:12:31 +10:00
Morten Christensen 173d388c12 Fixes #U4-2450 2013-07-04 12:31:31 +02:00
Morten Christensen b1285fa7e3 Add missing id to unique naming overload 2013-07-04 12:31:10 +02:00
Morten Christensen e34c857f6c A bit of refactoring around unique naming, and implementing it for media as well 2013-07-04 11:22:59 +02:00
Morten Christensen 7ff0e6cd4b Fixes #U4-2458 2013-07-04 10:50:02 +02:00
Shannon 0683094f84 oops, overwrote previous changes to CmsNode, now merged them back in properly. 2013-07-04 12:20:25 +10:00
Shannon 983b7a85e1 Merge branch '6.1.3' of https://github.com/umbraco/Umbraco-CMS into 6.1.3 2013-07-04 12:13:24 +10:00
Shannon d015780b9f Fixes: #U4-2447 - non thread safe icon lookup 2013-07-04 12:13:02 +10:00
Michiel van Oosterhout e4df176a37 U4-2417: show media picker image as link to the original image.
Order of the views in the markup did not match the order of the Style enum.
ImageViewer control now selects the view by matching the ViewerStyle enum to a View ID. This way the order of the views in the markup is no longer important.

Also:
Removed user control from Umbraco.Web project, moved designer code and added code behind class for user control to Umbraco.Web.UI
Refactored code to use Umbraco.Core.IO
Removed some code that was commented out
2013-07-03 17:36:28 +02:00
Morten Christensen aeece499bb Fixing unit test for PublishedMedia cache, which had expected result set incorrect 2013-07-03 14:00:44 +02:00
Morten Christensen 8465b4e556 Merge branch '6.1.3' of https://github.com/umbraco/Umbraco-CMS into 6.1.3 2013-07-03 12:34:52 +02:00
Morten Christensen e280785f48 Adding Msdeploy PropertyGroup to build prop file, so both FileSystem and MsDeploy package will include the umbraco and umbraco_client folders 2013-07-03 12:30:34 +02:00
Shannon 5e0a59e4b3 Merge branch '6.1.3' of https://github.com/umbraco/Umbraco-CMS into 6.1.3 2013-07-03 19:47:25 +10:00
Morten Christensen 30835797ff Merge branch '6.1.3' of https://github.com/umbraco/Umbraco-CMS into 6.1.3 2013-07-03 11:47:09 +02:00
Shannon 4077a01a6b Fixes: #U4-2344 - fixes examine re-indexing for media and a null check for DataType.Data 2013-07-03 19:47:06 +10:00
Morten Christensen aed70ae40c Updating dependencies in our own nuspec file 2013-07-03 11:46:53 +02:00
Morten Christensen 6d44628352 Merge pull request #45 from jhauge/PublishUmbracoFiles
Add Umbraco files during publish
2013-07-03 02:39:12 -07:00
Jesper Hauge 7a398d34b1 Added file-reg to .nuspec 2013-07-03 11:33:05 +02:00
Morten Christensen 69c5aeb1b3 Updating nuget dependencies for test project 2013-07-03 11:29:58 +02:00
Shannon da545b890b Updated UserRepository to not contain the general query methods, we do those in the service. 2013-07-03 19:26:28 +10:00
Morten Christensen 6609bc09f2 Updating nuget dependency for HtmlAgilityPack 2013-07-03 11:26:17 +02:00
Morten Christensen f06a6f42da Updating nuget dependency for ClientDependency 2013-07-03 11:20:42 +02:00
Jesper Hauge c9065d96a9 These files will add MSBuild target that copies /umbraco /umbraco_client and /App_Browsers files to .csproj files, during install of NuGet package UmbracoCms
Functionality has been tested by creating af copy of the current Nuget package and add these files to the package, then using this package on a new Web application project. Building and doing a VS Publish to the filesystem.
2013-07-03 11:17:47 +02:00
Morten Christensen 9d4e1362c4 Updating nuget references for ASP.NET MVC, Razor, WebPages and WebApi to latest patch release 2013-07-03 11:11:37 +02:00
Shannon d3b69e04e1 Updated IUserService and added more unit tests for new methods. Fixed unit tests that were failing due to incorrectly set settings... not sure how this is working on the server but oh well. 2013-07-03 19:01:37 +10:00
Morten Christensen 0d54e8df89 Updating MySql package dependency 2013-07-03 11:00:26 +02:00
Morten Christensen 8f949d0a2f Merge branch '6.1.3' of https://github.com/umbraco/Umbraco-CMS into 6.1.3 2013-07-03 09:40:17 +02:00
Shannon d67480e98b Updated UserService, didn't need one of the methods on there, updated the unit tests to test all the other methods. 2013-07-03 17:09:14 +10:00
Shannon 5d76ead469 backported changes to IUserRepository from v7 2013-07-03 16:52:00 +10:00
Shannon 2796100067 added another unit test. 2013-07-03 16:45:56 +10:00
Shannon a132f609d7 backports changes for -> Finished upgrading the UserRepository and entities to properly support Users' Allowed Sections & streamlines Persistence/Mappers with less code duplication. 2013-07-03 16:40:22 +10:00
Morten Christensen 7f7456701d Adding license 2013-07-02 15:32:53 +02:00
Michiel van Oosterhout d926180e3a Added special overload for creating a connection string with integrated security.
Actually disable checkbox is the selected database type is not Microsoft SQL Server.
Refactored saveDBConfig for readability.
2013-06-28 16:40:23 +02:00
Sebastiaan Janssen ffce1a3e6b Open new branch for 6.1.3 2013-06-28 14:44:56 +02:00
Sebastiaan Janssen e553f2c671 Correct little mistake in nuspec file 2013-06-28 14:21:25 +02:00
Morten Christensen 42c6533e16 Correcting merge issues 2013-06-28 13:33:41 +02:00
Morten Christensen b0f4cb7d02 Merge branch '6.0.7' into 6.1.2 2013-06-28 13:30:04 +02:00
Morten Christensen f809dec874 Updating repository factory to inject unique name setting into ContentRepository 2013-06-28 13:28:03 +02:00
Morten Christensen 2477500045 Fixes #U4-2414 and removes internal usage of action handlers Yay! 2013-06-28 13:27:23 +02:00
Michiel van Oosterhout 72bb1b3583 U4-667
Added a script to make the checkbox "Render content in editor" dependent on the "Use in editor" checkbox.
Also refactored the create.aspx code-behind so it's easier to see what control is loaded in the dialog when debugging.
2013-06-28 10:44:24 +02:00
Michiel van Oosterhout 240e58e061 U4-663
Do not overwrite existing files when creating a new template.
2013-06-28 10:42:51 +02:00
Michiel van Oosterhout e980296d6d Enabled support for integrated security for SQL Server to the installer. 2013-06-28 10:39:48 +02:00
AndyButland d23482b7a6 Moved setting for DefaultDocumentTypeProperty from GlobalSettings to UmbracoSettings 2013-06-27 16:00:49 +02:00
Morten Christensen d89539a437 Merge branch '6.1.2' of https://github.com/umbraco/Umbraco-CMS into 6.1.2 2013-06-27 15:36:46 +02:00
Morten Christensen 4368f15097 Updating nuspec files which is a bit different for 6.1.x then 6.0.x 2013-06-27 15:36:25 +02:00
Morten Christensen b90150279b Merge branch '6.0.7' into 6.1.2
Conflicts:
	build/Build.proj
	build/NuSpecs/UmbracoCms.Core.nuspec
	src/Umbraco.Tests/Services/ContentTypeServiceTests.cs
2013-06-27 15:27:31 +02:00
Morten Christensen ca1b05e30d Correcting unit test after update to ContentType ctor 2013-06-27 15:23:15 +02:00
Morten Christensen 5c09ba9a2d Updating nuspec files and build 2013-06-27 15:15:27 +02:00
Sebastiaan Janssen cfa3e3aff1 Bump version number 2013-06-27 15:09:44 +02:00
Morten Christensen 59ff4a0484 It hurts having to do this, but Sebastiaan says I have to. So re-wiring the BulkPublishController to use the legacy Document class so legacy events are also fired. 2013-06-27 12:30:16 +02:00
Morten Christensen b1db99f639 Fixing issue in previous fix for #U4-2182 2013-06-27 10:57:49 +02:00
Morten Christensen ccbb838cef Fixing another part of #U4-2186 2013-06-27 10:56:45 +02:00
Steve Temple b12f60e443 Allow for absolute URLs as well as virtual in ResolveUrl to allow for FileSystemProviders that use CDNs 2013-06-27 00:04:37 +01:00
Sebastiaan Janssen 0d5ec8bfd5 Merge branch '6.0.7' into 6.1.2 2013-06-26 20:57:32 +02:00
Sebastiaan Janssen 5f67e85471 Merge branch '6.0.7' of github.com:umbraco/Umbraco-CMS into 6.0.7 2013-06-26 20:55:11 +02:00
Sebastiaan Janssen d9228c368f Fixes U4-2404 Photo gallery broken on Azure - Since the template saving routine is doing ToSafeAlias, we should also do it when setting the default template 2013-06-26 20:54:36 +02:00
AndyButland 212800f706 Added config setting for default document type property; used setting to set default new property type 2013-06-26 17:25:44 +02:00
Morten Christensen 8226505e5b Merge branch '6.0.7' into 6.1.2 2013-06-26 15:55:49 +02:00
Morten Christensen 41b8de09b7 Fixes U4-2234 including test case from issue 2013-06-26 15:49:00 +02:00
Morten Christensen bbf06cd13d Fixes U4-2234 2013-06-26 14:31:36 +02:00
Morten Christensen 639cb17741 Fixes U4-2182 and U4-2167 2013-06-26 14:31:10 +02:00
Morten Christensen 4643d34546 Moving generation of xml from ContentExtensions to the PackagingService 2013-06-26 13:30:54 +02:00
Sebastiaan Janssen 50035eae49 Merge pull request #33 from bokmadsen/6.0.7
Bugfix for previous pullrequest "Duplicate e-mail addresses: U4-315, U4-...
2013-06-26 02:43:34 -07:00
Bo Kingo Damgaard 2d857a8635 Bugfix for previous pullrequest "Duplicate e-mail addresses: U4-315, U4-2147, U4-304"
There was a bug in the previous pullrequest that didn't allow a member
to saved if the email wasn't changed. Furthermore duplicate emails are
now prevented if requireUniqueEmail was false, but is switched to true
(when saving a member)
2013-06-26 10:47:27 +02:00
AndyButland d47ff4005c Support for deleting member groups with apostrophes 2013-06-26 06:16:39 +02:00
AndyButland dfeb1c7a0b Support for displaying and editing member groups with apostrophes 2013-06-26 06:16:23 +02:00
Morten Christensen e4387b8dae Adding some internal bits in the ServiceContextManager and PackagingService 2013-06-25 13:43:57 +02:00
Morten Christensen 188aca499a Merge branch '6.0.7' into 6.1.2 2013-06-25 11:54:24 +02:00
Morten Christensen 3040d362ef Fixes #U4-2361 2013-06-25 11:48:37 +02:00
Shannon a57aa07721 Updated default controller resolver to use new IRenderMvcController interface, fixed some merge issues. 2013-06-25 09:55:45 +10:00
Shannon f2b8e3407b Merge remote-tracking branch 'origin/6.0.7' into 6.1.2
Conflicts:
	src/Umbraco.Web/Mvc/RenderControllerFactory.cs
	src/Umbraco.Web/Mvc/RenderMvcController.cs
	src/Umbraco.Web/Mvc/RenderRouteHandler.cs
	src/Umbraco.Web/Umbraco.Web.csproj
2013-06-25 09:41:27 +10:00
Shannon 1ec7cd3b89 Implements: #U4-2342 - IRenderMvcController 2013-06-25 09:33:48 +10:00
Sebastiaan Janssen bd77463fa4 Merge branch '6.0.7' into 6.1.2
Conflicts:
	build/NuSpecs/UmbracoCms.Core.nuspec
	src/Umbraco.Core/Models/ContentTypeBase.cs
	src/Umbraco.Core/Models/IContentTypeBase.cs
	src/Umbraco.Core/Models/PropertyGroupCollection.cs
2013-06-24 12:06:58 +02:00
Sebastiaan Janssen 368954226a Update to not require specific version of MVC4, just 4.0.20710.0 and higher 2013-06-24 12:05:22 +02:00
Sebastiaan Janssen 496d51c2a0 Merge pull request #25 from kipusoep/Duplicate-words-domainHelp
Duplicate words removed
2013-06-24 01:30:04 -07:00
Stefan Kip b01b4f7aa7 Forgot to update XML comments
Signed-off-by: Sebastiaan Janssen <sebastiaan@umbraco.com>
2013-06-24 10:29:03 +02:00
Stefan Kip 49a699c858 Added RemovePropertyGroup method
Signed-off-by: Sebastiaan Janssen <sebastiaan@umbraco.com>
2013-06-24 10:28:42 +02:00
Morten Christensen f68571ef7c Merge pull request #24 from kipusoep/U4-2421-RemovePropertyGroup
U4-2421 Added RemovePropertyGroup method
2013-06-24 01:18:21 -07:00
Stefan Kip 6cc1735363 Duplicate words removed 2013-06-23 21:49:43 +02:00
Stefan Kip d553dfd4b0 Forgot to update XML comments 2013-06-23 20:24:22 +02:00
Stefan Kip f3e737720b Added RemovePropertyGroup method 2013-06-23 16:38:11 +02:00
Stefan Kip 22cf59345c Removed space before UmbracoModule
Removed space before UmbracoModule
Conflicts:
	src/Umbraco.Web.UI/web.Template.config
2013-06-23 16:02:02 +02:00
Michiel van Oosterhout 16a46a4ea4 Changed default user email address to use the example domain, instead of domain.com 2013-06-23 16:01:04 +02:00
Sebastiaan Janssen 09d9728fb8 Merge branch '6.0.7' into 6.1.2
Conflicts:
	src/Umbraco.Web.UI/Umbraco.Web.UI.csproj
2013-06-23 15:16:44 +02:00
Sebastiaan Janssen c0df3e0202 Match IIS Express port number to Umbraco version so it's easier to use a few copies of the repo locally
(you don't have to re-map your port to the correct folder)
2013-06-23 15:13:27 +02:00
Sebastiaan Janssen d09e283900 Merge branch '6.0.7' into 6.1.2
Conflicts:
	.hgtags
2013-06-23 15:00:14 +02:00
Sebastiaan Janssen 507c6c23b9 If you never had VS2010 installed, the build now works, checking if the Publishing Tasks dll exists now 2013-06-23 14:57:53 +02:00
Sebastiaan Janssen 3daf936623 Remove hgignore files 2013-06-23 14:52:45 +02:00
Sebastiaan Janssen e93c910347 Fix more unit tests 2013-06-22 17:32:22 +02:00
Sebastiaan Janssen 7139e30296 Don't delete the config file directory, it can't sometimes
For now, don't delete umbracoSettings.config either, it makes a lot of tests fail
2013-06-22 15:53:10 +02:00
Sebastiaan Janssen df1940a01c Fix unit test by ensuring config file is copied if it doesn't exist 2013-06-22 15:07:40 +02:00
Sebastiaan Janssen aafb5a0285 Merge branch '6.0.7' into 6.1.2
Conflicts:
	src/Umbraco.Tests/PublishedCache/PublishedContentCacheTests.cs
2013-06-22 14:22:43 +02:00
Sebastiaan Janssen 033f981718 Fix unit test 2013-06-22 14:19:22 +02:00
Sebastiaan Janssen 5bd55bdd09 Merge branch '6.0.7' into 6.1.2 2013-06-21 17:33:42 +02:00
Sebastiaan Janssen 76358e3e13 U4-2374 Mono port to do: dealing with empty string 2013-06-21 17:29:55 +02:00
Sebastiaan Janssen 35c0eb3b0c U4-2377 Mono port to do: Universal currency character does not work as split character unless given in unicode. 2013-06-21 17:22:13 +02:00
Sebastiaan Janssen 7fad8ca98b U4-2378 Mono port to do: TypeFinder needs exclusions for Monodevelop Nunit 2013-06-21 17:15:42 +02:00
Sebastiaan Janssen a2da27121e U4-2335 [Regression] YSOD when editing stylesheet property on 6.0.6 2013-06-21 17:00:40 +02:00
Sebastiaan Janssen 23ec07276a U4-2369 Wrong path for Umbraco/Config/Lang/xx.xml for publish notification mail 2013-06-21 16:56:59 +02:00
Sebastiaan Janssen 96cec0b407 U4-2410 EditRelationType.aspx missing virtual path - 6.0.6 2013-06-21 16:30:44 +02:00
Sebastiaan Janssen 47b94e68e3 Merge branch '6.0.7' of github.com:umbraco/Umbraco-CMS into 6.0.7 2013-06-21 15:26:10 +02:00
Sebastiaan Janssen 0f4b1752e0 U4-2416 Missing colon in file ListChildPagesOrderedByProperty causes Web site not to run 2013-06-21 15:25:46 +02:00
Shannon eac66f5696 Merge branch '6.0.7' into 6.1.2 2013-06-21 13:00:56 +10:00
Shannon b2c604f7b3 updated ignore 2013-06-21 11:26:23 +10:00
Shannon 3f626b444f re-enables CDF logger 2013-06-21 10:55:38 +10:00
Shannon c5b8931aa6 Merge branch '6.0.7' into 6.1.2
Conflicts:
	src/Umbraco.Web.UI/config/ClientDependency.config
2013-06-21 10:50:35 +10:00
Shannon 818d22ba61 updates CDF config examples (#U4-2331) 2013-06-21 10:49:27 +10:00
Shannon f9902964b0 Merge branch '6.0.7' into 6.1.2
Conflicts:
	src/Umbraco.Web.UI/config/Dashboard.config
	src/Umbraco.Web.UI/config/ExamineIndex.config
2013-06-21 09:20:53 +10:00
Shannon 27fdb1ebab removed custom dashboard, re-put back in the external index (must have got removed by accident) 2013-06-21 09:19:50 +10:00
Shannon 1368ba8dc9 Fixes unit tests 2013-06-21 08:47:01 +10:00
Sebastiaan Janssen 9a3c2bbc5c Merge pull request #19 from michielvoo/master
Changed default email address in the installer
2013-06-20 07:47:50 -07:00
Michiel van Oosterhout 0b0fb92cf1 Changed default user email address to use the example domain, instead of domain.com 2013-06-20 16:01:03 +02:00
Sebastiaan Janssen 6f09da0927 Merge pull request #17 from kipusoep/patch-1
Removed space before UmbracoModule
2013-06-20 06:18:21 -07:00
Stefan Kip febe6ec241 Removed space before UmbracoModule
Removed space before UmbracoModule
2013-06-20 14:56:39 +02:00
Shannon 3618722574 Fixed some merging issues. 2013-06-20 15:57:23 +10:00
Shannon 24a76f53b4 Merge branch '6.0.7' into 6.1.2
Conflicts:
	src/Umbraco.Core/Umbraco.Core.csproj
	src/Umbraco.Core/Xml/XmlNodeExtensions.cs
	src/Umbraco.Web.UI/config/ClientDependency.config
	src/Umbraco.Web.UI/config/Dashboard.config
	src/Umbraco.Web/DefaultPublishedContentStore.cs
	src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/moveOrCopy.aspx.cs
	src/umbraco.businesslogic/BasePages/BasePage.cs
2013-06-20 15:49:55 +10:00
Shannon 86ce48ddc8 Fixes: #U4-2312 - Moving content with the new API (and in the old api when calling library.UpdateDocumentCache(p.Id)) The document is actually moved properly in the content XML structure without republishing it and then rebuilding the entire XML structure, it just does it inline. Have also updated MoveAndCopy.aspx dialog to use the new API which now saves on about 20+ queries that were not needed. Also updated the MoveAndCopy dialog to have the correct code behind structure. 2013-06-20 15:34:57 +10:00
Shannon cb592d687c Merge branch '6.0.7' into 6.1.2 2013-06-20 11:26:01 +10:00
Shannon 2161ec98b0 Fixes: #U4-2324 - Umbraco.Field will now work with custom routed pages. 2013-06-20 11:25:33 +10:00
Shannon 5a6ee168c3 Merge branch '6.0.7' into 6.1.2 2013-06-20 10:08:50 +10:00
Shannon 52292cab60 Fixes: #U4-2403 2013-06-20 10:08:02 +10:00
Stephan 2933c879e1 U4-2327 - fix PublishedContentRequest redirect vs. permanent 2013-06-19 20:30:43 +02:00
Sebastiaan Janssen c8a19dff44 Merge branch '6.0.7' into 6.1.2
Conflicts:
	src/Umbraco.Web/Media/ImageUrl.cs
	src/Umbraco.Web/Media/ImageUrlProviders/ImageUrlProvider.cs
	src/Umbraco.Web/umbraco.presentation/umbraco/uQuery/MediaExtensions.cs
2013-06-19 18:26:45 +02:00
WadeKallhoff a6768263d3 image thumb extension fix 2013-06-19 18:11:28 +02:00
kensykora e66306978a macro rendering fix 2013-06-19 17:59:30 +02:00
Phil Dye 7f22809ebf U4-1478 Create button still visible when not active 2013-06-19 17:55:00 +02:00
Edwin de Koning 302ebde422 Translating the word "or" 2013-06-19 16:28:58 +02:00
Murray@tbpc10.terabyte.co.nz cf5624f377 #U4-2326 Added Try Catch for PlatformNotSupportedException
Signed-off-by: Sebastiaan Janssen <sebastiaan@umbraco.com>
2013-06-19 16:24:09 +02:00
Morten Bock f386c9d024 U4-1226 Umbraco:image control 2013-06-19 16:18:15 +02:00
Edwin de Koning 530fcf0ea3 Fixes U4-2261 2013-06-19 16:04:56 +02:00
Sebastiaan Janssen 26e4091f28 Due to previous fix we don't need to sort individually any more
(see changeset 32f86f750e)
2013-06-19 16:01:50 +02:00
Dennis Ravn Pedersen 32f86f750e Query would reverse logic sorting of children. Would make move operations ignore sorting.
Signed-off-by: Sebastiaan Janssen <sebastiaan@umbraco.com>
2013-06-19 15:36:08 +02:00
Sebastiaan Janssen ebad631140 Merge branch '6.0.7' into 6.1.2 2013-06-19 15:16:32 +02:00
Sebastiaan Janssen b8304c03ee Merge branch '6.0.7' of https://github.com/bokmadsen/Umbraco-CMS into bokmadsen-6.0.7 2013-06-19 14:50:41 +02:00
Sebastiaan Janssen 556c2d625f Merge branch '6.0.7' into 6.1.2
Conflicts:
	src/umbraco.cms/businesslogic/member/Member.cs
2013-06-19 14:42:14 +02:00
Sebastiaan Janssen 6f85eefd85 updated ignore file with correct case sensitivity
Conflicts:
	.gitignore
2013-06-19 14:39:21 +02:00
Sebastiaan Janssen aaa4469def Merge branch '6.0.7' of github.com:umbraco/Umbraco-CMS into 6.0.7 2013-06-19 14:36:17 +02:00
Sebastiaan Janssen baa0069262 Merge branch 'master' into 6.0.7
Conflicts:
	README.md
2013-06-19 14:22:57 +02:00
Sebastiaan Janssen 9ac4c7aef5 Merge branch 'master' of https://github.com/umbraco/Umbraco-CMS 2013-06-19 14:14:51 +02:00
Sebastiaan Janssen cb2a35594f Merge branch '6.0.6'
Conflicts:
	src/Umbraco.Core/TypeFinder.cs
2013-06-19 14:13:09 +02:00
Sebastiaan Janssen dd501d0198 Merge pull request #16 from darrenferguson/master
Remove obsoletion of Member methods
2013-06-19 05:07:35 -07:00
Sebastiaan Janssen b724d8fb32 Merge pull request #15 from pynej/master
Fix for U4-2384. Author not changed to current user when a node is copied.
2013-06-19 05:06:23 -07:00
Darren Ferguson 7c6aee17e9 Remove obsolete messages from member class
I've removed the obsolete methods from the member class because many of
the suggested alternatives don't work. and some require a lot of
configuration to get working.

Also, the member methods return Members - so they are not obsolete if
you want a reference to a member, you can choose to use System
membership if you want, but for custom properties and groups you need to
fallback to the Umbraco API, so these shouldn't be obsolete! :)
2013-06-19 13:02:58 +01:00
Jeremy Pyne 5e2c3a0a8b Fixed a type on content copy. 2013-06-18 10:38:08 -04:00
Jeremy Pyne f5121bd183 Fix for U4-2384. Author not changed to current user when a node is copied. 2013-06-18 09:35:33 -04:00
Bo Kingo Damgaard 51b5334126 Duplicate e-mail addresses: U4-315, U4-2147, U4-304
- Allows for duplicate e-mail addresses in member section by opt-in
(requiresUniqueEmail="false" in
web.config/membership/providers/"UmbracoMembershipProvider").
- Fixes issues with backoffice not checking for duplicate emails when
changing member after creation.
- Lower cases email addresses upon creating member and when searching to
prevent duplicates.
- Added Member.GetMembersByEmail to get alle members with specific email
2013-06-18 14:23:05 +02:00
Shannon 273c1956ab Fixes: #U4-2343 for api controllers, already fixed for surface controllers 2013-06-18 15:46:36 +10:00
Shannon f7c474ac2c fixed merge issue and ensures UseNamespaceFallback are set for plugin controllers. 2013-06-18 15:24:44 +10:00
Shannon 4143dbd02d Fixed some merge issues 2013-06-18 15:20:18 +10:00
Shannon 768eb3d1ed Merge branch '6.0.7' into 6.1.2
Conflicts:
	src/Umbraco.Web/Mvc/AreaRegistrationExtensions.cs
	src/Umbraco.Web/Mvc/PluginControllerArea.cs
	src/Umbraco.Web/Umbraco.Web.csproj
	src/Umbraco.Web/WebBootManager.cs
2013-06-18 15:13:43 +10:00
Shannon 120bdca9eb removed constraint names on SurfaceControllers, they don't need to be suffixed with SurfaceController, only Controller. 2013-06-18 15:05:13 +10:00
Shannon a5041aa34e Backported changes to use a real Area to do Umbraco area routes and updates our extension methods with the UseNamespaceFallback data token to only check in one namespace. 2013-06-18 14:59:00 +10:00
Shandem 59811c2841 Merge pull request #11 from florisrobbemont/6.1.2
Fix U4-2286 - IFilteredControllerFactory classes are not resolved by Umb...
2013-06-17 21:27:19 -07:00
Shannon 38eee6135e Merge branch '6.0.7' into 6.1.2 2013-06-18 14:21:11 +10:00
Shannon d3780848dc updated ignore file with correct case sensitivity 2013-06-18 14:20:50 +10:00
Shannon 5719820fad Merge branch '6.0.7' into 6.1.2
Conflicts:
	.gitignore
	src/Umbraco.Web/umbraco.presentation/umbraco/Trees/loadPackages.cs
2013-06-18 14:18:17 +10:00
Shannon 9d15228c68 manually applies patch for drag/drop fix in media for vdir 2013-06-17 03:06:24 +02:00
Shannon c9c3623457 updated ignore
Signed-off-by: Shannon <sdeminick@gmail.com>
2013-06-17 02:59:00 +02:00
Floris Robbemont aecc3d28bf Fix U4-2286 - IFilteredControllerFactory classes are not resolved by Umbraco
Simple fix, just made the FilteredCOntrollerFactoriesResolver public. This way developers can add their own on application start
2013-06-15 22:46:01 +02:00
Sebastiaan Janssen b51022575f Merge pull request #8 from mattbrailsford/6.1.2
Updated RenderMvcController to have the view engines test for file existance
2013-06-13 03:42:34 -07:00
Sebastiaan Janssen 6600e9c899 Merge pull request #6 from dpen2000/UserPermisionsFixIn6.1.2
Fix U4-2320 - Error on saving User Permissions (for 6.1.2 release)
2013-06-13 03:18:37 -07:00
Sebastiaan Janssen 68aa2abbc0 Merge pull request #7 from pynej/6.1.2
Fixed Ctl+S on stylesheets editor.
2013-06-13 03:11:57 -07:00
Sebastiaan Janssen e0a483ca48 Merge pull request #5 from tcmorris/patch-1
Update README.md
2013-06-13 02:05:43 -07:00
mattbrailsford 9b78cb3f7c Updated RenderMvcController to have the view engines test for file existance, rather than assuming views will always be razor. This allows alternative MVC view engines to be used. 2013-06-13 09:26:45 +01:00
Jeremy Pyne c6c90fde44 Fixed Ctl+S on stylesheets editor. 2013-06-12 23:41:49 -03:00
david.pendray 773500332b Fix U4-2320 - Error on saving User Permissions
Nodes can be null but NodeIds property always returns a collection and this will return Ids from Nodes if _nodeIds are null and Nodes is not.
2013-06-13 02:50:25 +01:00
Thomas Morris 95eb00a81c Update README.md
Updating link and formatting
2013-06-12 18:24:54 +02:00
Sebastiaan Janssen 3921b0974e Merge pull request #3 from Jayshoe/patch-1
Sitemap provider be gone! Issue #U4-1950
2013-06-12 07:19:56 -07:00
Jayshoe 2cd07c841f Sitemap provider be gone! Issue #U4-1950 2013-06-12 16:19:14 +02:00
Sebastiaan Janssen 8f80f0e95c Merge pull request #2 from Jeavon/patch-1
Update README.md
2013-06-12 06:38:32 -07:00
Jeavon 73ac2c0309 Update README.md
Readme.md corrections and updates
2013-06-12 15:34:26 +02:00
Sebastiaan Janssen a5ddb6c818 Merge pull request #1 from dpen2000/patch-1
Update README.md
2013-06-12 06:10:28 -07:00
dpen2000 458e61e049 Update README.md
Fix link to Umbraco releases page
2013-06-12 14:45:41 +02:00
Sebastiaan Janssen 0815842640 Update README.md 2013-06-12 11:10:18 +03:00
Sebastiaan Janssen 53b31a5c1b Update README.md 2013-06-12 10:04:31 +02:00
Sebastiaan Janssen 292dd9115b Update README.md 2013-06-11 00:57:36 +02:00
Sebastiaan Janssen c6d0a9be00 Update README.md 2013-06-11 00:57:34 +02:00
Sebastiaan Janssen 14c3acc4b7 Create README.md 2013-06-11 00:57:31 +02:00
Sebastiaan Janssen a4098b5d25 Update README.md 2013-06-11 00:57:03 +02:00
Sebastiaan Janssen acdcca0b91 Add missing files 2013-06-11 00:48:29 +02:00
Sebastiaan Janssen 33ff82e766 Add missing files 2013-06-11 00:47:44 +02:00
Sebastiaan Janssen 5fd90e1c13 Update README.md 2013-06-10 19:17:37 +03:00
Sebastiaan Janssen a6eaec9ecb Update README.md 2013-06-10 19:09:03 +03:00
Sebastiaan Janssen f5553bcc06 Create README.md 2013-06-10 18:05:07 +02:00
leekelleher e0c68a8e1c Resolves #U4-184 Upgrade package when installing a newer version.
Multiple package versions can be installed, only the latest version is listed under "Installed Packages".
When the installed package is viewed, a list of previously installed versions (of that package) are listed.
2013-06-10 13:55:58 -01:00
Morten Christensen bc1b2dc5f4 Fixes #U4-2333 2013-06-07 05:19:45 -02:00
Morten Christensen 0bb643672f Adding some minor changes/adjustments to the TypeFinder to make a bit more flexible for external usage. 2013-06-07 05:19:25 -02:00
Shannon Deminick 813d60521c Merge with 6.0.7 2013-06-03 16:27:20 -10:00
Shannon Deminick 5212d17f49 Fixes: #U4-2313 - manually adding a reserved route value in BeginUmbracoForm 2013-06-03 14:56:15 -10:00
Shannon Deminick 932115585e Fixes: #U4-2315 - CDF grouping issue, updated to new version 2013-06-03 13:35:41 -10:00
Sebastiaan Janssen 948ffe4796 Merge with 6.0.7 2013-06-03 15:11:44 -02:00
Sebastiaan Janssen 6b1dd07310 Fixes U4-2254 [Object object] error when selecting media link for content. 2013-06-03 15:11:23 -02:00
Sebastiaan Janssen dc2554c6d0 Fixes U4-2254 [Object object] error when selecting media link for content. 2013-06-03 15:08:56 -02:00
Sebastiaan Janssen 5c6514929e Opening branch 6.1.2 2013-06-03 06:16:19 -02:00
Sebastiaan Janssen 9739b3e2ef Closing branch 6.1.1 2013-06-03 06:15:57 -02:00
Sebastiaan Janssen 0b1f72f139 Added tag release-6.1.1 for changeset 7271ae03cb53 2013-06-03 06:15:31 -02:00
Morten Christensen 2a2e867784 Fxies U4-2257 2013-06-02 11:30:27 -02:00
Sebastiaan Janssen 79e0242468 Show containers in folderbrowser again 2013-06-02 05:03:51 -02:00
Morten Christensen 242443d861 Fixes the EntityRepository for Content and Media, so trees load correctly.
Fixes U4-2306
Fixes loading of MNTP.
FolderBrowser is now able to show multiple images on a single media item.
FolderBrowser only shows images and not containers.
2013-06-01 20:40:51 -02:00
Sebastiaan Janssen 7c066b9ded Merge with 6.0.7 2013-05-31 14:01:21 -02:00
Sebastiaan Janssen 159d605434 U4-2262 Release 6.1.0 Build 2 (Beta) has Razor Errors on scripting files 2013-05-31 13:59:35 -02:00
Sebastiaan Janssen 1971006a48 Merge with 6.0.7 2013-05-31 12:16:09 -02:00
Sebastiaan Janssen 5c0c33a46b Fixes U4-2304 Typo bug in umbraco.cms.businesslogic.packager 2013-05-31 12:14:03 -02:00
Sebastiaan Janssen 9bd255d9a5 Include ExamineManagementIco.png in project so it's included in the build 2013-05-31 11:35:21 -02:00
Sebastiaan Janssen cc7f41d9ee U4-2295 Templates tree doesn't refresh and Master template stays at "None" 2013-05-31 09:15:10 -02:00
Sebastiaan Janssen b4b0a37c2c Fixes U4-2302 Breaking change in 6.1? Macro parameter "contentPicker" no longer
passes an id, but a node
2013-05-31 09:13:25 -02:00
Sebastiaan Janssen 8c841f97cc Merge with 6.0.7 2013-05-31 05:57:18 -02:00
Sebastiaan Janssen a1ee352514 Additional fix for U4-335 Image cropper out of memory 2013-05-31 05:46:10 -02:00
Morten Christensen c25b06b15f Fixes #U4-2296 2013-05-30 14:28:34 -02:00
Sebastiaan Janssen 78bfb6a8cc Fix missing Examine dashboard 2013-05-30 10:26:54 -02:00
Sebastiaan Janssen d8a8bf5f74 Bump version number 2013-05-30 10:26:40 -02:00
Sebastiaan Janssen b70c98ea74 Merge with 6.0.7 2013-05-30 10:25:20 -02:00
Sebastiaan Janssen a8ad8c2a43 Bump version number 2013-05-30 10:23:35 -02:00
Sebastiaan Janssen 96f8cd3d60 Opening branch 6.1.1 2013-05-30 10:21:34 -02:00
Sebastiaan Janssen 91436ad247 Closing branch 6.1.0 2013-05-30 10:20:59 -02:00
Sebastiaan Janssen 678f911ff1 Added tag release-6.1.0 for changeset 8309c3bd6db5 2013-05-30 10:20:36 -02:00
Sebastiaan Janssen afbe3ca3b9 Creating branch 6.0.7 2013-05-30 09:57:33 -02:00
Sebastiaan Janssen 32d6f2e50c Closing branch 6.0.6 2013-05-30 09:57:03 -02:00
Sebastiaan Janssen 9909f5b6be Added tag release-6.0.6 for changeset 953c466faf8f 2013-05-30 09:56:32 -02:00
Sebastiaan Janssen ddbe15de08 Config file formatting, remove logger from CD for now as it was throwing errors 2013-05-30 08:47:17 -02:00
Sebastiaan Janssen 5c5d63ce9a web.Template.config formatting 2013-05-30 06:26:55 -02:00
Morten Christensen d3916a1d85 Sorting - now it works 2013-05-29 13:37:41 -02:00
Morten Christensen db7cb2dcb4 Merge with 6.0.6 2013-05-29 13:18:40 -02:00
Morten Christensen 6281268954 Updating sort method in Content- and MediaService 2013-05-29 13:18:03 -02:00
Sebastiaan Janssen cd606a7e9e Merge 2013-05-29 05:41:50 -02:00
Sebastiaan Janssen ae9d77a765 Bump version number 2013-05-29 05:40:55 -02:00
Morten Christensen f6e44b4e7c Merge with 6.0.6 2013-05-29 05:38:35 -02:00
Morten Christensen 8e1c45e981 Updating Sort methods to skip items that hasn't been sorted 2013-05-29 05:37:55 -02:00
Sebastiaan Janssen 955282f260 Merge with 6.0.6 2013-05-29 03:49:44 -02:00
Sebastiaan Janssen 4a7ee52d63 Merge with 4.11.9 2013-05-29 03:47:26 -02:00
Sebastiaan Janssen b4d88b0361 U4-2279 TryGetRouteDefinitionFromAncestorViewContexts has infinite loop when
currentContext doesnt contain umbraco-route-def
2013-05-29 03:44:01 -02:00
Sebastiaan Janssen b41cf37dd5 U4-2290 Notifications do not handle fields that have null values. 2013-05-29 03:42:20 -02:00
Shannon Deminick e6fcdc8dc6 Fixes: #U4-2279 2013-05-28 14:16:39 -10:00
Shannon Deminick 547a137b9a Merge 2013-05-28 13:49:17 -10:00
Shannon Deminick 5041e6fcc4 Updated to latest CDF version that has a few bug fixes and added a CDF logger. 2013-05-28 13:24:48 -10:00
Sebastiaan Janssen db0d139a39 Merge with 6.0.6 2013-05-28 15:48:51 -02:00
Sebastiaan Janssen fc32100142 Merge with 4.11.9 2013-05-28 15:45:59 -02:00
Sebastiaan Janssen 7ecbc3b391 Fixes U4-2248 Spelling error in back office 2013-05-28 15:44:59 -02:00
Sebastiaan Janssen c3c44df52e Merge with 4.11.9 2013-05-28 15:43:40 -02:00
Sebastiaan Janssen 13a86624ff Fixes U4-2248 Spelling error in back office 2013-05-28 15:39:12 -02:00
Sebastiaan Janssen 2f61bc27c8 Bump version number 2013-05-28 15:15:32 -02:00
Sebastiaan Janssen f484dbf0fc Fix merge issue 2013-05-28 12:37:29 -02:00
Sebastiaan Janssen 6d0ededd9f Merge with 6.0.6 2013-05-28 12:21:31 -02:00
Sebastiaan Janssen e7d157a209 Merge with 4.11.9 2013-05-28 12:18:49 -02:00
Sebastiaan Janssen d3ed90c23e Some fixes & refactor 2013-05-28 12:10:29 -02:00
Shannon Deminick f6155d8e49 Fixes: #U4-2243 - reverts code to use the legacy API to create a template until the new template service is updated to work as it did. 2013-05-27 17:13:12 -10:00
Sebastiaan Janssen c1cd609325 Merge with 6.0.6 2013-05-27 10:23:03 -02:00
Sebastiaan Janssen b916360771 Merge with 4.11.9 2013-05-27 10:22:20 -02:00
Sebastiaan Janssen db4b93dbc3 Update test because of new added restextension (EmbedMediaService) 2013-05-27 10:21:14 -02:00
Sebastiaan Janssen fa8934f89a Merge with 6.0.6 2013-05-27 10:09:00 -02:00
Sebastiaan Janssen c6940096d3 Merge 2013-05-27 10:08:36 -02:00
Sebastiaan Janssen 40868ac361 Merge 2013-05-27 10:02:01 -02:00
Sebastiaan Janssen f399a9f52b Merge with 4.11.9 2013-05-27 10:00:28 -02:00
Sebastiaan Janssen 562851b93e Possible fix for U4-2251 TreeDataService throws JSON JavaScriptSerializer. The
length of the string exceeds the value set on the maxJsonLength property
2013-05-27 09:59:02 -02:00
Morten Christensen 634e4a6949 Merge with 6.0.6 2013-05-27 08:47:14 -02:00
Morten Christensen e61b567ee1 Fixes #U4-2270 and #U4-2269 2013-05-27 08:45:07 -02:00
Sebastiaan Janssen 7ccae64dd1 Fix merge issue 2013-05-27 08:19:20 -02:00
Sebastiaan Janssen aef44065c5 Merge with 6.0.6 2013-05-27 08:17:49 -02:00
Sebastiaan Janssen 4ce22b836e Merge with 4.11.9 2013-05-27 08:16:18 -02:00
Sebastiaan Janssen 2b8544b4c7 Merge 2013-05-27 07:40:59 -02:00
Sebastiaan Janssen 6afa6a277f Fixes U4-2263 unable to create or save stylesheet content 2013-05-27 07:40:29 -02:00
Sebastiaan Janssen f5bf05a6f5 Move embed media service from webservices dll into it's own /base class 2013-05-27 07:19:42 -02:00
Morten Christensen 469db82f1d Internal creation of backoffice users and unit test to verify 2013-05-27 06:50:14 -02:00
Sebastiaan Janssen e50569597b Minor update to legacy ajax calls 2013-05-27 06:10:04 -02:00
Sebastiaan Janssen 071f3dcc01 Fix javascript error with the speechbubble 2013-05-27 06:05:13 -02:00
Morten Christensen e0bc99af9c Merge 2013-05-24 08:14:07 -02:00
Morten Christensen 232581664b Moving internal membership provider classes.
Adding missing alias to AllowedContentTypes on ContentType.
Adding Package export test.
2013-05-24 08:13:24 -02:00
Shannon Deminick b15e147d6b Removed internal classes relating to property editors that are not used and were initially ported from v5 but we'll be
creating new/different ones for v7.
2013-05-23 21:32:26 -10:00
Morten Christensen c7a4c782e3 Internal work around the creation of users through the new api. 2013-05-23 13:25:14 -02:00
Morten Christensen 780908e24f Fixing merge issues and updating nodeSorter to use EntityService and new Sort method for improved performance.
Fixes #U4-1750
2013-05-23 11:34:06 -02:00
Morten Christensen 3ac7e237c4 Merge with 6.0.6 2013-05-23 10:38:09 -02:00
Morten Christensen 6943a454f3 Implementing Sort-method for the Content/MediaService 2013-05-23 10:29:44 -02:00
Morten Christensen e870db3c29 Fixing MacroTests that had a dependency on the Profiler, which wasn't setup in the fixture. 2013-05-22 11:24:46 -02:00
Morten Christensen 41b17160f7 Excluding a few new classes, which won't make it into 6.1.0. 2013-05-22 11:08:27 -02:00
Morten Christensen b19621c07b Improving tree performance for Content and Media trees using the new EntityService and the thin IUmbracoEntity object.
Updating a few internal overloads as well as adding new ones to ensure backwards compatibility for events used by the tree.
Fixing issue with the Published/Unpublished/Saved/Pending Changes states shown in the content tree.
2013-05-22 11:06:21 -02:00
Morten Christensen 0ff979e814 Adding missing method for retreiving parent or child relations.
Implements #U4-2237
2013-05-22 07:53:16 -02:00
Morten Christensen f26e39f5ce Adding a new extensibility in relation to #U4-2244 which allows consumers of the CoreBootManager to explicitly set the path to the root of an umbraco site/solution.
A bit of cleanup in the IOHelper class.
2013-05-22 07:48:42 -02:00
Morten Christensen 9a6030a3eb Fixes #U4-2244 2013-05-22 07:12:58 -02:00
Morten Christensen 84ef216d57 Merge 2013-05-17 05:51:49 -02:00
Morten Christensen ecfe51134d Updating the internal standalone context, and adding one that is limited to the core assembly to limit dependencies. 2013-05-17 05:51:22 -02:00
Shannon Deminick c8414116ad Merge with 6.0.6 2013-05-14 14:21:15 -10:00
Shannon Deminick 532f407260 Merge with 4.11.9 2013-05-14 14:20:52 -10:00
Shannon Deminick 834d04f8ed Fixes: #U4-1469, #U4-1156 2013-05-14 14:18:41 -10:00
Shannon Deminick 2aa902beaf Fixed up unit test 2013-05-14 13:50:16 -10:00
Shannon Deminick 2f16e6662d updates disposable timer to ensure it also outputs to HttpTrace if there is one. 2013-05-14 13:39:55 -10:00
Shannon Deminick 0c4897d7c1 Changed the trace logger for PublishedContentRequestEngine to be correct. 2013-05-13 22:32:02 -10:00
Shannon Deminick 43dc14fa93 Changed over all direct calls to the profiler to use DisposableTimer.DebugDuration 2013-05-13 22:17:55 -10:00
Shannon Deminick e209aa3c2a Streamlined the profiling in the macro class. 2013-05-13 22:13:52 -10:00
Shannon Deminick 5890fe1849 Upgraded DisposableTimer to wrap the profiler... now we should really just use DisposableTimer for all profiling. 2013-05-13 21:11:03 -10:00
Shannon Deminick b6f52bf782 Changed the profiler over to use resolvers again. We no longer will call MiniProfiler directly.
Added an HtmlHelper extension which is used to render the profiler html output.
Added an HtmlHelper property to the new base page too.
2013-05-13 20:10:28 -10:00
Shannon Deminick 922ebe5411 Started implementing static cache provider for the application cache... centralizing static cache. 2013-05-13 19:31:27 -10:00
dmilic f36ab37f6a Fix for the U4-2229 issue - broken PublishWithSubs method 2013-05-13 15:49:59 -12:00
Sebastiaan Janssen aeff33d0a6 Bump version number 2013-05-28 15:17:55 -02:00
Sebastiaan Janssen 645637d550 Merge with 6.0.6 2013-05-13 13:48:34 -02:00
Sebastiaan Janssen 5cfe9e57ce Merge with 4.11.9 2013-05-13 13:47:01 -02:00
Sebastiaan Janssen 4863e657df Fixes U4-2226 Javascript error "tinyMCE is undefined" in IE - THANKS Adriano Buscema! 2013-05-13 13:42:57 -02:00
Shannon Deminick 2486e75210 Merge with 6.0.6 2013-05-12 23:57:09 -10:00
Shannon Deminick c0e1be4df9 Merge 2013-05-12 23:56:47 -10:00
Sebastiaan Janssen a93e562f14 Fixes U4-2209 6.0.5 - Bug - Empty recycle bin DELETES all content 2013-05-13 07:48:35 -02:00
Shannon Deminick 2201c644f7 Merge with 6.0.6 2013-05-12 21:49:38 -10:00
Shannon Deminick 822cac5d87 Adds test for #U4-2207 which will now pass but it will still fail on the website because of the case
sensitive checking for the default proeprty editor lookup. Need feedback from sebastian before continuing
2013-05-12 21:44:02 -10:00
Shannon Deminick d58487fafc Merge 2013-05-12 21:13:50 -10:00
Shannon Deminick ea9653fa83 patches fix for #U4-2214 2013-05-12 21:12:55 -10:00
Shannon Deminick b38397868e Fixes: #U4-2214 - encrypted cookie value issue when it is invalid 2013-05-12 21:07:16 -10:00
Shannon Deminick 7d1a18638b missing proj checking 2013-05-12 21:06:53 -10:00
Shannon Deminick 748e88c3e8 added web.config files to the root of xslt folders which will disable the ability for people
to publicly download other's xslt files .
2013-05-12 19:29:05 -10:00
Shannon Deminick cb8d080f1d Removes the abstraction on the profiler, no need for a resolver, it will work in unit tests and we can override the provider if needed.
Added better support for MVC profiling by using the built in ProfilingViewEngine and ProfilingActionFilter.
2013-05-12 19:05:49 -10:00
Shannon Deminick 3fd3bf0fda updated extensino method to prefix the type name better. 2013-05-12 18:17:53 -10:00
Shannon Deminick 09a6cdc8b6 Removed all MiniProfile calls that were trying to be simple trace messages (not actually profiling). This doesn't actually
work since MiniProfiler was not meant for that and won't actually output them unless you add Thread.Sleep statements into the using
clauses simply to slow down the application, not ideal. Updated the WebProfiler to log a statement when in medium trust.
2013-05-12 18:06:26 -10:00
Shannon Deminick b2fe35695f Fixes MiniProfile implementation for macros. 2013-05-12 17:38:54 -10:00
Shannon Deminick 67b57dea50 Changes profiler over to use a resolver and uses an interface for it. Changes core over to use a
LogProfiler and the web project to use a web profiler (MiniProfiler). Fixes medium trust implementation,
adds performance check for binding to begin request, changes Web profiler over to be decoupled from the
umbraco application objects (binds to events by itself)
2013-05-12 15:25:46 -10:00
Sebastiaan Janssen 3d6172738f Added tag release-6.1.0-beta2 for changeset 7670bb47a671 2013-05-10 11:00:57 -02:00
Sebastiaan Janssen a43e0eb5b8 Display version comment in installer steps ("beta 2" in this case) 2013-05-10 10:55:55 -02:00
Sebastiaan Janssen 3b05663597 Add MiniProfiler as a requirement for the NuGet package 2013-05-10 10:55:28 -02:00
NielsHartvig@UMBRACORATI.localdomain 191d744ec6 Adds profiling support to MVC views 2013-05-10 10:38:59 -02:00
NielsHartvig@UMBRACORATI.localdomain 980cd20e4c Adjustments to profiling 2013-05-10 10:24:25 -02:00
NielsHartvig@UMBRACORATI.localdomain f04916c9a9 Adds MiniProfiler support 2013-05-10 10:15:30 -02:00
Sebastiaan Janssen 8fde65d417 Merge with 6.0.6 2013-05-10 08:50:28 -02:00
Sebastiaan Janssen 8cca1b77b3 Merge with 4.11.9 2013-05-10 08:47:24 -02:00
Sebastiaan Janssen 53e4308c29 Fixes U4-2205 Log.GetLogItems(LogTypes, DateTime) fails with 'Conversion failed
when converting the nvarchar value 'Custom' to data type int'
2013-05-10 08:44:47 -02:00
Sebastiaan Janssen d10eff04a7 Update version 2013-05-10 07:09:43 -02:00
Sebastiaan Janssen 59c36ad70e Fixed U4-2090 Content not published after installing starterkit on fresh site
(Umbraco 6.1 beta)
Reverts previous "fix" as the actual cause was in Document.cs
2013-05-10 06:59:51 -02:00
Shannon Deminick 7b8d526a8a Fixed up some merge issues. 2013-05-08 18:16:58 -10:00
Shannon Deminick f69a017078 Merge with 6.0.6 2013-05-08 18:11:52 -10:00
Shannon Deminick 6f26f7b57c Patching from 6.1 2013-05-08 18:08:55 -10:00
Shannon Deminick bda2614290 Patching from 6.1 2013-05-08 17:49:48 -10:00
Shannon Deminick efc482511e Patching from 6.1 2013-05-08 17:48:17 -10:00
Shannon Deminick 40b90b8a58 Patching from 6.1 2013-05-08 17:45:53 -10:00
Shannon Deminick a009dfe2a1 Patching from 6.1 2013-05-08 17:39:03 -10:00
Shannon Deminick bc0b419288 Merge 2013-05-08 17:12:09 -10:00
Shannon Deminick 806715594e Fixes up created package tree sync. 2013-05-08 17:11:50 -10:00
Shannon Deminick 41e87fca98 Fixes macro tree syncing 2013-05-08 17:04:51 -10:00
Shannon Deminick f23c6c53cc Fixes up created package tree sync. 2013-05-08 17:11:50 -10:00
Shannon Deminick f2a97326fa Fixes macro tree syncing 2013-05-08 17:04:51 -10:00
Shannon Deminick dd1983dc55 Fixes macro script editor and syncing, changes over editPython to use correct webforms file format. 2013-05-08 17:01:48 -10:00
Shannon Deminick 78cd51d333 Fixed xslt editing and syncing. 2013-05-08 16:33:09 -10:00
Shannon Deminick 28b6c5897f Fixes up script editor and tree syncing. 2013-05-08 16:13:18 -10:00
Shannon Deminick baed852767 Re-fixed up stylesheet editing and syncing, starting fixup for script editor/syncing 2013-05-08 15:15:56 -10:00
Shannon Deminick 0762decd92 Fixes up tree syncing for views, stylesheets and partial views. Now ensures we can actually
sync a tree for a file based node that doesn't have a static id. Also ensures that when we change a
Partial view name that we don't end up duplicating some files when we change it twice in the
same session.
2013-05-08 14:18:18 -10:00
Shannon Deminick 0b58c1c03c Patching from 6.1 2013-05-08 17:34:40 -10:00
Shannon Deminick 38c6a21896 Patching from 6.1 2013-05-08 17:33:48 -10:00
Shannon Deminick 15bff44ec1 Patching from 6.1 2013-05-08 17:24:00 -10:00
Shannon Deminick a626efa9b6 Merge with 4.11.9 2013-05-08 17:15:09 -10:00
Shannon Deminick 1f87470f89 Fixes up tree syncing for views, stylesheets and partial views. Now ensures we can actually
sync a tree for a file based node that doesn't have a static id. Also ensures that when we change a
Partial view name that we don't end up duplicating some files when we change it twice in the
same session.
2013-05-08 14:18:18 -10:00
Hendy 54d2258634 added null checks into the uQuery .ToNameIds() methods 2013-05-08 16:29:29 -01:00
Sebastiaan Janssen 25be0621b2 Whoops, connection string doesn't contain the datalayer here 2013-05-08 13:14:02 -02:00
Sebastiaan Janssen 6fe3507099 Merge with 6.0.6 2013-05-08 08:13:57 -02:00
Sebastiaan Janssen cba09ed817 Merge with 4.11.9 2013-05-08 08:10:48 -02:00
Sebastiaan Janssen d5d00553b4 Fixed U4-2176 MySql Dashboard error for 4.11 as well 2013-05-08 08:09:13 -02:00
Morten Christensen d94772892d Merge 2013-05-08 06:28:13 -02:00
Shannon Deminick 55750b534b Fixed the template editor to ensure that the tree syncs and updated much of it to use correct JavaScript, however
id didn't have time to update the whole thing.
2013-05-07 22:19:42 -10:00
Shannon Deminick a31cb3b1df Fixed stylesheet property tree syncing, updated the stylesheet property page to use
correct web forms structure.
2013-05-07 21:13:30 -10:00
Shannon Deminick fc44138d9e Fixes Stylesheet tree-syncing. Converts editStylesheets over to correct web forms structure and
implements the correct Javascript.
2013-05-07 20:49:58 -10:00
Shannon Deminick 0cda994538 Fixes DataTypeCacheRefresher to be a Json cache refresher since it needs to refresh both by GUID and by Int Ids 2013-05-07 19:37:57 -10:00
Shannon Deminick 4b199a9166 Manually applies fix for #U4-2094 since the class structure has changed in 6.1 2013-05-07 19:02:36 -10:00
Shannon Deminick cfe6ac0486 Merge with 6.0.6 2013-05-07 18:57:39 -10:00
Shannon Deminick c52669fb05 Fixes: #U4-2094 - issue with duplicates in getting Descendants for media in mvc. 2013-05-07 18:56:24 -10:00
Sebastiaan Janssen 753fe411c5 Fixes U4-2090 Content not published after installing starterkit on fresh site
(Umbraco 6.1 beta)
2013-05-07 13:01:18 -02:00
Morten Christensen 50c12a5c35 Merge 2013-05-07 12:35:28 -02:00
Morten Christensen b42fb1c5c1 WIP Related to PackagingService 2013-05-07 12:35:13 -02:00
Shannon Deminick f05c77dc78 Fixed med trust issue with SecuritySafeCritical attributes 2013-05-06 17:23:53 -10:00
Shannon Deminick d1677d9d59 Updates: #U4-2192 - moves method call to be inside of the lock. 2013-05-06 15:54:55 -10:00
Shannon Deminick 137685d883 Updates: #U4-2192 - moves method call to be inside of the lock. 2013-05-06 15:49:51 -10:00
Shannon Deminick 266d8ba69a Merge with 6.0.6 2013-05-06 15:20:26 -10:00
Shannon Deminick c4a071523e Merge with 4.11.9 2013-05-06 15:12:10 -10:00
Shannon Deminick ca99319ead Fixes: #U4-644 - DynamicNode and MVC don't output RTE values for media 2013-05-06 15:09:24 -10:00
Shannon Deminick f808aac4cd Fixes: #U4-644 - DynamicNode and MVC don't output RTE values for media 2013-05-06 14:36:47 -10:00
Shannon Deminick 0553bd1f9f Merge with 6.0.6 2013-05-06 12:54:43 -10:00
Shannon Deminick 81360f629e Merge with 4.11.9 2013-05-06 12:54:28 -10:00
Sebastiaan Janssen 1b3669787b Merge with 6.0.6 2013-05-06 12:27:56 -02:00
Sebastiaan Janssen aa36c66f39 Fixes U4-2176 6.0.5 Dashboard error 2013-05-06 12:27:15 -02:00
Sebastiaan Janssen 950cb1436a Merge with 6.0.6 2013-05-06 12:07:22 -02:00
Sebastiaan Janssen 09e31d6595 Fixes U4-2179 Error with GetChildNodes after upgrade to Umbraco 6.0.5 from
Umbraco 6.0.0
2013-05-06 12:06:45 -02:00
Sebastiaan Janssen f9fc2619fa Fixes U4-2179 Error with GetChildNodes after upgrade to Umbraco 6.0.5 from
Umbraco 6.0.0
2013-05-06 12:06:45 -02:00
Sebastiaan Janssen 004d9ab3e6 Merge with 6.0.6 2013-05-06 11:12:31 -02:00
Sebastiaan Janssen 5d8cfa5efb Merge 2013-05-06 11:06:54 -02:00
Sebastiaan Janssen 297f8e2a0b Remove reference to v4 in text. 2013-05-06 11:06:28 -02:00
Shannon Deminick 83584375c1 Merge with 6.0.6 2013-05-06 02:10:26 -10:00
Shannon Deminick 8ddfb5f6ad Merge 2013-05-06 02:09:44 -10:00
Shannon Deminick 9387544865 Fixes test outcome 2013-05-06 02:08:38 -10:00
Shannon Deminick 66ddb21ef8 Fixes null check 2013-05-06 02:03:24 -10:00
Sebastiaan Janssen d746ec6409 Merge with 6.0.6 2013-05-06 09:34:11 -02:00
Shannon Deminick e08322f6fe Fixes merge issues 2013-05-05 23:45:47 -10:00
Shannon Deminick de52f3ee93 Merge with 6.0.6 2013-05-05 23:39:52 -10:00
Shannon Deminick 9d19ed9463 Fix merge issues 2013-05-05 23:35:51 -10:00
Shannon Deminick df62697477 Merge with 4.11.9 2013-05-05 23:23:24 -10:00
Shannon Deminick f0cacf0d52 Fixed app_code assembly check. 2013-05-05 23:03:31 -10:00
Shannon Deminick d501fcb679 Fixes TypeFinder issue but retains the improved performance. Adds TypeHelper tests. 2013-05-05 22:57:41 -10:00
Stephan 3c15f9b57c Web.Standalone - refactor 2013-05-05 09:07:51 -02:00
Shannon Deminick f5994d8442 Fixes up async methods in ContentTypeControlNew to ensure that the UmbracoContext is current since
the actions might run on different threads and therefore some event handlers might need access to the context.
2013-05-04 19:33:49 -10:00
Shannon Deminick bfe5250138 Fixes issue with async delete webforms method not re-setting the umbraco context. 2013-05-04 18:29:24 -10:00
Shannon Deminick 3fa9219c27 Merge 2013-05-04 18:13:03 -10:00
Shannon Deminick 4295cba915 Updated unit tests for TypeFinder - this shows the issue with the new refactored performance changes. 2013-05-04 18:12:02 -10:00
Robert Stocks 6d66fc6cb8 Remove extra space in name of http module in web.config 2013-05-03 07:24:28 -01:00
Robert Stocks 4484f83caa Remove extra space in name of http module in web.config 2013-05-03 07:24:28 -01:00
Sebastiaan Janssen 3ada1770eb Merge with 4.11.9 2013-05-06 09:32:23 -02:00
Shannon Deminick cbf84566e2 updated casing in proj file to be correct for a couple elements. 2013-05-02 15:57:02 -10:00
Shannon Deminick 294c2f4fba Fixes: #U4-2183 - null check on UmbracoContext and fixes bad merge issue, the UserTypeCacheRefresher got removed from the proj file. 2013-05-02 14:24:27 -10:00
Shannon Deminick 0b6f05e630 Fixes: #U4-2172 - better single threaded supported for the database instance outside http context 2013-05-02 03:48:14 -10:00
Sebastiaan Janssen 2170380f7b Opening new branch 2013-05-01 13:07:53 -02:00
Sebastiaan Janssen a8ab7e4c35 Open new branch 2013-05-01 13:05:12 -02:00
Sebastiaan Janssen c20c9c638f Merge with 4.11.8 2013-05-01 13:04:06 -02:00
Sebastiaan Janssen 43b2a2185e Fix unit test 2013-05-01 13:02:09 -02:00
Sebastiaan Janssen 2423bdd623 Merge with 4.11.8 2013-05-01 05:33:19 -02:00
Sebastiaan Janssen bcb90d64a5 Fixes U4-1136 Class in MediaPickerDataType.cs wrongly named MemberPickerDataType
+ a bit of code cleanup
2013-05-01 05:32:29 -02:00
Shannon Deminick eca01b845c publicized some ObjectExtensions, added Umbraco.Belle to internals, updated the names in which plugin routes are created,
added HttpUrlHelper extensions for web api
2013-04-30 16:43:59 -10:00
Morten Christensen dc5cf5ef6e Adding strongly typed query POC to test project 2013-04-30 17:41:59 -02:00
Sebastiaan Janssen 7d448d0959 Merge 2013-04-30 05:22:43 -02:00
Sebastiaan Janssen 53fe02db7e And another update for WebPI... 2013-04-30 05:22:21 -02:00
Shannon Deminick af51465a6a Merge 2013-04-29 19:57:44 -10:00
Shannon Deminick b2929ea50a Merge with 6.0.5 2013-04-29 19:56:41 -10:00
Shannon Deminick a03dd7b11e Merge with 4.11.8 2013-04-29 19:56:18 -10:00
Shannon Deminick 6d994f48ac merged in patch for TypeFinder changes 2013-04-29 19:55:44 -10:00
Shannon Deminick 8e1f7170c7 Merged in TypeFinder changes from U4-1187 and wrote benchmark unit tests and other general
tests to confirm it is still finding types.
2013-04-29 19:48:11 -10:00
Shannon Deminick 3fd1c49da7 Merge with 6.0.5 2013-04-29 12:09:36 -10:00
Shannon Deminick f0e8252e38 Merge with 4.11.8 2013-04-29 12:09:12 -10:00
Shannon Deminick ad06aded1b Removed strange old legacy config section that never did anything 2013-04-29 12:08:36 -10:00
Sebastiaan Janssen be049f9093 Fix merge issue 2013-04-29 12:36:03 -02:00
Sebastiaan Janssen 64bbfb8cbc Merge with 6.0.5 2013-04-29 12:31:13 -02:00
Sebastiaan Janssen 0ca52fcc60 Fix merge issues, update version number 2013-04-29 12:29:15 -02:00
Sebastiaan Janssen c53342ba4c Merge with 4.11.8 2013-04-29 12:13:00 -02:00
Sebastiaan Janssen 25eea8d599 Re-add internals visible to umbraco.webservices in case people install the
seperate project.
2013-04-29 11:17:32 -02:00
Sebastiaan Janssen 22498649b1 Merge 2013-04-29 10:36:30 -02:00
Sebastiaan Janssen 25ce7baa7d Removing the umbraco.webservices project 2013-04-29 10:36:11 -02:00
Morten Christensen b4fd2f6d46 Fixing oversight in SaveAndPublish method - content might not have an Id yet, so take that into account. 2013-04-29 07:09:23 -02:00
Shannon Deminick aba4a9b07c oops, removed test code 2013-04-28 16:15:19 -10:00
Shannon Deminick 577d77cfab Fixes: #U4-1760 - allows a developer to set the default RenderMvcController on startup. 2013-04-28 16:09:24 -10:00
Shannon Deminick 7ff50e2652 Merge with 6.0.5 2013-04-28 13:43:38 -10:00
Shannon Deminick e885384678 Merge with 4.11.8 2013-04-28 13:40:06 -10:00
Shannon Deminick 528209f8da instantly improve performance by 45% for regenerating xml structures for documents when a doc type alias changes
or when a doc type property alias is changed or a doc type property is removed.
2013-04-28 13:37:36 -10:00
Shannon Deminick 056696d36f Fixes up more issues with cmsContentXml - got media updating properly now, nearly the same as content and all done with
the new API.
2013-04-25 22:13:05 -10:00
Shannon Deminick 6cffa67518 Fixes merge issues and WebSecurity with the correct encryption (from failed merge along time ago).
Fixes ContentType to ensure that ALL property type values get reset, not just ones assigned to a group.
Fixes logic in ContentTypeService to ensure that xml is re-generated when a property type alias is changed too.
2013-04-25 21:09:07 -10:00
Shannon Deminick d2a285c120 Merge with 6.0.5 2013-04-25 19:43:03 -10:00
Shannon Deminick 153fe248a7 Fixes ContentService fix for issue U4-1772, we don't want to truncate! Plus the truncate term doesn't work in SQLCE anyways. 2013-04-25 19:33:53 -10:00
Shannon Deminick 7fc4822bbe Fixes merge issues. Fixes Fixes for cmsContentXml table since the Content type heirarchy tables are different in v6. 2013-04-25 19:26:06 -10:00
Shannon Deminick d65bee76b2 Merge with 4.11.8 2013-04-25 14:15:09 -10:00
Shannon Deminick 385d6396b0 disables auto-complete on the login page. 2013-04-25 13:28:47 -10:00
Shannon Deminick 46858af1ed Ensures user cookie is encrypted, removes ASP.Net headers from being returned in our response. Ensures
that our auth cookie is httponly.
2013-04-25 13:25:25 -10:00
Shannon Deminick 34163625fe Merge with 4.11.7 - cmsContentXml fixes 2013-04-25 12:20:06 -10:00
Sebastiaan Janssen c2057656bc Merge with 6.0.4 2013-04-25 11:23:31 -02:00
Sebastiaan Janssen 09a4e33f3f Closing again.. 2013-04-25 11:20:21 -02:00
Sebastiaan Janssen e53b388a5e Opening new branch 2013-04-25 11:19:06 -02:00
Sebastiaan Janssen 4fb4af0b4f Added tag release-6.0.4 for changeset 0dee9964687e 2013-04-25 11:18:36 -02:00
Sebastiaan Janssen 461f032777 Added tag release-4.11.7 for changeset ce47176bc6b9 2013-04-25 11:17:07 -02:00
Sebastiaan Janssen ab37f9ae35 Closing 6.0.4 2013-04-25 11:16:29 -02:00
Sebastiaan Janssen a3347c0037 Opening new branch 2013-04-25 11:14:46 -02:00
Sebastiaan Janssen f3835d1ca3 Closing branch 4.11.7 2013-04-25 11:14:09 -02:00
Shannon Deminick d30c4791fe fixed a documentation error 2013-04-24 15:46:38 -10:00
Shannon Deminick 7ee9b9ebcc Fixes: #U4-2144 - ensures that the xml is re-gen'd when a content type alias is changed or a content type property is removed.
Also had to change the property type deletion to be async as well since it might be long running to re-gen the xml.
2013-04-24 15:31:36 -10:00
Shannon Deminick b4caf109f7 Working on #U4-2144 - ensures that xml is re-gen'd when a property alias is changed. 2013-04-24 15:17:20 -10:00
Shannon Deminick 0e8ffe528a Fixes: #U4-2149 - updates the logic for changing aliases for any content type. Now if an alias changes for any content type, the
xml is regenerated for any entity that is of that content type. For DocumentType's this is slightly different because we regenerate
the xml for the doc type and any document of the doc type's descendant types.
2013-04-24 14:57:20 -10:00
Shannon Deminick a8029d1dc5 Fixes: #U4-1772 - ensures that when changing a doc type alias that we only rebuild the data in the cmsContentXml table for Document types, not media types or member types, now we need
to fix all of the other bugs assocated with cmsContentXml table and alias changes.
2013-04-24 13:19:30 -10:00
Stephan a1d5b61ae5 PublishedContent - create tests to illustrate issues 2013-04-24 11:56:32 -02:00
Shannon Deminick 6818ac4e50 Fixes merge issues, ensures that the UmbracoContext is set for the async operation since
it is required, previous versions didn't require it to be set. Added the WebSecurity property
to UmbracoUserControl, made ContentTypeControlNew inherit from UmbracoUserControl
2013-04-23 22:39:35 -10:00
Shannon Deminick 710c8aa6ea Merge with 6.0.4 2013-04-23 21:52:07 -10:00
Shannon Deminick f8652d98fe Merge with 6.0.4 2013-04-20 04:01:22 +06:00
Shannon Deminick 174ff44e3b proj file update 2013-04-20 00:50:02 +06:00
Shannon Deminick b3c3e114ad missing images 2013-04-20 00:49:39 +06:00
Shannon Deminick 60481e7e02 Fixes: #U4-2093 stylehsheet property cache refresher had wrong id assigned. 2013-04-20 00:18:45 +06:00
Shannon Deminick 12de5d6ed3 Merge with 6.0.4 2013-04-20 00:12:52 +06:00
Shannon Deminick 7f5457316a Fixed: #U4-2129 - using new api didn't use the CompositionPropertyTypes instead of just PropertyTypes and fixed up cache invalidation for PublishedContentHelper 2013-04-19 23:47:51 +06:00
Sebastiaan Janssen 671c8715b0 Fix merge issue 2013-04-19 10:18:46 -02:00
Shannon Deminick d6d630cb2c Merge with 6.0.4 2013-04-19 04:40:49 +06:00
Shannon Deminick 988940095c Merge with 6.0.4 2013-04-18 23:03:52 +06:00
Shannon Deminick 08a049594c Merge 2013-04-18 22:01:53 +06:00
Shannon Deminick a895a2a20a Fixes merge issues, ensures that the tree node is reloaded when publishing. 2013-04-18 22:01:28 +06:00
Shannon Deminick a5e33e1e02 Merge with 6.0.4 2013-04-18 21:45:04 +06:00
Shannon Deminick a721f06ac8 Merge with 6.0.4 2013-04-18 21:22:32 +06:00
Morten Christensen 39095b524c Updating test - Inheritance between parent/child ContentType has been updated so the parent doesn't have to be added to the composition afterwards. 2013-04-18 10:46:15 -02:00
Shannon Deminick 3b1bfe04f2 updates method name 2013-04-18 01:15:25 +06:00
Shannon Deminick 979fe46e9b Updated CDF to 1.6.0.0 2013-04-18 00:55:40 +06:00
Shannon Deminick 0107a10145 Manually merge in changes for previous commits due to the codebase differences in 6.1 2013-04-18 00:06:42 +06:00
Shannon Deminick a38f0af49b Merge with 6.0.4 2013-04-17 23:47:33 +06:00
Thomas Skyldahl Sørensen c12f9d0272 Optimization for issue: U4-1187
Url: http://issues.umbraco.org/issue/U4-1187

Added assembly filtering, to stop scanning of third party assemblies
that doesn't reference the types we are looking for.
this limits the amount of possible missing references we encounter
when checking against the types
2013-04-17 14:03:54 -02:00
Morten Christensen 83d1e9c76f Merge 2013-04-17 11:25:53 -02:00
Sebastiaan Janssen b40619634d Fix bad merge 2013-04-17 06:36:40 -02:00
Morten Christensen fc84a21f06 Adding a few methods to relate two entities both based on the IUmbracoEntity. 2013-04-17 06:26:59 -02:00
Shannon Deminick 9137ce7cf4 Merge with 6.0.4 2013-04-17 01:57:50 +06:00
Morten Christensen 9621403f79 Fixes U4-2053 2013-04-16 17:19:46 -02:00
Stephan 2245c88396 U4-2117 - fix Ancestor- vs AncestorsOrSelf inconsistencies 2013-04-16 12:29:58 -02:00
Sebastiaan Janssen 2e39c55d56 Merge 2013-04-16 04:27:44 -02:00
Sebastiaan Janssen e4e0bcf642 Correct spelling error 2013-04-16 04:27:03 -02:00
Shannon Deminick 7537e4c6d6 updated DefaultServerMessenger with more ctor options for testing 2013-04-16 04:05:31 +06:00
Shannon Deminick c410b6dc20 Changed UmbracoSettings back to internal, it should not be exposed atm 2013-04-16 02:49:14 +06:00
Shannon Deminick 1e7e670df3 Fixes #U4-2104 - namespace issue with UmbracoApiControllers 2013-04-15 21:44:26 +06:00
Shannon Deminick da53ffe9f2 Merge 2013-04-15 21:36:35 +06:00
Shannon Deminick 47f6401fcd updates unit test to ensure UmbracoContext.Current is nulled, updates dispose on application context to
not dispose the database if it is not configured.
2013-04-15 21:36:24 +06:00
Sebastiaan Janssen 33190ea5e1 Merge 2013-04-15 12:19:11 -02:00
Sebastiaan Janssen a06951afbd Fix MemberAuthorizeAttribute for UmbracoApiControllers 2013-04-15 12:18:40 -02:00
Stephan 43d6c9a46d Core.Strings - bugfix DefaultShortStringHelper 2013-04-12 11:32:37 -02:00
Stephan 0b3eaf9c77 Core.Strings - refactor DefaultShortStringHelper for better backward compat. 2013-04-12 05:33:39 -02:00
Shannon Deminick 0fe8ff57a1 changes a method to be protected instead of private 2013-04-12 05:04:20 +06:00
Shannon Deminick 2642d74450 adds some logging and fixes sequence of events for distributed cache sending 2013-04-12 04:06:24 +06:00
Shannon Deminick 761b749f37 Merge with 6.0.4 2013-04-12 03:08:11 +06:00
Shannon Deminick 4ef9dbb9b4 Merge 2013-04-12 03:07:30 +06:00
Shannon Deminick f716ba380c Merge with 6.0.4 2013-04-12 03:02:40 +06:00
Sebastiaan Janssen 439445aae4 Merge with 6.0.4 2013-04-11 16:39:28 -02:00
Shannon Deminick 0d79eaf3c5 Merge with 6.0.4 2013-04-12 00:32:19 +06:00
Shannon Deminick e747438a4b Merge 2013-04-12 00:31:28 +06:00
Shannon Deminick 14f71c9059 Fixes #U4-2058 2013-04-12 00:30:45 +06:00
Stephan 5154bcd2e9 Web.Routing - template setter on PublishedContentRequest 2013-04-11 11:55:32 -02:00
Stephan e3af8b4e5f Web.Routing - public, though readonly, UmbracoContext.PublishedContentRequest 2013-04-11 11:44:15 -02:00
Morten Christensen 3e8c1a426c Merge 2013-04-12 03:50:36 -02:00
Morten Christensen d7081dbc6b Implementing new RelationService.
Making EntityService public as it will be used within the RelationService.
2013-04-11 17:12:14 -02:00
Sebastiaan Janssen 1d89702c2c Merge with 6.0.4 2013-04-11 10:21:37 -02:00
Sebastiaan Janssen df26090d63 Fix merge issue 2013-04-11 07:23:13 -02:00
Sebastiaan Janssen 3050258fdc Merge with 6.0.4 2013-04-11 07:20:00 -02:00
Stephan 84e990c239 Core.Configuration - fix setting that accidentally became public 2013-04-10 14:19:26 -02:00
Stephan 911a1cf80b merge 6.1.0-public into 6.1.0 2013-04-10 14:03:47 -02:00
Stephan ef493ef9af fix merge + public 2013-04-10 14:02:16 -02:00
Stephan 76a12f3f33 merge with 6.1.0 2013-04-10 13:56:39 -02:00
Stephan 344a4cc485 merge with 6.1.0 2013-04-10 12:51:49 -02:00
Stephan 5e1115218c Web.Standalone - import initial version
* * *
FOLD 003
2013-04-10 12:50:08 -02:00
Stephan 71a28cbeaa Core.Strings - bugfix error in DefaultShortStringHelper 2013-05-04 14:53:33 -02:00
Stephan 4aa750694a Core - add methods to XmlHelper 2013-05-03 13:56:34 -02:00
Stephan 5d89ab1e2a Web.UI - fix nasty preview bug introduced in 9a92dea49ede 2013-05-03 20:09:15 -02:00
Stephan 262aa3b8fe Web.Routing, Web.Mvc - fix issues with content with no template 2013-05-03 20:09:14 -02:00
Stephan 106d733d08 Web.PublishedCache - support XPathExpression 2013-04-10 12:49:45 -02:00
Sebastiaan Janssen a010448ad1 Merge with 6.0.4 2013-04-10 11:55:36 -02:00
Sebastiaan Janssen 111df761aa Merge with 6.0.4 2013-04-10 07:43:10 -02:00
Shannon Deminick 5f9c7bb49c changed DefaultServerMessenger to expose login 2013-04-10 09:41:53 +06:00
Shannon Deminick 0c3b7c27a7 fix merge issues 2013-04-10 04:24:42 +06:00
Shannon Deminick f2293e01fa Merge with 6.0.4 2013-04-10 04:15:26 +06:00
Shannon Deminick 506d32f353 Merge 2013-04-09 22:11:54 +06:00
Shannon Deminick 16746c8548 Updates authorized web services/http handlers to use WebSecurity and implements the new base class
properties available in 6.1. Updates WebSecurity with a few more helpful methods.
2013-04-09 22:11:12 +06:00
Sebastiaan Janssen fb994bdc11 Merge with 6.0.4 2013-04-09 11:45:04 -02:00
Sebastiaan Janssen abee79ca69 Fixes merge issues 2013-04-09 08:08:22 -02:00
Sebastiaan Janssen d8ccf20840 Merge with 6.0.4 2013-04-09 08:04:55 -02:00
Sebastiaan Janssen 9e10694ebb Fixes merge issue, no idea why it's expecting an ApiController.. weird! 2013-04-09 08:03:17 -02:00
Sebastiaan Janssen 1c5cd4e245 Merge with 6.0.4 2013-04-09 07:19:47 -02:00
Shannon Deminick 63cae70ec3 Fixes merge issue 2013-04-09 08:05:31 +06:00
Shannon Deminick dd990b5df4 Merge with 6.0.4 2013-04-09 08:00:10 +06:00
Sebastiaan Janssen d2d1843e03 Fix default branch 2013-04-08 07:03:57 -02:00
Morten Christensen efbc461da9 Code cleanup - removing all internal code related to Macros, which was created for v6 but left out for backwards compatibility. 2013-04-07 17:47:10 -02:00
Morten Christensen 97d41f8998 Merge 2013-04-07 16:35:20 -02:00
Morten Christensen 8ef88dc955 Making the topological sorter public 2013-04-07 16:35:02 -02:00
Shannon Deminick e50bac7c9f Merge with 6.0.4 2013-04-06 01:46:13 +06:00
Shannon Deminick 01bf0bcfa5 Fixes merge issues 2013-04-06 01:41:06 +06:00
Shannon Deminick 7dcfcaf339 Merge with 6.0.4 2013-04-06 01:23:29 +06:00
Shannon Deminick 6badfae849 Merge 2013-04-05 20:44:44 +06:00
Shannon Deminick 9d0dbda3bd Fixed merge issue 2013-04-05 20:44:16 +06:00
Shannon Deminick df986c8254 Merge with 6.0.4 2013-04-05 20:43:24 +06:00
Stephan cd823db766 merge with 6.1.0 2013-04-05 10:28:50 -02:00
Stephan 2f9de56968 U4-2030 - failed to update UmbracoContext on some devt webservers 2013-04-05 10:28:19 -02:00
Stephan 49a61c5820 merge with 6.1.0 2013-04-05 06:22:35 -02:00
Shannon Deminick 2dfdc1050b Updates solution to use latest examine 1.5.1 from official Nuget source. 2013-04-05 06:19:52 +06:00
Shannon Deminick 9e239f135d Fixes: #U4-2027, changes DirectoryBrowser over to use correct webforms file structure, cleans up (a teeny bit)
how this page is structured, at least its not all inline c# code with inline styles.
2013-04-05 06:06:10 +06:00
Sebastiaan Janssen 480b84a223 Added tag release-6.1.0-beta for changeset 87cf618a39e3 2013-04-04 16:59:27 -02:00
Shannon Deminick 635ebcb9be removed error check as this was causing errors 2013-04-05 00:40:03 +06:00
Shannon Deminick 33f7a8477d updated to latest version of Umbraco.Azure via nuget 2013-04-05 00:09:14 +06:00
Shannon Deminick 646194e013 Merge with 6.0.4 2013-04-04 23:36:57 +06:00
Shannon Deminick 425fcf36eb un-reverted changes to UserType cache refresher 2013-04-04 23:36:31 +06:00
Shannon Deminick 31fd05ebca Merge 2013-04-04 23:30:36 +06:00
Shannon Deminick 495b4ed9e0 Refactors the WebSecurity class to not be static and be part of the UmbracoContext. Makes a few methods internal on it so that
it's not relying on the legacy User class. Cleans up the new BasePage and EnsuredUmbracoPage
2013-04-04 23:30:17 +06:00
Stephan e1c810c033 merge with 6.1.0 2013-04-04 14:27:11 -02:00
Shannon Deminick 87c904cc96 Fixes: #U4-2044, #U4-2048 2013-04-04 21:57:41 +06:00
Morten Christensen 03c65c8eec Updating build version to 6.1.0 beta
Updating nuspec with new references.
2013-04-04 12:13:59 -02:00
Morten Christensen 14aeb55c14 Removing unused ServiceStack.Text reference/nuget package.
Ignore Macro tests for the model and repo as its not used and still internal. Might be an idea to remove it altogether.
2013-04-04 12:02:27 -02:00
Sebastiaan Janssen 7ddbc83731 Merge gone wrong, my bad! 2013-04-04 10:20:13 -02:00
Sebastiaan Janssen 17533c57d3 Merge with 6.0.4 2013-04-04 10:04:29 -02:00
Sebastiaan Janssen 433668e202 Merge 2013-04-04 09:46:34 -02:00
Sebastiaan Janssen 9edcc0c903 Revert UserType caching changes until Shannon can commit UserTypeCacheRefresher 2013-04-04 09:46:20 -02:00
Stephan 7a1e3b96b8 Web.PublishedCache - IPublishedCaches doesn't return !contextual caches anymore 2013-04-04 05:10:53 -02:00
Shannon Deminick f747f69c62 Merge with 6.0.4 2013-04-04 05:46:25 +06:00
Shannon Deminick e07985439a Fixed up some unit tests 2013-04-04 05:05:52 +06:00
Shannon Deminick 620f21d7d7 Converted over Application.cs to use ApplicationContext.Current 2013-04-04 04:42:36 +06:00
Shannon Deminick 4a13047d5d Converted ApplicationTree to use ApplicationContext.Current.ApplicationCache 2013-04-04 04:34:40 +06:00
Shannon Deminick 446a480f21 converted ui to use ApplicationContext.Current.ApplicationCache 2013-04-04 04:19:05 +06:00
Shannon Deminick b56f8c8fb3 Fixes: #U4-2043 - User Type cache is not invalidated in LB scenarios 2013-04-04 03:43:05 +06:00
Shannon Deminick 296c24f829 Fixes: #U4-2042 - ensures users cannot continue to user the back office after they've been disabled and
ensures that the user context cache is cleared when users are saved which will work in LB environments.
Changes more HttpRuntime.Cache dependencies to ApplicationContext.Current.ApplicationCache.
2013-04-04 02:11:31 +06:00
Shannon Deminick c5e88ef69f Fixes: #U4-2041, #U4-2040 - user cache is not invalidated when permissions change across LB environments, also streamlined how caching is handled in
these classes which now use the standardized events way to do things. Fixes a performance issue and ensures that the cache is not invalidated for 'micro'
operations during permission changes.
2013-04-04 00:30:28 +06:00
Shannon Deminick 2a7e493c74 Changes all instances of the legacy Cache class to be using ApplicationContext.Current.ApplicationCache.
Fixes: #U4-2039 - ensures macro xslt cache is invalidated in LB scenarios.
2013-04-03 23:39:51 +06:00
Shannon Deminick e14d3fd379 changes all instances accessing cache by key "contentItem" to use CacheKeys.ContentItemCache and replaces
all of it's cache usages with the ApplicationContext.Current.ApplicationCache. Obsoletes a couple of methods
that are not used.
2013-04-03 22:34:40 +06:00
Sebastiaan Janssen fa43cfd58f Silly designer file, of course you need to change to. kthxbi 2013-04-03 11:43:28 -02:00
Sebastiaan Janssen 711afe8bb7 Breaking changes reverted 2013-04-03 11:41:53 -02:00
Stephan 4abb9fff3e merge with 6.1.0 2013-04-03 11:19:41 -02:00
Stephan 23525300bb Web.PublishedCache - add XPathNavigator support 2013-04-03 11:19:10 -02:00
Stephan 2490908401 merge with 6.1.0 2013-04-03 08:41:53 -02:00
Stephan b93ea7c69b U4-2033 - fix the tests, now we're returning lower case 2013-04-03 08:40:09 -02:00
Morten Christensen 640be73a66 A few refactoring bits for the FolderBrowserService. 2013-04-03 07:03:57 -02:00
Morten Christensen 32ae88fc81 Merge 2013-04-03 05:25:42 -02:00
Morten Christensen a4c9c3bfd9 Updating EntityService and repository to add content and media specific properties to the UmbracoEntity for performance enhancements.
Adding sample implementation in the BaseMediaTree but keeping it commented out as it won't work with the legacy events.
And a bit of code cleanup
2013-04-03 05:25:26 -02:00
Shannon Deminick 182107286c Fixes merge issues 2013-04-02 23:08:43 +06:00
Shannon Deminick a7e939e71f Merge with 6.0.4 2013-04-02 22:39:39 +06:00
Stephan 4217949719 merge with 6.1.0 2013-04-02 11:35:06 -02:00
Stephan 83d05bd01c U4-2033 - url segment is not lower case 2013-04-02 11:34:40 -02:00
Stephan fc68ba69e2 merge with 6.1.0 2013-04-02 09:24:36 -02:00
Stephan 9fb10ea004 presentation.UmbracoContext - get property values from appropriate sources 2013-04-02 09:23:53 -02:00
Stephan c916df0d13 Core.Strings - apply 2551076f571a to 6.1.0 2013-04-02 09:19:49 -02:00
Stephan 28892a7bb2 merge with 6.1.0 2013-04-01 16:35:52 -02:00
Stephan 99a63a3cdb fix build 2013-04-01 16:35:03 -02:00
Stephan 65cb6fbaff merge with 6.1.0 2013-03-31 19:19:24 -02:00
Stephan 4b49f9779f merge with 6.1.0 2013-03-31 19:05:24 -02:00
Stephan c5b6bb52e0 Web.PublishedCache - refactor how caches manage preview 2013-03-31 18:47:25 -02:00
Stephan efee4d0c0c Web.PublishedCache - IPublishedCaches creates contextual caches 2013-04-04 05:09:26 -02:00
Stephan b89951dd11 Web.PublishedCache - refactor contextual caches & inner caches management 2013-03-31 18:44:29 -02:00
Stephan 70ad3edc1f Web.UmbracoContext - refactor constructor to use IPublishedCaches 2013-04-03 08:40:35 -02:00
Stephan 8d33488923 Web.PublishedCache - make parts of XmlPublishedCache virtual 2013-03-31 18:40:55 -02:00
Stephan 32a6a49077 Macros - bugfix & cleanup macros 2013-03-31 18:47:37 -02:00
Stephan ad52c0f033 Web.Cache - add notes to cache refreshers re. dependencies 2013-03-31 18:40:55 -02:00
Stephan 9982a09826 Web.PublishedCache - merge resolvers so caches can be related 2013-03-31 18:40:55 -02:00
Stephan 83308c3d5f Core.Xml - support XPathExpression 2013-04-10 12:47:11 -02:00
Stephan 495b661263 Core.Xml - refactor 2013-04-10 12:47:09 -02:00
Stephan f2d7e3549d XmlPublishedCache - fix casting exception messages 2013-04-04 15:24:29 -02:00
Stephan 4201d678fa XmlPublishedCache - GetXml() can be private, no need for internal 2013-04-04 15:24:29 -02:00
Stephan ff6ee360da ItemRenderer - cleanup access to Xml cache 2013-04-04 15:24:29 -02:00
Stephan 1f999d7e22 Macros - bugfix & refactor access to Xml cache 2013-04-04 05:02:55 -02:00
Stephan be24075850 presentation.library - get Xml navigator via Web.UmbracoContext 2013-04-04 05:03:01 -02:00
Stephan 6d18d32356 Web.Routing - bugfix PublishedContentRequestEngine
no macro would run when rendering a 404 document
2013-03-31 18:40:54 -02:00
Stephan 75f0f1f4ee Web.UmbracoContext - allow for InPreviewMode override in tests 2013-03-31 18:40:54 -02:00
Stephan 425a9f6a34 Core.Xml - import framework xml tests 2013-03-31 18:40:54 -02:00
Stephan 1d5f7ae822 Core.Strings - handle config. errors in DefaultShortStringHelper 2013-03-31 18:40:54 -02:00
Morten Christensen 3f7a93e0c9 Adding test fixture for the EntityService.
Refactoring sql query used in the EntityRepository.
Correcting a few issues with the UmbracoObjectTypes extensions.
2013-03-30 09:52:37 -01:00
Shannon Deminick 72ad9f51c1 Merge with 6.0.4 2013-03-29 21:41:08 +06:00
Shannon Deminick 20fb27f7e1 Fixed server registration ctor and factory to ensure IsActive is correct. 2013-03-28 11:27:13 +06:00
Shannon Deminick c8e20cf64b Fixes: #U4-2012, #U4-2005 2013-03-28 09:07:36 +06:00
Sebastiaan Janssen a89a122b09 Merge with 6.0.3 2013-03-27 11:56:44 -01:00
Shannon Deminick 3accecd504 Merge with 6.0.3 2013-03-27 03:09:57 +06:00
Shannon Deminick d9121b4684 fixes merge 2013-03-26 22:12:35 +06:00
Shannon Deminick 132ec1702c Merge with 6.0.3 2013-03-26 22:09:50 +06:00
Shannon Deminick a4e3127704 Ensures that xslt can throw exceptions too with the new settings - #U4-497 2013-03-26 21:40:50 +06:00
Sebastiaan Janssen 2678e23c7d Update Resolves_Assigned_Mappers to make sure the unit tests run 2013-03-26 12:26:08 -01:00
Stephan 6148d63b02 merge with 6.1.0 2013-03-26 11:37:52 -01:00
Morten Christensen 4dc94d1e0b Merge 2013-03-26 05:00:04 -01:00
Morten Christensen b058b1e345 Removing LEFT JOIN from query as its already part of the builder 2013-03-26 04:59:56 -01:00
Morten Christensen dfa1e73ddf Continueing implementation of the EntityRepository and Service. 2013-03-25 18:54:12 -01:00
Shannon Deminick 390f56a64d Merge with 6.0.3 2013-03-25 20:54:49 +06:00
Shannon Deminick 04c623f19c Merge 2013-03-25 20:54:31 +06:00
Shannon Deminick 633d88c8c4 Changed DefaultServerMessenger to have an overridable method to send the request, added some internals visible to. 2013-03-25 20:54:21 +06:00
Stephan 3ed4da19c2 merge with 6.1.0 2013-03-25 09:46:25 -01:00
Morten Christensen 40a9da5ee0 Merge with 6.0.3 2013-03-23 07:24:27 -01:00
Shannon Deminick 3b982b80f5 Fixes test issues, needed to disable application cache for these tests since the cache invalidation happens at the CacheRefresher level but for these
tests (any many other ones) we are not 'booting' umbraco with the Boot managers so the CacheRefreshers are not wired up to listen to events to clear
the cache. This puts us another step closer to having a proper global cache solution that will work for everything. At least now, all of the legacy
code is using the ApplicationCache which we can now control from a central location. Changed NiceUrlsProviderWithDomainsTests to only require a new db
schema per fixture.
2013-03-23 04:01:52 +06:00
Shannon Deminick 1cada5aeb5 Merge with 6.0.3 2013-03-23 02:35:21 +06:00
Shannon Deminick 64719586dc Merge 2013-03-23 02:32:07 +06:00
Shannon Deminick 63d010f78f Fixes: #U4-497 2013-03-23 02:31:24 +06:00
Shannon Deminick e97a01c75c Fixes: #U4-1992 - Creates DictionaryCacheRefresher to ensure that all cache associated with the dictionary is updated amongst all
servers when it is changed/removed. Removes RemoveByJson as we only actually require RefreshByJson since we can put any sort of parameters
in a custom json string including whether it is a remove operation (if required)
2013-03-23 01:59:25 +06:00
Stephan a9df92b7a3 merge with 6.1.0 2013-03-22 17:45:42 -01:00
Stephan 65ae43918d merge 2013-03-22 17:45:10 -01:00
Stephan 6e4d8b638e merge 2013-03-22 17:40:29 -01:00
Stephan 21c635f61a Core.Strings - Add support for UrlReplaceCharacters to DefaultShortStringHelper 2013-03-22 17:39:35 -01:00
Stephan 6cc747bf76 Core.Strings - fix bug in helper freeze 2013-03-22 17:38:28 -01:00
Shannon Deminick af2693af76 Fixes how language and dictionary items are cached (ConcurrentDictionary), also fixes up how the Language object
is created and how it raises it's new event and fixes thread safety with it. Also fixes how Language was not checking
for invalid culture codes.
2013-03-23 00:24:37 +06:00
Shannon Deminick d95fc0210e Merge with 6.0.3 2013-03-22 22:11:56 +06:00
Shannon Deminick 00de509478 Merge 2013-03-22 22:11:08 +06:00
Shannon Deminick 1b5139889c Changed event handler to AfterDelete for DataTypeDefinition, fixes merge issue with Entity and changes WasCancelled to be tracked. 2013-03-22 22:10:24 +06:00
Shannon Deminick d976fbe4de Merge with 6.0.3 2013-03-22 22:03:50 +06:00
Stephan 47474d31d6 Web.PublishedCache - rename LegacyXmlCache into XmlPublishedCache 2013-03-22 15:02:26 -01:00
Shannon Deminick 840a95ba62 Merge 2013-03-22 21:56:43 +06:00
Shannon Deminick e18d8da872 Fixes: #U4-1931 - allow setting an empty string to a dictionary item. 2013-03-22 21:56:25 +06:00
leekelleher b6ec364156 Updated references to the new constants for Application and MediaType aliases. 2013-03-22 13:13:05 +00:00
leekelleher 6b07ee83eb Added constants for Application (section aliases), System (node IDs) and MediaType aliases. 2013-03-22 13:11:27 +00:00
Shannon Deminick 7e0c1fac36 Fixes: #U4-1717 - UmbracoContext.EnsuresContext is public. 2013-03-22 05:23:11 +06:00
Shannon Deminick 8cdfba42d5 Moves clearing of the routes cache for when domains are changed to the DomainCacheRefresher. 2013-03-22 05:15:58 +06:00
Shannon Deminick e8dd56786b Fixes: #U4-1986 - data type cache is not refreshed in load balanced environments. 2013-03-22 05:04:32 +06:00
Shannon Deminick 2a9309ea38 un-obsoletes a bunch of the Member api since it shouldn't be obsoleted. Ensures that members cache is cleared when a member is updated or deleted using
the API and that this cache is also refreshed on other servers.
2013-03-22 04:34:57 +06:00
Shannon Deminick c732ee6eb2 Fixes: #U4-1982 - removes the RelationType cache 2013-03-22 02:54:59 +06:00
Shannon Deminick ee2f2dfda0 Fixes: #U4-1981 - ensures template cache is properly refreshed amonsgst all servers 2013-03-22 02:08:55 +06:00
Shannon Deminick 9d6b38a1c1 Fixes: #U4-1980 - stylesheet and stylesheet property cache is not refreshed in load balanced environments. 2013-03-22 01:49:34 +06:00
Shannon Deminick f6490a897a Fixes: #U4-1978 - Creates DomainCacheRefresher - domain cache is now refreshed across all servers 2013-03-22 00:49:07 +06:00
Shannon Deminick ce8f5c167c Fixes: #U4-1933 - Adds LanguageCacheRefresher, removes the invalidate cache calls from within the legacy language object. 2013-03-22 00:35:15 +06:00
Shannon Deminick 5f242aa3f6 Converts the media cache refresher to be a json cache refresher since it was impossible before to have media cache
cleared when media was deleted. Created base classes for cache refreshers, we now have a new event - CacheUpdated
which can now be used by code to execute on each individual server when any cache refresher is updated. Listening to events
normally only fire on the individual server so if people are wanting to refresh their own cache there was previously no way
to do that.
2013-03-21 22:53:58 +06:00
Shannon Deminick ab8b0f4ebb Merge with 6.0.3 2013-03-21 20:39:33 +06:00
Shannon Deminick a57d3f7eba Merge 2013-03-21 20:31:23 +06:00
Shannon Deminick f5a1e41569 missing checkin file 2013-03-21 20:30:32 +06:00
Stephan 8c79977a23 Web - move GetByAlias out of PublishedCache 2013-03-21 08:54:25 -01:00
Shannon Deminick 52f05612ad Adds another method of distributed cache syncing using a custom json payload. this is necessary for things like ContentType cache
updates especially when deleting one since we require all sorts of Ids from the object but the object will be deleted by the time
the request reaches other servers so instead we create a json payload to send to other servers which contains all information necessary
to refresh/clear the cache on the other servers. This will probably be the preferred way going forward to handle cache refreshing.
With this in place, when removing a conent type cache is removed based on events.
This also adds a 'class' generic argument constraint to the repository base classes to guarantee we can do null checks and then we also
fix a null check on RepositoryBase. Updates the Entity class to properly support tracking properties - this now allows us to determine if
an entity was new, which is now used to ensure we don't re-update all of the content cache when a new content type is created.
Have also changed the deletion and creation of document types to use the new API, this allows for a lot less processing and streamlining how
all cache is invalidated. Fixes the construction of a new Template and Content Type in the v6 api and ensures that default values are set - #U4-1972, #U4-1971
2013-03-21 08:38:18 +06:00
Shannon Deminick c5a0da6aa5 Updated ContentTypeCacheRefresher to ensure that content xml cache is only refreshed for doc types not
media types, also ensures that the route cache is cleared (#U4-1969). Changes the deletion of media and
doc types to use the new Api - this ensures that cache is refreshed properly.
2013-03-21 01:04:27 +06:00
Shannon Deminick 266aa3423b Merge 2013-03-21 00:06:50 +06:00
Shannon Deminick 7ea87638f7 Updates all Entity models to use SetPropertyValueAndDetectChanges for setting all simple properties so that
tracking changes works the way it is supposed to. Creates a TracksChangesEntityBase class for any other entity
that wants to implement IRememberBeingDirty (now Entity inherits from this). Upgraded a bunch of other entities that
were not tracking changes properly.
2013-03-21 00:05:56 +06:00
Shannon Deminick b96b372400 Ensure ResetDirtyProperties(false); is set where appropriate (any PerformGet and the base Get)
relates to : #U4-1946
2013-03-20 23:13:55 +06:00
Stephan fcb8f0d417 Web.Routing - RoutesCache goes with PublishedCache 2013-03-20 16:01:49 -01:00
Stephan 6e3c4854b9 Web - add extension methods to ContextualContentCache 2013-03-20 16:01:48 -01:00
Stephan ba24deffc9 Core.Configuration - fix version 2013-03-20 16:01:48 -01:00
Shannon Deminick aa7fd7bb2b Removed cache refreshing code from inside of the ascx control as it is now all handled via business logic. 2013-03-20 22:03:35 +06:00
Shannon Deminick e7a6a29e59 Merge 2013-03-20 21:18:24 +06:00
Shannon Deminick c43efbbfc4 Changed the remaining/relavent properties on ContentTypeBase to use the SetPropertyValueAndDetectChanges
to set property values.
2013-03-20 21:03:48 +06:00
Shannon Deminick adedc9b64b Ensures mocked test entities don't have dirty properties on initialization. Ensures content xml structure
is rebuilt when a content type's alias is changed or a property type is removed from it. Adds ability  to rebuild
content xml structures for specified content types, not for all content. Adds ContentTypeExtensions and
more unit tests for ContentTypeTests. Changes RuntimeCacheProvider to use new ConcurrentHashSet instead of a dictionary
with the same key/value. Adds overload to IRepositoryCacheProvider to clear cache by type. Clears the IContent cache when
a Content type is saved.
All relates to fixing #U4-1943
2013-03-20 20:53:12 +06:00
Stephan 73d77083ae Web.PublishedCache - bugfix & fix tests 2013-03-19 17:54:41 -01:00
Stephan b2a1f67fb4 Web.PublishedCache - move XML away from UmbracoContext 2013-03-19 17:54:41 -01:00
Stephan 3a0d617b14 Web - cleanup UmbracoHelper XPath methods 2013-03-19 17:54:37 -01:00
Stephan ce0c72d9f8 Web.PublishedCache - introduce contextual caches 2013-03-19 17:51:55 -01:00
Stephan cb966ac70b Web.Routing - use UmbracoContext.ContentCache 2013-03-19 17:50:38 -01:00
Shannon Deminick 6c40f32c2a Fixes merge issues. 2013-03-20 00:50:37 +06:00
Stephan cce32f406f Web.PublishedCache - move caches to UmbracoContext 2013-03-19 17:50:36 -01:00
Shannon Deminick 610ff91a9d Merge with 6.0.3 2013-03-20 00:23:24 +06:00
Shannon Deminick 45f39158ba Merge 2013-03-19 23:55:29 +06:00
Shannon Deminick d7b5d73e62 updated merge 2013-03-19 23:54:56 +06:00
Shannon Deminick 780a9632f0 Merge 2013-03-19 23:49:51 +06:00
Shannon Deminick 603b6c73f7 Adds some notes. 2013-03-19 23:49:20 +06:00
Shannon Deminick 1b66c42c9b Fixes RePublishAll method to ensure it performs the same function as the legacy Document.RePublishAll - it just
re-generates the XML in the cmsContentXml table. Updates the Sql providers to support truncate table. Updates the RepublishAll
unit test. Adds a TruncateTable extension to PetaPoco. Adds locking to certain service methods that perform more than once function.
2013-03-19 23:46:13 +06:00
Morten Christensen 5175fb5188 Updating the EntityService implementation 2013-03-19 09:34:36 -01:00
Shannon Deminick b260769799 Fixes: #U4-1946 - when entities are constructed via the factories (i.e. from the database), ensure that
properties are not tracked as dirty already.
2013-03-19 07:37:33 +06:00
Shannon Deminick 4495fd05c4 Creates IRememberBeingDirty interface to track the properties that we're changed before the last commit for a given entity.
Adds internal property and tracks it's dirty changes to the ContentTypeBase - HasPropertyBeenRemoved.
Fixes: #U4-1942 - ensures content xml cache is refreshed even across servers when a property is removed or when the alias is changed.
2013-03-19 06:38:15 +06:00
Morten Christensen 923653f2b5 Merge 2013-03-18 20:19:09 -01:00
Morten Christensen 083320002b Continueing with the implementation of the EntityRepository 2013-03-18 20:18:12 -01:00
Shannon Deminick 3052c7311f Converts dictionary cache in ContentType to use concurrent dictionary. Changes ContentTypeControlNew to
not call the propertytype.delete() method if it is a DocumentType or MediaType (should only be called for
legacy code like members). Updates ContentTypeCacheRefresher to ensure that all of the content type cache is
cleared properly in the ICacheRefresher.
2013-03-19 02:02:11 +06:00
leekelleher 3af7958940 Updated references for alias conventions constants across the solution. 2013-03-18 17:55:02 +00:00
leekelleher c7498cec03 Added constants for regular conventions within the Umbraco core.
e.g. popular property-type aliases.
2013-03-18 17:51:57 +00:00
Stephan abe4ec6524 Core.Configuration - simplify 2013-03-18 15:49:43 -01:00
Shannon Deminick e3a8b4ac78 Moves some legacy classes into LegacyClasses.cs and un-seals some refreshers with comments to support legacy classes. 2013-03-18 21:18:22 +06:00
Morten Christensen 365dffe2db Merge 2013-03-18 14:15:30 -01:00
Morten Christensen 381157ac5d Initial implementation of the EntityRepository and Service, which will be used to retrieve a basic object with a minimum set of propreties for the models that have their base in the umbracoNode table.
The intention is to use this for loading trees in the backoffice for faster loading.
2013-03-17 16:25:21 -01:00
Shannon Deminick f993e96547 Seals a bunch of classes that need to be 2013-03-16 09:03:26 +06:00
Shannon Deminick 734f75b3ad Removes completely unnused macro cache key 2013-03-16 08:53:27 +06:00
Shannon Deminick 7ef066f396 Removed erroneous cache flushing for tabs since there is no cache for tabs 2013-03-16 08:51:25 +06:00
Shannon Deminick 23bb0e3ac3 Fixes: #U4-1930, #U4-1928, #U4-1929 - addes ContentTypeCacheRefresher to ensure that content type cache is cleared
in load balanced scenarios. Cleans up a bit of code too.
2013-03-16 08:47:55 +06:00
Shannon Deminick 2dea4a1d70 updates more cache handling, fixes syntax error in examineindex.release.config, fixes the DefaultServerMessenger ctor
to be lazy since the db context isn't initialized yet (will speed up start a bit too), ensures that the macro/xslt caching
clearing is only done on the single server instead or re-posing another distributed call.
2013-03-16 01:37:05 +06:00
Shannon Deminick 07bdd138cc Merge with 6.0.3 2013-03-15 11:31:54 +06:00
Shannon Deminick 2b750843c5 Fixed up base web test, removes RequiresDbSetup in place of new database behavior - NoDatabasePerFixture.
Fixed issue with another test... no idea how it didn't show up failing before.
Fixes issue with string extensions and an infinite loop when the string to strip is empty/null.
2013-03-15 11:28:05 +06:00
Shannon Deminick bd81507ecb Merge with 6.0.3 2013-03-15 08:29:22 +04:00
Shannon Deminick ea7fb32fb9 Merge with 6.0.3 2013-03-15 06:23:54 +04:00
leekelleher 2cd64dd540 Missed a few TinyMCE GUID references, (due to their string format). 2013-03-14 22:15:39 +00:00
leekelleher 2a058cdbcc Fixed a conflict-references between Constants (in Umbraco.Web.Mvc and Umbraco.Core) 2013-03-14 22:01:09 +00:00
leekelleher 37860b4015 Replaced all hard-coded GUID references to use the new Constants. 2013-03-14 22:00:37 +00:00
leekelleher 0f056b1702 Updated GUID references in editorControls and uQuery to use the new Constants. 2013-03-14 21:58:31 +00:00
leekelleher aa5588bbd3 Added Constants (static class).
Included all GUIDs for PropertyEditors and ObjectTypes.
2013-03-14 21:55:46 +00:00
Shannon Deminick 33c5c41a31 Added better support for clearing the db schema for test. Added more support for different db behaviors for tests, now to update
the behaviors where necessary as this will speed things up quite a lot.
2013-03-14 02:43:17 +04:00
Shannon Deminick 8d3c798c6c Changed tests to clear out the current database instead of trying to delete/re-create it. Fixes up
other test inconsistencies and more error checking on the ApplicationContext.Dispose.
2013-03-14 01:07:54 +04:00
Shannon Deminick 245591c31f Fixed up another test inconsistency 2013-03-13 18:52:15 +04:00
Shannon Deminick 8fb8fc00b4 Fixes up inheritance structure of BaseTableByTableTests 2013-03-13 18:41:24 +04:00
Shannon Deminick 50b05d25f5 Added BaseUmbracoApplicationTests and fixed up dispose on the ApplicationContext to ensure the db object is disposed and doesn't
reset the PluginManager (as this shouldn't really need to be done). Cleaned up all unit tests so they follow the same structure and
uses this base class where necessary and eliminates a lot of duplicate code.
2013-03-13 18:31:07 +04:00
Shannon Deminick c04ee7bdc7 Removes type check caching from TypeHelper... is actually much slower. 2013-03-13 01:40:34 +04:00
Shannon Deminick 75d218d2e3 Updated how mappers for persistence work with the MapperFor attribute and have made BaseMapper public but have
kept all properties, etc.. internal just so that they can be found so we don't have to register them.
Updates unit test to ensure the plugin manager is init'd properly with the 'false' override. Ensures that the base
db test also initializes the plugin manager properly.
2013-03-13 01:09:29 +04:00
Shannon Deminick 4efa2c9f57 teeny bit of code cleanup 2013-03-12 23:51:53 +04:00
Shannon Deminick 630a44358f ensures cache clearing by search is done with case insensitivity 2013-03-12 23:30:43 +04:00
Shannon Deminick f7015d521b Merge 2013-03-12 22:58:53 +04:00
Shannon Deminick 860c8c1002 Fixes: #U4-482, #U4-549. Macro cache streamlining - ensures it is cleared based on event handling instead of inline everywhere
in code. Unit tests for CacheHelper, unit tests for umbraco.macro, updates to
ObjectExtensions.TryConvertTo + unit tests, enhanced disposable method of ApplicationContext.
2013-03-12 22:58:21 +04:00
Stephan a2120d1c6b Web.Routing - improve domains management 2013-03-12 16:12:38 -01:00
Stephan fc3f9dfeae Web.Routing - hide new wildcard domains from public APIs
only way to get them is through internal methods
+ improve / fix domains handling
+ fix failing tests
2013-03-12 15:16:12 -01:00
Shannon Deminick cf64c0243c MacroCacheRefresher also implements ICacheRefresher<macro> 2013-03-12 17:08:31 +04:00
Stephan ca9f53738b Web.UI - AssignDomain2 dialog (U4-19) 2013-03-12 12:00:34 -01:00
Shannon Deminick 8d2e466e34 Changes MediaCacheRefresher to be ICacheRefresher<T> and updates MacroCacheRefresher to use correct
macro object.
2013-03-12 03:11:35 +04:00
Shannon Deminick ec46d65bb4 Streamlines how macro cache is handled 2013-03-12 03:00:42 +04:00
Shannon Deminick 164f22aa50 Makes ApplicationContext disposable so that 3rd party devs are able to reset their applications (or unit tests), updated
resolution and created a ResolverCollection to track all resolvers created so it's super easy to reset all of them at once
(which is what happens on ApplicationContext.Dispose. ApplicationContext.Dispose is also implicitly implemented as to not
show in intellisense that the Dispose method exists... must be cast to IDisposable to work.
2013-03-12 01:50:56 +04:00
Shannon Deminick cc50003e3e Fixup merge issues 2013-03-12 00:40:37 +04:00
Shannon Deminick 8698deb469 Merge with 6.0.3 2013-03-12 00:21:10 +04:00
Shannon Deminick 738e4f5c46 Merge 2013-03-12 00:20:12 +04:00
Sebastiaan Janssen c854ea8a35 .transformed files are auto-generated and shouldn't be under source control 2013-03-11 17:11:59 -01:00
Shannon Deminick 9bd865d259 Fixes: #U4-1890 - allows access to the UmbracoContext during application startup. 2013-03-11 23:46:47 +06:00
Shannon Deminick 2d55dda662 Merge with 6.0.3 2013-03-11 22:04:29 +06:00
Shannon Deminick 29b2458ef3 Merge 2013-03-11 22:01:54 +06:00
Shannon Deminick 1e6de161e6 Merge with 6.0.3 2013-03-11 22:01:40 +06:00
Shannon Deminick 508886b1ad transormed file changed.... 2013-03-11 22:00:59 +06:00
Stephan 3ab0879a99 Core.Strings - refactor ToSafeFileName 2013-03-11 14:58:07 -01:00
Shannon Deminick 4baecfe833 Merge with 6.0.3 2013-03-11 21:56:47 +06:00
Shannon Deminick e5e22f75fc Merge 2013-03-11 18:47:36 +06:00
Morten Christensen 3612f18f3f Merge with 6.0.3 2013-03-07 20:22:37 -01:00
Shannon Deminick 86852f9815 updated server registrar 2013-03-07 23:23:20 +06:00
Shannon Deminick 9aa44c40ce re-instated the upgrade script and put the server rego back on the service context. 2013-03-07 22:57:42 +06:00
Shannon Deminick da331b7408 Changed how model mappers work for persistence objects so we don't have to statically associate the mapper. 2013-03-07 22:27:47 +06:00
Shannon Deminick 0230bedeb6 Reinstated server registration repositories and db table 2013-03-07 21:40:00 +06:00
Shannon Deminick bd6aa51397 Merge with 6.0.3 2013-03-07 21:27:54 +06:00
Shannon Deminick 9b85bc0e64 Added installer step to choose rendering engine but have left it disabled, might make a dashboard instead for that. 2013-03-07 21:25:11 +06:00
Shannon Deminick 2044d1b5db manually merged in installer changes from 6.0.3 2013-03-07 04:06:30 +06:00
Shannon Deminick 2c05eda899 Merge with 6.0.3 2013-03-07 04:01:04 +06:00
Shannon Deminick 0852200861 Merge with 6.0.3 2013-03-06 04:12:58 +06:00
Shannon Deminick f955955ad8 Merge with 6.0.3 2013-03-06 03:18:11 +06:00
Shannon Deminick 9042a23de7 Fixes: #U4-1614, #U4-793 - preview working properly in mvc 2013-03-06 03:12:04 +06:00
Shannon Deminick b9eaaa0f29 Merge with 6.0.3 2013-03-05 23:55:41 +06:00
Shannon Deminick f79d046a87 Merge with 6.0.3 2013-03-05 22:19:31 +06:00
Shannon Deminick 737d7d6712 merge issue 2013-03-05 09:13:24 +06:00
Shannon Deminick 4d8ed22206 Merge with 6.0.3 2013-03-05 08:42:43 +06:00
Shannon Deminick 06dc76496d Merge with 6.0.3 2013-03-05 06:08:02 +06:00
Shannon Deminick 2877b7bda4 Fixes: #U4-1819 2013-03-02 05:46:00 +06:00
Shannon Deminick c137854e01 Merge with 6.0.2 2013-03-02 03:45:06 +06:00
Shannon Deminick fe9f5b224a Fixing really strange merge issues! 2013-03-02 03:34:37 +06:00
Shannon Deminick 45f2cc9a20 Merge with 6.0.2 2013-03-02 02:52:25 +06:00
Shannon Deminick f1c680c7e2 Merge with 6.0.2 2013-03-02 02:50:17 +06:00
Shannon Deminick 36108df4d0 Merge with 6.0.2 2013-03-02 02:49:24 +06:00
Shannon Deminick 51ad21302a Merge 2013-03-02 01:03:07 +06:00
Shannon Deminick 010893a73a Fixes: #U4-1822, #U4-1797 - Is helpers and indexes on result collections using IPublishedContent or DynamicPublishedContent were incorrect,
added unit tests to support issues and fixes.
2013-03-02 01:02:38 +06:00
Stephan 97f3f13aaa Core. and Web.Configuration - go public
UmbracoSettings now public, only static For<> method is not internal, though
2013-03-01 13:56:12 -01:00
Stephan 32e6604cf7 Web.Routing - add InternalRedirectPreservesTemplate setting (U4-1222...) 2013-03-01 13:56:12 -01:00
Stephan b2cedf6380 Web.BaseRest - use new settings & config interface 2013-03-01 13:56:12 -01:00
Stephan 9fc5ee897f Web.Routing - implement UrlProviderMode 2013-03-01 13:56:11 -01:00
Stephan e8e8053063 Web.Configuration - migrate TryIisCustomErrors 2013-03-01 13:56:11 -01:00
Stephan c635ec67d0 Web.Configuration - import WebRouting infrastructure 2013-03-01 13:56:11 -01:00
Stephan 750370d148 Core.Configuration, Tests - refactor settings management 2013-03-12 12:02:04 -01:00
Stephan 2c6daa2918 Core.Configuration - cleanup 2013-03-01 13:56:11 -01:00
Stephan e33c877605 Core.Strings - fix tests 2013-03-01 11:47:02 -01:00
Sebastiaan Janssen cab21e9d48 Merge with 6.0.1 2013-03-01 06:51:38 -01:00
Sebastiaan Janssen 2e7c26fcc0 Closing branch 6.0.1 2013-03-01 06:49:59 -01:00
Sebastiaan Janssen 0f6c41679c Added tag Release-6.0.1 for changeset 92410e141d9c 2013-03-01 06:49:45 -01:00
Stephan 85e73df3c8 Web.Routing - refactor & resharp 2013-02-28 20:20:40 -01:00
Shannon Deminick a17a11d50b Fixed: #U4-1810, pretty much finished the examine management dashboard. 2013-03-01 03:04:29 +06:00
Shannon Deminick 6ead98a51d updated latest examine patch dll. added indexing actions to the dashboard. have optimize working great all
with the new umbraco api framework.
2013-02-28 05:05:06 +06:00
Shannon Deminick 7cc12211e1 Fixed unit tests 2013-02-27 23:34:55 +06:00
Shannon Deminick f9b7e1b7fa Merge with 6.0.1 2013-02-27 23:20:34 +06:00
Shannon Deminick 33c5f3fcc7 updating examine dash 2013-02-27 22:21:58 +06:00
Shannon Deminick 47f6924ac3 Fixes: #U4-1790 for 6.1 (slightly different fix than 6.0.1) 2013-02-27 21:59:21 +06:00
Shannon Deminick 45b8daa18c Merge with 6.0.1 2013-02-27 21:38:45 +06:00
Shannon Deminick 1157c11d89 added searcher properties 2013-02-27 06:53:18 +06:00
Shannon Deminick 6815092b62 Changed default api routes to support multiple actions, not strict REST only methods. updated more examine mgmt. 2013-02-27 06:50:26 +06:00
Shannon Deminick 876753cb54 Merge 2013-02-27 05:25:21 +06:00
Shannon Deminick b374dcf2c2 fixed issue with test project's invalid references (for web api). Added UmbracoAuthorizedApiController, change the
examine mgmt tools to use web api, got the dashboard displaying all relavent properties for indexers.
2013-02-27 05:24:45 +06:00
Shannon Deminick f7cfa507d7 fixed bug with attributes 2013-02-27 00:41:24 +06:00
Shannon Deminick 5df0013406 Merge with 6.0.1 2013-02-27 00:37:24 +06:00
Shannon Deminick 30d08bfae1 missing proj file update 2013-02-27 00:34:08 +06:00
Shannon Deminick b0ae03b220 publicly exposes the UmbracoAuthorizeAttribute for MVC and creates one for web api too. 2013-02-27 00:33:59 +06:00
Shannon Deminick ffb9849745 Merge 2013-02-27 00:20:50 +06:00
Shannon Deminick cc55107da3 Added method to WebSecurity to validate members, updated routes for umbraco api controllers 2013-02-27 00:19:48 +06:00
Stephan 6c4ee40b96 Core.Configuration - import infrastructure 2013-02-26 16:52:44 -01:00
Stephan c637c517b8 Web.Routing - better PublishedContentRequest support for redirect & status 2013-02-26 16:52:42 -01:00
Stephan cdf6249a41 Core - add some TypeExtensions 2013-02-28 20:10:47 -01:00
Stephan d9540bcfc5 Core - cleanup UriExtensions, create unit tests, make it public 2013-02-26 16:52:27 -01:00
Stephan aeb417d3d8 U4-1779 - Web.BaseRest supports rest extensions over multiple classes 2013-02-26 16:52:06 -01:00
Shannon Deminick bcfc7b2507 Adds UrlHelper extensions to get the url of any umbraco web api controller. Updates proj dependencies. 2013-02-26 23:13:32 +06:00
Shannon Deminick 7c32365bd3 moved web api controllers to namespace Umbraco.Web.WebApi and created web api member authorize attribute 2013-02-26 22:14:32 +06:00
Shannon Deminick bf6ba727a4 Merge with 6.0.1 2013-02-26 21:42:55 +06:00
Shannon Deminick 63159702e3 Implemented UmbracoApiController as a plugin and is auto routed 2013-02-26 03:45:39 +06:00
Shannon Deminick 545a873af2 added code comments 2013-02-26 02:28:22 +06:00
Shannon Deminick db268c6805 renamed to MemberAuthorizeAttribute and changed it to inherit from a AuthorizeAttribute as this happens much further up the chain than
the filter attribute and also contains the correct logic to ensure authorization always happens regardless of if the page is cached. Cleaned
up our other authorize attibutes.
2013-02-26 02:21:51 +06:00
Shannon Deminick 2967075c1f Merge 2013-02-26 01:27:48 +06:00
Shannon Deminick 4761e4bd43 Installs web api (nuget) 2013-02-26 01:23:58 +06:00
Shannon Deminick a27dccd0d9 Fix merge issue 2013-02-26 01:17:57 +06:00
Shannon Deminick 6b8bfc2e2d Manually applies fix for U4-1776 SafeAlias culture problem since the files/class structure has changed in 6.1 2013-02-26 01:13:31 +06:00
Shannon Deminick 5b15218174 Merge with 6.0.1 2013-02-26 01:05:36 +06:00
Shannon Deminick 894cfb2e85 update to examine details 2013-02-25 20:00:11 +06:00
Shannon Deminick 7deae8ea37 Update to latest examine (bug fixed), started Examine Management dashboard FF project. 2013-02-23 23:00:31 +06:00
Shannon Deminick 03aa7fd06b Fixes umbraco content service 2013-02-23 22:11:38 +06:00
Shannon Deminick 54ba547c8c Converted ~/Umbraco/MasterPages/Default.Master to use correct web forms code behind structure. 2013-02-23 03:20:05 +06:00
Shannon Deminick c1172b6823 Fixes issue with UmbracoContentService when getting all user property names 2013-02-23 01:59:21 +06:00
Shannon Deminick a91d531db2 Fixes very strange issue of FirstOrDefault not actually returning 'null' when it is actually null, never seen anything like it and
PropertyType is not a value type so should be null. real strange.
2013-02-23 01:50:04 +06:00
Shannon Deminick dd0d4e872f Merge with 6.0.1 2013-02-23 00:24:38 +06:00
Shannon Deminick 265fd6b91c Merge with 6.0.1 2013-02-23 00:19:05 +06:00
Shannon Deminick 038b4300ba Ensures plugin cache is cleared on install 2013-02-22 21:29:48 +06:00
Shannon Deminick 958d7940f2 Manually applies changes from 6.0.1 to installer files from revisions 8033aae62d4a, fdeca60cb2c1 2013-02-22 21:02:24 +06:00
Shannon Deminick a3f7ef7002 Merge with 6.0.1 2013-02-22 20:04:57 +06:00
Shannon Deminick 36eb340c11 Merge 2013-02-22 10:49:15 +06:00
Shannon Deminick aa929e8091 Merge with 6.0.1 2013-02-22 10:45:04 +06:00
Shannon Deminick 2ebfbd5d08 Fixed one test with merging 2013-02-22 10:34:43 +06:00
Shannon Deminick 567be2aecf Fixed up merge issues 2013-02-22 07:08:45 +06:00
Shannon Deminick 6a6ac99c34 Merge with 6.0.1 2013-02-22 06:58:44 +06:00
Stephan 03fc0c868c Core.Strings - fix more unit tests (resolvers init issues) 2013-02-21 16:53:25 -01:00
Shannon Deminick dced287c1c Merge with 6.0.1 2013-02-21 23:08:14 +06:00
Shannon Deminick bcd426092c Merge with 6.0.1 2013-02-21 22:52:49 +06:00
Shannon Deminick 62ed7e0a53 Merge with 6.0.1 2013-02-21 22:48:45 +06:00
Shannon Deminick 566986201f Changes ContentFinderByNiceUrlTests to not require a database by having an overloaded ctor param on
ContentFinderByNiceUrl to not require a domain lookup (up-ported from 6.0.x and 4.x logic). Changes
ContentFinderByAliasTests to not require a database by splitting the two tests, now there is also a
ContentFinderByAliasWithDomainsTests.
2013-02-21 22:32:44 +06:00
Shannon Deminick a9947cda48 Merge with 6.0.1 2013-02-21 22:22:23 +06:00
Shannon Deminick 271b0691e2 Fixed up merge 2013-02-21 21:33:21 +06:00
Shannon Deminick cf46df441a Merge with 6.0.1 2013-02-21 21:17:47 +06:00
Shannon Deminick aec017e933 Merge with 6.0.1 2013-02-21 20:07:18 +06:00
Shannon Deminick 3727ef54aa Commented out migration tests for 6.1 since we don't have any now that the servers stuff is commented out. 2013-02-21 08:19:07 +06:00
Shannon Deminick 5615f9590b Merge with 6.0.1 2013-02-21 06:18:45 +06:00
Shannon Deminick e084ddeb41 Fixed up some merge issues. 2013-02-21 06:14:01 +06:00
Shannon Deminick f8760b34b8 Merge with 6.0.1 2013-02-21 06:10:25 +06:00
Shannon Deminick 9d95c04ab6 Fixed #U4-814 and got all possible unit tests that were not working for DynamicNode but were working for
DynamicPublishedContent working.
2013-02-21 05:13:08 +06:00
Shannon Deminick 62c4713593 Changed logging in unit tests to filter out things we don't need to see 2013-02-21 03:13:16 +06:00
Shannon Deminick e3ef3dfb32 Fixes events test 2013-02-20 22:27:58 +06:00
Shannon Deminick 7509724e35 Comments out Server registration and db classes for now, we'll revisit this again soon for automatic
distributed cache without the need for xml. This code is nearly there to work in most classic implementations
of a load balanced site where each node has an internal DNS/Hostname entry. Needs some fine tuning but we'll release
this in a later version.
2013-02-20 21:55:02 +06:00
Shannon Deminick a41e32c068 un-commented out the sort order test for examine 2013-02-20 21:32:57 +06:00
Shannon Deminick 3baf326498 Merge 2013-02-20 21:31:33 +06:00
Shannon Deminick 8ea9627d51 Updated to Examine 1.45, Updated FixedDisplayModes to 1.0.1 2013-02-20 21:29:56 +06:00
Stephan 957feefb2e Tests.Routing - fix tests 2013-02-20 14:23:29 -01:00
Stephan 40b7659078 Tests.Routing, Web.Routing - more tests + fix wildcard domains 2013-02-20 08:51:41 -01:00
Stephan 0427ecc7f4 Tests.Routing - add tests for wildcard domains 2013-02-20 08:12:48 -01:00
Stephan 11560a5451 Test.Routing - more umbracoUrlAlias test 2013-02-20 06:47:07 -01:00
Shannon Deminick 5bef77c0fb Merge 2013-02-20 06:30:39 +06:00
Shannon Deminick 89b85bcf4b Fixed Render route handler tests. 2013-02-20 06:30:06 +06:00
Shannon Deminick 694d252ce5 Fixed base test classes to ensure that if/when an issue goes wrong removing the database file that the class can
continue to TearDown (or force a teardown if it is starting up)
2013-02-20 05:54:41 +06:00
Shannon Deminick 7efc06429c Fixes up index set extensions and now have the Sorting test working. PDF indexer tests working. 2013-02-20 05:01:40 +06:00
Shannon Deminick ad188fab70 More tests fixed. 2013-02-20 03:02:44 +06:00
Shannon Deminick b47f9e87f1 Fixed up merging and unit test structures so taht BaseWebTest uses BaseDatabaseFactoryTests.
Fixed up Examine unit test issues
2013-02-20 02:50:08 +06:00
Shannon Deminick dddc308167 Merge with 6.0.1 2013-02-20 00:44:04 +06:00
Shannon Deminick 5919dca5d5 Merge with 6.0.1 2013-02-19 22:15:16 +06:00
Stephan 7493426e25 Core.Strings - fix unit tests 2013-02-19 14:00:17 -01:00
Shannon Deminick 1733e876c4 Merge with 6.0.1 2013-02-19 20:19:43 +06:00
Shannon Deminick c958422317 Merge 2013-02-19 20:17:48 +06:00
Shannon Deminick 6a9277a712 Fixes: #U4-1537 2013-02-19 20:04:50 +06:00
Stephan 2d336fde73 Tests - cleanup settings handling for more reliable tests 2013-02-19 10:07:22 -01:00
Stephan ac3bec5d9e Web.Routing - refactor domains management 2013-02-19 06:37:25 -01:00
Stephan 7da60e9937 Web.Routing - sanitize DomainAndUri 2013-02-26 16:52:43 -01:00
Stephan eba5fc84c0 Web.Routing - refactor wildcard domains 2013-02-26 16:52:43 -01:00
Stephan 71d8736e7e Web.Routing - refactor & resharp 2013-02-19 06:37:25 -01:00
Stephan ae1ff4c39a Web.Routing - cleanup resolvers 2013-02-19 06:37:24 -01:00
Stephan f9f998e823 Core.Strings - refactor cms.helper.Casing 2013-02-26 18:12:22 -01:00
Stephan e10fc26729 Core.Strings - add arguments checks 2013-02-19 06:34:06 -01:00
Stephan 0d6999292c Core.Strings, Web.UI - refactor UI aliases management (3) 2013-02-19 06:30:19 -01:00
Stephan 3e7681d4d2 Core.Strings, Web.UI - refactor UI aliases management (2) 2013-02-19 06:29:59 -01:00
Stephan c838b8a381 Core.Strings - resharp 2013-02-19 06:27:13 -01:00
Stephan 96a279499b Core.Strings - supports allowUnderscoreInTerm in new DefaultShortStringHelper 2013-02-19 06:27:13 -01:00
Stephan a3f0b7a37f Core.Strings, Web.UI - refactor UI aliases management (1) 2013-02-19 06:26:58 -01:00
Shannon Deminick ec87b951d5 Fixes up merge issue. 2013-02-19 07:45:01 +06:00
Shannon Deminick 2e033b3bb6 Merge 2013-02-19 07:32:57 +06:00
Shannon Deminick d8721197b7 Fixes up pull request so that there is no breaking changes. We now type check for a new base class called
UmbracoControllerFactory to get the controller type. Adds SurfaceRouteHandler to ensure that UmbracoMvcHandler is used for all SurfaceControllers, and updates
all routes accordingly. Streamlines the RenderRouteHandler to then just look up surface routes in the route table
for posted values. This now ensures that UmbracoMvcHandler is used even with plugin surface controllers.
2013-02-19 07:30:46 +06:00
Shannon Deminick 4a05b0ea31 Merge with 6.0.1 2013-02-19 06:20:48 +06:00
Shannon Deminick 663fc4f954 Removes area routing for local surface controllers and BeginUmbracoForm, adds strongly typed Html.Action<T>
method for rendering SurfaceController child actions regardless of area (so you don't have to specify).
All relates to #U4-1727
2013-02-19 06:00:40 +06:00
Shannon Deminick 845595b01b Fixes: #U4-1727 2013-02-19 05:39:38 +06:00
Shannon Deminick 2fca8f3444 Fixes more examine initialization checks if the umbraco app is not ready/installed. 2013-02-19 05:06:54 +06:00
Shannon Deminick 9324ab8e0e Merge with 6.0.1 2013-02-19 04:11:30 +06:00
Shannon Deminick e6faf73f4f Fixes: #U4-552 2013-02-19 03:43:37 +06:00
Shannon Deminick 9f301f8cc6 updates some code docs 2013-02-19 02:20:15 +06:00
Shannon Deminick e7c5d1f4f3 Fixes: #U4-1695 2013-02-19 02:19:53 +06:00
Shannon Deminick 91ee948b4e Obsolete's requestModule and Singleton 2013-02-19 00:50:38 +06:00
Shannon Deminick c1ed910a51 Fixes: #U4-1732 2013-02-19 00:50:22 +06:00
Stephan 7414b3596e Core.Strings - fix some tests 2013-02-18 08:31:00 -01:00
Stephan a995c9557c Core.Strings - new IUrlSegmentProvider 2013-02-18 08:31:00 -01:00
Floris Robbemont 55f06a7ca6 Fixed issue: #U4-1726 2013-02-16 16:00:28 -01:00
Shannon Deminick e921dca9d6 Fixed up more unit tests and issue with publishing logic. 2013-02-15 20:53:44 +06:00
Shannon Deminick 9ad813d990 Fixes a couple issues with some routing tests. 2013-02-15 19:38:33 +06:00
Shannon Deminick 9fba3fa673 Fixes some resetting being done in test init... should only be done in teardown. 2013-02-15 19:23:16 +06:00
Shannon Deminick a00278892a Merge 2013-02-15 18:54:53 +06:00
Shannon Deminick 196357f6c3 WIP - getting sorting search test going. 2013-02-15 18:54:37 +06:00
Stephan 7a736344f9 Core.Strings - reorg StringExtensions (no change to code) 2013-02-15 08:42:08 -01:00
Stephan a36824e796 U4-1441 - fix, fix and fix! 2013-02-19 17:43:13 -01:00
Stephan 6e2dc64001 U4-1611 - bugfix 2013-02-19 13:58:16 -01:00
Shannon Deminick 68d5acbe48 Fix merge issue 2013-02-14 23:55:39 +06:00
Shannon Deminick a6b9ceef7b Merge with 6.0.1 2013-02-14 23:38:59 +06:00
Stephan 8de579083c U4-1611 - fix xpath special chars escaping issues in published content store 2013-02-14 16:23:56 -01:00
Stephan 6a6b82d1e8 U4-1441 - bugfix 2013-02-14 16:22:42 -01:00
Shannon Deminick ac090c05ae WIP - updating UmbracoExamine to fix sort order sorting. 2013-02-14 23:06:28 +06:00
Shannon Deminick 527ef10cda Fixes: #U4-1718 2013-02-14 23:05:58 +06:00
Shannon Deminick 766cf56a3f updated some copy is all and started creating a search test but need more info. 2013-02-14 06:33:48 +06:00
Shannon Deminick 73714c7cef Put legacy examine classes back in. 2013-02-14 06:06:54 +06:00
Shannon Deminick 0485c20331 Updated Examine.dll version with a few more fixes/updates. 2013-02-14 06:02:38 +06:00
Shannon Deminick d104ea1b57 Merge with 6.0.1 2013-02-14 02:37:23 +06:00
Shannon Deminick 41c952a2fa missing change 2013-02-14 02:36:56 +06:00
Shannon Deminick 6c09a58baf temp code 2013-02-14 02:36:32 +06:00
Shannon Deminick 8d2c5029af Merge 2013-02-13 06:14:04 +06:00
Shannon Deminick 8c97e367a2 Adds DatabaseServerRegistrar and ServerRegistrationEventHandler, we can now ensure that all server add themselves to the
database table automatically.
2013-02-13 06:12:43 +06:00
Shannon Deminick 6423914f01 Creates ServerRegistrationService 2013-02-13 04:22:46 +06:00
Shannon Deminick 3b25214433 Adds new database table + migration + unit test + fixes up unit tests to ensure PluginManager.Current = null; is done on teardown.
Created new ServerRegistrationRepository + unit tests + models
2013-02-13 03:29:32 +06:00
Morten Christensen 35a8c5e980 Merge 2013-02-12 12:49:00 -01:00
Morten Christensen 64031777d8 Corrects sorting in migrations 2013-02-12 12:48:47 -01:00
Shannon Deminick 102bf058bc Fixes failing unit tests due to adding check for if the application is configured and un-ignores a couple. 2013-02-12 18:59:07 +06:00
Shannon Deminick 7f51e01be7 Created strongly typed ICacheRefresher<T> so that now we can have cache refreshers execute against a
real instance object like IContent, this will dramatically increase performance for bulk publishing when not
in a load balanced environment. Updated methods on DistributedCache to refresh many instances at one time, this also
means we're not re-looking it back up again. Need to update media, users, templates, members and macros to use this new feature too.
2013-02-12 07:35:47 +06:00
Shannon Deminick cb3ac17f43 Ensures tree is synced on bulk publish, fixes Dimming on the content node. Starts adding ability to
make distributed calls that are strongly typed and can do more than one at a time.
2013-02-12 04:47:36 +06:00
Shannon Deminick 8dc5092763 Fixes: #U4-1697 - streamlines user cache invalidation/adds new UserCacheRefresher. 2013-02-12 04:13:29 +06:00
Shannon Deminick 4e6bdd1fc7 Fixed some med trust issues with UmbracoExamine. Created new framework for distributed cache providers with unit tests. Still uses the
old ICacheRefresher but now we can plugin 2 new providers - one for resolving a list of servers and the other to notify the servers of changes.
By default we have the configuration based providers which uses the umbracoSettings.
2013-02-12 03:46:27 +06:00
Shannon Deminick f741861014 WIP - refactored some of the lastest changes with publishing based on Morten's feedback. 2013-02-11 20:07:23 +06:00
Shannon Deminick 5e4a23ea84 Replaces all calls of Document.Publish to the lesser obsoleted method Document.SaveAndPublish which is what Publish was calling anyways. 2013-02-11 05:53:44 +06:00
Shannon Deminick ea54997bb7 Updates Document class to ensure that omitCacheRefresh is false for all unpublish operations. Removes all calls in the codebase
to library.UnPublishSingleNode as the logic will be automatically handled by events when un-publishing an item.
Obsoletes library calls - UnPublishSingleNode, UpdateDocumentCache since they are no longer needed to be called
explicitly, cache refreshing will happen automatically with event subscription.
2013-02-11 05:47:25 +06:00
Shannon Deminick da4f51fe2c Reviews all calls to library.RefreshContent(), adds notes where required and streamlines all library calls for
DistributedCache.Instance.RefreshAllPageCache();
2013-02-11 05:32:52 +06:00
Shannon Deminick fc9aa1d231 ensures all publishing occuring in Document class has 'false' set for omitcacherefresh. 2013-02-11 05:01:00 +06:00
Shannon Deminick ac43b40f33 Removes all remaining calls to library.UpdateDocumentCache ... this is handled automatically by events whenever a document is published. 2013-02-11 04:56:34 +06:00
Shannon Deminick 77201f3805 Fix merg issues. 2013-02-11 04:28:18 +06:00
Shannon Deminick 81f7754a45 Merge with 6.0.1 2013-02-11 04:18:33 +06:00
Shannon Deminick 2f9360ac08 Merge 2013-02-11 03:56:58 +06:00
Shannon Deminick c23be1fd96 Fixes #U4-414, #U4-1669 - publish dialog now uses new apis and ensures documents are validated during publishing. This also
enhances many other things in the publishing API including giving a status result for each item, ensuring that child items
do not try to get published when the parent item fails (based on a subset of rules)
2013-02-11 03:55:58 +06:00
Morten Christensen 1c7bb623f1 Implements the retrieval of ancestors, children, descendats and parent IMedia in the MediaService and as extensions to IMedia.
Corresponds to the IMedia implementation of U4-1638.
2013-02-09 11:12:51 -01:00
Morten Christensen 75de4e4e67 Implements the retrieval of ancestors, children, descendats and parent IContent in the ContentService and as extensions to IContent.
Corresponds to the IContent implementation of U4-1638.
2013-02-09 10:58:21 -01:00
Shannon Deminick ded940a757 Updates publishing strategy to allow for validating documents on publishing and reporting on that. Also depending on the
rules set, will not continue publishing it's children either. #U4-414
2013-02-09 06:23:51 +06:00
Shannon Deminick b80415b34e Fixes PublishingStrategy - It will still check if it's expired even if the event isn't cancelled. It now adheres
to some rules about publishing the children if a parent's publishing has failed or was cancelled. Have written unit
tests for these too.
2013-02-09 06:05:35 +06:00
Shannon Deminick 2ecc978591 Got publish strategy working to allow for publishing only descendants that have been previously published, or all descendants.
Added unit tests to support. Changed ServiceContext to accept a BasePublishingStrategy object as default and obsoleted the other
contructor... at least that interface should be easy to obsolete in favor of a base class.
2013-02-09 04:33:56 +06:00
Shannon Deminick de13f7e361 WIP ... Fixes: #U4-1666, Updates documentService to not have to manually
refresh content cache (and fix the unpublishing too since that logic wasn't correct)
Adds DebuggerDisplay support to ContentBase and Entity for better debugging info.
Adds new internal publishing methods to support publishing all children or only children previously published. This also adds new support
for getting a published result back even with bulk publishing.
Updates the publish dialog with new code and to use the new API based on issue #U4-1669.
Adds UmbracoUser property to AuthenticatedUmbracoController, Adds all common properties to the abstract UmbracoController.
Changes the legacy Document to allow content cache to be automatically refreshed (based on events)
2013-02-09 04:05:01 +06:00
abutland 0af4b3da82 Updated project file 2013-02-08 15:38:52 -01:00
abutland def651d98e Implemented an attribute for surface controllers to provide the restrictions to certain members as available in base. 2013-02-08 15:01:00 -01:00
Stephan a03f5420fa U4-1441 - change trySkipIisCustomError config key 2013-02-08 07:36:35 -01:00
Shannon Deminick 4ab14484ba Fixes: #U4-1664, #U4-1661, #U4-1662, #U4-1660
WIP - Updates much logic between editContent and ContentControl to ensure that the above issues are fixed and that we are not
double saving documents each time it is published. This also ensures that the Document.BeforeSave event is not double fired
when saving a document. Have changed over Document.SaveAndPublish to ensure that the cache does get refreshed automatically
when this is called - but now need to go through the rest of the codebase to make sure it's not being double refreshed. once that is
done then we will have streamlined the cache invalidation for content too.
Adds useful properties to the old BasePage like ApplicationContext, Services, etc...
2013-02-08 04:25:31 +06:00
Stephan a0f662c114 Core.Strings - refactor + new IShortStringHelper 2013-02-07 13:30:50 -01:00
Shannon Deminick 975d84f3d0 Started on streamlining Content cache invalidation. 2013-02-07 06:43:49 +06:00
Shannon Deminick c0b708b1f4 Streamlines how Media cache gets invalidated - ensures Save() is called on media where it was needed,
cache now gets invalidated on events.
2013-02-07 05:53:59 +06:00
Shannon Deminick d93ca26181 Streamlines how Template cache gets invalidated - ensures Save() is called on templates where it was needed,
cache now gets invalidated on events.
2013-02-07 05:26:53 +06:00
Shannon Deminick cf8a0728d8 Streamlines how Member cache data gets invalidated 2013-02-07 04:57:44 +06:00
Shannon Deminick ea24e43c90 Changed cache invalidation for macros to be done via events not inline in the editor. 2013-02-07 04:45:05 +06:00
Shannon Deminick 75e747a2d2 Simplifies clearing cache for macro's all is done via the DistributedCache.Instance - hopefully all cache will be invalidated
via this method so that all cache types are simply invalidated with ICacheRefreshers and ApplicationEventHandlers. Currently we
have calls to clear cache in zillions of places and its near impossible to tell where/when it currently happens.
2013-02-07 04:26:48 +06:00
Shannon Deminick be398a4616 Adds a constant id for the macro distributed cache object,
adds extension method to DistrubutedCache to refresh the macro cache,
Changes all distrubuted cache calls for macro to use extension method.
2013-02-07 04:04:51 +06:00
Shannon Deminick 84bd89f00b Adds a constant id for the media distributed cache object,
adds extension method to DistrubutedCache to refresh the media cache,
Changes all distrubuted cache calls for media to use extension method.
2013-02-07 04:01:50 +06:00
Shannon Deminick a1c2352dca Adds a constant id for the member distributed cache object,
adds extension method to DistrubutedCache to refresh the member cache,
Changes all distrubuted cache calls for members to use extension method.
2013-02-07 03:58:47 +06:00
Shannon Deminick b6ec42334b Adds a constant id for the page distributed cache object, adds extension method to DistrubutedCache to refresh the page cache,
Changes all distrubuted cache calls for pages to use extension method.
2013-02-07 03:55:14 +06:00
Shannon Deminick 56fb570267 Adds a constant id for the template distributed cache object, adds extension method to DistrubutedCache to refresh the template cache,
Changes all distrubuted cache calls for templates to use extension method.
2013-02-07 03:49:45 +06:00
Shannon Deminick 510d8b9dda Ensures that all calls to 'dispatcher' are replaced with the new DistributedCache.Instance object. 2013-02-07 03:29:47 +06:00
Shannon Deminick d8e4895daa Moved legacy classes into single file LegacyClasses.cs 2013-02-07 03:24:32 +06:00
Shannon Deminick c20cd907b0 Migrated CacheRefresher and dispatcher to proper namespaces and cleaned up a bit. 2013-02-07 03:22:38 +06:00
Shannon Deminick c72b4f40bd Ensures Examine events is listening to the Trashed of content too with the new API. 2013-02-07 02:23:40 +06:00
Shannon Deminick f8d09a9ac3 Adds patch fixes for #U4-1653 2013-02-07 02:19:51 +06:00
Morten Christensen a399a8766d Correcting the order of calls in the test SetUp of StronglyTypedQueryTests 2013-02-06 12:53:47 -01:00
Morten Christensen 7f103724f3 Refactoring PetaPoco uses of ExecuteNon, ExecuteScalar and ExecuteReader to use the new WithRetry extension methods 2013-02-06 12:53:08 -01:00
Morten Christensen 98ecf0e824 Adding package config file for umbraco.webservices proj 2013-02-06 10:37:32 -01:00
Morten Christensen 5fb11a77e7 Adding Mvc 4 as a nuget reference in the umbraco.webservices proj to get it to build. 2013-02-06 10:35:59 -01:00
Morten Christensen d7c72dc279 Merge with 6.0.1 2013-02-06 09:52:28 -01:00
Morten Christensen 2c8c88e4b8 Merge 2013-02-06 07:31:44 -01:00
Shannon Deminick 9f7347a4f5 Updated LazyManyObjectsResolverBase to support removal. Moves cache refreshers to proper namespace and obsoletes old ones. Obsoletes
a couple of library cache clearing methods and moves them to CacheHelperExtensions. Fixes #U4-1653 for 6.1 and updates ExamineEvents to
ensure that Examine re-indexes media on all of the correct events (including Trashed). Changes for Caching are being done to begin work with
CD-148
2013-02-06 09:53:13 +06:00
Shannon Deminick 13e5590efa Obsoleted methods in old Casing class and redirects to use StringExtensions. Removes eroneous webforms files not needed in the Umbraco.Web prject
(didn't convert the related UI project ones to have code behinds though... one thing at a time and there's a lot of them to do... over time)
2013-02-06 05:56:49 +06:00
Shannon Deminick 77bffa69fd Couple more changes to DynamicXml 2013-02-06 03:58:53 +06:00
Shannon Deminick 763f8796e0 Merge 2013-02-06 03:37:38 +06:00
Shannon Deminick 3be13f57cf un-breaks #U4-1636 - now we have some different ways to return the raw xml values. will post on the issue. 2013-02-06 03:37:28 +06:00
Morten Christensen 31a5363387 Adding fault handling extensions for IDbCommand.
Adding unit tests to verify retry strategies.
Adding a RetryPolicy factory for our standard configuration.
2013-02-05 14:31:55 -01:00
Morten Christensen ef20f228ec Correcting issue related to MediaXmlTest, which was fixed in v6. 2013-02-05 09:13:21 -01:00
Morten Christensen bc08feaa08 Merge 2013-02-05 07:25:41 -01:00
Stephan ef9ce720b2 Web.PublishedCache - create, migrate 2013-02-05 06:31:13 -01:00
Stephan 4c3d2c10ac Web.Routing - clear convoluted .RoutingContext.UmbracoContext.RoutingContext 2013-03-19 17:38:18 -01:00
Stephan 0db781b59f Web.Routing - fix configuration default 2013-03-19 17:37:35 -01:00
Stephan c94eb4328f Core.Xml - document + public XPathVariable 2013-03-19 17:34:28 -01:00
Shannon Deminick 47ab187780 Obsoletes base pages - umbraco.BasePage, etc... which is superceded by Umbraco.Web.UI.Pages classes 2013-02-05 06:05:57 +06:00
Shannon Deminick 020cc54da7 Obsoleted old ping.aspx class, changed the ping.aspx page to not actually have an inherited class. 2013-02-05 06:01:41 +06:00
Shannon Deminick dd0a18cf5b Removed ~/Umbraco/test.aspx - this literally didn't do anything, was never referenced anywhere and threw YSODs when the button was clicked. 2013-02-05 05:51:51 +06:00
Shannon Deminick f726ec740a Converted Umbraco.aspx, TreeInit.aspx to have proper web forms classes and obsoletes old ones.
Obsoletes umbWindow class as its not used in the codebase whatsoever.
2013-02-05 05:43:38 +06:00
Shannon Deminick db79b95d22 Fixes a bunch more unit tests due to resolution issues. 2013-02-05 05:08:43 +06:00
Shannon Deminick bac2b7643f Moves UmbracoUserControl to it's correct home and obsoletes the old one (even though its really new)
Publicizes UmbracoControl.
2013-02-05 05:00:16 +06:00
Shannon Deminick 11449688ba Fixes: #U4-1636 - We still use DynamicXml but we don't make a call to StripDashesInElementOrAttributeNames before creating the DynamicXml object, instead the
DynamicXml object itself will test whether the stripped values match or not. Have updated/created unit tests to confirm this functionality.
2013-02-05 04:29:01 +06:00
Shannon Deminick b080ebf697 Fixes failing unit tests due to not resetting Resolution before resetting the actual resolver classes. Now it is automatically impllied that
when you Reset a resolver class, Resolution is un-frozen.
2013-02-05 03:10:01 +06:00
Stephan 0b0784d40c U4-1441 - fix NotFoundHandler assembly loading 2013-02-04 16:10:43 -01:00
Stephan bfb36cac7c U4-1441 - fix issue with IIS taking over custom errors 2013-02-04 16:10:43 -01:00
Morten Christensen dd2a1207f4 Merge 2013-02-04 13:37:44 -01:00
Shannon Deminick 58b3ce749e Fixed Skinning step to point to correct user control 2013-02-04 20:23:57 +06:00
Morten Christensen 6c693ff7b1 Adding fault handling for sql connections, so we have a retry strategy in place. 2013-02-04 13:21:46 -01:00
Stephan 95df864d01 U4-1441 - refactor (fix) legacy NotFoundHandler support 2013-02-03 14:34:04 -01:00
Stephan eaa36a248c datalayer - remove mess introduced in f312bd7ee03b 2013-02-05 14:36:56 -01:00
Shannon Deminick ca7fe6854b Moved all old installer legacy classes into single files called LegacyFiles... much less clutter in the old legacy folders. 2013-02-03 05:16:42 +06:00
Shannon Deminick 1be3af1e31 Working on #U4-1358 - moving Base page classes to their correct location/assembly. Migrated all installation webforms files and associated helper files to
their correct locations/namespaces/assemblies and obsoleted all of the old ones and ensure the old webforms files don't exist where the obsoleted ones were.
Fixes a security issue with the installer ajax service (used to be p.aspx, now is InstallerRestService.aspx)
2013-02-03 05:06:11 +06:00
Stephan b8bcb3820a Web.Routing - if setting template fails, keep the previous one 2013-02-02 13:29:02 -01:00
Stephan 571849f211 Tests.Routing - fix RenderRouteHandlerTests 2013-02-07 20:27:46 -01:00
Stephan c8bcbdb3e1 U4-1441 - improve logging 2013-02-07 19:24:33 -01:00
Stephan 32c187f023 U4-1441 - make trySkipIisCustomError value a setting 2013-02-07 13:30:06 -01:00
Stephan dda9519e5e Core.Models - fix typo in Template 2013-02-06 13:33:04 -01:00
Stephan 91ff702cf2 Core.IO - add 'verify' methods to complement 'validate' methods 2013-02-06 13:25:27 -01:00
Stephan f7f269aa79 Core.Resolution - minor doc + renaming (being picky...) 2013-02-06 13:03:44 -01:00
Shannon Deminick 0d34b203d5 Merge 2013-02-02 07:06:51 +06:00
Shannon Deminick 34975183d2 Changed PublishedContentHelper to use 6.0 APIs instead of relying on the WebBootManager hack to set a delegate.
Fixed up a heap of failing unit tests.
2013-02-02 07:06:27 +06:00
Shannon Deminick 545a156942 Got most of #U4-1503 - External UmbracoExamine libraries built separately from the web app with the Build.bat command. Now
just need to get the output zipped up and then create some Nuget packages with dependencies.
2013-02-02 06:08:14 +06:00
Paul@PaulSony f9d5b28372 Updates to WPI XML paramters and manifest, handles connectionStrings 2013-02-02 06:21:20 +08:00
Shannon Deminick 8df7812165 Adds Examine xslt extensions to config by default. 2013-02-02 03:49:16 +06:00
Shannon Deminick d1ac2f11d1 Fixed naming conventions: TypedContentAtRoot and TypedMediaAtRoot instead of TypedContentsAtRoot and TypedMediasAtRoot. 2013-02-02 03:22:30 +06:00
Shannon Deminick 5d681c18fe Converted UmbracoExamine UmbracoContentService to use new data APIs and added a unit test for one of the converted methods. 2013-02-02 03:21:06 +06:00
Shannon Deminick a66d651c07 Converted over other IApplicationEventHandlers to use the simpler ApplicationEventHandler 2013-02-02 02:43:02 +06:00
Shannon Deminick e541995e01 Fixes: #U4-1623 and changes over ExamineEvents to use ApplicationEventHandler instead of IApplicationEventHandler. 2013-02-02 02:38:39 +06:00
Shannon Deminick 6ee17dad03 Updated configs to ensure that the correct (non-obsoleted) config section definition is used for Examine.
Updates Examine index configs to be simplified, don't need all of that config there!
Updates UmbracoExamine indexers to not initialize if the app/database is not ready.
Updates Examine event binders to not bind if the app/database is not ready.
Updates Examine events to use new 6.0+ events and removes binding entirely to the old api events (where we could)
2013-02-02 02:16:44 +06:00
Shannon Deminick e8d924cd2c Merge with 6.0.1 2013-02-01 19:43:10 +06:00
Stephan fa2ea78bda Fix build after merge 2013-02-01 10:47:53 -01:00
Stephan 1989a44d4f Web.UmbracoHelper - add ContentAtRoot, MediaAtRoot methods 2013-02-01 06:28:54 -01:00
Shannon Deminick 6b3de00e08 Merge with 6.0.1 2013-02-01 06:52:27 +06:00
Sebastiaan Janssen 777d397ae7 Merge with 6.0.0 2013-01-31 14:07:05 -01:00
Stephan 8b00e72bf6 Web.Routing - refactor url providing (U4-1321...) + new IUrlProvider 2013-01-31 10:06:25 -01:00
Stephan 56281d64b0 Tests.Routing - fix tests that were failing
due to Models.ITemplate, Resolution, database constraints...
2013-01-30 14:46:38 -01:00
Stephan 024a4ed8d0 Tests.Resolvers - add tests to ManyResolver 2013-02-02 10:34:20 -01:00
Stephan 789927a043 Web.Routing - fix resolvers naming 2013-02-02 10:22:19 -01:00
Stephan cc0ad0b089 Web.Routing - PublishedContentRequest template naming 2013-02-05 06:37:36 -01:00
Stephan a94f3b6211 Web - RoutesCache belongs to RoutingContext 2013-01-30 14:45:13 -01:00
Stephan 1340cc0b2e Web.Routing - published content request Is404 visibility 2013-01-30 14:45:11 -01:00
Stephan c8aedb381b Core.ObjectsResolution - add insert at beginning of list in many resolver 2013-01-30 14:45:08 -01:00
Stephan 64692e0041 Fix build after merge 2013-01-29 19:10:58 -01:00
Stephan f1039a18e4 Merge with 6.0.1 2013-01-29 18:51:58 -01:00
Stephan 23b6cf1c24 fix build after merge 2013-01-29 08:27:03 -01:00
Stephan 09f50da821 Web.Routing - migrate to Models.ITemplate, cleanup template logic 2013-01-28 18:36:58 -01:00
Stephan 5110e0ec0e Web.Routing - go public 2013-01-24 08:51:27 -01:00
Stephan edb84b3c97 Core.Strings - go public 2013-02-19 06:37:24 -01:00
Stephan 197ab6357f Web.Routing - expose PublishedContentRequest.Template as a string 2013-01-24 08:51:27 -01:00
Stephan b3e3855931 Core.ObjectsResolution - cleanup 2013-01-23 16:44:38 -01:00
Stephan f466bc7cfb Web.Routing - cleanup PublishedContentRequest 2013-01-23 14:08:17 -01:00
Stephan b77521cbc5 Web.Routing - cleanup template / rendering engine lookup 2013-01-23 14:08:15 -01:00
Stephan 58b91fe6a0 Web.Routing - reorganize finders for better backward compat. with pre-4.10 2013-01-23 14:08:14 -01:00
Stephan a95fbff597 Core.ObjectsResolution - create temp. dirty access to resolution for legacy code 2013-01-23 14:08:13 -01:00
Stephan 80ee18ee95 Core.ObjectsResolution - add unit tests 2013-01-23 14:07:02 -01:00
Stephan 6146a0576c Core.ObjectsResolution - add unit tests, fix some bugs 2013-01-23 09:41:01 -01:00
Stephan 73df3ec0de Tests.Routing - get all tests to pass 2013-01-23 09:41:00 -01:00
Stephan d24e4834aa datalayer - bugfix SqlCE dababase clear & initialize 2013-01-23 09:41:00 -01:00
Stephan 38593ea36c Tests.Routing - rename some tests 2013-01-23 09:41:00 -01:00
Stephan 1b232f3214 Web.Routing - remove some unused legacy code 2013-01-18 16:08:01 -01:00
Stephan aa1ded5f1a Web.Routing - backward compatibility with legacy NotFoundHandler 2013-01-18 14:03:11 -01:00
Stephan e5a20f0c1b Web.Routing - rename things 2013-01-18 13:20:08 -01:00
Stephan 9d701cabf6 Web.Routing - sanitize PublishedContentRequest & pipeline 2013-01-18 13:13:06 -01:00
Stephan c6c522da04 Web.Routing - begin sanitizing PublishedContentRequest 2013-01-16 15:01:43 -01:00
Stephan 2251f39fcf Web.Routing - naming & cleanup, prepare for going public 2013-01-16 14:45:04 -01:00
Stephan 01b4e8d59c Core.ObjectsResolution - refactor, cleanup, sanitize, ensure we properly freeze 2013-01-16 13:31:04 -01:00
Stephan bfd8e96f71 Core.ObjectsResolution - cleanup + start making things public 2013-01-16 13:10:34 -01:00
Stephan e7b84b1637 Merge with 6.0.1 2013-01-29 06:46:07 -01:00
Stephan b8ac74a05d fix merges 2013-01-28 09:02:28 -01:00
Stephan 38624b1e59 fix build 2013-01-27 18:34:16 -01:00
Stephan a699d9e1de merge from 6.0.1 2013-01-27 16:02:59 -01:00
Shannon Deminick cda7a66ec8 updated 6.1 with the correct ExamineEvents class ... issue after up-merging from 6.0 2013-01-25 06:32:00 +03:00
Shannon Deminick 36a5313336 Merge with 6.0.0 2013-01-25 06:19:14 +03:00
Shannon Deminick fedcdcfcd5 Manually re-merged latest changes to ContentExtensions from 6.0 branch to include changes to check for
UseLegacyXmlSchema
2013-01-23 19:00:28 +03:00
Shannon Deminick 11964401c8 Merge 2013-01-23 18:54:42 +03:00
Shannon Deminick 48202cfa09 Merge with 6.0.0 2013-01-23 18:50:44 +03:00
Stephan 8cac3e9c5c merge with 6.0.0 2013-01-23 09:37:40 -01:00
Stephan 25c481b3ca merge with 6.0.0 2013-01-23 09:33:26 -01:00
Adam Nelson 41258104f6 U4-497 - Razor errors should be completely silent when UmbracoDebug=false.
Modified implementation to have a single global setting in UmbracoSettings.config
which can now be overridden when the umbraco.macro.Error event is handled on a
per-macro basis if desired.
2013-01-16 00:45:18 -11:00
Adam Nelson 08a8e6b816 U4-497 : Razor errors should be completely silent when UmbracoDebug=false.
Optionally requires macroErrors.config to define macro error behaviour.
See http://issues.umbraco.org/issue/U4-497.
2013-01-14 00:48:54 -11:00
Shannon Deminick 6b254e1a20 Merge with 6.0.0 2013-01-07 16:42:27 +03:00
Shannon Deminick a00ceb24e1 Merge with 6.0.0 2013-01-07 04:46:34 +03:00
Shannon Deminick c587632ea0 Adds UmbracoExamine.PDF.Azure library 2013-01-07 04:45:23 +03:00
Shannon Deminick 8f2c662f27 Adds Examine.Azure and required nuget dependencies. 2013-01-07 03:06:33 +03:00
Shannon Deminick dc06e303fc Updated to new Examine version on MyGet, should fix build errors 2013-01-06 02:46:19 +03:00
Shannon Deminick dbf38fbeb8 Changed BaseWebTest to use same logic as BaseDatabaseFactoryTests since we need the ServiceContext now. Fixed a bunch of failing tests... still have some more to fix though. 2013-01-05 23:36:38 +03:00
Shannon Deminick 97ffed5ee7 Changes the web.config template over to use the correct (non-obsoleted) examine classes. These have been obsolete for quite some time
and no longer exist in the new UmbracoExamine codebase. This is a 'breaking' change however it only requres a config file update when upgrading.
2013-01-05 22:48:45 +03:00
Shannon Deminick 8b49d2d377 Removes all MyGet dependencies for UmbracoExamine (since it is in the core now).
Converts UmbracoContextService and UmbracoMediaService for UmbracoExamine to use the new data api's
to extract latest data. Currently had to hack a bit with a new class called LegacyLibrary because at the moment
we'll have a circular dependency with Umbraco.Web which needs to be fixed. Moves all Examine event management to
Umbraco.Web (again mainly because of circular dependencies, but makes sense to have it there). Fixes the ExamineEvents
to implement IApplicationEventHandler instead of IApplicationStartupHandler to ensure that all resolvers have been
initialized before attempting to initialize examine indexes. Updates Examine ILogService to use the LogHelper.
Adds some new ContentExtensions for IMedia since currently Examine needs xml structures, but have kept it internal.
2013-01-05 22:46:50 +03:00
Shannon Deminick 6513097d38 Added UmbracoExamine.PDF library and unit tests. 2013-01-05 04:43:15 +03:00
Shannon Deminick d1bf2c0ad7 More unit tests ported over for UmbracoExamine 2013-01-05 04:20:25 +03:00
Shannon Deminick 59152cbe80 Started migrating over unit tests for UmbracoExamine 2013-01-05 03:28:47 +03:00
Shannon Deminick 027f76af96 Working on #U4-1356 - Moving UmbracoExamine to core 2013-01-05 03:01:29 +03:00
Shannon Deminick eece4c194a Creating 6.1.0 branch 2013-01-04 05:50:00 +03:00
1431 changed files with 79265 additions and 33129 deletions
+86
View File
@@ -0,0 +1,86 @@
*.obj
*.pdb
*.user
*.aps
*.pch
*.vspscc
[Bb]in
[Db]ebug*/
obj/
[Rr]elease*/
_ReSharper*/
_NCrunch_*/
*.ncrunchsolution
*.ncrunchsolution.user
*.ncrunchproject
*.crunchsolution.cache
[Tt]est[Rr]esult*
[Bb]uild[Ll]og.*
*.[Pp]ublish.xml
*.suo
[sS]ource
[sS]andbox
umbraco.config
*.vs10x
App_Data/TEMP/*
[Uu]mbraco/[Pp]resentation/[Uu]mbraco/[Pp]lugins/*
[Uu]mbraco/[Pp]resentation/[Uu]ser[Cc]ontrols/*
[Uu]mbraco/[Pp]resentation/[Ss]cripts/*
[Uu]mbraco/[Pp]resentation/[Ff]onts/*
[Uu]mbraco/[Pp]resentation/[Cc]ss/*
src/Umbraco.Web.UI/[Cc]ss/*
src/Umbraco.Web.UI/App_Code/*
src/Umbraco.Web.UI/App_Data/*
src/Umbraco.Tests/App_Data/*
src/Umbraco.Web.UI/[Mm]edia/*
src/Umbraco.Web.UI/[Mm]aster[Pp]ages/*
src/Umbraco.Web.UI/[Mm]acro[Ss]cripts/*
src/Umbraco.Web.UI/[Xx]slt/*
src/Umbraco.Web.UI/[Ii]mages/*
src/Umbraco.Web.UI/[Ss]cripts/*
src/Umbraco.Web.UI/Web.*.config.transformed
umbraco/presentation/umbraco/plugins/uComponents/uComponentsInstaller.ascx
umbraco/presentation/packages/uComponents/MultiNodePicker/CustomTreeService.asmx
_BuildOutput/*
build/UmbracoCms.AllBinaries*zip
build/UmbracoCms.WebPI*zip
build/UmbracoCms*zip
build/*.nupkg
src/Umbraco.Tests/config/applications.config
src/Umbraco.Tests/config/trees.config
src/Umbraco.Web.UI/web.config
*.orig
src/Umbraco.Tests/config/404handlers.config
src/Umbraco.Web.UI/[Vv]iews/*.cshtml
src/Umbraco.Web.UI/[Vv]iews/*.vbhtml
src/Umbraco.Tests/[Cc]onfig/umbracoSettings.config
src/Umbraco.Web.UI/[Vv]iews/*
src/packages/
src/packages/repositories.config
src/Umbraco.Web.UI/[Ww]eb.config
*.transformed
webpihash.txt
node_modules
src/Umbraco.Web.UI/[Uu]mbraco/[Ll]ib/*
src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/umbraco.*
src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/routes.js
src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/main.js
src/Umbraco.Web.UI/[Uu]mbraco/[Jj]s/app.js
src/Umbraco.Web.UI/[Uu]mbraco/[Vv]iews/**/*.js
src/Umbraco.Web.UI/[Uu]mbraco/[Vv]iews/**/*.css
src/Umbraco.Web.UI/[Uu]mbraco/[Vv]iews/**/*.html
src/Umbraco.Web.UI/[Uu]mbraco/[Aa]ssets/*
src/Umbraco.Web.UI.Client/[Bb]uild/*
src/Umbraco.Web.UI.Client/[Bb]uild/[Bb]elle/
src/Umbraco.Web.UI/[Uu]ser[Cc]ontrols/
build/_BuildOutput/
tools/NDepend/
src/*.vspx
src/*.psess
NDependOut/*
QueryResult.htm
*.ndproj
-70
View File
@@ -1,70 +0,0 @@
syntax: regexp
^src/packages/(?!repositories.config$)
web.Template.[a-zA-Z0-9]*.Debug.config
syntax: glob
*.obj
*.pdb
*.user
*.aps
*.pch
*.vspscc
[Bb]in
[Db]ebug*/
obj/
[Rr]elease*/
_ReSharper*/
_NCrunch_*/
*.ncrunchsolution
*.ncrunchsolution.user
*.ncrunchproject
*.crunchsolution.cache
[Tt]est[Rr]esult*
[Bb]uild[Ll]og.*
*.[Pp]ublish.xml
*.suo
[sS]ource
[sS]andbox
umbraco.config
*.vs10x
App_Data\TEMP\*
umbraco\presentation\umbraco\plugins\*
umbraco\presentation\usercontrols\*
umbraco\presentation\scripts\*
umbraco\presentation\fonts\*
umbraco\presentation\css\*
src\Umbraco.Web.UI\[Cc]ss\*
src\Umbraco.Web.UI\App_Code\*
src\Umbraco.Web.UI\App_Data\*
src\Umbraco.Tests\App_Data\*
src\Umbraco.Web.UI\[Mm]edia\*
src\Umbraco.Web.UI\[Mm]aster[Pp]ages\*
src\Umbraco.Web.UI\[Mm]acro[Ss]cripts\*
src\Umbraco.Web.UI\[Xx]slt\*
src\Umbraco.Web.UI\[Ii]mages\*
src\Umbraco.Web.UI\[Ss]cripts\*
src\Umbraco.Web.UI\Web.*.config.transformed
umbraco\presentation\umbraco\plugins\uComponents\uComponentsInstaller.ascx
umbraco\presentation\packages\uComponents\MultiNodePicker\CustomTreeService.asmx
_BuildOutput/*
*.ncrunchsolution
build/UmbracoCms.AllBinaries*zip
build/UmbracoCms.WebPI*zip
build/UmbracoCms*zip
build/*.nupkg
src/Umbraco.Tests/config/applications.config
src/Umbraco.Tests/config/trees.config
src/Umbraco.Web.UI/web.config
*.orig
src/Umbraco.Tests/config/404handlers.config
src/Umbraco.Web.UI/Views/*.cshtml
src/Umbraco.Web.UI/Views/*.vbhtml
src/Umbraco.Tests/config/umbracoSettings.config
src/Umbraco.Web.UI/App_Plugins/*
src/Umbraco.Web.UI/Views/*
src/packages/
src\Umbraco.Web.UI\[W]eb.config
*.transformed
-31
View File
@@ -1,31 +0,0 @@
d0aba247db91d1b70c39c6397b965ca370a67497 Sprint-Juno-A
0b8f67be2ca8faf008151d87f232c698de69e735 Release-4.5.0
5960c073250926d202861a09472f5f334da6e283 Sprint-Juno-B
f15d4ff81a8368e9d42788f7e0ae726f7a70a3b1 Release-4.0.3
283065df4d3c27245267709dd2644a479c4f62a5 Release-4.0.4.2
ffc34b23e1a03785e4098afa4290d8c03cf10115 Release-4.5.2
d03fcffb8834a9583a56813bb44b6abbd9f042cc Release-4.6.0
1809f7b2593270c192cd47bdcfdb392100686f79 4.7.2
488779dec0ceb1d2874bcef906241b919325c904 4.8.0-beta
096f20bb0575d6199f20fcb3147b63554e765a74 Release-4.8.0
8f8a203857886b373148af29edd57460a42940be Release-4.8.1
de73e687ddf6086ed52b6554676c1632865d07f2 Release-4.9.0
8d7d8609e2e4b971da99cd97f72132ce85ce3333 Release-4.9.1
f6da531fbb4c251ff61d314e2a7effb13c71e74a Release-4.10.0
20e4dff821d8ac2527a5353618fa1a23ea1d8b34 Release-4.11.0
7f827760cb49d749616859f528d19dde64807947 Release-4.11.1
7f827760cb49d749616859f528d19dde64807947 Release-4.11.1
6eb5f2fb5a88aa29ea544499df9160a1b31b5638 Release-4.11.1
73711b806a4044dbf0d7d7c095ddfdda23b09932 4.11.2
73711b806a4044dbf0d7d7c095ddfdda23b09932 4.11.2
0000000000000000000000000000000000000000 4.11.2
73711b806a4044dbf0d7d7c095ddfdda23b09932 Release-4.11.2
77db220b89e166b3c0736ed321ecfd6416cddbcd Release-4.11.2.1
54cde33b809dcb3a1f7e7ae0d5375f6dd0d89c8d Release-4.11.2.2
ff3bb24ea0c915878396a6ae27f1ff164e8ac150 Release-6.0.0-beta
56015ac26f5ab60e3c61b1d09075297b660afa07 Release-6.0.0-RC
1719fbd857f28b376639ac2aa0abada0ef2e7560 Release-6.0.0
e02f5aebb87e3f07d27376647756caa9762931d8 Release-4.11.4
14338b0ab1738fbd8987677ecdb9a73d79fc229d release-4.11.6
b247b35d821144849f551e02da8ba719f91d5fb0 Release-6.0.2
aed55cba29009ad3db48880a7cfb66407ce9805f release-6.0.3
+9
View File
@@ -0,0 +1,9 @@
# The MIT License (MIT) #
Copyright (c) 2013 Umbraco
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+33
View File
@@ -0,0 +1,33 @@
Umbraco CMS
===========
## Watch a five minute introduction video ##
[![ScreenShot](http://umbraco.com/images/whatisumbraco.png)](http://umbraco.org/help-and-support/video-tutorials/getting-started/what-is-umbraco)
## Umbraco - the simple, flexible and friendly ASP.NET CMS ##
**More than 177,000 sites trust Umbraco**
For the first time on the Microsoft platform a free user and developer friendly CMS that makes it quick and easy to create websites - or a breeze to build complex web applications. Umbraco has award-winning integration capabilities and supports ASP.NET MVC or Web Forms, including User and Custom Controls, out of the box. It's a developers dream and your users will love it too.
Used by more than 177,000 active websites including [http://daviscup.com](http://daviscup.com), [http://heinz.com](http://heinz.com), [http://peugeot.com](http://peugeot.com), [http://www.hersheys.com/](http://www.hersheys.com/) and **The Official ASP.NET and IIS.NET website from Microsoft** ([http://asp.net](http://asp.net) / [http://iis.net](http://iis.net)) you can be sure that the technology is proven, stable and scales.
To view more examples please visit [http://umbraco.com/why-umbraco/#caseStudies](http://umbraco.com/why-umbraco/#caseStudies)
## Downloading ##
The downloadable Umbraco releases live at [http://our.umbraco.org/download](http://our.umbraco.org/download).
## Forums ##
We have a forum running on [http://our.umbraco.org](http://our.umbraco.org). The discussions group on [Google Groups](https://groups.google.com/forum/#!forum/umbraco-dev) is for discussions on developing the core, and not on Umbraco-implementations or extensions in general. For those topics, please use [http://our.umbraco.org](http://our.umbraco.org).
## Contribute to Umbraco ##
If you want to contribute back to Umbraco you should check out our [guide to contributing](http://our.umbraco.org/contribute).
## Found a bug? ##
Another way you can contribute to Umbraco is by providing issue reports, for information on how to submit an issue report refer to our [online guide for reporting issues](http://our.umbraco.org/contribute/report-an-issue-or-request-a-feature).
To view existing issues please visit [http://issues.umbraco.org](http://issues.umbraco.org)
+3 -1
View File
@@ -1,10 +1,12 @@
@ECHO OFF
SET release=6.0.4
SET release=6.1.6
SET comment=
SET version=%release%
IF [%comment%] EQU [] (SET version=%release%) ELSE (SET version=%release%-%comment%)
ReplaceIISExpressPortNumber.exe ..\src\Umbraco.Web.UI\Umbraco.Web.UI.csproj %release%
%windir%\Microsoft.NET\Framework\v4.0.30319\msbuild.exe "Build.proj" /p:BUILD_RELEASE=%release% /p:BUILD_COMMENT=%comment%
echo This file is only here so that the containing folder will be included in the NuGet package, it is safe to delete. > .\_BuildOutput\WebApp\App_Code\dummy.txt
+217 -147
View File
@@ -1,19 +1,19 @@
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<!--
<!--
****************************************************
INCLUDES
*****************************************************
-->
<PropertyGroup>
<MSBuildCommunityTasksPath>..\MSBuildCommunityTasks</MSBuildCommunityTasksPath>
<UmbracoMSBuildTasksPath>..\UmbracoMSBuildTasks</UmbracoMSBuildTasksPath>
</PropertyGroup>
<Import Project="..\tools\UmbracoMSBuildTasks\Umbraco.MSBuild.Tasks.Targets" />
<Import Project="..\tools\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets" />
<PropertyGroup>
<MSBuildCommunityTasksPath>..\MSBuildCommunityTasks</MSBuildCommunityTasksPath>
<UmbracoMSBuildTasksPath>..\UmbracoMSBuildTasks</UmbracoMSBuildTasksPath>
</PropertyGroup>
<Import Project="..\tools\UmbracoMSBuildTasks\Umbraco.MSBuild.Tasks.Targets" />
<Import Project="..\tools\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets" />
<UsingTask TaskName="GenerateHash" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
<ParameterGroup>
@@ -53,65 +53,69 @@
</UsingTask>
<!--
<!--
****************************************************
VARIABLES
*****************************************************
-->
<!-- NB: BUILD_NUMBER is passed in by the build server -->
<PropertyGroup Condition="'$(BUILD_NUMBER)'!=''">
<DECIMAL_BUILD_NUMBER>.$(BUILD_NUMBER)</DECIMAL_BUILD_NUMBER>
</PropertyGroup>
<PropertyGroup Condition="'$(BUILD_RELEASE)'!=''">
<DECIMAL_BUILD_NUMBER>.$(BUILD_RELEASE)</DECIMAL_BUILD_NUMBER>
</PropertyGroup>
<PropertyGroup Condition="'$(BUILD_RELEASE)'!='' AND '$(BUILD_COMMENT)'!=''">
<DECIMAL_BUILD_NUMBER>.$(BUILD_RELEASE)-$(BUILD_COMMENT)</DECIMAL_BUILD_NUMBER>
</PropertyGroup>
<PropertyGroup>
<BuildConfiguration>Release</BuildConfiguration>
<BuildFolder>_BuildOutput\</BuildFolder>
<BuildZipFileName>UmbracoCms$(DECIMAL_BUILD_NUMBER).zip</BuildZipFileName>
<BuildZipFileNameBin>UmbracoCms.AllBinaries$(DECIMAL_BUILD_NUMBER).zip</BuildZipFileNameBin>
<BuildZipFileNameWebPi>UmbracoCms.WebPI$(DECIMAL_BUILD_NUMBER).zip</BuildZipFileNameWebPi>
<IncludeSymbols>False</IncludeSymbols>
<BuildFolderRelativeToProjects>..\..\build\$(BuildFolder)</BuildFolderRelativeToProjects>
<BuildFolderAbsolutePath>$(MSBuildProjectDirectory)\$(BuildFolder)</BuildFolderAbsolutePath>
<SolutionBinFolder>$(BuildFolder)bin\</SolutionBinFolder>
<WebAppFolder>$(BuildFolder)WebApp\</WebAppFolder>
<WebPiFolder>$(BuildFolder)WebPi\</WebPiFolder>
<SolutionBinFolderRelativeToProjects>$(BuildFolderRelativeToProjects)bin\</SolutionBinFolderRelativeToProjects>
<SolutionBinFolderAbsolutePath>$(BuildFolderAbsolutePath)bin\</SolutionBinFolderAbsolutePath>
<WebAppFolderRelativeToProjects>$(BuildFolderRelativeToProjects)WebApp\</WebAppFolderRelativeToProjects>
<WebAppFolderAbsolutePath>$(BuildFolderAbsolutePath)WebApp\</WebAppFolderAbsolutePath>
<WebPiFolderRelativeToProjects>$(BuildFolderRelativeToProjects)WebPi\</WebPiFolderRelativeToProjects>
<WebPiFolderAbsolutePath>$(BuildFolderAbsolutePath)WebPi\</WebPiFolderAbsolutePath>
</PropertyGroup>
<!-- NB: BUILD_NUMBER is passed in by the build server -->
<PropertyGroup Condition="'$(BUILD_NUMBER)'!=''">
<DECIMAL_BUILD_NUMBER>.$(BUILD_NUMBER)</DECIMAL_BUILD_NUMBER>
</PropertyGroup>
<PropertyGroup Condition="'$(BUILD_RELEASE)'!=''">
<DECIMAL_BUILD_NUMBER>.$(BUILD_RELEASE)</DECIMAL_BUILD_NUMBER>
</PropertyGroup>
<PropertyGroup Condition="'$(BUILD_RELEASE)'!='' AND '$(BUILD_COMMENT)'!=''">
<DECIMAL_BUILD_NUMBER>.$(BUILD_RELEASE)-$(BUILD_COMMENT)</DECIMAL_BUILD_NUMBER>
</PropertyGroup>
<ItemGroup>
<SystemFolders Include="$(WebAppFolder)App_Plugins" />
<SystemFolders Include="$(WebAppFolder)App_Code" />
<SystemFolders Include="$(WebAppFolder)App_Data" />
<SystemFolders Include="$(WebAppFolder)media" />
<SystemFolders Include="$(WebAppFolder)masterpages" />
<SystemFolders Include="$(WebAppFolder)scripts" />
<SystemFolders Include="$(WebAppFolder)css" />
<SystemFolders Include="$(WebAppFolder)macroScripts" />
<SystemFolders Include="$(WebAppFolder)xslt" />
<SystemFolders Include="$(WebAppFolder)usercontrols" />
<SystemFolders Include="$(WebAppFolder)Views" />
</ItemGroup>
<PropertyGroup>
<BuildConfiguration>Release</BuildConfiguration>
<BuildFolder>_BuildOutput\</BuildFolder>
<BuildZipFileName>UmbracoCms$(DECIMAL_BUILD_NUMBER).zip</BuildZipFileName>
<BuildZipFileNameBin>UmbracoCms.AllBinaries$(DECIMAL_BUILD_NUMBER).zip</BuildZipFileNameBin>
<BuildZipFileNameWebPi>UmbracoCms.WebPI$(DECIMAL_BUILD_NUMBER).zip</BuildZipFileNameWebPi>
<IncludeSymbols>False</IncludeSymbols>
<BuildFolderRelativeToProjects>..\..\build\$(BuildFolder)</BuildFolderRelativeToProjects>
<BuildFolderAbsolutePath>$(MSBuildProjectDirectory)\$(BuildFolder)</BuildFolderAbsolutePath>
<SolutionBinFolder>$(BuildFolder)bin\</SolutionBinFolder>
<WebAppFolder>$(BuildFolder)WebApp\</WebAppFolder>
<WebPiFolder>$(BuildFolder)WebPi\</WebPiFolder>
<ConfigsFolder>$(BuildFolder)Configs\</ConfigsFolder>
<SolutionBinFolderRelativeToProjects>$(BuildFolderRelativeToProjects)bin\</SolutionBinFolderRelativeToProjects>
<SolutionBinFolderAbsolutePath>$(BuildFolderAbsolutePath)bin\</SolutionBinFolderAbsolutePath>
<WebAppFolderRelativeToProjects>$(BuildFolderRelativeToProjects)WebApp\</WebAppFolderRelativeToProjects>
<WebAppFolderAbsolutePath>$(BuildFolderAbsolutePath)WebApp\</WebAppFolderAbsolutePath>
<WebPiFolderRelativeToProjects>$(BuildFolderRelativeToProjects)WebPi\</WebPiFolderRelativeToProjects>
<WebPiFolderAbsolutePath>$(BuildFolderAbsolutePath)WebPi\</WebPiFolderAbsolutePath>
<ExaminePDFPath>$(BuildFolderAbsolutePath)UmbracoExamine.PDF\</ExaminePDFPath>
<ExamineAzurePath>$(BuildFolderAbsolutePath)UmbracoExamine.Azure\</ExamineAzurePath>
<ExaminePDFAzurePath>$(BuildFolderAbsolutePath)UmbracoExamine.PDF.Azure\</ExaminePDFAzurePath>
</PropertyGroup>
<!--
<ItemGroup>
<SystemFolders Include="$(WebAppFolder)App_Plugins" />
<SystemFolders Include="$(WebAppFolder)App_Code" />
<SystemFolders Include="$(WebAppFolder)App_Data" />
<SystemFolders Include="$(WebAppFolder)Media" />
<SystemFolders Include="$(WebAppFolder)Masterpages" />
<SystemFolders Include="$(WebAppFolder)Scripts" />
<SystemFolders Include="$(WebAppFolder)Css" />
<SystemFolders Include="$(WebAppFolder)MacroScripts" />
<SystemFolders Include="$(WebAppFolder)Xslt" />
<SystemFolders Include="$(WebAppFolder)UserControls" />
<SystemFolders Include="$(WebAppFolder)Views" />
</ItemGroup>
<!--
****************************************************
TARGETS
*****************************************************
-->
<Target Name="Build" DependsOnTargets="GenerateWebPiHash">
<Message Text="Build finished" />
<Message Text="Build finished" />
</Target>
<Target Name="GenerateWebPiHash" DependsOnTargets="ZipWebPiApp">
@@ -120,117 +124,183 @@
</ItemGroup>
<Message Text="Calculating hash for $(BuildZipFileNameWebPi)" />
<GenerateHash InputFiles="@(WebPiFile)" OutputFile="webpihash.txt" />
</Target>
<Target Name="CleanUp" DependsOnTargets="ZipWebPiApp">
<Message Text="Deleting $(BuildFolder)" Importance="high" />
<RemoveDir Directories="$(BuildFolder)" />
<Message Text="Finished deleting $(BuildFolder)" Importance="high" />
</Target>
</Target>
<Target Name="ZipWebPiApp" DependsOnTargets="ZipWebApp" >
<!-- Clean folders -->
<RemoveDir Directories="$(WebPiFolder)" />
<MakeDir Directories="$(WebPiFolder)" />
<MakeDir Directories="$(WebPiFolder)umbraco" />
<Target Name="CleanUp" DependsOnTargets="ZipWebPiApp">
<Message Text="Deleting $(BuildFolder)" Importance="high" />
<RemoveDir Directories="$(BuildFolder)" />
<Message Text="Finished deleting $(BuildFolder)" Importance="high" />
</Target>
<!-- Copy fresh built umbraco files -->
<Exec Command="xcopy %22$(WebAppFolderAbsolutePath)*%22 %22$(WebPiFolderAbsolutePath)umbraco%22 /S /E /Y /I" />
<!-- Copy Web Pi template files -->
<ItemGroup>
<WebPiFiles Include="..\src\WebPi\**\*.*" />
</ItemGroup>
<Target Name="ZipWebPiApp" DependsOnTargets="ZipWebApp" >
<!-- Clean folders -->
<RemoveDir Directories="$(WebPiFolder)" />
<MakeDir Directories="$(WebPiFolder)" />
<MakeDir Directories="$(WebPiFolder)umbraco" />
<Copy SourceFiles="@(WebPiFiles)"
DestinationFiles="@(WebPiFiles->'$(WebPiFolder)%(RecursiveDir)%(Filename)%(Extension)')" />
<!-- Copy fresh built umbraco files -->
<Exec Command="xcopy %22$(WebAppFolderAbsolutePath)*%22 %22$(WebPiFolderAbsolutePath)umbraco%22 /S /E /Y /I" />
<!-- Zip the files -->
<Exec Command="..\tools\7zip\7za.exe a -r %22$(BuildZipFileNameWebPi)%22 %22$(WebPiFolderAbsolutePath)*%22" />
</Target>
<Target Name="ZipWebApp" DependsOnTargets="CreateSystemFolders" >
<Message Text="Starting to zip to $(buildDate)-$(BuildZipFileName)" Importance="high" />
<!-- Copy Web Pi template files -->
<ItemGroup>
<WebPiFiles Include="..\src\WebPi\**\*.*" />
</ItemGroup>
<Exec Command="..\tools\7zip\7za.exe a -r %22$(BuildZipFileNameBin)%22 %22$(SolutionBinFolderAbsolutePath)*%22" />
<Exec Command="..\tools\7zip\7za.exe a -r %22$(BuildZipFileName)%22 %22$(WebAppFolderAbsolutePath)*%22" />
<Message Text="Finished zipping to build\$(BuildFolder)\$(buildDate)-$(BuildZipFileName)" Importance="high" />
</Target>
<Copy SourceFiles="@(WebPiFiles)"
DestinationFiles="@(WebPiFiles->'$(WebPiFolder)%(RecursiveDir)%(Filename)%(Extension)')" />
<Target Name="CreateSystemFolders" DependsOnTargets="CopyLibraries" Inputs="@(SystemFolders)" Outputs="%(Identity).Dummy">
<MakeDir Directories="@(SystemFolders)" />
</Target>
<Target Name="CopyLibraries" DependsOnTargets="OffsetTimestamps" >
<!-- Copy SQL CE -->
<ItemGroup>
<SQLCE4Files
Include="..\src\packages\SqlServerCE.4.0.0.0\**\*.*"
Exclude="..\src\packages\SqlServerCE.4.0.0.0\lib\**\*;..\src\packages\SqlServerCE.4.0.0.0\**\*.nu*"
<!-- Zip the files -->
<Exec Command="..\tools\7zip\7za.exe a -r %22$(BuildZipFileNameWebPi)%22 %22$(WebPiFolderAbsolutePath)*%22" />
</Target>
<Target Name="ZipWebApp" DependsOnTargets="CreateSystemFolders" >
<Message Text="Starting to zip to $(buildDate)-$(BuildZipFileName)" Importance="high" />
<Exec Command="..\tools\7zip\7za.exe a -r %22$(BuildZipFileNameBin)%22 %22$(SolutionBinFolderAbsolutePath)*%22" />
<Exec Command="..\tools\7zip\7za.exe a -r %22$(BuildZipFileName)%22 %22$(WebAppFolderAbsolutePath)*%22" />
<Message Text="Finished zipping to build\$(BuildFolder)\$(buildDate)-$(BuildZipFileName)" Importance="high" />
</Target>
<Target Name="CreateSystemFolders" DependsOnTargets="CopyLibraries" Inputs="@(SystemFolders)" Outputs="%(Identity).Dummy">
<MakeDir Directories="@(SystemFolders)" />
</Target>
<Target Name="CopyLibraries" DependsOnTargets="OffsetTimestamps" >
<!-- Copy SQL CE -->
<ItemGroup>
<SQLCE4Files
Include="..\src\packages\SqlServerCE.4.0.0.0\**\*.*"
Exclude="..\src\packages\SqlServerCE.4.0.0.0\lib\**\*;..\src\packages\SqlServerCE.4.0.0.0\**\*.nu*"
/>
</ItemGroup>
</ItemGroup>
<Copy SourceFiles="@(SQLCE4Files)"
DestinationFiles="@(SQLCE4Files->'$(SolutionBinFolder)%(RecursiveDir)%(Filename)%(Extension)')"
OverwriteReadOnlyFiles="true"
SkipUnchangedFiles="false" />
<Copy SourceFiles="@(SQLCE4Files)"
DestinationFiles="@(SQLCE4Files->'$(SolutionBinFolder)%(RecursiveDir)%(Filename)%(Extension)')"
OverwriteReadOnlyFiles="true"
SkipUnchangedFiles="false" />
<Copy SourceFiles="@(SQLCE4Files)"
DestinationFiles="@(SQLCE4Files->'$(WebAppFolder)bin\%(RecursiveDir)%(Filename)%(Extension)')"
OverwriteReadOnlyFiles="true"
SkipUnchangedFiles="false" />
</Target>
<Copy SourceFiles="@(SQLCE4Files)"
DestinationFiles="@(SQLCE4Files->'$(WebAppFolder)bin\%(RecursiveDir)%(Filename)%(Extension)')"
OverwriteReadOnlyFiles="true"
SkipUnchangedFiles="false" />
<!-- Offset the modified timestamps on all umbraco dlls, as WebResources break if date is in the future, which, due to timezone offsets can happen. -->
<Target Name="OffsetTimestamps" DependsOnTargets="CopyTransformedWebConfig">
<CreateItem Include="$(BuildFolder)**\umbraco.*.dll">
<Output TaskParameter="Include" ItemName="FilesToOffsetTimestamp" />
</CreateItem>
<Message Text="Starting to offset timestamps" Importance="high" />
<Umbraco.MSBuild.Tasks.TimestampOffset Files="@(FilesToOffsetTimestamp)" Offset="-11" />
<Message Text="Finished offsetting timestamps" Importance="high" />
</Target>
<!-- Offset the modified timestamps on all umbraco dlls, as WebResources break if date is in the future, which, due to timezone offsets can happen. -->
<Target Name="OffsetTimestamps" DependsOnTargets="CopyTransformedWebConfig">
<CreateItem Include="$(BuildFolder)**\umbraco.*.dll">
<Output TaskParameter="Include" ItemName="FilesToOffsetTimestamp" />
</CreateItem>
<Message Text="Starting to offset timestamps" Importance="high" />
<Umbraco.MSBuild.Tasks.TimestampOffset Files="@(FilesToOffsetTimestamp)" Offset="-11" />
<Message Text="Finished offsetting timestamps" Importance="high" />
</Target>
<!-- Copy the transformed web.config file to the root -->
<Target Name="CopyTransformedWebConfig" DependsOnTargets="CopyTransformedConfig">
<ItemGroup>
<WebConfigFile Include="..\src\Umbraco.Web.UI\web.$(BuildConfiguration).Config.transformed" />
</ItemGroup>
<Copy SourceFiles="@(WebConfigFile)"
DestinationFiles="$(WebAppFolder)Web.config"
OverwriteReadOnlyFiles="true"
SkipUnchangedFiles="false" />
</Target>
<!-- Copy the transformed web.config file to the root -->
<Target Name="CopyTransformedWebConfig" DependsOnTargets="CopyXmlDocumentation">
<ItemGroup>
<WebConfigFile Include="..\src\Umbraco.Web.UI\web.$(BuildConfiguration).Config.transformed" />
<!-- Copy the config files and rename them to *.config.transform -->
<Target Name="CopyTransformedConfig" DependsOnTargets="CopyXmlDocumentation">
<ItemGroup>
<ConfigFiles Include="$(WebAppFolder)config\*.config" />
<WebConfigTransformFile Include="$(WebAppFolder)Web.config" />
</ItemGroup>
<Copy SourceFiles="@(WebConfigFile)"
DestinationFiles="$(WebAppFolder)Web.config"
<Copy SourceFiles="@(ConfigFiles)"
DestinationFiles="@(ConfigFiles->'$(ConfigsFolder)\%(RecursiveDir)%(Filename)%(Extension)')"
OverwriteReadOnlyFiles="true"
SkipUnchangedFiles="false" />
</Target>
<!-- Copy the xml documentation to the bin folder -->
<Target Name="CopyXmlDocumentation" DependsOnTargets="CompileProjects">
<ItemGroup>
<XmlDocumentationFiles Include="$(SolutionBinFolder)*.xml" />
</ItemGroup>
<Copy SourceFiles="@(XmlDocumentationFiles)"
DestinationFiles="@(XmlDocumentationFiles->'$(WebAppFolder)bin\%(RecursiveDir)%(Filename)%(Extension)')"
OverwriteReadOnlyFiles="true"
SkipUnchangedFiles="false" />
<Message Text="CopyXmlDocumentation" />
</Target>
<Target Name="CompileProjects" DependsOnTargets="SetVersionNumber">
<Message Text="Compiling web project to build\$(BuildFolder)" Importance="high" />
<!-- For UseWPP_CopyWebApplication=True see http://stackoverflow.com/questions/1983575/copywebapplication-with-web-config-transformations -->
<MSBuild Projects="..\src\Umbraco.Web.UI\Umbraco.Web.UI.csproj" Properties="WarningLevel=0;Configuration=$(BuildConfiguration);UseWPP_CopyWebApplication=True;PipelineDependsOnBuild=False;OutDir=$(SolutionBinFolderAbsolutePath);WebProjectOutputDir=$(WebAppFolderAbsolutePath)" Targets="Clean;Build;" BuildInParallel="False" ToolsVersion="4.0" UnloadProjectsOnCompletion="False">
</MSBuild>
<Copy SourceFiles="@(WebConfigTransformFile)"
DestinationFiles="$(ConfigsFolder)Web.config.transform"
OverwriteReadOnlyFiles="true"
SkipUnchangedFiles="false" />
</Target>
<!-- DONE -->
<Message Text="Finished compiling projects" Importance="high" />
</Target>
<!-- Copy the xml documentation to the bin folder -->
<Target Name="CopyXmlDocumentation" DependsOnTargets="CleanupPresentation">
<ItemGroup>
<XmlDocumentationFiles Include="$(SolutionBinFolder)*.xml" />
</ItemGroup>
<Target Name="SetVersionNumber" Condition="'$(BUILD_RELEASE)'!=''">
<Copy SourceFiles="@(XmlDocumentationFiles)"
DestinationFiles="@(XmlDocumentationFiles->'$(WebAppFolder)bin\%(RecursiveDir)%(Filename)%(Extension)')"
OverwriteReadOnlyFiles="true"
SkipUnchangedFiles="false" />
<Message Text="CopyXmlDocumentation" />
</Target>
<!-- Unlike 2010, the VS2012 build targets file doesn't clean up the umbraco.presentation dir, do it manually -->
<!-- Also, it places umbraco.XmlSerializers.dll in the root, even though it's also in the bin folder. Kill! -->
<Target Name="CleanupPresentation" DependsOnTargets="CompileProjects">
<ItemGroup>
<PresentationFolderToDelete Include="$(WebAppFolder)umbraco.presentation" />
<XmlSerializersDll Include="$(WebAppFolder)umbraco.XmlSerializers.dll" />
</ItemGroup>
<RemoveDir Directories="@(PresentationFolderToDelete)" />
<Delete Files="@(XmlSerializersDll)" />
</Target>
<Target Name="CompileProjects" DependsOnTargets="CompileExternalExamineProjects">
<Message Text="Compiling web project to build\$(BuildFolder)" Importance="high" />
<!-- For UseWPP_CopyWebApplication=True see http://stackoverflow.com/questions/1983575/copywebapplication-with-web-config-transformations -->
<!-- Build the Umbraco.Web.UI project -->
<MSBuild Projects="..\src\Umbraco.Web.UI\Umbraco.Web.UI.csproj" Properties="WarningLevel=0;Configuration=$(BuildConfiguration);UseWPP_CopyWebApplication=True;PipelineDependsOnBuild=False;OutDir=$(SolutionBinFolderAbsolutePath);WebProjectOutputDir=$(WebAppFolderAbsolutePath)" Targets="Clean;Build;" BuildInParallel="False" ToolsVersion="4.0" UnloadProjectsOnCompletion="False">
</MSBuild>
<!-- DONE -->
<Message Text="Finished compiling projects" Importance="high" />
</Target>
<Target Name="CompileExternalExamineProjects" DependsOnTargets="SetVersionNumber">
<Message Text="Building externally shipped examine projects" Importance="high" />
<!-- First remove old files from the examine builds -->
<ItemGroup>
<FilesToDeleteBeforeBuild Include="$(ExaminePDFPath)*;$(ExamineAzurePath)*"/>
</ItemGroup>
<Delete Files="@(FilesToDeleteBeforeBuild)" />
<!--
Build the UmbracoExamine.PDF.Azure library ... this builds the 3 projects that we want to bundle separately so no need to build each one separately .
We'll just build this one and then manually copy the DLLs to where we want them.
-->
<MSBuild Projects="..\src\UmbracoExamine.PDF.Azure\UmbracoExamine.PDF.Azure.csproj" Properties="WarningLevel=0;Configuration=$(BuildConfiguration);PipelineDependsOnBuild=False;OutDir=$(ExaminePDFAzurePath);" Targets="Clean;Build;" BuildInParallel="False" ToolsVersion="4.0" UnloadProjectsOnCompletion="False">
</MSBuild>
<ItemGroup>
<ExaminePDFFiles Include="$(ExaminePDFAzurePath)**\UmbracoExamine.PDF.dll;$(ExaminePDFAzurePath)**\UmbracoExamine.PDF.pdf;$(ExaminePDFAzurePath)**\UmbracoExamine.PDF.xml;$(ExaminePDFAzurePath)**\itextsharp.dll" />
<ExamineAzureFiles Include="$(ExaminePDFAzurePath)**\UmbracoExamine.Azure.dll;$(ExaminePDFAzurePath)**\UmbracoExamine.Azure.pdb;$(ExaminePDFAzurePath)**\UmbracoExamine.Azure.xml" />
<ExaminePDFAzureFiles Include="$(ExaminePDFAzurePath)**\UmbracoExamine.Azure.PDF.dll;$(ExaminePDFAzurePath)**\UmbracoExamine.Azure.PDF.pdb;$(ExaminePDFAzurePath)**\UmbracoExamine.Azure.PDF.xml" />
</ItemGroup>
<!-- Now copy the built files to their correct deployment folders-->
<Copy SourceFiles="@(ExaminePDFFiles)"
DestinationFolder="$(ExaminePDFPath)"
OverwriteReadOnlyFiles="true"
SkipUnchangedFiles="false" />
<Copy SourceFiles="@(ExamineAzureFiles)"
DestinationFolder="$(ExamineAzurePath)"
OverwriteReadOnlyFiles="true"
SkipUnchangedFiles="false" />
<!-- Then just delete the files we don't want to ship in the UmbracoExamine.Azure.PDF folder -->
<ItemGroup>
<FilesToDeleteAfterBuild Include="$(ExaminePDFAzurePath)*" Exclude="$(ExaminePDFAzurePath)UmbracoExamine.PDF.Azure.dll;$(ExaminePDFAzurePath)UmbracoExamine.PDF.Azure.pdb;$(ExaminePDFAzurePath)UmbracoExamine.PDF.Azure.xml"/>
</ItemGroup>
<Delete Files="@(FilesToDeleteAfterBuild)" />
</Target>
<Target Name="SetVersionNumber" Condition="'$(BUILD_RELEASE)'!=''">
<!-- Match & replace 3 and 4 digit version numbers and -beta (if it's there) -->
<FileUpdate
<FileUpdate
Files="..\src\Umbraco.Core\Configuration\UmbracoVersion.cs"
Regex="(\d+)\.(\d+)\.(\d+)(.(\d+))?"
ReplacementText="$(BUILD_RELEASE)"/>
@@ -238,5 +308,5 @@
<FileUpdate Files="..\src\Umbraco.Core\Configuration\UmbracoVersion.cs"
Regex="CurrentComment { get { return &quot;([a-zA-Z]+)?&quot;"
ReplacementText="CurrentComment { get { return &quot;$(BUILD_COMMENT)&quot;"/>
</Target>
</Target>
</Project>
+53 -55
View File
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-16"?>
<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
<metadata>
<id>UmbracoCms.Core</id>
<version>6.0.0-alpha</version>
<version>6.2.0</version>
<title>Umbraco Cms Core Binaries</title>
<authors>Morten Christensen</authors>
<owners>Umbraco HQ</owners>
@@ -14,59 +14,57 @@
<summary>Contains the core assemblies needed to run Umbraco Cms</summary>
<language>en-US</language>
<tags>umbraco</tags>
<dependencies>
<dependency id="Microsoft.AspNet.Mvc" version="[4.0.20710.0]" />
<dependency id="ServiceStack.Text" version="3.9.21" />
<dependency id="Microsoft.AspNet.Mvc.FixedDisplayModes" version="1.0.0" />
<dependencies>
<dependency id="Microsoft.AspNet.Mvc" version="4.0" />
<dependency id="Microsoft.AspNet.WebApi" version="4.0" />
<dependency id="Microsoft.AspNet.Mvc.FixedDisplayModes" version="1.0.0" />
<dependency id="MiniProfiler" version="[2.1.0, 3.0.0)" />
<dependency id="HtmlAgilityPack" version="[1.4.6, 2.0.0)" />
<dependency id="Lucene.Net" version="[2.9.4.1, 3.0.0.0)" />
<dependency id="SharpZipLib" version="[0.86.0, 1.0.0)" />
<dependency id="MySql.Data" version="[6.6.5]" />
<dependency id="xmlrpcnet" version="[2.5.0, 3.0.0)" />
<dependency id="ClientDependency" version="[1.7.0, 2.0.0)" />
<dependency id="ClientDependency-Mvc" version="[1.7.0, 2.0.0)" />
</dependencies>
</metadata>
<files>
<file src="..\_BuildOutput\WebApp\bin\businesslogic.dll" target="lib\businesslogic.dll" />
<file src="..\_BuildOutput\WebApp\bin\businesslogic.xml" target="lib\businesslogic.xml" />
<file src="..\_BuildOutput\WebApp\bin\ClientDependency.Core.dll" target="lib\ClientDependency.Core.dll" />
<file src="..\_BuildOutput\WebApp\bin\ClientDependency.Core.Mvc.dll" target="lib\ClientDependency.Core.Mvc.dll" />
<file src="..\_BuildOutput\WebApp\bin\cms.dll" target="lib\cms.dll" />
<file src="..\_BuildOutput\WebApp\bin\cms.xml" target="lib\cms.xml" />
<file src="..\_BuildOutput\WebApp\bin\controls.dll" target="lib\controls.dll" />
<file src="..\_BuildOutput\WebApp\bin\controls.xml" target="lib\controls.xml" />
<file src="..\_BuildOutput\WebApp\bin\CookComputing.XmlRpcV2.dll" target="lib\CookComputing.XmlRpcV2.dll" />
<file src="..\_BuildOutput\WebApp\bin\Examine.dll" target="lib\Examine.dll" />
<file src="..\_BuildOutput\WebApp\bin\HtmlAgilityPack.dll" target="lib\HtmlAgilityPack.dll" />
<file src="..\_BuildOutput\WebApp\bin\ICSharpCode.SharpZipLib.dll" target="lib\ICSharpCode.SharpZipLib.dll" />
<file src="..\_BuildOutput\WebApp\bin\interfaces.dll" target="lib\interfaces.dll" />
<file src="..\_BuildOutput\WebApp\bin\interfaces.xml" target="lib\interfaces.xml" />
<file src="..\_BuildOutput\WebApp\bin\log4net.dll" target="lib\log4net.dll" />
<file src="..\_BuildOutput\WebApp\bin\Lucene.Net.dll" target="lib\Lucene.Net.dll" />
<file src="..\_BuildOutput\WebApp\bin\Lucene.Net.xml" target="lib\Lucene.Net.xml" />
<file src="..\_BuildOutput\WebApp\bin\Microsoft.ApplicationBlocks.Data.dll" target="lib\Microsoft.ApplicationBlocks.Data.dll" />
<file src="..\_BuildOutput\WebApp\bin\Microsoft.Web.Helpers.dll" target="lib\Microsoft.Web.Helpers.dll" />
<file src="..\_BuildOutput\WebApp\bin\MySql.Data.dll" target="lib\MySql.Data.dll" />
<file src="..\_BuildOutput\WebApp\bin\Our.Umbraco.uGoLive.47x.dll" target="lib\Our.Umbraco.uGoLive.47x.dll" />
<file src="..\_BuildOutput\WebApp\bin\Our.Umbraco.uGoLive.Checks.dll" target="lib\Our.Umbraco.uGoLive.Checks.dll" />
<file src="..\_BuildOutput\WebApp\bin\Our.Umbraco.uGoLive.dll" target="lib\Our.Umbraco.uGoLive.dll" />
<file src="..\_BuildOutput\WebApp\bin\SQLCE4Umbraco.dll" target="lib\SQLCE4Umbraco.dll" />
<file src="..\_BuildOutput\WebApp\bin\System.Data.SqlServerCe.dll" target="lib\System.Data.SqlServerCe.dll" />
<file src="..\_BuildOutput\WebApp\bin\System.Data.SqlServerCe.Entity.dll" target="lib\System.Data.SqlServerCe.Entity.dll" />
<file src="..\_BuildOutput\WebApp\bin\TidyNet.dll" target="lib\TidyNet.dll" />
<file src="..\_BuildOutput\WebApp\bin\Umbraco.Core.dll" target="lib\Umbraco.Core.dll" />
<file src="..\_BuildOutput\WebApp\bin\Umbraco.Core.xml" target="lib\Umbraco.Core.xml" />
<file src="..\_BuildOutput\WebApp\bin\umbraco.DataLayer.dll" target="lib\umbraco.DataLayer.dll" />
<file src="..\_BuildOutput\WebApp\bin\umbraco.DataLayer.xml" target="lib\umbraco.DataLayer.xml" />
<file src="..\_BuildOutput\WebApp\bin\umbraco.dll" target="lib\umbraco.dll" />
<file src="..\_BuildOutput\WebApp\bin\umbraco.xml" target="lib\umbraco.xml" />
<file src="..\_BuildOutput\WebApp\bin\umbraco.editorControls.dll" target="lib\umbraco.editorControls.dll" />
<file src="..\_BuildOutput\WebApp\bin\umbraco.editorControls.xml" target="lib\umbraco.editorControls.xml" />
<file src="..\_BuildOutput\WebApp\bin\umbraco.MacroEngines.dll" target="lib\umbraco.MacroEngines.dll" />
<file src="..\_BuildOutput\WebApp\bin\umbraco.MacroEngines.xml" target="lib\umbraco.MacroEngines.xml" />
<file src="..\_BuildOutput\WebApp\bin\umbraco.macroRenderings.dll" target="lib\umbraco.macroRenderings.dll" />
<file src="..\_BuildOutput\WebApp\bin\umbraco.macroRenderings.xml" target="lib\umbraco.macroRenderings.xml" />
<file src="..\_BuildOutput\WebApp\bin\umbraco.providers.dll" target="lib\umbraco.providers.dll" />
<file src="..\_BuildOutput\WebApp\bin\umbraco.providers.xml" target="lib\umbraco.providers.xml" />
<file src="..\_BuildOutput\WebApp\bin\Umbraco.Web.UI.dll" target="lib\Umbraco.Web.UI.dll" />
<file src="..\_BuildOutput\WebApp\bin\umbraco.webservices.dll" target="lib\umbraco.webservices.dll" />
<file src="..\_BuildOutput\WebApp\bin\umbraco.webservices.xml" target="lib\umbraco.webservices.xml" />
<file src="..\_BuildOutput\WebApp\bin\umbraco.XmlSerializers.dll" target="lib\umbraco.XmlSerializers.dll" />
<file src="..\_BuildOutput\WebApp\bin\UmbracoExamine.dll" target="lib\UmbracoExamine.dll" />
<file src="..\_BuildOutput\WebApp\bin\UrlRewritingNet.UrlRewriter.dll" target="lib\UrlRewritingNet.UrlRewriter.dll" />
</files>
<files>
<file src="..\_BuildOutput\WebApp\bin\businesslogic.dll" target="lib\businesslogic.dll" />
<file src="..\_BuildOutput\WebApp\bin\businesslogic.xml" target="lib\businesslogic.xml" />
<file src="..\_BuildOutput\WebApp\bin\cms.dll" target="lib\cms.dll" />
<file src="..\_BuildOutput\WebApp\bin\cms.xml" target="lib\cms.xml" />
<file src="..\_BuildOutput\WebApp\bin\controls.dll" target="lib\controls.dll" />
<file src="..\_BuildOutput\WebApp\bin\controls.xml" target="lib\controls.xml" />
<file src="..\_BuildOutput\WebApp\bin\Examine.dll" target="lib\Examine.dll" />
<file src="..\_BuildOutput\WebApp\bin\interfaces.dll" target="lib\interfaces.dll" />
<file src="..\_BuildOutput\WebApp\bin\interfaces.xml" target="lib\interfaces.xml" />
<file src="..\_BuildOutput\WebApp\bin\log4net.dll" target="lib\log4net.dll" />
<file src="..\_BuildOutput\WebApp\bin\Microsoft.ApplicationBlocks.Data.dll" target="lib\Microsoft.ApplicationBlocks.Data.dll" />
<file src="..\_BuildOutput\WebApp\bin\Microsoft.Web.Helpers.dll" target="lib\Microsoft.Web.Helpers.dll" />
<file src="..\_BuildOutput\WebApp\bin\Our.Umbraco.uGoLive.47x.dll" target="lib\Our.Umbraco.uGoLive.47x.dll" />
<file src="..\_BuildOutput\WebApp\bin\Our.Umbraco.uGoLive.Checks.dll" target="lib\Our.Umbraco.uGoLive.Checks.dll" />
<file src="..\_BuildOutput\WebApp\bin\Our.Umbraco.uGoLive.dll" target="lib\Our.Umbraco.uGoLive.dll" />
<file src="..\_BuildOutput\WebApp\bin\SQLCE4Umbraco.dll" target="lib\SQLCE4Umbraco.dll" />
<file src="..\_BuildOutput\WebApp\bin\System.Data.SqlServerCe.dll" target="lib\System.Data.SqlServerCe.dll" />
<file src="..\_BuildOutput\WebApp\bin\System.Data.SqlServerCe.Entity.dll" target="lib\System.Data.SqlServerCe.Entity.dll" />
<file src="..\_BuildOutput\WebApp\bin\TidyNet.dll" target="lib\TidyNet.dll" />
<file src="..\_BuildOutput\WebApp\bin\Umbraco.Core.dll" target="lib\Umbraco.Core.dll" />
<file src="..\_BuildOutput\WebApp\bin\Umbraco.Core.xml" target="lib\Umbraco.Core.xml" />
<file src="..\_BuildOutput\WebApp\bin\umbraco.DataLayer.dll" target="lib\umbraco.DataLayer.dll" />
<file src="..\_BuildOutput\WebApp\bin\umbraco.DataLayer.xml" target="lib\umbraco.DataLayer.xml" />
<file src="..\_BuildOutput\WebApp\bin\umbraco.dll" target="lib\umbraco.dll" />
<file src="..\_BuildOutput\WebApp\bin\umbraco.xml" target="lib\umbraco.xml" />
<file src="..\_BuildOutput\WebApp\bin\umbraco.editorControls.dll" target="lib\umbraco.editorControls.dll" />
<file src="..\_BuildOutput\WebApp\bin\umbraco.editorControls.xml" target="lib\umbraco.editorControls.xml" />
<file src="..\_BuildOutput\WebApp\bin\umbraco.MacroEngines.dll" target="lib\umbraco.MacroEngines.dll" />
<file src="..\_BuildOutput\WebApp\bin\umbraco.MacroEngines.xml" target="lib\umbraco.MacroEngines.xml" />
<file src="..\_BuildOutput\WebApp\bin\umbraco.macroRenderings.dll" target="lib\umbraco.macroRenderings.dll" />
<file src="..\_BuildOutput\WebApp\bin\umbraco.macroRenderings.xml" target="lib\umbraco.macroRenderings.xml" />
<file src="..\_BuildOutput\WebApp\bin\umbraco.providers.dll" target="lib\umbraco.providers.dll" />
<file src="..\_BuildOutput\WebApp\bin\umbraco.providers.xml" target="lib\umbraco.providers.xml" />
<file src="..\_BuildOutput\WebApp\bin\Umbraco.Web.UI.dll" target="lib\Umbraco.Web.UI.dll" />
<file src="..\_BuildOutput\WebApp\bin\umbraco.XmlSerializers.dll" target="lib\umbraco.XmlSerializers.dll" />
<file src="..\_BuildOutput\WebApp\bin\UmbracoExamine.dll" target="lib\UmbracoExamine.dll" />
<file src="..\_BuildOutput\WebApp\bin\UrlRewritingNet.UrlRewriter.dll" target="lib\UrlRewritingNet.UrlRewriter.dll" />
</files>
</package>
+8 -7
View File
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-16"?>
<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
<metadata>
<id>UmbracoCms</id>
<version>6.0.0-alpha</version>
<version>6.1.2</version>
<title>Umbraco Cms</title>
<authors>Morten Christensen</authors>
<owners>Umbraco HQ</owners>
@@ -10,8 +10,8 @@
<projectUrl>http://umbraco.com/</projectUrl>
<iconUrl>http://umbraco.com/media/357769/100px_transparent.png</iconUrl>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>Installs Umbraco Cms in your Visual Studio ASP.NET Webforms project</description>
<summary>Installs Umbraco Cms in your Visual Studio ASP.NET Webforms project</summary>
<description>Installs Umbraco Cms in your Visual Studio ASP.NET project</description>
<summary>Installs Umbraco Cms in your Visual Studio ASP.NET project</summary>
<language>en-US</language>
<tags>umbraco</tags>
<dependencies>
@@ -21,14 +21,14 @@
<files>
<file src="..\_BuildOutput\WebApp\bin\amd64\**" target="Content\bin\amd64" />
<file src="..\_BuildOutput\WebApp\bin\x86\**" target="Content\bin\x86" />
<file src="..\_BuildOutput\WebApp\config\*.config" target="Content\config" />
<file src="..\_BuildOutput\Configs\**" target="Content\config" exclude="..\_BuildOutput\Configs\Web.config.transform" />
<file src="..\_BuildOutput\WebApp\css\**" target="Content\css" />
<file src="..\_BuildOutput\WebApp\macroScripts\**" target="Content\macroScripts" />
<file src="..\_BuildOutput\WebApp\masterpages\**" target="Content\masterpages" />
<file src="..\_BuildOutput\WebApp\media\**" target="Content\media" />
<file src="..\_BuildOutput\WebApp\scripts\**" target="Content\scripts" />
<file src="..\_BuildOutput\WebApp\usercontrols\**" target="Content\usercontrols" />
<file src="..\_BuildOutput\WebApp\Views\**" target="Content\Views" />
<file src="..\_BuildOutput\WebApp\Views\**" target="Content\Views" exclude="..\_BuildOutput\WebApp\Views\Web.config" />
<file src="..\_BuildOutput\WebApp\xslt\**" target="Content\xslt" />
<file src="..\_BuildOutput\WebApp\default.aspx" target="Content\default.aspx" />
<file src="..\_BuildOutput\WebApp\Web.config" target="Content\Web.config" />
@@ -36,7 +36,7 @@
<file src="..\_BuildOutput\WebApp\App_Code\**" target="UmbracoFiles\App_Code" />
<file src="..\_BuildOutput\WebApp\App_Data\**" target="UmbracoFiles\App_Data" />
<file src="..\_BuildOutput\WebApp\App_Plugins\**" target="UmbracoFiles\App_Plugins" />
<file src="..\_BuildOutput\WebApp\config\**" target="UmbracoFiles\config" />
<file src="..\_BuildOutput\WebApp\config\splashes\**" target="UmbracoFiles\config\splashes" />
<file src="..\_BuildOutput\WebApp\install\**" target="UmbracoFiles\install" />
<file src="..\_BuildOutput\WebApp\umbraco\**" target="UmbracoFiles\umbraco" />
<file src="..\_BuildOutput\WebApp\umbraco_client\**" target="UmbracoFiles\umbraco_client" />
@@ -44,5 +44,6 @@
<file src="..\_BuildOutput\WebApp\Web.config" target="UmbracoFiles\Web.config" />
<file src="tools\install.ps1" target="tools\install.ps1" />
<file src="tools\Readme.txt" target="tools\Readme.txt" />
<file src="build\**" target="build" />
</files>
</package>
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<CopyAllFilesToSingleFolderForPackageDependsOn>
AddUmbracoFilesToOutput;
$(CopyAllFilesToSingleFolderForPackageDependsOn);
</CopyAllFilesToSingleFolderForPackageDependsOn>
<CopyAllFilesToSingleFolderForMsdeployDependsOn>
AddUmbracoFilesToOutput;
$(CopyAllFilesToSingleFolderForPackageDependsOn);
</CopyAllFilesToSingleFolderForMsdeployDependsOn>
</PropertyGroup>
</Project>
@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="AddUmbracoFilesToOutput">
<ItemGroup>
<UmbracoFiles Include=".\umbraco\**\*;" />
<UmbracoClientFiles Include=".\umbraco_client\**\*;" />
<AppBrowsersFiles Include=".\App_Browsers\**\*" />
<FilesForPackagingFromProject Include="%(UmbracoFiles.Identity)">
<DestinationRelativePath>umbraco\%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath>
</FilesForPackagingFromProject>
<FilesForPackagingFromProject Include="%(UmbracoClientFiles.Identity)">
<DestinationRelativePath>umbraco_client\%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath>
</FilesForPackagingFromProject>
<FilesForPackagingFromProject Include="%(AppBrowsersFiles.Identity)">
<DestinationRelativePath>App_Browsers\%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath>
</FilesForPackagingFromProject>
</ItemGroup>
</Target>
</Project>
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<CopyAllFilesToSingleFolderForPackageDependsOn>
AddUmbracoFilesToOutput;
$(CopyAllFilesToSingleFolderForPackageDependsOn);
</CopyAllFilesToSingleFolderForPackageDependsOn>
<CopyAllFilesToSingleFolderForMsdeployDependsOn>
AddUmbracoFilesToOutput;
$(CopyAllFilesToSingleFolderForPackageDependsOn);
</CopyAllFilesToSingleFolderForMsdeployDependsOn>
</PropertyGroup>
</Project>
@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="AddUmbracoFilesToOutput">
<ItemGroup>
<UmbracoFiles Include=".\umbraco\**\*;" />
<UmbracoClientFiles Include=".\umbraco_client\**\*;" />
<AppBrowsersFiles Include=".\App_Browsers\**\*" />
<FilesForPackagingFromProject Include="%(UmbracoFiles.Identity)">
<DestinationRelativePath>umbraco\%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath>
</FilesForPackagingFromProject>
<FilesForPackagingFromProject Include="%(UmbracoClientFiles.Identity)">
<DestinationRelativePath>umbraco_client\%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath>
</FilesForPackagingFromProject>
<FilesForPackagingFromProject Include="%(AppBrowsersFiles.Identity)">
<DestinationRelativePath>App_Browsers\%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath>
</FilesForPackagingFromProject>
</ItemGroup>
</Target>
</Project>
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<CopyAllFilesToSingleFolderForPackageDependsOn>
AddUmbracoFilesToOutput;
$(CopyAllFilesToSingleFolderForPackageDependsOn);
</CopyAllFilesToSingleFolderForPackageDependsOn>
<CopyAllFilesToSingleFolderForMsdeployDependsOn>
AddUmbracoFilesToOutput;
$(CopyAllFilesToSingleFolderForPackageDependsOn);
</CopyAllFilesToSingleFolderForMsdeployDependsOn>
</PropertyGroup>
</Project>
@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="AddUmbracoFilesToOutput">
<ItemGroup>
<UmbracoFiles Include=".\umbraco\**\*;" />
<UmbracoClientFiles Include=".\umbraco_client\**\*;" />
<AppBrowsersFiles Include=".\App_Browsers\**\*" />
<FilesForPackagingFromProject Include="%(UmbracoFiles.Identity)">
<DestinationRelativePath>umbraco\%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath>
</FilesForPackagingFromProject>
<FilesForPackagingFromProject Include="%(UmbracoClientFiles.Identity)">
<DestinationRelativePath>umbraco_client\%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath>
</FilesForPackagingFromProject>
<FilesForPackagingFromProject Include="%(AppBrowsersFiles.Identity)">
<DestinationRelativePath>App_Browsers\%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath>
</FilesForPackagingFromProject>
</ItemGroup>
</Target>
</Project>
+13 -9
View File
@@ -1,15 +1,19 @@
A note about running Umbraco from Visual Studio.
When upgrading your website using nuget a backup of config files and web.config will be created and the files will
be overwritten with those from the current release. This means that you'll have to merge the files if you made any
changes to the previous config files.
When upgrading your website using nuget a backup of config files and web.config will be created. Only the web.config will
be overwritten by default to ensure that it has the necessary settings from the current release. This means that you'll
have to merge the files if you made any changes to the previous config files.
The config files found in the config folder will usually not be changed for patch releases, so they can usually be skipped,
but the web.config will have to have its previous "umbracoConfigurationStatus"-appsetting and "umbracoDbDSN" connection string
copied over (as a minimum).
It's not possible to create a deploy package from Visual Studio, which contains everything out of the box. This is
due to a number of files and folders that are not added to the Visual Studio project. These folders include:
install, umbraco and umbraco_client.
A custom deploy script will be added in a later release.
This nuget package includes build targets that extends the creation of a deploy package, which is generated by
Publishing from Visual Studio. The targets will only work once Publishing is configured, so if you don't use
Publish this won't affect you.
These folders will now be automatically included when creating a deploy package or publishing to the file system:
umbraco and umbraco_client.
Please read the release notes on Codeplex:
http://umbraco.codeplex.com/releases
Please read the release notes on our.umbraco.org:
http://our.umbraco.org/contribute/releases
- Umbraco
+3
View File
@@ -21,4 +21,7 @@ if ($project) {
$projectDestinationPath = Split-Path $project.FullName -Parent
$umbracoFilesPath = Join-Path $rootPath "UmbracoFiles\*"
Copy-Item $umbracoFilesPath $projectDestinationPath -recurse -force
# Open readme.txt file
$DTE.ItemOperations.OpenFile($toolsPath + '\Readme.txt')
}
Binary file not shown.
Binary file not shown.
+6 -5
View File
@@ -17,7 +17,8 @@
</PropertyGroup>
<ItemGroup Condition=" '$(PackageSources)' == '' ">
<!-- Package sources used to restore packages. By default will used the registered sources under %APPDATA%\NuGet\NuGet.Config -->
<!-- Package sources used to restore packages. By default, registered sources under %APPDATA%\NuGet\NuGet.Config will be used -->
<!-- The official NuGet package source (https://nuget.org/api/v2/) will be excluded if package sources are specified and it does not appear in the list -->
<!--
<PackageSource Include="https://nuget.org/api/v2/" />
<PackageSource Include="https://my-nuget-source/nuget/" />
@@ -54,10 +55,10 @@
<BuildCommand>$(NuGetCommand) pack "$(ProjectPath)" -p Configuration=$(Configuration) -o "$(PackageOutputDir)" -symbols</BuildCommand>
<!-- We need to ensure packages are restored prior to assembly resolve -->
<ResolveReferencesDependsOn Condition="$(RestorePackages) == 'true'">
<BuildDependsOn Condition="$(RestorePackages) == 'true'">
RestorePackages;
$(ResolveReferencesDependsOn);
</ResolveReferencesDependsOn>
$(BuildDependsOn);
</BuildDependsOn>
<!-- Make the build depend on restore packages -->
<BuildDependsOn Condition="$(BuildPackage) == 'true'">
@@ -75,7 +76,7 @@
This effectively acts as a lock that makes sure that the download operation will only happen once and all
parallel builds will have to wait for it to complete.
-->
<MsBuild Targets="_DownloadNuGet" Projects="$(MSBuildThisFileFullPath)" Properties="Configuration=NOT_IMPORTANT" />
<MsBuild Targets="_DownloadNuGet" Projects="$(MSBuildThisFileFullPath)" Properties="Configuration=NOT_IMPORTANT;DownloadNuGetExe=$(DownloadNuGetExe)" />
</Target>
<Target Name="_DownloadNuGet">
+85 -13
View File
@@ -1,9 +1,12 @@
using System;
using System.Configuration;
using System.Threading;
using System.Web;
using System.Web.Caching;
using Umbraco.Core.Cache;
using Umbraco.Core.Configuration;
using Umbraco.Core.Logging;
using Umbraco.Core.ObjectResolution;
using Umbraco.Core.Services;
@@ -15,33 +18,53 @@ namespace Umbraco.Core
/// <remarks>
/// one per AppDomain, represents the global Umbraco application
/// </remarks>
public class ApplicationContext
public class ApplicationContext : IDisposable
{
/// <summary>
/// Constructor
/// </summary>
internal ApplicationContext(DatabaseContext dbContext, ServiceContext serviceContext)
:this()
: this(dbContext, serviceContext, true)
{
if (dbContext == null) throw new ArgumentNullException("dbContext");
if (serviceContext == null) throw new ArgumentNullException("serviceContext");
_databaseContext = dbContext;
_services = serviceContext;
}
/// <summary>
/// Constructor
/// </summary>
/// <param name="dbContext"></param>
/// <param name="serviceContext"></param>
/// <param name="enableCache"></param>
internal ApplicationContext(DatabaseContext dbContext, ServiceContext serviceContext, bool enableCache)
: this(enableCache)
{
if (dbContext == null) throw new ArgumentNullException("dbContext");
if (serviceContext == null) throw new ArgumentNullException("serviceContext");
_databaseContext = dbContext;
_services = serviceContext;
}
/// <summary>
/// Empty constructor normally reserved for unit tests when a DatabaseContext or a ServiceContext is not
/// necessarily required or needs to be set after construction.
/// </summary>
internal ApplicationContext()
{
//create a new application cache from the HttpRuntime.Cache
ApplicationCache = HttpRuntime.Cache == null
? new CacheHelper(new Cache())
: new CacheHelper(HttpRuntime.Cache);
internal ApplicationContext() : this(true)
{
}
/// <summary>
/// Constructor used to specify if we will enable application cache or not
/// </summary>
/// <param name="enableCache"></param>
internal ApplicationContext(bool enableCache)
{
//create a new application cache from the HttpRuntime.Cache
ApplicationCache = HttpRuntime.Cache == null
? new CacheHelper(new System.Web.Caching.Cache(), enableCache)
: new CacheHelper(HttpRuntime.Cache, enableCache);
}
/// <summary>
/// Singleton accessor
/// </summary>
@@ -197,5 +220,54 @@ namespace Umbraco.Core
}
internal set { _services = value; }
}
private volatile bool _disposed;
private readonly ReaderWriterLockSlim _disposalLocker = new ReaderWriterLockSlim();
/// <summary>
/// This will dispose and reset all resources used to run the application
/// </summary>
/// <remarks>
/// IMPORTANT: Never dispose this object if you require the Umbraco application to run, disposing this object
/// is generally used for unit testing and when your application is shutting down after you have booted Umbraco.
/// </remarks>
void IDisposable.Dispose()
{
// Only operate if we haven't already disposed
if (_disposed) return;
using (new WriteLock(_disposalLocker))
{
// Check again now we're inside the lock
if (_disposed) return;
//clear the cache
if (ApplicationCache != null)
{
ApplicationCache.ClearAllCache();
}
//reset all resolvers
ResolverCollection.ResetAll();
//reset resolution itself (though this should be taken care of by resetting any of the resolvers above)
Resolution.Reset();
//reset the instance objects
this.ApplicationCache = null;
if (_databaseContext != null) //need to check the internal field here
{
if (DatabaseContext.IsDatabaseConfigured)
{
DatabaseContext.Database.Dispose();
}
}
this.DatabaseContext = null;
this.Services = null;
this._isReady = false; //set the internal field
// Indicate that the instance has been disposed.
_disposed = true;
}
}
}
}
+119
View File
@@ -0,0 +1,119 @@
namespace Umbraco.Core
{
/// <summary>
/// A plugin type that allows developers to execute code during the Umbraco bootup process
/// </summary>
/// <remarks>
/// Allows you to override the methods that you would like to execute code for: ApplicationInitialized, ApplicationStarting, ApplicationStarted.
///
/// By default none of these methods will execute if the Umbraco application is not configured or if the Umbraco database is not configured, however
/// if you need these methods to execute even if either of these are not configured you can override the properties:
/// ExecuteWhenApplicationNotConfigured and ExecuteWhenDatabaseNotConfigured
/// </remarks>
public abstract class ApplicationEventHandler : IApplicationEventHandler
{
public void OnApplicationInitialized(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
{
if (ShouldExecute(applicationContext))
{
ApplicationInitialized(umbracoApplication, applicationContext);
}
}
public void OnApplicationStarting(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
{
if (ShouldExecute(applicationContext))
{
ApplicationStarting(umbracoApplication, applicationContext);
}
}
public void OnApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
{
if (ShouldExecute(applicationContext))
{
ApplicationStarted(umbracoApplication, applicationContext);
}
}
/// <summary>
/// Overridable method to execute when the ApplicationContext is created and other static objects that require initialization have been setup
/// </summary>
/// <param name="umbracoApplication"></param>
/// <param name="applicationContext"></param>
protected virtual void ApplicationInitialized(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
{
}
/// <summary>
/// OVerridable method to execute when All resolvers have been initialized but resolution is not frozen so they can be modified in this method
/// </summary>
/// <param name="umbracoApplication"></param>
/// <param name="applicationContext"></param>
protected virtual void ApplicationStarting(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
{
}
/// <summary>
/// Overridable method to execute when Bootup is completed, this allows you to perform any other bootup logic required for the application.
/// Resolution is frozen so now they can be used to resolve instances.
/// </summary>
/// <param name="umbracoApplication"></param>
/// <param name="applicationContext"></param>
protected virtual void ApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
{
}
/// <summary>
/// Determine if the methods should execute based on the configuration status of the application.
/// </summary>
/// <param name="applicationContext"></param>
/// <returns></returns>
private bool ShouldExecute(ApplicationContext applicationContext)
{
if (applicationContext.IsConfigured && applicationContext.DatabaseContext.IsDatabaseConfigured)
{
return true;
}
if (!applicationContext.IsConfigured && ExecuteWhenApplicationNotConfigured)
{
return true;
}
if (!applicationContext.DatabaseContext.IsDatabaseConfigured && ExecuteWhenDatabaseNotConfigured)
{
return true;
}
return false;
}
/// <summary>
/// A flag to determine if the overridable methods for this class will execute even if the
/// Umbraco application is not configured
/// </summary>
/// <remarks>
/// An Umbraco Application is not configured when it requires a new install or upgrade. When the latest version in the
/// assembly does not match the version in the config.
/// </remarks>
protected virtual bool ExecuteWhenApplicationNotConfigured
{
get { return false; }
}
/// <summary>
/// A flag to determine if the overridable methods for this class will execute even if the
/// Umbraco database is not configured
/// </summary>
/// <remarks>
/// The Umbraco database is not configured when we cannot connect to the database or when the database tables are not installed.
/// </remarks>
protected virtual bool ExecuteWhenDatabaseNotConfigured
{
get { return false; }
}
}
}
+35 -1
View File
@@ -19,7 +19,41 @@ namespace Umbraco.Core
return new FileInfo(path);
}
/// <summary>
/// <summary>
/// Returns true if the assembly is the App_Code assembly
/// </summary>
/// <param name="assembly"></param>
/// <returns></returns>
public static bool IsAppCodeAssembly(this Assembly assembly)
{
if (assembly.FullName.StartsWith("App_Code"))
{
try
{
Assembly.Load("App_Code");
return true;
}
catch (FileNotFoundException)
{
//this will occur if it cannot load the assembly
return false;
}
}
return false;
}
/// <summary>
/// Returns true if the assembly is the compiled global asax.
/// </summary>
/// <param name="assembly"></param>
/// <returns></returns>
public static bool IsGlobalAsaxAssembly(this Assembly assembly)
{
//only way I can figure out how to test is by the name
return assembly.FullName.StartsWith("App_global.asax");
}
/// <summary>
/// Returns the file used to load the assembly
/// </summary>
/// <param name="assemblyName"></param>
+52
View File
@@ -0,0 +1,52 @@
namespace Umbraco.Core.Cache
{
/// <summary>
/// Constants storing cache keys used in caching
/// </summary>
public static class CacheKeys
{
public const string ApplicationTreeCacheKey = "ApplicationTreeCache";
public const string ApplicationsCacheKey = "ApplicationCache";
public const string UserTypeCacheKey = "UserTypeCache";
public const string ContentItemCacheKey = "contentItem";
public const string MediaCacheKey = "UL_GetMedia";
public const string MacroXsltCacheKey = "macroXslt_";
public const string MacroCacheKey = "UmbracoMacroCache";
public const string MacroHtmlCacheKey = "macroHtml_";
public const string MacroControlCacheKey = "macroControl_";
public const string MacroHtmlDateAddedCacheKey = "macroHtml_DateAdded_";
public const string MacroControlDateAddedCacheKey = "macroControl_DateAdded_";
public const string MemberLibraryCacheKey = "UL_GetMember";
public const string MemberBusinessLogicCacheKey = "MemberCacheItem_";
public const string TemplateFrontEndCacheKey = "template";
public const string TemplateBusinessLogicCacheKey = "UmbracoTemplateCache";
public const string UserContextCacheKey = "UmbracoUserContext";
public const string UserContextTimeoutCacheKey = "UmbracoUserContextTimeout";
public const string UserCacheKey = "UmbracoUser";
public const string UserPermissionsCacheKey = "UmbracoUserPermissions";
public const string ContentTypeCacheKey = "UmbracoContentType";
public const string ContentTypePropertiesCacheKey = "ContentType_PropertyTypes_Content:";
public const string PropertyTypeCacheKey = "UmbracoPropertyTypeCache";
public const string LanguageCacheKey = "UmbracoLanguageCache";
public const string DomainCacheKey = "UmbracoDomainList";
public const string StylesheetCacheKey = "UmbracoStylesheet";
public const string StylesheetPropertyCacheKey = "UmbracoStylesheetProperty";
public const string DataTypeCacheKey = "UmbracoDataTypeDefinition";
}
}
@@ -0,0 +1,24 @@
using System;
using System.Collections.Generic;
namespace Umbraco.Core.Cache
{
/// <summary>
/// An abstract class for implementing a basic cache provider
/// </summary>
/// <remarks>
/// THIS MUST REMAIN INTERNAL UNTIL WE STREAMLINE HOW ALL CACHE IS HANDLED, WE NEED TO SUPPORT HTTP RUNTIME CACHE, IN MEMORY CACHE, ETC...
/// </remarks>
internal abstract class CacheProviderBase
{
public abstract void ClearAllCache();
public abstract void ClearCacheItem(string key);
public abstract void ClearCacheObjectTypes(string typeName);
public abstract void ClearCacheObjectTypes<T>();
public abstract void ClearCacheByKeySearch(string keyStartsWith);
public abstract void ClearCacheByKeyExpression(string regexString);
public abstract IEnumerable<T> GetCacheItemsByKeySearch<T>(string keyStartsWith);
public abstract T GetCacheItem<T>(string cacheKey);
public abstract T GetCacheItem<T>(string cacheKey, Func<T> getCacheItem);
}
}
@@ -0,0 +1,67 @@
using System;
using Umbraco.Core.Events;
using Umbraco.Core.Sync;
using umbraco.interfaces;
namespace Umbraco.Core.Cache
{
/// <summary>
/// A base class for cache refreshers to inherit from that ensures the correct events are raised
/// when cache refreshing occurs.
/// </summary>
/// <typeparam name="TInstanceType">The real cache refresher type, this is used for raising strongly typed events</typeparam>
public abstract class CacheRefresherBase<TInstanceType> : ICacheRefresher
where TInstanceType : ICacheRefresher
{
/// <summary>
/// An event that is raised when cache is updated on an individual server
/// </summary>
/// <remarks>
/// This event will fire on each server configured for an Umbraco project whenever a cache refresher
/// is updated.
/// </remarks>
public static event TypedEventHandler<TInstanceType, CacheRefresherEventArgs> CacheUpdated;
/// <summary>
/// Raises the event
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
protected static void OnCacheUpdated(TInstanceType sender, CacheRefresherEventArgs args)
{
if (CacheUpdated != null)
{
CacheUpdated(sender, args);
}
}
/// <summary>
/// Returns the real instance of the object ('this') for use in strongly typed events
/// </summary>
protected abstract TInstanceType Instance { get; }
public abstract Guid UniqueIdentifier { get; }
public abstract string Name { get; }
public virtual void RefreshAll()
{
OnCacheUpdated(Instance, new CacheRefresherEventArgs(null, MessageType.RefreshAll));
}
public virtual void Refresh(int id)
{
OnCacheUpdated(Instance, new CacheRefresherEventArgs(id, MessageType.RefreshById));
}
public virtual void Remove(int id)
{
OnCacheUpdated(Instance, new CacheRefresherEventArgs(id, MessageType.RemoveById));
}
public virtual void Refresh(Guid id)
{
OnCacheUpdated(Instance, new CacheRefresherEventArgs(id, MessageType.RefreshById));
}
}
}
@@ -0,0 +1,19 @@
using System;
using Umbraco.Core.Sync;
namespace Umbraco.Core.Cache
{
/// <summary>
/// Event args for cache refresher updates
/// </summary>
public class CacheRefresherEventArgs : EventArgs
{
public CacheRefresherEventArgs(object msgObject, MessageType type)
{
MessageType = type;
MessageObject = msgObject;
}
public object MessageObject { get; private set; }
public MessageType MessageType { get; private set; }
}
}
@@ -0,0 +1,356 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Web.Caching;
using Umbraco.Core.Logging;
namespace Umbraco.Core.Cache
{
/// <summary>
/// A CacheProvider that wraps the logic of the HttpRuntime.Cache
/// </summary>
internal class HttpRuntimeCacheProvider : RuntimeCacheProviderBase
{
private readonly System.Web.Caching.Cache _cache;
private static readonly object Locker = new object();
public HttpRuntimeCacheProvider(System.Web.Caching.Cache cache)
{
_cache = cache;
}
/// <summary>
/// Clears everything in umbraco's runtime cache, which means that not only
/// umbraco content is removed, but also other cache items from pages running in
/// the same application / website. Use with care :-)
/// </summary>
public override void ClearAllCache()
{
var cacheEnumerator = _cache.GetEnumerator();
while (cacheEnumerator.MoveNext())
{
_cache.Remove(cacheEnumerator.Key.ToString());
}
}
/// <summary>
/// Clears the item in umbraco's runtime cache with the given key
/// </summary>
/// <param name="key">Key</param>
public override void ClearCacheItem(string key)
{
// NH 10 jan 2012
// Patch by the always wonderful Stéphane Gay to avoid cache null refs
lock (Locker)
{
if (_cache[key] == null) return;
_cache.Remove(key); ;
}
}
/// <summary>
/// Clears all objects in the System.Web.Cache with the System.Type name as the
/// input parameter. (using [object].GetType())
/// </summary>
/// <param name="typeName">The name of the System.Type which should be cleared from cache ex "System.Xml.XmlDocument"</param>
public override void ClearCacheObjectTypes(string typeName)
{
try
{
lock (Locker)
{
foreach (DictionaryEntry c in _cache)
{
if (_cache[c.Key.ToString()] != null
&& _cache[c.Key.ToString()].GetType().ToString().InvariantEquals(typeName))
{
_cache.Remove(c.Key.ToString());
}
}
}
}
catch (Exception e)
{
LogHelper.Error<CacheHelper>("Cache clearing error", e);
}
}
/// <summary>
/// Clears all objects in the System.Web.Cache with the System.Type specified
/// </summary>
public override void ClearCacheObjectTypes<T>()
{
try
{
lock (Locker)
{
foreach (DictionaryEntry c in _cache)
{
if (_cache[c.Key.ToString()] != null
&& _cache[c.Key.ToString()].GetType() == typeof(T))
{
_cache.Remove(c.Key.ToString());
}
}
}
}
catch (Exception e)
{
LogHelper.Error<CacheHelper>("Cache clearing error", e);
}
}
/// <summary>
/// Clears all cache items that starts with the key passed.
/// </summary>
/// <param name="keyStartsWith">The start of the key</param>
public override void ClearCacheByKeySearch(string keyStartsWith)
{
foreach (DictionaryEntry c in _cache)
{
if (c.Key is string && ((string)c.Key).InvariantStartsWith(keyStartsWith))
{
ClearCacheItem((string)c.Key);
}
}
}
/// <summary>
/// Clears all cache items that have a key that matches the regular expression
/// </summary>
/// <param name="regexString"></param>
public override void ClearCacheByKeyExpression(string regexString)
{
foreach (DictionaryEntry c in _cache)
{
if (c.Key is string && Regex.IsMatch(((string)c.Key), regexString))
{
ClearCacheItem((string)c.Key);
}
}
}
public override IEnumerable<T> GetCacheItemsByKeySearch<T>(string keyStartsWith)
{
return (from DictionaryEntry c in _cache
where c.Key is string && ((string)c.Key).InvariantStartsWith(keyStartsWith)
select c.Value.TryConvertTo<T>()
into attempt
where attempt.Success
select attempt.Result).ToList();
}
/// <summary>
/// Returns a cache item by key, does not update the cache if it isn't there.
/// </summary>
/// <typeparam name="TT"></typeparam>
/// <param name="cacheKey"></param>
/// <returns></returns>
public override TT GetCacheItem<TT>(string cacheKey)
{
var result = _cache.Get(cacheKey);
if (result == null)
{
return default(TT);
}
return result.TryConvertTo<TT>().Result;
}
/// <summary>
/// Gets (and adds if necessary) an item from the cache with all of the default parameters
/// </summary>
/// <typeparam name="TT"></typeparam>
/// <param name="cacheKey"></param>
/// <param name="getCacheItem"></param>
/// <returns></returns>
public override TT GetCacheItem<TT>(string cacheKey, Func<TT> getCacheItem)
{
return GetCacheItem(cacheKey, CacheItemPriority.Normal, null, null, null, getCacheItem, Locker);
}
/// <summary>
/// Gets (and adds if necessary) an item from the cache with the specified absolute expiration date (from NOW)
/// </summary>
/// <typeparam name="TT"></typeparam>
/// <param name="cacheKey"></param>
/// <param name="timeout">This will set an absolute expiration from now until the timeout</param>
/// <param name="getCacheItem"></param>
/// <returns></returns>
public override TT GetCacheItem<TT>(string cacheKey,
TimeSpan? timeout, Func<TT> getCacheItem)
{
return GetCacheItem(cacheKey, null, timeout, getCacheItem);
}
/// <summary>
/// Gets (and adds if necessary) an item from the cache with the specified absolute expiration date (from NOW)
/// </summary>
/// <typeparam name="TT"></typeparam>
/// <param name="cacheKey"></param>
/// <param name="refreshAction"></param>
/// <param name="timeout">This will set an absolute expiration from now until the timeout</param>
/// <param name="getCacheItem"></param>
/// <returns></returns>
public override TT GetCacheItem<TT>(string cacheKey,
CacheItemRemovedCallback refreshAction, TimeSpan? timeout,
Func<TT> getCacheItem)
{
return GetCacheItem(cacheKey, CacheItemPriority.Normal, refreshAction, timeout, getCacheItem);
}
/// <summary>
/// Gets (and adds if necessary) an item from the cache with the specified absolute expiration date (from NOW)
/// </summary>
/// <typeparam name="TT"></typeparam>
/// <param name="cacheKey"></param>
/// <param name="priority"></param>
/// <param name="refreshAction"></param>
/// <param name="timeout">This will set an absolute expiration from now until the timeout</param>
/// <param name="getCacheItem"></param>
/// <returns></returns>
public override TT GetCacheItem<TT>(string cacheKey,
CacheItemPriority priority, CacheItemRemovedCallback refreshAction, TimeSpan? timeout,
Func<TT> getCacheItem)
{
return GetCacheItem(cacheKey, priority, refreshAction, null, timeout, getCacheItem);
}
/// <summary>
/// Gets (and adds if necessary) an item from the cache with the specified absolute expiration date (from NOW)
/// </summary>
/// <typeparam name="TT"></typeparam>
/// <param name="cacheKey"></param>
/// <param name="priority"></param>
/// <param name="refreshAction"></param>
/// <param name="cacheDependency"></param>
/// <param name="timeout">This will set an absolute expiration from now until the timeout</param>
/// <param name="getCacheItem"></param>
/// <returns></returns>
public override TT GetCacheItem<TT>(string cacheKey,
CacheItemPriority priority,
CacheItemRemovedCallback refreshAction,
CacheDependency cacheDependency,
TimeSpan? timeout,
Func<TT> getCacheItem)
{
return GetCacheItem(cacheKey, priority, refreshAction, cacheDependency, timeout, getCacheItem, Locker);
}
/// <summary>
/// Gets (and adds if necessary) an item from the cache with the specified absolute expiration date (from NOW)
/// </summary>
/// <typeparam name="TT"></typeparam>
/// <param name="cacheKey"></param>
/// <param name="priority"></param>
/// <param name="refreshAction"></param>
/// <param name="cacheDependency"></param>
/// <param name="timeout">This will set an absolute expiration from now until the timeout</param>
/// <param name="getCacheItem"></param>
/// <param name="syncLock"></param>
/// <returns></returns>
private TT GetCacheItem<TT>(string cacheKey,
CacheItemPriority priority, CacheItemRemovedCallback refreshAction,
CacheDependency cacheDependency, TimeSpan? timeout, Func<TT> getCacheItem, object syncLock)
{
var result = _cache.Get(cacheKey);
if (result == null)
{
lock (syncLock)
{
result = _cache.Get(cacheKey);
if (result == null)
{
result = getCacheItem();
if (result != null)
{
//we use Insert instead of add if for some crazy reason there is now a cache with the cache key in there, it will just overwrite it.
_cache.Insert(cacheKey, result, cacheDependency,
timeout == null ? System.Web.Caching.Cache.NoAbsoluteExpiration : DateTime.Now.Add(timeout.Value),
TimeSpan.Zero, priority, refreshAction);
}
}
}
}
return result.TryConvertTo<TT>().Result;
}
/// <summary>
/// Inserts an item into the cache, if it already exists in the cache it will be replaced
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="cacheKey"></param>
/// <param name="priority"></param>
/// <param name="getCacheItem"></param>
public override void InsertCacheItem<T>(string cacheKey,
CacheItemPriority priority,
Func<T> getCacheItem)
{
InsertCacheItem(cacheKey, priority, null, null, null, getCacheItem);
}
/// <summary>
/// Inserts an item into the cache, if it already exists in the cache it will be replaced
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="cacheKey"></param>
/// <param name="priority"></param>
/// <param name="timeout">This will set an absolute expiration from now until the timeout</param>
/// <param name="getCacheItem"></param>
public override void InsertCacheItem<T>(string cacheKey,
CacheItemPriority priority,
TimeSpan? timeout,
Func<T> getCacheItem)
{
InsertCacheItem(cacheKey, priority, null, null, timeout, getCacheItem);
}
/// <summary>
/// Inserts an item into the cache, if it already exists in the cache it will be replaced
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="cacheKey"></param>
/// <param name="priority"></param>
/// <param name="cacheDependency"></param>
/// <param name="timeout">This will set an absolute expiration from now until the timeout</param>
/// <param name="getCacheItem"></param>
public override void InsertCacheItem<T>(string cacheKey,
CacheItemPriority priority,
CacheDependency cacheDependency,
TimeSpan? timeout,
Func<T> getCacheItem)
{
InsertCacheItem(cacheKey, priority, null, cacheDependency, timeout, getCacheItem);
}
/// <summary>
/// Inserts an item into the cache, if it already exists in the cache it will be replaced
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="cacheKey"></param>
/// <param name="priority"></param>
/// <param name="refreshAction"></param>
/// <param name="cacheDependency"></param>
/// <param name="timeout">This will set an absolute expiration from now until the timeout</param>
/// <param name="getCacheItem"></param>
public override void InsertCacheItem<T>(string cacheKey,
CacheItemPriority priority,
CacheItemRemovedCallback refreshAction,
CacheDependency cacheDependency,
TimeSpan? timeout,
Func<T> getCacheItem)
{
object result = getCacheItem();
if (result != null)
{
//we use Insert instead of add if for some crazy reason there is now a cache with the cache key in there, it will just overwrite it.
_cache.Insert(cacheKey, result, cacheDependency,
timeout == null ? System.Web.Caching.Cache.NoAbsoluteExpiration : DateTime.Now.Add(timeout.Value),
TimeSpan.Zero, priority, refreshAction);
}
}
}
}
+18
View File
@@ -0,0 +1,18 @@
using umbraco.interfaces;
namespace Umbraco.Core.Cache
{
/// <summary>
/// Strongly type cache refresher that is able to refresh cache of real instances of objects as well as IDs
/// </summary>
/// <typeparam name="T"></typeparam>
/// <remarks>
/// This is much better for performance when we're not running in a load balanced environment so we can refresh the cache
/// against a already resolved object instead of looking the object back up by id.
/// </remarks>
interface ICacheRefresher<T> : ICacheRefresher
{
void Refresh(T instance);
void Remove(T instance);
}
}
@@ -0,0 +1,16 @@
using umbraco.interfaces;
namespace Umbraco.Core.Cache
{
/// <summary>
/// A cache refresher that supports refreshing or removing cache based on a custom Json payload
/// </summary>
interface IJsonCacheRefresher : ICacheRefresher
{
/// <summary>
/// Refreshes, clears, etc... any cache based on the information provided in the json
/// </summary>
/// <param name="jsonPayload"></param>
void Refresh(string jsonPayload);
}
}
@@ -0,0 +1,20 @@
using Umbraco.Core.Sync;
using umbraco.interfaces;
namespace Umbraco.Core.Cache
{
/// <summary>
/// A base class for json cache refreshers that ensures the correct events are raised when
/// cache refreshing occurs.
/// </summary>
/// <typeparam name="TInstanceType">The real cache refresher type, this is used for raising strongly typed events</typeparam>
public abstract class JsonCacheRefresherBase<TInstanceType> : CacheRefresherBase<TInstanceType>, IJsonCacheRefresher
where TInstanceType : ICacheRefresher
{
public virtual void Refresh(string jsonPayload)
{
OnCacheUpdated(Instance, new CacheRefresherEventArgs(jsonPayload, MessageType.RefreshByJson));
}
}
}
@@ -0,0 +1,85 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Caching;
namespace Umbraco.Core.Cache
{
internal class NullCacheProvider : RuntimeCacheProviderBase
{
public override void ClearAllCache()
{
}
public override void ClearCacheItem(string key)
{
}
public override void ClearCacheObjectTypes(string typeName)
{
}
public override void ClearCacheObjectTypes<T>()
{
}
public override void ClearCacheByKeySearch(string keyStartsWith)
{
}
public override void ClearCacheByKeyExpression(string regexString)
{
}
public override IEnumerable<T> GetCacheItemsByKeySearch<T>(string keyStartsWith)
{
return Enumerable.Empty<T>();
}
public override T GetCacheItem<T>(string cacheKey)
{
return default(T);
}
public override T GetCacheItem<T>(string cacheKey, Func<T> getCacheItem)
{
return getCacheItem();
}
public override T GetCacheItem<T>(string cacheKey, TimeSpan? timeout, Func<T> getCacheItem)
{
return getCacheItem();
}
public override T GetCacheItem<T>(string cacheKey, CacheItemRemovedCallback refreshAction, TimeSpan? timeout, Func<T> getCacheItem)
{
return getCacheItem();
}
public override T GetCacheItem<T>(string cacheKey, CacheItemPriority priority, CacheItemRemovedCallback refreshAction, TimeSpan? timeout, Func<T> getCacheItem)
{
return getCacheItem();
}
public override T GetCacheItem<T>(string cacheKey, CacheItemPriority priority, CacheItemRemovedCallback refreshAction, CacheDependency cacheDependency, TimeSpan? timeout, Func<T> getCacheItem)
{
return getCacheItem();
}
public override void InsertCacheItem<T>(string cacheKey, CacheItemPriority priority, Func<T> getCacheItem)
{
}
public override void InsertCacheItem<T>(string cacheKey, CacheItemPriority priority, TimeSpan? timeout, Func<T> getCacheItem)
{
}
public override void InsertCacheItem<T>(string cacheKey, CacheItemPriority priority, CacheDependency cacheDependency, TimeSpan? timeout, Func<T> getCacheItem)
{
}
public override void InsertCacheItem<T>(string cacheKey, CacheItemPriority priority, CacheItemRemovedCallback refreshAction, CacheDependency cacheDependency, TimeSpan? timeout, Func<T> getCacheItem)
{
}
}
}
@@ -0,0 +1,24 @@
using System;
using System.Text;
using System.Web.Caching;
namespace Umbraco.Core.Cache
{
/// <summary>
/// An abstract class for implementing a runtime cache provider
/// </summary>
/// <remarks>
/// THIS MUST REMAIN INTERNAL UNTIL WE STREAMLINE HOW ALL CACHE IS HANDLED, WE NEED TO SUPPORT HTTP RUNTIME CACHE, IN MEMORY CACHE, REQUEST CACHE, ETC...
/// </remarks>
internal abstract class RuntimeCacheProviderBase : CacheProviderBase
{
public abstract T GetCacheItem<T>(string cacheKey, TimeSpan? timeout, Func<T> getCacheItem);
public abstract T GetCacheItem<T>(string cacheKey, CacheItemRemovedCallback refreshAction, TimeSpan? timeout, Func<T> getCacheItem);
public abstract T GetCacheItem<T>(string cacheKey, CacheItemPriority priority, CacheItemRemovedCallback refreshAction, TimeSpan? timeout, Func<T> getCacheItem);
public abstract T GetCacheItem<T>(string cacheKey, CacheItemPriority priority, CacheItemRemovedCallback refreshAction, CacheDependency cacheDependency, TimeSpan? timeout, Func<T> getCacheItem);
public abstract void InsertCacheItem<T>(string cacheKey, CacheItemPriority priority, Func<T> getCacheItem);
public abstract void InsertCacheItem<T>(string cacheKey, CacheItemPriority priority, TimeSpan? timeout, Func<T> getCacheItem);
public abstract void InsertCacheItem<T>(string cacheKey, CacheItemPriority priority, CacheDependency cacheDependency, TimeSpan? timeout, Func<T> getCacheItem);
public abstract void InsertCacheItem<T>(string cacheKey, CacheItemPriority priority, CacheItemRemovedCallback refreshAction, CacheDependency cacheDependency, TimeSpan? timeout, Func<T> getCacheItem);
}
}
@@ -0,0 +1,102 @@
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Web.Caching;
namespace Umbraco.Core.Cache
{
/// <summary>
/// A cache provider that statically caches everything in an in memory dictionary
/// </summary>
internal class StaticCacheProvider : CacheProviderBase
{
private readonly ConcurrentDictionary<string, object> _staticCache = new ConcurrentDictionary<string, object>();
public override void ClearAllCache()
{
_staticCache.Clear();
}
public override void ClearCacheItem(string key)
{
object val;
_staticCache.TryRemove(key, out val);
}
public override void ClearCacheObjectTypes(string typeName)
{
foreach (var key in _staticCache.Keys)
{
if (_staticCache[key] != null
&& _staticCache[key].GetType().ToString().InvariantEquals(typeName))
{
object val;
_staticCache.TryRemove(key, out val);
}
}
}
public override void ClearCacheObjectTypes<T>()
{
foreach (var key in _staticCache.Keys)
{
if (_staticCache[key] != null
&& _staticCache[key].GetType() == typeof(T))
{
object val;
_staticCache.TryRemove(key, out val);
}
}
}
public override void ClearCacheByKeySearch(string keyStartsWith)
{
foreach (var key in _staticCache.Keys)
{
if (key.InvariantStartsWith(keyStartsWith))
{
ClearCacheItem(key);
}
}
}
public override void ClearCacheByKeyExpression(string regexString)
{
foreach (var key in _staticCache.Keys)
{
if (Regex.IsMatch(key, regexString))
{
ClearCacheItem(key);
}
}
}
public override IEnumerable<T> GetCacheItemsByKeySearch<T>(string keyStartsWith)
{
return (from KeyValuePair<string, object> c in _staticCache
where c.Key.InvariantStartsWith(keyStartsWith)
select c.Value.TryConvertTo<T>()
into attempt
where attempt.Success
select attempt.Result).ToList();
}
public override T GetCacheItem<T>(string cacheKey)
{
var result = _staticCache[cacheKey];
if (result == null)
{
return default(T);
}
return result.TryConvertTo<T>().Result;
}
public override T GetCacheItem<T>(string cacheKey, Func<T> getCacheItem)
{
return (T)_staticCache.GetOrAdd(cacheKey, getCacheItem);
}
}
}
@@ -0,0 +1,25 @@
using Umbraco.Core.Sync;
using umbraco.interfaces;
namespace Umbraco.Core.Cache
{
/// <summary>
/// A base class for cache refreshers to inherit from that ensures the correct events are raised
/// when cache refreshing occurs.
/// </summary>
/// <typeparam name="TInstanceType">The real cache refresher type, this is used for raising strongly typed events</typeparam>
/// <typeparam name="TEntityType">The entity type that this refresher can update cache for</typeparam>
public abstract class TypedCacheRefresherBase<TInstanceType, TEntityType> : CacheRefresherBase<TInstanceType>, ICacheRefresher<TEntityType>
where TInstanceType : ICacheRefresher
{
public virtual void Refresh(TEntityType instance)
{
OnCacheUpdated(Instance, new CacheRefresherEventArgs(instance, MessageType.RefreshByInstance));
}
public virtual void Remove(TEntityType instance)
{
OnCacheUpdated(Instance, new CacheRefresherEventArgs(instance, MessageType.RemoveByInstance));
}
}
}
+479 -81
View File
@@ -3,8 +3,10 @@ using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Web;
using System.Web.Caching;
using Umbraco.Core.Cache;
using Umbraco.Core.Logging;
namespace Umbraco.Core
@@ -13,31 +15,198 @@ namespace Umbraco.Core
/// <summary>
/// Class that is exposed by the ApplicationContext for application wide caching purposes
/// </summary>
/// <remarks>
/// This class may be opened publicly at some point but needs a review of what is absoletely necessary.
/// </remarks>
public class CacheHelper
public class CacheHelper
{
private readonly Cache _cache;
private readonly bool _enableCache;
private readonly CacheProviderBase _staticCache;
private readonly CacheProviderBase _nullStaticCache = new NullCacheProvider();
private readonly RuntimeCacheProviderBase _httpCache;
private readonly RuntimeCacheProviderBase _nullHttpCache = new NullCacheProvider();
public CacheHelper(System.Web.Caching.Cache cache)
: this(cache, true)
{
_cache = cache;
}
private static readonly object Locker = new object();
internal CacheHelper(System.Web.Caching.Cache cache, bool enableCache)
: this(new HttpRuntimeCacheProvider(cache), enableCache)
{
}
internal CacheHelper(RuntimeCacheProviderBase httpCacheProvider, bool enableCache)
: this(httpCacheProvider, new StaticCacheProvider(), enableCache)
{
}
internal CacheHelper(RuntimeCacheProviderBase httpCacheProvider, CacheProviderBase staticCacheProvider, bool enableCache)
{
_httpCache = httpCacheProvider;
_staticCache = staticCacheProvider;
_enableCache = enableCache;
}
#region Static cache
/// <summary>
/// Clears everything in umbraco's runtime cache, which means that not only
/// umbraco content is removed, but also other cache items from pages running in
/// the same application / website. Use with care :-)
/// Clears the item in umbraco's static cache
/// </summary>
internal void ClearAllStaticCache()
{
if (!_enableCache)
{
_nullStaticCache.ClearAllCache();
}
else
{
_staticCache.ClearAllCache();
}
}
/// <summary>
/// Clears the item in umbraco's static cache with the given key
/// </summary>
/// <param name="key">Key</param>
internal void ClearStaticCacheItem(string key)
{
if (!_enableCache)
{
_nullStaticCache.ClearCacheItem(key);
}
else
{
_staticCache.ClearCacheItem(key);
}
}
/// <summary>
/// Clears all objects in the static cache with the System.Type name as the
/// input parameter. (using [object].GetType())
/// </summary>
/// <param name="typeName">The name of the System.Type which should be cleared from cache ex "System.Xml.XmlDocument"</param>
internal void ClearStaticCacheObjectTypes(string typeName)
{
if (!_enableCache)
{
_nullStaticCache.ClearCacheObjectTypes(typeName);
}
else
{
_staticCache.ClearCacheObjectTypes(typeName);
}
}
/// <summary>
/// Clears all objects in the static cache with the System.Type specified
/// </summary>
internal void ClearStaticCacheObjectTypes<T>()
{
if (!_enableCache)
{
_nullStaticCache.ClearCacheObjectTypes<T>();
}
else
{
_staticCache.ClearCacheObjectTypes<T>();
}
}
/// <summary>
/// Clears all static cache items that starts with the key passed.
/// </summary>
/// <param name="keyStartsWith">The start of the key</param>
internal void ClearStaticCacheByKeySearch(string keyStartsWith)
{
if (!_enableCache)
{
_nullStaticCache.ClearCacheByKeySearch(keyStartsWith);
}
else
{
_staticCache.ClearCacheByKeySearch(keyStartsWith);
}
}
/// <summary>
/// Clears all cache items that have a key that matches the regular expression
/// </summary>
/// <param name="regexString"></param>
internal void ClearStaticCacheByKeyExpression(string regexString)
{
if (!_enableCache)
{
_nullStaticCache.ClearCacheByKeyExpression(regexString);
}
else
{
_staticCache.ClearCacheByKeyExpression(regexString);
}
}
internal IEnumerable<T> GetStaticCacheItemsByKeySearch<T>(string keyStartsWith)
{
if (!_enableCache)
{
return _nullStaticCache.GetCacheItemsByKeySearch<T>(keyStartsWith);
}
else
{
return _staticCache.GetCacheItemsByKeySearch<T>(keyStartsWith);
}
}
/// <summary>
/// Returns a static cache item by key, does not update the cache if it isn't there.
/// </summary>
/// <typeparam name="TT"></typeparam>
/// <param name="cacheKey"></param>
/// <returns></returns>
internal TT GetStaticCacheItem<TT>(string cacheKey)
{
if (!_enableCache)
{
return _nullStaticCache.GetCacheItem<TT>(cacheKey);
}
else
{
return _staticCache.GetCacheItem<TT>(cacheKey);
}
}
/// <summary>
/// Gets (and adds if necessary) an item from the static cache with all of the default parameters
/// </summary>
/// <typeparam name="TT"></typeparam>
/// <param name="cacheKey"></param>
/// <param name="getCacheItem"></param>
/// <returns></returns>
internal TT GetStaticCacheItem<TT>(string cacheKey, Func<TT> getCacheItem)
{
if (!_enableCache)
{
return _nullStaticCache.GetCacheItem<TT>(cacheKey, getCacheItem);
}
else
{
return _staticCache.GetCacheItem<TT>(cacheKey, getCacheItem);
}
}
#endregion
#region Runtime/Http Cache
/// <summary>
/// Clears the item in umbraco's runtime cache
/// </summary>
public void ClearAllCache()
{
var cacheEnumerator = _cache.GetEnumerator();
while (cacheEnumerator.MoveNext())
{
if (!_enableCache)
{
_cache.Remove(cacheEnumerator.Key.ToString());
_nullHttpCache.ClearAllCache();
}
else
{
_httpCache.ClearAllCache();
}
}
@@ -47,12 +216,13 @@ namespace Umbraco.Core
/// <param name="key">Key</param>
public void ClearCacheItem(string key)
{
// NH 10 jan 2012
// Patch by the always wonderful Stéphane Gay to avoid cache null refs
lock (Locker)
if (!_enableCache)
{
if (_cache[key] == null) return;
_cache.Remove(key);;
_nullHttpCache.ClearCacheItem(key);
}
else
{
_httpCache.ClearCacheItem(key);
}
}
@@ -64,19 +234,28 @@ namespace Umbraco.Core
/// <param name="typeName">The name of the System.Type which should be cleared from cache ex "System.Xml.XmlDocument"</param>
public void ClearCacheObjectTypes(string typeName)
{
try
if (!_enableCache)
{
lock (Locker)
{
foreach (var c in from DictionaryEntry c in _cache where _cache[c.Key.ToString()] != null && _cache[c.Key.ToString()].GetType().ToString() == typeName select c)
{
_cache.Remove(c.Key.ToString());
}
}
_nullHttpCache.ClearCacheObjectTypes(typeName);
}
catch (Exception e)
else
{
LogHelper.Error<CacheHelper>("Cache clearing error", e);
_httpCache.ClearCacheObjectTypes(typeName);
}
}
/// <summary>
/// Clears all objects in the System.Web.Cache with the System.Type specified
/// </summary>
public void ClearCacheObjectTypes<T>()
{
if (!_enableCache)
{
_nullHttpCache.ClearCacheObjectTypes<T>();
}
else
{
_httpCache.ClearCacheObjectTypes<T>();
}
}
@@ -86,79 +265,298 @@ namespace Umbraco.Core
/// <param name="keyStartsWith">The start of the key</param>
public void ClearCacheByKeySearch(string keyStartsWith)
{
foreach (var c in from DictionaryEntry c in _cache where c.Key is string && ((string)c.Key).StartsWith(keyStartsWith) select c)
{
ClearCacheItem((string)c.Key);
}
if (!_enableCache)
{
_nullHttpCache.ClearCacheByKeySearch(keyStartsWith);
}
else
{
_httpCache.ClearCacheByKeySearch(keyStartsWith);
}
}
/// <summary>
/// Clears all cache items that have a key that matches the regular expression
/// </summary>
/// <param name="regexString"></param>
public void ClearCacheByKeyExpression(string regexString)
{
if (!_enableCache)
{
_nullHttpCache.ClearCacheByKeyExpression(regexString);
}
else
{
_httpCache.ClearCacheByKeyExpression(regexString);
}
}
public IEnumerable<T> GetCacheItemsByKeySearch<T>(string keyStartsWith)
{
if (!_enableCache)
{
return _nullHttpCache.GetCacheItemsByKeySearch<T>(keyStartsWith);
}
else
{
return _httpCache.GetCacheItemsByKeySearch<T>(keyStartsWith);
}
}
/// <summary>
/// Returns a cache item by key, does not update the cache if it isn't there.
/// </summary>
/// <typeparam name="TT"></typeparam>
/// <param name="cacheKey"></param>
/// <returns></returns>
public TT GetCacheItem<TT>(string cacheKey)
{
if (!_enableCache)
{
return _nullHttpCache.GetCacheItem<TT>(cacheKey);
}
else
{
return _httpCache.GetCacheItem<TT>(cacheKey);
}
}
/// <summary>
/// Gets (and adds if necessary) an item from the cache with all of the default parameters
/// </summary>
/// <typeparam name="TT"></typeparam>
/// <param name="cacheKey"></param>
/// <param name="getCacheItem"></param>
/// <returns></returns>
public TT GetCacheItem<TT>(string cacheKey, Func<TT> getCacheItem)
{
if (!_enableCache)
{
return _nullHttpCache.GetCacheItem<TT>(cacheKey, getCacheItem);
}
else
{
return _httpCache.GetCacheItem<TT>(cacheKey, getCacheItem);
}
}
/// <summary>
/// Gets (and adds if necessary) an item from the cache with the specified absolute expiration date (from NOW)
/// </summary>
/// <typeparam name="TT"></typeparam>
/// <param name="cacheKey"></param>
/// <param name="timeout">This will set an absolute expiration from now until the timeout</param>
/// <param name="getCacheItem"></param>
/// <returns></returns>
public TT GetCacheItem<TT>(string cacheKey,
TimeSpan timeout, Func<TT> getCacheItem)
{
return GetCacheItem(cacheKey, null, timeout, getCacheItem);
if (!_enableCache)
{
return _nullHttpCache.GetCacheItem<TT>(cacheKey, timeout, getCacheItem);
}
else
{
return _httpCache.GetCacheItem<TT>(cacheKey, timeout, getCacheItem);
}
}
/// <summary>
/// Gets (and adds if necessary) an item from the cache with the specified absolute expiration date (from NOW)
/// </summary>
/// <typeparam name="TT"></typeparam>
/// <param name="cacheKey"></param>
/// <param name="refreshAction"></param>
/// <param name="timeout">This will set an absolute expiration from now until the timeout</param>
/// <param name="getCacheItem"></param>
/// <returns></returns>
public TT GetCacheItem<TT>(string cacheKey,
CacheItemRemovedCallback refreshAction, TimeSpan timeout,
Func<TT> getCacheItem)
{
return GetCacheItem(cacheKey, CacheItemPriority.Normal, refreshAction, timeout, getCacheItem);
if (!_enableCache)
{
return _nullHttpCache.GetCacheItem<TT>(cacheKey, refreshAction, timeout, getCacheItem);
}
else
{
return _httpCache.GetCacheItem<TT>(cacheKey, refreshAction, timeout, getCacheItem);
}
}
/// <summary>
/// Gets (and adds if necessary) an item from the cache with the specified absolute expiration date (from NOW)
/// </summary>
/// <typeparam name="TT"></typeparam>
/// <param name="cacheKey"></param>
/// <param name="priority"></param>
/// <param name="refreshAction"></param>
/// <param name="timeout">This will set an absolute expiration from now until the timeout</param>
/// <param name="getCacheItem"></param>
/// <returns></returns>
public TT GetCacheItem<TT>(string cacheKey,
CacheItemPriority priority, CacheItemRemovedCallback refreshAction, TimeSpan timeout,
Func<TT> getCacheItem)
{
return GetCacheItem(cacheKey, priority, refreshAction, null, timeout, getCacheItem);
if (!_enableCache)
{
return _nullHttpCache.GetCacheItem<TT>(cacheKey, priority, refreshAction, timeout, getCacheItem);
}
else
{
return _httpCache.GetCacheItem<TT>(cacheKey, priority, refreshAction, timeout, getCacheItem);
}
}
/// <summary>
/// Gets (and adds if necessary) an item from the cache with the specified absolute expiration date (from NOW)
/// </summary>
/// <typeparam name="TT"></typeparam>
/// <param name="cacheKey"></param>
/// <param name="priority"></param>
/// <param name="refreshAction"></param>
/// <param name="cacheDependency"></param>
/// <param name="timeout">This will set an absolute expiration from now until the timeout</param>
/// <param name="getCacheItem"></param>
/// <returns></returns>
public TT GetCacheItem<TT>(string cacheKey,
CacheItemPriority priority,
CacheItemRemovedCallback refreshAction,
CacheDependency cacheDependency,
TimeSpan timeout,
Func<TT> getCacheItem)
CacheItemPriority priority,
CacheItemRemovedCallback refreshAction,
CacheDependency cacheDependency,
TimeSpan timeout,
Func<TT> getCacheItem)
{
return GetCacheItem(cacheKey, priority, refreshAction, cacheDependency, timeout, getCacheItem, Locker);
if (!_enableCache)
{
return _nullHttpCache.GetCacheItem<TT>(cacheKey, priority, refreshAction, cacheDependency, timeout, getCacheItem);
}
else
{
return _httpCache.GetCacheItem<TT>(cacheKey, priority, refreshAction, cacheDependency, timeout, getCacheItem);
}
}
/// <summary>
/// This is used only for legacy purposes as I did not want to change all of the locking to one lock found on this object,
/// however, the reason this is used for legacy purposes is because I see zero reason to use different sync locks, just the one
/// lock (Locker) on this class should be sufficient.
/// </summary>
/// <typeparam name="TT"></typeparam>
/// <param name="cacheKey"></param>
/// <param name="priority"></param>
/// <param name="refreshAction"></param>
/// <param name="cacheDependency"></param>
/// <param name="timeout"></param>
/// <param name="getCacheItem"></param>
/// <param name="syncLock"></param>
/// <returns></returns>
internal TT GetCacheItem<TT>(string cacheKey,
CacheItemPriority priority, CacheItemRemovedCallback refreshAction,
CacheDependency cacheDependency, TimeSpan timeout, Func<TT> getCacheItem, object syncLock)
{
var result = _cache.Get(cacheKey);
if (result == null)
{
lock (syncLock)
{
result = _cache.Get(cacheKey);
if (result == null)
{
result = getCacheItem();
if (result != null)
{
//we use Insert instead of add if for some crazy reason there is now a cache with the cache key in there, it will just overwrite it.
_cache.Insert(cacheKey, result, cacheDependency, DateTime.Now.Add(timeout), TimeSpan.Zero, priority, refreshAction);
}
}
}
}
return (TT)result;
}
}
/// <summary>
/// Gets (and adds if necessary) an item from the cache
/// </summary>
/// <typeparam name="TT"></typeparam>
/// <param name="cacheKey"></param>
/// <param name="priority"></param>
/// <param name="cacheDependency"></param>
/// <param name="getCacheItem"></param>
/// <returns></returns>
public TT GetCacheItem<TT>(string cacheKey,
CacheItemPriority priority,
CacheDependency cacheDependency,
Func<TT> getCacheItem)
{
if (!_enableCache)
{
return _nullHttpCache.GetCacheItem<TT>(cacheKey, priority, null, cacheDependency, null, getCacheItem);
}
else
{
return _httpCache.GetCacheItem<TT>(cacheKey, priority, null, cacheDependency, null, getCacheItem);
}
}
/// <summary>
/// Inserts an item into the cache, if it already exists in the cache it will be replaced
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="cacheKey"></param>
/// <param name="priority"></param>
/// <param name="getCacheItem"></param>
public void InsertCacheItem<T>(string cacheKey,
CacheItemPriority priority,
Func<T> getCacheItem)
{
if (!_enableCache)
{
_nullHttpCache.InsertCacheItem<T>(cacheKey, priority, getCacheItem);
}
else
{
_httpCache.InsertCacheItem<T>(cacheKey, priority, getCacheItem);
}
}
/// <summary>
/// Inserts an item into the cache, if it already exists in the cache it will be replaced
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="cacheKey"></param>
/// <param name="priority"></param>
/// <param name="timeout">This will set an absolute expiration from now until the timeout</param>
/// <param name="getCacheItem"></param>
public void InsertCacheItem<T>(string cacheKey,
CacheItemPriority priority,
TimeSpan timeout,
Func<T> getCacheItem)
{
if (!_enableCache)
{
_nullHttpCache.InsertCacheItem<T>(cacheKey, priority, timeout, getCacheItem);
}
else
{
_httpCache.InsertCacheItem<T>(cacheKey, priority, timeout, getCacheItem);
}
}
/// <summary>
/// Inserts an item into the cache, if it already exists in the cache it will be replaced
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="cacheKey"></param>
/// <param name="priority"></param>
/// <param name="cacheDependency"></param>
/// <param name="timeout">This will set an absolute expiration from now until the timeout</param>
/// <param name="getCacheItem"></param>
public void InsertCacheItem<T>(string cacheKey,
CacheItemPriority priority,
CacheDependency cacheDependency,
TimeSpan timeout,
Func<T> getCacheItem)
{
if (!_enableCache)
{
_nullHttpCache.InsertCacheItem<T>(cacheKey, priority, cacheDependency, timeout, getCacheItem);
}
else
{
_httpCache.InsertCacheItem<T>(cacheKey, priority, cacheDependency, timeout, getCacheItem);
}
}
/// <summary>
/// Inserts an item into the cache, if it already exists in the cache it will be replaced
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="cacheKey"></param>
/// <param name="priority"></param>
/// <param name="refreshAction"></param>
/// <param name="cacheDependency"></param>
/// <param name="timeout">This will set an absolute expiration from now until the timeout</param>
/// <param name="getCacheItem"></param>
public void InsertCacheItem<T>(string cacheKey,
CacheItemPriority priority,
CacheItemRemovedCallback refreshAction,
CacheDependency cacheDependency,
TimeSpan? timeout,
Func<T> getCacheItem)
{
if (!_enableCache)
{
_nullHttpCache.InsertCacheItem<T>(cacheKey, priority, refreshAction, cacheDependency, timeout, getCacheItem);
}
else
{
_httpCache.InsertCacheItem<T>(cacheKey, priority, refreshAction, cacheDependency, timeout, getCacheItem);
}
}
#endregion
}
}
+1 -1
View File
@@ -31,7 +31,7 @@ namespace Umbraco.Core
{
get
{
EnsureIdsAreTracked();
EnsureIsInitialized();
return Values;
}
}
@@ -0,0 +1,35 @@
using System;
namespace Umbraco.Core.CodeAnnotations
{
/// <summary>
/// Attribute to add a Friendly Name string with an UmbracoObjectType enum value
/// </summary>
[AttributeUsage(AttributeTargets.All, AllowMultiple = false, Inherited = false)]
internal class FriendlyNameAttribute : Attribute
{
/// <summary>
/// friendly name value
/// </summary>
private readonly string _friendlyName;
/// <summary>
/// Initializes a new instance of the FriendlyNameAttribute class
/// Sets the friendly name value
/// </summary>
/// <param name="friendlyName">attribute value</param>
public FriendlyNameAttribute(string friendlyName)
{
this._friendlyName = friendlyName;
}
/// <summary>
/// Gets the friendly name
/// </summary>
/// <returns>string of friendly name</returns>
public override string ToString()
{
return this._friendlyName;
}
}
}
@@ -0,0 +1,26 @@
using System;
namespace Umbraco.Core.CodeAnnotations
{
/// <summary>
/// Attribute to associate a GUID string and Type with an UmbracoObjectType Enum value
/// </summary>
[AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = false)]
internal class UmbracoObjectTypeAttribute : Attribute
{
public UmbracoObjectTypeAttribute(string objectId)
{
ObjectId = new Guid(objectId);
}
public UmbracoObjectTypeAttribute(string objectId, Type modelType)
{
ObjectId = new Guid(objectId);
ModelType = modelType;
}
public Guid ObjectId { get; private set; }
public Type ModelType { get; private set; }
}
}
+167
View File
@@ -0,0 +1,167 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
namespace Umbraco.Core
{
/// <summary>
/// A thread-safe representation of a <see cref="HashSet{T}"/>.
/// Enumerating this collection is thread-safe and will only operate on a clone that is generated before returning the enumerator.
/// </summary>
/// <typeparam name="T"></typeparam>
[Serializable]
public class ConcurrentHashSet<T> : ICollection<T>
{
private readonly HashSet<T> _innerSet = new HashSet<T>();
private readonly ReaderWriterLockSlim _instanceLocker = new ReaderWriterLockSlim(LockRecursionPolicy.NoRecursion);
/// <summary>
/// Returns an enumerator that iterates through the collection.
/// </summary>
/// <returns>
/// A <see cref="T:System.Collections.Generic.IEnumerator`1"/> that can be used to iterate through the collection.
/// </returns>
/// <filterpriority>1</filterpriority>
public IEnumerator<T> GetEnumerator()
{
return GetThreadSafeClone().GetEnumerator();
}
/// <summary>
/// Returns an enumerator that iterates through a collection.
/// </summary>
/// <returns>
/// An <see cref="T:System.Collections.IEnumerator"/> object that can be used to iterate through the collection.
/// </returns>
/// <filterpriority>2</filterpriority>
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
/// <summary>
/// Removes the first occurrence of a specific object from the <see cref="T:System.Collections.Generic.ICollection`1"/>.
/// </summary>
/// <returns>
/// true if <paramref name="item"/> was successfully removed from the <see cref="T:System.Collections.Generic.ICollection`1"/>; otherwise, false. This method also returns false if <paramref name="item"/> is not found in the original <see cref="T:System.Collections.Generic.ICollection`1"/>.
/// </returns>
/// <param name="item">The object to remove from the <see cref="T:System.Collections.Generic.ICollection`1"/>.</param><exception cref="T:System.NotSupportedException">The <see cref="T:System.Collections.Generic.ICollection`1"/> is read-only.</exception>
public bool Remove(T item)
{
using (new WriteLock(_instanceLocker))
{
return _innerSet.Remove(item);
}
}
/// <summary>
/// Gets the number of elements contained in the <see cref="T:System.Collections.ICollection"/>.
/// </summary>
/// <returns>
/// The number of elements contained in the <see cref="T:System.Collections.ICollection"/>.
/// </returns>
/// <filterpriority>2</filterpriority>
public int Count
{
get { return GetThreadSafeClone().Count; }
}
/// <summary>
/// Gets a value indicating whether the <see cref="T:System.Collections.Generic.ICollection`1"/> is read-only.
/// </summary>
/// <returns>
/// true if the <see cref="T:System.Collections.Generic.ICollection`1"/> is read-only; otherwise, false.
/// </returns>
public bool IsReadOnly
{
get { return false; }
}
/// <summary>
/// Adds an item to the <see cref="T:System.Collections.Generic.ICollection`1"/>.
/// </summary>
/// <param name="item">The object to add to the <see cref="T:System.Collections.Generic.ICollection`1"/>.</param><exception cref="T:System.NotSupportedException">The <see cref="T:System.Collections.Generic.ICollection`1"/> is read-only.</exception>
public void Add(T item)
{
using (new WriteLock(_instanceLocker))
{
_innerSet.Add(item);
}
}
/// <summary>
/// Attempts to add an item to the collection
/// </summary>
/// <param name="item"></param>
/// <returns></returns>
public bool TryAdd(T item)
{
var clone = GetThreadSafeClone();
if (clone.Contains(item)) return false;
using (new WriteLock(_instanceLocker))
{
//double check
if (_innerSet.Contains(item)) return false;
_innerSet.Add(item);
return true;
}
}
/// <summary>
/// Removes all items from the <see cref="T:System.Collections.Generic.ICollection`1"/>.
/// </summary>
/// <exception cref="T:System.NotSupportedException">The <see cref="T:System.Collections.Generic.ICollection`1"/> is read-only. </exception>
public void Clear()
{
using (new WriteLock(_instanceLocker))
{
_innerSet.Clear();
}
}
/// <summary>
/// Determines whether the <see cref="T:System.Collections.Generic.ICollection`1"/> contains a specific value.
/// </summary>
/// <returns>
/// true if <paramref name="item"/> is found in the <see cref="T:System.Collections.Generic.ICollection`1"/>; otherwise, false.
/// </returns>
/// <param name="item">The object to locate in the <see cref="T:System.Collections.Generic.ICollection`1"/>.</param>
public bool Contains(T item)
{
return GetThreadSafeClone().Contains(item);
}
/// <summary>
/// Copies the elements of the <see cref="T:System.Collections.Concurrent.IProducerConsumerCollection`1"/> to an <see cref="T:System.Array"/>, starting at a specified index.
/// </summary>
/// <param name="array">The one-dimensional <see cref="T:System.Array"/> that is the destination of the elements copied from the <see cref="T:System.Collections.Concurrent.IProducerConsumerCollection`1"/>. The array must have zero-based indexing.</param><param name="index">The zero-based index in <paramref name="array"/> at which copying begins.</param><exception cref="T:System.ArgumentNullException"><paramref name="array"/> is a null reference (Nothing in Visual Basic).</exception><exception cref="T:System.ArgumentOutOfRangeException"><paramref name="index"/> is less than zero.</exception><exception cref="T:System.ArgumentException"><paramref name="index"/> is equal to or greater than the length of the <paramref name="array"/> -or- The number of elements in the source <see cref="T:System.Collections.Concurrent.ConcurrentQueue`1"/> is greater than the available space from <paramref name="index"/> to the end of the destination <paramref name="array"/>.</exception>
public void CopyTo(T[] array, int index)
{
var clone = GetThreadSafeClone();
clone.CopyTo(array, index);
}
private HashSet<T> GetThreadSafeClone()
{
HashSet<T> clone = null;
using (new WriteLock(_instanceLocker))
{
clone = new HashSet<T>(_innerSet, _innerSet.Comparer);
}
return clone;
}
/// <summary>
/// Copies the elements of the <see cref="T:System.Collections.ICollection"/> to an <see cref="T:System.Array"/>, starting at a particular <see cref="T:System.Array"/> index.
/// </summary>
/// <param name="array">The one-dimensional <see cref="T:System.Array"/> that is the destination of the elements copied from <see cref="T:System.Collections.ICollection"/>. The <see cref="T:System.Array"/> must have zero-based indexing. </param><param name="index">The zero-based index in <paramref name="array"/> at which copying begins. </param><exception cref="T:System.ArgumentNullException"><paramref name="array"/> is null. </exception><exception cref="T:System.ArgumentOutOfRangeException"><paramref name="index"/> is less than zero. </exception><exception cref="T:System.ArgumentException"><paramref name="array"/> is multidimensional.-or- The number of elements in the source <see cref="T:System.Collections.ICollection"/> is greater than the available space from <paramref name="index"/> to the end of the destination <paramref name="array"/>. </exception><exception cref="T:System.ArgumentException">The type of the source <see cref="T:System.Collections.ICollection"/> cannot be cast automatically to the type of the destination <paramref name="array"/>. </exception><filterpriority>2</filterpriority>
public void CopyTo(Array array, int index)
{
var clone = GetThreadSafeClone();
Array.Copy(clone.ToArray(), 0, array, index, clone.Count);
}
}
}
@@ -0,0 +1,32 @@
using System;
using System.ComponentModel;
using System.Globalization;
using System.Linq;
using System.Configuration;
namespace Umbraco.Core.Configuration
{
/// <summary>
/// A case-insensitive configuration converter for enumerations.
/// </summary>
/// <typeparam name="T">The type of the enumeration.</typeparam>
public class CaseInsensitiveEnumConfigConverter<T> : ConfigurationConverterBase
where T : struct
{
public override object ConvertFrom(ITypeDescriptorContext ctx, CultureInfo ci, object data)
{
if (data == null)
throw new ArgumentNullException("data");
//return Enum.Parse(typeof(T), (string)data, true);
T value;
if (Enum.TryParse((string)data, true, out value))
return value;
throw new Exception(string.Format("\"{0}\" is not valid {1} value. Valid values are: {2}.",
data, typeof(T).Name,
string.Join(", ", Enum.GetValues(typeof(T)).Cast<T>())));
}
}
}
@@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Umbraco.Core.Configuration
{
/// <summary>
/// Indicates the configuration key for a section or a group.
/// </summary>
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)]
public sealed class ConfigurationKeyAttribute : Attribute
{
/// <summary>
/// Initializes a new instance of the <see cref="ConfigurationKeyAttribute"/> class with a configuration key.
/// </summary>
/// <param name="configurationKey">The configurationkey.</param>
public ConfigurationKeyAttribute(string configurationKey)
{
ConfigurationKey = configurationKey;
}
/// <summary>
/// Gets or sets the configuration key.
/// </summary>
public string ConfigurationKey { get; private set; }
}
}
@@ -42,15 +42,24 @@ namespace Umbraco.Core.Configuration
#endregion
/// <summary>
/// used for unit tests
/// Used in unit testing to reset all config items that were set with property setters (i.e. did not come from config)
/// </summary>
internal static void ResetCache()
private static void ResetInternal()
{
_reservedUrlsCache = null;
_reservedPaths = null;
_reservedUrls = null;
}
/// <summary>
/// Resets settings that were set programmatically, to their initial values.
/// </summary>
/// <remarks>To be used in unit tests.</remarks>
internal static void Reset()
{
ResetInternal();
}
/// <summary>
/// Gets the reserved urls from web.config.
/// </summary>
@@ -575,6 +584,16 @@ namespace Umbraco.Core.Configuration
return context.Request.Path.ToLower().IndexOf(SystemDirectories.Umbraco.ToLower() + "/liveediting.aspx") > -1;
}
public static bool RequestIsInUmbracoApplication(HttpContextBase context)
{
return context.Request.Path.ToLower().IndexOf(IOHelper.ResolveUrl(SystemDirectories.Umbraco).ToLower()) > -1;
}
public static bool RequestIsLiveEditRedirector(HttpContextBase context)
{
return context.Request.Path.ToLower().IndexOf(SystemDirectories.Umbraco.ToLower() + "/liveediting.aspx") > -1;
}
/// <summary>
/// Gets a value indicating whether umbraco should force a secure (https) connection to the backoffice.
/// </summary>
@@ -0,0 +1,33 @@
using System.Configuration;
namespace Umbraco.Core.Configuration
{
// note - still must work on how to support read-only and ResetSection for collections
// note - still must work on how to spread config over files (aka DeepConfig in v5)
/// <summary>
/// Represents an Umbraco section within the configuration file.
/// </summary>
/// <remarks>
/// <para>The requirement for these sections is to be read-only.</para>
/// <para>However for unit tests purposes it is internally possible to override some values, and
/// then calling <c>>ResetSection</c> should cancel these changes and bring the section back to
/// what it was originally.</para>
/// <para>The <c>UmbracoSettings.For{T}</c> method will return a section, either one that
/// is in the configuration file, or a section that was created with default values.</para>
/// </remarks>
public abstract class UmbracoConfigurationSection : ConfigurationSection
{
/// <summary>
/// Gets a value indicating whether the section actually is in the configuration file.
/// </summary>
protected bool IsPresent { get { return ElementInformation.IsPresent; } }
/// <summary>
/// Resets settings that were set programmatically, to their initial values.
/// </summary>
/// <remarks>>To be used in unit tests.</remarks>
internal protected virtual void ResetSection()
{ }
}
}
+212 -85
View File
@@ -5,10 +5,13 @@ using System.Linq;
using System.Threading;
using System.Web;
using System.Web.Caching;
using System.Web.Security;
using System.Xml;
using System.Configuration;
using System.Collections.Generic;
using Umbraco.Core.Logging;
using Umbraco.Core.CodeAnnotations;
namespace Umbraco.Core.Configuration
@@ -20,6 +23,8 @@ namespace Umbraco.Core.Configuration
//TODO: Re-enable logging !!!!
//TODO: We need to convert this to a real section, it's currently using HttpRuntime.Cache to detect cahnges, this is real poor, especially in a console app
/// <summary>
/// The UmbracoSettings Class contains general settings information for the entire Umbraco instance based on information from the /config/umbracoSettings.config file
/// </summary>
@@ -52,15 +57,14 @@ namespace Umbraco.Core.Configuration
/// <summary>
/// Used in unit testing to reset all config items that were set with property setters (i.e. did not come from config)
/// </summary>
internal static void ResetSetters()
private static void ResetInternal()
{
_addTrailingSlash = null;
_forceSafeAliases = null;
_useLegacySchema = null;
_useDomainPrefixes = null;
_umbracoLibraryCacheDuration = null;
_trySkipIisCustomErrors = null;
SettingsFilePath = null;
SettingsFilePath = null;
}
internal const string TempFriendlyXmlChildContainerNodename = ""; // "children";
@@ -132,7 +136,7 @@ namespace Umbraco.Core.Configuration
/// </summary>
/// <param name="key">The xpath query to the specific node.</param>
/// <returns>If found, it returns the specific configuration xml node.</returns>
public static XmlNode GetKeyAsNode(string key)
internal static XmlNode GetKeyAsNode(string key)
{
if (key == null)
throw new ArgumentException("Key cannot be null");
@@ -147,7 +151,7 @@ namespace Umbraco.Core.Configuration
/// </summary>
/// <param name="key">The key.</param>
/// <returns></returns>
public static string GetKey(string key)
internal static string GetKey(string key)
{
EnsureSettingsDocument();
@@ -184,7 +188,7 @@ namespace Umbraco.Core.Configuration
/// <value>
/// <c>true</c> if new directories are allowed otherwise, <c>false</c>.
/// </value>
public static bool UploadAllowDirectories
internal static bool UploadAllowDirectories
{
get { return bool.Parse(GetKey("/settings/content/UploadAllowDirectories")); }
}
@@ -211,7 +215,7 @@ namespace Umbraco.Core.Configuration
/// Gets a value indicating whether logging is enabled in umbracoSettings.config (/settings/logging/enableLogging).
/// </summary>
/// <value><c>true</c> if logging is enabled; otherwise, <c>false</c>.</value>
public static bool EnableLogging
internal static bool EnableLogging
{
get
{
@@ -226,7 +230,7 @@ namespace Umbraco.Core.Configuration
/// Gets a value indicating whether logging happens async.
/// </summary>
/// <value><c>true</c> if async logging is enabled; otherwise, <c>false</c>.</value>
public static bool EnableAsyncLogging
internal static bool EnableAsyncLogging
{
get
{
@@ -241,7 +245,7 @@ namespace Umbraco.Core.Configuration
/// <summary>
/// Gets the assembly of an external logger that can be used to store log items in 3rd party systems
/// </summary>
public static string ExternalLoggerAssembly
internal static string ExternalLoggerAssembly
{
get
{
@@ -253,7 +257,7 @@ namespace Umbraco.Core.Configuration
/// <summary>
/// Gets the type of an external logger that can be used to store log items in 3rd party systems
/// </summary>
public static string ExternalLoggerType
internal static string ExternalLoggerType
{
get
{
@@ -265,7 +269,7 @@ namespace Umbraco.Core.Configuration
/// <summary>
/// Long Audit Trail to external log too
/// </summary>
public static bool ExternalLoggerLogAuditTrail
internal static bool ExternalLoggerLogAuditTrail
{
get
{
@@ -284,7 +288,7 @@ namespace Umbraco.Core.Configuration
/// <summary>
/// Keep user alive as long as they have their browser open? Default is true
/// </summary>
public static bool KeepUserLoggedIn
internal static bool KeepUserLoggedIn
{
get
{
@@ -296,10 +300,36 @@ namespace Umbraco.Core.Configuration
}
}
internal static string AuthCookieName
{
get
{
var value = GetKey("/settings/security/authCookieName");
if (string.IsNullOrEmpty(value) == false)
{
return value;
}
return "UMB_UCONTEXT";
}
}
internal static string AuthCookieDomain
{
get
{
var value = GetKey("/settings/security/authCookieDomain");
if (string.IsNullOrEmpty(value) == false)
{
return value;
}
return FormsAuthentication.CookieDomain;
}
}
/// <summary>
/// Enables the experimental canvas (live) editing on the frontend of the website
/// </summary>
public static bool EnableCanvasEditing
internal static bool EnableCanvasEditing
{
get
{
@@ -314,7 +344,7 @@ namespace Umbraco.Core.Configuration
/// <summary>
/// Show disabled users in the tree in the Users section in the backoffice
/// </summary>
public static bool HideDisabledUsersInBackoffice
internal static bool HideDisabledUsersInBackoffice
{
get
{
@@ -330,7 +360,7 @@ namespace Umbraco.Core.Configuration
/// Gets a value indicating whether the logs will be auto cleaned
/// </summary>
/// <value><c>true</c> if logs are to be automatically cleaned; otherwise, <c>false</c></value>
public static bool AutoCleanLogs
internal static bool AutoCleanLogs
{
get
{
@@ -345,7 +375,7 @@ namespace Umbraco.Core.Configuration
/// <summary>
/// Gets the value indicating the log cleaning frequency (in miliseconds)
/// </summary>
public static int CleaningMiliseconds
internal static int CleaningMiliseconds
{
get
{
@@ -357,7 +387,7 @@ namespace Umbraco.Core.Configuration
}
}
public static int MaxLogAge
internal static int MaxLogAge
{
get
{
@@ -373,7 +403,7 @@ namespace Umbraco.Core.Configuration
/// Gets the disabled log types.
/// </summary>
/// <value>The disabled log types.</value>
public static XmlNode DisabledLogTypes
internal static XmlNode DisabledLogTypes
{
get { return GetKeyAsNode("/settings/logging/disabledLogTypes"); }
}
@@ -382,7 +412,7 @@ namespace Umbraco.Core.Configuration
/// Gets the package server url.
/// </summary>
/// <value>The package server url.</value>
public static string PackageServer
internal static string PackageServer
{
get { return "packages.umbraco.org"; }
}
@@ -393,15 +423,14 @@ namespace Umbraco.Core.Configuration
/// Gets a value indicating whether umbraco will use domain prefixes.
/// </summary>
/// <value><c>true</c> if umbraco will use domain prefixes; otherwise, <c>false</c>.</value>
// TODO rename as EnforceAbsoluteUrls
public static bool UseDomainPrefixes
internal static bool UseDomainPrefixes
{
get
{
// default: false
return _useDomainPrefixes ?? GetKeyValue("/settings/requestHandler/useDomainPrefixes", false);
}
internal set
/*internal*/ set
{
// for unit tests only
_useDomainPrefixes = value;
@@ -414,7 +443,7 @@ namespace Umbraco.Core.Configuration
/// This will add a trailing slash (/) to urls when in directory url mode
/// NOTICE: This will always return false if Directory Urls in not active
/// </summary>
public static bool AddTrailingSlash
internal static bool AddTrailingSlash
{
get
{
@@ -422,7 +451,7 @@ namespace Umbraco.Core.Configuration
return GlobalSettings.UseDirectoryUrls
&& (_addTrailingSlash ?? GetKeyValue("/settings/requestHandler/addTrailingSlash", false));
}
internal set
/*internal*/ set
{
// for unit tests only
_addTrailingSlash = value;
@@ -433,7 +462,7 @@ namespace Umbraco.Core.Configuration
/// Gets a value indicating whether umbraco will use ASP.NET MasterPages for rendering instead of its propriatary templating system.
/// </summary>
/// <value><c>true</c> if umbraco will use ASP.NET MasterPages; otherwise, <c>false</c>.</value>
public static bool UseAspNetMasterPages
internal static bool UseAspNetMasterPages
{
get
{
@@ -455,7 +484,7 @@ namespace Umbraco.Core.Configuration
/// Gets a value indicating whether umbraco will attempt to load any skins to override default template files
/// </summary>
/// <value><c>true</c> if umbraco will override templates with skins if present and configured <c>false</c>.</value>
public static bool EnableTemplateFolders
internal static bool EnableTemplateFolders
{
get
{
@@ -479,7 +508,7 @@ namespace Umbraco.Core.Configuration
/// <summary>
/// razor DynamicNode typecasting detects XML and returns DynamicXml - Root elements that won't convert to DynamicXml
/// </summary>
public static IEnumerable<string> NotDynamicXmlDocumentElements
internal static IEnumerable<string> NotDynamicXmlDocumentElements
{
get
{
@@ -503,7 +532,7 @@ namespace Umbraco.Core.Configuration
private static IEnumerable<RazorDataTypeModelStaticMappingItem> _razorDataTypeModelStaticMapping;
private static readonly ReaderWriterLockSlim Lock = new ReaderWriterLockSlim();
public static IEnumerable<RazorDataTypeModelStaticMappingItem> RazorDataTypeModelStaticMapping
internal static IEnumerable<RazorDataTypeModelStaticMappingItem> RazorDataTypeModelStaticMapping
{
get
{
@@ -568,7 +597,7 @@ namespace Umbraco.Core.Configuration
/// <value>
/// <c>true</c> if umbraco will clone XML cache on publish; otherwise, <c>false</c>.
/// </value>
public static bool CloneXmlCacheOnPublish
internal static bool CloneXmlCacheOnPublish
{
get
{
@@ -590,7 +619,7 @@ namespace Umbraco.Core.Configuration
/// Gets a value indicating whether rich text editor content should be parsed by tidy.
/// </summary>
/// <value><c>true</c> if content is parsed; otherwise, <c>false</c>.</value>
public static bool TidyEditorContent
internal static bool TidyEditorContent
{
get { return bool.Parse(GetKey("/settings/content/TidyEditorContent")); }
}
@@ -599,7 +628,7 @@ namespace Umbraco.Core.Configuration
/// Gets the encoding type for the tidyied content.
/// </summary>
/// <value>The encoding type as string.</value>
public static string TidyCharEncoding
internal static string TidyCharEncoding
{
get
{
@@ -616,12 +645,12 @@ namespace Umbraco.Core.Configuration
/// Gets the property context help option, this can either be 'text', 'icon' or 'none'
/// </summary>
/// <value>The property context help option.</value>
public static string PropertyContextHelpOption
internal static string PropertyContextHelpOption
{
get { return GetKey("/settings/content/PropertyContextHelpOption").ToLower(); }
}
public static string DefaultBackofficeProvider
internal static string DefaultBackofficeProvider
{
get
{
@@ -638,37 +667,36 @@ namespace Umbraco.Core.Configuration
/// <summary>
/// Whether to force safe aliases (no spaces, no special characters) at businesslogic level on contenttypes and propertytypes
/// </summary>
public static bool ForceSafeAliases
internal static bool ForceSafeAliases
{
get
{
// default: true
return _forceSafeAliases ?? GetKeyValue("/settings/content/ForceSafeAliases", true);
}
internal set
/*internal*/ set
{
// used for unit testing
_forceSafeAliases = value;
}
}
private static bool? _trySkipIisCustomErrors;
/// <summary>
/// Gets a value indicating whether to try to skip IIS custom errors.
/// </summary>
[UmbracoWillObsolete("Use UmbracoSettings.For<WebRouting>.TrySkipIisCustomErrors instead.")]
internal static bool TrySkipIisCustomErrors
{
get { return GetKeyValue("/settings/web.routing/@trySkipIisCustomErrors", false); }
}
/// <summary>
/// Gets or sets a value indicating where to try to skip IIS custom errors.
/// Gets a value indicating whether internal redirect preserves the template.
/// </summary>
public static bool TrySkipIisCustomErrors
{
get
{
// default: false
return _trySkipIisCustomErrors ?? GetKeyValue("/settings/web.routing/@trySkipIisCustomErrors", false);
}
internal set
{
// used for unit testing
_trySkipIisCustomErrors = value;
}
[UmbracoWillObsolete("Use UmbracoSettings.For<WebRouting>.InternalRedirectPerservesTemplate instead.")]
internal static bool InternalRedirectPreservesTemplate
{
get { return GetKeyValue("/settings/web.routing/@internalRedirectPreservesTemplate", false); }
}
/// <summary>
@@ -687,7 +715,7 @@ namespace Umbraco.Core.Configuration
/// Gets the allowed image file types.
/// </summary>
/// <value>The allowed image file types.</value>
public static string ImageFileTypes
internal static string ImageFileTypes
{
get { return GetKey("/settings/content/imaging/imageFileTypes").ToLowerInvariant(); }
}
@@ -696,7 +724,7 @@ namespace Umbraco.Core.Configuration
/// Gets the allowed script file types.
/// </summary>
/// <value>The allowed script file types.</value>
public static string ScriptFileTypes
internal static string ScriptFileTypes
{
get { return GetKey("/settings/content/scripteditor/scriptFileTypes"); }
}
@@ -707,14 +735,14 @@ namespace Umbraco.Core.Configuration
/// Gets the duration in seconds to cache queries to umbraco library member and media methods
/// Default is 1800 seconds (30 minutes)
/// </summary>
public static int UmbracoLibraryCacheDuration
internal static int UmbracoLibraryCacheDuration
{
get
{
// default: 1800
return _umbracoLibraryCacheDuration ?? GetKeyValue("/settings/content/UmbracoLibraryCacheDuration", 1800);
}
internal set
/*internal*/ set
{
// for unit tests only
_umbracoLibraryCacheDuration = value;
@@ -725,7 +753,7 @@ namespace Umbraco.Core.Configuration
/// Gets the path to the scripts folder used by the script editor.
/// </summary>
/// <value>The script folder path.</value>
public static string ScriptFolderPath
internal static string ScriptFolderPath
{
get { return GetKey("/settings/content/scripteditor/scriptFolderPath"); }
}
@@ -733,7 +761,7 @@ namespace Umbraco.Core.Configuration
/// <summary>
/// Enabled or disable the script/code editor
/// </summary>
public static bool ScriptDisableEditor
internal static bool ScriptDisableEditor
{
get
{
@@ -751,7 +779,7 @@ namespace Umbraco.Core.Configuration
/// ex: existingnodename.aspx would become existingnodename(1).aspx if a node with the same name is found
/// </summary>
/// <value><c>true</c> if umbraco ensures unique node naming; otherwise, <c>false</c>.</value>
public static bool EnsureUniqueNaming
internal static bool EnsureUniqueNaming
{
get
{
@@ -770,7 +798,7 @@ namespace Umbraco.Core.Configuration
/// Gets the notification email sender.
/// </summary>
/// <value>The notification email sender.</value>
public static string NotificationEmailSender
internal static string NotificationEmailSender
{
get { return GetKey("/settings/content/notifications/email"); }
}
@@ -781,7 +809,7 @@ namespace Umbraco.Core.Configuration
/// <value>
/// <c>true</c> if html notification-emails are disabled; otherwise, <c>false</c>.
/// </value>
public static bool NotificationDisableHtmlEmail
internal static bool NotificationDisableHtmlEmail
{
get
{
@@ -794,12 +822,12 @@ namespace Umbraco.Core.Configuration
/// Gets the allowed attributes on images.
/// </summary>
/// <value>The allowed attributes on images.</value>
public static string ImageAllowedAttributes
internal static string ImageAllowedAttributes
{
get { return GetKey("/settings/content/imaging/allowedAttributes"); }
}
public static XmlNode ImageAutoFillImageProperties
internal static XmlNode ImageAutoFillImageProperties
{
get { return GetKeyAsNode("/settings/content/imaging/autoFillImageProperties"); }
}
@@ -808,7 +836,7 @@ namespace Umbraco.Core.Configuration
/// Gets the scheduled tasks as XML
/// </summary>
/// <value>The scheduled tasks.</value>
public static XmlNode ScheduledTasks
internal static XmlNode ScheduledTasks
{
get { return GetKeyAsNode("/settings/scheduledTasks"); }
}
@@ -817,7 +845,7 @@ namespace Umbraco.Core.Configuration
/// Gets a list of characters that will be replaced when generating urls
/// </summary>
/// <value>The URL replacement characters.</value>
public static XmlNode UrlReplaceCharacters
internal static XmlNode UrlReplaceCharacters
{
get { return GetKeyAsNode("/settings/requestHandler/urlReplacing"); }
}
@@ -825,7 +853,7 @@ namespace Umbraco.Core.Configuration
/// <summary>
/// Whether to replace double dashes from url (ie my--story----from--dash.aspx caused by multiple url replacement chars
/// </summary>
public static bool RemoveDoubleDashesFromUrlReplacing
internal static bool RemoveDoubleDashesFromUrlReplacing
{
get
{
@@ -846,7 +874,7 @@ namespace Umbraco.Core.Configuration
/// Used for load-balancing high-traffic sites.
/// </summary>
/// <value><c>true</c> if umbraco uses distributed calls; otherwise, <c>false</c>.</value>
public static bool UseDistributedCalls
internal static bool UseDistributedCalls
{
get
{
@@ -866,7 +894,7 @@ namespace Umbraco.Core.Configuration
/// Gets the ID of the user with access rights to perform the distributed calls.
/// </summary>
/// <value>The distributed call user.</value>
public static int DistributedCallUser
internal static int DistributedCallUser
{
get
{
@@ -884,7 +912,7 @@ namespace Umbraco.Core.Configuration
/// <summary>
/// Gets the html injected into a (x)html page if Umbraco is running in preview mode
/// </summary>
public static string PreviewBadge
internal static string PreviewBadge
{
get
{
@@ -905,7 +933,7 @@ namespace Umbraco.Core.Configuration
/// and update their content cache accordingly, ensuring a consistent cache on all servers
/// </summary>
/// <value>The distribution servers.</value>
public static XmlNode DistributionServers
internal static XmlNode DistributionServers
{
get
{
@@ -925,7 +953,7 @@ namespace Umbraco.Core.Configuration
/// A help page configuration specify language, user type, application, application url and
/// the target help page url.
/// </summary>
public static XmlNode HelpPages
internal static XmlNode HelpPages
{
get
{
@@ -947,7 +975,7 @@ namespace Umbraco.Core.Configuration
/// All packages installed from a repository gets the repository alias included in the install information
/// </summary>
/// <value>The repository servers.</value>
public static XmlNode Repositories
internal static XmlNode Repositories
{
get
{
@@ -970,7 +998,7 @@ namespace Umbraco.Core.Configuration
/// <value>
/// <c>true</c> if umbraco will use the viewstate mover module; otherwise, <c>false</c>.
/// </value>
public static bool UseViewstateMoverModule
internal static bool UseViewstateMoverModule
{
get
{
@@ -992,7 +1020,7 @@ namespace Umbraco.Core.Configuration
/// Tells us whether the Xml Content cache is disabled or not
/// Default is enabled
/// </summary>
public static bool IsXmlContentCacheDisabled
internal static bool IsXmlContentCacheDisabled
{
get
{
@@ -1017,7 +1045,7 @@ namespace Umbraco.Core.Configuration
/// Makes it possible to updates environments by syncing the umbraco.config file across instances
/// Relates to http://umbraco.codeplex.com/workitem/30722
/// </summary>
public static bool XmlContentCheckForDiskChanges
internal static bool XmlContentCheckForDiskChanges
{
get
{
@@ -1042,7 +1070,7 @@ namespace Umbraco.Core.Configuration
/// If disabled, only documents will generate data.
/// This feature is useful if anyone would like to see how data looked at a given time
/// </summary>
public static bool EnableGlobalPreviewStorage
internal static bool EnableGlobalPreviewStorage
{
get
{
@@ -1070,14 +1098,14 @@ namespace Umbraco.Core.Configuration
/// <value>
/// <c>true</c> if yes, use the old node/data model; otherwise, <c>false</c>.
/// </value>
public static bool UseLegacyXmlSchema
internal static bool UseLegacyXmlSchema
{
get
{
// default: true
return _useLegacySchema ?? GetKeyValue("/settings/content/UseLegacyXmlSchema", false);
}
internal set
/*internal*/ set
{
// used for unit testing
_useLegacySchema = value;
@@ -1085,7 +1113,7 @@ namespace Umbraco.Core.Configuration
}
[Obsolete("This setting is not used anymore, the only file extensions that are supported are .cs and .vb files")]
public static IEnumerable<string> AppCodeFileExtensionsList
internal static IEnumerable<string> AppCodeFileExtensionsList
{
get
{
@@ -1096,7 +1124,7 @@ namespace Umbraco.Core.Configuration
}
[Obsolete("This setting is not used anymore, the only file extensions that are supported are .cs and .vb files")]
public static XmlNode AppCodeFileExtensions
internal static XmlNode AppCodeFileExtensions
{
get
{
@@ -1118,7 +1146,7 @@ namespace Umbraco.Core.Configuration
/// Tells us whether the Xml to always update disk cache, when changes are made to content
/// Default is enabled
/// </summary>
public static bool ContinouslyUpdateXmlDiskCache
internal static bool ContinouslyUpdateXmlDiskCache
{
get
{
@@ -1144,7 +1172,7 @@ namespace Umbraco.Core.Configuration
/// have a splash page
/// Default is disabled
/// </summary>
public static bool EnableSplashWhileLoading
internal static bool EnableSplashWhileLoading
{
get
{
@@ -1165,7 +1193,7 @@ namespace Umbraco.Core.Configuration
}
private static bool? _resolveUrlsFromTextString;
public static bool ResolveUrlsFromTextString
internal static bool ResolveUrlsFromTextString
{
get
{
@@ -1202,7 +1230,7 @@ namespace Umbraco.Core.Configuration
/// is used instead of the masterpages editor
/// </summary>
/// <value><c>true</c> if umbraco defaults to using MVC views for templating, otherwise <c>false</c>.</value>
public static RenderingEngine DefaultRenderingEngine
internal static RenderingEngine DefaultRenderingEngine
{
get
{
@@ -1226,6 +1254,12 @@ namespace Umbraco.Core.Configuration
}
return _defaultRenderingEngine.Value;
}
//internal set
//{
// _defaultRenderingEngine = value;
// var node = UmbracoSettingsXmlDoc.DocumentElement.SelectSingleNode("/settings/templates/defaultRenderingEngine");
// node.InnerText = value.ToString();
//}
}
private static MacroErrorBehaviour? _macroErrorBehaviour;
@@ -1237,7 +1271,7 @@ namespace Umbraco.Core.Configuration
/// - Throw - Throw an exception and invoke the global error handler (if one is defined, if not you'll get a YSOD)
/// </summary>
/// <value>MacroErrorBehaviour enum defining how to handle macro errors.</value>
public static MacroErrorBehaviour MacroErrorBehaviour
internal static MacroErrorBehaviour MacroErrorBehaviour
{
get
{
@@ -1272,7 +1306,7 @@ namespace Umbraco.Core.Configuration
/// - HideFileDuplicates - Show files in the sprite and hide duplicates on disk
/// </summary>
/// <value>MacroErrorBehaviour enum defining how to show icons in the document type editor.</value>
public static IconPickerBehaviour IconPickerBehaviour
internal static IconPickerBehaviour IconPickerBehaviour
{
get
{
@@ -1298,6 +1332,25 @@ namespace Umbraco.Core.Configuration
}
}
/// <summary>
/// Gets the default document type property used when adding new properties through the back-office
/// </summary>
/// <value>Configured text for the default document type property</value>
/// <remarks>If undefined, 'Textstring' is the default</remarks>
public static string DefaultDocumentTypeProperty
{
get
{
var defaultDocumentTypeProperty = GetKey("/settings/content/defaultDocumentTypeProperty");
if (string.IsNullOrEmpty(defaultDocumentTypeProperty))
{
defaultDocumentTypeProperty = "Textstring";
}
return defaultDocumentTypeProperty;
}
}
/// <summary>
/// Configuration regarding webservices
/// </summary>
@@ -1481,6 +1534,80 @@ namespace Umbraco.Core.Configuration
}
#endregion
}
}
}
#region Extensible settings
/// <summary>
/// Resets settings that were set programmatically, to their initial values.
/// </summary>
/// <remarks>To be used in unit tests.</remarks>
internal static void Reset()
{
ResetInternal();
using (new WriteLock(SectionsLock))
{
foreach (var section in Sections.Values)
section.ResetSection();
}
}
private static readonly ReaderWriterLockSlim SectionsLock = new ReaderWriterLockSlim();
private static readonly Dictionary<Type, UmbracoConfigurationSection> Sections = new Dictionary<Type, UmbracoConfigurationSection>();
/// <summary>
/// Gets the specified UmbracoConfigurationSection.
/// </summary>
/// <typeparam name="T">The type of the UmbracoConfigurationSectiont.</typeparam>
/// <returns>The UmbracoConfigurationSection of the specified type.</returns>
public static T For<T>()
where T : UmbracoConfigurationSection, new()
{
var sectionType = typeof (T);
using (new WriteLock(SectionsLock))
{
if (Sections.ContainsKey(sectionType)) return Sections[sectionType] as T;
var attr = sectionType.GetCustomAttribute<ConfigurationKeyAttribute>(false);
if (attr == null)
throw new InvalidOperationException(string.Format("Type \"{0}\" is missing attribute ConfigurationKeyAttribute.", sectionType.FullName));
var sectionKey = attr.ConfigurationKey;
if (string.IsNullOrWhiteSpace(sectionKey))
throw new InvalidOperationException(string.Format("Type \"{0}\" ConfigurationKeyAttribute value is null or empty.", sectionType.FullName));
var section = GetSection(sectionType, sectionKey);
Sections[sectionType] = section;
return section as T;
}
}
private static UmbracoConfigurationSection GetSection(Type sectionType, string key)
{
if (!sectionType.Inherits<UmbracoConfigurationSection>())
throw new ArgumentException(string.Format(
"Type \"{0}\" does not inherit from UmbracoConfigurationSection.", sectionType.FullName), "sectionType");
var section = ConfigurationManager.GetSection(key);
if (section != null && section.GetType() != sectionType)
throw new InvalidCastException(string.Format("Section at key \"{0}\" is of type \"{1}\" and not \"{2}\".",
key, section.GetType().FullName, sectionType.FullName));
if (section != null) return section as UmbracoConfigurationSection;
section = Activator.CreateInstance(sectionType) as UmbracoConfigurationSection;
if (section == null)
throw new NullReferenceException(string.Format(
"Activator failed to create an instance of type \"{0}\" for key\"{1}\" and returned null.",
sectionType.FullName, key));
return section as UmbracoConfigurationSection;
}
#endregion
}
}
@@ -5,7 +5,7 @@ namespace Umbraco.Core.Configuration
{
public class UmbracoVersion
{
private static readonly Version Version = new Version("6.0.4");
private static readonly Version Version = new Version("6.1.6");
/// <summary>
/// Gets the current version of Umbraco.
@@ -0,0 +1,46 @@
namespace Umbraco.Core
{
public static partial class Constants
{
/// <summary>
/// Defines the alias identifiers for Umbraco's core application sections.
/// </summary>
public static class Applications
{
/// <summary>
/// Application alias for the content section.
/// </summary>
public const string Content = "content";
/// <summary>
/// Application alias for the developer section.
/// </summary>
public const string Developer = "developer";
/// <summary>
/// Application alias for the media section.
/// </summary>
public const string Media = "media";
/// <summary>
/// Application alias for the members section.
/// </summary>
public const string Members = "member";
/// <summary>
/// Application alias for the settings section.
/// </summary>
public const string Settings = "settings";
/// <summary>
/// Application alias for the translation section.
/// </summary>
public const string Translation = "translation";
/// <summary>
/// Application alias for the users section.
/// </summary>
public const string Users = "users";
}
}
}
+105
View File
@@ -0,0 +1,105 @@
namespace Umbraco.Core
{
public static partial class Constants
{
/// <summary>
/// Defines the identifiers for property-type alias conventions that are used within the Umbraco core.
/// </summary>
public static class Conventions
{
/// <summary>
/// Constants for Umbraco Content property aliases.
/// </summary>
public static class Content
{
/// <summary>
/// Property alias for the Content's Url (internal) redirect.
/// </summary>
public const string InternalRedirectId = "umbracoInternalRedirectId";
/// <summary>
/// Property alias for the Content's navigational hide, (not actually used in core code).
/// </summary>
public const string NaviHide = "umbracoNaviHide";
/// <summary>
/// Property alias for the Content's Url redirect.
/// </summary>
public const string Redirect = "umbracoRedirect";
/// <summary>
/// Property alias for the Content's Url alias.
/// </summary>
public const string UrlAlias = "umbracoUrlAlias";
/// <summary>
/// Property alias for the Content's Url name.
/// </summary>
public const string UrlName = "umbracoUrlName";
}
/// <summary>
/// Constants for Umbraco Media property aliases.
/// </summary>
public static class Media
{
/// <summary>
/// Property alias for the Media's file name.
/// </summary>
public const string File = "umbracoFile";
/// <summary>
/// Property alias for the Media's width.
/// </summary>
public const string Width = "umbracoWidth";
/// <summary>
/// Property alias for the Media's height.
/// </summary>
public const string Height = "umbracoHeight";
/// <summary>
/// Property alias for the Media's file size (in bytes).
/// </summary>
public const string Bytes = "umbracoBytes";
/// <summary>
/// Property alias for the Media's file extension.
/// </summary>
public const string Extension = "umbracoExtension";
}
/// <summary>
/// Defines the alias identifiers for Umbraco media types.
/// </summary>
public static class MediaTypes
{
/// <summary>
/// MediaType alias for a file.
/// </summary>
public const string File = "File";
/// <summary>
/// MediaType alias for a folder.
/// </summary>
public const string Folder = "Folder";
/// <summary>
/// MediaType alias for an image.
/// </summary>
public const string Image = "Image";
}
/// <summary>
/// Constants for Umbraco URLs/Querystrings.
/// </summary>
public static class Url
{
/// <summary>
/// Querystring parameter name used for Umbraco's alternative template functionality.
/// </summary>
public const string AltTemplate = "altTemplate";
}
}
}
}
+86
View File
@@ -0,0 +1,86 @@
namespace Umbraco.Core
{
public static partial class Constants
{
/// <summary>
/// Defines the identifiers for Umbraco object types as constants for easy centralized access/management.
/// </summary>
public static class ObjectTypes
{
/// <summary>
/// Guid for a Content Item object.
/// </summary>
public const string ContentItem = "10E2B09F-C28B-476D-B77A-AA686435E44A";
/// <summary>
/// Guid for a Content Item Type object.
/// </summary>
public const string ContentItemType = "7A333C54-6F43-40A4-86A2-18688DC7E532";
/// <summary>
/// Guid for the Content Recycle Bin.
/// </summary>
public const string ContentRecycleBin = "01BB7FF2-24DC-4C0C-95A2-C24EF72BBAC8";
/// <summary>
/// Guid for a DataType object.
/// </summary>
public const string DataType = "30A2A501-1978-4DDB-A57B-F7EFED43BA3C";
/// <summary>
/// Guid for a Document object.
/// </summary>
public const string Document = "C66BA18E-EAF3-4CFF-8A22-41B16D66A972";
/// <summary>
/// Guid for a Document Type object.
/// </summary>
public const string DocumentType = "A2CB7800-F571-4787-9638-BC48539A0EFB";
/// <summary>
/// Guid for a Media object.
/// </summary>
public const string Media = "B796F64C-1F99-4FFB-B886-4BF4BC011A9C";
/// <summary>
/// Guid for the Media Recycle Bin.
/// </summary>
public const string MediaRecycleBin = "CF3D8E34-1C1C-41e9-AE56-878B57B32113";
/// <summary>
/// Guid for a Media Type object.
/// </summary>
public const string MediaType = "4EA4382B-2F5A-4C2B-9587-AE9B3CF3602E";
/// <summary>
/// Guid for a Member object.
/// </summary>
public const string Member = "39EB0F98-B348-42A1-8662-E7EB18487560";
/// <summary>
/// Guid for a Member Group object.
/// </summary>
public const string MemberGroup = "366E63B9-880F-4E13-A61C-98069B029728";
/// <summary>
/// Guid for a Member Type object.
/// </summary>
public const string MemberType = "9B5416FB-E72F-45A9-A07B-5A9A2709CE43";
/// <summary>
/// Guid for a Stylesheet object.
/// </summary>
public const string Stylesheet = "9F68DA4F-A3A8-44C2-8226-DCBD125E4840";
/// <summary>
/// Guid for the System Root.
/// </summary>
public const string SystemRoot = "EA7D8624-4CFE-4578-A871-24AA946BF34D";
/// <summary>
/// Guid for a Template object.
/// </summary>
public const string Template = "6FBDE604-4178-42CE-A10B-8A2600A2F07D";
}
}
}
@@ -0,0 +1,186 @@
namespace Umbraco.Core
{
public static partial class Constants
{
/// <summary>
/// Defines the identifiers for Umbraco Property Editors as constants for easy centralized access/management.
/// </summary>
public static class PropertyEditors
{
/// <summary>
/// Guid for the Checkbox list datatype.
/// </summary>
public const string CheckBoxList = "B4471851-82B6-4C75-AFA4-39FA9C6A75E9";
/// <summary>
/// Guid for the Color Picker datatype.
/// </summary>
public const string ColorPicker = "F8D60F68-EC59-4974-B43B-C46EB5677985";
/// <summary>
/// Guid for the Content Picker datatype.
/// </summary>
public const string ContentPicker = "158AA029-24ED-4948-939E-C3DA209E5FBA";
/// <summary>
/// Guid for the Date datatype.
/// </summary>
public const string Date = "23E93522-3200-44E2-9F29-E61A6FCBB79A";
/// <summary>
/// Guid for the Date/Time datatype.
/// </summary>
public const string DateTime = "B6FB1622-AFA5-4BBF-A3CC-D9672A442222";
/// <summary>
/// Guid for the Dictionary Picker datatype.
/// </summary>
public const string DictionaryPicker = "17B70066-F764-407D-AB05-3717F1E1C513";
/// <summary>
/// Guid for the Dropdown list datatype.
/// </summary>
public const string DropDownList = "A74EA9C9-8E18-4D2A-8CF6-73C6206C5DA6";
/// <summary>
/// Guid for the Dropdown list multiple datatype.
/// </summary>
public const string DropDownListMultiple = "928639ED-9C73-4028-920C-1E55DBB68783";
/// <summary>
/// Guid for the Dropdown list multiple, publish keys datatype.
/// </summary>
public const string DropdownlistMultiplePublishKeys = "928639AA-9C73-4028-920C-1E55DBB68783";
/// <summary>
/// Guid for the Dropdown list, publishing keys datatype.
/// </summary>
public const string DropdownlistPublishingKeys = "A74EA9E1-8E18-4D2A-8CF6-73C6206C5DA6";
/// <summary>
/// Guid for the Folder browser datatype.
/// </summary>
public const string FolderBrowser = "CCCD4AE9-F399-4ED2-8038-2E88D19E810C";
/// <summary>
/// Guid for the Image Cropper datatype.
/// </summary>
public const string ImageCropper = "7A2D436C-34C2-410F-898F-4A23B3D79F54";
/// <summary>
/// Guid for the Integer datatype.
/// </summary>
public const string Integer = "1413AFCB-D19A-4173-8E9A-68288D2A73B8";
/// <summary>
/// Guid for the Macro Container datatype.
/// </summary>
public const string MacroContainer = "474FCFF8-9D2D-11DE-ABC6-AD7A56D89593";
/// <summary>
/// Guid for the Media Picker datatype.
/// </summary>
public const string MediaPicker = "EAD69342-F06D-4253-83AC-28000225583B";
/// <summary>
/// Guid for the Member Picker datatype.
/// </summary>
public const string MemberPicker = "39F533E4-0551-4505-A64B-E0425C5CE775";
/// <summary>
/// Guid for the Multi-Node Tree Picker datatype
/// </summary>
public const string MultiNodeTreePicker = "7E062C13-7C41-4AD9-B389-41D88AEEF87C";
/// <summary>
/// Guid for the Multiple Textstring datatype.
/// </summary>
public const string MultipleTextstring = "5359AD0B-06CC-4182-92BD-0A9117448D3F";
/// <summary>
/// Guid for the No edit datatype.
/// </summary>
public const string NoEdit = "6C738306-4C17-4D88-B9BD-6546F3771597";
/// <summary>
/// Guid for the Picker Relations datatype.
/// </summary>
public const string PickerRelations = "83396FF2-2E39-4A90-9066-17F5F3989374";
/// <summary>
/// Guid for the Radiobutton list datatype.
/// </summary>
public const string RadioButtonList = "A52C7C1C-C330-476E-8605-D63D3B84B6A6";
/// <summary>
/// Guid for the Related Links datatype.
/// </summary>
public const string RelatedLinks = "71B8AD1A-8DC2-425C-B6B8-FAA158075E63";
/// <summary>
/// Guid for the Slider datatype.
/// </summary>
public const string Slider = "29E790E6-26B3-438A-B21F-908663A0B19E";
/// <summary>
/// Guid for the Tags datatype.
/// </summary>
public const string Tags = "4023E540-92F5-11DD-AD8B-0800200C9A66";
/// <summary>
/// Guid for the Textbox datatype.
/// </summary>
public const string Textbox = "EC15C1E5-9D90-422A-AA52-4F7622C63BEA";
/// <summary>
/// Guid for the Textbox multiple datatype.
/// </summary>
public const string TextboxMultiple = "67DB8357-EF57-493E-91AC-936D305E0F2A";
/// <summary>
/// Guid for the TinyMCE v3 wysiwyg datatype.
/// </summary>
public const string TinyMCEv3 = "5E9B75AE-FACE-41C8-B47E-5F4B0FD82F83";
/// <summary>
/// Guid for the TinyMCE wysiwyg (deprecated, upgrade to tinymce v3!) datatype.
/// </summary>
public const string TinyMCE = "83722133-F80C-4273-BDB6-1BEFAA04A612";
/// <summary>
/// Guid for the True/False (Ja/Nej) datatype.
/// </summary>
public const string TrueFalse = "38B352C1-E9F8-4FD8-9324-9A2EAB06D97A";
/// <summary>
/// Guid for the Ultimate Picker datatype.
/// </summary>
public const string UltimatePicker = "CDBF0B5D-5CB2-445F-BC12-FCAAEC07CF2C";
/// <summary>
/// Guid for the UltraSimpleEditor datatype.
/// </summary>
public const string UltraSimpleEditor = "60B7DABF-99CD-41EB-B8E9-4D2E669BBDE9";
/// <summary>
/// Guid for the Umbraco Usercontrol Wrapper datatype.
/// </summary>
public const string UmbracoUserControlWrapper = "D15E1281-E456-4B24-AA86-1DDA3E4299D5";
/// <summary>
/// Guid for the Upload field datatype.
/// </summary>
public const string UploadField = "5032A6E6-69E3-491D-BB28-CD31CD11086C";
/// <summary>
/// Guid for the XPath CheckBoxList datatype.
/// </summary>
public const string XPathCheckBoxList = "34451D92-D270-49BA-8C7F-EE55BFEEE1CB";
/// <summary>
/// Guid for the XPath DropDownList datatype.
/// </summary>
public const string XPathDropDownList = "173A96AE-00ED-4A7C-9F76-4B53D4A0A1B9";
}
}
}
+26
View File
@@ -0,0 +1,26 @@
namespace Umbraco.Core
{
public static partial class Constants
{
/// <summary>
/// Defines the identifiers for Umbraco system nodes.
/// </summary>
public static class System
{
/// <summary>
/// The integer identifier for global system root node.
/// </summary>
public const int Root = -1;
/// <summary>
/// The integer identifier for content's recycle bin.
/// </summary>
public const int RecycleBinContent = -20;
/// <summary>
/// The integer identifier for media's recycle bin.
/// </summary>
public const int RecycleBinMedia = -21;
}
}
}
+10
View File
@@ -0,0 +1,10 @@
namespace Umbraco.Core
{
/// <summary>
/// Constants all the identifiers within the Umbraco core.
/// </summary>
public static partial class Constants
{
// generic constants can go here
}
}
+68 -29
View File
@@ -10,9 +10,13 @@ using Umbraco.Core.Persistence.Migrations.Upgrades.TargetVersionSix;
using Umbraco.Core.Persistence.Migrations.Upgrades.TargetVersionSixZeroOne;
using Umbraco.Core.Persistence.SqlSyntax;
using Umbraco.Core.Persistence.UnitOfWork;
using Umbraco.Core.Profiling;
using Umbraco.Core.PropertyEditors;
using Umbraco.Core.Publishing;
using Umbraco.Core.Macros;
using Umbraco.Core.Services;
using Umbraco.Core.Sync;
using Umbraco.Core.Strings;
using MigrationsVersionFourNineZero = Umbraco.Core.Persistence.Migrations.Upgrades.TargetVersionFourNineZero;
namespace Umbraco.Core
@@ -49,8 +53,9 @@ namespace Umbraco.Core
if (_isInitialized)
throw new InvalidOperationException("The boot manager has already been initialized");
LogHelper.Info<CoreBootManager>("Umbraco application starting");
_timer = DisposableTimer.Start(x => LogHelper.Info<CoreBootManager>("Umbraco application startup complete" + " (took " + x + "ms)"));
InitializeProfilerResolver();
_timer = DisposableTimer.DebugDuration<CoreBootManager>("Umbraco application starting", "Umbraco application startup complete");
//create database and service contexts for the app context
var dbFactory = new DefaultDatabaseFactory(GlobalSettings.UmbracoConnectionName);
@@ -90,6 +95,20 @@ namespace Umbraco.Core
ApplicationContext = ApplicationContext.Current = new ApplicationContext(dbContext, serviceContext);
}
/// <summary>
/// Special method to initialize the ProfilerResolver
/// </summary>
protected virtual void InitializeProfilerResolver()
{
//By default we'll initialize the Log profiler (in the web project, we'll override with the web profiler)
ProfilerResolver.Current = new ProfilerResolver(new LogProfiler())
{
//This is another special resolver that needs to be resolvable before resolution is frozen
//since it is used for profiling the application startup
CanResolveBeforeFrozen = true
};
}
/// <summary>
/// Special method to initialize the ApplicationEventsResolver and any modifications required for it such
/// as adding custom types to the resolver.
@@ -106,6 +125,19 @@ namespace Umbraco.Core
{
CanResolveBeforeFrozen = true
};
//add custom types here that are internal
ApplicationEventsResolver.Current.AddType<PublishedContentHelper>();
}
/// <summary>
/// Special method to extend the use of Umbraco by enabling the consumer to overwrite
/// the absolute path to the root of an Umbraco site/solution, which is used for stuff
/// like Umbraco.Core.IO.IOHelper.MapPath etc.
/// </summary>
/// <param name="rootPath">Absolute</param>
protected virtual void InitializeApplicationRootPath(string rootPath)
{
Umbraco.Core.IO.IOHelper.SetRootDirectory(rootPath);
}
/// <summary>
@@ -153,7 +185,7 @@ namespace Umbraco.Core
.ForEach(x => x.OnApplicationStarted(UmbracoApplication, ApplicationContext));
//Now, startup all of our legacy startup handler
ApplicationEventsResolver.Current.InstantiateLegacyStartupHanlders();
ApplicationEventsResolver.Current.InstantiateLegacyStartupHandlers();
if (afterComplete != null)
{
@@ -175,12 +207,26 @@ namespace Umbraco.Core
{
Resolution.Freeze();
}
/// <summary>
/// Create the resolvers
/// </summary>
protected virtual void InitializeResolvers()
{
{
//by default we'll use the standard configuration based sync
ServerRegistrarResolver.Current = new ServerRegistrarResolver(
new ConfigServerRegistrar());
//by default (outside of the web) we'll use the default server messenger without
//supplying a username/password, this will automatically disable distributed calls
// .. we'll override this in the WebBootManager
ServerMessengerResolver.Current = new ServerMessengerResolver(
new DefaultServerMessenger());
MappingResolver.Current = new MappingResolver(
() => PluginManager.Current.ResolveAssignedMapperTypes());
RepositoryResolver.Current = new RepositoryResolver(
new RepositoryFactory());
@@ -205,30 +251,11 @@ namespace Umbraco.Core
ActionsResolver.Current = new ActionsResolver(
() => PluginManager.Current.ResolveActions());
MacroPropertyTypeResolver.Current = new MacroPropertyTypeResolver(
PluginManager.Current.ResolveMacroPropertyTypes());
//TODO: Y U NO WORK?
//MigrationResolver.Current = new MigrationResolver(
// PluginManager.Current.ResolveMigrationTypes());
//the database migration objects
MigrationResolver.Current = new MigrationResolver(
() => PluginManager.Current.ResolveMigrationTypes());
//the database migration objects
MigrationResolver.Current = new MigrationResolver(new List<Type>
{
typeof (MigrationsVersionFourNineZero.RemoveUmbracoAppConstraints),
typeof (DeleteAppTables),
typeof (EnsureAppsTreesUpdated),
typeof (MoveMasterContentTypeData),
typeof (NewCmsContentType2ContentTypeTable),
typeof (RemoveMasterContentTypeColumn),
typeof (RenameCmsTabTable),
typeof (RenameTabIdColumn),
typeof (UpdateCmsContentTypeAllowedContentTypeTable),
typeof (UpdateCmsContentTypeTable),
typeof (UpdateCmsContentVersionTable),
typeof (UpdateCmsPropertyTypeGroupTable),
typeof (UpdatePropertyTypesAndGroups)
});
PropertyEditorValueConvertersResolver.Current = new PropertyEditorValueConvertersResolver(
PluginManager.Current.ResolvePropertyEditorValueConverters());
@@ -236,6 +263,18 @@ namespace Umbraco.Core
PropertyEditorValueConvertersResolver.Current.AddType<DatePickerPropertyEditorValueConverter>();
PropertyEditorValueConvertersResolver.Current.AddType<TinyMcePropertyEditorValueConverter>();
PropertyEditorValueConvertersResolver.Current.AddType<YesNoPropertyEditorValueConverter>();
}
// this is how we'd switch over to DefaultShortStringHelper _and_ still use
// UmbracoSettings UrlReplaceCharacters...
//ShortStringHelperResolver.Current = new ShortStringHelperResolver(
// new DefaultShortStringHelper().WithConfig(DefaultShortStringHelper.ApplyUrlReplaceCharacters));
// use the Legacy one for now
ShortStringHelperResolver.Current = new ShortStringHelperResolver(
new LegacyShortStringHelper());
UrlSegmentProviderResolver.Current = new UrlSegmentProviderResolver(
typeof (DefaultUrlSegmentProvider));
}
}
}
+1 -1
View File
@@ -27,7 +27,7 @@ namespace Umbraco.Core
{
get
{
EnsureIdsAreTracked();
EnsureIsInitialized();
return Values;
}
}
+78 -12
View File
@@ -112,7 +112,7 @@ namespace Umbraco.Core
public void ConfigureEmbeddedDatabaseConnection()
{
const string providerName = "System.Data.SqlServerCe.4.0";
const string connectionString = @"Data Source=|DataDirectory|\Umbraco.sdf";
const string connectionString = @"Data Source=|DataDirectory|\Umbraco.sdf;Flush Interval=1;";
SaveConnectionString(connectionString, providerName);
@@ -169,6 +169,20 @@ namespace Umbraco.Core
Initialize(providerName);
}
/// <summary>
/// Configures a ConnectionString for the Umbraco database that uses Microsoft SQL Server integrated security.
/// </summary>
/// <param name="server">Name or address of the database server</param>
/// <param name="databaseName">Name of the database</param>
public void ConfigureIntegratedSecurityDatabaseConnection(string server, string databaseName)
{
const string providerName = "System.Data.SqlClient";
string connectionString = String.Format("Server={0};Database={1};Integrated Security=true", server, databaseName);
SaveConnectionString(connectionString, providerName);
Initialize(providerName);
}
internal string BuildAzureConnectionString(string server, string databaseName, string user, string password)
{
if (server.Contains(".") && ServerStartsWithTcp(server) == false)
@@ -282,16 +296,15 @@ namespace Umbraco.Core
if (databaseSettings != null && string.IsNullOrWhiteSpace(databaseSettings.ConnectionString) == false && string.IsNullOrWhiteSpace(databaseSettings.ProviderName) == false)
{
var providerName = "System.Data.SqlClient";
string connString = null;
if (!string.IsNullOrEmpty(ConfigurationManager.ConnectionStrings[GlobalSettings.UmbracoConnectionName].ProviderName))
{
providerName = ConfigurationManager.ConnectionStrings[GlobalSettings.UmbracoConnectionName].ProviderName;
_connectionString =
ConfigurationManager.ConnectionStrings[GlobalSettings.UmbracoConnectionName].ConnectionString;
connString = ConfigurationManager.ConnectionStrings[GlobalSettings.UmbracoConnectionName].ConnectionString;
}
Initialize(providerName, connString);
Initialize(providerName);
DetermineSqlServerVersion();
}
else if (ConfigurationManager.AppSettings.ContainsKey(GlobalSettings.UmbracoConnectionName) && string.IsNullOrEmpty(ConfigurationManager.AppSettings[GlobalSettings.UmbracoConnectionName]) == false)
{
@@ -328,6 +341,8 @@ namespace Umbraco.Core
//Remove the legacy connection string, so we don't end up in a loop if something goes wrong.
GlobalSettings.RemoveSetting(GlobalSettings.UmbracoConnectionName);
DetermineSqlServerVersion();
}
else
{
@@ -355,6 +370,55 @@ namespace Umbraco.Core
}
}
internal void Initialize(string providerName, string connectionString)
{
_connectionString = connectionString;
Initialize(providerName);
}
/// <summary>
/// Set the lazy resolution of determining the SQL server version if that is the db type we're using
/// </summary>
private void DetermineSqlServerVersion()
{
var sqlServerSyntax = SqlSyntaxContext.SqlSyntaxProvider as SqlServerSyntaxProvider;
if (sqlServerSyntax != null)
{
//this will not execute now, it is lazy so will only execute when we need to actually know
// the sql server version.
sqlServerSyntax.VersionName = new Lazy<SqlServerVersionName>(() =>
{
try
{
var database = this._factory.CreateDatabase();
var version = database.ExecuteScalar<string>("SELECT SERVERPROPERTY('productversion')");
var firstPart = version.Split('.')[0];
switch (firstPart)
{
case "11":
return SqlServerVersionName.V2012;
case "10":
return SqlServerVersionName.V2008;
case "9":
return SqlServerVersionName.V2005;
case "8":
return SqlServerVersionName.V2000;
case "7":
return SqlServerVersionName.V7;
default:
return SqlServerVersionName.Other;
}
}
catch (Exception)
{
return SqlServerVersionName.Invalid;
}
});
}
}
internal DatabaseSchemaResult ValidateDatabaseSchema()
{
if (_configured == false || (string.IsNullOrEmpty(_connectionString) || string.IsNullOrEmpty(ProviderName)))
@@ -393,8 +457,8 @@ namespace Umbraco.Core
if (supportsCaseInsensitiveQueries == false)
{
message = "<p>&nbsp;</p><p>The database you're trying to use does not support case insensitive queries. <br />We currently do not support these types of databases.</p>" +
"<p>You can fix this by changing the following two settings in your my.ini file in your MySQL installation directory:</p>" +
"<pre>lower_case_table_names=1\nlower_case_file_system=1</pre><br />" +
"<p>You can fix this by changing the following setting in your my.ini file in your MySQL installation directory:</p>" +
"<pre>lower_case_table_names=1</pre><br />" +
"<p>Note: Make sure to check with your hosting provider if they support case insensitive queries as well.</p>" +
"<p>For more technical information on case sensitivity in MySQL, have a look at " +
"<a href='http://dev.mysql.com/doc/refman/5.0/en/identifier-case-sensitivity.html'>the documentation on the subject</a></p>";
@@ -404,8 +468,8 @@ namespace Umbraco.Core
else if (supportsCaseInsensitiveQueries == null)
{
message = "<p>&nbsp;</p><p>Warning! Could not check if your database type supports case insensitive queries. <br />We currently do not support these databases that do not support case insensitive queries.</p>" +
"<p>You can check this by looking for the following two settings in your my.ini file in your MySQL installation directory:</p>" +
"<pre>lower_case_table_names=1\nlower_case_file_system=1</pre><br />" +
"<p>You can check this by looking for the following setting in your my.ini file in your MySQL installation directory:</p>" +
"<pre>lower_case_table_names=1</pre><br />" +
"<p>Note: Make sure to check with your hosting provider if they support case insensitive queries as well.</p>" +
"<p>For more technical information on case sensitivity in MySQL, have a look at " +
"<a href='http://dev.mysql.com/doc/refman/5.0/en/identifier-case-sensitivity.html'>the documentation on the subject</a></p>";
@@ -418,8 +482,8 @@ namespace Umbraco.Core
"<p>Note: You're using MySQL and the database instance you're connecting to seems to support case insensitive queries.</p>" +
"<p>However, your hosting provider may not support this option. Umbraco does not currently support MySQL installs that do not support case insensitive queries</p>" +
"<p>Make sure to check with your hosting provider if they support case insensitive queries as well.</p>" +
"<p>They can check this by looking for the following two settings in the my.ini file in their MySQL installation directory:</p>" +
"<pre>lower_case_table_names=1\nlower_case_file_system=1</pre><br />" +
"<p>They can check this by looking for the following setting in the my.ini file in their MySQL installation directory:</p>" +
"<pre>lower_case_table_names=1</pre><br />" +
"<p>For more technical information on case sensitivity in MySQL, have a look at " +
"<a href='http://dev.mysql.com/doc/refman/5.0/en/identifier-case-sensitivity.html'>the documentation on the subject</a></p>";
}
@@ -446,6 +510,8 @@ namespace Umbraco.Core
message = message + "<p>Upgrade completed!</p>";
}
//now that everything is done, we need to determine the version of SQL server that is executing
LogHelper.Info<DatabaseContext>("Database configuration status: " + message);
return new Result { Message = message, Success = true, Percentage = "100" };
+22
View File
@@ -0,0 +1,22 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Umbraco.Core
{
public static class DateTimeExtensions
{
/// <summary>
/// Returns the DateTime as an ISO formatted string that is globally expectable
/// </summary>
/// <param name="dt"></param>
/// <returns></returns>
public static string ToIsoString(this DateTime dt)
{
return dt.ToString("yyyy-MM-dd HH:mm:ss");
}
}
}
+52 -1
View File
@@ -1,5 +1,6 @@
using System;
using System.Collections;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Linq;
@@ -10,10 +11,60 @@ using System.Web;
namespace Umbraco.Core
{
///<summary>
/// Extension methods for dictionary
/// Extension methods for dictionary & concurrentdictionary
///</summary>
internal static class DictionaryExtensions
{
/// <summary>
/// Updates an item with the specified key with the specified value
/// </summary>
/// <typeparam name="TKey"></typeparam>
/// <typeparam name="TValue"></typeparam>
/// <param name="dict"></param>
/// <param name="key"></param>
/// <param name="updateFactory"></param>
/// <returns></returns>
/// <remarks>
/// Taken from: http://stackoverflow.com/questions/12240219/is-there-a-way-to-use-concurrentdictionary-tryupdate-with-a-lambda-expression
///
/// If there is an item in the dictionary with the key, it will keep trying to update it until it can
/// </remarks>
public static bool TryUpdate<TKey, TValue>(this ConcurrentDictionary<TKey, TValue> dict, TKey key, Func<TValue, TValue> updateFactory)
{
TValue curValue;
while (dict.TryGetValue(key, out curValue))
{
if (dict.TryUpdate(key, updateFactory(curValue), curValue))
return true;
//if we're looping either the key was removed by another thread, or another thread
//changed the value, so we start again.
}
return false;
}
/// <summary>
/// Updates an item with the specified key with the specified value
/// </summary>
/// <typeparam name="TKey"></typeparam>
/// <typeparam name="TValue"></typeparam>
/// <param name="dict"></param>
/// <param name="key"></param>
/// <param name="updateFactory"></param>
/// <returns></returns>
/// <remarks>
/// Taken from: http://stackoverflow.com/questions/12240219/is-there-a-way-to-use-concurrentdictionary-tryupdate-with-a-lambda-expression
///
/// WARNING: If the value changes after we've retreived it, then the item will not be updated
/// </remarks>
public static bool TryUpdateOptimisitic<TKey, TValue>(this ConcurrentDictionary<TKey, TValue> dict, TKey key, Func<TValue, TValue> updateFactory)
{
TValue curValue;
if (!dict.TryGetValue(key, out curValue))
return false;
dict.TryUpdate(key, updateFactory(curValue), curValue);
return true;//note we return true whether we succeed or not, see explanation below.
}
/// <summary>
/// Converts a dictionary to another type by only using direct casting
/// </summary>
+158 -83
View File
@@ -1,6 +1,8 @@
using System;
using System.Diagnostics;
using System.Web;
using Umbraco.Core.Logging;
using Umbraco.Core.Profiling;
namespace Umbraco.Core
{
@@ -9,11 +11,17 @@ namespace Umbraco.Core
/// </summary>
/// <example>
/// <code>
///
/// using (DisposableTimer.TraceDuration{MyType}("starting", "finished"))
/// {
/// Thread.Sleep(567);
/// }
///
/// Console.WriteLine("Testing Stopwatchdisposable, should be 567:");
// using (var timer = new DisposableTimer(result => Console.WriteLine("Took {0}ms", result)))
// {
// Thread.Sleep(567);
// }
/// using (var timer = new DisposableTimer(result => Console.WriteLine("Took {0}ms", result)))
/// {
/// Thread.Sleep(567);
/// }
/// </code>
/// </example>
public class DisposableTimer : DisposableObject
@@ -24,7 +32,7 @@ namespace Umbraco.Core
protected DisposableTimer(Action<long> callback)
{
_callback = callback;
}
}
public Stopwatch Stopwatch
{
@@ -36,96 +44,149 @@ namespace Umbraco.Core
/// </summary>
/// <param name="callback">The callback.</param>
/// <returns></returns>
[Obsolete("Use either TraceDuration or DebugDuration instead of using Start")]
public static DisposableTimer Start(Action<long> callback)
{
return new DisposableTimer(callback);
}
public static DisposableTimer TraceDuration<T>(Func<string> startMessage, Func<string> completeMessage)
{
return TraceDuration(typeof(T), startMessage, completeMessage);
}
#region TraceDuration
public static DisposableTimer TraceDuration<T>(Func<string> startMessage, Func<string> completeMessage)
{
return TraceDuration(typeof(T), startMessage, completeMessage);
}
public static DisposableTimer TraceDuration(Type loggerType, Func<string> startMessage, Func<string> completeMessage)
{
LogHelper.Debug(loggerType, startMessage);
return new DisposableTimer(x => LogHelper.Info(loggerType, () => completeMessage() + " (took " + x + "ms)"));
}
public static DisposableTimer TraceDuration(Type loggerType, Func<string> startMessage, Func<string> completeMessage)
{
var startMsg = startMessage();
LogHelper.Info(loggerType, startMsg);
if (HttpContext.Current != null)
HttpContext.Current.Trace.Write("Start: " + startMsg);
var profiler = ActivateProfiler(loggerType, startMsg);
return new DisposableTimer(x =>
{
profiler.DisposeIfDisposable();
LogHelper.Info(loggerType, () => completeMessage() + " (took " + x + "ms)");
if (HttpContext.Current != null)
HttpContext.Current.Trace.Write("End: " + startMsg);
});
}
/// <summary>
/// Adds a start and end log entry as Info and tracks how long it takes until disposed.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="startMessage"></param>
/// <param name="completeMessage"></param>
/// <returns></returns>
public static DisposableTimer TraceDuration<T>(string startMessage, string completeMessage)
{
return TraceDuration(typeof(T), startMessage, completeMessage);
}
/// <summary>
/// Adds a start and end log entry as Info and tracks how long it takes until disposed.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="startMessage"></param>
/// <param name="completeMessage"></param>
/// <returns></returns>
public static DisposableTimer TraceDuration<T>(string startMessage, string completeMessage)
{
return TraceDuration(typeof(T), startMessage, completeMessage);
}
/// <summary>
/// Adds a start and end log entry as Info and tracks how long it takes until disposed.
/// </summary>
/// <param name="loggerType"></param>
/// <param name="startMessage"></param>
/// <param name="completeMessage"></param>
/// <returns></returns>
public static DisposableTimer TraceDuration(Type loggerType, string startMessage, string completeMessage)
{
LogHelper.Info(loggerType, () => startMessage);
return new DisposableTimer(x => LogHelper.Info(loggerType, () => completeMessage + " (took " + x + "ms)"));
}
public static DisposableTimer TraceDuration<T>(string startMessage)
{
return TraceDuration(typeof(T), startMessage, "Complete");
}
/// <summary>
/// Adds a start and end log entry as Debug and tracks how long it takes until disposed.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="startMessage"></param>
/// <param name="completeMessage"></param>
/// <returns></returns>
public static DisposableTimer DebugDuration<T>(string startMessage, string completeMessage)
{
return DebugDuration(typeof(T), startMessage, completeMessage);
}
/// <summary>
/// Adds a start and end log entry as Info and tracks how long it takes until disposed.
/// </summary>
/// <param name="loggerType"></param>
/// <param name="startMessage"></param>
/// <param name="completeMessage"></param>
/// <returns></returns>
public static DisposableTimer TraceDuration(Type loggerType, string startMessage, string completeMessage)
{
LogHelper.Info(loggerType, startMessage);
if (HttpContext.Current != null)
HttpContext.Current.Trace.Write("Start: " + startMessage);
var profiler = ActivateProfiler(loggerType, startMessage);
return new DisposableTimer(x =>
{
profiler.DisposeIfDisposable();
LogHelper.Info(loggerType, () => completeMessage + " (took " + x + "ms)");
if (HttpContext.Current != null)
HttpContext.Current.Trace.Write("End: " + startMessage);
});
}
#endregion
/// <summary>
/// Adds a start and end log entry as Debug and tracks how long it takes until disposed.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="startMessage"></param>
/// <param name="completeMessage"></param>
/// <returns></returns>
public static DisposableTimer DebugDuration<T>(Func<string> startMessage, Func<string> completeMessage)
{
return DebugDuration(typeof(T), startMessage, completeMessage);
}
#region DebugDuration
/// <summary>
/// Adds a start and end log entry as Debug and tracks how long it takes until disposed.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="startMessage"></param>
/// <param name="completeMessage"></param>
/// <returns></returns>
public static DisposableTimer DebugDuration<T>(string startMessage, string completeMessage)
{
return DebugDuration(typeof(T), startMessage, completeMessage);
}
/// <summary>
/// Adds a start and end log entry as Debug and tracks how long it takes until disposed.
/// </summary>
/// <param name="loggerType"></param>
/// <param name="startMessage"></param>
/// <param name="completeMessage"></param>
/// <returns></returns>
public static DisposableTimer DebugDuration(Type loggerType, string startMessage, string completeMessage)
{
LogHelper.Debug(loggerType, () => startMessage);
return new DisposableTimer(x => LogHelper.Debug(loggerType, () => completeMessage + " (took " + x + "ms)"));
}
public static DisposableTimer DebugDuration<T>(string startMessage)
{
return DebugDuration(typeof(T), startMessage, "Complete");
}
/// <summary>
/// Adds a start and end log entry as Debug and tracks how long it takes until disposed.
/// </summary>
/// <param name="loggerType"></param>
/// <param name="startMessage"></param>
/// <param name="completeMessage"></param>
/// <returns></returns>
public static DisposableTimer DebugDuration(Type loggerType, Func<string> startMessage, Func<string> completeMessage)
{
LogHelper.Debug(loggerType, startMessage);
return new DisposableTimer(x => LogHelper.Debug(loggerType, () => completeMessage() + " (took " + x + "ms)"));
}
/// <summary>
/// Adds a start and end log entry as Debug and tracks how long it takes until disposed.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="startMessage"></param>
/// <param name="completeMessage"></param>
/// <returns></returns>
public static DisposableTimer DebugDuration<T>(Func<string> startMessage, Func<string> completeMessage)
{
return DebugDuration(typeof(T), startMessage, completeMessage);
}
/// <summary>
/// Adds a start and end log entry as Debug and tracks how long it takes until disposed.
/// </summary>
/// <param name="loggerType"></param>
/// <param name="startMessage"></param>
/// <param name="completeMessage"></param>
/// <returns></returns>
public static DisposableTimer DebugDuration(Type loggerType, string startMessage, string completeMessage)
{
LogHelper.Debug(loggerType, startMessage);
if (HttpContext.Current != null)
HttpContext.Current.Trace.Write("Start: " + startMessage);
var profiler = ActivateProfiler(loggerType, startMessage);
return new DisposableTimer(x =>
{
profiler.DisposeIfDisposable();
LogHelper.Debug(loggerType, () => completeMessage + " (took " + x + "ms)");
if (HttpContext.Current != null)
HttpContext.Current.Trace.Write("End: " + startMessage);
});
}
/// <summary>
/// Adds a start and end log entry as Debug and tracks how long it takes until disposed.
/// </summary>
/// <param name="loggerType"></param>
/// <param name="startMessage"></param>
/// <param name="completeMessage"></param>
/// <returns></returns>
public static DisposableTimer DebugDuration(Type loggerType, Func<string> startMessage, Func<string> completeMessage)
{
var msg = startMessage();
LogHelper.Debug(loggerType, msg);
if (HttpContext.Current != null)
HttpContext.Current.Trace.Write("Start: " + startMessage);
var profiler = ActivateProfiler(loggerType, msg);
return new DisposableTimer(x =>
{
profiler.DisposeIfDisposable();
LogHelper.Debug(loggerType, () => completeMessage() + " (took " + x + "ms)");
if (HttpContext.Current != null)
HttpContext.Current.Trace.Write("End: " + startMessage);
});
}
#endregion
/// <summary>
/// Handles the disposal of resources. Derived from abstract class <see cref="DisposableObject"/> which handles common required locking logic.
@@ -134,5 +195,19 @@ namespace Umbraco.Core
{
_callback.Invoke(Stopwatch.ElapsedMilliseconds);
}
private static IDisposable ActivateProfiler(Type loggerType, string profileName)
{
try
{
return ProfilerResolver.Current.Profiler.Step(loggerType, profileName);
}
catch (InvalidOperationException)
{
//swallow this exception, it will occur if the ProfilerResolver is not initialized... generally only in
// unit tests.
}
return null;
}
}
}
@@ -0,0 +1,63 @@
using System;
using System.Collections.Generic;
namespace Umbraco.Core.Events
{
public class RecycleBinEventArgs : CancellableEventArgs
{
public RecycleBinEventArgs(Guid nodeObjectType, IEnumerable<int> ids, List<string> files, bool emptiedSuccessfully)
: base(false)
{
NodeObjectType = nodeObjectType;
Ids = ids;
Files = files;
RecycleBinEmptiedSuccessfully = emptiedSuccessfully;
}
public RecycleBinEventArgs(Guid nodeObjectType, IEnumerable<int> ids, List<string> files)
: base(true)
{
NodeObjectType = nodeObjectType;
Ids = ids;
Files = files;
}
/// <summary>
/// Gets the Id of the node object type of the items
/// being deleted from the Recycle Bin.
/// </summary>
public Guid NodeObjectType { get; private set; }
/// <summary>
/// Gets the list of Ids for each of the items being deleted from the Recycle Bin.
/// </summary>
public IEnumerable<int> Ids { get; private set; }
/// <summary>
/// Gets the list of Files that should be deleted as part
/// of emptying the Recycle Bin.
/// </summary>
public List<string> Files { get; private set; }
/// <summary>
/// Boolean indicating whether the Recycle Bin was emptied successfully
/// </summary>
public bool RecycleBinEmptiedSuccessfully { get; private set; }
/// <summary>
/// Boolean indicating whether this event was fired for the Content's Recycle Bin.
/// </summary>
public bool IsContentRecycleBin
{
get { return NodeObjectType == new Guid(Constants.ObjectTypes.Document); }
}
/// <summary>
/// Boolean indicating whether this event was fired for the Media's Recycle Bin.
/// </summary>
public bool IsMediaRecycleBin
{
get { return NodeObjectType == new Guid(Constants.ObjectTypes.Media); }
}
}
}
+1 -1
View File
@@ -2,7 +2,7 @@ using umbraco.interfaces;
namespace Umbraco.Core
{
/// <summary>
/// <summary>
/// Custom IApplicationStartupHandler that auto subscribes to the applications events
/// </summary>
public interface IApplicationEventHandler : IApplicationStartupHandler
+14
View File
@@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Umbraco.Core
{
/// <summary>
/// Any class implementing this interface that is added to the httpcontext.items keys or values will be disposed of at the end of the request.
/// </summary>
public interface IDisposeOnRequestEnd : IDisposable
{
}
}
@@ -5,12 +5,11 @@ using System.Text;
using Umbraco.Core.CodeAnnotations;
namespace Umbraco.Core.IO
{
[UmbracoExperimentalFeature("http://issues.umbraco.org/issue/U4-1156", "Will be declared public after 4.10")]
{
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)]
internal class FileSystemProviderAttribute : Attribute
public class FileSystemProviderAttribute : Attribute
{
public string Alias { get; set; }
public string Alias { get; private set; }
public FileSystemProviderAttribute(string alias)
{
@@ -6,8 +6,7 @@ using Umbraco.Core.CodeAnnotations;
namespace Umbraco.Core.IO
{
[UmbracoExperimentalFeature("http://issues.umbraco.org/issue/U4-1156", "Will be declared public after 4.10")]
internal class FileSystemProvider
internal class FileSystemProviderConstants
{
public const string Media = "media";
}
@@ -9,9 +9,8 @@ using Umbraco.Core.CodeAnnotations;
using Umbraco.Core.Configuration;
namespace Umbraco.Core.IO
{
[UmbracoExperimentalFeature("http://issues.umbraco.org/issue/U4-1156", "Will be declared public after 4.10")]
internal class FileSystemProviderManager
{
public class FileSystemProviderManager
{
private readonly FileSystemProvidersSection _config;
@@ -28,7 +27,7 @@ namespace Umbraco.Core.IO
#region Constructors
public FileSystemProviderManager()
internal FileSystemProviderManager()
{
_config = (FileSystemProvidersSection)ConfigurationManager.GetSection("FileSystemProviders");
}
@@ -48,7 +47,15 @@ namespace Umbraco.Core.IO
private readonly ConcurrentDictionary<string, ProviderConstructionInfo> _providerLookup = new ConcurrentDictionary<string, ProviderConstructionInfo>();
private readonly ConcurrentDictionary<Type, string> _wrappedProviderLookup = new ConcurrentDictionary<Type, string>();
public IFileSystem GetFileSystemProvider(string alias)
/// <summary>
/// Returns the underlying (non-typed) file system provider for the alias specified
/// </summary>
/// <param name="alias"></param>
/// <returns></returns>
/// <remarks>
/// It is recommended to use the typed GetFileSystemProvider method instead to get a strongly typed provider instance.
/// </remarks>
public IFileSystem GetUnderlyingFileSystemProvider(string alias)
{
//either get the constructor info from cache or create it and add to cache
var ctorInfo = _providerLookup.GetOrAdd(alias, s =>
@@ -88,6 +95,11 @@ namespace Umbraco.Core.IO
return fs;
}
/// <summary>
/// Returns the strongly typed file system provider
/// </summary>
/// <typeparam name="TProviderTypeFilter"></typeparam>
/// <returns></returns>
public TProviderTypeFilter GetFileSystemProvider<TProviderTypeFilter>()
where TProviderTypeFilter : FileSystemWrapper
{
@@ -111,7 +123,7 @@ namespace Umbraco.Core.IO
return attr.Alias;
});
var innerFs = GetFileSystemProvider(alias);
var innerFs = GetUnderlyingFileSystemProvider(alias);
var outputFs = Activator.CreateInstance(typeof (TProviderTypeFilter), innerFs);
return (TProviderTypeFilter)outputFs;
}
+118 -86
View File
@@ -1,14 +1,11 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Globalization;
using System.Reflection;
using System.Text;
using System.IO;
using System.Configuration;
using System.Web;
using System.Text.RegularExpressions;
using System.Xml;
using Umbraco.Core.Configuration;
using Umbraco.Core.Logging;
@@ -37,7 +34,7 @@ namespace Umbraco.Core.IO
if (virtualPath.StartsWith("~"))
retval = virtualPath.Replace("~", SystemDirectories.Root);
if (virtualPath.StartsWith("/") && !virtualPath.StartsWith(SystemDirectories.Root))
if (virtualPath.StartsWith("/") && virtualPath.StartsWith(SystemDirectories.Root) == false)
retval = SystemDirectories.Root + "/" + virtualPath.TrimStart('/');
return retval;
@@ -48,6 +45,8 @@ namespace Umbraco.Core.IO
{
if (virtualPath.StartsWith("~"))
return virtualPath.Replace("~", SystemDirectories.Root).Replace("//", "/");
else if (Uri.IsWellFormedUriString(virtualPath, UriKind.Absolute))
return virtualPath;
else
return VirtualPathUtility.ToAbsolute(virtualPath, SystemDirectories.Root);
}
@@ -68,11 +67,7 @@ namespace Umbraco.Core.IO
if (tag.Groups[1].Success)
url = tag.Groups[1].Value;
// The richtext editor inserts a slash in front of the url. That's why we need this little fix
// if (url.StartsWith("/"))
// text = text.Replace(url, ResolveUrl(url.Substring(1)));
// else
if (!String.IsNullOrEmpty(url))
if (string.IsNullOrEmpty(url) == false)
{
string resolvedUrl = (url.Substring(0, 1) == "/") ? ResolveUrl(url.Substring(1)) : ResolveUrl(url);
text = text.Replace(url, resolvedUrl);
@@ -97,19 +92,15 @@ namespace Umbraco.Core.IO
if (useHttpContext && HttpContext.Current != null)
{
//string retval;
if (!string.IsNullOrEmpty(path) && (path.StartsWith("~") || path.StartsWith(SystemDirectories.Root)))
if (string.IsNullOrEmpty(path) == false && (path.StartsWith("~") || path.StartsWith(SystemDirectories.Root)))
return System.Web.Hosting.HostingEnvironment.MapPath(path);
else
return System.Web.Hosting.HostingEnvironment.MapPath("~/" + path.TrimStart('/'));
}
//var root = (!string.IsNullOrEmpty(System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath))
// ? System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath.TrimEnd(IOHelper.DirSepChar)
// : getRootDirectorySafe();
var root = GetRootDirectorySafe();
var newPath = path.TrimStart('~', '/').Replace('/', IOHelper.DirSepChar);
var retval = root + IOHelper.DirSepChar.ToString() + newPath;
var retval = root + IOHelper.DirSepChar.ToString(CultureInfo.InvariantCulture) + newPath;
return retval;
}
@@ -137,51 +128,98 @@ namespace Umbraco.Core.IO
}
/// <summary>
/// Validates if the current filepath matches a directory where the user is allowed to edit a file
/// Verifies that the current filepath matches a directory where the user is allowed to edit a file.
/// </summary>
/// <param name="filePath">filepath </param>
/// <param name="validDir"></param>
/// <returns>true if valid, throws a FileSecurityException if not</returns>
internal static bool ValidateEditPath(string filePath, string validDir)
/// <param name="filePath">The filepath to validate.</param>
/// <param name="validDir">The valid directory.</param>
/// <returns>A value indicating whether the filepath is valid.</returns>
internal static bool VerifyEditPath(string filePath, string validDir)
{
if (!filePath.StartsWith(MapPath(SystemDirectories.Root)))
if (filePath.StartsWith(MapPath(SystemDirectories.Root)) == false)
filePath = MapPath(filePath);
if (!validDir.StartsWith(MapPath(SystemDirectories.Root)))
if (validDir.StartsWith(MapPath(SystemDirectories.Root)) == false)
validDir = MapPath(validDir);
if (!filePath.StartsWith(validDir))
throw new FileSecurityException(String.Format("The filepath '{0}' is not within an allowed directory for this type of files", filePath.Replace(MapPath(SystemDirectories.Root), "")));
return filePath.StartsWith(validDir);
}
/// <summary>
/// Validates that the current filepath matches a directory where the user is allowed to edit a file.
/// </summary>
/// <param name="filePath">The filepath to validate.</param>
/// <param name="validDir">The valid directory.</param>
/// <returns>True, if the filepath is valid, else an exception is thrown.</returns>
/// <exception cref="FileSecurityException">The filepath is invalid.</exception>
internal static bool ValidateEditPath(string filePath, string validDir)
{
if (VerifyEditPath(filePath, validDir) == false)
throw new FileSecurityException(String.Format("The filepath '{0}' is not within an allowed directory for this type of files", filePath.Replace(MapPath(SystemDirectories.Root), "")));
return true;
}
internal static bool ValidateEditPath(string filePath, IEnumerable<string> validDirs)
/// <summary>
/// Verifies that the current filepath matches one of several directories where the user is allowed to edit a file.
/// </summary>
/// <param name="filePath">The filepath to validate.</param>
/// <param name="validDirs">The valid directories.</param>
/// <returns>A value indicating whether the filepath is valid.</returns>
internal static bool VerifyEditPath(string filePath, IEnumerable<string> validDirs)
{
foreach (var dir in validDirs)
{
var validDir = dir;
if (!filePath.StartsWith(MapPath(SystemDirectories.Root)))
if (filePath.StartsWith(MapPath(SystemDirectories.Root)) == false)
filePath = MapPath(filePath);
if (!validDir.StartsWith(MapPath(SystemDirectories.Root)))
if (validDir.StartsWith(MapPath(SystemDirectories.Root)) == false)
validDir = MapPath(validDir);
if (filePath.StartsWith(validDir))
return true;
}
throw new FileSecurityException(String.Format("The filepath '{0}' is not within an allowed directory for this type of files", filePath.Replace(MapPath(SystemDirectories.Root), "")));
return false;
}
internal static bool ValidateFileExtension(string filePath, List<string> validFileExtensions)
/// <summary>
/// Validates that the current filepath matches one of several directories where the user is allowed to edit a file.
/// </summary>
/// <param name="filePath">The filepath to validate.</param>
/// <param name="validDirs">The valid directories.</param>
/// <returns>True, if the filepath is valid, else an exception is thrown.</returns>
/// <exception cref="FileSecurityException">The filepath is invalid.</exception>
internal static bool ValidateEditPath(string filePath, IEnumerable<string> validDirs)
{
if (!filePath.StartsWith(MapPath(SystemDirectories.Root)))
if (VerifyEditPath(filePath, validDirs) == false)
throw new FileSecurityException(String.Format("The filepath '{0}' is not within an allowed directory for this type of files", filePath.Replace(MapPath(SystemDirectories.Root), "")));
return true;
}
/// <summary>
/// Verifies that the current filepath has one of several authorized extensions.
/// </summary>
/// <param name="filePath">The filepath to validate.</param>
/// <param name="validFileExtensions">The valid extensions.</param>
/// <returns>A value indicating whether the filepath is valid.</returns>
internal static bool VerifyFileExtension(string filePath, List<string> validFileExtensions)
{
if (filePath.StartsWith(MapPath(SystemDirectories.Root)) == false)
filePath = MapPath(filePath);
var f = new FileInfo(filePath);
return validFileExtensions.Contains(f.Extension.Substring(1));
}
if (!validFileExtensions.Contains(f.Extension.Substring(1)))
/// <summary>
/// Validates that the current filepath has one of several authorized extensions.
/// </summary>
/// <param name="filePath">The filepath to validate.</param>
/// <param name="validFileExtensions">The valid extensions.</param>
/// <returns>True, if the filepath is valid, else an exception is thrown.</returns>
/// <exception cref="FileSecurityException">The filepath is invalid.</exception>
internal static bool ValidateFileExtension(string filePath, List<string> validFileExtensions)
{
if (VerifyFileExtension(filePath, validFileExtensions) == false)
throw new FileSecurityException(String.Format("The extension for the current file '{0}' is not of an allowed type for this editor. This is typically controlled from either the installed MacroEngines or based on configuration in /config/umbracoSettings.config", filePath.Replace(MapPath(SystemDirectories.Root), "")));
return true;
}
@@ -194,7 +232,7 @@ namespace Umbraco.Core.IO
/// <returns></returns>
internal static string GetRootDirectorySafe()
{
if (!String.IsNullOrEmpty(_rootDir))
if (string.IsNullOrEmpty(_rootDir) == false)
{
return _rootDir;
}
@@ -203,12 +241,53 @@ namespace Umbraco.Core.IO
var uri = new Uri(codeBase);
var path = uri.LocalPath;
var baseDirectory = Path.GetDirectoryName(path);
_rootDir = baseDirectory.Substring(0, baseDirectory.LastIndexOf("bin") - 1);
if (string.IsNullOrEmpty(baseDirectory))
throw new Exception("No root directory could be resolved. Please ensure that your Umbraco solution is correctly configured.");
_rootDir = baseDirectory.Contains("bin")
? baseDirectory.Substring(0, baseDirectory.LastIndexOf("bin", StringComparison.OrdinalIgnoreCase) - 1)
: baseDirectory;
return _rootDir;
}
internal static string GetRootDirectoryBinFolder()
{
string binFolder = string.Empty;
if (string.IsNullOrEmpty(_rootDir))
{
binFolder = Assembly.GetExecutingAssembly().GetAssemblyFile().Directory.FullName;
return binFolder;
}
binFolder = Path.Combine(GetRootDirectorySafe(), "bin");
#if DEBUG
var debugFolder = Path.Combine(binFolder, "debug");
if (Directory.Exists(debugFolder))
return debugFolder;
#endif
var releaseFolder = Path.Combine(binFolder, "release");
if (Directory.Exists(releaseFolder))
return releaseFolder;
if (Directory.Exists(binFolder))
return binFolder;
return _rootDir;
}
/// <summary>
/// Allows you to overwrite RootDirectory, which would otherwise be resolved
/// automatically upon application start.
/// </summary>
/// <remarks>The supplied path should be the absolute path to the root of the umbraco site.</remarks>
/// <param name="rootPath"></param>
internal static void SetRootDirectory(string rootPath)
{
_rootDir = rootPath;
}
/// <summary>
/// Check to see if filename passed has any special chars in it and strips them to create a safe filename. Used to overcome an issue when Umbraco is used in IE in an intranet environment.
/// </summary>
@@ -216,55 +295,8 @@ namespace Umbraco.Core.IO
/// <returns>A safe filename without any path specific chars.</returns>
internal static string SafeFileName(string filePath)
{
if (String.IsNullOrEmpty(filePath))
return String.Empty;
if (!String.IsNullOrWhiteSpace(filePath))
{
foreach (var character in Path.GetInvalidFileNameChars())
{
filePath = filePath.Replace(character, '-');
}
}
else
{
filePath = String.Empty;
}
//Break up the file in name and extension before applying the UrlReplaceCharacters
var fileNamePart = filePath.Substring(0, filePath.LastIndexOf('.'));
var ext = filePath.Substring(filePath.LastIndexOf('.'));
//Because the file usually is downloadable as well we check characters against 'UmbracoSettings.UrlReplaceCharacters'
XmlNode replaceChars = UmbracoSettings.UrlReplaceCharacters;
foreach (XmlNode n in replaceChars.SelectNodes("char"))
{
if (n.Attributes.GetNamedItem("org") != null && n.Attributes.GetNamedItem("org").Value != "")
fileNamePart = fileNamePart.Replace(n.Attributes.GetNamedItem("org").Value, XmlHelper.GetNodeValue(n));
}
filePath = string.Concat(fileNamePart, ext);
// Adapted from: http://stackoverflow.com/a/4827510/5018
// Combined both Reserved Characters and Character Data
// from http://en.wikipedia.org/wiki/Percent-encoding
var stringBuilder = new StringBuilder();
const string reservedCharacters = "!*'();:@&=+$,/?%#[]-~{}\"<>\\^`| ";
foreach (var character in filePath)
{
if (reservedCharacters.IndexOf(character) == -1)
stringBuilder.Append(character);
else
stringBuilder.Append("-");
}
// Remove repeating dashes
// From: http://stackoverflow.com/questions/5111967/regex-to-remove-a-specific-repeated-character
var reducedString = Regex.Replace(stringBuilder.ToString(), "-+", "-");
return reducedString;
// use string extensions
return filePath.ToSafeFileName();
}
}
}
+20
View File
@@ -0,0 +1,20 @@
namespace Umbraco.Core.IO
{
internal class ResizedImage
{
public ResizedImage()
{
}
public ResizedImage(int width, int height, string fileName)
{
Width = width;
Height = height;
FileName = fileName;
}
public int Width { get; set; }
public int Height { get; set; }
public string FileName { get; set; }
}
}
+253
View File
@@ -0,0 +1,253 @@
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using System.Web;
using Umbraco.Core.Configuration;
namespace Umbraco.Core.IO
{
public class UmbracoMediaFile
{
private readonly MediaFileSystem _fs;
#region Constructors
public UmbracoMediaFile()
{
_fs = FileSystemProviderManager.Current.GetFileSystemProvider<MediaFileSystem>();
}
public UmbracoMediaFile(string path)
{
_fs = FileSystemProviderManager.Current.GetFileSystemProvider<MediaFileSystem>();
Path = path;
Initialize();
}
#endregion
#region Static Methods
//MB: Do we really need all these overloads? looking through the code, only one of them is actually used
public static UmbracoMediaFile Save(HttpPostedFile file, string path)
{
return Save(file.InputStream, path);
}
public static UmbracoMediaFile Save(HttpPostedFileBase file, string path)
{
return Save(file.InputStream, path);
}
public static UmbracoMediaFile Save(Stream inputStream, string path)
{
var fs = FileSystemProviderManager.Current.GetFileSystemProvider<MediaFileSystem>();
fs.AddFile(path, inputStream);
return new UmbracoMediaFile(path);
}
public static UmbracoMediaFile Save(byte[] file, string relativePath)
{
return Save(new MemoryStream(file), relativePath);
}
public static UmbracoMediaFile Save(HttpPostedFile file)
{
var tempDir = System.IO.Path.Combine("uploads", Guid.NewGuid().ToString());
return Save(file, tempDir);
}
//filebase overload...
public static UmbracoMediaFile Save(HttpPostedFileBase file)
{
var tempDir = System.IO.Path.Combine("uploads", Guid.NewGuid().ToString());
return Save(file, tempDir);
}
#endregion
private long? _length;
private Size? _size;
/// <summary>
/// Initialized values that don't require opening the file.
/// </summary>
private void Initialize()
{
Filename = _fs.GetFileName(Path);
Extension = _fs.GetExtension(Path) != null
? _fs.GetExtension(Path).Substring(1).ToLowerInvariant()
: "";
Url = _fs.GetUrl(Path);
}
public string Filename { get; private set; }
public string Extension { get; private set; }
public string Path { get; private set; }
public string Url { get; private set; }
/// <summary>
/// Get the length of the file in bytes
/// </summary>
/// <remarks>
/// We are lazy loading this, don't go opening the file on ctor like we were doing.
/// </remarks>
public long Length
{
get
{
if (_length == null)
{
_length = _fs.GetSize(Path);
}
return _length.Value;
}
}
public bool SupportsResizing
{
get
{
return ("," + UmbracoSettings.ImageFileTypes + ",").Contains(string.Format(",{0},", Extension));
}
}
public string GetFriendlyName()
{
return Filename.SplitPascalCasing().ToFirstUpperInvariant();
}
public Size GetDimensions()
{
if (_size == null)
{
EnsureFileSupportsResizing();
var fs = _fs.OpenFile(Path);
var image = Image.FromStream(fs);
var fileWidth = image.Width;
var fileHeight = image.Height;
fs.Close();
image.Dispose();
_size = new Size(fileWidth, fileHeight);
}
return _size.Value;
}
public string Resize(int width, int height)
{
EnsureFileSupportsResizing();
var fileNameThumb = DoResize(width, height, 0, string.Empty);
return _fs.GetUrl(fileNameThumb);
}
public string Resize(int maxWidthHeight, string fileNameAddition)
{
EnsureFileSupportsResizing();
var fileNameThumb = DoResize(GetDimensions().Width, GetDimensions().Height, maxWidthHeight, fileNameAddition);
return _fs.GetUrl(fileNameThumb);
}
private string DoResize(int width, int height, int maxWidthHeight, string fileNameAddition)
{
using (var fs = _fs.OpenFile(Path))
{
using (var image = Image.FromStream(fs))
{
var fileNameThumb = string.IsNullOrWhiteSpace(fileNameAddition)
? string.Format("{0}_UMBRACOSYSTHUMBNAIL.jpg", Path.Substring(0, Path.LastIndexOf(".", StringComparison.Ordinal)))
: string.Format("{0}_{1}.jpg", Path.Substring(0, Path.LastIndexOf(".", StringComparison.Ordinal)), fileNameAddition);
var thumbnail = GenerateThumbnail(image, maxWidthHeight, width, height, fileNameThumb, maxWidthHeight == 0);
return thumbnail.FileName;
}
}
}
private void EnsureFileSupportsResizing()
{
if (SupportsResizing == false)
throw new InvalidOperationException(string.Format("The file {0} is not an image, so can't get dimensions", Filename));
}
private ResizedImage GenerateThumbnail(Image image, int maxWidthHeight, int fileWidth, int fileHeight, string thumbnailFileName, bool useFixedDimensions)
{
// Generate thumbnail
float f = 1;
if (useFixedDimensions == false)
{
var fx = (float)image.Size.Width / (float)maxWidthHeight;
var fy = (float)image.Size.Height / (float)maxWidthHeight;
// must fit in thumbnail size
f = Math.Max(fx, fy);
}
var widthTh = (int)Math.Round((float)fileWidth / f);
var heightTh = (int)Math.Round((float)fileHeight / f);
// fixes for empty width or height
if (widthTh == 0)
widthTh = 1;
if (heightTh == 0)
heightTh = 1;
// Create new image with best quality settings
using (var bp = new Bitmap(widthTh, heightTh))
{
using (var g = Graphics.FromImage(bp))
{
g.SmoothingMode = SmoothingMode.HighQuality;
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.PixelOffsetMode = PixelOffsetMode.HighQuality;
g.CompositingQuality = CompositingQuality.HighQuality;
// Copy the old image to the new and resized
var rect = new Rectangle(0, 0, widthTh, heightTh);
g.DrawImage(image, rect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel);
// Copy metadata
var imageEncoders = ImageCodecInfo.GetImageEncoders();
var codec = Extension.ToLower() == "png" || Extension.ToLower() == "gif"
? imageEncoders.Single(t => t.MimeType.Equals("image/png"))
: imageEncoders.Single(t => t.MimeType.Equals("image/jpeg"));
// Set compresion ratio to 90%
var ep = new EncoderParameters();
ep.Param[0] = new EncoderParameter(Encoder.Quality, 90L);
// Save the new image using the dimensions of the image
var newFileName = thumbnailFileName.Replace("UMBRACOSYSTHUMBNAIL", string.Format("{0}x{1}", widthTh, heightTh));
using (var ms = new MemoryStream())
{
bp.Save(ms, codec, ep);
ms.Seek(0, 0);
_fs.AddFile(newFileName, ms);
}
return new ResizedImage(widthTh, heightTh, newFileName);
}
}
}
}
}
@@ -1,34 +0,0 @@
using System;
using System.Collections.Generic;
using Umbraco.Core.Models;
using Umbraco.Core.ObjectResolution;
namespace Umbraco.Core
{
/// <summary>
/// A resolver to return all <see cref="IMacroPropertyType"/> objects
/// </summary>
internal sealed class MacroPropertyTypeResolver : ManyObjectsResolverBase<MacroPropertyTypeResolver, IMacroPropertyType>
{
/// <summary>
/// Constructor
/// </summary>
/// <param name="macroPropertyTypes"></param>
internal MacroPropertyTypeResolver(IEnumerable<Type> macroPropertyTypes)
: base(macroPropertyTypes)
{
}
/// <summary>
/// Gets the <see cref="IMacroPropertyType"/> implementations.
/// </summary>
public IEnumerable<IMacroPropertyType> MacroPropertyTypes
{
get
{
return Values;
}
}
}
}
@@ -3,10 +3,11 @@ using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using Umbraco.Core.Macros;
using System.Linq;
using Umbraco.Core.ObjectResolution;
using umbraco.interfaces;
namespace Umbraco.Core.ObjectResolution
namespace Umbraco.Core.Macros
{
/// <summary>
/// A resolver to return all IMacroGuiRendering objects
@@ -24,9 +25,7 @@ namespace Umbraco.Core.ObjectResolution
/// <param name="macroEditors"></param>
internal MacroFieldEditorsResolver(Func<IEnumerable<Type>> macroEditors)
: base(macroEditors, ObjectLifetimeScope.Transient)
{
}
{ }
/// <summary>
/// Gets the <see cref="IMacroGuiRendering"/> implementations.
@@ -1,27 +0,0 @@
using Umbraco.Core.Models;
namespace Umbraco.Core.Macros.PropertyTypes
{
internal class ContentAll : IMacroPropertyType
{
public string Alias
{
get { return "contentAll"; }
}
public string RenderingAssembly
{
get { return "umbraco.macroRenderings"; }
}
public string RenderingType
{
get { return "content"; }
}
public MacroPropertyTypeBaseTypes BaseType
{
get { return MacroPropertyTypeBaseTypes.Int32; }
}
}
}
@@ -1,27 +0,0 @@
using Umbraco.Core.Models;
namespace Umbraco.Core.Macros.PropertyTypes
{
internal class ContentPicker : IMacroPropertyType
{
public string Alias
{
get { return "contentPicker"; }
}
public string RenderingAssembly
{
get { return "umbraco.macroRenderings"; }
}
public string RenderingType
{
get { return "content"; }
}
public MacroPropertyTypeBaseTypes BaseType
{
get { return MacroPropertyTypeBaseTypes.Int32; }
}
}
}
@@ -1,27 +0,0 @@
using Umbraco.Core.Models;
namespace Umbraco.Core.Macros.PropertyTypes
{
internal class ContentRandom : IMacroPropertyType
{
public string Alias
{
get { return "contentRandom"; }
}
public string RenderingAssembly
{
get { return "umbraco.macroRenderings"; }
}
public string RenderingType
{
get { return "content"; }
}
public MacroPropertyTypeBaseTypes BaseType
{
get { return MacroPropertyTypeBaseTypes.Int32; }
}
}
}
@@ -1,27 +0,0 @@
using Umbraco.Core.Models;
namespace Umbraco.Core.Macros.PropertyTypes
{
internal class ContentStubs : IMacroPropertyType
{
public string Alias
{
get { return "contentStubs"; }
}
public string RenderingAssembly
{
get { return "umbraco.macroRenderings"; }
}
public string RenderingType
{
get { return "content"; }
}
public MacroPropertyTypeBaseTypes BaseType
{
get { return MacroPropertyTypeBaseTypes.Int32; }
}
}
}
@@ -1,27 +0,0 @@
using Umbraco.Core.Models;
namespace Umbraco.Core.Macros.PropertyTypes
{
internal class ContentTree : IMacroPropertyType
{
public string Alias
{
get { return "contentTree"; }
}
public string RenderingAssembly
{
get { return "umbraco.macroRenderings"; }
}
public string RenderingType
{
get { return "content"; }
}
public MacroPropertyTypeBaseTypes BaseType
{
get { return MacroPropertyTypeBaseTypes.Int32; }
}
}
}
@@ -1,27 +0,0 @@
using Umbraco.Core.Models;
namespace Umbraco.Core.Macros.PropertyTypes
{
internal class ContentType : IMacroPropertyType
{
public string Alias
{
get { return "contentType"; }
}
public string RenderingAssembly
{
get { return "umbraco.macroRenderings"; }
}
public string RenderingType
{
get { return "contentTypeSingle"; }
}
public MacroPropertyTypeBaseTypes BaseType
{
get { return MacroPropertyTypeBaseTypes.Int32; }
}
}
}
@@ -1,27 +0,0 @@
using Umbraco.Core.Models;
namespace Umbraco.Core.Macros.PropertyTypes
{
internal class ContentTypeMultiple : IMacroPropertyType
{
public string Alias
{
get { return "contentTypeMultiple"; }
}
public string RenderingAssembly
{
get { return "umbraco.macroRenderings"; }
}
public string RenderingType
{
get { return "contentTypeMultiple"; }
}
public MacroPropertyTypeBaseTypes BaseType
{
get { return MacroPropertyTypeBaseTypes.Int32; }
}
}
}
@@ -1,27 +0,0 @@
using Umbraco.Core.Models;
namespace Umbraco.Core.Macros.PropertyTypes
{
internal class MediaCurrent : IMacroPropertyType
{
public string Alias
{
get { return "mediaCurrent"; }
}
public string RenderingAssembly
{
get { return "umbraco.macroRenderings"; }
}
public string RenderingType
{
get { return "media"; }
}
public MacroPropertyTypeBaseTypes BaseType
{
get { return MacroPropertyTypeBaseTypes.Int32; }
}
}
}
@@ -1,27 +0,0 @@
using Umbraco.Core.Models;
namespace Umbraco.Core.Macros.PropertyTypes
{
internal class Number : IMacroPropertyType
{
public string Alias
{
get { return "number"; }
}
public string RenderingAssembly
{
get { return "umbraco.macroRenderings"; }
}
public string RenderingType
{
get { return "numeric"; }
}
public MacroPropertyTypeBaseTypes BaseType
{
get { return MacroPropertyTypeBaseTypes.Int32; }
}
}
}
@@ -1,27 +0,0 @@
using Umbraco.Core.Models;
namespace Umbraco.Core.Macros.PropertyTypes
{
internal class PropertyTypePicker : IMacroPropertyType
{
public string Alias
{
get { return "propertyTypePicker"; }
}
public string RenderingAssembly
{
get { return "umbraco.macroRenderings"; }
}
public string RenderingType
{
get { return "propertyTypePicker"; }
}
public MacroPropertyTypeBaseTypes BaseType
{
get { return MacroPropertyTypeBaseTypes.String; }
}
}
}
@@ -1,27 +0,0 @@
using Umbraco.Core.Models;
namespace Umbraco.Core.Macros.PropertyTypes
{
internal class PropertyTypePickerMultiple : IMacroPropertyType
{
public string Alias
{
get { return "propertyTypePickerMultiple"; }
}
public string RenderingAssembly
{
get { return "umbraco.macroRenderings"; }
}
public string RenderingType
{
get { return "propertyTypePickerMultiple"; }
}
public MacroPropertyTypeBaseTypes BaseType
{
get { return MacroPropertyTypeBaseTypes.String; }
}
}
}
@@ -1,27 +0,0 @@
using Umbraco.Core.Models;
namespace Umbraco.Core.Macros.PropertyTypes
{
internal class TabPicker : IMacroPropertyType
{
public string Alias
{
get { return "tabPicker"; }
}
public string RenderingAssembly
{
get { return "umbraco.macroRenderings"; }
}
public string RenderingType
{
get { return "tabPicker"; }
}
public MacroPropertyTypeBaseTypes BaseType
{
get { return MacroPropertyTypeBaseTypes.String; }
}
}
}
@@ -1,27 +0,0 @@
using Umbraco.Core.Models;
namespace Umbraco.Core.Macros.PropertyTypes
{
internal class TabPickerMultiple : IMacroPropertyType
{
public string Alias
{
get { return "tabPickerMultiple"; }
}
public string RenderingAssembly
{
get { return "umbraco.macroRenderings"; }
}
public string RenderingType
{
get { return "tabPickerMultiple"; }
}
public MacroPropertyTypeBaseTypes BaseType
{
get { return MacroPropertyTypeBaseTypes.String; }
}
}
}
@@ -1,27 +0,0 @@
using Umbraco.Core.Models;
namespace Umbraco.Core.Macros.PropertyTypes
{
internal class Text : IMacroPropertyType
{
public string Alias
{
get { return "text"; }
}
public string RenderingAssembly
{
get { return "umbraco.macroRenderings"; }
}
public string RenderingType
{
get { return "text"; }
}
public MacroPropertyTypeBaseTypes BaseType
{
get { return MacroPropertyTypeBaseTypes.String; }
}
}
}
@@ -1,27 +0,0 @@
using Umbraco.Core.Models;
namespace Umbraco.Core.Macros.PropertyTypes
{
internal class TextMultiLine : IMacroPropertyType
{
public string Alias
{
get { return "textMultiLine"; }
}
public string RenderingAssembly
{
get { return "umbraco.macroRenderings"; }
}
public string RenderingType
{
get { return "textMultiple"; }
}
public MacroPropertyTypeBaseTypes BaseType
{
get { return MacroPropertyTypeBaseTypes.String; }
}
}
}
@@ -1,27 +0,0 @@
using Umbraco.Core.Models;
namespace Umbraco.Core.Macros.PropertyTypes
{
internal class YesNoBool : IMacroPropertyType
{
public string Alias
{
get { return "bool"; }
}
public string RenderingAssembly
{
get { return "umbraco.macroRenderings"; }
}
public string RenderingType
{
get { return "yesNo"; }
}
public MacroPropertyTypeBaseTypes BaseType
{
get { return MacroPropertyTypeBaseTypes.Boolean; }
}
}
}
+76 -19
View File
@@ -1,7 +1,9 @@
using System;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.Serialization;
using Umbraco.Core.Persistence.Mappers;
namespace Umbraco.Core.Models
{
@@ -20,7 +22,7 @@ namespace Umbraco.Core.Models
private DateTime? _expireDate;
private int _writer;
private string _nodeName;//NOTE Once localization is introduced this will be the non-localized Node Name.
private bool _permissionsChanged;
/// <summary>
/// Constructor for creating a Content object
/// </summary>
@@ -80,6 +82,7 @@ namespace Umbraco.Core.Models
private static readonly PropertyInfo ExpireDateSelector = ExpressionHelper.GetPropertyInfo<Content, DateTime?>(x => x.ExpireDate);
private static readonly PropertyInfo WriterSelector = ExpressionHelper.GetPropertyInfo<Content, int>(x => x.WriterId);
private static readonly PropertyInfo NodeNameSelector = ExpressionHelper.GetPropertyInfo<Content, string>(x => x.NodeName);
private static readonly PropertyInfo PermissionsChangedSelector = ExpressionHelper.GetPropertyInfo<Content, bool>(x => x.PermissionsChanged);
/// <summary>
/// Gets or sets the template used by the Content.
@@ -101,8 +104,11 @@ namespace Umbraco.Core.Models
}
set
{
_template = value;
OnPropertyChanged(TemplateSelector);
SetPropertyValueAndDetectChanges(o =>
{
_template = value;
return _template;
}, _template, TemplateSelector);
}
}
@@ -133,15 +139,21 @@ namespace Umbraco.Core.Models
/// <summary>
/// Boolean indicating whether this Content is Published or not
/// </summary>
/// <remarks>Setting Published to true/false should be private or internal</remarks>
/// <remarks>
/// Setting Published to true/false should be private or internal and should ONLY be used for wiring up the value
/// from the db or modifying it based on changing the published state.
/// </remarks>
[DataMember]
public bool Published
{
get { return _published; }
internal set
{
_published = value;
OnPropertyChanged(PublishedSelector);
SetPropertyValueAndDetectChanges(o =>
{
_published = value;
return _published;
}, _published, PublishedSelector);
}
}
@@ -157,8 +169,11 @@ namespace Umbraco.Core.Models
get { return _language; }
set
{
_language = value;
OnPropertyChanged(LanguageSelector);
SetPropertyValueAndDetectChanges(o =>
{
_language = value;
return _language;
}, _language, LanguageSelector);
}
}
@@ -171,8 +186,11 @@ namespace Umbraco.Core.Models
get { return _releaseDate; }
set
{
_releaseDate = value;
OnPropertyChanged(ReleaseDateSelector);
SetPropertyValueAndDetectChanges(o =>
{
_releaseDate = value;
return _releaseDate;
}, _releaseDate, ReleaseDateSelector);
}
}
@@ -185,8 +203,11 @@ namespace Umbraco.Core.Models
get { return _expireDate; }
set
{
_expireDate = value;
OnPropertyChanged(ExpireDateSelector);
SetPropertyValueAndDetectChanges(o =>
{
_expireDate = value;
return _expireDate;
}, _expireDate, ExpireDateSelector);
}
}
@@ -199,8 +220,11 @@ namespace Umbraco.Core.Models
get { return _writer; }
set
{
_writer = value;
OnPropertyChanged(WriterSelector);
SetPropertyValueAndDetectChanges(o =>
{
_writer = value;
return _writer;
}, _writer, WriterSelector);
}
}
@@ -215,8 +239,27 @@ namespace Umbraco.Core.Models
get { return _nodeName; }
set
{
_nodeName = value;
OnPropertyChanged(NodeNameSelector);
SetPropertyValueAndDetectChanges(o =>
{
_nodeName = value;
return _nodeName;
}, _nodeName, NodeNameSelector);
}
}
/// <summary>
/// Used internally to track if permissions have been changed during the saving process for this entity
/// </summary>
internal bool PermissionsChanged
{
get { return _permissionsChanged; }
set
{
SetPropertyValueAndDetectChanges(o =>
{
_permissionsChanged = value;
return _permissionsChanged;
}, _permissionsChanged, PermissionsChangedSelector);
}
}
@@ -332,11 +375,25 @@ namespace Umbraco.Core.Models
/// <returns>True if entity is dirty, otherwise False</returns>
public override bool IsDirty()
{
bool dirtyEntity = base.IsDirty();
return IsEntityDirty() || IsAnyUserPropertyDirty();
}
bool dirtyProperties = Properties.Any(x => x.IsDirty());
/// <summary>
/// Returns true if only the entity properties are direty
/// </summary>
/// <returns></returns>
internal bool IsEntityDirty()
{
return base.IsDirty();
}
return dirtyEntity || dirtyProperties;
/// <summary>
/// Returns true if any of the properties are dirty
/// </summary>
/// <returns></returns>
internal bool IsAnyUserPropertyDirty()
{
return Properties.Any(x => x.IsDirty());
}
/// <summary>
+68 -16
View File
@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Diagnostics;
using System.Globalization;
using System.Linq;
using System.Reflection;
@@ -13,6 +14,7 @@ namespace Umbraco.Core.Models
/// <summary>
/// Represents an abstract class for base Content properties and methods
/// </summary>
[DebuggerDisplay("Id: {Id}, Name: {Name}, ContentType: {ContentTypeBase.Alias}")]
public abstract class ContentBase : Entity, IContentBase
{
protected IContentTypeComposition ContentTypeBase;
@@ -25,6 +27,7 @@ namespace Umbraco.Core.Models
private bool _trashed;
private int _contentTypeId;
private PropertyCollection _properties;
private readonly List<Property> _lastInvalidProperties = new List<Property>();
/// <summary>
/// Protected constructor for ContentBase (Base for Content and Media)
@@ -118,8 +121,11 @@ namespace Umbraco.Core.Models
get { return _name; }
set
{
_name = value;
OnPropertyChanged(NameSelector);
SetPropertyValueAndDetectChanges(o =>
{
_name = value;
return _name;
}, _name, NameSelector);
}
}
@@ -132,8 +138,11 @@ namespace Umbraco.Core.Models
get { return _sortOrder; }
set
{
_sortOrder = value;
OnPropertyChanged(SortOrderSelector);
SetPropertyValueAndDetectChanges(o =>
{
_sortOrder = value;
return _sortOrder;
}, _sortOrder, SortOrderSelector);
}
}
@@ -146,8 +155,11 @@ namespace Umbraco.Core.Models
get { return _level; }
set
{
_level = value;
OnPropertyChanged(LevelSelector);
SetPropertyValueAndDetectChanges(o =>
{
_level = value;
return _level;
}, _level, LevelSelector);
}
}
@@ -160,8 +172,11 @@ namespace Umbraco.Core.Models
get { return _path; }
set
{
_path = value;
OnPropertyChanged(PathSelector);
SetPropertyValueAndDetectChanges(o =>
{
_path = value;
return _path;
}, _path, PathSelector);
}
}
@@ -174,8 +189,11 @@ namespace Umbraco.Core.Models
get { return _creatorId; }
set
{
_creatorId = value;
OnPropertyChanged(CreatorIdSelector);
SetPropertyValueAndDetectChanges(o =>
{
_creatorId = value;
return _creatorId;
}, _creatorId, CreatorIdSelector);
}
}
@@ -190,8 +208,11 @@ namespace Umbraco.Core.Models
get { return _trashed; }
internal set
{
_trashed = value;
OnPropertyChanged(TrashedSelector);
SetPropertyValueAndDetectChanges(o =>
{
_trashed = value;
return _trashed;
}, _trashed, TrashedSelector);
}
}
@@ -210,8 +231,11 @@ namespace Umbraco.Core.Models
get { return _contentTypeId; }
protected set
{
_contentTypeId = value;
OnPropertyChanged(DefaultContentTypeIdSelector);
SetPropertyValueAndDetectChanges(o =>
{
_contentTypeId = value;
return _contentTypeId;
}, _contentTypeId, DefaultContentTypeIdSelector);
}
}
@@ -269,7 +293,10 @@ namespace Umbraco.Core.Models
/// <returns><see cref="Property"/> Value as a <see cref="TPassType"/></returns>
public virtual TPassType GetValue<TPassType>(string propertyTypeAlias)
{
return (TPassType)Properties[propertyTypeAlias].Value;
if (Properties[propertyTypeAlias].Value is TPassType)
return (TPassType)Properties[propertyTypeAlias].Value;
return (TPassType)Convert.ChangeType(Properties[propertyTypeAlias].Value, typeof(TPassType));
}
/// <summary>
@@ -398,9 +425,34 @@ namespace Umbraco.Core.Models
/// <returns>True if content is valid otherwise false</returns>
public virtual bool IsValid()
{
return Properties.Any(property => !property.IsValid()) == false;
_lastInvalidProperties.Clear();
_lastInvalidProperties.AddRange(Properties.Where(property => property.IsValid() == false));
return _lastInvalidProperties.Any() == false;
}
/// <summary>
/// Returns a collection of the result of the last validation process, this collection contains all invalid properties.
/// </summary>
internal IEnumerable<Property> LastInvalidProperties
{
get { return _lastInvalidProperties; }
}
public abstract void ChangeTrashedState(bool isTrashed, int parentId = -20);
/// <summary>
/// We will override this method to ensure that when we reset the dirty properties that we
/// also reset the dirty changes made to the content's Properties (user defined)
/// </summary>
/// <param name="rememberPreviouslyChangedProperties"></param>
internal override void ResetDirtyProperties(bool rememberPreviouslyChangedProperties)
{
base.ResetDirtyProperties(rememberPreviouslyChangedProperties);
foreach (var prop in Properties)
{
prop.ResetDirtyProperties(rememberPreviouslyChangedProperties);
}
}
}
}
+257 -67
View File
@@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
@@ -11,14 +12,246 @@ using System.Xml.Linq;
using Umbraco.Core.Configuration;
using Umbraco.Core.IO;
using Umbraco.Core.Media;
using Umbraco.Core.Models.EntityBase;
using Umbraco.Core.Models.Membership;
using Umbraco.Core.Strings;
using Umbraco.Core.Persistence;
using Umbraco.Core.Persistence.UnitOfWork;
using Umbraco.Core.Services;
namespace Umbraco.Core.Models
{
public static class ContentExtensions
{
#region IContent
/// <summary>
/// Determines if a new version should be created
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
/// <remarks>
/// A new version needs to be created when:
/// * The publish status is changed
/// * The language is changed
/// * The item is already published and is being published again and any property value is changed (to enable a rollback)
/// </remarks>
internal static bool ShouldCreateNewVersion(this IContent entity)
{
var publishedState = ((Content)entity).PublishedState;
return ShouldCreateNewVersion(entity, publishedState);
}
/// <summary>
/// Determines if a new version should be created
/// </summary>
/// <param name="entity"></param>
/// <param name="publishedState"></param>
/// <returns></returns>
/// <remarks>
/// A new version needs to be created when:
/// * The publish status is changed
/// * The language is changed
/// * The item is already published and is being published again and any property value is changed (to enable a rollback)
/// </remarks>
internal static bool ShouldCreateNewVersion(this IContent entity, PublishedState publishedState)
{
var dirtyEntity = (ICanBeDirty)entity;
//check if the published state has changed or the language
var contentChanged =
(dirtyEntity.IsPropertyDirty("Published") && publishedState != PublishedState.Unpublished)
|| dirtyEntity.IsPropertyDirty("Language");
//return true if published or language has changed
if (contentChanged)
{
return true;
}
//check if any user prop has changed
var propertyValueChanged = ((Content) entity).IsAnyUserPropertyDirty();
//check if any content prop has changed
var contentDataChanged = ((Content) entity).IsEntityDirty();
//return true if the item is published and a property has changed or if any content property has changed
return (propertyValueChanged && publishedState == PublishedState.Published) || contentDataChanged;
}
/// <summary>
/// Determines if the published db flag should be set to true for the current entity version and all other db
/// versions should have their flag set to false.
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
/// <remarks>
/// This is determined by:
/// * If a new version is being created and the entity is published
/// * If the published state has changed and the entity is published OR the entity has been un-published.
/// </remarks>
internal static bool ShouldClearPublishedFlagForPreviousVersions(this IContent entity)
{
var publishedState = ((Content)entity).PublishedState;
return entity.ShouldClearPublishedFlagForPreviousVersions(publishedState, entity.ShouldCreateNewVersion(publishedState));
}
/// <summary>
/// Determines if the published db flag should be set to true for the current entity version and all other db
/// versions should have their flag set to false.
/// </summary>
/// <param name="entity"></param>
/// <param name="publishedState"></param>
/// <param name="isCreatingNewVersion"></param>
/// <returns></returns>
/// <remarks>
/// This is determined by:
/// * If a new version is being created and the entity is published
/// * If the published state has changed and the entity is published OR the entity has been un-published.
/// </remarks>
internal static bool ShouldClearPublishedFlagForPreviousVersions(this IContent entity, PublishedState publishedState, bool isCreatingNewVersion)
{
if (isCreatingNewVersion && entity.Published)
{
return true;
}
//If Published state has changed then previous versions should have their publish state reset.
//If state has been changed to unpublished the previous versions publish state should also be reset.
if (((ICanBeDirty)entity).IsPropertyDirty("Published") && (entity.Published || publishedState == PublishedState.Unpublished))
{
return true;
}
return false;
}
/// <summary>
/// Returns a list of the current contents ancestors, not including the content itself.
/// </summary>
/// <param name="content">Current content</param>
/// <returns>An enumerable list of <see cref="IContent"/> objects</returns>
public static IEnumerable<IContent> Ancestors(this IContent content)
{
return ApplicationContext.Current.Services.ContentService.GetAncestors(content);
}
/// <summary>
/// Returns a list of the current contents children.
/// </summary>
/// <param name="content">Current content</param>
/// <returns>An enumerable list of <see cref="IContent"/> objects</returns>
public static IEnumerable<IContent> Children(this IContent content)
{
return ApplicationContext.Current.Services.ContentService.GetChildren(content.Id);
}
/// <summary>
/// Returns a list of the current contents descendants, not including the content itself.
/// </summary>
/// <param name="content">Current content</param>
/// <returns>An enumerable list of <see cref="IContent"/> objects</returns>
public static IEnumerable<IContent> Descendants(this IContent content)
{
return ApplicationContext.Current.Services.ContentService.GetDescendants(content);
}
/// <summary>
/// Returns the parent of the current content.
/// </summary>
/// <param name="content">Current content</param>
/// <returns>An <see cref="IContent"/> object</returns>
public static IContent Parent(this IContent content)
{
return ApplicationContext.Current.Services.ContentService.GetById(content.ParentId);
}
#endregion
#region IMedia
/// <summary>
/// Returns a list of the current medias ancestors, not including the media itself.
/// </summary>
/// <param name="media">Current media</param>
/// <returns>An enumerable list of <see cref="IMedia"/> objects</returns>
public static IEnumerable<IMedia> Ancestors(this IMedia media)
{
return ApplicationContext.Current.Services.MediaService.GetAncestors(media);
}
/// <summary>
/// Returns a list of the current medias children.
/// </summary>
/// <param name="media">Current media</param>
/// <returns>An enumerable list of <see cref="IMedia"/> objects</returns>
public static IEnumerable<IMedia> Children(this IMedia media)
{
return ApplicationContext.Current.Services.MediaService.GetChildren(media.Id);
}
/// <summary>
/// Returns a list of the current medias descendants, not including the media itself.
/// </summary>
/// <param name="media">Current media</param>
/// <returns>An enumerable list of <see cref="IMedia"/> objects</returns>
public static IEnumerable<IMedia> Descendants(this IMedia media)
{
return ApplicationContext.Current.Services.MediaService.GetDescendants(media);
}
/// <summary>
/// Returns the parent of the current media.
/// </summary>
/// <param name="media">Current media</param>
/// <returns>An <see cref="IMedia"/> object</returns>
public static IMedia Parent(this IMedia media)
{
return ApplicationContext.Current.Services.MediaService.GetById(media.ParentId);
}
#endregion
/// <summary>
/// Checks if the IContentBase has children
/// </summary>
/// <param name="content"></param>
/// <param name="services"></param>
/// <returns></returns>
/// <remarks>
/// This is a bit of a hack because we need to type check!
/// </remarks>
internal static bool HasChildren(IContentBase content, ServiceContext services)
{
if (content is IContent)
{
return services.ContentService.HasChildren(content.Id);
}
if (content is IMedia)
{
return services.MediaService.HasChildren(content.Id);
}
return false;
}
/// <summary>
/// Returns the children for the content base item
/// </summary>
/// <param name="content"></param>
/// <param name="services"></param>
/// <returns></returns>
/// <remarks>
/// This is a bit of a hack because we need to type check!
/// </remarks>
internal static IEnumerable<IContentBase> Children(IContentBase content, ServiceContext services)
{
if (content is IContent)
{
return services.ContentService.GetChildren(content.Id);
}
if (content is IMedia)
{
return services.MediaService.GetChildren(content.Id);
}
return null;
}
/// <summary>
/// Set property values by alias with an annonymous object
/// </summary>
@@ -165,7 +398,7 @@ namespace Umbraco.Core.Models
var thumbUrl = Resize(fs, fileName, extension, 100, "thumb");
//Look up Prevalues for this upload datatype - if it is an upload datatype
var uploadFieldId = new Guid("5032a6e6-69e3-491d-bb28-cd31cd11086c");
var uploadFieldId = new Guid(Constants.PropertyEditors.UploadField);
if (property.PropertyType.DataTypeId == uploadFieldId)
{
//Get Prevalues by the DataType's Id: property.PropertyType.DataTypeId
@@ -337,8 +570,16 @@ namespace Umbraco.Core.Models
return new Tuple<int, int, string>(widthTh, heightTh, newFileName);
}
/// <summary>
/// Gets the <see cref="IProfile"/> for the Creator of this media item.
/// </summary>
public static IProfile GetCreatorProfile(this IMedia media)
{
return ApplicationContext.Current.Services.UserService.GetProfileById(media.CreatorId);
}
/// <summary>
/// Gets the <see cref="IProfile"/> for the Creator of this content/media item.
/// Gets the <see cref="IProfile"/> for the Creator of this content item.
/// </summary>
public static IProfile GetCreatorProfile(this IContentBase content)
{
@@ -366,6 +607,16 @@ namespace Umbraco.Core.Models
return ApplicationContext.Current.Services.ContentService.HasPublishedVersion(content.Id);
}
/// <summary>
/// Creates the full xml representation for the <see cref="IContent"/> object and all of it's descendants
/// </summary>
/// <param name="content"><see cref="IContent"/> to generate xml for</param>
/// <returns>Xml representation of the passed in <see cref="IContent"/></returns>
internal static XElement ToDeepXml(this IContent content)
{
return ApplicationContext.Current.Services.PackagingService.Export(content, true);
}
/// <summary>
/// Creates the xml representation for the <see cref="IContent"/> object
/// </summary>
@@ -373,21 +624,7 @@ namespace Umbraco.Core.Models
/// <returns>Xml representation of the passed in <see cref="IContent"/></returns>
public static XElement ToXml(this IContent content)
{
//nodeName should match Casing.SafeAliasWithForcingCheck(content.ContentType.Alias);
var nodeName = UmbracoSettings.UseLegacyXmlSchema ? "node" : content.ContentType.Alias.ToSafeAliasWithForcingCheck();
var x = content.ToXml(nodeName);
x.Add(new XAttribute("nodeType", content.ContentType.Id));
x.Add(new XAttribute("creatorName", content.GetCreatorProfile().Name));
x.Add(new XAttribute("writerName", content.GetWriterProfile().Name));
x.Add(new XAttribute("writerID", content.WriterId));
x.Add(new XAttribute("template", content.Template == null ? "0" : content.Template.Id.ToString()));
if (UmbracoSettings.UseLegacyXmlSchema)
{
x.Add(new XAttribute("nodeTypeAlias", content.ContentType.Alias));
}
return x;
return ApplicationContext.Current.Services.PackagingService.Export(content);
}
/// <summary>
@@ -397,59 +634,12 @@ namespace Umbraco.Core.Models
/// <returns>Xml representation of the passed in <see cref="IContent"/></returns>
public static XElement ToXml(this IMedia media)
{
//nodeName should match Casing.SafeAliasWithForcingCheck(content.ContentType.Alias);
var nodeName = UmbracoSettings.UseLegacyXmlSchema ? "node" : media.ContentType.Alias.ToSafeAliasWithForcingCheck();
var x = media.ToXml(nodeName);
x.Add(new XAttribute("nodeType", media.ContentType.Id));
x.Add(new XAttribute("writerName", media.GetCreatorProfile().Name));
x.Add(new XAttribute("writerID", media.CreatorId));
x.Add(new XAttribute("version", media.Version));
x.Add(new XAttribute("template", 0));
if (UmbracoSettings.UseLegacyXmlSchema)
{
x.Add(new XAttribute("nodeTypeAlias", media.ContentType.Alias));
}
return x;
return ApplicationContext.Current.Services.PackagingService.Export(media);
}
/// <summary>
/// Creates the xml representation for the <see cref="IContentBase"/> object
/// </summary>
/// <param name="contentBase"><see cref="IContent"/> to generate xml for</param>
/// <param name="nodeName"></param>
/// <returns>Xml representation of the passed in <see cref="IContent"/></returns>
private static XElement ToXml(this IContentBase contentBase, string nodeName)
internal static XElement ToDeepXml(this IMedia media)
{
var niceUrl = contentBase.Name.FormatUrl().ToLower();
var xml = new XElement(nodeName,
new XAttribute("id", contentBase.Id),
new XAttribute("parentID", contentBase.Level > 1 ? contentBase.ParentId : -1),
new XAttribute("level", contentBase.Level),
new XAttribute("creatorID", contentBase.CreatorId),
new XAttribute("sortOrder", contentBase.SortOrder),
new XAttribute("createDate", contentBase.CreateDate.ToString("s")),
new XAttribute("updateDate", contentBase.UpdateDate.ToString("s")),
new XAttribute("nodeName", contentBase.Name),
new XAttribute("urlName", niceUrl),//Format Url ?
new XAttribute("path", contentBase.Path),
new XAttribute("isDoc", ""));
foreach (var property in contentBase.Properties)
{
if (property == null) continue;
xml.Add(property.ToXml());
//Check for umbracoUrlName convention
if (property.Alias == "umbracoUrlName" && property.Value != null &&
property.Value.ToString().Trim() != string.Empty)
xml.SetAttributeValue("urlName", property.Value.ToString().FormatUrl().ToLower());
}
return xml;
return ApplicationContext.Current.Services.PackagingService.Export(media, true);
}
/// <summary>
+64 -6
View File
@@ -15,12 +15,22 @@ namespace Umbraco.Core.Models
{
private int _defaultTemplate;
private IEnumerable<ITemplate> _allowedTemplates;
/// <summary>
/// Constuctor for creating a ContentType with the parent's id.
/// </summary>
/// <remarks>You usually only want to use this for creating ContentTypes at the root.</remarks>
/// <param name="parentId"></param>
public ContentType(int parentId) : base(parentId)
{
_allowedTemplates = new List<ITemplate>();
}
/// <summary>
/// Constuctor for creating a ContentType with the parent as an inherited type.
/// </summary>
/// <remarks>Use this to ensure inheritance from parent.</remarks>
/// <param name="parent"></param>
public ContentType(IContentType parent) : base(parent)
{
_allowedTemplates = new List<ITemplate>();
@@ -47,8 +57,11 @@ namespace Umbraco.Core.Models
get { return _defaultTemplate; }
set
{
_defaultTemplate = value;
OnPropertyChanged(DefaultTemplateSelector);
SetPropertyValueAndDetectChanges(o =>
{
_defaultTemplate = value;
return _defaultTemplate;
}, _defaultTemplate, DefaultTemplateSelector);
}
}
@@ -61,8 +74,11 @@ namespace Umbraco.Core.Models
get { return _allowedTemplates; }
set
{
_allowedTemplates = value;
OnPropertyChanged(AllowedTemplatesSelector);
SetPropertyValueAndDetectChanges(o =>
{
_allowedTemplates = value;
return _allowedTemplates;
}, _allowedTemplates, AllowedTemplatesSelector);
}
}
@@ -145,14 +161,56 @@ namespace Umbraco.Core.Models
{
base.ResetDirtyProperties();
//loop through each property group to reset the property types
var propertiesReset = new List<int>();
foreach (var propertyGroup in PropertyGroups)
{
propertyGroup.ResetDirtyProperties();
foreach (var propertyType in propertyGroup.PropertyTypes)
{
{
propertyType.ResetDirtyProperties();
propertiesReset.Add(propertyType.Id);
}
}
//then loop through our property type collection since some might not exist on a property group
//but don't re-reset ones we've already done.
foreach (var propertyType in PropertyTypes.Where(x => propertiesReset.Contains(x.Id) == false))
{
propertyType.ResetDirtyProperties();
}
}
/// <summary>
/// Creates a clone of the current entity
/// </summary>
/// <returns></returns>
public IContentType Clone(string alias)
{
var clone = (ContentType)this.MemberwiseClone();
clone.Alias = alias;
clone.Key = Guid.Empty;
var propertyGroups = this.PropertyGroups.Select(x => x.Clone()).ToList();
clone.PropertyGroups = new PropertyGroupCollection(propertyGroups);
clone.PropertyTypes = this.PropertyTypeCollection.Select(x => x.Clone()).ToList();
clone.ResetIdentity();
clone.ResetDirtyProperties(false);
foreach (var propertyGroup in clone.PropertyGroups)
{
propertyGroup.ResetIdentity();
foreach (var propertyType in propertyGroup.PropertyTypes)
{
propertyType.ResetIdentity();
}
}
foreach (var propertyType in clone.PropertyTypes.Where(x => x.HasIdentity))
{
propertyType.ResetIdentity();
}
return clone;
}
/// <summary>
+117 -29
View File
@@ -22,8 +22,8 @@ namespace Umbraco.Core.Models
private string _alias;
private string _description;
private int _sortOrder;
private string _icon;
private string _thumbnail;
private string _icon = "folder.png";
private string _thumbnail = "folder.png";
private int _creatorId;
private bool _allowedAsRoot;
private bool _isContainer;
@@ -31,6 +31,8 @@ namespace Umbraco.Core.Models
private PropertyGroupCollection _propertyGroups;
private PropertyTypeCollection _propertyTypes;
private IEnumerable<ContentTypeSort> _allowedContentTypes;
private bool _hasPropertyTypeBeenRemoved;
protected ContentTypeBase(int parentId)
{
@@ -68,6 +70,8 @@ namespace Umbraco.Core.Models
private static readonly PropertyInfo AllowedContentTypesSelector = ExpressionHelper.GetPropertyInfo<ContentTypeBase, IEnumerable<ContentTypeSort>>(x => x.AllowedContentTypes);
private static readonly PropertyInfo PropertyGroupCollectionSelector = ExpressionHelper.GetPropertyInfo<ContentTypeBase, PropertyGroupCollection>(x => x.PropertyGroups);
private static readonly PropertyInfo PropertyTypeCollectionSelector = ExpressionHelper.GetPropertyInfo<ContentTypeBase, IEnumerable<PropertyType>>(x => x.PropertyTypes);
private static readonly PropertyInfo HasPropertyTypeBeenRemovedSelector = ExpressionHelper.GetPropertyInfo<ContentTypeBase, bool>(x => x.HasPropertyTypeBeenRemoved);
protected void PropertyGroupsChanged(object sender, NotifyCollectionChangedEventArgs e)
{
@@ -111,8 +115,11 @@ namespace Umbraco.Core.Models
get { return _name; }
set
{
_name = value;
OnPropertyChanged(NameSelector);
SetPropertyValueAndDetectChanges(o =>
{
_name = value;
return _name;
}, _name, NameSelector);
}
}
@@ -125,8 +132,11 @@ namespace Umbraco.Core.Models
get { return _level; }
set
{
_level = value;
OnPropertyChanged(LevelSelector);
SetPropertyValueAndDetectChanges(o =>
{
_level = value;
return _level;
}, _level, LevelSelector);
}
}
@@ -139,8 +149,11 @@ namespace Umbraco.Core.Models
get { return _path; }
set
{
_path = value;
OnPropertyChanged(PathSelector);
SetPropertyValueAndDetectChanges(o =>
{
_path = value;
return _path;
}, _path, PathSelector);
}
}
@@ -153,8 +166,11 @@ namespace Umbraco.Core.Models
get { return _alias; }
set
{
_alias = value.ToSafeAlias();
OnPropertyChanged(AliasSelector);
SetPropertyValueAndDetectChanges(o =>
{
_alias = value.ToSafeAlias();
return _alias;
}, _alias, AliasSelector);
}
}
@@ -167,8 +183,11 @@ namespace Umbraco.Core.Models
get { return _description; }
set
{
_description = value;
OnPropertyChanged(DescriptionSelector);
SetPropertyValueAndDetectChanges(o =>
{
_description = value;
return _description;
}, _description, DescriptionSelector);
}
}
@@ -181,8 +200,11 @@ namespace Umbraco.Core.Models
get { return _sortOrder; }
set
{
_sortOrder = value;
OnPropertyChanged(SortOrderSelector);
SetPropertyValueAndDetectChanges(o =>
{
_sortOrder = value;
return _sortOrder;
}, _sortOrder, SortOrderSelector);
}
}
@@ -195,8 +217,11 @@ namespace Umbraco.Core.Models
get { return _icon; }
set
{
_icon = value;
OnPropertyChanged(IconSelector);
SetPropertyValueAndDetectChanges(o =>
{
_icon = value;
return _icon;
}, _icon, IconSelector);
}
}
@@ -209,8 +234,11 @@ namespace Umbraco.Core.Models
get { return _thumbnail; }
set
{
_thumbnail = value;
OnPropertyChanged(ThumbnailSelector);
SetPropertyValueAndDetectChanges(o =>
{
_thumbnail = value;
return _thumbnail;
}, _thumbnail, ThumbnailSelector);
}
}
@@ -223,8 +251,11 @@ namespace Umbraco.Core.Models
get { return _creatorId; }
set
{
_creatorId = value;
OnPropertyChanged(CreatorIdSelector);
SetPropertyValueAndDetectChanges(o =>
{
_creatorId = value;
return _creatorId;
}, _creatorId, CreatorIdSelector);
}
}
@@ -237,8 +268,11 @@ namespace Umbraco.Core.Models
get { return _allowedAsRoot; }
set
{
_allowedAsRoot = value;
OnPropertyChanged(AllowedAsRootSelector);
SetPropertyValueAndDetectChanges(o =>
{
_allowedAsRoot = value;
return _allowedAsRoot;
}, _allowedAsRoot, AllowedAsRootSelector);
}
}
@@ -254,8 +288,11 @@ namespace Umbraco.Core.Models
get { return _isContainer; }
set
{
_isContainer = value;
OnPropertyChanged(IsContainerSelector);
SetPropertyValueAndDetectChanges(o =>
{
_isContainer = value;
return _isContainer;
}, _isContainer, IsContainerSelector);
}
}
@@ -269,8 +306,11 @@ namespace Umbraco.Core.Models
get { return _trashed; }
set
{
_trashed = value;
OnPropertyChanged(TrashedSelector);
SetPropertyValueAndDetectChanges(o =>
{
_trashed = value;
return _trashed;
}, _trashed, TrashedSelector);
}
}
@@ -283,8 +323,11 @@ namespace Umbraco.Core.Models
get { return _allowedContentTypes; }
set
{
_allowedContentTypes = value;
OnPropertyChanged(AllowedContentTypesSelector);
SetPropertyValueAndDetectChanges(o =>
{
_allowedContentTypes = value;
return _allowedContentTypes;
}, _allowedContentTypes, AllowedContentTypesSelector);
}
}
@@ -322,6 +365,24 @@ namespace Umbraco.Core.Models
}
}
/// <summary>
/// A boolean flag indicating if a property type has been removed from this instance.
/// </summary>
/// <remarks>
/// This is currently (specifically) used in order to know that we need to refresh the content cache which
/// needs to occur when a property has been removed from a content type
/// </remarks>
[IgnoreDataMember]
internal bool HasPropertyTypeBeenRemoved
{
get { return _hasPropertyTypeBeenRemoved; }
private set
{
_hasPropertyTypeBeenRemoved = value;
OnPropertyChanged(HasPropertyTypeBeenRemovedSelector);
}
}
/// <summary>
/// Checks whether a PropertyType with a given alias already exists
/// </summary>
@@ -396,6 +457,15 @@ namespace Umbraco.Core.Models
/// <param name="propertyTypeAlias">Alias of the <see cref="PropertyType"/> to remove</param>
public void RemovePropertyType(string propertyTypeAlias)
{
//check if the property exist in one of our collections
if (PropertyGroups.Any(group => group.PropertyTypes.Any(pt => pt.Alias == propertyTypeAlias))
|| _propertyTypes.Any(x => x.Alias == propertyTypeAlias))
{
//set the flag that a property has been removed
HasPropertyTypeBeenRemoved = true;
}
foreach (var propertyGroup in PropertyGroups)
{
propertyGroup.PropertyTypes.RemoveItem(propertyTypeAlias);
@@ -403,10 +473,19 @@ namespace Umbraco.Core.Models
if (_propertyTypes.Any(x => x.Alias == propertyTypeAlias))
{
_propertyTypes.RemoveItem(propertyTypeAlias);
_propertyTypes.RemoveItem(propertyTypeAlias);
}
}
/// <summary>
/// Removes a PropertyGroup from the current ContentType
/// </summary>
/// <param name="propertyGroupName">Name of the <see cref="PropertyGroup"/> to remove</param>
public void RemovePropertyGroup(string propertyGroupName)
{
PropertyGroups.RemoveItem(propertyGroupName);
}
/// <summary>
/// Sets the ParentId from the lazy integer id
/// </summary>
@@ -415,5 +494,14 @@ namespace Umbraco.Core.Models
{
_parentId = id;
}
/// <summary>
/// PropertyTypes that are not part of a PropertyGroup
/// </summary>
[IgnoreDataMember]
internal PropertyTypeCollection PropertyTypeCollection
{
get { return _propertyTypes; }
}
}
}
@@ -20,8 +20,10 @@ namespace Umbraco.Core.Models
{
}
protected ContentTypeCompositionBase(IContentTypeBase parent) : base(parent)
protected ContentTypeCompositionBase(IContentTypeComposition parent)
: base(parent)
{
AddContentType(parent);
}
private static readonly PropertyInfo ContentTypeCompositionSelector =
@@ -73,7 +75,7 @@ namespace Umbraco.Core.Models
if (contentType.ContentTypeComposition.Any(x => x.CompositionAliases().Any(ContentTypeCompositionExists)))
return false;
if (!ContentTypeCompositionExists(contentType.Alias))
if (ContentTypeCompositionExists(contentType.Alias) == false)
{
_contentTypeComposition.Add(contentType);
OnPropertyChanged(ContentTypeCompositionSelector);
@@ -0,0 +1,44 @@
using System.Collections.Generic;
using System.Linq;
using Umbraco.Core.Services;
namespace Umbraco.Core.Models
{
internal static class ContentTypeExtensions
{
/// <summary>
/// Get all descendant content types
/// </summary>
/// <param name="contentType"></param>
/// <returns></returns>
public static IEnumerable<IContentTypeBase> Descendants(this IContentTypeBase contentType)
{
var contentTypeService = ApplicationContext.Current.Services.ContentTypeService;
var descendants = contentTypeService.GetContentTypeChildren(contentType.Id)
.FlattenList(type => contentTypeService.GetContentTypeChildren(type.Id));
return descendants;
}
/// <summary>
/// Get all descendant and self content types
/// </summary>
/// <param name="contentType"></param>
/// <returns></returns>
public static IEnumerable<IContentTypeBase> DescendantsAndSelf(this IContentTypeBase contentType)
{
var descendantsAndSelf = new[] { contentType }.Concat(contentType.Descendants());
return descendantsAndSelf;
}
///// <summary>
///// Returns the descendant content type Ids for the given content type
///// </summary>
///// <param name="contentType"></param>
///// <returns></returns>
//public static IEnumerable<int> DescendantIds(this IContentTypeBase contentType)
//{
// return ((ContentTypeService) ApplicationContext.Current.Services.ContentTypeService)
// .GetDescendantContentTypeIds(contentType.Id);
//}
}
}
+48 -20
View File
@@ -2,6 +2,7 @@
using System.Reflection;
using System.Runtime.Serialization;
using Umbraco.Core.Models.EntityBase;
using Umbraco.Core.Persistence.Mappers;
namespace Umbraco.Core.Models
{
@@ -52,8 +53,11 @@ namespace Umbraco.Core.Models
get { return _parentId; }
set
{
_parentId = value;
OnPropertyChanged(ParentIdSelector);
SetPropertyValueAndDetectChanges(o =>
{
_parentId = value;
return _parentId;
}, _parentId, ParentIdSelector);
}
}
@@ -66,8 +70,11 @@ namespace Umbraco.Core.Models
get { return _name; }
set
{
_name = value;
OnPropertyChanged(NameSelector);
SetPropertyValueAndDetectChanges(o =>
{
_name = value;
return _name;
}, _name, NameSelector);
}
}
@@ -80,8 +87,11 @@ namespace Umbraco.Core.Models
get { return _sortOrder; }
set
{
_sortOrder = value;
OnPropertyChanged(SortOrderSelector);
SetPropertyValueAndDetectChanges(o =>
{
_sortOrder = value;
return _sortOrder;
}, _sortOrder, SortOrderSelector);
}
}
@@ -94,8 +104,11 @@ namespace Umbraco.Core.Models
get { return _level; }
set
{
_level = value;
OnPropertyChanged(LevelSelector);
SetPropertyValueAndDetectChanges(o =>
{
_level = value;
return _level;
}, _level, LevelSelector);
}
}
@@ -108,8 +121,11 @@ namespace Umbraco.Core.Models
get { return _path; }
set
{
_path = value;
OnPropertyChanged(PathSelector);
SetPropertyValueAndDetectChanges(o =>
{
_path = value;
return _path;
}, _path, PathSelector);
}
}
@@ -122,8 +138,11 @@ namespace Umbraco.Core.Models
get { return _creatorId; }
set
{
_creatorId = value;
OnPropertyChanged(UserIdSelector);
SetPropertyValueAndDetectChanges(o =>
{
_creatorId = value;
return _creatorId;
}, _creatorId, UserIdSelector);
}
}
@@ -136,8 +155,11 @@ namespace Umbraco.Core.Models
get { return _trashed; }
internal set
{
_trashed = value;
OnPropertyChanged(TrashedSelector);
SetPropertyValueAndDetectChanges(o =>
{
_trashed = value;
return _trashed;
}, _trashed, TrashedSelector);
}
}
@@ -149,9 +171,12 @@ namespace Umbraco.Core.Models
{
get { return _controlId; }
private set
{
_controlId = value;
OnPropertyChanged(ControlIdSelector);
{
SetPropertyValueAndDetectChanges(o =>
{
_controlId = value;
return _controlId;
}, _controlId, ControlIdSelector);
}
}
@@ -163,9 +188,12 @@ namespace Umbraco.Core.Models
{
get { return _databaseType; }
set
{
_databaseType = value;
OnPropertyChanged(DatabaseTypeSelector);
{
SetPropertyValueAndDetectChanges(o =>
{
_databaseType = value;
return _databaseType;
}, _databaseType, DatabaseTypeSelector);
}
}
+16 -6
View File
@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Reflection;
using System.Runtime.Serialization;
using Umbraco.Core.Models.EntityBase;
using Umbraco.Core.Persistence.Mappers;
namespace Umbraco.Core.Models
{
@@ -41,8 +42,11 @@ namespace Umbraco.Core.Models
get { return _parentId; }
set
{
_parentId = value;
OnPropertyChanged(ParentIdSelector);
SetPropertyValueAndDetectChanges(o =>
{
_parentId = value;
return _parentId;
}, _parentId, ParentIdSelector);
}
}
@@ -55,8 +59,11 @@ namespace Umbraco.Core.Models
get { return _itemKey; }
set
{
_itemKey = value;
OnPropertyChanged(ItemKeySelector);
SetPropertyValueAndDetectChanges(o =>
{
_itemKey = value;
return _itemKey;
}, _itemKey, ItemKeySelector);
}
}
@@ -69,8 +76,11 @@ namespace Umbraco.Core.Models
get { return _translations; }
set
{
_translations = value;
OnPropertyChanged(TranslationsSelector);
SetPropertyValueAndDetectChanges(o =>
{
_translations = value;
return _translations;
}, _translations, TranslationsSelector);
}
}
@@ -2,6 +2,7 @@
using System.Reflection;
using System.Runtime.Serialization;
using Umbraco.Core.Models.EntityBase;
using Umbraco.Core.Persistence.Mappers;
namespace Umbraco.Core.Models
{
@@ -40,8 +41,11 @@ namespace Umbraco.Core.Models
get { return _language; }
set
{
_language = value;
OnPropertyChanged(LanguageSelector);
SetPropertyValueAndDetectChanges(o =>
{
_language = value;
return _language;
}, _language, LanguageSelector);
}
}
@@ -54,8 +58,11 @@ namespace Umbraco.Core.Models
get { return _value; }
set
{
_value = value;
OnPropertyChanged(ValueSelector);
SetPropertyValueAndDetectChanges(o =>
{
_value = value;
return _value;
}, _value, ValueSelector);
}
}
}
+71 -68
View File
@@ -1,7 +1,5 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.Serialization;
@@ -12,12 +10,24 @@ namespace Umbraco.Core.Models.EntityBase
/// </summary>
[Serializable]
[DataContract(IsReference = true)]
public abstract class Entity : IEntity, ICanBeDirty
[DebuggerDisplay("Id: {Id}")]
public abstract class Entity : TracksChangesEntityBase, IEntity, IRememberBeingDirty, ICanBeDirty
{
private bool _hasIdentity;
private int? _hash;
private int _id;
private Guid _key;
private DateTime _createDate;
private DateTime _updateDate;
private bool _wasCancelled;
private static readonly PropertyInfo IdSelector = ExpressionHelper.GetPropertyInfo<Entity, int>(x => x.Id);
private static readonly PropertyInfo KeySelector = ExpressionHelper.GetPropertyInfo<Entity, Guid>(x => x.Key);
private static readonly PropertyInfo CreateDateSelector = ExpressionHelper.GetPropertyInfo<Entity, DateTime>(x => x.CreateDate);
private static readonly PropertyInfo UpdateDateSelector = ExpressionHelper.GetPropertyInfo<Entity, DateTime>(x => x.UpdateDate);
private static readonly PropertyInfo HasIdentitySelector = ExpressionHelper.GetPropertyInfo<Entity, bool>(x => x.HasIdentity);
private static readonly PropertyInfo WasCancelledSelector = ExpressionHelper.GetPropertyInfo<Entity, bool>(x => x.WasCancelled);
/// <summary>
/// Integer Id
@@ -31,8 +41,12 @@ namespace Umbraco.Core.Models.EntityBase
}
set
{
_id = value;
HasIdentity = true;
SetPropertyValueAndDetectChanges(o =>
{
_id = value;
HasIdentity = true; //set the has Identity
return _id;
}, _id, IdSelector);
}
}
@@ -51,46 +65,67 @@ namespace Umbraco.Core.Models.EntityBase
return _key;
}
set { _key = value; }
set
{
SetPropertyValueAndDetectChanges(o =>
{
_key = value;
return _key;
}, _key, KeySelector);
}
}
/// <summary>
/// Gets or sets the Created Date
/// </summary>
[DataMember]
public DateTime CreateDate { get; set; }
public DateTime CreateDate
{
get { return _createDate; }
set
{
SetPropertyValueAndDetectChanges(o =>
{
_createDate = value;
return _createDate;
}, _createDate, CreateDateSelector);
}
}
/// <summary>
/// Gets or sets the Modified Date
/// </summary>
[DataMember]
public DateTime UpdateDate { get; set; }
/// <summary>
/// Gets or sets the WasCancelled flag, which is used to track
/// /// Gets or sets the WasCancelled flag, which is used to track
/// whether some action against an entity was cancelled through some event.
/// This only exists so we have a way to check if an event was cancelled through
/// the new api, which also needs to take effect in the legacy api.
/// </summary>
[IgnoreDataMember]
internal bool WasCancelled { get; set; }
/// <summary>
/// Property changed event
/// </summary>
public event PropertyChangedEventHandler PropertyChanged;
/// <summary>
/// Method to call on a property setter.
/// </summary>
/// <param name="propertyInfo">The property info.</param>
protected virtual void OnPropertyChanged(PropertyInfo propertyInfo)
internal bool WasCancelled
{
_propertyChangedInfo[propertyInfo.Name] = true;
if (PropertyChanged != null)
get { return _wasCancelled; }
set
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyInfo.Name));
SetPropertyValueAndDetectChanges(o =>
{
_wasCancelled = value;
return _wasCancelled;
}, _wasCancelled, WasCancelledSelector);
}
}
/// <summary>
/// Gets or sets the Modified Date
/// </summary>
[DataMember]
public DateTime UpdateDate
{
get { return _updateDate; }
set
{
SetPropertyValueAndDetectChanges(o =>
{
_updateDate = value;
return _updateDate;
}, _updateDate, UpdateDateSelector);
}
}
@@ -117,42 +152,6 @@ namespace Umbraco.Core.Models.EntityBase
UpdateDate = DateTime.Now;
}
/// <summary>
/// Tracks the properties that have changed
/// </summary>
private readonly IDictionary<string, bool> _propertyChangedInfo = new Dictionary<string, bool>();
/// <summary>
/// Indicates whether a specific property on the current entity is dirty.
/// </summary>
/// <param name="propertyName">Name of the property to check</param>
/// <returns>True if Property is dirty, otherwise False</returns>
public virtual bool IsPropertyDirty(string propertyName)
{
return _propertyChangedInfo.Any(x => x.Key == propertyName);
}
/// <summary>
/// Indicates whether the current entity is dirty.
/// </summary>
/// <returns>True if entity is dirty, otherwise False</returns>
public virtual bool IsDirty()
{
return _propertyChangedInfo.Any();
}
/// <summary>
/// Resets dirty properties by clearing the dictionary used to track changes.
/// </summary>
/// <remarks>
/// Please note that resetting the dirty properties could potentially
/// obstruct the saving of a new or updated entity.
/// </remarks>
public virtual void ResetDirtyProperties()
{
_propertyChangedInfo.Clear();
}
/// <summary>
/// Indicates whether the current entity has an identity, eg. Id.
/// </summary>
@@ -164,7 +163,11 @@ namespace Umbraco.Core.Models.EntityBase
}
protected set
{
_hasIdentity = value;
SetPropertyValueAndDetectChanges(o =>
{
_hasIdentity = value;
return _hasIdentity;
}, _hasIdentity, HasIdentitySelector);
}
}
@@ -0,0 +1,13 @@
namespace Umbraco.Core.Models.EntityBase
{
/// <summary>
/// An interface that defines if the object is tracking property changes and that is is also
/// remembering what property changes had been made after the changes were committed.
/// </summary>
public interface IRememberBeingDirty : ICanBeDirty
{
bool WasDirty();
bool WasPropertyDirty(string propertyName);
void ForgetPreviouslyDirtyProperties();
}
}
@@ -0,0 +1,147 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Reflection;
namespace Umbraco.Core.Models.EntityBase
{
/// <summary>
/// A base class for use to implement IRememberBeingDirty/ICanBeDirty
/// </summary>
public abstract class TracksChangesEntityBase : IRememberBeingDirty
{
/// <summary>
/// Tracks the properties that have changed
/// </summary>
private readonly IDictionary<string, bool> _propertyChangedInfo = new Dictionary<string, bool>();
/// <summary>
/// Tracks the properties that we're changed before the last commit (or last call to ResetDirtyProperties)
/// </summary>
private IDictionary<string, bool> _lastPropertyChangedInfo = null;
/// <summary>
/// Property changed event
/// </summary>
public event PropertyChangedEventHandler PropertyChanged;
/// <summary>
/// Method to call on a property setter.
/// </summary>
/// <param name="propertyInfo">The property info.</param>
protected virtual void OnPropertyChanged(PropertyInfo propertyInfo)
{
_propertyChangedInfo[propertyInfo.Name] = true;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyInfo.Name));
}
}
/// <summary>
/// Indicates whether a specific property on the current entity is dirty.
/// </summary>
/// <param name="propertyName">Name of the property to check</param>
/// <returns>True if Property is dirty, otherwise False</returns>
public virtual bool IsPropertyDirty(string propertyName)
{
return _propertyChangedInfo.Any(x => x.Key == propertyName);
}
/// <summary>
/// Indicates whether the current entity is dirty.
/// </summary>
/// <returns>True if entity is dirty, otherwise False</returns>
public virtual bool IsDirty()
{
return _propertyChangedInfo.Any();
}
/// <summary>
/// Indicates that the entity had been changed and the changes were committed
/// </summary>
/// <returns></returns>
public bool WasDirty()
{
return _lastPropertyChangedInfo != null && _lastPropertyChangedInfo.Any();
}
/// <summary>
/// Indicates whether a specific property on the current entity was changed and the changes were committed
/// </summary>
/// <param name="propertyName">Name of the property to check</param>
/// <returns>True if Property was changed, otherwise False. Returns false if the entity had not been previously changed.</returns>
public virtual bool WasPropertyDirty(string propertyName)
{
return WasDirty() && _lastPropertyChangedInfo.Any(x => x.Key == propertyName);
}
/// <summary>
/// Resets the remembered dirty properties from before the last commit
/// </summary>
public void ForgetPreviouslyDirtyProperties()
{
_lastPropertyChangedInfo.Clear();
}
/// <summary>
/// Resets dirty properties by clearing the dictionary used to track changes.
/// </summary>
/// <remarks>
/// Please note that resetting the dirty properties could potentially
/// obstruct the saving of a new or updated entity.
/// </remarks>
public virtual void ResetDirtyProperties()
{
ResetDirtyProperties(true);
}
/// <summary>
/// Resets dirty properties by clearing the dictionary used to track changes.
/// </summary>
/// <param name="rememberPreviouslyChangedProperties">
/// true if we are to remember the last changes made after resetting
/// </param>
/// <remarks>
/// Please note that resetting the dirty properties could potentially
/// obstruct the saving of a new or updated entity.
/// </remarks>
internal virtual void ResetDirtyProperties(bool rememberPreviouslyChangedProperties)
{
if (rememberPreviouslyChangedProperties)
{
//copy the changed properties to the last changed properties
_lastPropertyChangedInfo = _propertyChangedInfo.ToDictionary(v => v.Key, v => v.Value);
}
_propertyChangedInfo.Clear();
}
/// <summary>
/// Used by inheritors to set the value of properties, this will detect if the property value actually changed and if it did
/// it will ensure that the property has a dirty flag set.
/// </summary>
/// <param name="setValue"></param>
/// <param name="value"></param>
/// <param name="propertySelector"></param>
/// <returns>returns true if the value changed</returns>
/// <remarks>
/// This is required because we don't want a property to show up as "dirty" if the value is the same. For example, when we
/// save a document type, nearly all properties are flagged as dirty just because we've 'reset' them, but they are all set
/// to the same value, so it's really not dirty.
/// </remarks>
internal bool SetPropertyValueAndDetectChanges<T>(Func<T, T> setValue, T value, PropertyInfo propertySelector)
{
var initVal = value;
var newVal = setValue(value);
if (!Equals(initVal, newVal))
{
OnPropertyChanged(propertySelector);
return true;
}
return false;
}
}
}
+32 -3
View File
@@ -1,5 +1,6 @@
using System;
using System.IO;
using System.Reflection;
using System.Runtime.Serialization;
using Umbraco.Core.Models.EntityBase;
@@ -12,11 +13,17 @@ namespace Umbraco.Core.Models
[DataContract(IsReference = true)]
public abstract class File : Entity, IFile
{
private string _path;
private string _content = string.Empty; //initialize to empty string, not null
protected File(string path)
{
Path = path;
_path = path;
}
private static readonly PropertyInfo ContentSelector = ExpressionHelper.GetPropertyInfo<File, string>(x => x.Content);
private static readonly PropertyInfo PathSelector = ExpressionHelper.GetPropertyInfo<File, string>(x => x.Path);
/// <summary>
/// Gets or sets the Name of the File including extension
/// </summary>
@@ -48,13 +55,35 @@ namespace Umbraco.Core.Models
/// Gets or sets the Path to the File from the root of the site
/// </summary>
[DataMember]
public virtual string Path { get; set; }
public virtual string Path
{
get { return _path; }
set
{
SetPropertyValueAndDetectChanges(o =>
{
_path = value;
return _path;
}, _path, PathSelector);
}
}
/// <summary>
/// Gets or sets the Content of a File
/// </summary>
[DataMember]
public virtual string Content { get; set; }
public virtual string Content
{
get { return _content; }
set
{
SetPropertyValueAndDetectChanges(o =>
{
_content = value;
return _content;
}, _content, ContentSelector);
}
}
/// <summary>
/// Boolean indicating whether the file could be validated
+3 -1
View File
@@ -1,10 +1,12 @@
using System;
using System.Diagnostics;
using Umbraco.Core.Persistence.Mappers;
namespace Umbraco.Core.Models
{
/// <summary>
/// Defines a Content object
/// </summary>
/// </summary>
public interface IContent : IContentBase
{
/// <summary>

Some files were not shown because too many files have changed in this diff Show More