From 57a5da25516213a5983e9a08a04564de44120653 Mon Sep 17 00:00:00 2001 From: Dave Ward Date: Wed, 27 Feb 2013 11:56:13 +0000 Subject: [PATCH] =?UTF-8?q?Merged=20V4.1-BUG-FIX=20to=20HEAD=20=20=20=2044?= =?UTF-8?q?918:=20Fix=20for=20ALF-14850=20Opencmis=20getTotalNumItems=20do?= =?UTF-8?q?esn't=20return=20the=20correct=20result=20when=20setting=20MaxI?= =?UTF-8?q?temsPerPage=20=20=20=20-=20correctly=20report=20the=20max=20num?= =?UTF-8?q?ber=20of=20items=20=20=20=2044927:=20ALF-16254=20("Leave=20Site?= =?UTF-8?q?"=20behaviour=20for=20group=20based=20site=20membership)=20=20?= =?UTF-8?q?=20=2044931:=20Merged=20V3.4-BUG-FIX=20to=20V4.1-BUG-FIX=20(REC?= =?UTF-8?q?ORD=20ONLY)=20=20=20=20=20=20=2044930:=20Merged=20V3.4=20(3.4.1?= =?UTF-8?q?2)=20to=20V3.4-BUG-FIX=20=20=20=20=20=20=20=20=20=2044929:=20Me?= =?UTF-8?q?rged=20V4.1-BUG-FIX=20to=20V3.4=20(3.4.12)=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=2042118:=20ALF-15878=20ALF-15741:=20generate=20?= =?UTF-8?q?doc=20and=20src=20zip=20for=20web-framework-commons=20and=20jla?= =?UTF-8?q?n=20=20=20=2044939:=20Remove=20svn:mergeinfo=20=20=20=2044985:?= =?UTF-8?q?=20Merged=20DEV=20to=20V4.1-BUG-FIX=20=20=20=20=20=20=2044981:?= =?UTF-8?q?=20ALF-17085=20:=20DB2:=20unexpected=20index=20found=20in=20dat?= =?UTF-8?q?abase=20=20=20=20=20=20=20=20=20=20Correcting=20db=20structure?= =?UTF-8?q?=20after=20upgrade=20from=203.4.=20Optional=20statement=20was?= =?UTF-8?q?=20added.=20=20=20=2044988:=20Merged=20DEV=20to=20V4.1-BUG-FIX?= =?UTF-8?q?=20=20=20=20=20=20=2044937:=20ALF-16756:=20WebDAV:=20An=20error?= =?UTF-8?q?=20occurs=20on=20drag&drop=20content=20from=20local=20machine?= =?UTF-8?q?=20to=20alfresco=20when=20inbound=20move=20rule=20configured.?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20Add=20check=20for=20content=20dat?= =?UTF-8?q?a=20length=20during=20determining=20existence=20of=20content=20?= =?UTF-8?q?on=20node.=20=20=20=2044989:=20Merged=20PATCHES/V4.1.3=20to=20V?= =?UTF-8?q?4.1-BUG-FIX=20=20=20=20=20=20=2044984:=20Merged=20DEV=20to=20PA?= =?UTF-8?q?TCHES/V4.1.3=20=20=20=20=20=20=20=20=20=2044983:=20ALF-12425:?= =?UTF-8?q?=20Can't=20launch=20activiti=20workflow=20console=20from=20Shar?= =?UTF-8?q?e=20when=20external=20/=20ntlm=20/=20kerberos=20authentication?= =?UTF-8?q?=20is=20used.=20=20=20=20=20=20=20=20=20=20In=20activiti-admin.?= =?UTF-8?q?get.js=20generated=20an=20absolute=20URL=20.=20Use=20=20url.ser?= =?UTF-8?q?ver=20+=20url.context=20=20instead=20of=20/alfresco.=20=20=20?= =?UTF-8?q?=20=20=20=2044986:=20(RECORD=20ONLY)=20Merged=20DEV=20to=20PATC?= =?UTF-8?q?HES/V4.1.3=20=20=20=20=20=20=20=20=20=2044937:=20ALF-16756:=20W?= =?UTF-8?q?ebDAV:=20An=20error=20occurs=20on=20drag&drop=20content=20from?= =?UTF-8?q?=20local=20machine=20to=20alfresco=20when=20inbound=20move=20ru?= =?UTF-8?q?le=20configured.=20=20=20=20=20=20=20=20=20=20Add=20check=20for?= =?UTF-8?q?=20content=20data=20length=20during=20determining=20existence?= =?UTF-8?q?=20of=20content=20on=20node.=20=20=20=20=20=20=2044987:=20ALF-1?= =?UTF-8?q?7331=2060k=20Site=20Performance:=20Admin=20Console=20|=20Groups?= =?UTF-8?q?=20|=20Browse=20Groups=20(include=20sys=20groups):=20Pagination?= =?UTF-8?q?=20doesn't=20work=20correctly=20=20=20=2045008:=20ALF-17300=20-?= =?UTF-8?q?=20ConcurrentModificationException=20=20=20=2045011:=20BDE-103?= =?UTF-8?q?=20-=20Timezone=20test=20fail=20when=20not=20run=20from=20the?= =?UTF-8?q?=20UK=20(at=20least=20from=20Maven=20build)=20=20=20=2045054:?= =?UTF-8?q?=20Merged=20from=20DEV=20to=20V4.1-BUG-FIX=20=20=20=20=20=20ALF?= =?UTF-8?q?-13312=20-=20If=20the=20license=20does=20not=20exist,=20please?= =?UTF-8?q?=20specify=20in=20the=20error=20message=20=20=20=2045055:=20Fix?= =?UTF-8?q?=20for=20ALF-13921.=20Description=20of=20the=20web=20project=20?= =?UTF-8?q?is=20not=20updated.=20=20=20=2045063:=20Slight=20improvement=20?= =?UTF-8?q?to=20test=20code=20as=20part=20of=20ALF-15413.=20=20=20=20=20?= =?UTF-8?q?=20Changing=20test=20code=20to=20get=20companyHome=20from=20rep?= =?UTF-8?q?ositoryHelper=20rather=20than=20Lucene=20query,=20which=20doesn?= =?UTF-8?q?'t=20work=20on=20a=20dev=20box=20with=20ill-configured=20SOLR/L?= =?UTF-8?q?ucene.=20=20=20=2045170:=20Merged=20PATCHES\V4.1.3=20to=20BRANC?= =?UTF-8?q?HES\DEV\V4.1-BUG-FIX=20=20=20=20=20=20=20=2045161:=20Fix=20for?= =?UTF-8?q?=20=20=20=20=20ALF-17341=20=20CLONE=20-=20Hyphen=20not=20handle?= =?UTF-8?q?d=20correctly=20in=20cmis-alfresco=20search=20for=20Aspects/typ?= =?UTF-8?q?es=20:=20"=20no=20viable=20alternative=20at=20character=20'a'?= =?UTF-8?q?=20"=20=20=20=2045192:=20Merged=20BRANCHES/DEV/V3.4-BUG-FIX=20t?= =?UTF-8?q?o=20BRANCHES/DEV/V4.1-BUG-FIX:=20=20=20=20=20=20=2045187:=20(RE?= =?UTF-8?q?CORD=20ONLY)=20Fix=20for=20ALF-16997=20Discrepancies=20between?= =?UTF-8?q?=20standalone=20and=20cluster=20ehcache=20config=20=20=20=20453?= =?UTF-8?q?12:=20Merged=20V4.0.2=20(4.0.2.23-24)=20to=20V4.1-BUG-FIX=20(4.?= =?UTF-8?q?1.4)=20=20=20=20=20=20=2044912:=20MNT-248=20-=204.0.2.22=20HOT?= =?UTF-8?q?=20FIX:=20Extra=20version=20is=20created=20saving=20changes=20i?= =?UTF-8?q?n=20OpenOffice=20document=20via=20CIFS=20=20=20=20=20=20=204496?= =?UTF-8?q?4:=20Merged=20DEV=20to=20PATCHES/V4.0.2=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=2044963:=20MNT-263=20:=20CLONE=20-=20CIFS:=20Image=20docume?= =?UTF-8?q?nt=20version=20history=20lost=20after=20saving=20content=20in?= =?UTF-8?q?=20Preview=20on=20Mac=20Mountain=20Lion=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20Fix=20for=20"Preview"=20shuffle=20scenario=20on=20Mac=20M?= =?UTF-8?q?ountain=20Lion.=20New=20ScenarioDoubleRenameShuffle=20scenario?= =?UTF-8?q?=20was=20added=20for=20pattern=20.*\.sb(-[A-Za-z0-9]*){2}.=20Un?= =?UTF-8?q?it=20test=20for=20correspomding=20scenario=20was=20added.=20=20?= =?UTF-8?q?=20=20=20=20=2045037:=20Remove=20PID=20check=20from=20byte=20ra?= =?UTF-8?q?nge=20lock=20list=20checks.=20MNT-266.=20=20=20=20=20=20=204528?= =?UTF-8?q?6:=20MNT-277=20-=20CIFS:=20Input/output=20error=20during=20savi?= =?UTF-8?q?ng=20ods=20file=20via=20OpenOffice.=20(Linux=20Specific)=20=20?= =?UTF-8?q?=20=2045319:=20NORWEGIAN:=20Translation=20updates.=20=20=20=204?= =?UTF-8?q?5338:=20Merged=20V4.1.3=20(4.1.3)=20to=20V4.1-BUG-FIX=20(4.1.4)?= =?UTF-8?q?=20=20=20=20=20=20=2045186:=20ALF-17303:=20fix=20naming=20misma?= =?UTF-8?q?tch=20when=20deploying=20alfresco-enterprise-repository=20artif?= =?UTF-8?q?actId=20to=20Maven=20=20=20=20=20=20=2045247:=20Part=202:=20Bet?= =?UTF-8?q?ter=20fix=20for=20=20=20=20=20ALF-16359=20Fix=20SOLR=20logging?= =?UTF-8?q?=20in=20production=20and=20other=20environments=20=20=20=20=20?= =?UTF-8?q?=20=2045265:=20ALF-17337=20Read=20time=20out=20when=20browsing?= =?UTF-8?q?=20trash=20can=20=20=20=20=20=20=2045298:=20ALF-17389:=20Merged?= =?UTF-8?q?:=20CLOUD1=20to=20V4.1.3=20=20=20=20=20=20=20=20=20=2045082:=20?= =?UTF-8?q?CLOUD-1139:=20Cloud=20feednotifier=20running=20on=202=20boxes?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20-=20FeedNotifierImpl=20modified?= =?UTF-8?q?=20to=20use=20reliable=20lock=20refresh=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20-=20Added=20additional=20debug=20logging=20to=20AbstractU?= =?UTF-8?q?serNotifier=20just=20in=20case=20we=20have=20to=20prove=20dupli?= =?UTF-8?q?cate=20entries=20are=20still=20being=20processed=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20-=20For=20full=20debug=20logging=20set=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20log4j.logger.org.alfresco.repo.ac?= =?UTF-8?q?tivities.feed.FeedNotifier=3Ddebug=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20-=20Happy=20New=20Year!=20=20=20=2045355:=20ALF-17389:=20Fix?= =?UTF-8?q?=20build=20error=20=20=20=2045357:=20Fix=20for=20=20=20=20=20AL?= =?UTF-8?q?F-17430=20=20CMIS=20valid=20relationships=20do=20not=20check=20?= =?UTF-8?q?the=20source=20and=20target=20are=20valid=20CMIS=20docs=20or=20?= =?UTF-8?q?folders.=20=20=20=2045363:=20Merge=20CLOUD1-BUG-FIX=20to=20V4.1?= =?UTF-8?q?-BUG-FIX=20=20=20=20=20=2042576=20:=20Job=20Locking=20of=20Post?= =?UTF-8?q?Lookup=20=20=20=2045367:=20Build=20fix=20corrections=20to=20mer?= =?UTF-8?q?ge=2045363=20=20=20=2045381:=20ALF-17389=20:=20Implementing=20A?= =?UTF-8?q?ctivities=20Job=20Lock.=20=20=20=2045416:=20Merged=20V4.1.3=20(?= =?UTF-8?q?4.1.3)=20to=20V4.1-BUG-FIX=20(4.1.4)=20RECORD=20ONLY=20=20=20?= =?UTF-8?q?=20=20=20=2045415:=20ALF-17389:=20Merged=20V4.1-BUG-FIX=20to=20?= =?UTF-8?q?V4.1.3=20(4.1.3)=20=20=20=20=20=20=20=20=20=20<<=20Previous=20m?= =?UTF-8?q?erge=20was=20to=20the=20wrong=20branch=20>>=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=2045363:=20Merge=20CLOUD1-BUG-FIX=20to=20V4.1-BUG-FIX?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=2042576=20:=20Job=20Locking?= =?UTF-8?q?=20of=20PostLookup=20=20=20=20=20=20=20=20=20=2045367:=20Build?= =?UTF-8?q?=20fix=20corrections=20to=20merge=2045363=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=2045381:=20ALF-17389=20:=20Implementing=20Activities=20J?= =?UTF-8?q?ob=20Lock.=20=20=20=2045424:=20Merged=20BRANCHES/DEV/BELARUS/V4?= =?UTF-8?q?.1-BUG-FIX-2013=5F01=5F05=20to=20BRANCHES/DEV/V4.1-BUG-FIX:=20?= =?UTF-8?q?=20=20=20=20=20=2045235:=20ALF-15604=20:=20Oracle:=20schema=20r?= =?UTF-8?q?eference=20files=20missing=20nvarchar2=20column=20sizes=20=20?= =?UTF-8?q?=20=2045425:=20Merged=20BRANCHES/DEV/BELARUS/V4.1-BUG-FIX-2013?= =?UTF-8?q?=5F01=5F05=20to=20BRANCHES/DEV/V4.1-BUG-FIX:=20=20=20=20=20=20?= =?UTF-8?q?=2045236:=20ALF-15604=20:=20Oracle:=20schema=20reference=20file?= =?UTF-8?q?s=20missing=20nvarchar2=20column=20sizes=20=20=20=2045480:=20AL?= =?UTF-8?q?F-17224:=20There=20will=20not=20be=20a=20"pageList"=20object=20?= =?UTF-8?q?in=20the=20freemarker=20model=20if=20a=20wiki=20page=20does=20n?= =?UTF-8?q?ot=20exist=20in=20a=20site=20and=20the=20wiki=20dashlet=20will?= =?UTF-8?q?=20cause=20an=20error=20on=20the=20site=20=20=20=2045482:=20Fix?= =?UTF-8?q?ed=20ALF-11036,=20applied=20the=20patch,=20ran=20the=20tests.?= =?UTF-8?q?=20=20=20=2045485:=20ALF-17224:=20If=20the=20wiki=20page=20whic?= =?UTF-8?q?h=20was=20configured=20in=20the=20wiki=20dashlet=20will=20be=20?= =?UTF-8?q?deleted=20the=20dashlet=20will=20cause=20an=20error.=20The=20re?= =?UTF-8?q?sult=20of=20the=20call=20must=20be=20checked.=20=20=20=2045513:?= =?UTF-8?q?=20MNT-279:=20Use=20binary=20search=20in=20cached=20authority?= =?UTF-8?q?=20search=20to=20cut=20down=20search=20time=20when=20a=20group?= =?UTF-8?q?=20contains=20an=20astronomical=20number=20of=20authorities=20?= =?UTF-8?q?=20=20=20-=20Experimental=20fix=20to=20cut=20down=20on=20severe?= =?UTF-8?q?=20profiling=20hit=20=20=20=2045542:=20Fix=20for=20ALF-17443=20?= =?UTF-8?q?-=20Contributors=20cannot=20edit=20their=20own=20discussion=20r?= =?UTF-8?q?eply=20=20=20=20--This=20line,=20and=20th=20se=20below,=20will?= =?UTF-8?q?=20be=20ignored--=20=20=20=20M=20=20=20=20root/projects/remote-?= =?UTF-8?q?api/source/java/org/alfresco/repo/web/scripts/discussion/ForumP?= =?UTF-8?q?ostPut.java=20=20=20=20M=20=20=20=20root/projects/remote-api/so?= =?UTF-8?q?urce/java/org/alfresco/repo/web/scripts/discussion/DiscussionRe?= =?UTF-8?q?stApiTest.java=20=20=20=2045550:=20Merged=20V3.4-BUG-FIX=20to?= =?UTF-8?q?=20V4.1-BUG-FIX=20=20=20=20=20=20=2044920:=20ALF-11315=20remove?= =?UTF-8?q?d=20date=20localisation=20on=20blogpost.lib.ftl=20dates=20and?= =?UTF-8?q?=20corrected=20date=20format=20on=20pubDate=20within=20postlist?= =?UTF-8?q?-rss.get.rss.ftl=20(iso8601=20was=20being=20used=20instead=20of?= =?UTF-8?q?=20the=20required=20RFC822)=20=20=20=20=20=20=2044936:=20Fix=20?= =?UTF-8?q?build=20=20=20=20=20=20=2044967:=20Merged=20V3.4=20to=20V3.4-BU?= =?UTF-8?q?G-FIX=20=20=20=20=20=20=20=20=20=2044966:=20Merged=20PATCHES/V3?= =?UTF-8?q?.4.11=20to=20V3.4=20(3.4.12)=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=2044891:=20ALF-17339:=20Merged=20DEV=20to=20V3.4.11=20(3.4.?= =?UTF-8?q?11.2)=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=2044877:=20M?= =?UTF-8?q?NT-265:=20possible=20improvement=20to=20Alfresco=20SQL=20query?= =?UTF-8?q?=3F=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20-=20=20=20Ad?= =?UTF-8?q?d=20getOneTxnsByCommitTimeDescending=20function=20that=20makes?= =?UTF-8?q?=20efficient=20query=20to=20find=20most=20recent=20transaction?= =?UTF-8?q?=20in=20time=20range.=20=20=20=20=20=20=20=20=20=20=20=20=20449?= =?UTF-8?q?51:=20ALF-17325=20/=20MNT-274:=20Merged=20HEAD=20to=20PATCHES/V?= =?UTF-8?q?3.4.11=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=2033015:=20?= =?UTF-8?q?ALF-11837=20-=20Alfresco=204.0=20SMTP=20Inbound=20does=20not=20?= =?UTF-8?q?work=20with=20messages=20without=20From=20and=20To=20Headers.?= =?UTF-8?q?=20=20=20=20=20=20=2045191:=20Merged=20BRANCHES/V3.4=20to=20BRA?= =?UTF-8?q?NCHES/DEV/V3.4-BUG-FIX:=20=20=20=20=20=20=20=20=20=2045172:=20F?= =?UTF-8?q?ixed=20ALF-16140:=20Blank=20filetype=20icon=20is=20displayed=20?= =?UTF-8?q?for=20tiff=20image=20=20=20=20=20=20=2045436:=20Merged=20HEAD?= =?UTF-8?q?=20to=20BRANCHES/DEV/V3.4-BUG-FIX:=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=2031107:=20Google=20Docs=20SSL=20error=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20*=20Fixed=20SSL=20required=20error=20that=20h?= =?UTF-8?q?as=20appeared=20recently.=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20*=20Google=20seemingly=20no=20longer=20supports=20non=20s?= =?UTF-8?q?ecure=20access=20to=20GDoc=20API.=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20*=20Default=20URL's=20fixed=20up.=20=20=20=20=20=20?= =?UTF-8?q?=2045547:=20Merged=20V3.4=20to=20V3.4-BUG-FIX=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=2045166:=20ALF-17339:=20Merged=20V3.4.11=20(3.4.11.4)?= =?UTF-8?q?=20to=20V3.4=20(3.4.12)=20=20=20=20=20=20=20=20=20=20=20=20=204?= =?UTF-8?q?5162:=20Merged=20DEV=20to=20V3.4.11=20(3.4.11.4)=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=2044877:=20MNT-275=20Possible=20?= =?UTF-8?q?issue=20with=20MNT-265=20fix=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20-=20SQL=20from=20original=20HF=20should?= =?UTF-8?q?=20have=20used=20<=20rather=20than=20<=3D=20for=20upper=20time?= =?UTF-8?q?=20limit.=20=20=20=20=20=20=20=20=20=2045230:=20Merged=20DEV=20?= =?UTF-8?q?to=20V3.4=20(3.4.12)=20=20=20=20=20=20=20=20=20=20=20=20=204520?= =?UTF-8?q?3:=20ALF-16992=20:=20patch.fixAclInheritance=20is=20failing=20o?= =?UTF-8?q?n=20sharedAclsThatDoNotInheritCorrectlyFromThePrimaryParent=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20Ignoring=20of=20repeated=20?= =?UTF-8?q?ACL=20added=20=20=20=20=20=20=20=20=20=2045233:=20Mark=20the=20?= =?UTF-8?q?NFS=20server=20as=20active=20during=20startup.=20ALF-16228.=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=2045287:=20ALF-12145=20Calendar=20auto?= =?UTF-8?q?complete=20for=20advanced=20search=20form=20incorrectly=20handl?= =?UTF-8?q?es=20zeros=20=20=20=20=20=20=20=20=20=2045380:=20ALF-17461:=20T?= =?UTF-8?q?here=20is=20different=20size=20of=20wcm-bootstrap-context.xml?= =?UTF-8?q?=20file=20from=20installer=20and=20archive=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20-=20Replicated=20changes=20from=20ALF-11644=20to=20Bit?= =?UTF-8?q?rock-installed=20copy=20of=20wcm-bootstrap-context.xml=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=2045454:=20ALF-17396,=20ALF-13805:=20Merged?= =?UTF-8?q?=20V4.1-BUG-FIX=20(4.1.4)=20to=20V3.4=20(3.4.12)=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20Revision:=2045452=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20Author:=20kroast=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20Date:=2016=20January=202013=2009:59:45=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20Message:=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20Corrected=20config=20check=20for=20ALF-16413=20-=20?= =?UTF-8?q?Share=20asks=20for=20Basic-Auth=20while=20not=20needed=20trying?= =?UTF-8?q?=20to=20access=20RSS=20feeds=20(thus=20breaking=20SSO).=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20----=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20Modified=20:=20/alfresco/BRANCHES/DEV/V4.1-BUG-F?= =?UTF-8?q?IX/root/projects/slingshot/source/java/org/alfresco/web/site/se?= =?UTF-8?q?rvlet/SlingshotFeedController.java=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=2045491:=20Merge=20DEV=20to=20V3.4=20(V3.4.12)=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=2045473:=20ALF-11956:=20WCM=20accessibili?= =?UTF-8?q?ty=20=20=20=20=20=20=20=20=20=20=20=20=20DOJO=20time=20picker?= =?UTF-8?q?=20has=20been=20fixed=20to=20allow=20selection=20of=20hours=20a?= =?UTF-8?q?nd=20minutes,=20using=20keyboard.=20Missing=20JavaScript=20key?= =?UTF-8?q?=20event=20handlers=20have=20been=20added.=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20CSS=20class=20checking=20has=20been=20fixed?= =?UTF-8?q?=20in=20'alfresco.xforms.FocusResolver'=20in=20'xforms.js'=20to?= =?UTF-8?q?=20support=20all=20versions=20of=20IE.=20Some=20other=20minor?= =?UTF-8?q?=20changes...=20=20=20=20=20=20=20=20=20=2045543:=20Merged=20V4?= =?UTF-8?q?.1=20to=20V3.4=20=20=20=20=20=20=20=20=20=20=20=20=2044743:=20A?= =?UTF-8?q?LF-17533=20/=20ALF-17117:=20Created=20article=20or=20publicatio?= =?UTF-8?q?n=20cant=20be=20viewed=20on=20WQS=20site=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20-=20Further=20corrections=20to=20locking=20to?= =?UTF-8?q?=20avoid=20deadlocks=20=20=20=20=20=20=20=20=20=20=20=20=204468?= =?UTF-8?q?2:=20ALF-17512=20/=20ALF-17118=20WQS:=20Impossible=20to=20uploa?= =?UTF-8?q?d=20document=20to=20publications=20space=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20-=20Only=20first=20part=20to=20do=20?= =?UTF-8?q?with=20the=20transformation=20failure=20has=20been=20committed.?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=2044653:=20ALF-17533=20/?= =?UTF-8?q?=20ALF-17117:=20Created=20article=20or=20publication=20cant=20b?= =?UTF-8?q?e=20viewed=20on=20WQS=20site=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20-=20Missed=20file=20from=20previous=20checkin=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=2044652:=20ALF-17533/=20ALF-17117:=20C?= =?UTF-8?q?reated=20article=20or=20publication=20cant=20be=20viewed=20on?= =?UTF-8?q?=20WQS=20site=20=20=20=20=20=20=20=20=20=20=20=20=20-=20Fixes?= =?UTF-8?q?=20by=20Dmitry=20Vaserin=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?-=20Removed=20unnecessary=20outer=20read=20locks=20from=20getRe?= =?UTF-8?q?latedAssets=20and=20getRelatedAsset=20to=20prevent=20deadlock?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20-=20Correct=20markup=20e?= =?UTF-8?q?rror=20when=20node=20doesn't=20have=20tags=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=2045546:=20ALF-17512:=20Corrections=20to=20property=20na?= =?UTF-8?q?mes=20by=20Pavel=20=20=20=20=20=20=2045548:=20Merged=20V3.4=20t?= =?UTF-8?q?o=20V3.4-BUG-FIX=20(RECORD=20ONLY)=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=2044977:=20Merged=20V3.4-BUG-FIX=20to=20V3.4=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=2044936:=20Fix=20build=20=20=20=2045553:=20M?= =?UTF-8?q?erged=20V3.4-BUG-FIX=20to=20V4.1-BUG-FIX=20(RECORD=20ONLY)=20?= =?UTF-8?q?=20=20=20=20=20=2045523:=20Merged=20BRANCHES/DEV/V4.1-BUG-FIX?= =?UTF-8?q?=20to=20BRANCHES/DEV/V3.4-BUG-FIX:=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=2045482:=20Fixed=20ALF-11036,=20applied=20the=20patch,=20ran?= =?UTF-8?q?=20the=20tests.=20=20=20=2045557:=20Merged=20V3.4-BUG-FIX=20to?= =?UTF-8?q?=20V4.1-BUG-FIX=20(RECORD=20ONLY)=20=20=20=20=20=20=2045556:=20?= =?UTF-8?q?Merged=20V3.4=20to=20V3.4-BUG-FIX=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?45554:=20Latest=20translations=20from=20Gloria=20for=20revision?= =?UTF-8?q?=2045205=20=20=20=2045568:=20Merged=20PATCHES/V4.1.3=20to=20V4.?= =?UTF-8?q?1-BUG-FIX=20=20=20=20=20=20=2045421:=20Merged=20HEAD=20to=20PAT?= =?UTF-8?q?CHES\V4.1.3=20=20=20=20=20=20=20=20=20=20=2044243:=20Merged=20B?= =?UTF-8?q?RANCHES\DEV\AUTH=5FBRIDGE=20to=20HEAD=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=2043735:=20Final=20part=20of=20ALF-14861=20?= =?UTF-8?q?=09=20=20SOLR=20to=20scale=20for=20non-admin=20users=20in=20100?= =?UTF-8?q?k=20sites=20and=20a=20subgroup=20of=20each=20of=201000=20indepe?= =?UTF-8?q?ndent=20groupings=20with=201000=20subgroups=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20ALF-17489=20=20?= =?UTF-8?q?ALF-17456=20=20=20=20=20=20=2045428:=20ALF-17455=20:=20BM-0013:?= =?UTF-8?q?=20SOAK01=5F04:=20Activities=20Feed=20Cleaner=20query=20runs=20?= =?UTF-8?q?for=20minutes=20=20=20=20=20=20=2045489:=20ALF-17455=20:=20BM-0?= =?UTF-8?q?013:=20SOAK01=5F04:=20Activities=20Feed=20Cleaner=20query=20run?= =?UTF-8?q?s=20for=20minutes=20=20=20=2045569:=20Merged=20PATCHES/V4.1.3?= =?UTF-8?q?=20to=20V4.1-BUG-FIX=20(RECORD=20ONLY)=20=20=20=20=20=20=204556?= =?UTF-8?q?4:=20ALF-17492:=20WebScript=20errors=20must=20contain=20useful?= =?UTF-8?q?=20information=20=20=20=20=20=20=20-=20So=20doth=20Derek=20decr?= =?UTF-8?q?ee=20=20=20=20=20=20=20-=20Copied=20in=20Surf=20revision=201217?= =?UTF-8?q?=20changes=20as=20class=20local=20to=20share.war=20to=20avoid?= =?UTF-8?q?=20pulling=20in=20any=20more=20untested=20Surf=20changes=20=20?= =?UTF-8?q?=20=2045591:=20ALF-17465=20(Document=20"social=20buttons/action?= =?UTF-8?q?s"=20not=20showing=20in=20document=20library=20page=20while=20d?= =?UTF-8?q?ocument=20is=20being=20edited=20(locked))=20=20=20=2045601:=20A?= =?UTF-8?q?LF-17433=20(Document=20detail=20version=20display=20incorrect?= =?UTF-8?q?=20document=20version=20when=20clicking=20on=20edit=20off=20lin?= =?UTF-8?q?e)=20=20=20=2045611:=20ALF-17478=20-=20MailMetadataExtracter=20?= =?UTF-8?q?does=20not=20store=20all=20Message-Recipient-Address=20=20=20?= =?UTF-8?q?=2045622:=20Merged=20HEAD=20to=20BRANCHES/DEV/V4.1-BUG-FIX:=20?= =?UTF-8?q?=20=20=20=20=20=2035614:=20ALF-17598:=20CLONE=20-=20Add=20range?= =?UTF-8?q?=20header=20support=20to=20the=20webDAV=20servlet=20=20=20=2045?= =?UTF-8?q?633:=20ALF-17469:=20JSON=20message=20sent=20back=20to=20a=20cli?= =?UTF-8?q?ent=20after=20a=20category=20creation=20is=20only=20partially?= =?UTF-8?q?=20JSON=20=20=20=20--This=20line,=20and=20th=20se=20below,=20wi?= =?UTF-8?q?ll=20be=20ignored--=20=20=20=20M=20=20=20=20category.post.json.?= =?UTF-8?q?ftl=20=20=20=2045641:=20Fix=20non-ASCII=20character=20in=20sour?= =?UTF-8?q?ce=20comment=20=20=20=2045649:=20ALF-17556=20(Share=20not=20red?= =?UTF-8?q?ering=20URL=20correctly=20in=20description=20field)=20=20=20=20?= =?UTF-8?q?45650:=20Manually=20merged=20HEAD=20to=20BRANCHES/DEV/V4.1-BUG-?= =?UTF-8?q?FIX:=20=20=20=20=20=20=20-=20Changes=20to=20StreamContent=20fro?= =?UTF-8?q?m=20merge=20of=20THOR1=5FSPRINTS=20to=20HEAD=20in=20r34698=20?= =?UTF-8?q?=20=20=2045651:=20Merged=20HEAD=20to=20BRANCHES/DEV/V4.1-BUG-FI?= =?UTF-8?q?X:=20=20=20=20=20=20=2045222:=20ALF-17599:=20CLONE=20-=20Suppor?= =?UTF-8?q?t=20For=20HTTP=20Range=20Requests=20in=20Repository=20WebScript?= =?UTF-8?q?s=20=20=20=20=20=20=20=20=20=20=20=20-=20Added=20HttpRangeProce?= =?UTF-8?q?ssor.processRange=20which=20takes=20a=20WebScriptResponse=20par?= =?UTF-8?q?ameter=20instead=20of=20HttpServletResponse=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20-=20Changed=20HttpRangeProcessor.processSinge?= =?UTF-8?q?Range=20and=20HttpRangeProcessor.processMultiRange=20to=20accep?= =?UTF-8?q?t=20a=20generic=20Object=20parameter=20then=20cast=20to=20the?= =?UTF-8?q?=20appropriate=20WebScriptResponse=20or=20HttpServletResponse?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20-=20Added=20Javadoc=20to=20?= =?UTF-8?q?HttpRangeProcessor.processRange=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20-=20Changed=20StreamContent.streamContentImpl=20to=20add?= =?UTF-8?q?=20code=20from=20BaseDownloadContentServlet=20which=20does=20th?= =?UTF-8?q?e=20work=20of=20processing=20the=20range=20header=20from=20the?= =?UTF-8?q?=20request=20=20=20=20=20=20=20=20=20=20=20=20-=20Changed=20Str?= =?UTF-8?q?eamContent.streamContentImpl=20method=20signature=20to=20accept?= =?UTF-8?q?=20nodeRef=20and=20propertyQName=20parameters=20needed=20for=20?= =?UTF-8?q?multi-range=20requests=20=20=20=20=20=20=20=20=20=20=20=20-=20M?= =?UTF-8?q?odified=20methods=20which=20override=20or=20call=20StreamConten?= =?UTF-8?q?t.streamContentImpl=20for=20new=20method=20signature,=20passing?= =?UTF-8?q?=20in=20nodeRef=20and=20propertyQName=20or=20nulls=20where=20ap?= =?UTF-8?q?propriate=20=20=20=2045655:=20Merged=20DEV=20to=20V4.1-BUG-FIX?= =?UTF-8?q?=20(4.1.4)=20=20=20=20=20=20=2045565:=20ALF-17503=20:=20Lucene?= =?UTF-8?q?=20search=20with=20skipcount=20>=20hits=20fails=20when=20RM=20i?= =?UTF-8?q?s=20installed=20=20=20=20=20=20=20Return=20a=20length=3D0=20if?= =?UTF-8?q?=20a=20difference=20of=20values=20(count=20of=20finded=20result?= =?UTF-8?q?s=20and=20results,=20that=20need=20to=20skip)=20is=20<=200=20?= =?UTF-8?q?=20=20=2045672:=20ALF-17452=20(Status=20can't=20be=20updated=20?= =?UTF-8?q?with=20a=20blank=20status)=20=20=20=2045682:=20ALF-17444:=20Tra?= =?UTF-8?q?nsformation=20of=20Outlook=20files=20(.msg)=20doesn't=20work=20?= =?UTF-8?q?ootb=20=20=20=2045751:=20Merged=20DEV=20to=20VC4.1-BUG-FIX=20(4?= =?UTF-8?q?.1.4)=20=20=20=20=20=20=2045748:=20ALF-17517:=20Document=20does?= =?UTF-8?q?=20not=20revert=20to=20previous=20version=20if=20certain=20rule?= =?UTF-8?q?=20is=20applied=20to=20the=20parent=20folder.=20=20=20=20=20=20?= =?UTF-8?q?=20Check=20node=20existance=20on=20ActionExecuterAbstractBase?= =?UTF-8?q?=20execution.=20Add=20unit=20test=20for=20case=20when=20inbound?= =?UTF-8?q?=20rule=20executed=20on=20node=20that=20was=20checked=20in.=20?= =?UTF-8?q?=20=20=2045758:=20ALF-12264:=20Fixed=20issue=20with=20pooled-ta?= =?UTF-8?q?sks=20for=20groups=20with=20same=20name=20across=20tenants=20?= =?UTF-8?q?=20=20=2045761:=20Block=20r45756=20from=20being=20merged=20to?= =?UTF-8?q?=20V4.1-BUG-FIX=20=20=20=2045765:=20Fix=20for=20=20=20=20=20ALF?= =?UTF-8?q?-17153=20=20=20=20FTS=20query=20parser=20FTSQueryParser=20is=20?= =?UTF-8?q?not=20debuggable=20=20=20=2045810:=20ALF-17520:=20Open=20Docume?= =?UTF-8?q?nt=20templates=20are=20not=20tranformed=20properly=20for=20thum?= =?UTF-8?q?bnail=20and=20preview=20generation=20=20=20=2045828:=20Addition?= =?UTF-8?q?al=20fix=20for=20=20=20=20=20ALF-17153=20=20FTS=20query=20parse?= =?UTF-8?q?r=20FTSQueryParser=20is=20not=20debuggable=20=20=20=2045857:=20?= =?UTF-8?q?ALF-17516=20(SHARE:=20Admin=20console=20of=20users=20and=20grou?= =?UTF-8?q?ps)=20=20=20=2045873:=20Remove=20so-called=20intermittent=20tes?= =?UTF-8?q?t=20category,=20so=20that=20only=20RepositoryStartupTest=20rema?= =?UTF-8?q?ins=20as=20a=20gatekeeper=20=20=20=2045903:=20ALF-16611=20(When?= =?UTF-8?q?=20opening=20My=20Pages=20filter,=20a=20link=20to=20the=20renam?= =?UTF-8?q?ed=20document=20becomes=20red)=20=20=20=2045906:=20ALF-17515:?= =?UTF-8?q?=20Wrong=20mimetype=20name=20in=20mimetype-map.xml=20=20=20=20?= =?UTF-8?q?=20=20=20-=20Changed=20macroEnabled=20to=20macroenabled=20=20?= =?UTF-8?q?=20=2045913:=20ALF-17462=20(In=20Alfresco=20explorer=20invitati?= =?UTF-8?q?on=20to=20a=20site=20does=20not=20show=20the=20correct=20option?= =?UTF-8?q?s)=20=20=20=2045921:=20Fix=20for=20=20=20=20=20ALF-17421=20=20I?= =?UTF-8?q?f=20a=20property=20is=20both=20multi-valued=20and=20multilingua?= =?UTF-8?q?l=20a=20ClassCastException=20is=20thrown=20when=20Solr=20tries?= =?UTF-8?q?=20to=20index=20the=20property=20=20=20=20-=20support=20multi-v?= =?UTF-8?q?alued=20ML=20text=20but=20not=20content=20=20=20=2045926:=20Fix?= =?UTF-8?q?=20for=20=20=20=20=20ALF-17602=20=20=20=20lucene.defaultAnalyse?= =?UTF-8?q?rResourceBundleName=20is=20not=20injected=20anywhere=20in=20the?= =?UTF-8?q?=20spring=20config=20=20=20=2046024:=20Merged=20V4.1.3=20(4.1.3?= =?UTF-8?q?)=20to=20V4.1-BUG-FIX=20(4.1.4)=20=20=20=20=20=20=2045585:=20AL?= =?UTF-8?q?F-17303:=20alfresco-platform-distribution=20was=20not=20deploye?= =?UTF-8?q?d=20properly=20to=20Maven=20repo=20=20=20=20=20=20=2045621:=20R?= =?UTF-8?q?emoved=20svn:mergeinfo.=20=20A=201.7=20client=20should=20do=20t?= =?UTF-8?q?his=20automatically.=20=20=20=20=20=20=2045669:=20Fix=20ALF-175?= =?UTF-8?q?82=20-=20BM-0013:=20JMeter:=20Run=2002:=20MT=20ContentStore=20c?= =?UTF-8?q?aching=20is=20not=20thread=20safe=20=20=20=20=20=20=2045670:=20?= =?UTF-8?q?Fix=20ALF-17589=20-=20BM-0013:=20JMeter:=20Run=2002:=20CMISAbst?= =?UTF-8?q?ractDictionaryService=20caching=20of=20DictionaryRegistry=20is?= =?UTF-8?q?=20not=20thread=20safe=20=20=20=20=20=20=2045692:=20Config=20op?= =?UTF-8?q?tion=20for=20=20=20=20=20ALF-17526=20=20BM-0013:=20JMeter:=20Ru?= =?UTF-8?q?n=2002:=20Improve=20efficiency=20of=20services=20for=20SOLRAPIC?= =?UTF-8?q?lient.getNodesMetaData=20=20=20=20=20=20=20-=20preloading=20can?= =?UTF-8?q?=20be=20controlled=20+=20removed=20incorrect=20use=20of=20the?= =?UTF-8?q?=20secondary=20cache=20that=20could=20pull=20in=20stale=20data?= =?UTF-8?q?=20=20=20=20=20=20=2045705:=20Reverted=20Config=20option=20for?= =?UTF-8?q?=20=20=20=20=20ALF-17526=20=20BM-0013:=20JMeter:=20Run=2002:=20?= =?UTF-8?q?Improve=20efficiency=20of=20services=20for=20SOLRAPIClient.getN?= =?UTF-8?q?odesMetaData=20=20=20=20=20=20=20-=20preloading=20can=20be=20co?= =?UTF-8?q?ntrolled=20+=20removed=20incorrect=20use=20of=20the=20secondary?= =?UTF-8?q?=20cache=20that=20could=20pull=20in=20stale=20data=20=20=20=20?= =?UTF-8?q?=20=20=2045716:=20Fix=20for=20ALF-17594=20=09SolrTracker:=20CMI?= =?UTF-8?q?S=20model=20diff=20(show=201=20repeated=20diff)=20=3D>=20CMIS?= =?UTF-8?q?=20dictionary=20re-init=20x2=20(every=2015=20sec)=20=20=20=20?= =?UTF-8?q?=20=20=20-=20only=20refresh=20the=20CMIS=20dictionary=20if=20th?= =?UTF-8?q?ere=20was=20an=20actual=20model=20put=20=20=20=20=20=20=2045755?= =?UTF-8?q?:=20Extra=20support=20to=20make=20clear=20what=20causes=20any?= =?UTF-8?q?=20difference=20between=20SOLR=20reports=20ALF-17588=20=09BM-00?= =?UTF-8?q?13:=20JMeter:=20Run=2002:=20Deviation=20was=20detected=20in=20f?= =?UTF-8?q?ull=20index=20check=20reports=20for=20SOLR=20nodes.=20=20=20=20?= =?UTF-8?q?=20=20=20-=20also=20added=20RETRY=20command=20to=20retry=20inde?= =?UTF-8?q?xing=20any=20nodes=20that=20failed=20with=20errors.=20=20=20=20?= =?UTF-8?q?=20=20=2045803:=20Fix=20for=20=20=20=20=20ALF-17490=20Solr=20in?= =?UTF-8?q?dexation=20problem=20with=20certain=20acls=20on=20a=20customer?= =?UTF-8?q?=20environment=20=20=20=20=20=20=20-=20AclsGet=20respects=20the?= =?UTF-8?q?=20maximum=20acls=20requested=20and=20does=20not=20silently=20t?= =?UTF-8?q?runcate=20toe=201024=20=20=20=20=20=20=2045829:=20GERMAN:=20Tra?= =?UTF-8?q?nslation=20updates=20based=20on=20EN=20r45262=20=20=20=20=20=20?= =?UTF-8?q?=2045830:=20SPANISH:=20Translation=20updates=20based=20on=20EN?= =?UTF-8?q?=20r45262=20=20=20=20=20=20=2045831:=20FRENCH:=20Translation=20?= =?UTF-8?q?updates=20based=20on=20EN=20r45262=20=20=20=20=20=20=2045832:?= =?UTF-8?q?=20ITALIAN:=20Translation=20updates=20based=20on=20EN=20r45262?= =?UTF-8?q?=20=20=20=20=20=20=2045833:=20JAPANESE:=20Translation=20updates?= =?UTF-8?q?=20based=20on=20EN=20r45262=20=20=20=20=20=20=2045834:=20DUTCH:?= =?UTF-8?q?=20Translation=20updates=20based=20on=20EN=20r45262=20=20=20=20?= =?UTF-8?q?=20=20=2045835:=20RUSSIAN:=20Translation=20updates=20based=20on?= =?UTF-8?q?=20EN=20r45262=20=20=20=20=20=20=2045836:=20CHINESE:=20Translat?= =?UTF-8?q?ion=20updates=20based=20on=20EN=20r45262=20=20=20=20=20=20=2045?= =?UTF-8?q?858:=20Fix=20ALF-17634=20-on=20startup=20FeedNotifier=20fetches?= =?UTF-8?q?=20all=20people=20slowly=20=20=20=20=20=20=20-=20switch=20from?= =?UTF-8?q?=20GetChildren=20CQ=20->=20GetPeople=20CQ=20=20=20=20=20=20=204?= =?UTF-8?q?5859:=20Fix=20ALF-17634=20-on=20startup=20FeedNotifier=20fetche?= =?UTF-8?q?s=20all=20people=20slowly=20=20=20=20=20=20=20-=20reverse=20fix?= =?UTF-8?q?=20for=20this=20test=20...=20for=20now,=20until=20we=20re-imple?= =?UTF-8?q?ment=20the=20deprecated=20method=20and=20fix=20the=20test=20cas?= =?UTF-8?q?e=20;-)=20=20=20=20=20=20=2045951:=20Fix=20for=20=20=20=20=20AL?= =?UTF-8?q?F-17687=20=20BM-0013:=20Soak:=20Run=2002:=20SolrJSONResultSet?= =?UTF-8?q?=20must=20preload=20nodes=20=20=20=20=20=20=20-=20added=20node?= =?UTF-8?q?=20preload=20=20=20=20=20=20=2045952:=20SiteServiceImplTest:=20?= =?UTF-8?q?Added=20check=20that=20size=20limiting=20of=20results=20is=20wo?= =?UTF-8?q?rking=20(and=20other=20minor=20cleanup)=20=20=20=20=20=20=20459?= =?UTF-8?q?53:=20Fixed=20ALF-17702:=20BM-0013:=20Soak:=20Run=2002:=20getCa?= =?UTF-8?q?chedChildAuthorities=20is=20not=20caching=20results=20=20=20=20?= =?UTF-8?q?=20=20=20=20-=20getChildAssocs=20specifically=20checks=20for=20?= =?UTF-8?q?'members'=20associations=20(was=20eliminated=20by=20code)=20=20?= =?UTF-8?q?=20=20=20=20=20=20-=20Cache=20negative=20results=20i.e.=20when?= =?UTF-8?q?=20there=20are=20no=20children=20=20=20=20=20=20=2045969:=20Par?= =?UTF-8?q?t=20fix=20for=20=20=20=20=20ALF-17526=20=20=20BM-0013:=20Soak:?= =?UTF-8?q?=20Run=2002:=20SOLRAPIClient.getNodesMetaData=20does=20N+1=20ca?= =?UTF-8?q?lls=20to=20NodeDAO=20=20=20=20=20=20=20-=20prependPaths=20cache?= =?UTF-8?q?s=20nodes=20for=20the=20next=20layer=20=20=20=20=20=20=2045998:?= =?UTF-8?q?=20Part=202=20=20=20=20=20ALF-17526=20=20=20BM-0013:=20Soak:=20?= =?UTF-8?q?Run=2002:=20SOLRAPIClient.getNodesMetaData=20does=20N+1=20calls?= =?UTF-8?q?=20to=20NodeDAO=20=20=20=20=20=20=20-=20make=20sure=20bulk=20no?= =?UTF-8?q?de=20load=20works=20and=20that=20assocs=20are=20cached=20=20=20?= =?UTF-8?q?=20=20=20=2045999:=20Alternative=20implementation=20for=20=20?= =?UTF-8?q?=20=20=20ALF-17719=20=20BM-0013:=20Soak:=20Run=2003:=20Containe?= =?UTF-8?q?d=20authorities=20cache=20warmup=20times=20are=20restrictive=20?= =?UTF-8?q?=20=20=20=20=20=20-=20bridge=20table=20is=20the=20default=20for?= =?UTF-8?q?=20hasAuthority()=20=20-=20configurable=20on=20AuthorityService?= =?UTF-8?q?Impl=20=20=20=20=20=20=2046000:=20ALF-17574=20BM-0013:=20JMeter?= =?UTF-8?q?:=20Run=2002:=20Blocked=20threads=20on=20PDFParser.parse=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20-=20Found=20two=20blocking=20points=20i?= =?UTF-8?q?n=20PdfBox=20to=20do=20with=20loading=20fonts=20from=20the=20cl?= =?UTF-8?q?ass=20path=20(this=20was=20the=20main=20cause)=20and=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20the=20PDFOperator=20access=20to=20a?= =?UTF-8?q?=20Synchronised=20map=20(identified=20above=20by=20Derek).=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20-=20Note=20in=201.7.0=20of=20PDFBox?= =?UTF-8?q?=20generally=20no=20font=20was=20loaded,=20but=20under=201.6.0?= =?UTF-8?q?=20it=20was.=20=20=20=20=20=20=20=20=20=20=20=20This=20may=20be?= =?UTF-8?q?=20a=20bug=20in=201.7.0=20=20=20=20=20=20=2046001:=20ALF-17722:?= =?UTF-8?q?=20Merged=20V3.4=20(3.4.12)=20to=20V4.1.3=20(4.1.3)=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=2045629:=20ALF-17536:=20Stack=20Specific:=20Can?= =?UTF-8?q?'t=20transform=20pdf=20to=20jpg=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20-=20Added=20TRACE=20to=20log=20env=20properties=20usin?= =?UTF-8?q?g=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20log4j.logger.org.?= =?UTF-8?q?alfresco.util.exec.RuntimeExec=3Dtrace=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=2045667:=20ALF-17536=20Can't=20transform=20multi=20page=20p?= =?UTF-8?q?df=20to=20jpg=20=20=20=20=20=20=20=20=20=20=20=20=20-=20issue?= =?UTF-8?q?=20was=20introduced=20by=20ALF-15436=20Alfresco=203.4c=20+=20Sh?= =?UTF-8?q?are=20+=20TIFF=20preview=20only=20shows=20the=20first=20page=20?= =?UTF-8?q?=20=20=20=20=20=2046018:=20Merged=20HEAD=20to=20PATCHES/V4.1.3?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=2041904:=20Fixes=20bugs=20uncovered?= =?UTF-8?q?=20by=20JDK=207=20upgrade=20=20=20=20=20=20=20=20=20=20-=20node?= =?UTF-8?q?Service's=20interceptors=20depended=20on=20nodeService,=20resul?= =?UTF-8?q?ting=20in=20some=20'interesting'=20interceptor=20ordering=20in?= =?UTF-8?q?=20the=20chain=20(3=20*=20the=20normal=20number=20in=20a=20rand?= =?UTF-8?q?om=20order).=20Now=20we=20use=20a=20lazy=20interceptor=20to=20b?= =?UTF-8?q?reak=20the=20cycle.=20=20=20=20=20=20=20=20=20=20-=20When=20the?= =?UTF-8?q?=20Content=20Language=20was=20en=5FGB=20and=20an=20MLText=20pro?= =?UTF-8?q?perty=20contained=20{en=5FUS,=20en=5FGB}=20it=20would=20return?= =?UTF-8?q?=20the=20en=5FUS=20one,=20not=20taking=20country=20codes=20into?= =?UTF-8?q?=20account=20when=20available=20=20=20=20=20=20=2046023:=20Foll?= =?UTF-8?q?ow=20on=20to=20previous=20check=20in.=20Fix=20up=20evil=20cloud?= =?UTF-8?q?=20sync=20override=20of=20"nodeService"=20to=20also=20not=20suf?= =?UTF-8?q?fer=20from=20a=20cyclic=20dependency!=20=20=20=2046034:=20Merge?= =?UTF-8?q?d=20V3.4-BUG-FIX=20(3.4.13)=20to=20V4.1-BUG-FIX=20(4.1.4)=20=20?= =?UTF-8?q?=20=20=20=20=2045745:=20Merge=20V3.4=20(3.4.12)=20to=20V3.4-BUG?= =?UTF-8?q?-FIX=20(3.4.13)=20=20=20=20=20=20=20=20=20=2045629:=20ALF-17536?= =?UTF-8?q?:=20Stack=20Specific:=20Can't=20transform=20pdf=20to=20jpg=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20-=20Added=20TRACE=20to=20lo?= =?UTF-8?q?g=20env=20properties=20using=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20log4j.logger.org.alfresco.util.exec.RuntimeExec=3Dt?= =?UTF-8?q?race=20=20=20=20=20=20=20=20=20=2045667:=20ALF-17536=20Can't=20?= =?UTF-8?q?transform=20multi=20page=20pdf=20to=20jpg=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20-=20issue=20was=20introduced=20by=20ALF-15436?= =?UTF-8?q?=20Alfresco=203.4c=20+=20Share=20+=20TIFF=20preview=20only=20sh?= =?UTF-8?q?ows=20the=20first=20page=20=20=20=20=20=20=20=20=20=2045724:=20?= =?UTF-8?q?ALF-17533=20CLONE=20-=20Created=20article=20or=20publication=20?= =?UTF-8?q?cant=20be=20viewed=20on=20WQS=20site=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20-=20Further=20change=20required=20to=20avoid=20dead?= =?UTF-8?q?lock=20=20=20=20=20=20=20=20=20=2045743:=20Correction=20to=20Au?= =?UTF-8?q?ditComponentTest=20=20=20=20=20=20=20=20=20=20=20=20=20-=20Test?= =?UTF-8?q?=20was=20reporting=20"Incorrect=20number=20of=20audit=20entries?= =?UTF-8?q?=20after=20failed=20login=20expected:<1000>=20but=20was:"?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20where=20XXX=20was?= =?UTF-8?q?=20less=20than=201000.=20This=20was=20because=20results=20was?= =?UTF-8?q?=20being=20cleared=20if=20all=20all=20audit=20failures=20were?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20not=20available=20?= =?UTF-8?q?in=20the=20first=20loop.=20The=20results=20needed=20to=20cleare?= =?UTF-8?q?d=20before=20the=20first=20loop=20rather=20than=20in=20every=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20loop.=20For=20example?= =?UTF-8?q?=20an=20XXX=20value=20of=20830=20would=20simply=20indicate=20th?= =?UTF-8?q?at=20the=20first=20loop=20had=20received=20170=20audit=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20results=20and=20that=20a=20?= =?UTF-8?q?second=20loop=20was=20required=20to=20get=20the=20rest.=20=20?= =?UTF-8?q?=20=20=20=20=2045754:=20Merged=20V3.4=20(3.4.12)=20to=20V3.4-BU?= =?UTF-8?q?G-FIX=20(3.4.13)=20=20=20=20=20=20=20=20=20=2045747:=20Correcti?= =?UTF-8?q?on=20to=20AuditComponentTest=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20-=20Okay=20last=20commit=20did=20not=20work.=20Try=20just?= =?UTF-8?q?=20waiting=20a=20bit=20longer=20than=20a=20second=20if=20we=20d?= =?UTF-8?q?on't=20have=20all=20records.=20=20=20=20=20=20=2045976:=20Merge?= =?UTF-8?q?d=20DEV=20to=20V3.4-BUG-FIX=20=20=20=20=20=20=20=20=20=2045925:?= =?UTF-8?q?=20ALF-16992=20:=20patch.fixAclInheritance=20is=20failing=20on?= =?UTF-8?q?=20sharedAclsThatDoNotInheritCorrectlyFromThePrimaryParent=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20Added=20a=20detection=20on?= =?UTF-8?q?=20cyclic=20loop=20for=20"inherits=20from"=20field.=20=20=20=20?= =?UTF-8?q?46037:=20Merged=20V4.1.3=20(4.1.3)=20to=20V4.1-BUG-FIX=20(4.1.4?= =?UTF-8?q?)=20=20=20=20=20=20=2046033:=20Build=20fixes=20=20=20=20=20=20?= =?UTF-8?q?=2046032:=20ALF-17628=20(No=20information=20is=20displayed=20in?= =?UTF-8?q?=20My=20Activities=20and=20Site=20Activities=20dashlets=20for?= =?UTF-8?q?=20content=20creation)=20=20=20=2046095:=20=20=20=2046100:=20AL?= =?UTF-8?q?F-17773,=20ALF-17774,=20ALF-17775,=20ALF-17776:=20Merged=20V4.0?= =?UTF-8?q?.2=20(4.0.2.26)=20to=20V4.1-BUG-FIX=20(4.1.4)=20=20=20=20=20=20?= =?UTF-8?q?=2045469:=20MNT-280:=20Merge=20from=20HEAD=20to=20V4.0.2=20(4.0?= =?UTF-8?q?.2.25)=20=20=20=20=20=20=20=20=20=2043617:=20Fix=20for=20=20=20?= =?UTF-8?q?=20=20ALF-16795=20CMIS=200.8=20TCK=20-=20load=20of=20large=20co?= =?UTF-8?q?ntent=20fails=20=20=20=20=20=20=2045875:=20Merged=20DEV=20to=20?= =?UTF-8?q?V4.0.2=20(4.0.2.26)=20=20=20=20=20=20=20=20=20=2045874:=20MNT-2?= =?UTF-8?q?82:=20Mbean=20error=20stemming=20from=20cmis=20create.=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20Synchronize=20initiating=20ContentStore.?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20Add=20tenant=20name=20to=20object?= =?UTF-8?q?=20name=20of=20ContentStore=20MBean=20for=20preventing=20overri?= =?UTF-8?q?ding=20of=20tenant=20MBeans.=20=20=20=20=20=20=2045904:=20MNT-2?= =?UTF-8?q?85=20Content=20Stream=20Errors=20during=20CMIS=20load=20test=20?= =?UTF-8?q?(Continuation=20of=20MNT-280)=20=20=20=20=20=20=20=20=20=20-=20?= =?UTF-8?q?Added=20'advice'=20above=20retrying=20transactions=20to=20suppl?= =?UTF-8?q?y=20a=20ReusableContentStream=20=20=20=20=20=20=2045910:=20MNT-?= =?UTF-8?q?285=20Content=20Stream=20Errors=20during=20CMIS=20load=20test?= =?UTF-8?q?=20(Continuation=20of=20MNT-280)=20=20=20=20=20=20=20=20=20=20-?= =?UTF-8?q?=20Added=20unit=20tests=20-=20tests=20both=20new=20TempFileProv?= =?UTF-8?q?ider=20method=20and=20AlfrescoCmisStreamInterceptor=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20-=20Corrections=20to=20interceptor=20=20=20?= =?UTF-8?q?=2046104:=20ALF-15843:=20Upgrade=20swftools=20back=20to=200.9.2?= =?UTF-8?q?=20=20=20=2046109:=20Merged=20RECORD=20ONLY=20V4.1.3=20(4.1.3)?= =?UTF-8?q?=20to=20V4.1-BUG-FIX=20(4.1.4)=20=20=20=20=20=20=2046106:=20Mer?= =?UTF-8?q?ged=20V4.1-BUG-FIX=20(4.1.4)=20to=20V4.1.3=20(4.1.3)=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=2046100:=20ALF-17773,=20ALF-17774,=20ALF-177?= =?UTF-8?q?75,=20ALF-17776:=20Merged=20V4.0.2=20(4.0.2.26)=20to=20V4.1-BUG?= =?UTF-8?q?-FIX=20(4.1.4)=20=20=20=20=20=20=20=20=20=20=20=20=2045469:=20M?= =?UTF-8?q?NT-280:=20Merge=20from=20HEAD=20to=20V4.0.2=20(4.0.2.25)=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=2043617:=20Fix=20for=20?= =?UTF-8?q?=20=20=20=20ALF-16795=20CMIS=200.8=20TCK=20-=20load=20of=20larg?= =?UTF-8?q?e=20content=20fails=20=20=20=20=20=20=20=20=20=20=20=20=2045875?= =?UTF-8?q?:=20Merged=20DEV=20to=20V4.0.2=20(4.0.2.26)=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=2045874:=20MNT-282:=20Mbean=20error?= =?UTF-8?q?=20stemming=20from=20cmis=20create.=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20Synchronize=20initiating=20ContentStore.?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20Add=20tenant=20?= =?UTF-8?q?name=20to=20object=20name=20of=20ContentStore=20MBean=20for=20p?= =?UTF-8?q?reventing=20overriding=20of=20tenant=20MBeans.=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=2045904:=20MNT-285=20Content=20Stream=20E?= =?UTF-8?q?rrors=20during=20CMIS=20load=20test=20(Continuation=20of=20MNT-?= =?UTF-8?q?280)=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20-=20Added?= =?UTF-8?q?=20'advice'=20above=20retrying=20transactions=20to=20supply=20a?= =?UTF-8?q?=20ReusableContentStream=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?45910:=20MNT-285=20Content=20Stream=20Errors=20during=20CMIS=20?= =?UTF-8?q?load=20test=20(Continuation=20of=20MNT-280)=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20-=20Added=20unit=20tests=20-=20te?= =?UTF-8?q?sts=20both=20new=20TempFileProvider=20method=20and=20AlfrescoCm?= =?UTF-8?q?isStreamInterceptor=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20-=20Corrections=20to=20interceptor=20=20=20=20=20=20=2046?= =?UTF-8?q?087:=20Merge=20V4.1-BUG-FIX=20(4.1.4)=20to=20V4.1.3=20(4.1.3)?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=2045480:=20ALF-17224:=20There=20wil?= =?UTF-8?q?l=20not=20be=20a=20"pageList"=20object=20in=20the=20freemarker?= =?UTF-8?q?=20model=20if=20a=20wiki=20page=20does=20not=20exist=20in=20a?= =?UTF-8?q?=20site=20and=20the=20wiki=20dashlet=20will=20cause=20an=20erro?= =?UTF-8?q?r=20on=20the=20site=20=20=20=2046112:=20Merged=20(4.1.3)=20to?= =?UTF-8?q?=20V4.1-BUG-FIX=20(4.1.4)=20=20=20=20=20=20=2046048:=20ALF-1772?= =?UTF-8?q?7=20-=20BM-0013:=20Soak:=20Run=2003:=20Site=20creation=20leads?= =?UTF-8?q?=20to=20contention=20on=20sites=20container=20=20=20=20=20=20?= =?UTF-8?q?=20-=20disable=20auditable=20behaviour=20on=20"sites"=20contain?= =?UTF-8?q?er=20(when=20creating=20a=20site)=20=20=20=20=20=20=2046050:=20?= =?UTF-8?q?ALF-17727=20-=20BM-0013:=20Soak:=20Run=2003:=20Site=20creation?= =?UTF-8?q?=20leads=20to=20contention=20on=20sites=20container=20=20=20=20?= =?UTF-8?q?=20=20=20-=20disable=20auditable=20behaviour=20on=20"sites"=20c?= =?UTF-8?q?ontainer=20(when=20deleting=20a=20site)=20=20=20=20=20=20=20460?= =?UTF-8?q?55:=20ALF-17729=20-=20BM-0013:=20Soak:=20Run=2003:=20ADMRemoteS?= =?UTF-8?q?tore=20optimization=20to=20reduce=20contention=20on=20share=20f?= =?UTF-8?q?olders=20=20=20=20=20=20=20-=20disable=20auditable=20behaviour?= =?UTF-8?q?=20on=20parent=20folder=20(when=20creating=20/=20deleting=20fil?= =?UTF-8?q?e)=20=20=20=20=20=20=2046059:=20Fixed=20ALF-17756:=20Thumbnails?= =?UTF-8?q?=20are=20being=20indexed=20=20=20=20=20=20=20=20-=20Add=20the?= =?UTF-8?q?=20cm:indexControl=20aspect=20to=20thumbnails=20at=20creation?= =?UTF-8?q?=20time=20=20=20=20=20=20=20=20-=20Also=20prevent=20timestamp?= =?UTF-8?q?=20propagation=20when=20adding=20or=20removing=20thumbnails=20?= =?UTF-8?q?=20=20=20=20=20=2046077:=20Following=20on=20from=20rev=2046059?= =?UTF-8?q?=20(ALF-17756):=20Fixed=20up=20the=20mock=20NodeService.createN?= =?UTF-8?q?ode=20call=20as=20we=20now=20pass=20in=20indexControl=20propert?= =?UTF-8?q?ies=20=20=20=20=20=20=2046078:=20Build=20fix=20for=20SiteServic?= =?UTF-8?q?eImplTest.testGroupMembership(SiteServiceImplTest.java:1308)=20?= =?UTF-8?q?=20=20=20=20=20=2046079:=20Additional=20fix=20for=20out=20of=20?= =?UTF-8?q?transaction=20tests=20=20=20=2046124:=20Reverse=20merge=20=20?= =?UTF-8?q?=20=20=20=20=20<<=20Will=20A.=20did=20not=20intend=20to=20commi?= =?UTF-8?q?t=20this=20>>=20=20=20=20=20=20=2046095:=20=20=20=2046159:=20Fi?= =?UTF-8?q?xed=20ALF-16889,=20Enabled=20cookie=20support=20for=20/wcs/api/?= =?UTF-8?q?login,=20independent=20from=20SSOAuthenticationFilter,=20on=20b?= =?UTF-8?q?y=20default.=20=20=20=2046165:=20Fix=20for=20ALF-17787=20-=20Si?= =?UTF-8?q?te=20Members=20'All=20Members'=20link=20should=20not=20run=20qu?= =?UTF-8?q?ery=20immediately=20=20=20=2046169:=20Fix=20for=20ALF-17787=20-?= =?UTF-8?q?=20Site=20Members=20'All=20Members'=20link=20should=20not=20run?= =?UTF-8?q?=20query=20immediately=20-=20missing=20file=20=20=20=2046184:?= =?UTF-8?q?=20Refactoring=20a=20test=20class=20to=20use=20JUnit=20Rules=20?= =?UTF-8?q?-=20as=20part=20of=20attempt=20to=20reproduce=20ALF-17797.=20?= =?UTF-8?q?=20=20=20Using=20JUnit=20Rules=20like=20this=20will=20make=20it?= =?UTF-8?q?=20much=20easier=20to=20switch=20users=20between=20test=20metho?= =?UTF-8?q?ds.=20=20=20=20Checking=20in=20separately=20from=20future=20wor?= =?UTF-8?q?k=20as=20this=20check-in=20is=20a=20pure=20refactor.=20=20=20?= =?UTF-8?q?=2046185:=20ALF-17503=20:=20Lucene=20search=20with=20skipcount?= =?UTF-8?q?=20>=20hits=20fails=20when=20RM=20is=20installed=20=20=20=20=20?= =?UTF-8?q?=20=20Fix=20build=20failures=20=20=20=20=20=20=20-=20Correct=20?= =?UTF-8?q?tests=20which=20expected=20-ve=20number=20of=20rows=20returned?= =?UTF-8?q?=20in=20a=20resultset=20=20=20=2046192:=20Enhancement=20to=20JU?= =?UTF-8?q?nit=20Rule=20TemporaryNodes.java=20as=20required=20by=20fix=20f?= =?UTF-8?q?or=20ALF-17797.=20=20=20=20This=20check-in=20enhances=20Tempora?= =?UTF-8?q?ryNodes=20to=20allow=20for=20the=20easy=20creation=20of=20speci?= =?UTF-8?q?fic=20named=20quick=20files.=20=20=20=20Previously=20you=20coul?= =?UTF-8?q?d=20only=20easily=20create=20a=20quick=20file=20selected=20by?= =?UTF-8?q?=20MIME=20type.=20=20=20=20Now=20you=20can=20use=20e.g.=20'quic?= =?UTF-8?q?kCorrupt.pdf'=20to=20get=20that=20specific=20file.=20=20=20=204?= =?UTF-8?q?6194:=20Fix=20for=20ALF-17797.=20AddFailedThumbnailActionExecut?= =?UTF-8?q?er=20is=20failing.=20=20=20=20This=20check-in=20adds=20a=20test?= =?UTF-8?q?=20case=20that=20reproduces=20the=20issue=20and=20a=20fix.=20?= =?UTF-8?q?=20=20=20The=20fix=20was=20to=20have=20the=20AddFailedThumbnail?= =?UTF-8?q?ActionExecuter=20action=20runAs=20system.=20=20=20=20This=20is?= =?UTF-8?q?=20consistent=20with=20the=20behaviour=20of=20the=20create-thum?= =?UTF-8?q?bnail=20action=20itself.=20=20=20=20There=20is=20no=20way=20via?= =?UTF-8?q?=20the=20ActionService=20to=20run=20an=20action=20(in=20this=20?= =?UTF-8?q?case=20a=20compensating=20action)=20=20=20=20as=20a=20nominated?= =?UTF-8?q?=20user,=20and=20therefore=20I=20have=20had=20to=20change=20the?= =?UTF-8?q?=20implementation=20of=20=20=20=20AddFailedThumbnailActionExecu?= =?UTF-8?q?ter.executeImpl=20so=20that=20it=20always=20runs-as=20system.?= =?UTF-8?q?=20=20=20=2046202:=20ALF-17644:=20Document=20version=20was=20in?= =?UTF-8?q?creased=20after=20canceling=20editing.=20=20=20=20-=20Also=20a?= =?UTF-8?q?=20better=20fix=20for=20ALF-17167=20=20=20=2046208:=20ALF-17517?= =?UTF-8?q?=20Document=20does=20not=20revert=20to=20previous=20version=20i?= =?UTF-8?q?f=20certain=20rule=20is=20applied=20to=20the=20parent=20folder.?= =?UTF-8?q?=20=20=20=20=20=20=20-=20fix=20build=20failures=20(may=20still?= =?UTF-8?q?=20be=20one=20left)=20-=20Not=20all=20actions=20are=20node=20ba?= =?UTF-8?q?sed=20=20=20=2046230:=20Merged=20V3.4-BUG-FIX=20to=20V4.1-BUG-F?= =?UTF-8?q?IX=20(4.1.4)=20=20=20=20=20=20=2046227:=20Filter=20repository?= =?UTF-8?q?=20test=20resources=20from=20alfresco.war=20=20=20=2046272:=20A?= =?UTF-8?q?LF-17841:=20Upgrade=204.0=20-->=204.1.4=20ClassCastException=20?= =?UTF-8?q?from=20OnPropertyUpdateRuleTrigger=20=20=20=20-=20Only=20listen?= =?UTF-8?q?=20for=20updates=20of=20single-valued=20content=20properties=20?= =?UTF-8?q?and=20cope=20with=20it=20previously=20being=20multi-valued=20(a?= =?UTF-8?q?s=20can=20be=20the=20case=20with=20the=20devious=20license=20pr?= =?UTF-8?q?operty)=20=20=20=2046279:=20ALF-17810:=20Imagemagick=20requires?= =?UTF-8?q?=20installation=20of=20Visual=20C++=20redistributables=20=20=20?= =?UTF-8?q?=20-=20x86=20VC++=202008=20SP1=20redistributables=20now=20insta?= =?UTF-8?q?lled=20to=20support=20ImageMagick=20=20=20=2046354:=20ALF-10569?= =?UTF-8?q?:=20Reversing=20r32622=20as=20it=20was=20due=20to=20an=20invali?= =?UTF-8?q?d=20interpretation=20of=20a=20Microsoft=20spec=20and=20should?= =?UTF-8?q?=20be=20unnecessary=20for=20the=20correct=20support=20of=20WebD?= =?UTF-8?q?AV=20'dead=20properties'.=20=20=20=20-=20Correct=20fix=20about?= =?UTF-8?q?=20to=20be=20merged=20in=20from=20V3.4-BUG-FIX=20=20=20=2046360?= =?UTF-8?q?:=20ALF-17697:=20Create=20proper=20source=20jars,=20to=20deploy?= =?UTF-8?q?=20to=20Maven=20repository=20=20=20=2046361:=20Merged=20V3.4-BU?= =?UTF-8?q?G-FIX=20to=20V4.1-BUG-FIX=20=20=20=20=20=20=2045756:=20ALF-1472?= =?UTF-8?q?2:=20Repeat=20merge=20of=20V4.1-BUG-FIX=20to=20V3.4-BUG-FIX=20-?= =?UTF-8?q?=20previous=20merge=20in=20r43028=20did=20not=20bring=20over=20?= =?UTF-8?q?all=20required=20changes=20=20=20=20=20=20=2042902:=20Merged=20?= =?UTF-8?q?DEV=20to=20V4.1-BUG-FIX=20=20=20=20=20=20=20=20=20=2042519:=20A?= =?UTF-8?q?LF-13588:=20Google=20Doc=20failed=20to=20authenticate=20after?= =?UTF-8?q?=20incorrect=20password=20being=20entered=20for=20google=20acco?= =?UTF-8?q?unt=20=20=20=20=20=20=20=20=20=20=20=20=20Add=20ability=20to=20?= =?UTF-8?q?unregister=20class=20behaviours.=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20Unregister=20googledocs=20behaviours=20when=20subsyste?= =?UTF-8?q?m=20stops.=20=20=20=20=20=20=2045948:=20Merged=20DEV/WABSON/V4.?= =?UTF-8?q?1-GOOGLEDOCS-BUG-FIX=20to=20DEV/V3.4-BUG=5FFIX=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=2045898:=20ALF-17704=20/=20ALF-16167:=20'Edit=20Of?= =?UTF-8?q?fline'=20checks=20out=20document=20in=20Google=20docs=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20-=20Edit=20in=20Google=20Docs=20a?= =?UTF-8?q?ction=20is=20now=20decoupled=20from=20Edit=20Offline=20action?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20-=20The=20checkout=20to?= =?UTF-8?q?=20Google=20Docs=20is=20only=20performed=20if=20a=20new=20param?= =?UTF-8?q?eter=20'gdc'=20is=20set=20as=20a=20paramter=20when=20calling=20?= =?UTF-8?q?the=20action=20web=20script=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20-=20This=20paramter=20causes=20the=20web=20script=20to=20cal?= =?UTF-8?q?l=20a=20new=20method=20checkoutToGoogleDocs()=20on=20ScriptNode?= =?UTF-8?q?=20if=20the=20parameter=20is=20set=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20-=20The=20new=20method=20simply=20calls=20the=20exi?= =?UTF-8?q?sting=20checkout()=20method=20after=20setting=20a=20custom=20pr?= =?UTF-8?q?operty=20on=20the=20transaction=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20-=20The=20Google=20Docs=20policies=20now=20check=20for?= =?UTF-8?q?=20the=20presence=20of=20this=20transaction=20property=20before?= =?UTF-8?q?=20sending=20the=20document=20to=20Google=20=20=20=20=20=20=204?= =?UTF-8?q?5976:=20ALF-17876:=20Merged=20DEV=20to=20V3.4-BUG-FIX=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=2045925:=20ALF-16992=20:=20patch.fixAclInher?= =?UTF-8?q?itance=20is=20failing=20on=20sharedAclsThatDoNotInheritCorrectl?= =?UTF-8?q?yFromThePrimaryParent=20=20=20=20=20=20=20=20=20=20=20=20=20Add?= =?UTF-8?q?ed=20a=20detection=20on=20cyclic=20loop=20for=20"inherits=20fro?= =?UTF-8?q?m"=20field.=20=20=20=20=20=20=2046041:=20ALF-17877:=20Merged=20?= =?UTF-8?q?DEV=20to=20V3.4-BUG-FIX=20(with=20corrections)=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=2046013:=20ALF-17662=20:=20The=20deleted=20via=20S?= =?UTF-8?q?harepoint=20document=20is=20not=20removed=20from=20Alfresco=20b?= =?UTF-8?q?ut=20hidden=20aspect=20is=20added=20for=20it=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20Documents=20marked=20with=20sys:hidden=20aspect=20s?= =?UTF-8?q?hould=20be=20invisible=20through=20SPP=20protocol=20and=20shoul?= =?UTF-8?q?d=20be=20treated=20as=20nonexistent.=20=20=20=20=20=20=2046054:?= =?UTF-8?q?=20ALF-17878=20/=20ALF-17633=20add=20alfresco-mmt.jar=20in=20th?= =?UTF-8?q?e=20SDK=20distribution=20=20=20=20=20=20=2046173:=20ALF-17879?= =?UTF-8?q?=20/=20ALF-17806:=20Merged=20PATCHES/V3.4.10=20to=20V3.4-BUG-FI?= =?UTF-8?q?X=20=20=20=20=20=20=20=20=20=2046099:=20MNT-293:=20Merged=20V4.?= =?UTF-8?q?0-BUG-FIX=20to=20PATCHES/V3.4.10=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=2037969:=20Fixes=20for:=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20ALF-12772=20'Path=20not=20found'=20error=20in=20Share=20i?= =?UTF-8?q?f=20user=20has=20no=20permissions=20to=20parent=20folders=20in?= =?UTF-8?q?=20breadcrumb=20=20=20=20=20=20=20=20=20=20=20=20=20ALF-14527?= =?UTF-8?q?=20Share=20-=20Error=20to=20display=20documents=20if=20user=20h?= =?UTF-8?q?as=20no=20access=20to=20the=20parent=20folder=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20-=20Share=20now=20correctly=20supports=20a?= =?UTF-8?q?ccessing=20documents=20and=20folders=20(and=20details=20page=20?= =?UTF-8?q?actions)=20where=20the=20user=20does=20not=20have=20Read=20perm?= =?UTF-8?q?issions=20on=20the=20parent=20node.=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=2046101:=20MNT-293:=20AccessDenied=20using=20CMIS=20when=20use?= =?UTF-8?q?r=20does=20not=20have=20access=20to=20parent=20folder=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20-=20Fix=20by=20Vasily=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=2046125:=20MNT-293:=20Correct=20Kev's=20logic=20to=20do?= =?UTF-8?q?=20permission=20checks=20after=20resolving=20a=20path=20as=20sy?= =?UTF-8?q?stem=20=20=20=20=20=20=20=20=20=2046127:=20Merged=20V3.4=20to?= =?UTF-8?q?=20PATCHES/V3.4.10=20=20=20=20=20=20=20=20=20=20=20=20=2045743:?= =?UTF-8?q?=20Correction=20to=20AuditComponentTest=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20-=20Test=20was=20reporting=20"Incorrect?= =?UTF-8?q?=20number=20of=20audit=20entries=20after=20failed=20login=20exp?= =?UTF-8?q?ected:<1000>=20but=20was:"=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20where=20XXX=20was=20less=20than=201000.?= =?UTF-8?q?=20This=20was=20because=20results=20was=20being=20cleared=20if?= =?UTF-8?q?=20all=20all=20audit=20failures=20were=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20not=20available=20in=20the=20firs?= =?UTF-8?q?t=20loop.=20The=20results=20needed=20to=20cleared=20before=20th?= =?UTF-8?q?e=20first=20loop=20rather=20than=20in=20every=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20loop.=20For=20example=20an?= =?UTF-8?q?=20XXX=20value=20of=20830=20would=20simply=20indicate=20that=20?= =?UTF-8?q?the=20first=20loop=20had=20received=20170=20audit=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20results=20and=20that?= =?UTF-8?q?=20a=20second=20loop=20was=20required=20to=20get=20the=20rest.?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=2045747:=20Correction=20to?= =?UTF-8?q?=20AuditComponentTest=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20-=20Okay=20last=20commit=20did=20not=20work.=20Try=20just?= =?UTF-8?q?=20waiting=20a=20bit=20longer=20than=20a=20second=20if=20we=20d?= =?UTF-8?q?on't=20have=20all=20records.=20=20=20=20=20=20=2046195:=20ALF-1?= =?UTF-8?q?7880=20/=20ALF-17378:=20Web=20content=20is=20not=20editable=20a?= =?UTF-8?q?fter=20cancelling=20the=20Edit=20Web=20Content=20Wizard=20=20?= =?UTF-8?q?=20=20=20=20=20-=20Fix=20by=20Andrey=20=20=20=20=20=20=2046227:?= =?UTF-8?q?=20Filter=20repository=20test=20resources=20from=20alfresco.war?= =?UTF-8?q?=20=20=20=20=20=20=2046324:=20Merged=20DEV=20to=20V3.4-BUG-FIX?= =?UTF-8?q?=20(with=20improvements)=20=20=20=20=20=20=20=20=20=2045602:=20?= =?UTF-8?q?ALF-10569=20/=20ALF-17519=20:=20SPP=20is=20setting=20residual?= =?UTF-8?q?=20properties=20with=20an=20unknown=20name=20space=20(urn:schem?= =?UTF-8?q?as-microsoft-com)=20=20=20=20=20=20=20=20=20=20Implemented=20sp?= =?UTF-8?q?ecial=20case=20for=20handling=20dead=20webdav=20properties.=20N?= =?UTF-8?q?ew=20webdav:object=20aspect=20was=20introduced.=20It=20is=20use?= =?UTF-8?q?d=20to=20=20=20=20=20=20=20=20=20=20store=20all=20dead=20proper?= =?UTF-8?q?ties=20that=20may=20be=20set=20on=20resource.=20=20=20=20=20=20?= =?UTF-8?q?=2046353:=20ALF-17881=20/=20ALF-17272:=20TooManyClauses=20error?= =?UTF-8?q?=20due=20to=20syntax=20error=20in=20the=20query=20generated=20f?= =?UTF-8?q?rom=20UIComponentSelector=20=20=20=20=20=20=20-=20Fixed=20typo?= =?UTF-8?q?=20in=20Lucene=20query=20generation=20introduced=20in=20r20310?= =?UTF-8?q?=20=20=20=2046362:=20ALF-17876:=20Re-fix=20typo=20introduced=20?= =?UTF-8?q?in=20V3.4-BUG-FIX=20merge=20=20=20=2046363:=20Merged=20V3.4-BUG?= =?UTF-8?q?-FIX=20to=20V4.1-BUG-FIX=20(RECORD=20ONLY)=20=20=20=20=20=20=20?= =?UTF-8?q?46285:=20Merged=20V4.1-BUG-FIX=20to=20V3.4-BUG-FIX=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=2046279:=20ALF-17810:=20Imagemagick=20requires?= =?UTF-8?q?=20installation=20of=20Visual=20C++=20redistributables=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20-=20x86=20VC++=202008=20SP1=20redistributa?= =?UTF-8?q?bles=20now=20installed=20to=20support=20ImageMagick=20=20=20=20?= =?UTF-8?q?=20=20=2046325:=20ALF-17863:=20Merged=20V4.1-BUG-FIX=20to=20V3.?= =?UTF-8?q?4-BUG-FIX=20=20=20=20=20=20=20=20=20=2043649:=20ALF-16756:=20We?= =?UTF-8?q?bDAV:=20An=20error=20occurs=20on=20drag&drop=20content=20from?= =?UTF-8?q?=20local=20machine=20to=20alfresco=20when=20inbound=20move=20ru?= =?UTF-8?q?le=20configured.=20=20=20=20=20=20=20=20=20=2043651:=20ALF-1675?= =?UTF-8?q?6:=20Fixed=20typos=20-=20I=20took=20this=20code=20in=20good=20f?= =?UTF-8?q?aith!=20=20=20=20=20=20=20=20=20=2044988:=20Merged=20DEV=20to?= =?UTF-8?q?=20V4.1-BUG-FIX=20=20=20=20=20=20=20=20=20=20=20=20=2044937:=20?= =?UTF-8?q?ALF-16756:=20WebDAV:=20An=20error=20occurs=20on=20drag&drop=20c?= =?UTF-8?q?ontent=20from=20local=20machine=20to=20alfresco=20when=20inboun?= =?UTF-8?q?d=20move=20rule=20configured.=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20Add=20check=20for=20content=20data=20length=20du?= =?UTF-8?q?ring=20determining=20existence=20of=20content=20on=20node.=20?= =?UTF-8?q?=20=20=2046395:=20Merged=20V4.1.3=20(4.1.3)=20to=20V4.1-BUG-FIX?= =?UTF-8?q?=20(4.1.4)=20=20=20=20=20=20=2046121:=20Fixed=20code=20warnings?= =?UTF-8?q?=20=20=20=20=20=20=2046123:=20Further=20improvements=20on=20ALF?= =?UTF-8?q?-17702:=20BM-0013:=20Soak:=20Run=2002:=20getCachedChildAuthorit?= =?UTF-8?q?ies=20is=20not=20caching=20result=20=20=20=20=20=20=20=20-=20Re?= =?UTF-8?q?duced=20cache=20entry=20size=20=20=20=20=20=20=20=20-=20Removed?= =?UTF-8?q?=20binary=20sort=20search=20for=20authority=20entries=20=20=20?= =?UTF-8?q?=20=20=20=20=20-=20PS:=20This=20is=20one=20of=20the=20most=20he?= =?UTF-8?q?avily=20used=20code=20paths=20in=20the=20system=20=20=20=20=20?= =?UTF-8?q?=20=2046153:=20Merged=20DEV=20to=20V4.1.3=20(4.1.3)=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20<<=20Lots=20of=20other=20changes=20in=20addit?= =?UTF-8?q?ion=20to=20merged=20code>>=20=20=20=20=20=20=20=20=20=2046093:?= =?UTF-8?q?=20ALF-16149=20:=20CLONE=20-=20User=20search=20retrieves=20all?= =?UTF-8?q?=20users=20from=20the=20DB=20regardless=20of=20search=20criteri?= =?UTF-8?q?a=20=20=20=20=20=20=20=20=20=20=20=20=20-=20Re-implemented=20de?= =?UTF-8?q?precated=20method=20PersonServiceImpl.getPeople(...)=20to=20use?= =?UTF-8?q?=20getPeopleCQ=20or=20FTS=20search=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20-=20Replaced=20calls=20to=20deprecated=20getPeople=20with=20?= =?UTF-8?q?calls=20to=20other=20one=20where=20it=20would=20end=20up=20bein?= =?UTF-8?q?g=20called=20anyway.=20=20=20=20=20=20=20=20=20=20-=20Fixed=20P?= =?UTF-8?q?ersonServiceTests=20=20=20=20=20=20=20=20=20=20-=20Fixed=20GetP?= =?UTF-8?q?eopleCannedQuery=20to=20use=20totalResultCount=20-=20tests=20fa?= =?UTF-8?q?iled=20otherwise=20=20=20=20=20=20=20=20=20=20-=20Added=20warni?= =?UTF-8?q?ng=20to=20PersonService.getPeopleFilteredByProperty(...)=20if?= =?UTF-8?q?=20PROP=5FFIRSTNAME,=20PROP=5FLASTNAME,=20PROP=5FUSERNAME=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20were=20not=20being=20used.=20This?= =?UTF-8?q?=20was=20the=20one=20place=20that=20'could'=20called=20the=20de?= =?UTF-8?q?precated=20getPeople(...)=20method=20with=20=20=20=20=20=20=20?= =?UTF-8?q?=09=20other=20properties.=20Other=20properties=20are=20not=20in?= =?UTF-8?q?cluded=20in=20the=20search=20values.=20=20=20=20=20=20=2046178:?= =?UTF-8?q?=20ALF-17796=20-=20BM-0013:=20Soak:=20Run=2004:=20Contention=20?= =?UTF-8?q?on=20folder=20'user'=20containing=20users=20=20=20=20=20=20=20-?= =?UTF-8?q?=20disable=20auditable=20behaviour=20on=20parent=20folders=20(s?= =?UTF-8?q?ee=20also=20ALF-17729)=20=20=20=20=20=20=2046244:=20Fix=20for?= =?UTF-8?q?=20=20=20=20=20ALF-17801=20=20=20BM-0013:=20Soak:=20Run=2004:?= =?UTF-8?q?=20ConcurrentModificationException=20in=20AbstractLuceneQueryPa?= =?UTF-8?q?rser=20=20=20=20=20=20=20-=20consistently=20name=20anonymous=20?= =?UTF-8?q?constraints=20defined=20on=20properties=20=20=20=20=20=20=20462?= =?UTF-8?q?65:=20ALF-17799=20-=20BM-0013:=20Soak:=20Run=2004:=20Regular=20?= =?UTF-8?q?timeouts=20getting=20site=20memberships=20=20=20=20=20=20=20-?= =?UTF-8?q?=20initial=20fix:=20make=20sure=20limit=20cut-off=20is=20also?= =?UTF-8?q?=20applied=20when=20processing=20"groups=20to=20expand"=20=20?= =?UTF-8?q?=20=20=20=20=2046286:=20Fix=20for=20=20=20=20=20ALF-17801=20=20?= =?UTF-8?q?=20BM-0013:=20Soak:=20Run=2004:=20ConcurrentModificationExcepti?= =?UTF-8?q?on=20in=20AbstractLuceneQueryParser=20=20=20=20=20=20=20-=20bui?= =?UTF-8?q?ld=20fixes=20for=20=20=20=20=20=20=20=20=20=201)=20Anonymous=20?= =?UTF-8?q?over-ridden=20constraints=20defined=20to=20contain=20the=20wron?= =?UTF-8?q?g=20property=20definition=20(no=20matter)=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=202)=20but=20above=20causes=20name=20collision=20on=20ov?= =?UTF-8?q?er-ridden=20anonymous=20constraints=20on=20properties=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=203)=20fix=20-over=20ride=20order=20to=20set?= =?UTF-8?q?=20inherited=20property=20definition=20info=20before=20over-rid?= =?UTF-8?q?ding=20the=20property=20=20=20=20=20=20=2046290:=20ALF-17799=20?= =?UTF-8?q?-=20BM-0013:=20Soak:=20Run=2004:=20Regular=20timeouts=20getting?= =?UTF-8?q?=20site=20memberships=20=20=20=20=20=20=20-=20fix=20SiteActivit?= =?UTF-8?q?yTest=20fallout=20(and=20adhere=20to=20current=20API=20contract?= =?UTF-8?q?)=20=20=20=20=20=20=2046315:=20ALF-17788:=20WebSphere:=20QueryE?= =?UTF-8?q?xception=20occurs=20during=20the=20clean=20startup=20=20=20=20?= =?UTF-8?q?=20=20=20-=20Corrected=20regression=20where=20FeedNotifier=20tr?= =?UTF-8?q?ies=20to=20scroll=20past=20the=20end=20of=20a=20result=20set=20?= =?UTF-8?q?=20=20=20=20=20=2046316:=20ALF-17702:=20Fixed=20regression=20of?= =?UTF-8?q?=20MNT-279=20fix=20=20=20=20=20=20=20-=20Avoid=20sequential=20s?= =?UTF-8?q?earch=20across=20massive=20user=20sets=20when=20evaluating=20AC?= =?UTF-8?q?Ls=20=20=20=20=20=20=2046350:=20Update=20Maven=20POM=20files=20?= =?UTF-8?q?=20=20=20=20=20=20=20-=20Upgrade=20version=20to=204.1.3=20=20?= =?UTF-8?q?=20=20=20=20=20=20-=20Upgrade=20pdfbox=20to=201.7.0-alfresco-20?= =?UTF-8?q?130130,=20to=20catch=20up=20after=20r46000=20fixing=20ALF-17574?= =?UTF-8?q?=20=20=20=20=20=20=2046370:=20ALF-17613:=20Merged=20V4.0.2=20(4?= =?UTF-8?q?.0.2.27)=20to=20V4.1.3=20(4.1.3)=20=20=20=20=20=20=20=20=20=204?= =?UTF-8?q?6368:=20MNT-298=20HF=20-=20Replace=20file=20by=20drag-and-drop?= =?UTF-8?q?=20over=20CIFS=20on=20Mac=20OS=20X=20and=20passthru/LDAP-AD=20g?= =?UTF-8?q?ets=20"is=20in=20use"=20message=20and=20deletes=20the=20file=20?= =?UTF-8?q?=20=20=2046421:=20Fix=20for=20ALF-17886.=20DeleteRenditionActio?= =?UTF-8?q?nExecuter=20Acces=20is=20denied.=20=20=20=20With=20test=20of=20?= =?UTF-8?q?course.=20=20=20=2046438:=20ALF-17622=20(Activities=20with=20Go?= =?UTF-8?q?ogle=20Docs=20are=20not=20displayed=20in=20My=20Site=20Activiti?= =?UTF-8?q?es=20and=20Site=20Activities=20dashlets)=20=20=20=2046445:=20Fi?= =?UTF-8?q?x=20for=20=20ALF-17327=20Cannot=20retrieve=20documents=20with?= =?UTF-8?q?=20a=20Japanese=20keyword.=20=20=20=2046457:=20ALF-17904=20(Goo?= =?UTF-8?q?gleDocs=20action=20doesn't=20work=20in=20doclib=20view)=20=20?= =?UTF-8?q?=20=2046482:=20Fix=20for=20ALF-17858.=20NPE=20in=20formService?= =?UTF-8?q?=20webscript.=20=20=20=2046497:=20Fix=20for=20ALF-15371=20Insta?= =?UTF-8?q?nces=20of=20java.util.Map=20interface=20cannot=20be=20accessed?= =?UTF-8?q?=20in=20JavaScript=20=20=20=20The=20fix=20was=20to=20have=20get?= =?UTF-8?q?DefaultValue(Class)=20return=20the=20map.toString.=20It=20was?= =?UTF-8?q?=20previously=20returning=20null.=20=20=20=2046533:=20ALF-17286?= =?UTF-8?q?:=20SPP=20(Cluster=20specific):Document=20workspace=20is=20not?= =?UTF-8?q?=20browseable=20via=20Share=20if=20alfresco.host=20is=20pointin?= =?UTF-8?q?g=20to=20balancer=20host=20=20=20=20=20-=20Ensure=20that=20conc?= =?UTF-8?q?urrency=20conditions=20from=20AclDAO=20get=20propagagedby=20Nod?= =?UTF-8?q?eDAO=20=20=20=2046540:=20Fix=20for=20=20=20=20=20ALF-17397=20?= =?UTF-8?q?=20searching=20based=20on=20property=20value=20that=20contains?= =?UTF-8?q?=20dashes=20doesn't=20work=20in=20a=20crossloanguage=20context?= =?UTF-8?q?=20using=20Solr=20=20=20=20-=20fixed=20-=20also=20added=20suppo?= =?UTF-8?q?rt=20for=20query/index=20time=20analysis=20control=20for=20the?= =?UTF-8?q?=20default=20cross-language=20analyser.=20=20=20=20-=20Not=20re?= =?UTF-8?q?quired=20to=20resolve=20the=20bug=20but=20may=20be=20useful=20t?= =?UTF-8?q?o=20reduce=20query=20complexity=20(e.g.=20do=20not=20generate?= =?UTF-8?q?=20concatenated=20tokens=20for=20query)=20=20=20=20=20=20=20whi?= =?UTF-8?q?ch=20could=20have=20been=20used=20as=20a=20work=20around=20for?= =?UTF-8?q?=20this=20bug=20if=20available.=20=20=20=2046546:=20Merged=20DE?= =?UTF-8?q?V=20to=20V4.1-BUG-FIX=20=20=20=20=20=20=2046494:=20ALF-17899=20?= =?UTF-8?q?TempFileProvider.createTempFile()=20is=20not=20debugable=20=20?= =?UTF-8?q?=20=20=20=20=20Added=20debug=20logs.=20=20=20=2046562:=20ALF-17?= =?UTF-8?q?917:=20Corrected=20internationalization=20of=20Imap=20Home=20fo?= =?UTF-8?q?lder=20=20=20=20-=20Unfinished=20business=20from=20ALF-15700=20?= =?UTF-8?q?=20=20=2046563:=20Fix=20for=20ALF-17572=20-=20Grey=20background?= =?UTF-8?q?=20in=20'Google=20Docs=20Theme'=20when=20uploading=20files=20wi?= =?UTF-8?q?th=20IE8=20=20=20=2046564:=20Fix=20for=20ALF-17150=20-=20Edit?= =?UTF-8?q?=20Online=20action=20missing=20in=20Share=20for=20some=20mime?= =?UTF-8?q?=20types=20(incorrect=20mimetype=20for=20PowerPoint=20files=20w?= =?UTF-8?q?ith=20SLDM=20extension)=20=20=20=2046565:=20ALF-17917:=20Correc?= =?UTF-8?q?tion=20to=20previous=20fix=20=20=20=20-=20Use=20distinct=20key?= =?UTF-8?q?=20spaces.imap=5Fhome.childname,=20because=20spaces.imapConfig.?= =?UTF-8?q?childname=20was=20already=20being=20used=20for=20other=20purpos?= =?UTF-8?q?es=20=20=20=2046568:=20Fix=20for=20ALF-17757=20and=20ALF-1101?= =?UTF-8?q?=20=20=20=20RSS=20Dashlet=20cannot=20display=20RSS=20feed=20pro?= =?UTF-8?q?duced=20by=20Share=D3=B3=20blog=20/=20RSS=20Feed=20Dashlet=20un?= =?UTF-8?q?able=20to=20read=20internal=20Alfesco=20Share=20site=20RSS=20Fe?= =?UTF-8?q?eds=20=20=20=20-=20Fix=20implementation=20from=20Will=20Abson?= =?UTF-8?q?=20=20=20=20NOTE:=20there=20is=20a=20cavet,=20suggest=20SSO=20s?= =?UTF-8?q?tyle=20config=20as=20per=20ALF-16413=20to=20avoid=20basic=20aut?= =?UTF-8?q?h=20pop-up=20when=20displaying=20some=20feeds.=20=20=20=2046624?= =?UTF-8?q?:=20removed=20=20=20=2046625:=20Undo=20last=20commit=20=20=20?= =?UTF-8?q?=2046626:=20Merged=20V4.1.1=20(4.1.1.21)=20to=20V4.1-BUG-FIX=20?= =?UTF-8?q?(4.1.4)=20=20=20=20=20=20=2046602:=20ALF-17953:=20Alfresco=20co?= =?UTF-8?q?nstantly=20running=20full=20GCs=20=20=20=20=20=20=20-=20Possibl?= =?UTF-8?q?e=20fix=20to=20TikaPoweredContentTransformer=20to=20make=20it?= =?UTF-8?q?=20wrap=20FileContentReaders=20as=20TikaInputStreams=20which=20?= =?UTF-8?q?can=20be=20cast=20to=20Files=20and=20appear=20not=20to=20need?= =?UTF-8?q?=20reading=20into=20memory=20in=20their=20entirety=20in=20uncom?= =?UTF-8?q?pressed=20form!=20=20=20=20=20=20=20-=20Fix=20also=20required?= =?UTF-8?q?=20to=20TikaOfficeDetectParser=20to=20avoid=20it=20wrapping=20a?= =?UTF-8?q?=20TikaInputStream=20unnecessarily=20=20=20=2046629:=20RECORD?= =?UTF-8?q?=20ONLY=20Merged=20V4.1.3=20(4.1.3)=20to=20V4.1-BUG-FIX=20(4.1.?= =?UTF-8?q?4)=20=20=20=20=20=20=2046622:=20ALF-17968:=20Merged=20V4.0.2=20?= =?UTF-8?q?(4.1.1.21)=20to=20V4.1.3=20(4.1.3)=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=2046602:=20ALF-17953:=20Alfresco=20constantly=20running=20full?= =?UTF-8?q?=20GCs=20=20=20=20=20=20=20=20=20=20-=20Possible=20fix=20to=20T?= =?UTF-8?q?ikaPoweredContentTransformer=20to=20make=20it=20wrap=20FileCont?= =?UTF-8?q?entReaders=20as=20TikaInputStreams=20which=20can=20be=20cast=20?= =?UTF-8?q?to=20Files=20and=20appear=20not=20to=20need=20reading=20into=20?= =?UTF-8?q?memory=20in=20their=20entirety=20in=20uncompressed=20form!=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20-=20Fix=20also=20required=20to=20Tik?= =?UTF-8?q?aOfficeDetectParser=20to=20avoid=20it=20wrapping=20a=20TikaInpu?= =?UTF-8?q?tStream=20unnecessarily=20=20=20=20=20=20=20=20=20=2046607:=20A?= =?UTF-8?q?LF-17953=20Alfresco=20constantly=20running=20full=20GC's=20-=20?= =?UTF-8?q?some=20java.lang.threads=20holding=20around=209Gb=20of=20memory?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20-=20Added=20transformati?= =?UTF-8?q?on=20limits=20to=20the=208=20TikaPoweredContentTransformer=20ba?= =?UTF-8?q?sed=20transformers,=20so=20that=20the=20maxSourceSizeKBytes=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20can=20be=20set=20for?= =?UTF-8?q?=20each=20transformer=20and=20for=20each=20source=20mimetype=20?= =?UTF-8?q?used=20by=20each=20transformer.=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20-=20maxSourceSizeKBytes=20set=20to=2040MB=20for=20the?= =?UTF-8?q?=20newer=202007=20MS=20office=20types=20(4=20char=20ext).=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=2046619:=20ALF-17953=20Alfresco=20constan?= =?UTF-8?q?tly=20running=20full=20GC's=20-=20some=20java.lang.threads=20ho?= =?UTF-8?q?lding=20around=209Gb=20of=20memory=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20-=20Changed=20maxSourceSizeKBytes=20values=20from?= =?UTF-8?q?=2040MB=20back=20to=20-1=20for=20the=20newer=202007=20MS=20offi?= =?UTF-8?q?ce=20types=20(4=20char=20ext).=20=20=20=2046636:=20Fix=20for=20?= =?UTF-8?q?=20=20=20=20ALF-13442=20=20=20=20=20=20Tomcat=20memory=20leak?= =?UTF-8?q?=20warnings=20occur=20during=20the=20shutdown=20=20=20=2046679:?= =?UTF-8?q?=20Merged=20DEV=20to=20V4.1-BUG-FIX=20(4.1.4)=20=20=20=20=20=20?= =?UTF-8?q?=2046659:=20ALF-17631=20:=20Errors/Exception=20during=20stress?= =?UTF-8?q?=20tests=20of=20CMIS=20GET=20children=20=20=20=20=20=20=20Retry?= =?UTF-8?q?ingTransactionHelper=20has=20now=20ability=20to=20handle=20pre-?= =?UTF-8?q?configured=20exceptions=20as=20retriable=20in=20addition=20to?= =?UTF-8?q?=20default=20list=20of=20exceptions.=20=20=20=2046683:=20Merge?= =?UTF-8?q?=20PATCHES/V4.1.3=20to=20V4.1-BUG-FIX=20(4.1.4)=20=20=20=20=20?= =?UTF-8?q?=20=2046637:=20Update=20the=20notice.txt=20and=20licenses=20wit?= =?UTF-8?q?h=20the=20latest=20modifications=20=20=20=20Add=20Microsoft=20V?= =?UTF-8?q?isual=20C++=202008=20Redistributable=20Package=20in=20the=20not?= =?UTF-8?q?ice.txt=20=20=20=2046693:=20RECORD=20ONLY=20Merged=20V3.4-BUG-F?= =?UTF-8?q?IX=20(3.4.13)=20to=20V4.1-BUG-FIX=20(4.1.4)=20=20=20=20=20=20?= =?UTF-8?q?=2046692:=20ALF-17984:=20Merged=20V3.4.12=20(3.4.12.2)=20to=20V?= =?UTF-8?q?3.4-BUG-FIX=20(3.4.13)=20=20=20=20=20=20=20=20=20=2046680:=20MN?= =?UTF-8?q?T-307:=20DEV=20to=20V3.4.12=20(3.4.12.2)=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=2046659:=20ALF-17631=20:=20Errors/Exception=20d?= =?UTF-8?q?uring=20stress=20tests=20of=20CMIS=20GET=20children=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20RetryingTransactionHelper=20has=20no?= =?UTF-8?q?w=20ability=20to=20handle=20pre-configured=20exceptions=20as=20?= =?UTF-8?q?retriable=20in=20addition=20to=20default=20list=20of=20exceptio?= =?UTF-8?q?ns.=20=20=20=20=20=20=20=20=20=20=20=20=20-=20Change=20to=20ope?= =?UTF-8?q?ncmis-context.xml=20on=20DEV=20(based=20on=204.1.4)=20was=20mad?= =?UTF-8?q?e=20to=20cmis-ws-context.xml=20on=20V3.4.12=20=20=20=2046694:?= =?UTF-8?q?=20Merged=20DEV=20to=20V4.1-BUG-FIX=20(4.1.4)=20=20=20=20=20=20?= =?UTF-8?q?=2046686:=20ALF-17631=20:=20Errors/Exception=20during=20stress?= =?UTF-8?q?=20tests=20of=20CMIS=20GET=20children=20=20=20=20=20=20=20Unit?= =?UTF-8?q?=20test=20add=20for=20RetryingTransactionHelper=20to=20test=20e?= =?UTF-8?q?xtra=20exceptions=20are=20rertied=20correctly.=20=20=20=2046724?= =?UTF-8?q?:=20create-site.css=20and=20create-site.js=20will=20be=20includ?= =?UTF-8?q?ed=20in=20the=20header=20(share-config.xml)=20therefore=20there?= =?UTF-8?q?=20is=20no=20reason=20to=20include=20them=20in=20the=20freemark?= =?UTF-8?q?er=20templates.=20=20=20=2046759:=20Merged=20DEV=20to=20V4.1-BU?= =?UTF-8?q?G-FIX=20(4.1.4)=20=20=20=20=20=20=2046734:=20ALF-17873=20Missin?= =?UTF-8?q?g=20versionLabel=20property=20after=20Version2ServiceImpl.resto?= =?UTF-8?q?re()=20=20=20=20=20=20=201.=20In=20Version2ServiceImpl.restore(?= =?UTF-8?q?)=20to=20props=20Map=20was=20added=20ContentModel.PROP=5FVERSIO?= =?UTF-8?q?N=5FLABEL=20property.=20=20=20=20=20=20=202.=20In=20VersionServ?= =?UTF-8?q?iceImplTest.testRestore()=20was=20added=20the=20check=20that=20?= =?UTF-8?q?ContentModel.PROP=5FVERSION=5FLABEL=20property=20is=20correct.?= =?UTF-8?q?=20=20=20=2046760:=20Merged=20DEV=20to=20V4.1-BUG-FIX=20(4.1.4)?= =?UTF-8?q?=20=20=20=20=20=20=2046433:=20ALF-16883:=20Incorrect=20message?= =?UTF-8?q?=20occurred=20when=20delete=20Workspace=20if=20document=20is=20?= =?UTF-8?q?locked.=20=20=20=20=20=20=20Not=20possible=20to=20change=20MS?= =?UTF-8?q?=20Office=20message=20-=20have=20improved=20alfresco=20log=20me?= =?UTF-8?q?ssage=20=20=20=2046782:=20ALF-17317=204.0.2.23=20HOT=20FIX:=20O?= =?UTF-8?q?penOffice=20server=20conversion=20failed=20=20=20=2046783:=20AL?= =?UTF-8?q?F-17546=20OOXMLThumbnailContentTransformer=20is=20not=20registe?= =?UTF-8?q?red=20to=20handle=20special=20Office=20document=20types,=20such?= =?UTF-8?q?=20as=20templates=20and=20macro-enabled=20variants=20of=20docum?= =?UTF-8?q?ent=20/=20template=20=20=20=2046797:=20Restore=20missing=20merg?= =?UTF-8?q?einfo=20accidentally=20removed=20in=20r46562=20=20=20=2046799:?= =?UTF-8?q?=20ALF-17546=20OOXMLThumbnailContentTransformer=20is=20not=20re?= =?UTF-8?q?gistered=20to=20handle=20special=20Office=20document=20types,?= =?UTF-8?q?=20such=20as=20templates=20and=20macro-enabled=20variants=20of?= =?UTF-8?q?=20document=20/=20template=20=20=20=20=20=20=20-=20typo=20in=20?= =?UTF-8?q?mimetype=20case=20=20=20=2046916:=20ALF-17174=20pdf2swf=20suppo?= =?UTF-8?q?rts=20converting=20N=20first=20pages=20but=20alfresco=20does=20?= =?UTF-8?q?not=20support=20it=20via=20the=20pageLimit=20=20=20=2046933:=20?= =?UTF-8?q?ALF-8144:=20Drastically=20improving=20performance=20using=20laz?= =?UTF-8?q?y-loaded=20WorklfowTask=20properties=20and=20path=20+=20improve?= =?UTF-8?q?d=20the=20way=20share=20pages=20workflow-tasks=20to=20prevent?= =?UTF-8?q?=20building=20full=20model=20for=20unneeded=20tasks=20=20=20=20?= =?UTF-8?q?46946:=20ALF-18000:=20Startup=20script=20depends=20on=20the=20w?= =?UTF-8?q?orking=20directory=20where=20it=20is=20run=20=20=20=20-=20Chang?= =?UTF-8?q?ed=20vti.properties=20to=20=20=20=20vti.server.ssl.keystore=3D$?= =?UTF-8?q?{dir.keystore}/vti.ssl.keystore=20=20=20=2046995:=20Improvement?= =?UTF-8?q?=20related=20to=20=20=20=20=20ALF-17380=20=20=20Solr=20queries?= =?UTF-8?q?=20running=20slowly=20=20=20=20-=20reader=20->=20acl=20cache=20?= =?UTF-8?q?is=20built=20on=20demand=20(and=20warmed=20via=20authority=20wa?= =?UTF-8?q?rming)=20=20=20=20-=20this=20will=20mean=20it=20is=20not=20eage?= =?UTF-8?q?rly=20built=20for=20the=20archive=20store=20where=20it=20would?= =?UTF-8?q?=20be=20little=20used,=20and=20could=20be=20configured=20off=20?= =?UTF-8?q?for=20this=20case=20=20=20=2047032:=20ALF-17804:=20cmisatom=20U?= =?UTF-8?q?RL=20(opencmis=20backed=20by=20Apache=20Chemistry=20OpenCMIS)?= =?UTF-8?q?=20does=20not=20support=20External=20authentication=20=20=20=20?= =?UTF-8?q?=20-=20Now=20it=20supports=20all=20kinds=20of=20authentication?= =?UTF-8?q?=20because=20it=20sits=20behind=20Alfresco's=20authentication?= =?UTF-8?q?=20filters=20=20=20=20=20-=20Fix=20researched=20by=20Alex=20Muk?= =?UTF-8?q?ha=20=20=20=2047033:=20Merged=20V3.4-BUG-FIX=20to=20V4.1-BUG-FI?= =?UTF-8?q?X=20=20=20=20=20=20=2046453:=20ALF-18122=20/=20ALF-17708:=20Inc?= =?UTF-8?q?orrect=20behavior=20of=20"Show/Hide=20Breadcrumb"=20button=20wh?= =?UTF-8?q?en=20RM=20is=20installed=20=20=20=20=20=20=20-=20ContentService?= =?UTF-8?q?.getReader()=20now=20triggers=20a=20transaction=20retry=20if=20?= =?UTF-8?q?content=20is=20found=20to=20have=20disappeared=20under=20its=20?= =?UTF-8?q?feet=20due=20to=20eager=20content=20cleaning=20=20=20=20=20=20?= =?UTF-8?q?=2046495:=20ALF-18122=20/=20ALF-17708:=20Incorrect=20behavior?= =?UTF-8?q?=20of=20"Show/Hide=20Breadcrumb"=20button=20when=20RM=20is=20in?= =?UTF-8?q?stalled=20=20=20=20=20=20=20-=20lower=20impact=20fix=20will=20o?= =?UTF-8?q?nly=20throw=20retryable=20exception=20if=20stream=20is=20access?= =?UTF-8?q?ed=20=20=20=20=20=20=2046822:=20ALF-18123:=20Merge=20Dev=20to?= =?UTF-8?q?=20V3.4-BUG-FIX=20=20=20=20=20=20=20=20=20ALF-17408=20:=20Conte?= =?UTF-8?q?nt=20is=20not=20displayed=20in=20imap=20folder=20after=20recove?= =?UTF-8?q?ring=20=20=20=20=20=20=2046823:=20ALF-18124=20/=20ALF-18091:=20?= =?UTF-8?q?Fix=20for=20MNT-311=20-=20authentication=20challenge=20not=20pr?= =?UTF-8?q?esent=20when=20users=20open=20direct=20links=20below=20/share/p?= =?UTF-8?q?roxy/alfresco/cmis/i=20=20=20=20=20=20=2046927:=20ALF-18124=20/?= =?UTF-8?q?=20ALF-18091:=20Merged=20PATCHES/V3.4.10=20to=20V3.4-BUG-FIX=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=2046925:=20Merged=20V3.4-BUG-FIX=20to?= =?UTF-8?q?=20PATCHES/V3.4.10=20(with=20correction)=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=2046823:=20Fix=20for=20MNT-311=20-=20authentica?= =?UTF-8?q?tion=20challenge=20not=20present=20when=20users=20open=20direct?= =?UTF-8?q?=20links=20below=20/share/proxy/alfresco/cmis/*/content=20=20?= =?UTF-8?q?=20=20=20=20=2046942:=20ALF-17990:=20Fix=20security=20descripto?= =?UTF-8?q?rs=20for=20new=20FileFolderService=20isHidden=20setHidden=20met?= =?UTF-8?q?hods=20=20=20=20=20=20=2047021:=20ALF-18125:=20Merged=20DEV=20t?= =?UTF-8?q?o=20V3.4-BUG-FIX=20=20=20=20=20=20=20=20=20=2046825:=20ALF-1768?= =?UTF-8?q?1=20:=20Lucene=20Search=20queries=20with=20PATH=20doesn't=20wor?= =?UTF-8?q?k=20in=20tenants=20=20=20=20=20=20=20=20=20=20A=20JUnit=20test?= =?UTF-8?q?=20was=20implemented=20to=20show=20that=20the=20PATH=20Lucene?= =?UTF-8?q?=20indexes=20are=20not=20created=20correctly=20for=20tenants.?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=2046968:=20ALF-17681=20:=20Lucene?= =?UTF-8?q?=20Search=20queries=20with=20PATH=20doesn't=20work=20in=20tenan?= =?UTF-8?q?ts=20=20=20=20=20=20=20=20=20=20The=20creation=20of=20PATH=20in?= =?UTF-8?q?dexes=20is=20now=20made=20in=20context=20of=20multi=20tenant=20?= =?UTF-8?q?System=20user=20to=20run=20the=20reindexing=20process=20correct?= =?UTF-8?q?ly=20in=20unauthenticated=20threads.=20=20=20=2047034:=20Merged?= =?UTF-8?q?=20V3.4-BUG-FIX=20to=20V4.1-BUG-FIX=20(RECORD=20ONLY)=20=20=20?= =?UTF-8?q?=20=20=20=2047030:=20ALF-16102:=20Merged=20PATCHES/V3.4.10=20to?= =?UTF-8?q?=20V3.4-BUG-FIX=20(RECORD=20ONLY)=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?41755:=20ALF-16013:=20Merged=20V4.1-BUG-FIX=20to=20PATCHES/V3.4?= =?UTF-8?q?.10=20=20=20=20=20=20=20=20=20=20=20=20=2041539:=20ALF-15899:?= =?UTF-8?q?=20Inbound=20email=20does=20not=20support=20multiple=20recipien?= =?UTF-8?q?t=20folders=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20-=20?= =?UTF-8?q?Fix=20by=20Dmitry=20Vaserin=20=20=20=20=20=20=2047031:=20ALF-18?= =?UTF-8?q?121:=20Merged=20PATCHES/V3.4.11=20to=20V3.4-BUG-FIX=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=2046978:=20MNT-320:=20Merged=20HEAD=20to=20PATC?= =?UTF-8?q?HES/V3.4.11:=20=20=20=20=20=20=20=20=20=20=20=20=2036623:=20ALF?= =?UTF-8?q?-10243:=20form-service=20date-control=20now=20allows=20configur?= =?UTF-8?q?ing=20only=20to=20send=20date-component=20of=20date-only=20form?= =?UTF-8?q?fields=20(timezone=20and=20time-component=20is=20reset=20server?= =?UTF-8?q?-side=20to=20prevent=20unnecesairy=20timezone-issues)=20=20=20?= =?UTF-8?q?=2047035:=20Merged=20PATCHES/V4.1.3=20to=20V4.1-BUG-FIX=20=20?= =?UTF-8?q?=20=20=20=20=2046398:=20Fix=20for=20=20=20=20=20ALF-17889=20=20?= =?UTF-8?q?=20Alfresco=20failing=20as=20constraint=20in=20extension=20mode?= =?UTF-8?q?l=20cannot=20be=20defined=20=20=20=20=20=20=20-=20use=20the=20n?= =?UTF-8?q?amespace=20from=20the=20containing=20model=20and=20not=20the=20?= =?UTF-8?q?over-ridden=20property.=20=20=20=20=20=20=2046426:=20Merged=20B?= =?UTF-8?q?RANCHES/DEV/V4.1-BUG-FIX=20to=20PATCHES/V4.1.3:=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=2046421:=20Fix=20for=20ALF-17886.=20DeleteRenditio?= =?UTF-8?q?nActionExecuter=20Acces=20is=20denied.=20=20=20=20=20=20=204644?= =?UTF-8?q?6:=20ALF-17864:=20BM-0013:=20Soak:=20Run=2005:=20SiteService.li?= =?UTF-8?q?stSites(username,=20size)=20performance=20(=3D>=20via=20listSit?= =?UTF-8?q?esImpl)=20=20=20=20=20=20=20-=20isAuthorityContained=20made=20t?= =?UTF-8?q?o=20prune=20its=20search=20drastically=20-=20it=20caches=20hits?= =?UTF-8?q?=20and=20misses=20speeding=20up=20the=20search=20in=20a=20deepl?= =?UTF-8?q?y=20nested=20group=20hierarchy=20such=20as=20SAP's=20=20=20=20?= =?UTF-8?q?=20=20=20-=20To=20avoid=20huge=20memory=20impact=20with=20lots?= =?UTF-8?q?=20of=20duplicate=20copies=20of=20authority=20names=20a=20pool?= =?UTF-8?q?=20of=20authority=20names=20is=20shared=20across=20all=20thread?= =?UTF-8?q?s=20=20=20=20=20=20=20-=20getContainingAuthoritesInZone=20reins?= =?UTF-8?q?tated=20for=20site=20listing=20as=20it=20warms=20the=20same=20c?= =?UTF-8?q?aches=20as=20the=20ACLs=20=20=20=20=20=20=20-=20Derek's=20lates?= =?UTF-8?q?t=20tests=20with=20the=20changes=20applied=20showed=20a=20good?= =?UTF-8?q?=20speed=20up=20=20=20=20=20=20=2046501:=20ALF-17929:=20BM-0013?= =?UTF-8?q?:=20Soak:=20Run=2006:=20/api/sites/{shortname}/memberships/{aut?= =?UTF-8?q?horityname}=20/=20SiteServiceImpl.getMembersRoleInfo=20performa?= =?UTF-8?q?nce=20poor=20=20=20=20=20=20=20-=20Possible=20fix=20to=20regres?= =?UTF-8?q?sion=20caused=20by=20ALF-16254=20=20=20=20=20=20=20-=20A=20very?= =?UTF-8?q?=20inefficient=20route=20was=20being=20taken=20towards=20checki?= =?UTF-8?q?ng=20a=20user's=20indirect=20site=20role=20=20=20=20=20=20=2046?= =?UTF-8?q?502:=20ALF-17930:=20BM-0013:=20Soak:=20Run=2006:=20ConcurrentMo?= =?UTF-8?q?dificationException=20in=20AuthorityDAOImpl=20=20=20=20=20=20?= =?UTF-8?q?=20-=20Don't=20try=20to=20mutate=20the=20set=20returned=20by=20?= =?UTF-8?q?getContainingAuthorities()=20=20=20=20=20=20=2046503:=20ALF-179?= =?UTF-8?q?29:=20BM-0013:=20Soak:=20Run=2006:=20/api/sites/{shortname}/mem?= =?UTF-8?q?berships/{authorityname}=20/=20SiteServiceImpl.getMembersRoleIn?= =?UTF-8?q?fo=20performance=20poor=20=20=20=20=20=20=20-=20Further=20optim?= =?UTF-8?q?izations=20to=20prevent=20unnecessary=20recursion=20in=20Author?= =?UTF-8?q?ityDAOImpl.listAuthorities()=20=20=20=20=20=20=2046506:=20ALF-1?= =?UTF-8?q?7929:=20BM-0013:=20Soak:=20Run=2006:=20/api/sites/{shortname}/m?= =?UTF-8?q?emberships/{authorityname}=20/=20SiteServiceImpl.getMembersRole?= =?UTF-8?q?Info=20performance=20poor=20=20=20=20=20=20=20-=20Fixed=20typo?= =?UTF-8?q?=20producing=20invalid=20membership=20results=20=20=20=20=20=20?= =?UTF-8?q?=2046627:=20ALF-17967:=20Error=20in=20org.alfresco.repo.workflo?= =?UTF-8?q?w.WorkflowServiceImpl.getPooledTasks=20on=20StartUp.=20=20=20?= =?UTF-8?q?=20=20=20=20-=20Logic=20error=20in=20org.alfresco.repo.workflow?= =?UTF-8?q?.WorkflowServiceImpl.getPooledTasks()=20introduced=20in=20ALF-1?= =?UTF-8?q?4861=20/=20r45421=20=20=20=20=20=20=20-=20Rather=20than=20fixin?= =?UTF-8?q?g=20the=20screwy=20logic=20(which=20I=20think=20would=20cause?= =?UTF-8?q?=20a=20major=20performance=20hit)=20I'm=20reinstating=20the=204?= =?UTF-8?q?.1.2=20"cut=20off=20after=20100=20groups"=20behaviour=20=20=20?= =?UTF-8?q?=20=20=20=2046630:=20Merged=204.1-BUG-FIX=20to=20PATCHES/V4.1.3?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=2046562:=20ALF-17917:=20Corrected?= =?UTF-8?q?=20internationalization=20of=20Imap=20Home=20folder=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20-=20Unfinished=20business=20from=20ALF-15700?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=2046565:=20ALF-17917:=20Correction?= =?UTF-8?q?=20to=20previous=20fix=20=20=20=20=20=20=20=20=20=20-=20Use=20d?= =?UTF-8?q?istinct=20key=20spaces.imap=5Fhome.childname,=20because=20space?= =?UTF-8?q?s.imapConfig.childname=20was=20already=20being=20used=20for=20o?= =?UTF-8?q?ther=20purposes=20=20=20=20=20=20=2046779:=20ALF-17967:=20Error?= =?UTF-8?q?=20in=20org.alfresco.repo.workflow.WorkflowServiceImpl.getPoole?= =?UTF-8?q?dTasks=20on=20StartUp.=20=20=20=20=20=20=20-=20Improved=20fix?= =?UTF-8?q?=20that=20uses=20the=20bridge=20table=20cache=20if=20it=20is=20?= =?UTF-8?q?available=20=20=20=20=20=20=20-=20Groups=20queried=20for=20pool?= =?UTF-8?q?ed=20tasks=20still=20limited=20to=20100=20by=20default=20but=20?= =?UTF-8?q?can=20be=20configured=20with=20system.workflow.maxAuthoritiesFo?= =?UTF-8?q?rPooledTasks=20=20=20=20=20=20=20-=20Overall=20number=20of=20re?= =?UTF-8?q?sults=20can=20be=20cut=20off=20with=20system.workflow.maxPooled?= =?UTF-8?q?Tasks=20=20=20=20=20=20=2047013:=20Fix=20HiddenAspect=20to=20NO?= =?UTF-8?q?T=20use=20permission-checking=20NodeService=20=20=20=20=20=20?= =?UTF-8?q?=20=20-=20Should=20fix=20ALF-17605:=20CLONE=20-=20Severe=20perf?= =?UTF-8?q?ormance=20problems=20with=20Group=20ACL=20checking=20under=20st?= =?UTF-8?q?ress=20test=20=20=20=20=20=20=2047018:=20(RECORD=20ONLY)=20Disa?= =?UTF-8?q?bled=20EmailServiceImplTest.testEmailContributorsAuthority=20pe?= =?UTF-8?q?nding=20ALF-17979=20=20=20=2047036:=20Merged=20PATCHES/V4.1.2?= =?UTF-8?q?=20to=20V4.1-BUG-FIX=20=20=20=20=20=20=2046180:=20Merged=20DEV?= =?UTF-8?q?=20to=20PATCHES/V4.1.2=20=20=20=20=20=20=20=20=20=2046170:=20MN?= =?UTF-8?q?T-299=20:=20CLONE=20-=20Activity=20feeds=20get=20not=20generate?= =?UTF-8?q?d=20in=20private=20sites=20for=20added=20files=20if=20username?= =?UTF-8?q?=20in=20LDAP-AD=20contains=20uppercase=20letters=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20Improved=20debug=20logging=20for=20Acti?= =?UTF-8?q?vity=20Feed=20and=20Activity=20Post=20DAOs.=20=20=20=2047037:?= =?UTF-8?q?=20ALF-17973=20(Incorrect=20name=20(title.single/title.multi)?= =?UTF-8?q?=20for=20"cloud=20target=20selection"=20window=20when=20RM=20is?= =?UTF-8?q?=20installed)=20=20=20=2047042:=20RM-601=20(Copy/Move=20dialog?= =?UTF-8?q?=20causes=20an=20error=20in=20firebug=20console)=20=20=20=20470?= =?UTF-8?q?47:=20DE:=20Translation=20update=20based=20on=20EN=20r46507=20?= =?UTF-8?q?=20=20=2047048:=20SPANISH:=20Translation=20update=20based=20on?= =?UTF-8?q?=20EN=20r46507=20=20=20=2047049:=20FRENCH:=20Translation=20upda?= =?UTF-8?q?te=20based=20on=20EN=20r46507=20=20=20=2047050:=20ITALIAN:=20Tr?= =?UTF-8?q?anslation=20update=20based=20on=20EN=20r46507=20=20=20=2047051:?= =?UTF-8?q?=20NORWEGIAN:=20Translation=20update=20based=20on=20EN=20r46507?= =?UTF-8?q?=20=20=20=2047052:=20JAPANESE:=20Translation=20update=20based?= =?UTF-8?q?=20on=20EN=20r46507=20=20=20=2047089:=20ALF-17089=20(Displaying?= =?UTF-8?q?=20Url=20Name=20instead=20of=20site=20Name=20in=20Select=20form?= =?UTF-8?q?)=20=20=20=2047102:=20New=20Norwegian=20translations=20from=20G?= =?UTF-8?q?loria=20plus=20Bitrock=20configuration=20to=20enable=20them=20?= =?UTF-8?q?=20=20=2047110:=20ALF-10243:=20Merged=20V3.4-BUG-FIX=20to=20V4.?= =?UTF-8?q?1-BUG-FIX=20=20=20=20=20=20=2047105:=20ALF-18121:=20Merged=20PA?= =?UTF-8?q?TCHES/V3.4.11=20to=20V3.4-BUG-FIX=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?47040:=20MNT-323:=20Fixed=20issue=20with=20passing=20empty=20du?= =?UTF-8?q?e=20date=20when=20starting=20workflow=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=2047101:=20MNT-320:=20also=20applied=20fix=20to=20wcmquicks?= =?UTF-8?q?tart=20module=20=20=20=20=20=20=2047109:=20ALF-18121:=20Merged?= =?UTF-8?q?=20PATCHES/V3.4.11=20to=20V3.4-BUG-FIX=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=2047106:=20MNT-320:=20Merged=20V4.1-BUG-FIX=20to=20PATCHES/?= =?UTF-8?q?V3.4.11=20=20=20=20=20=20=20=20=20=20=20=20=2041010:=20ALF-1569?= =?UTF-8?q?7:=20Not=20possible=20to=20start=20workflow=20not=20specifying?= =?UTF-8?q?=20the=20Due=20Date=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20-=20Regression=20caused=20by=20ALF-10243=20=20=20=2047135?= =?UTF-8?q?:=20DUTCH:=20Translation=20update=20based=20on=20EN=20r46507=20?= =?UTF-8?q?=20=20=2047137:=20RUSSIAN:=20Translation=20update=20based=20on?= =?UTF-8?q?=20EN=20r46507=20=20=20=2047138:=20CHINESE:=20Translation=20upd?= =?UTF-8?q?ate=20based=20on=20EN=20r46507=20=20=20=2047141:=20Fix=20for=20?= =?UTF-8?q?=20=20=20=20ALF-17979=20=20=20=20EmailServiceImplTest=20intermi?= =?UTF-8?q?ttently=20failing=20=20=20=2047147:=20Part=202=20of=20=20=20=20?= =?UTF-8?q?ALF-17979=20=20=20EmailServiceImplTest=20intermittently=20faili?= =?UTF-8?q?ng=20=20=20=20-=20fix=20related=20cache=20to=20avoid=20any=20fu?= =?UTF-8?q?ture=20issue=20=20=20=2047148:=20ALF-17804:=20Fix=20NPE=20=20?= =?UTF-8?q?=20=2047171:=20ALF-18060:=20removing=20obsolete=20expensive=20s?= =?UTF-8?q?orting=20and=20preventing=20too=20many=20variable-queries=20to?= =?UTF-8?q?=20be=20performed=20when=20listing=20COMPLETED=20WorkflowTask?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@47186 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../repository/blogs/blogpost.lib.ftl | 21 +- .../category/category.post.json.ftl | 2 +- .../org/alfresco/repository/site/site.lib.ftl | 1 + .../repository/site/sites.get.json.ftl | 2 +- .../repository/wcm/webproject.put.json.js | 2 +- .../repository/workflow/workflow.lib.ftl | 2 +- .../slingshot/wiki/pagelist.get.json.ftl | 122 +-- .../web-scripts-application-context.xml | 4 + .../AbstractArchivedNodeWebScript.java | 16 +- .../repo/web/scripts/bean/ADMRemoteStore.java | 68 +- .../discussion/DiscussionRestApiTest.java | 32 + .../web/scripts/discussion/ForumPostPut.java | 12 +- .../repo/web/scripts/solr/SOLRSerializer.java | 29 +- .../web/scripts/wiki/WikiPageListGet.java | 14 + .../workflow/AbstractWorkflowRestApiTest.java | 5 +- .../scripts/workflow/TaskInstancesGet.java | 47 +- .../workflow/WorkflowModelBuilder.java | 8 +- .../alfresco/repo/webdav/DeleteMethod.java | 4 +- .../org/alfresco/repo/webdav/MoveMethod.java | 8 +- .../alfresco/repo/webdav/PropFindMethod.java | 91 +- .../alfresco/repo/webdav/PropPatchMethod.java | 897 +++++++++--------- .../org/alfresco/repo/webdav/PutMethod.java | 6 +- .../alfresco/repo/webdav/WebDAVMethod.java | 31 - 23 files changed, 836 insertions(+), 588 deletions(-) diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/blogs/blogpost.lib.ftl b/config/alfresco/templates/webscripts/org/alfresco/repository/blogs/blogpost.lib.ftl index fdf1995b23..b8757165a7 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/repository/blogs/blogpost.lib.ftl +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/blogs/blogpost.lib.ftl @@ -47,8 +47,8 @@ "username": "${item.node.properties.creator}" }, - "createdOn": "${xmldate(item.createdDate)}", - "modifiedOn": "${xmldate(item.modifiedDate)}", + "createdOn": "${formatDateRFC822(item.createdDate)}", + "modifiedOn": "${formatDateRFC822(item.modifiedDate)}", "permissions": { "edit": ${item.node.hasPermission("Write")?string}, @@ -59,16 +59,16 @@ <#-- draft vs internal published --> "isDraft": ${item.isDraft?string}, <#if (! item.isDraft)> - "releasedOn": "${xmldate(item.releasedDate)}", + "releasedOn": "${formatDateRFC822(item.releasedDate)}", <#-- true if the post has been updated --> "isUpdated": ${item.isUpdated?string}, <#if (item.isUpdated)> - "updatedOn": "${xmldate(item.updatedDate)}", + "updatedOn": "${formatDateRFC822(item.updatedDate)}", <#if (item.node.properties["blg:published"]?? && item.node.properties["blg:published"] == true)> - "publishedOn": "${xmldate(item.node.properties["blg:posted"])}", - "updatedOn": "${xmldate(item.node.properties["blg:lastUpdate"])}", + "publishedOn": "${formatDateRFC822(item.node.properties["blg:posted"])}", + "updatedOn": "${formatDateRFC822(item.node.properties["blg:lastUpdate"])}", "postId": "${item.node.properties["blg:postId"]!''}", "postLink": "${item.node.properties["blg:link"]!''}", "outOfDate": ${item.outOfDate?string}, @@ -105,4 +105,11 @@ }, "item": <@blogpostJSON item=item /> } - \ No newline at end of file + + +<#function formatDateRFC822 dateItem> + <# local temp=${.locale} --> + <#setting locale="en_US"> + <#return dateItem?datetime?string("EEE, d MMM yyyy HH:mm:ss Z")> + <# setting locale=temp --> + \ No newline at end of file diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/category/category.post.json.ftl b/config/alfresco/templates/webscripts/org/alfresco/repository/category/category.post.json.ftl index 1bd7b22c2e..4bcca57ef5 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/repository/category/category.post.json.ftl +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/category/category.post.json.ftl @@ -1,6 +1,6 @@ { <#if redirect??>"redirect": "${redirect}", - <#if persistedObject??>"persistedObject": "${persistedObject?replace("\t", "")?string}", + <#if persistedObject??>"persistedObject": "${persistedObject.nodeRef?replace("\t", "")?string}", "message": "${msg(messageKey)}", "name": "${name}" } \ No newline at end of file diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/site/site.lib.ftl b/config/alfresco/templates/webscripts/org/alfresco/repository/site/site.lib.ftl index 0e31ca9deb..d92621f184 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/repository/site/site.lib.ftl +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/site/site.lib.ftl @@ -51,6 +51,7 @@ ], + <#nested> "isPublic": ${site.isPublic?string("true", "false")}, "visibility": "${site.visibility}" } diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/site/sites.get.json.ftl b/config/alfresco/templates/webscripts/org/alfresco/repository/site/sites.get.json.ftl index 6f208688e8..e5f5920077 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/repository/site/sites.get.json.ftl +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/site/sites.get.json.ftl @@ -3,7 +3,7 @@ [ <#list sites?sort_by("shortName") as site> <@siteLib.siteJSONManagers site=site roles=roles> - "isMemberOfGroup": ${site.isMemberOfGroup(person.properties.userName)?string}, + "isMemberOfGroup": <#if site.getMembersRoleInfo(person.properties.userName)?has_content>${site.getMembersRoleInfo(person.properties.userName).isMemberOfGroup()?string}<#else>false, <#if site_has_next>, diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/wcm/webproject.put.json.js b/config/alfresco/templates/webscripts/org/alfresco/repository/wcm/webproject.put.json.js index 64cc33cf38..d75757b6dd 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/repository/wcm/webproject.put.json.js +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/wcm/webproject.put.json.js @@ -42,7 +42,7 @@ function main() { if(json.has("isTemplate")) { var isTemplate = json.get("isTemplate"); - webproject.setDescription(isTemplate); + webproject.setTemplate(isTemplate); } // update the web project diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/workflow/workflow.lib.ftl b/config/alfresco/templates/webscripts/org/alfresco/repository/workflow/workflow.lib.ftl index b95e3f954a..d01ee434f5 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/repository/workflow/workflow.lib.ftl +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/workflow/workflow.lib.ftl @@ -4,7 +4,7 @@ { "id": "${task.id}", "url": "${task.url}", - "name": "${task.name}", + "name": "${task.name!""}", "title": "${task.title!""}", "description": "${task.description!""}", "state": "${task.state}", diff --git a/config/alfresco/templates/webscripts/org/alfresco/slingshot/wiki/pagelist.get.json.ftl b/config/alfresco/templates/webscripts/org/alfresco/slingshot/wiki/pagelist.get.json.ftl index 4f7bd9a31d..069fa4dd77 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/slingshot/wiki/pagelist.get.json.ftl +++ b/config/alfresco/templates/webscripts/org/alfresco/slingshot/wiki/pagelist.get.json.ftl @@ -1,62 +1,70 @@ <#macro dateFormat date>${xmldate(date)} <#escape x as jsonUtils.encodeJSONString(x)> { - "totalPages": ${wiki.pages?size?c}, - "permissions": - { - "create": ${wiki.container.hasPermission("CreateChildren")?string} - }, - "pages": - [ - <#if pageMetaOnly> - <#list wiki.pages as p> - <#assign page = p.page> - { - "name": "${p.name}", - "title": "<#if p.title?has_content>${p.title}<#else>${p.name?replace("_", " ")}", - }<#if p_has_next>, - - <#else> - <#list wiki.pages?sort_by(['modified'])?reverse as p> - <#assign node = p.node> - <#assign page = p.page> - { - "name": "${p.name}", - "title": "<#if p.title?has_content>${p.title}<#else>${p.name?replace("_", " ")}", - "text": "${page.contents}", - "tags": [ - <#list p.tags as tag> - "${tag}"<#if tag_has_next>, - - ], - "createdOn": "<@dateFormat p.created />", - <#if p.createdBy??> - <#assign createdBy = (p.createdBy.properties.firstName!"" + " " + p.createdBy.properties.lastName!"")?trim> - <#assign createdByUser = p.createdBy.properties.userName> - <#else> - <#assign createdBy=""> - <#assign createdByUser=""> - - "createdBy": "${createdBy}", - "createdByUser": "${createdByUser}", - "modifiedOn": "<@dateFormat p.modified />", - <#if p.modifiedBy??> - <#assign modifiedBy = (p.modifiedBy.properties.firstName!"" + " " + p.modifiedBy.properties.lastName!"")?trim> - <#assign modifiedByUser = p.modifiedBy.properties.userName> - <#else> - <#assign modifiedBy=""> - <#assign modifiedByUser=""> - - "modifiedBy": "${modifiedBy}", - "modifiedByUser": "${modifiedByUser}", - "permissions": - { - "edit": ${node.hasPermission("Write")?string}, - "delete": ${node.hasPermission("Delete")?string} - } - }<#if p_has_next>, - - - ] + "totalPages": ${wiki.pages?size?c}, + "permissions": + { + "create": ${wiki.container.hasPermission("CreateChildren")?string} + }, + "pages": + [ + <#if pageMetaOnly> + <#list wiki.pages as p> + <#assign page = p.page> + { + "name": "${p.name}", + "title": "<#if p.title?has_content>${p.title}<#else>${p.name?replace("_", " ")}", + }<#if p_has_next>, + + <#else> + <#list wiki.pages?sort_by(['modified'])?reverse as p> + <#assign node = p.node> + <#assign page = p.page> + { + "name": "${p.name}", + "title": "<#if p.title?has_content>${p.title}<#else>${p.name?replace("_", " ")}", + "text": "${page.contents}", + "tags": [ + <#list p.tags as tag> + "${tag}"<#if tag_has_next>, + + ], + "createdOn": "<@dateFormat p.created />", + <#if p.createdBy??> + <#assign createdBy = (p.createdBy.properties.firstName!"" + " " + p.createdBy.properties.lastName!"")?trim> + <#assign createdByUser = p.createdBy.properties.userName> + <#else> + <#assign createdBy=""> + <#assign createdByUser=""> + + "createdBy": "${createdBy}", + "createdByUser": "${createdByUser}", + "modifiedOn": "<@dateFormat p.modified />", + <#if p.modifiedBy??> + <#assign modifiedBy = (p.modifiedBy.properties.firstName!"" + " " + p.modifiedBy.properties.lastName!"")?trim> + <#assign modifiedByUser = p.modifiedBy.properties.userName> + <#else> + <#assign modifiedBy=""> + <#assign modifiedByUser=""> + + "modifiedBy": "${modifiedBy}", + "modifiedByUser": "${modifiedByUser}", + "permissions": + { + "edit": ${node.hasPermission("Write")?string}, + "delete": ${node.hasPermission("Delete")?string} + } + }<#if p_has_next>, + + + ], + "pageTitles": + [ + <#if wiki.pageTitles??> + <#list wiki.pageTitles as title> + "${title}"<#if title_has_next>, + + + ] } diff --git a/config/alfresco/web-scripts-application-context.xml b/config/alfresco/web-scripts-application-context.xml index d4cbdff724..f952cc4806 100644 --- a/config/alfresco/web-scripts-application-context.xml +++ b/config/alfresco/web-scripts-application-context.xml @@ -492,6 +492,7 @@ + @@ -501,6 +502,7 @@ + @@ -510,6 +512,7 @@ + @@ -1056,6 +1059,7 @@ + ${trashcan.MaxSize} children = nodeService.getChildAssocs(archiveRootNode); + List children = nodeService.getChildAssocs(archiveRootNode, null, null, maxSizeView, true); // We must get the sys:archived children in order of their archiving. Comparator archivedNodeSorter = new ArchivedDateComparator(); diff --git a/source/java/org/alfresco/repo/web/scripts/bean/ADMRemoteStore.java b/source/java/org/alfresco/repo/web/scripts/bean/ADMRemoteStore.java index bb86479ef1..af1ad1dcad 100644 --- a/source/java/org/alfresco/repo/web/scripts/bean/ADMRemoteStore.java +++ b/source/java/org/alfresco/repo/web/scripts/bean/ADMRemoteStore.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2012 Alfresco Software Limited. + * Copyright (C) 2005-2013 Alfresco Software Limited. * * This file is part of Alfresco * @@ -26,7 +26,9 @@ import java.io.Writer; import java.net.SocketException; import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Locale; import java.util.Map; @@ -47,6 +49,7 @@ import org.alfresco.query.PagingRequest; import org.alfresco.query.PagingResults; import org.alfresco.repo.content.MimetypeMap; import org.alfresco.repo.model.filefolder.HiddenAspect; +import org.alfresco.repo.policy.BehaviourFilter; import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork; import org.alfresco.repo.security.permissions.AccessDeniedException; @@ -119,6 +122,7 @@ public class ADMRemoteStore extends BaseRemoteStore protected SiteService siteService; protected ContentService contentService; protected HiddenAspect hiddenAspect; + private BehaviourFilter behaviourFilter; /** * Date format pattern used to parse HTTP date headers in RFC 1123 format. @@ -179,7 +183,12 @@ public class ADMRemoteStore extends BaseRemoteStore { this.hiddenAspect = hiddenAspect; } - + + public void setBehaviourFilter(BehaviourFilter behaviourFilter) + { + this.behaviourFilter = behaviourFilter; + } + /** * Gets the last modified timestamp for the document. *

@@ -459,17 +468,30 @@ public class ADMRemoteStore extends BaseRemoteStore { throw new IllegalStateException("Unable to aquire parent folder reference for path: " + path); } - FileInfo fileInfo = fileFolderService.create( - parentFolder.getNodeRef(), encpath.substring(off + 1), ContentModel.TYPE_CONTENT); - Map aspectProperties = new HashMap(1, 1.0f); - aspectProperties.put(ContentModel.PROP_IS_INDEXED, false); - unprotNodeService.addAspect(fileInfo.getNodeRef(), ContentModel.ASPECT_INDEX_CONTROL, aspectProperties); - ContentWriter writer = contentService.getWriter( - fileInfo.getNodeRef(), ContentModel.PROP_CONTENT, true); - writer.guessMimetype(fileInfo.getName()); - writer.putContent(content); - if (logger.isDebugEnabled()) - logger.debug("createDocument: " + fileInfo.toString()); + + // ALF-17729 / ALF-17796 - disable auditable on parent folder + NodeRef parentFolderRef = parentFolder.getNodeRef(); + behaviourFilter.disableBehaviour(parentFolderRef, ContentModel.ASPECT_AUDITABLE); + + try + { + FileInfo fileInfo = fileFolderService.create( + parentFolderRef, encpath.substring(off + 1), ContentModel.TYPE_CONTENT); + Map aspectProperties = new HashMap(1, 1.0f); + aspectProperties.put(ContentModel.PROP_IS_INDEXED, false); + unprotNodeService.addAspect(fileInfo.getNodeRef(), ContentModel.ASPECT_INDEX_CONTROL, aspectProperties); + ContentWriter writer = contentService.getWriter( + fileInfo.getNodeRef(), ContentModel.PROP_CONTENT, true); + writer.guessMimetype(fileInfo.getName()); + writer.putContent(content); + if (logger.isDebugEnabled()) + logger.debug("createDocument: " + fileInfo.toString()); + } + finally + { + behaviourFilter.enableBehaviour(parentFolderRef, ContentModel.ASPECT_AUDITABLE); + } + return null; } }, runAsUser); @@ -532,7 +554,20 @@ public class ADMRemoteStore extends BaseRemoteStore { final NodeRef fileRef = fileInfo.getNodeRef(); this.nodeService.addAspect(fileRef, ContentModel.ASPECT_TEMPORARY, null); - this.nodeService.deleteNode(fileRef); + + // ALF-17729 + NodeRef parentFolderRef = unprotNodeService.getPrimaryParent(fileRef).getParentRef(); + behaviourFilter.disableBehaviour(parentFolderRef, ContentModel.ASPECT_AUDITABLE); + + try + { + this.nodeService.deleteNode(fileRef); + } + finally + { + behaviourFilter.enableBehaviour(parentFolderRef, ContentModel.ASPECT_AUDITABLE); + } + if (logger.isDebugEnabled()) logger.debug("deleteDocument: " + fileInfo.toString()); } @@ -736,11 +771,14 @@ public class ADMRemoteStore extends BaseRemoteStore if (create) { // ensure folders exist down to the specified parent + // ALF-17729 / ALF-17796 - disable auditable on parent folders result = FileFolderUtil.makeFolders( this.fileFolderService, surfConfigRef, isFolder ? pathElements : pathElements.subList(0, pathElements.size() - 1), - ContentModel.TYPE_FOLDER); + ContentModel.TYPE_FOLDER, + behaviourFilter, + new HashSet(Arrays.asList(new QName[]{ContentModel.ASPECT_AUDITABLE}))); } else { diff --git a/source/java/org/alfresco/repo/web/scripts/discussion/DiscussionRestApiTest.java b/source/java/org/alfresco/repo/web/scripts/discussion/DiscussionRestApiTest.java index e2f55c3fff..d259440f35 100644 --- a/source/java/org/alfresco/repo/web/scripts/discussion/DiscussionRestApiTest.java +++ b/source/java/org/alfresco/repo/web/scripts/discussion/DiscussionRestApiTest.java @@ -50,6 +50,7 @@ import org.alfresco.service.transaction.TransactionService; import org.alfresco.util.PropertyMap; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.json.JSONArray; import org.json.JSONObject; import org.springframework.extensions.webscripts.Status; import org.springframework.extensions.webscripts.TestWebScriptServer.DeleteRequest; @@ -1205,4 +1206,35 @@ public class DiscussionRestApiTest extends BaseWebScriptTest assertEquals(1, result.getJSONArray("items").getJSONObject(0).getInt("replyCount")); } + /** + * https://issues.alfresco.com/jira/browse/ALF-17443 reports that site contributors are unable + * to edit replies that they have made. + */ + public void testContributorCanEditReply() throws Exception + { + authenticationComponent.setCurrentUser(USER_ONE); + JSONObject post = createSitePost("Can contributors edit replies?", "The title says it all", Status.STATUS_OK); + NodeRef postNodeRef = new NodeRef(post.getString("nodeRef")); + + authenticationComponent.setCurrentUser(USER_TWO); + JSONObject reply = createReply(postNodeRef, "", "Let's see.", Status.STATUS_OK); + NodeRef replyNodeRef = new NodeRef(reply.getString("nodeRef")); + updateComment(replyNodeRef, "", "Yes I can", Status.STATUS_OK); + + authenticationComponent.setCurrentUser(USER_ONE); + + post = getPost(postNodeRef, Status.STATUS_OK); + assertEquals("Can contributors edit replies?", post.getString("title")); + assertEquals("The title says it all", post.getString("content")); + assertEquals(1, post.getInt("replyCount")); + + JSONObject replies = getReplies(postNodeRef, Status.STATUS_OK); + JSONArray items = replies.getJSONArray("items"); + assertEquals(1, items.length()); + + reply = items.getJSONObject(0); + assertEquals("Yes I can", reply.getString("content")); + + } + } diff --git a/source/java/org/alfresco/repo/web/scripts/discussion/ForumPostPut.java b/source/java/org/alfresco/repo/web/scripts/discussion/ForumPostPut.java index a79b45d7b8..c3394e7f83 100644 --- a/source/java/org/alfresco/repo/web/scripts/discussion/ForumPostPut.java +++ b/source/java/org/alfresco/repo/web/scripts/discussion/ForumPostPut.java @@ -89,15 +89,17 @@ public class ForumPostPut extends AbstractDiscussionWebScript private void doUpdatePost(PostInfo post, TopicInfo topic, WebScriptRequest req, JSONObject json) { + boolean updateTopic = false; // Fetch the details from the JSON - - // Update the titles on the post and it's topic + + // Update the titles on the post and it's topic if (json.containsKey("title")) { String title = (String)json.get("title"); post.setTitle(title); if (title.length() > 0) { + updateTopic = true; topic.setTitle(title); } } @@ -118,10 +120,14 @@ public class ForumPostPut extends AbstractDiscussionWebScript { topic.getTags().addAll(tags); } + updateTopic = true; } // Save the topic and the post - discussionService.updateTopic(topic); + if (updateTopic == true) + { + discussionService.updateTopic(topic); + } discussionService.updatePost(post); } } diff --git a/source/java/org/alfresco/repo/web/scripts/solr/SOLRSerializer.java b/source/java/org/alfresco/repo/web/scripts/solr/SOLRSerializer.java index 28fe1f100a..ad28845912 100644 --- a/source/java/org/alfresco/repo/web/scripts/solr/SOLRSerializer.java +++ b/source/java/org/alfresco/repo/web/scripts/solr/SOLRSerializer.java @@ -128,7 +128,9 @@ import org.springframework.extensions.webscripts.json.JSONUtils; // Treat it as text return new PropertyValue(true, serializeToJSONString(value)); } - else if (propertyDef.isMultiValued()) + DataTypeDefinition dataType = propertyDef.getDataType(); + QName dataTypeName = dataType.getName(); + if (propertyDef.isMultiValued()) { if(!(value instanceof Collection)) { @@ -140,7 +142,28 @@ import org.springframework.extensions.webscripts.json.JSONUtils; JSONArray body = new JSONArray(); for(Serializable o : c) { - body.put(serializeToJSONString(o)); + if(dataTypeName.equals(DataTypeDefinition.MLTEXT)) + { + MLText source = (MLText)o; + JSONArray array = new JSONArray(); + for(Locale locale : source.getLocales()) + { + JSONObject json = new JSONObject(); + json.put("locale", DefaultTypeConverter.INSTANCE.convert(String.class, locale)); + json.put("value", source.getValue(locale)); + array.put(json); + } + body.put(array); + } + else if(dataTypeName.equals(DataTypeDefinition.CONTENT)) + { + throw new RuntimeException("Multi-valued content properties are not supported"); + } + else + { + body.put(serializeToJSONString(o)); + } + } return new PropertyValue(false, body.toString()); @@ -148,8 +171,6 @@ import org.springframework.extensions.webscripts.json.JSONUtils; else { boolean encodeString = true; - DataTypeDefinition dataType = propertyDef.getDataType(); - QName dataTypeName = dataType.getName(); if(dataTypeName.equals(DataTypeDefinition.MLTEXT)) { encodeString = false; diff --git a/source/java/org/alfresco/repo/web/scripts/wiki/WikiPageListGet.java b/source/java/org/alfresco/repo/web/scripts/wiki/WikiPageListGet.java index 6ffd82ea56..27d186bb90 100644 --- a/source/java/org/alfresco/repo/web/scripts/wiki/WikiPageListGet.java +++ b/source/java/org/alfresco/repo/web/scripts/wiki/WikiPageListGet.java @@ -174,6 +174,20 @@ public class WikiPageListGet extends AbstractWikiWebScript wiki.put("pages", items); // Old style wiki.put("container", container); + if (userFiltering) + { + // We need to get all the wiki pages for "My Pages" filter otherwise + // the links for renamed wiki pages won't be rendered correctly, + // which were created by other users + pages = wikiService.listWikiPages(site.getShortName(), paging); + List pageTitles = new ArrayList(pages.getPage().size()); + for (WikiPageInfo page : pages.getPage()) + { + pageTitles.add(page.getTitle()); + } + wiki.put("pageTitles", pageTitles); + } + Map model = new HashMap(); model.put("data", data); // New style model.put("wiki", wiki); diff --git a/source/java/org/alfresco/repo/web/scripts/workflow/AbstractWorkflowRestApiTest.java b/source/java/org/alfresco/repo/web/scripts/workflow/AbstractWorkflowRestApiTest.java index 452bb9f41a..1a40973c12 100644 --- a/source/java/org/alfresco/repo/web/scripts/workflow/AbstractWorkflowRestApiTest.java +++ b/source/java/org/alfresco/repo/web/scripts/workflow/AbstractWorkflowRestApiTest.java @@ -307,13 +307,14 @@ public abstract class AbstractWorkflowRestApiTest extends BaseWebScriptTest // Retrieve tasks using the workflow instance String baseUrl = MessageFormat.format(URL_WORKFLOW_TASKS, workflowId); - // Check returns the completed start task and the current task. + // Check returns the completed start task. String adhocTaskId = task.getId(); - checkTasksMatch(baseUrl, startTaskId, adhocTaskId); + checkTasksMatch(baseUrl, startTaskId); String completedUrl = baseUrl + "?state=" + WorkflowTaskState.COMPLETED; checkTasksMatch(completedUrl, startTaskId); + personManager.setUser(USER2); String inProgressUrl = baseUrl + "?state=" + WorkflowTaskState.IN_PROGRESS; checkTasksMatch(inProgressUrl, adhocTaskId); diff --git a/source/java/org/alfresco/repo/web/scripts/workflow/TaskInstancesGet.java b/source/java/org/alfresco/repo/web/scripts/workflow/TaskInstancesGet.java index d80279d2c5..0053e870cb 100644 --- a/source/java/org/alfresco/repo/web/scripts/workflow/TaskInstancesGet.java +++ b/source/java/org/alfresco/repo/web/scripts/workflow/TaskInstancesGet.java @@ -32,8 +32,9 @@ import javax.servlet.http.HttpServletResponse; import org.alfresco.repo.workflow.WorkflowModel; import org.alfresco.service.cmr.workflow.WorkflowTask; import org.alfresco.service.cmr.workflow.WorkflowTaskQuery; -import org.alfresco.service.cmr.workflow.WorkflowTaskState; import org.alfresco.service.cmr.workflow.WorkflowTaskQuery.OrderBy; +import org.alfresco.service.cmr.workflow.WorkflowTaskState; +import org.alfresco.util.ModelUtil; import org.springframework.extensions.webscripts.Cache; import org.springframework.extensions.webscripts.Status; import org.springframework.extensions.webscripts.WebScriptException; @@ -68,6 +69,12 @@ public class TaskInstancesGet extends AbstractWorkflowWebscript // authority is not included into filters list as it will be taken into account before filtering String authority = getAuthority(req); + if (authority == null) + { + // ALF-11036 fix, if authority argument is omitted the tasks for the current user should be returned. + authority = authenticationService.getCurrentUserName(); + } + // state is also not included into filters list, for the same reason WorkflowTaskState state = getState(req); @@ -120,8 +127,8 @@ public class TaskInstancesGet extends AbstractWorkflowWebscript // no workflow instance id is present so get all tasks if (authority != null) { - List tasks = workflowService.getAssignedTasks(authority, state); - List pooledTasks = workflowService.getPooledTasks(authority); + List tasks = workflowService.getAssignedTasks(authority, state, true); + List pooledTasks = workflowService.getPooledTasks(authority, true); if (pooledTasksOnly != null) { if (pooledTasksOnly.booleanValue()) @@ -159,18 +166,40 @@ public class TaskInstancesGet extends AbstractWorkflowWebscript } } - // filter results + int maxItems = getIntParameter(req, PARAM_MAX_ITEMS, DEFAULT_MAX_ITEMS); + int skipCount = getIntParameter(req, PARAM_SKIP_COUNT, DEFAULT_SKIP_COUNT); + int totalCount = 0; ArrayList> results = new ArrayList>(); - for (WorkflowTask task : allTasks) + + // Filter results + WorkflowTask task = null; + for(int i=0; i= skipCount && (maxItems < 0 || maxItems > results.size())) + { + // Only build the actual detail if it's in the range of items we need. This will + // drastically improve performance over paging after building the model + results.add(modelBuilder.buildSimple(task, properties)); + } } } - + + Map model = new HashMap(); + model.put("taskInstances", results); + + if (maxItems != DEFAULT_MAX_ITEMS || skipCount != DEFAULT_SKIP_COUNT) + { + // maxItems or skipCount parameter was provided so we need to include paging into response + model.put("paging", ModelUtil.buildPaging(totalCount, maxItems == DEFAULT_MAX_ITEMS ? totalCount : maxItems, skipCount)); + } + // create and return results, paginated if necessary - return createResultModel(req, "taskInstances", results); + return model; } /** diff --git a/source/java/org/alfresco/repo/web/scripts/workflow/WorkflowModelBuilder.java b/source/java/org/alfresco/repo/web/scripts/workflow/WorkflowModelBuilder.java index e313257910..848b40530f 100644 --- a/source/java/org/alfresco/repo/web/scripts/workflow/WorkflowModelBuilder.java +++ b/source/java/org/alfresco/repo/web/scripts/workflow/WorkflowModelBuilder.java @@ -192,10 +192,10 @@ public class WorkflowModelBuilder model.put(TASK_PATH, getUrl(task.getPath())); model.put(TASK_OUTCOME, getOutcome(task)); model.put(TASK_IS_POOLED, isPooled(task.getProperties())); - model.put(TASK_IS_EDITABLE, this.workflowService.isTaskEditable(task, currentUser)); - model.put(TASK_IS_REASSIGNABLE, this.workflowService.isTaskReassignable(task, currentUser)); - model.put(TASK_IS_CLAIMABLE, this.workflowService.isTaskClaimable(task, currentUser)); - model.put(TASK_IS_RELEASABLE, this.workflowService.isTaskReleasable(task, currentUser)); + model.put(TASK_IS_EDITABLE, this.workflowService.isTaskEditable(task, currentUser, false)); + model.put(TASK_IS_REASSIGNABLE, this.workflowService.isTaskReassignable(task, currentUser, false)); + model.put(TASK_IS_CLAIMABLE, this.workflowService.isTaskClaimable(task, currentUser, false)); + model.put(TASK_IS_RELEASABLE, this.workflowService.isTaskReleasable(task, currentUser, false)); Serializable owner = task.getProperties().get(ContentModel.PROP_OWNER); model.put(TASK_OWNER, getPersonModel(owner)); diff --git a/source/java/org/alfresco/repo/webdav/DeleteMethod.java b/source/java/org/alfresco/repo/webdav/DeleteMethod.java index 70084e2fe8..c9571850e0 100644 --- a/source/java/org/alfresco/repo/webdav/DeleteMethod.java +++ b/source/java/org/alfresco/repo/webdav/DeleteMethod.java @@ -107,11 +107,11 @@ public class DeleteMethod extends WebDAVMethod implements ActivityPostProducer // MNT-181: working copies and versioned nodes are hidden rather than deleted if (nodeService.hasAspect(nodeRef, ContentModel.ASPECT_WORKING_COPY) || nodeService.hasAspect(nodeRef, ContentModel.ASPECT_VERSIONABLE)) { - setHidden(nodeRef, true); + fileFolderService.setHidden(nodeRef, true); getDAVLockService().unlock(nodeRef); } // We just ensure already-hidden nodes are left unlocked - else if (isHidden(nodeRef)) + else if (fileFolderService.isHidden(nodeRef)) { getDAVLockService().unlock(nodeRef); } diff --git a/source/java/org/alfresco/repo/webdav/MoveMethod.java b/source/java/org/alfresco/repo/webdav/MoveMethod.java index 1c5e4fd20c..90ab31b2ee 100644 --- a/source/java/org/alfresco/repo/webdav/MoveMethod.java +++ b/source/java/org/alfresco/repo/webdav/MoveMethod.java @@ -112,7 +112,7 @@ public class MoveMethod extends HierarchicalMethod if (!destInfo.getNodeRef().equals(sourceInfo.getNodeRef())) { // ALF-7079 fix, if destInfo is a hidden shuffle target then pretend it's not there - destExists = !isHidden(destInfo.getNodeRef()); + destExists = !getFileFolderService().isHidden(destInfo.getNodeRef()); if (!hasOverWrite() && destExists) { if (logger.isDebugEnabled()) @@ -201,14 +201,14 @@ public class MoveMethod extends HierarchicalMethod if (destFileInfo != null) { copyContentOnly(sourceNodeRef, destFileInfo, fileFolderService); - setHidden(destFileInfo.getNodeRef(), false); + fileFolderService.setHidden(destFileInfo.getNodeRef(), false); if (isMove) { if (getDAVHelper().isRenameShuffle(destPath) && !getDAVHelper().isRenameShuffle(sourcePath)) { // if temporary or backup file already exists // don't delete source that is node with version history - setHidden(sourceNodeRef, true); + fileFolderService.setHidden(sourceNodeRef, true); // As per the WebDAV spec, we make sure the node is unlocked once moved getDAVHelper().getLockService().unlock(sourceNodeRef); } @@ -229,7 +229,7 @@ public class MoveMethod extends HierarchicalMethod { destFileInfo = fileFolderService.create(destParentNodeRef, name, ContentModel.TYPE_CONTENT); copyContentOnly(sourceNodeRef, destFileInfo, fileFolderService); - setHidden(sourceNodeRef, true); + fileFolderService.setHidden(sourceNodeRef, true); // As per the WebDAV spec, we make sure the node is unlocked once moved getDAVHelper().getLockService().unlock(sourceNodeRef); diff --git a/source/java/org/alfresco/repo/webdav/PropFindMethod.java b/source/java/org/alfresco/repo/webdav/PropFindMethod.java index 605a2a58bd..c3eb70b908 100644 --- a/source/java/org/alfresco/repo/webdav/PropFindMethod.java +++ b/source/java/org/alfresco/repo/webdav/PropFindMethod.java @@ -36,8 +36,10 @@ import org.alfresco.service.cmr.model.FileFolderService; import org.alfresco.service.cmr.model.FileInfo; import org.alfresco.service.cmr.model.FileNotFoundException; import org.alfresco.service.cmr.repository.ContentData; +import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.datatype.DefaultTypeConverter; import org.alfresco.service.cmr.repository.datatype.TypeConverter; +import org.alfresco.service.namespace.InvalidQNameException; import org.alfresco.service.namespace.QName; import org.dom4j.DocumentHelper; import org.dom4j.io.OutputFormat; @@ -197,7 +199,7 @@ public class PropFindMethod extends WebDAVMethod // A node hidden during a 'shuffle' operation - send a 404 error back to the client, as some Mac clients need // this - if (isHidden(pathNodeInfo.getNodeRef())) + if (getFileFolderService().isHidden(pathNodeInfo.getNodeRef())) { throw new WebDAVServerException(HttpServletResponse.SC_NOT_FOUND); } @@ -429,6 +431,7 @@ public class PropFindMethod extends WebDAVMethod { // Get the properties for the node Map props = nodeInfo.getProperties(); + Map deadProperties = null; // Output the start of the properties element Attributes nullAttr = getDAVHelper().getNullAttributes(); @@ -608,15 +611,23 @@ public class PropFindMethod extends WebDAVMethod else { // Look in the custom properties - - // TODO: Custom properties lookup - // String qualifiedName = propNamespaceUri + WebDAV.NAMESPACE_SEPARATOR + propName; - + +// String qualifiedName = propNamespaceUri + WebDAV.NAMESPACE_SEPARATOR + propName; + String value = (String) nodeInfo.getProperties().get(property.createQName()); if (value == null) { - propertiesNotFound.add(property); - } + if (deadProperties == null) + { + deadProperties = loadDeadProperties(nodeInfo.getNodeRef()); + } + value = deadProperties.get(property.createQName()); + } + + if (value == null) + { + propertiesNotFound.add(property); + } else { if (property.hasNamespaceName()) @@ -945,6 +956,72 @@ public class PropFindMethod extends WebDAVMethod } } + /** + * Loads all dead properties persisted on the node + * + * @param nodeRef + * @return the map of all dead properties + */ + @SuppressWarnings("unchecked") + protected Map loadDeadProperties(NodeRef nodeRef) + { + Map result; + + List deadProperties = (List)getNodeService().getProperty(nodeRef, ContentModel.PROP_DEAD_PROPERTIES); + + if (deadProperties != null) + { + result = new HashMap(deadProperties.size() * 2); + + for (String deadProperty : deadProperties) + { + int last = deadProperty.length() - 1; + int pos = deadProperty.indexOf(QName.NAMESPACE_END); + if (pos == -1 || pos == last) + { + continue; + } + pos = deadProperty.indexOf(':', pos + 1); + if (pos == -1 || pos == last) + { + continue; + } + try + { + result.put(QName.createQName(deadProperty.substring(0, pos)), deadProperty.substring(pos + 1)); + } + catch (InvalidQNameException e) + { + // Skip and continue + } + } + } + else + { + result = new HashMap(7); + } + + return result; + } + + /** + * Persists dead properties for specified resource + * + * @param nodeRef specified resource + * @param deadProperties the properties to persist + */ + protected void persistDeadProperties(NodeRef nodeRef, Map deadProperties) + { + List listToPersist = new ArrayList(deadProperties.size()); + + for (Map.Entry entry: deadProperties.entrySet()) + { + listToPersist.add(entry.getKey().toString() + ':' + entry.getValue()); + } + + getNodeService().setProperty(nodeRef, ContentModel.PROP_DEAD_PROPERTIES, (Serializable)listToPersist); + } + /** * Output the lockentry element of the specified type * @param xml XMLWriter diff --git a/source/java/org/alfresco/repo/webdav/PropPatchMethod.java b/source/java/org/alfresco/repo/webdav/PropPatchMethod.java index bafc0e3437..e3619321c7 100644 --- a/source/java/org/alfresco/repo/webdav/PropPatchMethod.java +++ b/source/java/org/alfresco/repo/webdav/PropPatchMethod.java @@ -1,5 +1,5 @@ -/* - * Copyright (C) 2005-2013 Alfresco Software Limited. +/* + * Copyright (C) 2005-2013 Alfresco Software Limited. * * This file is part of Alfresco * @@ -14,435 +14,464 @@ * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License - * along with Alfresco. If not, see . - */ -package org.alfresco.repo.webdav; - -import java.util.ArrayList; - -import javax.servlet.http.HttpServletResponse; - -import org.alfresco.error.AlfrescoRuntimeException; -import org.alfresco.service.cmr.model.FileInfo; -import org.alfresco.service.cmr.model.FileNotFoundException; -import org.dom4j.DocumentHelper; -import org.dom4j.io.XMLWriter; -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.xml.sax.Attributes; - -/** - * Implements the WebDAV PROPPATCH method - * - * @author Ivan Rybnikov - */ -public class PropPatchMethod extends PropFindMethod -{ - // Properties to patch - protected ArrayList m_propertyActions = null; - private String strHRef; - private WebDAVProperty failedProperty; - private String basePath; - - /** - * @return Returns false always - */ - @Override - protected boolean isReadOnly() - { - return false; - } - - @Override - protected void executeImpl() throws WebDAVServerException, Exception - { - FileInfo pathNodeInfo = null; - try - { - // Check that the path exists - pathNodeInfo = getNodeForPath(getRootNodeRef(), m_strPath); - } - catch (FileNotFoundException e) - { - // The path is not valid - send a 404 error back to the client - throw new WebDAVServerException(HttpServletResponse.SC_NOT_FOUND); - } - - checkNode(pathNodeInfo); - - // Create the path for the current location in the tree - StringBuilder baseBuild = new StringBuilder(256); - baseBuild.append(getPath()); - if (baseBuild.length() == 0 || baseBuild.charAt(baseBuild.length() - 1) != WebDAVHelper.PathSeperatorChar) - { - baseBuild.append(WebDAVHelper.PathSeperatorChar); - } - basePath = baseBuild.toString(); - - // Build the href string for the current node - boolean isFolder = pathNodeInfo.isFolder(); - strHRef = getURLForPath(m_request, basePath, isFolder); - - // Do the real work: patch the properties - patchProperties(pathNodeInfo, basePath); - } - - - @Override - protected void generateResponseImpl() throws Exception - { - m_response.setStatus(WebDAV.WEBDAV_SC_MULTI_STATUS); - - // Set the response content type - m_response.setContentType(WebDAV.XML_CONTENT_TYPE); - - // Create multistatus response - XMLWriter xml = createXMLWriter(); - - xml.startDocument(); - - String nsdec = generateNamespaceDeclarations(m_namespaces); - xml.startElement( - WebDAV.DAV_NS, - WebDAV.XML_MULTI_STATUS + nsdec, - WebDAV.XML_NS_MULTI_STATUS + nsdec, - getDAVHelper().getNullAttributes()); - - // Output the response block for the current node - xml.startElement( - WebDAV.DAV_NS, - WebDAV.XML_RESPONSE, - WebDAV.XML_NS_RESPONSE, - getDAVHelper().getNullAttributes()); - - xml.startElement(WebDAV.DAV_NS, WebDAV.XML_HREF, WebDAV.XML_NS_HREF, getDAVHelper().getNullAttributes()); - xml.write(strHRef); - xml.endElement(WebDAV.DAV_NS, WebDAV.XML_HREF, WebDAV.XML_NS_HREF); - - if (failedProperty != null) - { - generateError(xml); - } - - for (PropertyAction propertyAction : m_propertyActions) - { - WebDAVProperty property = propertyAction.getProperty(); - int statusCode = propertyAction.getStatusCode(); - String statusCodeDescription = propertyAction.getStatusCodeDescription(); - generatePropertyResponse(xml, property, statusCode, statusCodeDescription); - } - - // Close off the response element - xml.endElement(WebDAV.DAV_NS, WebDAV.XML_RESPONSE, WebDAV.XML_NS_RESPONSE); - - // Close the outer XML element - xml.endElement(WebDAV.DAV_NS, WebDAV.XML_MULTI_STATUS, WebDAV.XML_NS_MULTI_STATUS); - - // Send remaining data - flushXML(xml); - } - - - /** - * Parse the request body - * - * @exception WebDAVServerException - */ - @Override - protected void parseRequestBody() throws WebDAVServerException - { - Document body = getRequestBodyAsDocument(); - if (body != null) - { - Element rootElement = body.getDocumentElement(); - NodeList childList = rootElement.getChildNodes(); - - m_propertyActions = new ArrayList(); - - for (int i = 0; i < childList.getLength(); i++) - { - Node currentNode = childList.item(i); - switch (currentNode.getNodeType()) - { - case Node.TEXT_NODE: - break; - case Node.ELEMENT_NODE: - if (currentNode.getNodeName().endsWith(WebDAV.XML_SET) || currentNode.getNodeName().endsWith(WebDAV.XML_REMOVE)) - { - NodeList propertiesList = currentNode.getChildNodes(); - - for (int j = 0; j < propertiesList.getLength(); j++) - { - Node propertiesNode = propertiesList.item(j); - switch (propertiesNode.getNodeType()) - { - case Node.TEXT_NODE: - break; - case Node.ELEMENT_NODE: - if (propertiesNode.getNodeName().endsWith(WebDAV.XML_PROP)) - { - NodeList propList = propertiesNode.getChildNodes(); - - for (int k = 0; k < propList.getLength(); k++) - { - Node propNode = propList.item(k); - switch (propNode.getNodeType()) - { - case Node.TEXT_NODE: - break; - case Node.ELEMENT_NODE: - int action = currentNode.getNodeName().endsWith(WebDAV.XML_SET) ? PropertyAction.SET : PropertyAction.REMOVE; - WebDAVProperty prop = createProperty(propNode); - if (prop != null) - { - m_propertyActions.add(new PropertyAction(action, prop)); - } - break; - } - } - } - break; - } - } - } - break; - } - } - - } - - } - - /** - * Parse the request headers - * - * @exception WebDAVServerException - */ - @Override - protected void parseRequestHeaders() throws WebDAVServerException - { - // Parse Lock tokens and ETags, if any - parseIfHeader(); - } - - /** - * Creates a WebDAVProperty from the given XML node - */ - protected WebDAVProperty createProperty(Node node) - { - WebDAVProperty property = super.createProperty(node); - - String strValue = null; - Node value = node.getFirstChild(); - if (value != null) - { - strValue = value.getNodeValue(); - } - property.setValue(strValue); - - return property; - } - - - protected void patchProperties(FileInfo nodeInfo, String path) throws WebDAVServerException - { - failedProperty = null; - for (PropertyAction action : m_propertyActions) - { - if (action.getProperty().isProtected()) - { - failedProperty = action.getProperty(); - break; - } - } - - for (PropertyAction propertyAction : m_propertyActions) - { - int statusCode; - String statusCodeDescription; - WebDAVProperty property = propertyAction.getProperty(); - - if (failedProperty == null) - { - if (PropertyAction.SET == propertyAction.getAction()) - { - getNodeService().setProperty(nodeInfo.getNodeRef(), property.createQName(), property.getValue()); - } - else if (PropertyAction.REMOVE == propertyAction.getAction()) - { - getNodeService().removeProperty(nodeInfo.getNodeRef(), property.createQName()); - } - else - { - throw new WebDAVServerException(HttpServletResponse.SC_BAD_REQUEST); - } - statusCode = HttpServletResponse.SC_OK; - statusCodeDescription = WebDAV.SC_OK_DESC; - } - else if (failedProperty == property) - { - statusCode = HttpServletResponse.SC_FORBIDDEN; - statusCodeDescription = WebDAV.SC_FORBIDDEN_DESC; - } - else - { - statusCode = WebDAV.WEBDAV_SC_FAILED_DEPENDENCY; - statusCodeDescription = WebDAV.WEBDAV_SC_FAILED_DEPENDENCY_DESC; - } - - propertyAction.setResult(statusCode, statusCodeDescription); - } - } - - - /** - * Generates the XML response for a PROPFIND request that asks for a list of - * all known properties - * - * @param xml XMLWriter - * @param node NodeRef - * @param isDir boolean - */ - protected void generatePropertyResponse(XMLWriter xml, WebDAVProperty property, int status, String description) - { - try - { - // Output the start of the properties element - Attributes nullAttr = getDAVHelper().getNullAttributes(); - - xml.startElement(WebDAV.DAV_NS, WebDAV.XML_PROPSTAT, WebDAV.XML_NS_PROPSTAT, nullAttr); - - // Output property name - xml.startElement(WebDAV.DAV_NS, WebDAV.XML_PROP, WebDAV.XML_NS_PROP, nullAttr); - if (property.hasNamespaceName()) - { - xml.write(DocumentHelper.createElement(property.getNamespaceName() + WebDAV.NAMESPACE_SEPARATOR + property.getName())); - } - else - { - xml.write(DocumentHelper.createElement(property.getName())); - } - xml.endElement(WebDAV.DAV_NS, WebDAV.XML_PROP, WebDAV.XML_NS_PROP); - - // Output action result status - xml.startElement(WebDAV.DAV_NS, WebDAV.XML_STATUS, WebDAV.XML_NS_STATUS, nullAttr); - xml.write(WebDAV.HTTP1_1 + " " + status + " " + description); - xml.endElement(WebDAV.DAV_NS, WebDAV.XML_STATUS, WebDAV.XML_NS_STATUS); - - xml.endElement(WebDAV.DAV_NS, WebDAV.XML_PROPSTAT, WebDAV.XML_NS_PROPSTAT); - } - catch (Exception ex) - { - // Convert to a runtime exception - throw new AlfrescoRuntimeException("XML processing error", ex); - } - } - - - /** - * Generates the error tag - * - * @param xml XMLWriter - */ - protected void generateError(XMLWriter xml) - { - try - { - // Output the start of the error element - Attributes nullAttr = getDAVHelper().getNullAttributes(); - - xml.startElement(WebDAV.DAV_NS, WebDAV.XML_ERROR, WebDAV.XML_NS_ERROR, nullAttr); - // Output error - xml.write(DocumentHelper.createElement(WebDAV.XML_NS_CANNOT_MODIFY_PROTECTED_PROPERTY)); - - xml.endElement(WebDAV.DAV_NS, WebDAV.XML_ERROR, WebDAV.XML_NS_ERROR); - } - catch (Exception ex) - { - // Convert to a runtime exception - throw new AlfrescoRuntimeException("XML processing error", ex); - } - } - - - /** - * Stores information about PROPPATCH action(set or remove) an according property. - * - * @author Ivan Rybnikov - */ - protected class PropertyAction - { - public static final int SET = 0; - public static final int REMOVE = 1; - - // Property on which action should be performed - private WebDAVProperty property; - - // Action - private int action; - - private int statusCode; - - private String statusCodeDescription; - - /** - * Constructor - * - * @param action - * @param property - */ - public PropertyAction(int action, WebDAVProperty property) - { - this.action = action; - this.property = property; - } - - public void setResult(int statusCode, String statusCodeDescription) - { - this.statusCode = statusCode; - this.statusCodeDescription = statusCodeDescription; - } - - public int getStatusCode() - { - return this.statusCode; - } - - public String getStatusCodeDescription() - { - return this.statusCodeDescription; - } - - public int getAction() - { - return action; - } - - public WebDAVProperty getProperty() - { - return property; - } - - public String toString() - { - StringBuilder str = new StringBuilder(); - - str.append("["); - str.append("action="); - str.append(getAction() == 0 ? "SET" : "REMOVE"); - str.append(",property="); - str.append(getProperty()); - str.append(",statusCode="); - str.append(getStatusCode()); - str.append(",statusCodeDescription="); - str.append(getStatusCodeDescription()); - str.append("]"); - - return str.toString(); - } - } - - -} + * along with Alfresco. If not, see . + */ +package org.alfresco.repo.webdav; + +import java.util.ArrayList; +import java.util.Map; + +import javax.servlet.http.HttpServletResponse; + +import org.alfresco.error.AlfrescoRuntimeException; +import org.alfresco.service.cmr.dictionary.PropertyDefinition; +import org.alfresco.service.cmr.model.FileInfo; +import org.alfresco.service.cmr.model.FileNotFoundException; +import org.alfresco.service.namespace.QName; +import org.dom4j.DocumentHelper; +import org.dom4j.io.XMLWriter; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.Attributes; + +/** + * Implements the WebDAV PROPPATCH method + * + * @author Ivan Rybnikov + */ +public class PropPatchMethod extends PropFindMethod +{ + // Properties to patch + protected ArrayList m_propertyActions = null; + private String strHRef; + private WebDAVProperty failedProperty; + private String basePath; + + /** + * @return Returns false always + */ + @Override + protected boolean isReadOnly() + { + return false; + } + + @Override + protected void executeImpl() throws WebDAVServerException, Exception + { + FileInfo pathNodeInfo = null; + try + { + // Check that the path exists + pathNodeInfo = getNodeForPath(getRootNodeRef(), m_strPath); + } + catch (FileNotFoundException e) + { + // The path is not valid - send a 404 error back to the client + throw new WebDAVServerException(HttpServletResponse.SC_NOT_FOUND); + } + + checkNode(pathNodeInfo); + + // Create the path for the current location in the tree + StringBuilder baseBuild = new StringBuilder(256); + baseBuild.append(getPath()); + if (baseBuild.length() == 0 || baseBuild.charAt(baseBuild.length() - 1) != WebDAVHelper.PathSeperatorChar) + { + baseBuild.append(WebDAVHelper.PathSeperatorChar); + } + basePath = baseBuild.toString(); + + // Build the href string for the current node + boolean isFolder = pathNodeInfo.isFolder(); + strHRef = getURLForPath(m_request, basePath, isFolder); + + // Do the real work: patch the properties + patchProperties(pathNodeInfo, basePath); + } + + + @Override + protected void generateResponseImpl() throws Exception + { + m_response.setStatus(WebDAV.WEBDAV_SC_MULTI_STATUS); + + // Set the response content type + m_response.setContentType(WebDAV.XML_CONTENT_TYPE); + + // Create multistatus response + XMLWriter xml = createXMLWriter(); + + xml.startDocument(); + + String nsdec = generateNamespaceDeclarations(m_namespaces); + xml.startElement( + WebDAV.DAV_NS, + WebDAV.XML_MULTI_STATUS + nsdec, + WebDAV.XML_NS_MULTI_STATUS + nsdec, + getDAVHelper().getNullAttributes()); + + // Output the response block for the current node + xml.startElement( + WebDAV.DAV_NS, + WebDAV.XML_RESPONSE, + WebDAV.XML_NS_RESPONSE, + getDAVHelper().getNullAttributes()); + + xml.startElement(WebDAV.DAV_NS, WebDAV.XML_HREF, WebDAV.XML_NS_HREF, getDAVHelper().getNullAttributes()); + xml.write(strHRef); + xml.endElement(WebDAV.DAV_NS, WebDAV.XML_HREF, WebDAV.XML_NS_HREF); + + if (failedProperty != null) + { + generateError(xml); + } + + for (PropertyAction propertyAction : m_propertyActions) + { + WebDAVProperty property = propertyAction.getProperty(); + int statusCode = propertyAction.getStatusCode(); + String statusCodeDescription = propertyAction.getStatusCodeDescription(); + generatePropertyResponse(xml, property, statusCode, statusCodeDescription); + } + + // Close off the response element + xml.endElement(WebDAV.DAV_NS, WebDAV.XML_RESPONSE, WebDAV.XML_NS_RESPONSE); + + // Close the outer XML element + xml.endElement(WebDAV.DAV_NS, WebDAV.XML_MULTI_STATUS, WebDAV.XML_NS_MULTI_STATUS); + + // Send remaining data + flushXML(xml); + } + + + /** + * Parse the request body + * + * @exception WebDAVServerException + */ + @Override + protected void parseRequestBody() throws WebDAVServerException + { + Document body = getRequestBodyAsDocument(); + if (body != null) + { + Element rootElement = body.getDocumentElement(); + NodeList childList = rootElement.getChildNodes(); + + m_propertyActions = new ArrayList(); + + for (int i = 0; i < childList.getLength(); i++) + { + Node currentNode = childList.item(i); + switch (currentNode.getNodeType()) + { + case Node.TEXT_NODE: + break; + case Node.ELEMENT_NODE: + if (currentNode.getNodeName().endsWith(WebDAV.XML_SET) || currentNode.getNodeName().endsWith(WebDAV.XML_REMOVE)) + { + NodeList propertiesList = currentNode.getChildNodes(); + + for (int j = 0; j < propertiesList.getLength(); j++) + { + Node propertiesNode = propertiesList.item(j); + switch (propertiesNode.getNodeType()) + { + case Node.TEXT_NODE: + break; + case Node.ELEMENT_NODE: + if (propertiesNode.getNodeName().endsWith(WebDAV.XML_PROP)) + { + NodeList propList = propertiesNode.getChildNodes(); + + for (int k = 0; k < propList.getLength(); k++) + { + Node propNode = propList.item(k); + switch (propNode.getNodeType()) + { + case Node.TEXT_NODE: + break; + case Node.ELEMENT_NODE: + int action = currentNode.getNodeName().endsWith(WebDAV.XML_SET) ? PropertyAction.SET : PropertyAction.REMOVE; + m_propertyActions.add(new PropertyAction(action, createProperty(propNode))); + break; + } + } + } + break; + } + } + } + break; + } + } + + } + + } + + /** + * Parse the request headers + * + * @exception WebDAVServerException + */ + @Override + protected void parseRequestHeaders() throws WebDAVServerException + { + // Parse Lock tokens and ETags, if any + parseIfHeader(); + } + + /** + * Creates a WebDAVProperty from the given XML node + */ + protected WebDAVProperty createProperty(Node node) + { + WebDAVProperty property = super.createProperty(node); + + String strValue = null; + Node value = node.getFirstChild(); + if (value != null) + { + strValue = value.getNodeValue(); + } + property.setValue(strValue); + + return property; + } + + + protected void patchProperties(FileInfo nodeInfo, String path) throws WebDAVServerException + { + failedProperty = null; + for (PropertyAction action : m_propertyActions) + { + if (action.getProperty().isProtected()) + { + failedProperty = action.getProperty(); + break; + } + } + + Map deadProperties = null; + for (PropertyAction propertyAction : m_propertyActions) + { + int statusCode; + String statusCodeDescription; + WebDAVProperty property = propertyAction.getProperty(); + + if (failedProperty == null) + { + PropertyDefinition propDef = getDAVHelper().getDictionaryService().getProperty(property.createQName()); + + boolean deadProperty = propDef == null || (!propDef.getContainerClass().isAspect() && !getDAVHelper().getDictionaryService().isSubClass(getNodeService().getType(nodeInfo.getNodeRef()), + propDef.getContainerClass().getName())); + + if (deadProperty && deadProperties == null) + { + deadProperties = loadDeadProperties(nodeInfo.getNodeRef()); + } + + if (PropertyAction.SET == propertyAction.getAction()) + { + if (deadProperty) + { + deadProperties.put(property.createQName(), property.getValue()); + } + else + { + getNodeService().setProperty(nodeInfo.getNodeRef(), property.createQName(), property.getValue()); + } + } + else if (PropertyAction.REMOVE == propertyAction.getAction()) + { + if (deadProperty) + { + deadProperties.remove(property.createQName()); + } + else + { + getNodeService().removeProperty(nodeInfo.getNodeRef(), property.createQName()); + } + } + else + { + throw new WebDAVServerException(HttpServletResponse.SC_BAD_REQUEST); + } + statusCode = HttpServletResponse.SC_OK; + statusCodeDescription = WebDAV.SC_OK_DESC; + } + else if (failedProperty == property) + { + statusCode = HttpServletResponse.SC_FORBIDDEN; + statusCodeDescription = WebDAV.SC_FORBIDDEN_DESC; + } + else + { + statusCode = WebDAV.WEBDAV_SC_FAILED_DEPENDENCY; + statusCodeDescription = WebDAV.WEBDAV_SC_FAILED_DEPENDENCY_DESC; + } + + propertyAction.setResult(statusCode, statusCodeDescription); + } + + if (deadProperties != null) + { + persistDeadProperties(nodeInfo.getNodeRef(), deadProperties); + } + } + + + /** + * Generates the XML response for a PROPFIND request that asks for a list of + * all known properties + * + * @param xml XMLWriter + * @param node NodeRef + * @param isDir boolean + */ + protected void generatePropertyResponse(XMLWriter xml, WebDAVProperty property, int status, String description) + { + try + { + // Output the start of the properties element + Attributes nullAttr = getDAVHelper().getNullAttributes(); + + xml.startElement(WebDAV.DAV_NS, WebDAV.XML_PROPSTAT, WebDAV.XML_NS_PROPSTAT, nullAttr); + + // Output property name + xml.startElement(WebDAV.DAV_NS, WebDAV.XML_PROP, WebDAV.XML_NS_PROP, nullAttr); + if (property.hasNamespaceName()) + { + xml.write(DocumentHelper.createElement(property.getNamespaceName() + WebDAV.NAMESPACE_SEPARATOR + property.getName())); + } + else + { + xml.write(DocumentHelper.createElement(property.getName())); + } + xml.endElement(WebDAV.DAV_NS, WebDAV.XML_PROP, WebDAV.XML_NS_PROP); + + // Output action result status + xml.startElement(WebDAV.DAV_NS, WebDAV.XML_STATUS, WebDAV.XML_NS_STATUS, nullAttr); + xml.write(WebDAV.HTTP1_1 + " " + status + " " + description); + xml.endElement(WebDAV.DAV_NS, WebDAV.XML_STATUS, WebDAV.XML_NS_STATUS); + + xml.endElement(WebDAV.DAV_NS, WebDAV.XML_PROPSTAT, WebDAV.XML_NS_PROPSTAT); + } + catch (Exception ex) + { + // Convert to a runtime exception + throw new AlfrescoRuntimeException("XML processing error", ex); + } + } + + + /** + * Generates the error tag + * + * @param xml XMLWriter + */ + protected void generateError(XMLWriter xml) + { + try + { + // Output the start of the error element + Attributes nullAttr = getDAVHelper().getNullAttributes(); + + xml.startElement(WebDAV.DAV_NS, WebDAV.XML_ERROR, WebDAV.XML_NS_ERROR, nullAttr); + // Output error + xml.write(DocumentHelper.createElement(WebDAV.XML_NS_CANNOT_MODIFY_PROTECTED_PROPERTY)); + + xml.endElement(WebDAV.DAV_NS, WebDAV.XML_ERROR, WebDAV.XML_NS_ERROR); + } + catch (Exception ex) + { + // Convert to a runtime exception + throw new AlfrescoRuntimeException("XML processing error", ex); + } + } + + + /** + * Stores information about PROPPATCH action(set or remove) an according property. + * + * @author Ivan Rybnikov + */ + protected class PropertyAction + { + public static final int SET = 0; + public static final int REMOVE = 1; + + // Property on which action should be performed + private WebDAVProperty property; + + // Action + private int action; + + private int statusCode; + + private String statusCodeDescription; + + /** + * Constructor + * + * @param action + * @param property + */ + public PropertyAction(int action, WebDAVProperty property) + { + this.action = action; + this.property = property; + } + + public void setResult(int statusCode, String statusCodeDescription) + { + this.statusCode = statusCode; + this.statusCodeDescription = statusCodeDescription; + } + + public int getStatusCode() + { + return this.statusCode; + } + + public String getStatusCodeDescription() + { + return this.statusCodeDescription; + } + + public int getAction() + { + return action; + } + + public WebDAVProperty getProperty() + { + return property; + } + + public String toString() + { + StringBuilder str = new StringBuilder(); + + str.append("["); + str.append("action="); + str.append(getAction() == 0 ? "SET" : "REMOVE"); + str.append(",property="); + str.append(getProperty()); + str.append(",statusCode="); + str.append(getStatusCode()); + str.append(",statusCodeDescription="); + str.append(getStatusCodeDescription()); + str.append("]"); + + return str.toString(); + } + } + + +} diff --git a/source/java/org/alfresco/repo/webdav/PutMethod.java b/source/java/org/alfresco/repo/webdav/PutMethod.java index 5a8716c2b3..75893c2397 100644 --- a/source/java/org/alfresco/repo/webdav/PutMethod.java +++ b/source/java/org/alfresco/repo/webdav/PutMethod.java @@ -168,9 +168,9 @@ public class PutMethod extends WebDAVMethod implements ActivityPostProducer // 'Unhide' nodes hidden by us and behave as though we created them NodeRef contentNodeRef = contentNodeInfo.getNodeRef(); - if (isHidden(contentNodeRef) && !getDAVHelper().isRenameShuffle(getPath())) + if (fileFolderService.isHidden(contentNodeRef) && !getDAVHelper().isRenameShuffle(getPath())) { - setHidden(contentNodeRef, false); + fileFolderService.setHidden(contentNodeRef, false); created = true; } } @@ -239,7 +239,7 @@ public class PutMethod extends WebDAVMethod implements ActivityPostProducer disabledVersioning = true; } // ALF-16756: To avoid firing inbound rules too early (while a node is still locked) apply the no content aspect - if (nodeLockInfo != null && nodeLockInfo.isExclusive() && !ContentData.hasContent(contentData)) + if (nodeLockInfo != null && nodeLockInfo.isExclusive() && !(ContentData.hasContent(contentData) && contentData.getSize() > 0)) { getNodeService().addAspect(contentNodeInfo.getNodeRef(), ContentModel.ASPECT_NO_CONTENT, null); } diff --git a/source/java/org/alfresco/repo/webdav/WebDAVMethod.java b/source/java/org/alfresco/repo/webdav/WebDAVMethod.java index 846d24e268..baa26f6ca9 100644 --- a/source/java/org/alfresco/repo/webdav/WebDAVMethod.java +++ b/source/java/org/alfresco/repo/webdav/WebDAVMethod.java @@ -996,37 +996,6 @@ public abstract class WebDAVMethod return ns.toString(); } - protected void setHidden(NodeRef nodeRef, boolean isHidden) - { - int mask = 0; - boolean allVisible = true; - Visibility webDavVisibility = isHidden ? Visibility.NotVisible : Visibility.Visible; - HiddenAspect hiddenAspect = m_davHelper.getHiddenAspect(); - for (Client client : hiddenAspect.getClients()) - { - Visibility clientVisibility = client == FileFilterMode.getClient() ? webDavVisibility : hiddenAspect - .getVisibility(client, nodeRef); - if (clientVisibility != Visibility.Visible) - { - allVisible = false; - } - mask |= hiddenAspect.getClientVisibilityMask(client, clientVisibility); - } - if (allVisible) - { - getNodeService().removeAspect(nodeRef, ContentModel.ASPECT_HIDDEN); - } - else - { - hiddenAspect.hideNode(nodeRef, mask); - } - } - - protected boolean isHidden(NodeRef nodeRef) - { - return m_davHelper.getHiddenAspect().getVisibility(FileFilterMode.getClient(), nodeRef) != Visibility.Visible; - } - /** * Checks if write operation can be performed on node. *