/**
* OpenSpotLight - Open Source IT Governance Platform
*
* Copyright (c) 2009, CARAVELATECH CONSULTORIA E TECNOLOGIA EM INFORMATICA LTDA
* or third-party contributors as indicated by the @author tags or express
* copyright attribution statements applied by the authors. All third-party
* contributions are distributed under license by CARAVELATECH CONSULTORIA E
* TECNOLOGIA EM INFORMATICA LTDA.
*
* This copyrighted material is made available to anyone wishing to use, modify,
* copy, or redistribute it subject to the terms and conditions of the GNU
* Lesser General Public License, as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
* See the GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this distribution; if not, write to:
* Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*
***********************************************************************
* OpenSpotLight - Plataforma de Governança de TI de Código Aberto
*
* Direitos Autorais Reservados (c) 2009, CARAVELATECH CONSULTORIA E TECNOLOGIA
* EM INFORMATICA LTDA ou como contribuidores terceiros indicados pela etiqueta
* @author ou por expressa atribuição de direito autoral declarada e atribuída pelo autor.
* Todas as contribuições de terceiros estão distribuídas sob licença da
* CARAVELATECH CONSULTORIA E TECNOLOGIA EM INFORMATICA LTDA.
*
* Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo sob os
* termos da Licença Pública Geral Menor do GNU conforme publicada pela Free Software
* Foundation.
*
* Este programa é distribuído na expectativa de que seja útil, porém, SEM NENHUMA
* GARANTIA; nem mesmo a garantia implícita de COMERCIABILIDADE OU ADEQUAÇÃO A UMA
* FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral Menor do GNU para mais detalhes.
*
* Você deve ter recebido uma cópia da Licença Pública Geral Menor do GNU junto com este
* programa; se não, escreva para:
* Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*/
package org.openspotlight.graph;
import static com.google.common.collect.Lists.newLinkedList;
import java.util.List;
import org.openspotlight.graph.internal.NodeAndLinkSupport;
import org.openspotlight.graph.internal.NodeAndLinkSupport.PropertyContainerMetadata;
import org.openspotlight.graph.manipulation.GraphReader;
import org.openspotlight.graph.manipulation.GraphWriter;
import org.openspotlight.storage.PartitionFactory;
import org.openspotlight.storage.StorageSession;
import com.google.inject.Provider;
public class GraphWriterImpl implements GraphWriter {
private final String artifactId;
private final List<Link> dirtyLinks = newLinkedList();
private final List<Node> dirtyNodes = newLinkedList();
private final PartitionFactory factory;
private final GraphReader graphReader;
private final Provider<StorageSession> sessionProvider;
public GraphWriterImpl(final PartitionFactory factory,
final Provider<StorageSession> sessionProvider, final String artifactId,
final GraphReader graphReader) {
this.artifactId = artifactId;
this.factory = factory;
this.sessionProvider = sessionProvider;
this.graphReader = graphReader;
}
@Override
public <L extends Link> L addBidirectionalLink(
final Class<L> linkClass,
final Node source, final Node target)
throws IllegalArgumentException {
final L newLink =
NodeAndLinkSupport.createLink(factory, sessionProvider.get(), linkClass, source, target, LinkDirection.BIDIRECTIONAL,
false);
dirtyLinks.add(newLink);
return newLink;
}
@Override
public <T extends Node> T addChildNode(
final Node parent, final Class<T> clazz,
final String name)
throws IllegalArgumentException {
return addChildNode(parent, clazz, name, null, null);
}
@Override
public <T extends Node> T addChildNode(final Node parent, final Class<T> clazz,
final String name,
final Iterable<Class<? extends Link>> linkTypesForLinkDeletion,
final Iterable<Class<? extends Link>> linkTypesForLinkedNodeDeletion)
throws IllegalArgumentException {
final StorageSession session = sessionProvider.get();
final T newNode = NodeAndLinkSupport.createNode(factory, session, parent
.getContextId(), parent.getId(), clazz, name, true,
linkTypesForLinkDeletion, linkTypesForLinkedNodeDeletion);
dirtyNodes.add(newNode);
return newNode;
}
@Override
public <L extends Link> L addLink(
final Class<L> linkClass, final Node source,
final Node target)
throws IllegalArgumentException {
final L newLink =
NodeAndLinkSupport.createLink(factory, sessionProvider.get(), linkClass, source, target,
LinkDirection.UNIDIRECTIONAL,
false);
dirtyLinks.add(newLink);
return newLink;
}
@Override
public <T extends Node> T addNode(
final Context context, final Class<T> clazz,
final String name)
throws IllegalArgumentException {
return addNode(context, clazz, name, null, null);
}
@Override
public <T extends Node> T addNode(final Context context, final Class<T> clazz,
final String name,
final Iterable<Class<? extends Link>> linkTypesForLinkDeletion,
final Iterable<Class<? extends Link>> linkTypesForLinkedNodeDeletion)
throws IllegalArgumentException {
final StorageSession session = sessionProvider.get();
final T newNode = NodeAndLinkSupport.createNode(factory, session, context.getId(),
null, clazz, name, true, linkTypesForLinkDeletion,
linkTypesForLinkedNodeDeletion);
dirtyNodes.add(newNode);
return newNode;
}
@Override
public void copyNodeHierarchy(
final Node node, final Context target) {
throw new UnsupportedOperationException();
}
@SuppressWarnings("unchecked")
@Override
public void flush() {
final StorageSession session = sessionProvider.get();
for (final Node n: dirtyNodes) {
NodeAndLinkSupport.retrievePreviousNode(factory, session, graphReader
.getContext(n.getContextId()), n, true);
NodeAndLinkSupport.writeTreeLineReference(session, factory, n);
}
session.flushTransient();
for (final Link l: dirtyLinks) {
final Link retrievedLink =
NodeAndLinkSupport.createLink(factory, sessionProvider.get(), l.getType(), l.getSource(), l.getTarget(),
l.getDirection(),
true);
final PropertyContainerMetadata<org.openspotlight.storage.domain.StorageLink> md =
(PropertyContainerMetadata<org.openspotlight.storage.domain.StorageLink>) retrievedLink;
final org.openspotlight.storage.domain.StorageLink cached = md.getCached();
cached.setIndexedProperty(session, NodeAndLinkSupport.LINK_DIRECTION, retrievedLink.getDirection().name());
NodeAndLinkSupport.writeTreeLineReference(session, factory, l);
session.flushTransient();
}
}
@Override
public void moveNodeHierarchy(
final Node node, final Context target) {
throw new UnsupportedOperationException();
}
@Override
public void removeContext(
final Context context) {
throw new UnsupportedOperationException();
}
@Override
public void removeLink(
final Link link) {
throw new UnsupportedOperationException();
}
@Override
public void removeNode(
final Node node) {
final StorageSession session = sessionProvider.get();
final org.openspotlight.storage.domain.StorageNode StorageNode = NodeAndLinkSupport.retrievePreviousNode(factory,
session, graphReader.getContext(node.getContextId()), node,
true);
session.removeNode(StorageNode);
}
@Override
public void setContextCaption(
final Context context, final String caption) {
final ContextImpl contextImpl = (ContextImpl) context;
contextImpl.setCaption(caption);
final StorageSession session = sessionProvider.get();
}
}