/*
*
* 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 edu.isi.pegasus.common.util.Currently;
import java.io.IOException;
import java.util.Iterator;
/**
* Prints the Site Catalog compatible with Site Catalog schema version 4
*
* https://pegasus.isi.edu/wms/docs/schemas/sc-4.0/sc-4.0.html
*
* @author Karan Vahi
* @version $Revision$
*/
public class XML4PrintVisitor extends AbstractXMLPrintVisitor {
/**
* The "official" namespace URI of the site catalog schema.
*/
public static final String SCHEMA_NAMESPACE = "http://pegasus.isi.edu/schema/sitecatalog";
/**
* The "not-so-official" location URL of the DAX schema definition.
*/
public static final String SCHEMA_LOCATION = "http://pegasus.isi.edu/schema/sc-4.0.xsd";
/**
* The version to report.
*/
public static final String SCHEMA_VERSION = "4.0";
/**
* Visit the SiteStore object
*
* @param store the site store
*/
public void visit( SiteStore store ) throws IOException{
String indent = getCurrentIndent();
//write out the xml element
mWriter.write( indent );
indent = (indent != null && indent.length() > 0 ) ?
indent:
"";
mWriter.write( indent );
mWriter.write( "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" );
mWriter.write( mNewLine );
mWriter.write( indent );
mWriter.write( "<!-- generated: " );
mWriter.write( Currently.iso8601(false) );
mWriter.write( " -->" );
mWriter.write( mNewLine );
// who generated this document
mWriter.write( indent );
mWriter.write( "<!-- generated by: " );
mWriter.write( System.getProperties().getProperty("user.name", "unknown") );
mWriter.write( " [" );
mWriter.write( System.getProperties().getProperty("user.region","??") );
mWriter.write( "] -->" );
mWriter.write( mNewLine );
// root element with elementary attributes
mWriter.write( indent );
mWriter.write( '<' );
mWriter.write( "sitecatalog xmlns" );
mWriter.write( "=\"");
mWriter.write( SCHEMA_NAMESPACE );
mWriter.write( "\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"" );
mWriter.write( SCHEMA_NAMESPACE );
mWriter.write( ' ' );
mWriter.write( SCHEMA_LOCATION );
mWriter.write( '"' );
writeAttribute( mWriter, "version", SCHEMA_VERSION );
mWriter.write( '>' );
mWriter.write( mNewLine );
}
/**
* Depart the Site Store object.
*
* @param store the SiteStore
*/
public void depart( SiteStore store )throws IOException{
closeElement( "sitecatalog" );
}
/**
* Visit the Site CatalogEntry object
*
* @param entry the site catalog entry
*
* @throws IOException in case of problem of writing
*/
public void visit( SiteCatalogEntry entry ) throws IOException{
String indent = getCurrentIndent();
//write out the xml element
mWriter.write( indent );
mWriter.write( "<site " );
writeAttribute( mWriter, "handle", entry.getSiteHandle() );
writeAttribute( mWriter, "arch", entry.getArchitecture().toString() );
writeAttribute( mWriter, "os", entry.getOS().toString() );
String val = null;
if ( ( val = entry.getOSRelease() ) != null ){
writeAttribute( mWriter, "osrelease", val );
}
if ( ( val = entry.getOSVersion() ) != null ){
writeAttribute( mWriter, "osversion", val );
}
if ( ( val = entry.getGlibc() ) != null ){
writeAttribute( mWriter, "glibc", val );
}
mWriter.write( ">");
mWriter.write( mNewLine );
//for our nested elements we have to increment the index
incrementIndentIndex();
}
/**
* Depart the Site Catalog Entry object.
*
* @param entry the site catalog entry
*/
public void depart( SiteCatalogEntry entry ) throws IOException{
String indent = getCurrentIndent();
entry.getProfiles().toXML( mWriter, indent );
closeElement( "site" );
}
/**
* Visit the GridGateway object
*
* @param gateway the grid gateway
*
* @throws IOException in case of error while writing to underlying stream
*/
public void visit( GridGateway gateway) throws IOException{
String indent = getCurrentIndent();
//write out the xml element
mWriter.write( indent );
mWriter.write( "<grid " );
writeAttribute( mWriter, "type", gateway.getType().toString() );
writeAttribute( mWriter, "contact", gateway.getContact() );
writeAttribute( mWriter, "scheduler", gateway.getScheduler().toString() );
writeAttribute( mWriter, "jobtype", gateway.getJobType().toString() );
if( gateway.getOS() != null ){
writeAttribute( mWriter, "os", gateway.getOS().toString() );
}
if( gateway.getArchitecture() != null ){
writeAttribute( mWriter, "arch", gateway.getArchitecture().toString() );
}
String val = null;
if ( ( val = gateway.getOSRelease() ) != null ){
writeAttribute( mWriter, "osrelease", val );
}
if ( ( val = gateway.getOSVersion() ) != null ){
writeAttribute( mWriter, "osversion", val );
}
if ( ( val = gateway.getGlibc() ) != null ){
writeAttribute( mWriter, "glibc", val );
}
if( gateway.getIdleNodes() != -1 ){
writeAttribute( mWriter, "idle-nodes", Integer.toString( gateway.getIdleNodes() ));
}
if( gateway.getTotalNodes() != -1 ){
writeAttribute( mWriter, "total-nodes", Integer.toString( gateway.getTotalNodes() ));
}
mWriter.write( "/>");
mWriter.write( mNewLine );
}
/**
* Depart the GridGateway object
*
* @param entry GridGateway object
*
* @throws IOException in case of error while writing to underlying stream
*/
public void depart( GridGateway entry ) throws IOException{
}
/**
* Visit the directory object
*
* @param directory the directory
*
* @throws IOException in case of error while writing to underlying stream
*/
public void visit( Directory directory ) throws IOException{
String indent = this.getCurrentIndent();
//sanity check?
if( directory.isEmpty() ){
return;
}
//write out the xml element
mWriter.write( indent );
mWriter.write( "<directory " );
InternalMountPoint imt = directory.getInternalMountPoint();
if( imt != null ){
writeAttribute( mWriter, "path", imt.getMountPoint() );
writeAttribute( mWriter, "type", directory.getType().toString() );
//take care of optional attributes
String value = imt.getFreeSize();
if( value != null ){
writeAttribute( mWriter, "free-size", value );
}
if( (value = imt.getTotalSize()) != null ){
writeAttribute( mWriter, "total-size", value );
}
}
mWriter.write( ">");
mWriter.write( mNewLine );
//for our nested elements we have to increment the index
incrementIndentIndex();
}
/**
* Depart the shared directory
*
* @param directory the directory
*
* @throws IOException in case of error while writing to underlying stream
*/
public void depart( Directory directory ) throws IOException{
closeElement( "directory" );
}
/**
* Visit FileServer site data object
*
* @param server the object corresponding to the FileServer
*
* @throws IOException in case of error while writing to underlying stream
*/
public void visit( FileServer server )throws IOException{
String indent = this.getCurrentIndent();
//write out the xml element
mWriter.write( indent );
mWriter.write( "<file-server " );
//fixed for time being
writeAttribute( mWriter, "operation", "all" );
writeAttribute( mWriter, "url", server.getURL() );
mWriter.write( ">");
mWriter.write( mNewLine );
//for our nested elements we have to increment the index
incrementIndentIndex();
}
/**
* Depart the Directory object
*
* @param server the object corresponding to the FileServer
*
* @throws IOException in case of error while writing to underlying stream
*/
public void depart( FileServer server) throws IOException{
String indent = getCurrentIndent();
server.getProfiles().toXML( mWriter, indent );
closeElement( "file-server" );
}
/**
* Visit the ReplicaCatalog object
*
* @param catalog the object describing the catalog
*
* @throws IOException in case of error while writing to underlying stream
*/
public void visit( ReplicaCatalog catalog ) throws IOException{
String indent = this.getCurrentIndent();
//write out the xml element
mWriter.write( indent );
mWriter.write( "<replica-catalog " );
//fixed for time being
writeAttribute( mWriter, "type", catalog.getType() );
writeAttribute( mWriter, "url", catalog.getURL() );
mWriter.write( ">");
mWriter.write( mNewLine );
//for our nested elements we have to increment the index
incrementIndentIndex();
}
/**
* Depart the ReplicaCatalog object
*
* @param catalog the object describing the catalog
*
* @throws IOException in case of error while writing to underlying stream
*/
public void depart( ReplicaCatalog catalog ) throws IOException{
String indent = getCurrentIndent();
//list all the aliases first
for( Iterator<String> it = catalog.getAliasIterator(); it.hasNext(); ){
catalog.writeAlias( mWriter, indent, it.next() );
}
closeElement( "replica-catalog" );
}
/**
* Visit the connection object
*
* @param c the connection.
*
* @throws IOException in case of error while writing to underlying stream
*/
public void visit( Connection c ) throws IOException{
String indent = this.getCurrentIndent();
//write out the xml element
//write out the xml element
mWriter.write( indent );
mWriter.write( "<connection " );
writeAttribute( mWriter, "key", c.getKey() );
mWriter.write( ">");
mWriter.write( c.getValue() );
mWriter.write( "</connection>" );
mWriter.write( mNewLine );
//for our nested elements we have to increment the index
incrementIndentIndex();
}
/**
* Depart the connection object
*
* @param c the connection.
*
* @throws IOException in case of error while writing to underlying stream
*/
public void depart( Connection c ) throws IOException{
closeElement( "connection" );
}
}