/*
* JBoss, Home of Professional Open Source.
* Copyright 2009, Red Hat Middleware LLC, and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.system.server.profileservice.repository.clustered.metadata;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;
/**
* Concise description of the contents under a single root URI in a
* ClusteredDeploymentRepository. A repository may consist of multiple root
* URIs.
*
* @author Brian Stansberry
*/
@XmlType(name="repositoryRootType", propOrder={"content", "name"})
public class RepositoryRootMetadata
extends AbstractSortedMetadataContainer<List<String>, RepositoryItemMetadata>
implements Identifiable<String>, Serializable, Comparable<RepositoryRootMetadata>
{
/** The serialVersionUID */
private static final long serialVersionUID = -4102001386900647551L;
private String name;
/**
* Constructor for XML parser.
*/
public RepositoryRootMetadata()
{
}
/**
* Create a new RepositoryRootMetadata with the given name.
*
* @param name the name. Cannot be <code>null</code>
*
* @throws IllegalArgumentException if name is <code>null</code>
*/
public RepositoryRootMetadata(String name)
{
if (name == null)
{
throw new IllegalArgumentException("Null name");
}
setName(name);
}
/**
* Copy constructor.
*
* @param toCopy the item to copy
*
* @throws NullPointerException if <code>toCopy</code> is <code>null</code>
*/
public RepositoryRootMetadata(RepositoryRootMetadata toCopy)
{
this(toCopy.getName());
Collection<RepositoryItemMetadata> content = toCopy.getContent();
Collection<RepositoryItemMetadata> internal = getExposedCollection();
for(RepositoryItemMetadata item : content)
{
internal.add(new RepositoryItemMetadata(item));
}
}
public String getId()
{
return name;
}
@XmlAttribute(name = "name")
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
@XmlElement(name = "content")
public Collection<RepositoryItemMetadata> getContent()
{
return getExposedCollection();
}
public void setContent(Collection<RepositoryItemMetadata> content)
{
Collection<RepositoryItemMetadata> internal = getExposedCollection();
internal.clear();
if (content != null)
{
for (RepositoryItemMetadata md : content)
{
internal.add(md);
}
}
}
public RepositoryItemMetadata getItemMetadata(List<String> path)
{
return getContainedMetadata(path);
}
/**
* Adds the given item to this root's content.
*
* @param md the item
*
* @deprecated use {@link #getContent()} and {@link Collection#add(Object)}
*/
@Deprecated
public void addItemMetadata(RepositoryItemMetadata md)
{
getExposedCollection().add(md);
}
/**
* Removes the item with the given path from this root's content.
*
* @param path the path
* @return <code>true</code> if the item was removed, <code>false</code> if
* no such item existed
*
* @deprecated use {@link #getContent()} and {@link Collection#remove(Object)}
*/
@Deprecated
public boolean removeItemMetadata(List<String> path)
{
RepositoryItemMetadata md = getItemMetadata(path);
if (md != null)
{
return getExposedCollection().remove(md);
}
return false;
}
// -------------------------------------------------------------- Comparable
public int compareTo(RepositoryRootMetadata other)
{
int result = 0;
// Null name comes later
if (this.name == null)
{
if (other.name != null)
{
result = 1;
}
}
else if (other.name == null)
{
result = -1;
}
else
{
result = this.name.compareTo(other.name);
}
if (result == 0)
{
List<RepositoryItemMetadata> us = new ArrayList<RepositoryItemMetadata>(this.getExposedCollection());
List<RepositoryItemMetadata> them = new ArrayList<RepositoryItemMetadata>(other.getExposedCollection());
result = them.size() - us.size();
if (result == 0)
{
for (int i = 0; i < us.size(); i++)
{
result = us.get(i).compareTo(them.get(i));
if (result != 0)
{
break;
}
}
}
}
return result;
}
// -------------------------------------------------------------- Overrides
@Override
public boolean equals(Object obj)
{
if (this == obj)
{
return true;
}
if (obj instanceof RepositoryRootMetadata)
{
RepositoryRootMetadata other = (RepositoryRootMetadata) obj;
return (this.getExposedCollection().equals(other.getExposedCollection())
&& (this.name != null && this.name.equals(other.name)));
}
return false;
}
@Override
public int hashCode()
{
int result = 17;
result = 31 * result + (name == null ? 0 : name.hashCode());
result = 31 * result + getExposedCollection().hashCode();
return result;
}
@Override
public String toString()
{
return new StringBuilder(getClass().getName())
.append("[name='")
.append(name)
.append(']').toString();
}
}