001/* 002 * Copyright 2012 Anyware Services 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016package org.ametys.cms.repository; 017 018import java.time.ZonedDateTime; 019 020import javax.jcr.Node; 021import javax.jcr.RepositoryException; 022 023import org.ametys.plugins.repository.AmetysRepositoryException; 024import org.ametys.plugins.repository.RepositoryConstants; 025import org.ametys.plugins.repository.jcr.JCRAmetysObject; 026import org.ametys.plugins.repository.version.ModifiableDataAwareVersionableAmetysObject; 027import org.ametys.runtime.model.type.ModelItemTypeConstants; 028 029/** 030 * Provides helper methods to use the {@link WorkflowAwareContent} API on {@link JCRAmetysObject}s. 031 */ 032public final class WorkflowAwareContentHelper 033{ 034 035 /** Constants for workflowId Metadata* */ 036 public static final String METADATA_WORKFLOW_ID = "workflowId"; 037 038 /** Constants for currentStepId Metadata* */ 039 public static final String METADATA_CURRENT_STEP_ID = "currentStepId"; 040 041 /** Name of the metadata storing the proposal date. */ 042 public static final String METADATA_LAST_PROPOSAL_DATE = "proposalDate"; 043 044 private WorkflowAwareContentHelper() 045 { 046 // Hide default constructor. 047 } 048 049 /** 050 * Get an object's workflow ID. 051 * @param object the object. 052 * @return the object's workflow ID. 053 * @throws AmetysRepositoryException if an error occurs. 054 */ 055 public static long getWorkflowId(JCRAmetysObject object) throws AmetysRepositoryException 056 { 057 try 058 { 059 return object.getNode().getProperty(RepositoryConstants.NAMESPACE_PREFIX_INTERNAL + ':' + METADATA_WORKFLOW_ID).getLong(); 060 } 061 catch (RepositoryException e) 062 { 063 throw new AmetysRepositoryException("Unable to get workflowId property", e); 064 } 065 } 066 067 /** 068 * Set an object's workflow ID. 069 * @param object the object. 070 * @param workflowId the workflow ID to set. 071 * @throws AmetysRepositoryException if an error occurs. 072 */ 073 public static void setWorkflowId(JCRAmetysObject object, long workflowId) throws AmetysRepositoryException 074 { 075 Node node = object.getNode(); 076 077 try 078 { 079 if (node.hasProperty(RepositoryConstants.NAMESPACE_PREFIX_INTERNAL + ':' + METADATA_WORKFLOW_ID)) 080 { 081 throw new AmetysRepositoryException("Cannot call setWorkflowId on an already persisted Content"); 082 } 083 084 node.setProperty(RepositoryConstants.NAMESPACE_PREFIX_INTERNAL + ':' + METADATA_WORKFLOW_ID, workflowId); 085 } 086 catch (RepositoryException e) 087 { 088 throw new AmetysRepositoryException("Unable to set workflowId property", e); 089 } 090 } 091 092 /** 093 * Remove the workflow ID property if exists on an object 094 * @param object The Ametys object 095 */ 096 public static void removeWorkflowId (JCRAmetysObject object) 097 { 098 Node node = object.getNode(); 099 100 try 101 { 102 if (node.hasProperty(RepositoryConstants.NAMESPACE_PREFIX_INTERNAL + ':' + METADATA_WORKFLOW_ID)) 103 { 104 node.getProperty(RepositoryConstants.NAMESPACE_PREFIX_INTERNAL + ':' + METADATA_WORKFLOW_ID).remove(); 105 } 106 } 107 catch (RepositoryException e) 108 { 109 throw new AmetysRepositoryException("Unable to remove workflowId property", e); 110 } 111 } 112 113 /** 114 * Get an object's current step ID. 115 * @param object the object. 116 * @return the object's current step ID. 117 * @throws AmetysRepositoryException if an error occurs. 118 */ 119 public static long getCurrentStepId(JCRAmetysObject object) throws AmetysRepositoryException 120 { 121 try 122 { 123 return object.getNode().getProperty(RepositoryConstants.NAMESPACE_PREFIX_INTERNAL + ':' + METADATA_CURRENT_STEP_ID).getLong(); 124 } 125 catch (RepositoryException e) 126 { 127 throw new AmetysRepositoryException("Unable to get currentStepId property", e); 128 } 129 } 130 131 /** 132 * Set an object's current step ID. 133 * @param object the object. 134 * @param stepId the current step ID to set. 135 * @throws AmetysRepositoryException if an error occurs. 136 */ 137 public static void setCurrentStepId(JCRAmetysObject object, long stepId) throws AmetysRepositoryException 138 { 139 Node node = object.getNode(); 140 141 try 142 { 143 node.setProperty(RepositoryConstants.NAMESPACE_PREFIX_INTERNAL + ':' + METADATA_CURRENT_STEP_ID, stepId); 144 } 145 catch (RepositoryException e) 146 { 147 throw new AmetysRepositoryException("Unable to set currentStepId property", e); 148 } 149 } 150 151 /** 152 * Get an object's proposal date. 153 * @param object the object. 154 * @return the object's proposal date. 155 * @throws AmetysRepositoryException if an error occurs. 156 */ 157 public static ZonedDateTime getProposalDate(ModifiableDataAwareVersionableAmetysObject object) throws AmetysRepositoryException 158 { 159 return object.getUnversionedDataHolder().getValue(METADATA_LAST_PROPOSAL_DATE, null); 160 } 161 162 /** 163 * Set an object's proposal date. 164 * @param object the object. 165 * @param proposalDate the proposal date to set. 166 * @throws AmetysRepositoryException if an error occurs. 167 */ 168 public static void setProposalDate(ModifiableDataAwareVersionableAmetysObject object, ZonedDateTime proposalDate) throws AmetysRepositoryException 169 { 170 if (proposalDate != null) 171 { 172 object.getUnversionedDataHolder().setValue(METADATA_LAST_PROPOSAL_DATE, proposalDate, ModelItemTypeConstants.DATETIME_TYPE_ID); 173 } 174 else if (object.getUnversionedDataHolder().hasValue(METADATA_LAST_PROPOSAL_DATE)) 175 { 176 object.getUnversionedDataHolder().removeValue(METADATA_LAST_PROPOSAL_DATE); 177 } 178 } 179}