/* * Copyright 2004-2012 the original author or authors. * * 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 org.springframework.webflow.execution.repository.support; import java.io.Serializable; import org.springframework.util.Assert; import org.springframework.webflow.execution.FlowExecution; import org.springframework.webflow.execution.FlowExecutionKey; import org.springframework.webflow.execution.repository.BadlyFormattedFlowExecutionKeyException; /** * A flow execution key that consists of two parts: * <ol> * <li>A <i>executionId</i>, identifying a logical {@link FlowExecution} that is running. * <li>A <i>snapshotId</i>, identifying a physical flow execution snapshot that can be restored. * </ol> * @author Keith Donald */ public class CompositeFlowExecutionKey extends FlowExecutionKey { private static final String EXECUTION_ID_PREFIX = "e"; private static final String SNAPSHOT_ID_PREFIX = "s"; private static final String FORMAT = EXECUTION_ID_PREFIX + "<executionId>" + SNAPSHOT_ID_PREFIX + "<snapshotId>"; private Serializable executionId; private Serializable snapshotId; /** * Create a new composite flow execution key given the composing parts. * @param executionId the execution id * @param snapshotId the snapshot id */ public CompositeFlowExecutionKey(Serializable executionId, Serializable snapshotId) { Assert.notNull(executionId, "The execution id is required"); Assert.notNull(snapshotId, "The snapshot id is required"); this.executionId = executionId; this.snapshotId = snapshotId; } /** * Returns the execution id part of this key. */ public Serializable getExecutionId() { return executionId; } /** * Returns the snapshot id part of this key. */ public Serializable getSnapshotId() { return snapshotId; } public boolean equals(Object obj) { if (!(obj instanceof CompositeFlowExecutionKey)) { return false; } CompositeFlowExecutionKey other = (CompositeFlowExecutionKey) obj; return executionId.equals(other.executionId) && snapshotId.equals(other.snapshotId); } public int hashCode() { return executionId.hashCode() + snapshotId.hashCode(); } public String toString() { return new StringBuilder().append(EXECUTION_ID_PREFIX).append(executionId).append(SNAPSHOT_ID_PREFIX) .append(snapshotId).toString(); } // static helpers /** * Returns a string description of the format of this key. */ public static String getFormat() { return FORMAT; } /** * Helper that splits the string-form of an instance of this class into its "parts" so the parts can be easily * parsed. * @param encodedKey the string-encoded composite flow execution key * @return the composite key parts as a String array (executionId = 0, snapshotId = 1) */ public static String[] keyParts(String encodedKey) throws BadlyFormattedFlowExecutionKeyException { if (!encodedKey.startsWith(EXECUTION_ID_PREFIX)) { throw new BadlyFormattedFlowExecutionKeyException(encodedKey, FORMAT); } int snapshotStart = encodedKey.indexOf(SNAPSHOT_ID_PREFIX, EXECUTION_ID_PREFIX.length()); if (snapshotStart == -1) { throw new BadlyFormattedFlowExecutionKeyException(encodedKey, FORMAT); } String executionId = encodedKey.substring(EXECUTION_ID_PREFIX.length(), snapshotStart); String snapshotId = encodedKey.substring(snapshotStart + SNAPSHOT_ID_PREFIX.length()); return new String[] { executionId, snapshotId }; } }