/** * 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.waveprotocol.box.expimp; import org.waveprotocol.wave.federation.Proto.ProtocolWaveletDelta; import org.waveprotocol.wave.model.wave.InvalidParticipantAddress; import org.waveprotocol.wave.model.wave.ParticipantId; import org.waveprotocol.wave.federation.Proto.ProtocolWaveletOperation; import org.waveprotocol.wave.model.id.IdUtil; import org.waveprotocol.wave.model.id.WaveId; import org.waveprotocol.wave.model.id.WaveletId; import java.util.LinkedList; import java.util.List; /** * Converts domain names in exported data. * * @author akaplanov@gmail.com (Andrew Kaplanov) */ public class DomainConverter { /** * Replaces domain of WaveId. * * @param waveId source waveId * @param waveDomain target wave domain * @return wave id with waveDomain if waveDomain is not null, otherwise source wave id. */ public static WaveId convertWaveId(WaveId waveId, String waveDomain) { if (waveDomain != null) { return WaveId.of(waveDomain, waveId.getId()); } return waveId; } /** * Replaces domain of WaveletId. * * @param waveletId source waveletId * @param waveDomain target wave domain * @return wavelet id with waveDomain if waveDomain is not null, otherwise source wavelet id. */ public static WaveletId convertWaveletId(WaveletId waveletId, String waveDomain) throws InvalidParticipantAddress { if (waveDomain != null) { if (IdUtil.isUserDataWavelet(waveletId)) { String sourceParticipant = IdUtil.getUserDataWaveletAddress(waveletId); String targetParticipant = convertParticipantId(sourceParticipant, waveDomain).toString(); String targetWaveletId = IdUtil.join(IdUtil.USER_DATA_WAVELET_PREFIX, targetParticipant); return WaveletId.of(waveDomain, targetWaveletId); } return WaveletId.of(waveDomain, waveletId.getId()); } return waveletId; } /** * Replaces domain in deltas for Add/Remove participant operations. * * @param delta source delta * @param waveDomain target wave domain * @return delta for waveDomain if WaveDoamin is not null, otherwise source delta. * @throws InvalidParticipantAddress if there is a problem with deserialization of participant id. */ public static ProtocolWaveletDelta convertDelta(ProtocolWaveletDelta delta, String waveDomain) throws InvalidParticipantAddress { if (waveDomain != null) { ProtocolWaveletDelta.Builder newDelta = ProtocolWaveletDelta.newBuilder(delta); ParticipantId author = convertParticipantId(delta.getAuthor(), waveDomain); newDelta.setAuthor(author.getAddress()); for (int i = 0; i < delta.getOperationCount(); i++) { ProtocolWaveletOperation op = delta.getOperation(i); ProtocolWaveletOperation.Builder newOp = ProtocolWaveletOperation.newBuilder(op); if (op.hasAddParticipant()) { convertAddParticipantOperation(newOp, op, waveDomain); } else if (op.hasRemoveParticipant()) { convertRemoveParticipantOperation(newOp, op, waveDomain); } // TODO(user) release convert for other operations. newDelta.setOperation(i, newOp); } return newDelta.build(); } else { return delta; } } /** * Converts all history deltas. * * @param deltas source deltas * @param waveDomain target wave domain * @return deltas for waveDomain if WaveDoamin is not null, otherwise source deltas. * @throws InvalidParticipantAddress if there is a problem with deserialization of participant id. */ public static List<ProtocolWaveletDelta> convertDeltas(List<ProtocolWaveletDelta> deltas, String waveDomain) throws InvalidParticipantAddress { if (waveDomain != null) { List<ProtocolWaveletDelta> targetDeltas = new LinkedList<ProtocolWaveletDelta>(); for (ProtocolWaveletDelta delta : deltas) { targetDeltas.add(DomainConverter.convertDelta(delta, waveDomain)); } return targetDeltas; } else { return deltas; } } /** * Converts adding participant operation. */ private static void convertAddParticipantOperation(ProtocolWaveletOperation.Builder newOperation, ProtocolWaveletOperation operation, String domain) throws InvalidParticipantAddress { ParticipantId participant = convertParticipantId(operation.getAddParticipant(), domain); newOperation.setAddParticipant(participant.getAddress()); } /** * Converts removal participant operation. */ private static void convertRemoveParticipantOperation(ProtocolWaveletOperation.Builder newOperation, ProtocolWaveletOperation operation, String domain) throws InvalidParticipantAddress { ParticipantId participant = convertParticipantId(operation.getRemoveParticipant(), domain); newOperation.setRemoveParticipant(participant.getAddress()); } /** * Replaces participant domain. */ private static ParticipantId convertParticipantId(String participant, String domain) throws InvalidParticipantAddress { return ParticipantId.of(ParticipantId.of(participant).getName(), domain); } }