mirror of
				https://github.com/Alfresco/alfresco-community-repo.git
				synced 2025-10-29 15:21:53 +00:00 
			
		
		
		
	Compare commits
	
		
			44 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					dfa94fbe21 | ||
| 
						 | 
					4a93aec66b | ||
| 
						 | 
					3f0bbc9844 | ||
| 
						 | 
					cb9ad42101 | ||
| 
						 | 
					ca385b3bbc | ||
| 
						 | 
					19c1582f1e | ||
| 
						 | 
					06a918b082 | ||
| 
						 | 
					f543de9959 | ||
| 
						 | 
					8124279e6a | ||
| 
						 | 
					4281fd5b2d | ||
| 
						 | 
					d10d88306b | ||
| 
						 | 
					1d7a37cd8c | ||
| 
						 | 
					4bcb795452 | ||
| 
						 | 
					393b064918 | ||
| 
						 | 
					f741f2ca45 | ||
| 
						 | 
					ef676f11e4 | ||
| 
						 | 
					478c81fee3 | ||
| 
						 | 
					cf9cc8042d | ||
| 
						 | 
					8d790ed1cb | ||
| 
						 | 
					87c7bd2877 | ||
| 
						 | 
					9125f889b0 | ||
| 
						 | 
					2fb74d2691 | ||
| 
						 | 
					d671162dae | ||
| 
						 | 
					bfaa629da7 | ||
| 
						 | 
					719d73a558 | ||
| 
						 | 
					a2aa867f3f | ||
| 
						 | 
					8d745c536a | ||
| 
						 | 
					b0f4c21ae3 | ||
| 
						 | 
					72494e34fa | ||
| 
						 | 
					792b7024ea | ||
| 
						 | 
					40a1371f0d | ||
| 
						 | 
					c22c47e63f | ||
| 
						 | 
					232299d42d | ||
| 
						 | 
					aca7969849 | ||
| 
						 | 
					4ab2bbd3d6 | ||
| 
						 | 
					f68f02372d | ||
| 
						 | 
					9b0eedc8c1 | ||
| 
						 | 
					f164dedcee | ||
| 
						 | 
					9cdaa0a265 | ||
| 
						 | 
					ef034e596b | ||
| 
						 | 
					1251081a69 | ||
| 
						 | 
					2d16eb6f42 | ||
| 
						 | 
					e577134875 | ||
| 
						 | 
					510eadd565 | 
@@ -7,7 +7,7 @@
 | 
			
		||||
   <parent>
 | 
			
		||||
      <groupId>org.alfresco</groupId>
 | 
			
		||||
      <artifactId>alfresco-community-repo-amps</artifactId>
 | 
			
		||||
      <version>23.6.0.21</version>
 | 
			
		||||
      <version>23.7.0.1</version>
 | 
			
		||||
   </parent>
 | 
			
		||||
 | 
			
		||||
   <modules>
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
   <parent>
 | 
			
		||||
      <groupId>org.alfresco</groupId>
 | 
			
		||||
      <artifactId>alfresco-governance-services-community-parent</artifactId>
 | 
			
		||||
      <version>23.6.0.21</version>
 | 
			
		||||
      <version>23.7.0.1</version>
 | 
			
		||||
   </parent>
 | 
			
		||||
 | 
			
		||||
   <modules>
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
   <parent>
 | 
			
		||||
      <groupId>org.alfresco</groupId>
 | 
			
		||||
      <artifactId>alfresco-governance-services-automation-community-repo</artifactId>
 | 
			
		||||
      <version>23.6.0.21</version>
 | 
			
		||||
      <version>23.7.0.1</version>
 | 
			
		||||
   </parent>
 | 
			
		||||
 | 
			
		||||
   <build>
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
   <parent>
 | 
			
		||||
      <groupId>org.alfresco</groupId>
 | 
			
		||||
      <artifactId>alfresco-governance-services-community-parent</artifactId>
 | 
			
		||||
      <version>23.6.0.21</version>
 | 
			
		||||
      <version>23.7.0.1</version>
 | 
			
		||||
   </parent>
 | 
			
		||||
 | 
			
		||||
   <modules>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +1,3 @@
 | 
			
		||||
SOLR6_TAG=2.0.13
 | 
			
		||||
SOLR6_TAG=2.0.17
 | 
			
		||||
POSTGRES_TAG=15.4
 | 
			
		||||
ACTIVEMQ_TAG=5.18.3-jre17-rockylinux8
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@
 | 
			
		||||
   <parent>
 | 
			
		||||
      <groupId>org.alfresco</groupId>
 | 
			
		||||
      <artifactId>alfresco-governance-services-community-repo-parent</artifactId>
 | 
			
		||||
      <version>23.6.0.21</version>
 | 
			
		||||
      <version>23.7.0.1</version>
 | 
			
		||||
   </parent>
 | 
			
		||||
 | 
			
		||||
   <properties>
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
 | 
			
		||||
# Version label
 | 
			
		||||
version.major=23
 | 
			
		||||
version.minor=6
 | 
			
		||||
version.minor=7
 | 
			
		||||
version.revision=0
 | 
			
		||||
version.label=
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
    <parent>
 | 
			
		||||
        <groupId>org.alfresco</groupId>
 | 
			
		||||
        <artifactId>alfresco-governance-services-community-repo-parent</artifactId>
 | 
			
		||||
        <version>23.6.0.21</version>
 | 
			
		||||
        <version>23.7.0.1</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
 | 
			
		||||
    <build>
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
    <parent>
 | 
			
		||||
        <groupId>org.alfresco</groupId>
 | 
			
		||||
        <artifactId>alfresco-community-repo</artifactId>
 | 
			
		||||
        <version>23.6.0.21</version>
 | 
			
		||||
        <version>23.7.0.1</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
 | 
			
		||||
    <modules>
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@
 | 
			
		||||
    <parent>
 | 
			
		||||
        <groupId>org.alfresco</groupId>
 | 
			
		||||
        <artifactId>alfresco-community-repo-amps</artifactId>
 | 
			
		||||
        <version>23.6.0.21</version>
 | 
			
		||||
        <version>23.7.0.1</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
 | 
			
		||||
    <properties>
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
   <parent>
 | 
			
		||||
      <groupId>org.alfresco</groupId>
 | 
			
		||||
      <artifactId>alfresco-community-repo</artifactId>
 | 
			
		||||
      <version>23.6.0.21</version>
 | 
			
		||||
      <version>23.7.0.1</version>
 | 
			
		||||
   </parent>
 | 
			
		||||
 | 
			
		||||
   <dependencies>
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
    <parent>
 | 
			
		||||
        <groupId>org.alfresco</groupId>
 | 
			
		||||
        <artifactId>alfresco-community-repo</artifactId>
 | 
			
		||||
        <version>23.6.0.21</version>
 | 
			
		||||
        <version>23.7.0.1</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
 | 
			
		||||
    <properties>
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
    <parent>
 | 
			
		||||
        <groupId>org.alfresco</groupId>
 | 
			
		||||
        <artifactId>alfresco-community-repo</artifactId>
 | 
			
		||||
        <version>23.6.0.21</version>
 | 
			
		||||
        <version>23.7.0.1</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
 | 
			
		||||
    <dependencies>
 | 
			
		||||
 
 | 
			
		||||
@@ -9,6 +9,6 @@
 | 
			
		||||
    <parent>
 | 
			
		||||
        <groupId>org.alfresco</groupId>
 | 
			
		||||
        <artifactId>alfresco-community-repo-packaging</artifactId>
 | 
			
		||||
        <version>23.6.0.21</version>
 | 
			
		||||
        <version>23.7.0.1</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
</project>
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
    <parent>
 | 
			
		||||
        <groupId>org.alfresco</groupId>
 | 
			
		||||
        <artifactId>alfresco-community-repo-packaging</artifactId>
 | 
			
		||||
        <version>23.6.0.21</version>
 | 
			
		||||
        <version>23.7.0.1</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
 | 
			
		||||
    <properties>
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
    <parent>
 | 
			
		||||
        <groupId>org.alfresco</groupId>
 | 
			
		||||
        <artifactId>alfresco-community-repo</artifactId>
 | 
			
		||||
        <version>23.6.0.21</version>
 | 
			
		||||
        <version>23.7.0.1</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
 | 
			
		||||
    <modules>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +1,3 @@
 | 
			
		||||
SOLR6_TAG=2.0.13
 | 
			
		||||
SOLR6_TAG=2.0.17
 | 
			
		||||
POSTGRES_TAG=15.4
 | 
			
		||||
ACTIVEMQ_TAG=5.18.3-jre17-rockylinux8
 | 
			
		||||
 
 | 
			
		||||
