org.cometd.server.ChannelId Maven / Gradle / Ivy
// ========================================================================
// Copyright 2007 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------
// 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.cometd.server;
public class ChannelId
{
public final static String WILD="*";
public final static String WILDWILD="**";
private static final String[] ROOT={};
String _name;
String[] _segments;
int _wild;
public ChannelId(String name)
{
_name=name;
if (name == null || name.length() == 0 || name.charAt(0) != '/')
throw new IllegalArgumentException(name);
if ("/".equals(name))
{
_segments=ROOT;
}
else
{
if (name.charAt(name.length() - 1) == '/')
throw new IllegalArgumentException(name);
_segments=name.substring(1).split("/");
}
if (_segments.length == 0)
_wild=0;
else if (WILD.equals(_segments[_segments.length - 1]))
_wild=1;
else if (WILDWILD.equals(_segments[_segments.length - 1]))
_wild=2;
}
public boolean isWild()
{
return _wild > 0;
}
@Override
public boolean equals(Object obj)
{
if (this == obj)
return true;
if (obj instanceof ChannelId)
{
ChannelId other=(ChannelId)obj;
if (isWild())
{
if (other.isWild())
return _name.equals(other._name);
return matches(other);
}
else
{
if (other.isWild())
return other.matches(this);
return _name.equals(other._name);
}
}
else if (obj instanceof String)
{
if (isWild())
return matches((String)obj);
return _name.equals(obj);
}
return false;
}
public boolean matches(ChannelId name)
{
if (name.isWild())
return equals(name);
switch(_wild)
{
case 0:
return equals(name);
case 1:
if (name._segments.length != _segments.length)
return false;
for (int i=_segments.length - 1; i-- > 0;)
if (!_segments[i].equals(name._segments[i]))
return false;
return true;
case 2:
if (name._segments.length < _segments.length)
return false;
for (int i=_segments.length - 1; i-- > 0;)
if (!_segments[i].equals(name._segments[i]))
return false;
return true;
}
return false;
}
public boolean matches(String name)
{
if (_wild == 0)
return _name.equals(name);
// TODO more efficient?
return matches(new ChannelId(name));
}
@Override
public int hashCode()
{
return _name.hashCode();
}
@Override
public String toString()
{
return _name;
}
public int depth()
{
return _segments.length;
}
public boolean isParentOf(ChannelId id)
{
if (isWild() || depth() >= id.depth())
return false;
for (int i = _segments.length - 1; i >= 0; --i)
{
if (!_segments[i].equals(id._segments[i]))
return false;
}
return true;
}
public String getSegment(int i)
{
if (i > _segments.length)
return null;
return _segments[i];
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy