/*
*
* Copyright 2007-2008 University Of Southern California
*
* 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 edu.isi.pegasus.planner.catalog.site.classes;
import java.util.Collection;
import java.util.Set;
import java.util.HashSet;
import java.util.Iterator;
import java.io.Writer;
import java.io.IOException;
import java.util.LinkedList;
/**
* This data class describes the Replica Catalog associated with the site.
*
* @version $Revision$
* @author Karan Vahi
*/
public class ReplicaCatalog extends AbstractSiteData {
/**
* The url for the catalog.
*/
protected String mURL;
/**
* The type of the replica catalog implementation to use.
*/
protected String mType;
/**
* Collection of connection parameters to use for connecting to that replica
* catalog.
*/
protected Collection<Connection> mConnectionParams;
/**
* Set of alias names to be used for lookup.
*/
protected Set<String> mAliases;
/**
* The default constrcutor.
*/
public ReplicaCatalog( ){
this( "", "" );
}
/**
* The overloaded constructor.
*
* @param url the url for the replica catalog.
* @param type the type of replica catalog.
*/
public ReplicaCatalog( String url, String type ){
initialize( url, type );
}
/**
* Initialize the class.
*
* @param url the url for the replica catalog.
* @param type the type of replica catalog.
*/
public void initialize( String url, String type ){
mURL = url;
mType = type;
mAliases = new HashSet<String>();
mConnectionParams = new LinkedList<Connection>();
}
/**
* Sets the url for the replica catalog.
*
* @param url the url
*/
public void setURL( String url ){
mURL = url;
}
/**
* Returns the url for the replica catalog.
*
* @return url
*/
public String getURL(){
return mURL;
}
/**
* Sets the type of replica catalog.
*
* @param type the type of replica catalog.
*/
public void setType( String type ){
mType = type;
}
/**
* Returns the type of replica catalog.
*
* @return type.
*/
public String getType(){
return mType;
}
/**
* Adds an alias site handle.
*
* @param name the site handle to alias to.
*/
public void addAlias( String name ){
mAliases.add( name );
}
/**
* Adds a connection parameter
*
* @param connection the connection parameter.
*/
public void addConnection( Connection connection ){
mConnectionParams.add( connection );
}
/**
* Clears the aliases associates with the replica catalog.
*/
public void clearAliases( ){
this.mAliases.clear();
}
/**
* Returns an iterator to aliases associated with the site.
*
* @return Iterator<String>
*/
public Iterator<String> getAliasIterator(){
return this.mAliases.iterator();
}
/**
* Returns an iterator to connection params associated with the replica
* catalog.
*
* @return Iterator<Connection>
*/
public Iterator<Connection> getConnectionIterator(){
return this.mConnectionParams.iterator();
}
/**
* Writes out the xml description of the object.
*
* @param writer is a Writer opened and ready for writing. This can also
* be a StringWriter for efficient output.
* @param indent the indent to be used.
*
* @exception IOException if something fishy happens to the stream.
*/
public void toXML( Writer writer, String indent ) throws IOException {
String newLine = System.getProperty( "line.separator", "\r\n" );
String newIndent = indent + "\t";
//write out the xml element
writer.write( indent );
writer.write( "<replica-catalog " );
writeAttribute( writer, "type", getType() );
writeAttribute( writer, "url", getURL() );
if( this.mAliases.isEmpty() && this.mConnectionParams.isEmpty() ){
writer.write( "/>" );
}
else{
writer.write( ">");
writer.write( newLine );
//list all the aliases first
for( Iterator<String> it = this.getAliasIterator(); it.hasNext(); ){
writeAlias( writer, newIndent, it.next() );
}
//list all the connection params
for( Iterator<Connection> it = this.getConnectionIterator(); it.hasNext(); ){
it.next().toXML( writer, newIndent );
}
writer.write( indent );
writer.write( "</replica-catalog>" );
}
writer.write( newLine );
}
/**
* Returns the clone of the object.
*
* @return the clone
*/
public Object clone(){
ReplicaCatalog obj;
try{
obj = ( ReplicaCatalog ) super.clone();
obj.initialize( this.getType(), this.getURL() );
for( Iterator<String> it = this.getAliasIterator(); it.hasNext() ; ){
obj.addAlias( it.next() );
}
for( Iterator<Connection> it = this.getConnectionIterator(); it.hasNext() ; ){
obj.addConnection( (Connection)it.next().clone() );
}
}
catch( CloneNotSupportedException e ){
//somewhere in the hierarch chain clone is not implemented
throw new RuntimeException("Clone not implemented in the base class of " + this.getClass().getName(),
e );
}
return obj;
}
/**
* Renders alias as xml
*
* @param writer is a Writer opened and ready for writing. This can also
* be a StringWriter for efficient output.
* @param indent the indent to be used.
* @param value the value to use.
*
* @exception IOException if something fishy happens to the stream.
*/
protected void writeAlias( Writer writer, String indent, String value ) throws IOException {
String newLine = System.getProperty( "line.separator", "\r\n" );
//write out the xml element
writer.write( indent );
writer.write( "<alias " );
writeAttribute( writer, "name", value );
writer.write( "/>" );
writer.write( newLine );
}
/**
* Accept the visitor
*
* @param visitor
*/
public void accept(SiteDataVisitor visitor) throws IOException {
visitor.visit( this );
//list all the connection params
for( Iterator<Connection> it = this.getConnectionIterator(); it.hasNext(); ){
Connection c = it.next();
c.accept(visitor);
}
visitor.depart( this );
}
}