package org.globus.progtutorial.services.core.core_sd.impl;

import org.codehaus.aspectwerkz.xmldef.advice.AroundAdvice;
import org.codehaus.aspectwerkz.joinpoint.JoinPoint;
import org.codehaus.aspectwerkz.joinpoint.MethodJoinPoint;
import java.io.*;
import org.globus.progtutorial.stubs.MathService_sd_notif.MathPortType;
import org.globus.progtutorial.stubs.MathService_sd_notif.servicedata.MathDataType;
import org.globus.ogsa.NotificationProvider;
import javax.xml.namespace.QName;
import org.globus.ogsa.GridServiceBase;
import org.globus.ogsa.ServiceData;


public class NotifyAdvice extends AroundAdvice {

    private GridServiceBase base;
    private ServiceData mathDataSDE;

    public NotifyAdvice() {
        super();
    }

    public Object execute(final JoinPoint joinPoint) throws Throwable {

        MethodJoinPoint jp = (MethodJoinPoint)joinPoint;
        final Object result = joinPoint.proceed();

        if(jp.getMethodName().compareTo("preCreate")==0){
            base = (GridServiceBase)(jp.getParameters()[0]);
            QName qname = (base.getServiceDataSet()).checkMatching(new QName("", "MathData"));
            mathDataSDE = (base.getServiceDataSet()).get(qname);           
        }
        else{
            mathDataSDE.notifyChange();
        }
        return result;
    }

}