/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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.apache.jackrabbit.core.cluster; import org.apache.jackrabbit.core.journal.JournalException; import org.apache.jackrabbit.core.journal.Record; /** * Deserialize a record written by a <code>ClusterNode</code>. */ public class ClusterRecordDeserializer { /** * Deserialize a cluster record. * * @param record basic record containing a cluster record * @return deserialized cluster record * @throws JournalException if an error occurs */ public ClusterRecord deserialize(Record record) throws JournalException { ClusterRecord clusterRecord; String workspace = record.readString(); char c = record.readChar(); switch (c) { case ChangeLogRecord.NODE_IDENTIFIER: case ChangeLogRecord.PROPERTY_IDENTIFIER: case ChangeLogRecord.EVENT_IDENTIFIER: case ChangeLogRecord.DATE_IDENTIFIER: clusterRecord = new ChangeLogRecord(c, record, workspace); clusterRecord.read(); break; case LockRecord.IDENTIFIER: clusterRecord = new LockRecord(record, workspace); clusterRecord.read(); break; case NamespaceRecord.IDENTIFIER: clusterRecord = new NamespaceRecord(record); clusterRecord.read(); break; case NodeTypeRecord.IDENTIFIER: clusterRecord = new NodeTypeRecord(record); clusterRecord.read(); break; case WorkspaceRecord.IDENTIFIER: clusterRecord = new WorkspaceRecord(record); clusterRecord.read(); break; case PrivilegeRecord.IDENTIFIER: clusterRecord = new PrivilegeRecord(record); clusterRecord.read(); break; case ClusterRecord.END_MARKER: // JCR-1813: Invalid journal records during XATransactions // Some journal records may be empty due to JCR-1813 and other // issues. We handle such cases with this dummy sentinel record. clusterRecord = new ClusterRecord(record) { @Override protected void doRead() { } @Override protected void doWrite() { } @Override public void process(ClusterRecordProcessor processor) { } }; break; default: throw new JournalException("Unknown record identifier: " + c); } return clusterRecord; } }