@@ -6,7 +6,7 @@
 | 
			
		||||
    <parent>
 | 
			
		||||
        <groupId>org.alfresco</groupId>
 | 
			
		||||
        <artifactId>alfresco-community-repo-packaging</artifactId>
 | 
			
		||||
        <version>23.6.0.21</version>
 | 
			
		||||
        <version>23.7.0.1</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
 | 
			
		||||
    <modules>
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
    <parent>
 | 
			
		||||
        <groupId>org.alfresco</groupId>
 | 
			
		||||
        <artifactId>alfresco-community-repo-tests</artifactId>
 | 
			
		||||
        <version>23.6.0.21</version>
 | 
			
		||||
        <version>23.7.0.1</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
 | 
			
		||||
    <organization>
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,7 @@
 | 
			
		||||
    <parent>
 | 
			
		||||
        <groupId>org.alfresco</groupId>
 | 
			
		||||
        <artifactId>alfresco-community-repo-tests</artifactId>
 | 
			
		||||
        <version>23.6.0.21</version>
 | 
			
		||||
        <version>23.7.0.1</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
 | 
			
		||||
    <developers>
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,7 @@
 | 
			
		||||
    <parent>
 | 
			
		||||
        <groupId>org.alfresco</groupId>
 | 
			
		||||
        <artifactId>alfresco-community-repo-tests</artifactId>
 | 
			
		||||
        <version>23.6.0.21</version>
 | 
			
		||||
        <version>23.7.0.1</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
 | 
			
		||||
    <developers>
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@
 | 
			
		||||
    <parent>
 | 
			
		||||
        <groupId>org.alfresco</groupId>
 | 
			
		||||
        <artifactId>alfresco-community-repo-tests</artifactId>
 | 
			
		||||
        <version>23.6.0.21</version>
 | 
			
		||||
        <version>23.7.0.1</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
 | 
			
		||||
    <properties>
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,7 @@
 | 
			
		||||
    <parent>
 | 
			
		||||
        <groupId>org.alfresco</groupId>
 | 
			
		||||
        <artifactId>alfresco-community-repo-tests</artifactId>
 | 
			
		||||
        <version>23.6.0.21</version>
 | 
			
		||||
        <version>23.7.0.1</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
 | 
			
		||||
    <developers>
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
    <parent>
 | 
			
		||||
        <groupId>org.alfresco</groupId>
 | 
			
		||||
        <artifactId>alfresco-community-repo-packaging</artifactId>
 | 
			
		||||
        <version>23.6.0.21</version>
 | 
			
		||||
        <version>23.7.0.1</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
 | 
			
		||||
    <properties>
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										32
									
								
								pom.xml
									
									
									
									
									
								
							
							
						
						
									
										32
									
								
								pom.xml
									
									
									
									
									
								
							@@ -2,7 +2,7 @@
 | 
			
		||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 | 
			
		||||
    <modelVersion>4.0.0</modelVersion>
 | 
			
		||||
    <artifactId>alfresco-community-repo</artifactId>
 | 
			
		||||
    <version>23.6.0.21</version>
 | 
			
		||||
    <version>23.7.0.1</version>
 | 
			
		||||
    <packaging>pom</packaging>
 | 
			
		||||
    <name>Alfresco Community Repo Parent</name>
 | 
			
		||||
 | 
			
		||||
@@ -24,7 +24,7 @@
 | 
			
		||||
 | 
			
		||||
    <properties>
 | 
			
		||||
        <acs.version.major>23</acs.version.major>
 | 
			
		||||
        <acs.version.minor>6</acs.version.minor>
 | 
			
		||||
        <acs.version.minor>7</acs.version.minor>
 | 
			
		||||
        <acs.version.revision>0</acs.version.revision>
 | 
			
		||||
        <acs.version.label />
 | 
			
		||||
        <amp.min.version>${acs.version.major}.0.0</amp.min.version>
 | 
			
		||||
@@ -51,14 +51,14 @@
 | 
			
		||||
        <dependency.alfresco-server-root.version>7.0.1</dependency.alfresco-server-root.version>
 | 
			
		||||
        <dependency.activiti-engine.version>5.23.0</dependency.activiti-engine.version>
 | 
			
		||||
        <dependency.activiti.version>5.23.0</dependency.activiti.version>
 | 
			
		||||
        <dependency.alfresco-transform-core.version>5.2.2-A.1</dependency.alfresco-transform-core.version>
 | 
			
		||||
        <dependency.alfresco-transform-service.version>4.2.2-A.1</dependency.alfresco-transform-service.version>
 | 
			
		||||
        <dependency.alfresco-transform-core.version>5.2.2</dependency.alfresco-transform-core.version>
 | 
			
		||||
        <dependency.alfresco-transform-service.version>4.2.2</dependency.alfresco-transform-service.version>
 | 
			
		||||
        <dependency.alfresco-greenmail.version>7.0</dependency.alfresco-greenmail.version>
 | 
			
		||||
        <dependency.acs-event-model.version>0.0.33</dependency.acs-event-model.version>
 | 
			
		||||
 | 
			
		||||
        <dependency.aspectj.version>1.9.22.1</dependency.aspectj.version>
 | 
			
		||||
        <dependency.spring.version>6.2.8</dependency.spring.version>
 | 
			
		||||
        <dependency.spring-security.version>6.3.9</dependency.spring-security.version>
 | 
			
		||||
        <dependency.spring.version>6.2.11</dependency.spring.version>
 | 
			
		||||
        <dependency.spring-security.version>6.4.11</dependency.spring-security.version>
 | 
			
		||||
        <dependency.antlr.version>3.5.3</dependency.antlr.version>
 | 
			
		||||
        <dependency.jackson.version>2.17.2</dependency.jackson.version>
 | 
			
		||||
        <dependency.cxf.version>4.1.2</dependency.cxf.version>
 | 
			
		||||
@@ -81,7 +81,7 @@
 | 
			
		||||
        <dependency.slf4j.version>2.0.16</dependency.slf4j.version>
 | 
			
		||||
        <dependency.log4j.version>2.23.1</dependency.log4j.version>
 | 
			
		||||
        <dependency.groovy.version>3.0.22</dependency.groovy.version>
 | 
			
		||||
        <dependency.tika.version>2.9.2</dependency.tika.version>
 | 
			
		||||
        <dependency.tika.version>3.2.3</dependency.tika.version>
 | 
			
		||||
        <dependency.truezip.version>7.7.10</dependency.truezip.version>
 | 
			
		||||
        <dependency.poi.version>5.4.1</dependency.poi.version>
 | 
			
		||||
        <dependency.jboss.logging.version>3.5.0.Final</dependency.jboss.logging.version>
 | 
			
		||||
@@ -113,7 +113,7 @@
 | 
			
		||||
        <dependency.jakarta-json-path.version>2.9.0</dependency.jakarta-json-path.version>
 | 
			
		||||
        <dependency.json-smart.version>2.5.2</dependency.json-smart.version>
 | 
			
		||||
        <alfresco.googledrive.version>4.1.0</alfresco.googledrive.version>
 | 
			
		||||
        <alfresco.aos-module.version>3.3.0</alfresco.aos-module.version>
 | 
			
		||||
        <alfresco.aos-module.version>3.4.0</alfresco.aos-module.version>
 | 
			
		||||
        <alfresco.api-explorer.version>23.4.0</alfresco.api-explorer.version> <!-- Also in alfresco-enterprise-share -->
 | 
			
		||||
 | 
			
		||||
        <alfresco.maven-plugin.version>2.2.0</alfresco.maven-plugin.version>
 | 
			
		||||
@@ -154,7 +154,7 @@
 | 
			
		||||
        <connection>scm:git:https://github.com/Alfresco/alfresco-community-repo.git</connection>
 | 
			
		||||
        <developerConnection>scm:git:https://github.com/Alfresco/alfresco-community-repo.git</developerConnection>
 | 
			
		||||
        <url>https://github.com/Alfresco/alfresco-community-repo</url>
 | 
			
		||||
        <tag>23.6.0.21</tag>
 | 
			
		||||
        <tag>23.7.0.1</tag>
 | 
			
		||||
    </scm>
 | 
			
		||||
 | 
			
		||||
    <distributionManagement>
 | 
			
		||||
@@ -170,6 +170,12 @@
 | 
			
		||||
 | 
			
		||||
    <dependencyManagement>
 | 
			
		||||
        <dependencies>
 | 
			
		||||
            <!-- v1.10 has 0BSD license it must be consulted with Legal -->
 | 
			
		||||
            <dependency>
 | 
			
		||||
                <groupId>org.tukaani</groupId>
 | 
			
		||||
                <artifactId>xz</artifactId>
 | 
			
		||||
                <version>1.9</version>
 | 
			
		||||
            </dependency>
 | 
			
		||||
            <!-- Jakarta... -->
 | 
			
		||||
            <dependency>
 | 
			
		||||
                <groupId>jakarta.xml.bind</groupId>
 | 
			
		||||
@@ -1132,16 +1138,10 @@
 | 
			
		||||
                                            <exclude>jakarta.xml.soap:jakarta.xml.soap-api:(, 2.0.1)</exclude>
 | 
			
		||||
                                            <exclude>jakarta.jws:jakarta.jws-api:(, 3.0.0)</exclude>
 | 
			
		||||
<!--                                            Enforce ban bouncycastle dependencies other than specified under <includes> section-->
 | 
			
		||||
                                            <exclude>org.bouncycastle</exclude>
 | 
			
		||||
                                            <exclude>org.bouncycastle:(,1.81)</exclude>
 | 
			
		||||
