/** * Copyright (c) 2002-2011 "Neo Technology," * Network Engine for Objects in Lund AB [http://neotechnology.com] * * This file is part of Neo4j. * * Neo4j is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.neo4j.smack.pipeline.core.event; import org.jboss.netty.buffer.ChannelBuffer; import org.jboss.netty.channel.Channel; import org.neo4j.smack.pipeline.event.Fallible; import org.neo4j.smack.pipeline.event.WorkTransactionMode; import org.neo4j.smack.routing.Endpoint; import org.neo4j.smack.routing.InvocationVerb; import org.neo4j.smack.routing.PathVariables; import org.neo4j.smack.routing.Routable; import com.lmax.disruptor.EventFactory; /** * Note: There are lots of these instances, keep it as slim as possible to * keep memory usage down. */ public class CorePipelineEvent implements Fallible, Routable, TransactionWork { public static EventFactory<CorePipelineEvent> FACTORY = new EventFactory<CorePipelineEvent>() { public CorePipelineEvent newInstance() { return new CorePipelineEvent(); } }; private final PathVariables pathVariables = new PathVariables(); private InvocationVerb verb; private String path; private ChannelBuffer content;; private Endpoint endpoint; private Object deserializedContent; private Channel channel; private Throwable failure; private boolean isPersistentConnection; private Long connectionId; private long txId; private WorkTransactionMode txMode; public void setVerb(InvocationVerb verb) { this.verb = verb; } public InvocationVerb getVerb() { return verb; } public String getPath() { return path; } public void setEndpoint(Endpoint endpoint) { this.endpoint = endpoint; } public boolean getIsPersistentConnection() { return this.isPersistentConnection; } public Endpoint getEndpoint() { return endpoint; } // todo contention, distribute query params and Path Variables into different fields ? public PathVariables getPathVariables() { return pathVariables; } public ChannelBuffer getInputBuffer() { return content; } public void setDeserializedContent(Object deserialized) { this.deserializedContent = deserialized; } public Object getDeserializedContent() { return deserializedContent; } public Channel getChannel() { return channel; } @Override public void setFailed(Throwable ex) { this.failure = ex; } @Override public Throwable getFailureCause() { return this.failure; } @Override public boolean hasFailed() { return failure != null; } @Override public void setTransactionId(Long txId) { this.txId = txId; } @Override public long getTransactionId() { if(txId == -1l) { txId = pathVariables.getLongParameter("tx_id", -1l); } return txId; } @Override public boolean isTransactional() { return endpoint != null ? endpoint.isTransactional() : false; } @Override public void setTransactionMode(WorkTransactionMode txMode) { this.txMode = txMode; } @Override public WorkTransactionMode getTransactionMode() { return txMode; } public void setChannel(Channel channel) { this.channel = channel; } public long getConnectionId() { return connectionId; } public void reset(Long connectionId, InvocationVerb verb, String path, ChannelBuffer content, Channel channel, boolean keepAlive) { this.connectionId = connectionId; this.verb = verb; this.path = path; this.content = content; this.channel = channel; this.isPersistentConnection = keepAlive; this.endpoint = null; this.deserializedContent = null; this.txId = -1l; this.txMode = null; this.failure = null; this.pathVariables.reset(); } public void reset(Long connectionId, Channel channel, Throwable cause) { reset(connectionId, null, null, null, channel, false); setFailed(cause); } }