View Javadoc

1   /* 
2    * Copyright (c) 2007, Fraunhofer-Gesellschaft
3    * All rights reserved.
4    * 
5    * Redistribution and use in source and binary forms, with or without
6    * modification, are permitted provided that the following conditions are
7    * met:
8    * 
9    * (1) Redistributions of source code must retain the above copyright
10   *     notice, this list of conditions and the disclaimer at the end.
11   *     Redistributions in binary form must reproduce the above copyright
12   *     notice, this list of conditions and the following disclaimer in
13   *     the documentation and/or other materials provided with the
14   *     distribution.
15   * 
16   * (2) Neither the name of Fraunhofer nor the names of its
17   *     contributors may be used to endorse or promote products derived
18   *     from this software without specific prior written permission.
19   * 
20   * DISCLAIMER
21   * 
22   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23   * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24   * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
25   * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
26   * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
27   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
28   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29   * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30   * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31   * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
32   * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33   *  
34   */
35  package org.ogf.graap.wsag.samples;
36  
37  import java.text.MessageFormat;
38  
39  import org.apache.log4j.Logger;
40  import org.apache.xmlbeans.XmlObject;
41  import org.ggf.schemas.jsdl.x2005.x11.jsdl.ExactType;
42  import org.ggf.schemas.jsdl.x2005.x11.jsdl.JobDefinitionDocument;
43  import org.ggf.schemas.jsdl.x2005.x11.jsdl.JobDefinitionType;
44  import org.ogf.graap.wsag.server.monitoring.IMonitoringContext;
45  import org.ogf.graap.wsag.server.monitoring.IServiceTermMonitoringHandler;
46  import org.ogf.schemas.graap.wsAgreement.ServiceTermStateDefinition;
47  import org.ogf.schemas.graap.wsAgreement.ServiceTermStateType;
48  import org.w3c.dom.Node;
49  
50  /**
51   * SampleServiceTermMonitor
52   * 
53   * @author hrasheed
54   * 
55   */
56  public class SampleServiceTermMonitor implements IServiceTermMonitoringHandler
57  {
58  
59      private static final Logger LOG = Logger.getLogger( SampleServiceTermMonitor.class );
60  
61      /**
62       * {@inheritDoc}
63       */
64      public void monitor( IMonitoringContext context ) throws Exception
65      {
66  
67          try
68          {
69  
70              ServiceTermStateType sampleServiceTerm = context.getServiceTermStateByName( "SAMPLE1_SDT" );
71  
72              JobDefinitionType sampleJob = loadJobDefinition( sampleServiceTerm );
73              sampleJob.getJobDescription().addNewResources().addNewCandidateHosts().addHostName( "target_host" );
74              ExactType[] exactCPUs = new ExactType[0];
75              exactCPUs[0].setDoubleValue( 2.0 );
76              sampleJob.getJobDescription().getResources().addNewIndividualCPUCount().setExactArray( exactCPUs );
77  
78              sampleServiceTerm.setState( ServiceTermStateDefinition.COMPLETED );
79  
80          }
81          catch ( Exception e )
82          {
83              String message =
84                  MessageFormat.format( "Failed to update service term state. Reason: {0}",
85                                        new Object[] { e.getMessage() } );
86              LOG.error( message );
87              throw new Exception( message, e );
88          }
89      }
90  
91      private synchronized JobDefinitionType loadJobDefinition( ServiceTermStateType state )
92      {
93  
94          XmlObject[] jobDefinition =
95              state.selectChildren( JobDefinitionDocument.type.getDocumentElementName() );
96  
97          if ( jobDefinition.length == 0 )
98          {
99              LOG.trace( "Initialize job definition in service term state." );
100 
101             JobDefinitionDocument jobdef = JobDefinitionDocument.Factory.newInstance();
102             jobdef.addNewJobDefinition().addNewJobDescription();
103 
104             Node imported =
105                 state.getDomNode().getOwnerDocument().importNode( jobdef.getJobDefinition().getDomNode(),
106                                                                   true );
107             state.getDomNode().appendChild( imported );
108 
109             jobDefinition = state.selectChildren( JobDefinitionDocument.type.getDocumentElementName() );
110         }
111 
112         if ( jobDefinition.length > 1 )
113         {
114             String msgDebug =
115                 "Multiple job definitions founds in service term state. "
116                     + "Keeping the first, removing the others.";
117             LOG.debug( msgDebug );
118 
119             for ( int i = 1; i < jobDefinition.length; i++ )
120             {
121                 state.getDomNode().removeChild( jobDefinition[i].getDomNode() );
122             }
123 
124             jobDefinition = state.selectChildren( JobDefinitionDocument.type.getDocumentElementName() );
125         }
126 
127         JobDefinitionType result = (JobDefinitionType) jobDefinition[0];
128 
129         return result;
130     }
131 
132 }