<!--                                            Enforce one version of Jaxb-->
 | 
			
		||||
                                            <exclude>com.sun.xml.bind</exclude>
 | 
			
		||||
                                        </excludes>
 | 
			
		||||
                                        <includes>
 | 
			
		||||
                                            <include>org.bouncycastle:bcprov-jdk18on:[1.78.1,)</include>
 | 
			
		||||
                                            <include>org.bouncycastle:bcmail-jdk18on:[1.78.1,)</include>
 | 
			
		||||
                                            <include>org.bouncycastle:bcpkix-jdk18on:[1.78.1,)</include>
 | 
			
		||||
                                            <include>org.bouncycastle:bcutil-jdk18on:[1.78.1,)</include>
 | 
			
		||||
                                        </includes>
 | 
			
		||||
                                    </bannedDependencies>
 | 
			
		||||
                                </rules>
 | 
			
		||||
                                <fail>true</fail>
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
    <parent>
 | 
			
		||||
        <groupId>org.alfresco</groupId>
 | 
			
		||||
        <artifactId>alfresco-community-repo</artifactId>
 | 
			
		||||
        <version>23.6.0.21</version>
 | 
			
		||||
        <version>23.7.0.1</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
 | 
			
		||||
    <dependencies>
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 * #%L
 | 
			
		||||
 * Alfresco Remote API
 | 
			
		||||
 * %%
 | 
			
		||||
 * Copyright (C) 2005 - 2016 Alfresco Software Limited
 | 
			
		||||
 * Copyright (C) 2005 - 2025 Alfresco Software Limited
 | 
			
		||||
 * %%
 | 
			
		||||
 * This file is part of the Alfresco software. 
 | 
			
		||||
 * If the software was purchased under a paid Alfresco license, the terms of 
 | 
			
		||||
@@ -31,6 +31,14 @@ import java.util.HashMap;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
import org.apache.commons.lang3.StringUtils;
 | 
			
		||||
import org.json.simple.JSONObject;
 | 
			
		||||
import org.owasp.html.PolicyFactory;
 | 
			
		||||
import org.owasp.html.Sanitizers;
 | 
			
		||||
import org.springframework.extensions.webscripts.Cache;
 | 
			
		||||
import org.springframework.extensions.webscripts.Status;
 | 
			
		||||
import org.springframework.extensions.webscripts.WebScriptRequest;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.model.ContentModel;
 | 
			
		||||
import org.alfresco.model.ForumModel;
 | 
			
		||||
import org.alfresco.repo.content.MimetypeMap;
 | 
			
		||||
@@ -44,10 +52,6 @@ import org.alfresco.service.cmr.security.PermissionService;
 | 
			
		||||
import org.alfresco.service.namespace.NamespaceService;
 | 
			
		||||
import org.alfresco.service.namespace.QName;
 | 
			
		||||
import org.alfresco.service.namespace.RegexQNamePattern;
 | 
			
		||||
import org.json.simple.JSONObject;
 | 
			
		||||
import org.springframework.extensions.webscripts.Cache;
 | 
			
		||||
import org.springframework.extensions.webscripts.Status;
 | 
			
		||||
import org.springframework.extensions.webscripts.WebScriptRequest;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This class is the controller for the comments.post web script.
 | 
			
		||||
@@ -58,7 +62,7 @@ import org.springframework.extensions.webscripts.WebScriptRequest;
 | 
			
		||||
public class CommentsPost extends AbstractCommentsWebScript
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
     *  Overrides AbstractCommentsWebScript to add comment
 | 
			
		||||
     * Overrides AbstractCommentsWebScript to add comment
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    protected Map<String, Object> executeImpl(NodeRef nodeRef, WebScriptRequest req, Status status, Cache cache)
 | 
			
		||||
