/**
* Copyright 2008 Google Inc.
*
* 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.waveprotocol.wave.model.wave;
import org.waveprotocol.wave.model.id.WaveIdentifiers;
import org.waveprotocol.wave.model.util.Preconditions;
/**
* Utility methods for participant IDs.
*
*/
public final class ParticipantIdUtil {
/** Unknown participant ID */
public static final ParticipantId UNKNOWN = new ParticipantId("unknown");
private ParticipantIdUtil() {}
/**
* Normalises an address.
*
* @param address address to normalise; may be null
* @return normal form of {@code address} if non-null; null otherwise.
*/
// TODO(ohler): Make this not nullable.
public static String normalize(String address) {
if (address == null) {
return null;
}
return address.toLowerCase();
}
/**
* @param x a String
* @return true if x is a wave address and normalized
*/
// NOTE(ohler), 2009-10-27:
// Unfortunately, not all addresses in our database are normalized:
// Some deltas contain authors of "<nobody>" and similar (not wave
// addresses), or may contain upper-case characters (not
// normalized). For future deltas, however, the wave server
// enforces that they have normalized addresses as their authors and
// as participant IDs in add/remove participant ops.
//
// If the federation code that serves outgoing deltas encounters a
// (historic) delta that does not satisfy this constraint, it will
// try to normalize the addresses in case the problem is just
// upper-case characters, but if there's a junk address like
// "<nobody>" that normalization doesn't fix, the entire wavelet
// will become non-federable.
public static boolean isNormalizedAddress(String x) {
Preconditions.checkNotNull(x, "Null address");
// TODO(ohler): Define what wave addresses really are, and add proper checks here.
if (!x.equals(normalize(x))) {
return false;
}
int at = x.indexOf('@');
return at > 0 && WaveIdentifiers.isValidDomain(at + 1, x);
}
/**
* Check if the address is a domain address in the form "@domain.com".
*/
public static boolean isDomainAddress(String address) {
int sepIndex = address.indexOf(ParticipantId.DOMAIN_PREFIX);
return (sepIndex == 0 && WaveIdentifiers.isValidDomain(1, address));
}
public static String makeDomainAddress(String domain) {
Preconditions.checkArgument(WaveIdentifiers.isValidDomain(0, domain), "Invalid domain: %s",
domain);
return ParticipantId.DOMAIN_PREFIX + domain;
}
/**
* Makes the shared domain participant id.
*
* @param domain the wave domain. The wave domain should be validated by
* {@link #isDomainAddress(String)} before calling this method. Failure
* to pass a validated wave domain may result in a run time exception.
* @return the shared domain participant id of the form: "@example.com".
*/
public static ParticipantId makeUnsafeSharedDomainParticipantId(String domain) {
return ParticipantId.ofUnsafe(makeDomainAddress(domain));
}
}