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.web.repository.content.jcr;
017
018import java.time.ZonedDateTime;
019import java.util.Locale;
020import java.util.Optional;
021
022import javax.jcr.Node;
023import javax.jcr.Property;
024import javax.jcr.PropertyType;
025import javax.jcr.RepositoryException;
026import javax.jcr.Session;
027
028import org.ametys.cms.data.holder.ModifiableIndexableDataHolder;
029import org.ametys.cms.data.holder.impl.DefaultModifiableModelAwareDataHolder;
030import org.ametys.cms.repository.Content;
031import org.ametys.core.user.UserIdentity;
032import org.ametys.plugins.repository.AmetysObject;
033import org.ametys.plugins.repository.AmetysRepositoryException;
034import org.ametys.plugins.repository.RepositoryConstants;
035import org.ametys.plugins.repository.data.repositorydata.ModifiableRepositoryData;
036import org.ametys.plugins.repository.data.repositorydata.impl.JCRRepositoryData;
037import org.ametys.plugins.repository.tag.TaggableAmetysObjectHelper;
038import org.ametys.web.repository.content.SharedContent;
039import org.ametys.web.repository.site.Site;
040
041/**
042 * Default {@link SharedContent} implementation, backed by a JCR node.
043 * @param <F> the actual type of factory.
044 */
045public class DefaultSharedContent<F extends DefaultSharedContentFactory> extends DefaultWebContent<F> implements SharedContent
046{
047    
048    /** The initial content property. */
049    public static final String INITIAL_CONTENT_PROPERTY = RepositoryConstants.NAMESPACE_PREFIX_INTERNAL + ":initial-content";
050    
051    /**
052     * Creates a {@link DefaultSharedContent}.
053     * @param node the node backing this {@link AmetysObject}
054     * @param parentPath the parentPath in the Ametys hierarchy
055     * @param factory the DefaultSharedContentFactory which created the AmetysObject.
056     */
057    public DefaultSharedContent(Node node, String parentPath, F factory)
058    {
059        super(node, parentPath, factory);
060    }
061    
062    @Override
063    public Content getInitialContent() throws AmetysRepositoryException
064    {
065        Session session = null;
066        try
067        {
068            Content content = null;
069            
070            // The difficulty is that we have to switch to 'default' workspace, 
071            // because the property does not exists in 'live',
072            // because it could reference a non existing node
073            session = getNode().getSession().getRepository().login("default");
074            Node defaultWorkspaceNode = session.getNodeByIdentifier(getNode().getIdentifier());
075            
076            if (defaultWorkspaceNode.hasProperty(INITIAL_CONTENT_PROPERTY))
077            {
078                Property contentProp = defaultWorkspaceNode.getProperty(INITIAL_CONTENT_PROPERTY);
079                if (contentProp.getType() == PropertyType.REFERENCE)
080                {
081                    String contentNodeId = contentProp.getValue().getString();
082                    Node contentNode = getNode().getSession().getNodeByIdentifier(contentNodeId);
083                    content = _getFactory().resolveAmetysObject(contentNode);
084                }
085            }
086            return content;
087        }
088        catch (RepositoryException e)
089        {
090            throw new AmetysRepositoryException("Unable to resolve the initial content of shared content " + toString(), e);
091        }
092        finally
093        {
094            if (session != null)
095            {
096                session.logout();
097            }
098        }
099    }
100    
101    @Override
102    public Site getSite()
103    {
104        return getParent().getParent();
105    }
106    
107    @Override
108    public String getSiteName()
109    {
110        return getSite().getName();
111    }
112    
113    @Override
114    public void setSiteName(String siteName)
115    {
116        // TODO CMS-9336 this metadata should be stored as internal using data holders
117        ModifiableRepositoryData repositoryData = new JCRRepositoryData(getNode());
118        repositoryData.setValue(METADATA_SITE, siteName);
119    }
120    
121    /**
122     * Set the title.
123     * @param title the title.
124     * @throws AmetysRepositoryException if an error occurs.
125     */
126    @Deprecated
127    public void setTitle(String title) throws AmetysRepositoryException
128    {
129        _getFactory().getModifiableContentHelper().setTitle(this, title);
130    }
131    
132    /**
133     * Set the title from the given locale
134     * @param title the title.
135     * @param locale The locale
136     * @throws AmetysRepositoryException if an error occurs.
137     */
138    public void setTitle(String title, Locale locale) throws AmetysRepositoryException
139    {
140        _getFactory().getModifiableContentHelper().setTitle(this, title, locale);
141    }
142    
143    /**
144     * Set the login of the creator.
145     * @param user the creator.
146     * @throws AmetysRepositoryException if an error occurs.
147     */
148    public void setCreator(UserIdentity user) throws AmetysRepositoryException
149    {
150        _getFactory().getModifiableContentHelper().setCreator(this, user);
151    }
152    
153    /**
154     * Set the creation date.
155     * @param creationDate the creation date.
156     * @throws AmetysRepositoryException if an error occurs.
157     */
158    public void setCreationDate(ZonedDateTime creationDate) throws AmetysRepositoryException
159    {
160        _getFactory().getModifiableContentHelper().setCreationDate(this, creationDate);
161    }
162    
163    /**
164     * Set the login of the last contributor.
165     * @param user the last contributor.
166     * @throws AmetysRepositoryException if an error occurs.
167     */
168    public void setLastContributor(UserIdentity user)
169    {
170        _getFactory().getModifiableContentHelper().setLastContributor(this, user);
171    }
172    
173    /**
174     * Set the last modification date.
175     * @param lastModified the last modification date.
176     * @throws AmetysRepositoryException if an error occurs.
177     */
178    public void setLastModified(ZonedDateTime lastModified) throws AmetysRepositoryException
179    {
180        _getFactory().getModifiableContentHelper().setLastModified(this, lastModified);
181    }
182    
183    /**
184     * Set the first validation date
185     * @param validationDate the validation date.
186     * @throws AmetysRepositoryException if an error occurs.
187     */
188    public void setFirstValidationDate(ZonedDateTime validationDate) throws AmetysRepositoryException
189    {
190        _getFactory().getModifiableContentHelper().setFirstValidationDate(this, validationDate);
191    }
192    
193    /**
194     * Set the last validation date
195     * @param validationDate the validation date.
196     * @throws AmetysRepositoryException if an error occurs.
197     */
198    public void setLastValidationDate(ZonedDateTime validationDate) throws AmetysRepositoryException
199    {
200        _getFactory().getModifiableContentHelper().setLastValidationDate(this, validationDate);
201    }
202    
203    /**
204     * Set the last validation date resulting from a major modification
205     * @param validationDate the validation date.
206     * @throws AmetysRepositoryException if an error occurs.
207     */
208    public void setLastMajorValidationDate(ZonedDateTime validationDate) throws AmetysRepositoryException
209    {
210        _getFactory().getModifiableContentHelper().setLastMajorValidationDate(this, validationDate);
211    }
212    
213    @Override
214    public ModifiableIndexableDataHolder getDataHolder()
215    {
216        ModifiableRepositoryData repositoryData = new JCRRepositoryData(getNode());
217        return new DefaultModifiableModelAwareDataHolder(repositoryData, Optional.empty(), Optional.of(this), _getFactory().getContentHelper().getContentTypes(this));
218    }
219    
220    @Override
221    public void tag(String tag) throws AmetysRepositoryException
222    {
223        TaggableAmetysObjectHelper.tag(this, tag);
224    }
225    
226    @Override
227    public void untag(String tag) throws AmetysRepositoryException
228    {
229        TaggableAmetysObjectHelper.untag(this, tag);
230    }
231    
232}