@@ -66,6 +70,19 @@ public class CommentsPost extends AbstractCommentsWebScript
 | 
			
		||||
        // get json object from request
 | 
			
		||||
        JSONObject json = parseJSON(req);
 | 
			
		||||
 | 
			
		||||
        // Validating and Sanitizing comment content to prevent XSS
 | 
			
		||||
        String commentContent = getOrNull(json, "content");
 | 
			
		||||
        if (StringUtils.isBlank(commentContent))
 | 
			
		||||
        {
 | 
			
		||||
            throw new IllegalArgumentException("Comment content must not be empty");
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            PolicyFactory policy = Sanitizers.FORMATTING.and(Sanitizers.LINKS);
 | 
			
		||||
            String safeContent = policy.sanitize(commentContent);
 | 
			
		||||
            json.replace("content", safeContent);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /* MNT-10231, MNT-9771 fix */
 | 
			
		||||
        this.behaviourFilter.disableBehaviour(nodeRef, ContentModel.ASPECT_AUDITABLE);
 | 
			
		||||
 | 
			
		||||
@@ -99,32 +116,32 @@ public class CommentsPost extends AbstractCommentsWebScript
 | 
			
		||||
    {
 | 
			
		||||
        // fetch the parent to add the node to
 | 
			
		||||
        NodeRef commentsFolder = getOrCreateCommentsFolder(nodeRef);
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        // get a unique name
 | 
			
		||||
        String name = getUniqueChildName("comment");
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        // create the comment
 | 
			
		||||
        NodeRef commentNodeRef = nodeService.createNode(commentsFolder, 
 | 
			
		||||
                ContentModel.ASSOC_CONTAINS, 
 | 
			
		||||
                QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, QName.createValidLocalName(name)), 
 | 
			
		||||
        NodeRef commentNodeRef = nodeService.createNode(commentsFolder,
 | 
			
		||||
                ContentModel.ASSOC_CONTAINS,
 | 
			
		||||
                QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, QName.createValidLocalName(name)),
 | 
			
		||||
                ForumModel.TYPE_POST).getChildRef();
 | 
			
		||||
            
 | 
			
		||||
 | 
			
		||||
        // fetch the title required to create a comment
 | 
			
		||||
        String title = getOrNull(json, JSON_KEY_TITLE);
 | 
			
		||||
        HashMap<QName, Serializable> props = new HashMap<QName, Serializable>(1, 1.0f);
 | 
			
		||||
        props.put(ContentModel.PROP_TITLE, title != null ? title : "");
 | 
			
		||||
        nodeService.addProperties(commentNodeRef, props);
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        ContentWriter writer = contentService.getWriter(commentNodeRef, ContentModel.PROP_CONTENT, true);
 | 
			
		||||
        // fetch the content of a comment
 | 
			
		||||
        String contentString = getOrNull(json, JSON_KEY_CONTENT);
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        writer.setMimetype(MimetypeMap.MIMETYPE_HTML);
 | 
			
		||||
        writer.putContent(contentString);
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        return commentNodeRef;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * generates an comment item value
 | 
			
		||||
     * 
 | 
			
		||||
@@ -134,34 +151,34 @@ public class CommentsPost extends AbstractCommentsWebScript
 | 
			
		||||
    private Map<String, Object> generateItemValue(NodeRef commentNodeRef)
 | 
			
		||||
    {
 | 
			
		||||
        Map<String, Object> result = new HashMap<String, Object>(4, 1.0f);
 | 
			
		||||
        
 | 
			
		||||
        String creator = (String)this.nodeService.getProperty(commentNodeRef, ContentModel.PROP_CREATOR);
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        String creator = (String) this.nodeService.getProperty(commentNodeRef, ContentModel.PROP_CREATOR);
 | 
			
		||||
 | 
			
		||||
        Serializable created = this.nodeService.getProperty(commentNodeRef, ContentModel.PROP_CREATED);
 | 
			
		||||
        Serializable modified = this.nodeService.getProperty(commentNodeRef, ContentModel.PROP_MODIFIED);
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        boolean isUpdated = false;
 | 
			
		||||
        if (created instanceof Date && modified instanceof Date)
 | 
			
		||||
        {
 | 
			
		||||
           isUpdated = ((Date)modified).getTime() - ((Date)created).getTime() > 5000;
 | 
			
		||||
            isUpdated = ((Date) modified).getTime() - ((Date) created).getTime() > 5000;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // TODO refactor v0 Comments API to use CommentService (see ACE-5437)
 | 
			
		||||
        Serializable owner = this.nodeService.getProperty(commentNodeRef, ContentModel.PROP_OWNER);
 | 
			
		||||
        String currentUser = this.serviceRegistry.getAuthenticationService().getCurrentUserName();
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        boolean isSiteManager = this.permissionService.hasPermission(commentNodeRef, SiteModel.SITE_MANAGER) == (AccessStatus.ALLOWED);
 | 
			
		||||
        boolean isCoordinator = this.permissionService.hasPermission(commentNodeRef, PermissionService.COORDINATOR) == (AccessStatus.ALLOWED);
 | 
			
		||||
        boolean canEditComment = isSiteManager || isCoordinator || currentUser.equals(creator) || currentUser.equals(owner);
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        result.put("node", commentNodeRef);
 | 
			
		||||
        result.put("author", this.personService.getPerson(creator));
 | 
			
		||||
        result.put("isUpdated", isUpdated);
 | 
			
		||||
        result.put("canEditComment", canEditComment);
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * generates the response model for adding a comment
 | 
			
		||||
     * 
 | 
			
		||||
@@ -194,7 +211,7 @@ public class CommentsPost extends AbstractCommentsWebScript
 | 
			
		||||
        }
 | 
			
		||||
        return commentsFolder;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * returns the nodeRef of the existing one
 | 
			
		||||
     * 
 | 
			
		||||
@@ -207,7 +224,7 @@ public class CommentsPost extends AbstractCommentsWebScript
 | 
			
		||||
        {
 | 
			
		||||
            List<ChildAssociationRef> assocs = nodeService.getChildAssocs(nodeRef, ForumModel.ASSOC_DISCUSSION, RegexQNamePattern.MATCH_ALL);
 | 
			
		||||
            ChildAssociationRef firstAssoc = assocs.get(0);
 | 
			
		||||
            
 | 
			
		||||
 | 
			
		||||
            return nodeService.getChildByName(firstAssoc.getChildRef(), ContentModel.ASSOC_CONTAINS, COMMENTS_TOPIC_NAME);
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
@@ -220,7 +237,7 @@ public class CommentsPost extends AbstractCommentsWebScript
 | 
			
		||||
    {
 | 
			
		||||
        return prefix + "-" + System.currentTimeMillis();
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * creates the comments folder if it does not exists
 | 
			
		||||
     * 
 | 
			
		||||
@@ -229,35 +246,34 @@ public class CommentsPost extends AbstractCommentsWebScript
 | 
			
		||||
     */
 | 
			
		||||
    private NodeRef createCommentsFolder(final NodeRef nodeRef)
 | 
			
		||||
    {
 | 
			
		||||
        NodeRef commentsFolder = AuthenticationUtil.runAs(new AuthenticationUtil.RunAsWork<NodeRef>()
 | 
			
		||||
        {
 | 
			
		||||
        NodeRef commentsFolder = AuthenticationUtil.runAs(new AuthenticationUtil.RunAsWork<NodeRef>() {
 | 
			
		||||
            public NodeRef doWork() throws Exception
 | 
			
		||||
            {
 | 
			
		||||
                NodeRef commentsFolder = null;
 | 
			
		||||
                AuthenticationUtil.pushAuthentication();
 | 
			
		||||
                
 | 
			
		||||
 | 
			
		||||
                // ALF-5240: turn off auditing round the discussion node creation to prevent
 | 
			
		||||
                // the source document from being modified by the first user leaving a comment
 | 
			
		||||
                behaviourFilter.disableBehaviour(nodeRef, ContentModel.ASPECT_AUDITABLE);
 | 
			
		||||
                
 | 
			
		||||
 | 
			
		||||
                try
 | 
			
		||||
                {  
 | 
			
		||||
                {
 | 
			
		||||
                    // MNT-12082: set System user for creating forumFolder and commentsFolder nodes
 | 
			
		||||
                    AuthenticationUtil.setFullyAuthenticatedUser(AuthenticationUtil.getSystemUserName());
 | 
			
		||||
                    
 | 
			
		||||
 | 
			
		||||
                    nodeService.addAspect(nodeRef, QName.createQName(NamespaceService.FORUMS_MODEL_1_0_URI, "discussable"), null);
 | 
			
		||||
                    nodeService.addAspect(nodeRef, QName.createQName(NamespaceService.FORUMS_MODEL_1_0_URI, "commentsRollup"), null);
 | 
			
		||||
                    List<ChildAssociationRef> assocs = nodeService.getChildAssocs(nodeRef, QName.createQName(NamespaceService.FORUMS_MODEL_1_0_URI, "discussion"), RegexQNamePattern.MATCH_ALL);
 | 
			
		||||
                    if (assocs.size() != 0)
 | 
			
		||||
                    {
 | 
			
		||||
                        NodeRef forumFolder = assocs.get(0).getChildRef();
 | 
			
		||||
                        
 | 
			
		||||
 | 
			
		||||
                        Map<QName, Serializable> props = new HashMap<QName, Serializable>(1, 1.0f);
 | 
			
		||||
                        props.put(ContentModel.PROP_NAME, COMMENTS_TOPIC_NAME);
 | 
			
		||||
                        commentsFolder = nodeService.createNode(
 | 
			
		||||
                                forumFolder,
 | 
			
		||||
                                ContentModel.ASSOC_CONTAINS, 
 | 
			
		||||
                                QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, COMMENTS_TOPIC_NAME), 
 | 
			
		||||
                                ContentModel.ASSOC_CONTAINS,
 | 
			
		||||
                                QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, COMMENTS_TOPIC_NAME),
 | 
			
		||||
                                QName.createQName(NamespaceService.FORUMS_MODEL_1_0_URI, "topic"),
 | 
			
		||||
                                props).getChildRef();
 | 
			
		||||
                    }
 | 
			
		||||
@@ -267,12 +283,12 @@ public class CommentsPost extends AbstractCommentsWebScript
 | 
			
		||||
                    AuthenticationUtil.popAuthentication();
 | 
			
		||||
                    behaviourFilter.enableBehaviour(nodeRef, ContentModel.ASPECT_AUDITABLE);
 | 
			
		||||
                }
 | 
			
		||||
                
 | 
			
		||||
 | 
			
		||||
                return commentsFolder;
 | 
			
		||||
            }
 | 
			
		||||
    
 | 
			
		||||
        }, AuthenticationUtil.getSystemUserName()); 
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        }, AuthenticationUtil.getSystemUserName());
 | 
			
		||||
 | 
			
		||||
        return commentsFolder;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -40,7 +40,6 @@
 | 
			
		||||
		"items":
 | 
			
		||||
		[
 | 
			
		||||
		<#list results as row>
 | 
			
		||||
			<#if row.item.hasPermission("Read")>
 | 
			
		||||
			{
 | 
			
		||||
				"type": "${row.item.typeShort}",
 | 
			
		||||
				"parentType": "${row.item.parentTypeShort!""}",
 | 
			
		||||
@@ -76,7 +75,6 @@
 | 
			
		||||
				"nodeRef": "${row.item.nodeRef}"<#if row.selectable?exists>,
 | 
			
		||||
				"selectable" : ${row.selectable?string}</#if>
 | 
			
		||||
			}<#if row_has_next>,</#if>
 | 
			
		||||
			</#if>
 | 
			
		||||
		</#list>
 | 
			
		||||
		]
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
    <parent>
 | 
			
		||||
        <groupId>org.alfresco</groupId>
 | 
			
		||||
        <artifactId>alfresco-community-repo</artifactId>
 | 
			
		||||
        <version>23.6.0.21</version>
 | 
			
		||||
        <version>23.7.0.1</version>
 | 
			
		||||
    </parent>
 | 
			
		||||
 | 
			
		||||
    <dependencies>
 | 
			
		||||
 
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -2,7 +2,7 @@
 | 
			
		||||
 * #%L
 | 
			
		||||
 * Alfresco Repository
 | 
			
		||||
 * %%
 | 
			
		||||
 * Copyright (C) 2005 - 2016 Alfresco Software Limited
 | 
			
		||||
 * Copyright (C) 2005 - 2025 Alfresco Software Limited
 | 
			
		||||
 * %%
 | 
			
		||||
 * This file is part of the Alfresco software. 
 | 
			
		||||
 * If the software was purchased under a paid Alfresco license, the terms of 
 | 
			
		||||
@@ -23,105 +23,102 @@
 | 
			
		||||
 * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 * #L%
 | 
			
		||||
 */
 | 
			
		||||
package org.alfresco.repo.domain.node;
 | 
			
		||||
 | 
			
		||||
import java.io.Serializable;
 | 
			
		||||
import java.util.HashSet;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.model.ContentModel;
 | 
			
		||||
import org.alfresco.service.cmr.repository.NodeRef;
 | 
			
		||||
import org.alfresco.service.cmr.repository.datatype.DefaultTypeConverter;
 | 
			
		||||
import org.alfresco.service.namespace.QName;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Class holding properties associated with the <b>sys:referenceable</b> aspect.
 | 
			
		||||
 * This aspect is common enough to warrant direct inclusion on the <b>Node</b> entity.
 | 
			
		||||
 * 
 | 
			
		||||
 * @author Derek Hulley
 | 
			
		||||
 * @since 3.4
 | 
			
		||||
 */
 | 
			
		||||
public class ReferenceablePropertiesEntity
 | 
			
		||||
{
 | 
			
		||||
    private static final Set<QName> REFERENCEABLE_PROP_QNAMES;
 | 
			
		||||
    static
 | 
			
		||||
    {
 | 
			
		||||
        REFERENCEABLE_PROP_QNAMES = new HashSet<QName>(8);
 | 
			
		||||
        REFERENCEABLE_PROP_QNAMES.add(ContentModel.PROP_STORE_PROTOCOL);
 | 
			
		||||
        REFERENCEABLE_PROP_QNAMES.add(ContentModel.PROP_STORE_IDENTIFIER);
 | 
			
		||||
        REFERENCEABLE_PROP_QNAMES.add(ContentModel.PROP_NODE_UUID);
 | 
			
		||||
        REFERENCEABLE_PROP_QNAMES.add(ContentModel.PROP_NODE_DBID);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * @return          Returns <tt>true</tt> if the property belongs to the <b>sys:referenceable</b> aspect
 | 
			
		||||
     */
 | 
			
		||||
    public static boolean isReferenceableProperty(QName qname)
 | 
			
		||||
    {
 | 
			
		||||
        return REFERENCEABLE_PROP_QNAMES.contains(qname);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * Remove all {@link ContentModel#ASPECT_REFERENCEABLE referencable} properties
 | 
			
		||||
     */
 | 
			
		||||
    public static void removeReferenceableProperties(Node node, Map<QName, Serializable> properties)
 | 
			
		||||
    {
 | 
			
		||||
        properties.keySet().removeAll(REFERENCEABLE_PROP_QNAMES);
 | 
			
		||||
        String name = DefaultTypeConverter.INSTANCE.convert(String.class, properties.get(ContentModel.PROP_NAME));
 | 
			
		||||
        if (name != null && name.equals(node.getUuid()))
 | 
			
		||||
        {
 | 
			
		||||
            // The cm:name matches the UUID, so drop it
 | 
			
		||||
            properties.remove(ContentModel.PROP_NAME);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * Remove all {@link ContentModel#ASPECT_REFERENCEABLE referencable} properties
 | 
			
		||||
     */
 | 
			
		||||
    public static void removeReferenceableProperties(Set<QName> propertyQNames)
 | 
			
		||||
    {
 | 
			
		||||
        propertyQNames.removeAll(REFERENCEABLE_PROP_QNAMES);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * Adds all {@link ContentModel#ASPECT_REFERENCEABLE referencable} properties.
 | 
			
		||||
     */
 | 
			
		||||
    public static void addReferenceableProperties(Node node, Map<QName, Serializable> properties)
 | 
			
		||||
    {
 | 
			
		||||
        Long nodeId = node.getId();
 | 
			
		||||
        NodeRef nodeRef = node.getNodeRef();
 | 
			
		||||
        properties.put(ContentModel.PROP_STORE_PROTOCOL, nodeRef.getStoreRef().getProtocol());
 | 
			
		||||
        properties.put(ContentModel.PROP_STORE_IDENTIFIER, nodeRef.getStoreRef().getIdentifier());
 | 
			
		||||
        properties.put(ContentModel.PROP_NODE_UUID, nodeRef.getId());
 | 
			
		||||
        properties.put(ContentModel.PROP_NODE_DBID, nodeId);
 | 
			
		||||
        // add the ID as the name, if required
 | 
			
		||||
        String name = DefaultTypeConverter.INSTANCE.convert(String.class, properties.get(ContentModel.PROP_NAME));
 | 
			
		||||
        if (name == null)
 | 
			
		||||
        {
 | 
			
		||||
            properties.put(ContentModel.PROP_NAME, nodeRef.getId());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static Serializable getReferenceableProperty(Node node, QName qname)
 | 
			
		||||
    {
 | 
			
		||||
        NodeRef nodeRef = node.getNodeRef();
 | 
			
		||||
        if (qname.equals(ContentModel.PROP_STORE_PROTOCOL))
 | 
			
		||||
        {
 | 
			
		||||
            return nodeRef.getStoreRef().getProtocol();
 | 
			
		||||
        }
 | 
			
		||||
        else if (qname.equals(ContentModel.PROP_STORE_IDENTIFIER))
 | 
			
		||||
        {
 | 
			
		||||
            return nodeRef.getStoreRef().getIdentifier();
 | 
			
		||||
        }
 | 
			
		||||
        else if (qname.equals(ContentModel.PROP_NODE_UUID))
 | 
			
		||||
        {
 | 
			
		||||
            return nodeRef.getId();
 | 
			
		||||
        }
 | 
			
		||||
        else if (qname.equals(ContentModel.PROP_NODE_DBID))
 | 
			
		||||
        {
 | 
			
		||||
            return node.getId();
 | 
			
		||||
        }
 | 
			
		||||
        throw new IllegalArgumentException("Not sys:referenceable property: " + qname);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
package org.alfresco.repo.domain.node;
 | 
			
		||||
 | 
			
		||||
import java.io.Serializable;
 | 
			
		||||
import java.util.HashSet;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.model.ContentModel;
 | 
			
		||||
import org.alfresco.service.cmr.repository.NodeRef;
 | 
			
		||||
import org.alfresco.service.cmr.repository.datatype.DefaultTypeConverter;
 | 
			
		||||
import org.alfresco.service.namespace.QName;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Class holding properties associated with the <b>sys:referenceable</b> aspect. This aspect is common enough to warrant direct inclusion on the <b>Node</b> entity.
 | 
			
		||||
 * 
 | 
			
		||||
 * @author Derek Hulley
 | 
			
		||||
 * @since 3.4
 | 
			
		||||
 */
 | 
			
		||||
public class ReferenceablePropertiesEntity
 | 
			
		||||
{
 | 
			
		||||
    private static final Set<QName> REFERENCEABLE_PROP_QNAMES;
 | 
			
		||||
    static
 | 
			
		||||
    {
 | 
			
		||||
        REFERENCEABLE_PROP_QNAMES = new HashSet<QName>(8);
 | 
			
		||||
        REFERENCEABLE_PROP_QNAMES.add(ContentModel.PROP_STORE_PROTOCOL);
 | 
			
		||||
        REFERENCEABLE_PROP_QNAMES.add(ContentModel.PROP_STORE_IDENTIFIER);
 | 
			
		||||
        REFERENCEABLE_PROP_QNAMES.add(ContentModel.PROP_NODE_UUID);
 | 
			
		||||
        REFERENCEABLE_PROP_QNAMES.add(ContentModel.PROP_NODE_DBID);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return Returns <tt>true</tt> if the property belongs to the <b>sys:referenceable</b> aspect
 | 
			
		||||
     */
 | 
			
		||||
    public static boolean isReferenceableProperty(QName qname)
 | 
			
		||||
    {
 | 
			
		||||
        return REFERENCEABLE_PROP_QNAMES.contains(qname);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Remove all {@link ContentModel#ASPECT_REFERENCEABLE referencable} properties
 | 
			
		||||
     */
 | 
			
		||||
    public static void removeReferenceableProperties(Node node, Map<QName, Serializable> properties)
 | 
			
		||||
    {
 | 
			
		||||
        properties.keySet().removeAll(REFERENCEABLE_PROP_QNAMES);
 | 
			
		||||
        String name = DefaultTypeConverter.INSTANCE.convert(String.class, properties.get(ContentModel.PROP_NAME));
 | 
			
		||||
        if (name != null && name.equals(node.getUuid()))
 | 
			
		||||
        {
 | 
			
		||||
            // The cm:name matches the UUID, so drop it
 | 
			
		||||
            properties.remove(ContentModel.PROP_NAME);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Remove all {@link ContentModel#ASPECT_REFERENCEABLE referencable} properties
 | 
			
		||||
     */
 | 
			
		||||
    public static void removeReferenceableProperties(Set<QName> propertyQNames)
 | 
			
		||||
    {
 | 
			
		||||
        propertyQNames.removeAll(REFERENCEABLE_PROP_QNAMES);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Adds all {@link ContentModel#ASPECT_REFERENCEABLE referencable} properties.
 | 
			
		||||
     */
 | 
			
		||||
    public static void addReferenceableProperties(Long nodeId, NodeRef nodeRef, Map<QName, Serializable> properties)
 | 
			
		||||
    {
 | 
			
		||||
        properties.put(ContentModel.PROP_STORE_PROTOCOL, nodeRef.getStoreRef().getProtocol());
 | 
			
		||||
        properties.put(ContentModel.PROP_STORE_IDENTIFIER, nodeRef.getStoreRef().getIdentifier());
 | 
			
		||||
        properties.put(ContentModel.PROP_NODE_UUID, nodeRef.getId());
 | 
			
		||||
        properties.put(ContentModel.PROP_NODE_DBID, nodeId);
 | 
			
		||||
        // add the ID as the name, if required
 | 
			
		||||
        String name = DefaultTypeConverter.INSTANCE.convert(String.class, properties.get(ContentModel.PROP_NAME));
 | 
			
		||||
        if (name == null)
 | 
			
		||||
        {
 | 
			
		||||
            properties.put(ContentModel.PROP_NAME, nodeRef.getId());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static Serializable getReferenceableProperty(Node node, QName qname)
 | 
			
		||||
    {
 | 
			
		||||
        NodeRef nodeRef = node.getNodeRef();
 | 
			
		||||
        if (qname.equals(ContentModel.PROP_STORE_PROTOCOL))
 | 
			
		||||
        {
 | 
			
		||||
            return nodeRef.getStoreRef().getProtocol();
 | 
			
		||||
        }
 | 
			
		||||
        else if (qname.equals(ContentModel.PROP_STORE_IDENTIFIER))
 | 
			
		||||
        {
 | 
			
		||||
            return nodeRef.getStoreRef().getIdentifier();
 | 
			
		||||
        }
 | 
			
		||||
        else if (qname.equals(ContentModel.PROP_NODE_UUID))
 | 
			
		||||
        {
 | 
			
		||||
            return nodeRef.getId();
 | 
			
		||||
        }
 | 
			
		||||
        else if (qname.equals(ContentModel.PROP_NODE_DBID))
 | 
			
		||||
        {
 | 
			
		||||
            return node.getId();
 | 
			
		||||
        }
 | 
			
		||||
        throw new IllegalArgumentException("Not sys:referenceable property: " + qname);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 * #%L
 | 
			
		||||
 * Alfresco Repository
 | 
			
		||||
 * %%
 | 
			
		||||
 * Copyright (C) 2005 - 2023 Alfresco Software Limited
 | 
			
		||||
 * Copyright (C) 2005 - 2025 Alfresco Software Limited
 | 
			
		||||
 * %%
 | 
			
		||||
 * This file is part of the Alfresco software.
 | 
			
		||||
 * If the software was purchased under a paid Alfresco license, the terms of
 | 
			
		||||
@@ -39,8 +39,10 @@ import org.alfresco.service.namespace.QName;
 | 
			
		||||
/**
 | 
			
		||||
 * Encapsulates events occurred in a single transaction.
 | 
			
		||||
 *
 | 
			
		||||
 * @param <REF> entity (e.g. node, child association, peer association) reference type
 | 
			
		||||
 * @param <RES> entity resource type
 | 
			
		||||
 * @param <REF>
 | 
			
		||||
 *            entity (e.g. node, child association, peer association) reference type
 | 
			
		||||
 * @param <RES>
 | 
			
		||||
 *            entity resource type
 | 
			
		||||
 */
 | 
			
		||||
public abstract class EventConsolidator<REF extends EntityRef, RES extends Resource>
 | 
			
		||||
{
 | 
			
		||||
@@ -90,23 +92,31 @@ public abstract class EventConsolidator<REF extends EntityRef, RES extends Resou
 | 
			
		||||
    /**
 | 
			
		||||
     * Builds and returns the {@link RepoEvent} instance.
 | 
			
		||||
     *
 | 
			
		||||
     * @param eventInfo the object holding the event information
 | 
			
		||||
     * @param eventInfo
 | 
			
		||||
     *            the object holding the event information
 | 
			
		||||
     * @return the {@link RepoEvent} instance
 | 
			
		||||
     */
 | 
			
		||||
    public RepoEvent<DataAttributes<RES>> getRepoEvent(EventInfo eventInfo)
 | 
			
		||||
    {
 | 
			
		||||
        final RepoEvent.Builder<DataAttributes<RES>> builder = RepoEvent.builder();
 | 
			
		||||
 | 
			
		||||
        configureRepoEventBuilder(builder, eventInfo);
 | 
			
		||||
 | 
			
		||||
        return builder.build();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected void configureRepoEventBuilder(RepoEvent.Builder<DataAttributes<RES>> builder, EventInfo eventInfo)
 | 
			
		||||
    {
 | 
			
		||||
        EventType eventType = getDerivedEvent();
 | 
			
		||||
 | 
			
		||||
        DataAttributes<RES> eventData = buildEventData(eventInfo, resource, eventType);
 | 
			
		||||
 | 
			
		||||
        return RepoEvent.<DataAttributes<RES>>builder()
 | 
			
		||||
            .setId(eventInfo.getId())
 | 
			
		||||
            .setSource(eventInfo.getSource())
 | 
			
		||||
            .setTime(eventInfo.getTimestamp())
 | 
			
		||||
            .setType(eventType.getType())
 | 
			
		||||
            .setData(eventData)
 | 
			
		||||
            .setDataschema(EventJSONSchema.getSchemaV1(eventType))
 | 
			
		||||
            .build();
 | 
			
		||||
        builder.setId(eventInfo.getId())
 | 
			
		||||
                .setSource(eventInfo.getSource())
 | 
			
		||||
                .setTime(eventInfo.getTimestamp())
 | 
			
		||||
                .setType(eventType.getType())
 | 
			
		||||
                .setData(eventData)
 | 
			
		||||
                .setDataschema(EventJSONSchema.getSchemaV1(eventType));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -114,9 +124,9 @@ public abstract class EventConsolidator<REF extends EntityRef, RES extends Resou
 | 
			
		||||
     */
 | 
			
		||||
    protected DataAttributes<RES> buildEventData(EventInfo eventInfo, RES resource, EventType eventType)
 | 
			
		||||
    {
 | 
			
		||||
        return EventData.<RES>builder()
 | 
			
		||||
            .setEventGroupId(eventInfo.getTxnId())
 | 
			
		||||
            .setResource(resource)
 | 
			
		||||
            .build();
 | 
			
		||||
        return EventData.<RES> builder()
 | 
			
		||||
                .setEventGroupId(eventInfo.getTxnId())
 | 
			
		||||
                .setResource(resource)
 | 
			
		||||
                .build();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 * #%L
 | 
			
		||||
 * Alfresco Repository
 | 
			
		||||
 * %%
 | 
			
		||||
 * Copyright (C) 2005 - 2016 Alfresco Software Limited
 | 
			
		||||
 * Copyright (C) 2005 - 2025 Alfresco Software Limited
 | 
			
		||||
 * %%
 | 
			
		||||
 * This file is part of the Alfresco software. 
 | 
			
		||||
 * If the software was purchased under a paid Alfresco license, the terms of 
 | 
			
		||||
@@ -23,239 +23,290 @@
 | 
			
		||||
 * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 * #L%
 | 
			
		||||
 */
 | 
			
		||||
package org.alfresco.repo.node.getchildren;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.repo.domain.node.NodeEntity;
 | 
			
		||||
import org.alfresco.repo.domain.node.NodePropertyEntity;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Filterable/Sortable Node Entity
 | 
			
		||||
 *
 | 
			
		||||
 * Can be optionally filtered/sorted by (up to) three properties - note: sort properties are applied in order
 | 
			
		||||
 * 
 | 
			
		||||
 * @author jan
 | 
			
		||||
 * @since 4.0
 | 
			
		||||
 */
 | 
			
		||||
public class FilterSortNodeEntity
 | 
			
		||||
{
 | 
			
		||||
    private Long id; // node id
 | 
			
		||||
    
 | 
			
		||||
    private NodeEntity node;
 | 
			
		||||
    private NodePropertyEntity prop1;
 | 
			
		||||
    private NodePropertyEntity prop2;
 | 
			
		||||
    private NodePropertyEntity prop3;
 | 
			
		||||
    
 | 
			
		||||
    // Supplemental query-related parameters
 | 
			
		||||
    private Long parentNodeId;
 | 
			
		||||
    private Long prop1qnameId;
 | 
			
		||||
    private Long prop2qnameId;
 | 
			
		||||
    private Long prop3qnameId;
 | 
			
		||||
    private List<Long> childNodeTypeQNameIds;
 | 
			
		||||
    private Set<Long> assocTypeQNameIds;
 | 
			
		||||
    private String pattern;
 | 
			
		||||
    private Long namePropertyQNameId;
 | 
			
		||||
    private boolean auditableProps;
 | 
			
		||||
    private boolean nodeType;
 | 
			
		||||
 | 
			
		||||
    private Boolean isPrimary;
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * Default constructor
 | 
			
		||||
     */
 | 
			
		||||
    public FilterSortNodeEntity()
 | 
			
		||||
    {
 | 
			
		||||
        auditableProps = false;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public Long getId()
 | 
			
		||||
    {
 | 
			
		||||
        return id;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public void setId(Long id)
 | 
			
		||||
    {
 | 
			
		||||
        this.id = id;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public String getPattern()
 | 
			
		||||
    {
 | 
			
		||||
        return pattern;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected String escape(String s, char escapeChar)
 | 
			
		||||
    {
 | 
			
		||||
        StringBuilder sb = new StringBuilder();
 | 
			
		||||
        int idx = -1;
 | 
			
		||||
        int offset = 0;
 | 
			
		||||
        do
 | 
			
		||||
        {
 | 
			
		||||
            idx = s.indexOf(escapeChar, offset);
 | 
			
		||||
            if(idx != -1)
 | 
			
		||||
            {
 | 
			
		||||
                sb.append(s.substring(offset, idx));
 | 
			
		||||
                sb.append("\\");
 | 
			
		||||
                sb.append(escapeChar);
 | 
			
		||||
                offset = idx + 1;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        while(idx != -1);
 | 
			
		||||
        sb.append(s.substring(offset));
 | 
			
		||||
        return sb.toString();
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public void setPattern(String pattern)
 | 
			
		||||
    {
 | 
			
		||||
        if(pattern != null)
 | 
			
		||||
        {
 | 
			
		||||
            // escape the '%' character with '\' (standard SQL escape character)
 | 
			
		||||
            pattern = escape(pattern, '%');
 | 
			
		||||
            // replace the wildcard character '*' with the one used in database queries i.e. '%'
 | 
			
		||||
            this.pattern = pattern.replace('*', '%');
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setAssocTypeQNameIds(Set<Long> assocTypeQNameIds)
 | 
			
		||||
    {
 | 
			
		||||
        this.assocTypeQNameIds = assocTypeQNameIds;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public Set<Long> getAssocTypeQNameIds()
 | 
			
		||||
    {
 | 
			
		||||
        return assocTypeQNameIds;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public Long getNamePropertyQNameId()
 | 
			
		||||
    {
 | 
			
		||||
        return namePropertyQNameId;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setNamePropertyQNameId(Long namePropertyQNameId)
 | 
			
		||||
    {
 | 
			
		||||
        this.namePropertyQNameId = namePropertyQNameId;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public NodePropertyEntity getProp1()
 | 
			
		||||
    {
 | 
			
		||||
        return prop1;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public void setProp1(NodePropertyEntity prop1)
 | 
			
		||||
    {
 | 
			
		||||
        this.prop1 = prop1;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public NodePropertyEntity getProp2()
 | 
			
		||||
    {
 | 
			
		||||
        return prop2;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public void setProp2(NodePropertyEntity prop2)
 | 
			
		||||
    {
 | 
			
		||||
        this.prop2 = prop2;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public NodePropertyEntity getProp3()
 | 
			
		||||
    {
 | 
			
		||||
        return prop3;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public void setProp3(NodePropertyEntity prop3)
 | 
			
		||||
    {
 | 
			
		||||
        this.prop3 = prop3;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public NodeEntity getNode()
 | 
			
		||||
    {
 | 
			
		||||
        return node;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public void setNode(NodeEntity childNode)
 | 
			
		||||
    {
 | 
			
		||||
        this.node = childNode;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    // Supplemental query-related parameters
 | 
			
		||||
    
 | 
			
		||||
    public Long getParentNodeId()
 | 
			
		||||
    {
 | 
			
		||||
        return parentNodeId;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public void setParentNodeId(Long parentNodeId)
 | 
			
		||||
    {
 | 
			
		||||
        this.parentNodeId = parentNodeId;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public Long getProp1qnameId()
 | 
			
		||||
    {
 | 
			
		||||
        return prop1qnameId;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public void setProp1qnameId(Long prop1qnameId)
 | 
			
		||||
    {
 | 
			
		||||
        this.prop1qnameId = prop1qnameId;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public Long getProp2qnameId()
 | 
			
		||||
    {
 | 
			
		||||
        return prop2qnameId;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public void setProp2qnameId(Long prop2qnameId)
 | 
			
		||||
    {
 | 
			
		||||
        this.prop2qnameId = prop2qnameId;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public Long getProp3qnameId()
 | 
			
		||||
    {
 | 
			
		||||
        return prop3qnameId;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public void setProp3qnameId(Long prop3qnameId)
 | 
			
		||||
    {
 | 
			
		||||
        this.prop3qnameId = prop3qnameId;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public List<Long> getChildNodeTypeQNameIds()
 | 
			
		||||
    {
 | 
			
		||||
        return childNodeTypeQNameIds;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public void setChildNodeTypeQNameIds(List<Long> childNodeTypeQNameIds)
 | 
			
		||||
    {
 | 
			
		||||
        this.childNodeTypeQNameIds = childNodeTypeQNameIds;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public boolean isAuditableProps()
 | 
			
		||||
    {
 | 
			
		||||
        return auditableProps;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public void setAuditableProps(boolean auditableProps)
 | 
			
		||||
    {
 | 
			
		||||
        this.auditableProps = auditableProps;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public boolean isNodeType()
 | 
			
		||||
    {
 | 
			
		||||
        return nodeType;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public void setNodeType(boolean nodeType)
 | 
			
		||||
    {
 | 
			
		||||
        this.nodeType = nodeType;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public Boolean isPrimary()
 | 
			
		||||
    {
 | 
			
		||||
        return isPrimary;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setIsPrimary(Boolean isPrimary)
 | 
			
		||||
    {
 | 
			
		||||
        this.isPrimary = isPrimary;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
package org.alfresco.repo.node.getchildren;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
 | 
			
		||||
import org.alfresco.repo.domain.node.AuditablePropertiesEntity;
 | 
			
		||||
import org.alfresco.repo.domain.node.NodePropertyEntity;
 | 
			
		||||
import org.alfresco.service.cmr.repository.NodeRef;
 | 
			
		||||
import org.alfresco.service.cmr.repository.StoreRef;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Filterable/Sortable Node Entity
 | 
			
		||||
 *
 | 
			
		||||
 * Can be optionally filtered/sorted by (up to) three properties - note: sort properties are applied in order
 | 
			
		||||
 * 
 | 
			
		||||
 * @author jan
 | 
			
		||||
 * @since 4.0
 | 
			
		||||
 */
 | 
			
		||||
public class FilterSortNodeEntity
 | 
			
		||||
{
 | 
			
		||||
    private Long id; // node id
 | 
			
		||||
    private String nodeUuid;
 | 
			
		||||
    private Long typeQNameId;
 | 
			
		||||
 | 
			
		||||
    private AuditablePropertiesEntity auditablePropertiesEntity;
 | 
			
		||||
    private NodePropertyEntity prop1;
 | 
			
		||||
    private NodePropertyEntity prop2;
 | 
			
		||||
    private NodePropertyEntity prop3;
 | 
			
		||||
 | 
			
		||||
    private String storeProtocol;
 | 
			
		||||
    private String storeIdentifier;
 | 
			
		||||
 | 
			
		||||
    // Supplemental query-related parameters
 | 
			
		||||
    private Long parentNodeId;
 | 
			
		||||
    private Long prop1qnameId;
 | 
			
		||||
    private Long prop2qnameId;
 | 
			
		||||
    private Long prop3qnameId;
 | 
			
		||||
    private List<Long> childNodeTypeQNameIds;
 | 
			
		||||
    private Set<Long> assocTypeQNameIds;
 | 
			
		||||
    private String pattern;
 | 
			
		||||
    private Long namePropertyQNameId;
 | 
			
		||||
    private boolean auditableProps;
 | 
			
		||||
    private boolean nodeType;
 | 
			
		||||
 | 
			
		||||
    private Boolean isPrimary;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Default constructor
 | 
			
		||||
     */
 | 
			
		||||
    public FilterSortNodeEntity()
 | 
			
		||||
    {
 | 
			
		||||
        auditableProps = false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public Long getId()
 | 
			
		||||
    {
 | 
			
		||||
        return id;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setId(Long id)
 | 
			
		||||
    {
 | 
			
		||||
        this.id = id;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getNodeUuid()
 | 
			
		||||
    {
 | 
			
		||||
        return nodeUuid;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setNodeUuid(String nodeUuid)
 | 
			
		||||
    {
 | 
			
		||||
        this.nodeUuid = nodeUuid;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public Long getTypeQNameId()
 | 
			
		||||
    {
 | 
			
		||||
        return typeQNameId;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setTypeQNameId(Long typeQNameId)
 | 
			
		||||
    {
 | 
			
		||||
        this.typeQNameId = typeQNameId;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getPattern()
 | 
			
		||||
    {
 | 
			
		||||
        return pattern;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected String escape(String s, char escapeChar)
 | 
			
		||||
    {
 | 
			
		||||
        StringBuilder sb = new StringBuilder();
 | 
			
		||||
        int idx = -1;
 | 
			
		||||
        int offset = 0;
 | 
			
		||||
        do
 | 
			
		||||
        {
 | 
			
		||||
            idx = s.indexOf(escapeChar, offset);
 | 
			
		||||
            if (idx != -1)
 | 
			
		||||
            {
 | 
			
		||||
                sb.append(s.substring(offset, idx));
 | 
			
		||||
                sb.append("\\");
 | 
			
		||||
                sb.append(escapeChar);
 | 
			
		||||
                offset = idx + 1;
 | 
			
		||||
            }
 | 
			
		||||
        } while (idx != -1);
 | 
			
		||||
        sb.append(s.substring(offset));
 | 
			
		||||
        return sb.toString();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setPattern(String pattern)
 | 
			
		||||
    {
 | 
			
		||||
        if (pattern != null)
 | 
			
		||||
        {
 | 
			
		||||
            // escape the '%' character with '\' (standard SQL escape character)
 | 
			
		||||
            pattern = escape(pattern, '%');
 | 
			
		||||
            // replace the wildcard character '*' with the one used in database queries i.e. '%'
 | 
			
		||||
            this.pattern = pattern.replace('*', '%');
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setAssocTypeQNameIds(Set<Long> assocTypeQNameIds)
 | 
			
		||||
    {
 | 
			
		||||
        this.assocTypeQNameIds = assocTypeQNameIds;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public Set<Long> getAssocTypeQNameIds()
 | 
			
		||||
    {
 | 
			
		||||
        return assocTypeQNameIds;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public Long getNamePropertyQNameId()
 | 
			
		||||
    {
 | 
			
		||||
        return namePropertyQNameId;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setNamePropertyQNameId(Long namePropertyQNameId)
 | 
			
		||||
    {
 | 
			
		||||
        this.namePropertyQNameId = namePropertyQNameId;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public AuditablePropertiesEntity getAuditablePropertiesEntity()
 | 
			
		||||
    {
 | 
			
		||||
        return auditablePropertiesEntity;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setAuditablePropertiesEntity(AuditablePropertiesEntity auditablePropertiesEntity)
 | 
			
		||||
    {
 | 
			
		||||
        this.auditablePropertiesEntity = auditablePropertiesEntity;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public NodePropertyEntity getProp1()
 | 
			
		||||
    {
 | 
			
		||||
        return prop1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setProp1(NodePropertyEntity prop1)
 | 
			
		||||
    {
 | 
			
		||||
        this.prop1 = prop1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public NodePropertyEntity getProp2()
 | 
			
		||||
    {
 | 
			
		||||
        return prop2;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setProp2(NodePropertyEntity prop2)
 | 
			
		||||
    {
 | 
			
		||||
        this.prop2 = prop2;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public NodePropertyEntity getProp3()
 | 
			
		||||
    {
 | 
			
		||||
        return prop3;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setProp3(NodePropertyEntity prop3)
 | 
			
		||||
    {
 | 
			
		||||
        this.prop3 = prop3;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getStoreProtocol()
 | 
			
		||||
    {
 | 
			
		||||
        return storeProtocol;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setStoreProtocol(String storeProtocol)
 | 
			
		||||
    {
 | 
			
		||||
        this.storeProtocol = storeProtocol;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getStoreIdentifier()
 | 
			
		||||
    {
 | 
			
		||||
        return storeIdentifier;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setStoreIdentifier(String storeIdentifier)
 | 
			
		||||
    {
 | 
			
		||||
        this.storeIdentifier = storeIdentifier;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Supplemental query-related parameters
 | 
			
		||||
 | 
			
		||||
    public Long getParentNodeId()
 | 
			
		||||
    {
 | 
			
		||||
        return parentNodeId;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setParentNodeId(Long parentNodeId)
 | 
			
		||||
    {
 | 
			
		||||
        this.parentNodeId = parentNodeId;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public Long getProp1qnameId()
 | 
			
		||||
    {
 | 
			
		||||
        return prop1qnameId;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setProp1qnameId(Long prop1qnameId)
 | 
			
		||||
    {
 | 
			
		||||
        this.prop1qnameId = prop1qnameId;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public Long getProp2qnameId()
 | 
			
		||||
    {
 | 
			
		||||
        return prop2qnameId;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setProp2qnameId(Long prop2qnameId)
 | 
			
		||||
    {
 | 
			
		||||
        this.prop2qnameId = prop2qnameId;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public Long getProp3qnameId()
 | 
			
		||||
    {
 | 
			
		||||
        return prop3qnameId;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setProp3qnameId(Long prop3qnameId)
 | 
			
		||||
    {
 | 
			
		||||
        this.prop3qnameId = prop3qnameId;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public List<Long> getChildNodeTypeQNameIds()
 | 
			
		||||
    {
 | 
			
		||||
        return childNodeTypeQNameIds;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setChildNodeTypeQNameIds(List<Long> childNodeTypeQNameIds)
 | 
			
		||||
    {
 | 
			
		||||
        this.childNodeTypeQNameIds = childNodeTypeQNameIds;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean isAuditableProps()
 | 
			
		||||
    {
 | 
			
		||||
        return auditableProps;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setAuditableProps(boolean auditableProps)
 | 
			
		||||
    {
 | 
			
		||||
        this.auditableProps = auditableProps;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean isNodeType()
 | 
			
		||||
    {
 | 
			
		||||
        return nodeType;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setNodeType(boolean nodeType)
 | 
			
		||||
    {
 | 
			
		||||
        this.nodeType = nodeType;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public Boolean isPrimary()
 | 
			
		||||
    {
 | 
			
		||||
        return isPrimary;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setIsPrimary(Boolean isPrimary)
 | 
			
		||||
    {
 | 
			
		||||
        this.isPrimary = isPrimary;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public NodeRef createNodeRef()
 | 
			
		||||
    {
 | 
			
		||||
        return new NodeRef(new StoreRef(storeProtocol, storeIdentifier), nodeUuid);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -133,7 +133,15 @@
 | 
			
		||||
    <resultMap id="result_FilterSortNode" type="FilterSortNode">
 | 
			
		||||
        
 | 
			
		||||
        <id property="id" column="id" jdbcType="BIGINT" javaType="java.lang.Long"/>
 | 
			
		||||
        
 | 
			
		||||
        <result property="nodeUuid" column="uuid" jdbcType="VARCHAR" javaType="java.lang.String"/>
 | 
			
		||||
        <result property="typeQNameId" column="type_qname_id" jdbcType="BIGINT" javaType="java.lang.Long"/>
 | 
			
		||||
 | 
			
		||||
        <result property="auditablePropertiesEntity.auditCreator" column="audit_creator" jdbcType="VARCHAR" javaType="java.lang.String"/>
 | 
			
		||||
        <result property="auditablePropertiesEntity.auditCreated" column="audit_created" jdbcType="VARCHAR" javaType="java.lang.String"/>
 | 
			
		||||
        <result property="auditablePropertiesEntity.auditModifier" column="audit_modifier" jdbcType="VARCHAR" javaType="java.lang.String"/>
 | 
			
		||||
        <result property="auditablePropertiesEntity.auditModified" column="audit_modified" jdbcType="VARCHAR" javaType="java.lang.String"/>
 | 
			
		||||
        <result property="auditablePropertiesEntity.auditAccessed" column="audit_accessed" jdbcType="VARCHAR" javaType="java.lang.String"/>
 | 
			
		||||
 | 
			
		||||
        <result property="prop1.nodeId" column="prop1_node_id" jdbcType="BIGINT" javaType="java.lang.Long"/>
 | 
			
		||||
        <result property="prop1.key.qnameId" column="prop1_qname_id" jdbcType="BIGINT" javaType="java.lang.Long"/>
 | 
			
		||||
        <result property="prop1.key.localeId" column="prop1_locale_id" jdbcType="BIGINT" javaType="java.lang.Long"/>
 | 
			
		||||
@@ -169,8 +177,9 @@
 | 
			
		||||
        <result property="prop3.value.floatValue" column="prop3_float_value" jdbcType="FLOAT" javaType="java.lang.Float"/>
 | 
			
		||||
        <result property="prop3.value.doubleValue" column="prop3_double_value" jdbcType="FLOAT" javaType="java.lang.Double"/>
 | 
			
		||||
        <result property="prop3.value.stringValue" column="prop3_string_value" jdbcType="VARCHAR" javaType="java.lang.String"/>
 | 
			
		||||
        
 | 
			
		||||
        <association property="node" resultMap="alfresco.node.result_Node"/>
 | 
			
		||||
 | 
			
		||||
        <result property="storeProtocol" column="protocol" jdbcType="VARCHAR" javaType="java.lang.String"/>
 | 
			
		||||
        <result property="storeIdentifier" column="identifier" jdbcType="VARCHAR" javaType="java.lang.String"/>
 | 
			
		||||
        
 | 
			
		||||
    </resultMap>
 | 
			
		||||
    
 | 
			
		||||
@@ -972,8 +981,8 @@
 | 
			
		||||
    </select>
 | 
			
		||||
 | 
			
		||||
    <!-- GetChildren - with explicit prop filtering and/or sorting -->
 | 
			
		||||
    <select id="select_GetChildrenCannedQueryWithProps" parameterType="FilterSortNode" resultMap="result_FilterSortNode">
 | 
			
		||||
       select
 | 
			
		||||
    <select id="select_GetChildrenCannedQueryWithProps" parameterType="FilterSortNode" resultMap="result_FilterSortNode" flushCache="true">
 | 
			
		||||
       select distinct
 | 
			
		||||
            childNode.id             as id,
 | 
			
		||||
            childNode.version        as version,
 | 
			
		||||
            childStore.id            as store_id,
 | 
			
		||||
@@ -989,7 +998,7 @@
 | 
			
		||||
            childNode.audit_created  as audit_created,
 | 
			
		||||
            childNode.audit_modifier as audit_modifier,
 | 
			
		||||
            childNode.audit_modified as audit_modified,
 | 
			
		||||
            childNode.audit_accessed  as audit_accessed
 | 
			
		||||
            childNode.audit_accessed as audit_accessed
 | 
			
		||||
            <if test="prop1qnameId != null">
 | 
			
		||||
          , prop1.node_id            as prop1_node_id,
 | 
			
		||||
            prop1.qname_id           as prop1_qname_id,
 | 
			
		||||
@@ -1067,9 +1076,6 @@
 | 
			
		||||
                    #{item}
 | 
			
		||||
                </foreach>
 | 
			
		||||
            </if>
 | 
			
		||||
        <if test="prop1qnameId == null and auditableProps == false">
 | 
			
		||||
            <include refid="alfresco.node.select_ChildAssoc_OrderBy"/>
 | 
			
		||||
        </if>
 | 
			
		||||
    </select>
 | 
			
		||||
    
 | 
			
		||||
    <!-- GetChildren - with no explicit sorting (or prop filtering) - note: still filtered by child type (and optionally primary or secondary) -->
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,7 @@
 | 
			
		||||
repository.name=Main Repository
 | 
			
		||||
 | 
			
		||||
# Schema number
 | 
			
		||||
version.schema=19500
 | 
			
		||||
version.schema=19600
 | 
			
		||||
 | 
			
		||||
# Directory configuration
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user