/** * Copyright 2008 - 2009 Pro-Netics S.P.A. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package it.pronetics.madstore.repository.jcr.impl; import it.pronetics.madstore.common.AtomConstants; import it.pronetics.madstore.repository.CollectionRepository; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.jcr.Node; import javax.jcr.RepositoryException; import javax.jcr.Session; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import org.springframework.extensions.jcr.JcrCallback; import org.w3c.dom.Element; /** * {@link it.pronetics.madstore.repository.CollectionRepository} implementation based on Java Content * Repository APIs. * * @author Salvatore Incandela * @author Sergio Bossa */ public final class JcrCollectionRepository extends AbstractJcrRepository implements CollectionRepository { @Transactional(propagation = Propagation.REQUIRED, readOnly = false) public String putIfAbsent(final Element collectionElement) { if (collectionElement == null) { throw new IllegalArgumentException("Parameters cannot be null!"); } return (String) jcrTemplate.execute(new JcrCallback() { public Object doInJcr(Session session) throws IOException, RepositoryException { String key = collectionElement.getAttribute(AtomConstants.ATOM_KEY); if (!contains(key)) { importNodeFromDomCollection(key, collectionElement, session); session.save(); return key; } else { return null; } } }); } @Transactional(propagation = Propagation.REQUIRED, readOnly = false) public Boolean delete(final String collectionKey) { if (collectionKey == null) { throw new IllegalArgumentException("Parameters cannot be null!"); } return (Boolean) jcrTemplate.execute(new JcrCallback() { public Object doInJcr(Session session) throws IOException, RepositoryException { Node node = getCollectionNode(collectionKey, session); if (node != null) { Node container = node.getParent(); if (!container.getReferences().hasNext()) { container.remove(); session.save(); return true; } else { return false; } } else { return false; } } }); } @Transactional(propagation = Propagation.REQUIRED, readOnly = false) public Element read(final String collectionKey) { if (collectionKey == null) { throw new IllegalArgumentException("Parameters cannot be null!"); } return (Element) jcrTemplate.execute(new JcrCallback() { public Object doInJcr(final Session session) throws IOException, RepositoryException { Node node = getCollectionNode(collectionKey, session); if (node != null) { return exportNodeToDom(node.getPath(), session); } else { return null; } } }); } @Transactional(propagation = Propagation.REQUIRED, readOnly = false) public List<Element> readCollections() { return (List<Element>) jcrTemplate.execute(new JcrCallback() { public Object doInJcr(Session session) throws IOException, RepositoryException { List<Node> nodes = getCollectionNodes(session); List<Element> elements = new ArrayList<Element>(nodes.size()); for (Node node : nodes) { Element element = exportNodeToDom(node.getPath(), session); elements.add(element); } return elements; } }); } @Transactional(propagation = Propagation.REQUIRED, readOnly = false) public boolean contains(final String collectionKey) { if (collectionKey == null) { throw new IllegalArgumentException("Parameters cannot be null!"); } return (Boolean) jcrTemplate.execute(new JcrCallback() { public Object doInJcr(final Session session) throws IOException, RepositoryException { Node contained = getCollectionNode(collectionKey, session); return contained != null; } }); } }