package org.gcube.vremanagement.vremodeler.impl.thread; import java.io.ByteArrayInputStream; import java.io.IOException; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathExpressionException; import javax.xml.xpath.XPathFactory; import org.gcube.common.core.contexts.GHNContext; import org.gcube.common.core.faults.GCUBEFault; import org.gcube.common.core.informationsystem.publisher.ISPublisher; import org.gcube.common.core.resources.GCUBECollection; import org.gcube.common.core.resources.GCUBEGenericResource; import org.gcube.common.core.resources.GCUBEMCollection; import org.gcube.common.core.resources.impl.kxml.KGCUBEResource; import org.gcube.common.core.scope.GCUBEScope; import org.gcube.common.core.utils.handlers.GCUBEServiceClientImpl; import org.gcube.common.core.utils.logging.GCUBELog; import org.gcube.common.vremanagement.ghnmanager.impl.contexts.ServiceContext; import org.gcube.vremanagement.vremanager.stubs.vremanager.AddResourcesParameters; import org.gcube.vremanagement.vremanager.stubs.vremanager.OptionsParameters; import org.gcube.vremanagement.vremanager.stubs.vremanager.ResourceItem; import org.gcube.vremanagement.vremanager.stubs.vremanager.ResourceList; import org.gcube.vremanagement.vremanager.stubs.vremanager.ScopeOption; import org.gcube.vremanagement.vremanager.stubs.vremanager.ServiceItem; import org.gcube.vremanagement.vremanager.stubs.vremanager.ServiceList; import org.gcube.vremanagement.vremanager.stubs.vremanager.VREManagerPortType; import org.gcube.vremanagement.vremodeler.db.DBInterface; import org.gcube.vremanagement.vremodeler.impl.util.Couple; import org.gcube.vremanagement.vremodeler.impl.util.VREManagerServiceHandler; import org.w3c.dom.Document; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; public class DeployVRE extends Thread{ private static GCUBELog logger= new GCUBELog(DeployVRE.class); private ISPublisher publisher; private String resourceId; private String vreName=null; public DeployVRE(String resourceId){ this.resourceId=resourceId; } public void run() { try { deployManagerOnVRE(); ServiceContext.getContext().setScope(GCUBEScope.getScope(ServiceContext.getContext().getScope()+"/"+this.vreName)); createVRE(); logger.info("FINISHED"); }catch(Exception e){ e.printStackTrace(); } } private void deployManagerOnVRE() throws GCUBEFault{ String firstGHNId= null, vreName= null; try { DBInterface.ExecuteUpdate("UPDATE VRE SET STATUS='Deploying' WHERE VRE.id='"+this.resourceId+"';"); ResultSet resGenericInfo = DBInterface.queryDB("select VRE.name from VRE where VRE.id='"+this.resourceId+"'; "); if (!resGenericInfo.next()) { throw new GCUBEFault("The VRE with ID "+this.resourceId+" cannot be retrieved on the DB"); } vreName= resGenericInfo.getString(1); ResultSet resRelatedGHN=DBInterface.queryDB("select VRERELATEDGHN.ghnid from VRERELATEDGHN where VRERELATEDGHN.vreid='"+this.resourceId+"'; "); if (!resRelatedGHN.next()){ DBInterface.ExecuteUpdate("UPDATE VRE SET STATUS='Failed' WHERE VRE.id='"+this.resourceId+"';"); } firstGHNId= resRelatedGHN.getString(1); } catch (SQLException e) { logger.error("HSQLDB Error "+e); throw new GCUBEFault(e); } // couple: first String is the VREName, second string is the GHNId VREManagerServiceHandler> vreManagerHandler= new VREManagerServiceHandler>(){ @Override protected String makeCall(VREManagerPortType mbportType) throws Exception { System.out.println("makeCall called"); try{ AddResourcesParameters arp= new AddResourcesParameters(); System.out.println("fin qui ci sono 1"); ServiceList services= new ServiceList(); ServiceItem[] service= new ServiceItem[1]; service[0]=new ServiceItem(); service[0].setServiceClass("VREManagement"); service[0].setServiceName("VREManager"); service[0].setServiceVersion("1.00.00"); services.setService(service); System.out.println("fin qui ci sono 2"); services.setGHN(new String[]{this.getParameter().second}); arp.setServices(services); System.out.println(ServiceContext.getContext().getScope()); arp.setTargetScope(ServiceContext.getContext().getScope().toString()+"/"+this.getParameter().first); String reportId=mbportType.addResources(arp); System.out.println("fin qui ci sono 3"); String report; int attempt=0; do{ this.wait(30000); report=mbportType.getReport(reportId); attempt++; System.out.println("report:"); System.out.println(report); }while (!isDeploymentStatusFinished(report) && attempt<10); }catch(Exception e){e.printStackTrace(); throw e;} return ""; } }; System.out.println(vreName); System.out.println(firstGHNId); vreManagerHandler.setHandled(new GCUBEServiceClientImpl()); Couple coupleParams= new Couple(vreName, firstGHNId); vreManagerHandler.setParameter(coupleParams); try { vreManagerHandler.run(); } catch (Exception e) { logger.error("Error deploying the VRE "+e); throw new GCUBEFault(e); } this.vreName= vreName; } private void createVRE() throws GCUBEFault{ VREManagerServiceHandler vreManagerHandler= new VREManagerServiceHandler(){ //the parameter is resourceID @Override protected String makeCall(VREManagerPortType vreManPortType) throws Exception { OptionsParameters ops; ResultSet resGenericInfo = DBInterface.queryDB("select VRE.name from VRE where VRE.id='"+this.getParameter()+"'; "); if (!resGenericInfo.next()) { throw new GCUBEFault("The VRE with ID "+this.getParameter()+" cannot be retrieved on the DB"); } if (!resGenericInfo.next()) throw new GCUBEFault("The VRE with ID "+this.getParameter()+" cannot be retrieved"); ops=new OptionsParameters(); ScopeOption[] scopeOptionList= new ScopeOption[6]; ScopeOption soDesigner= new ScopeOption(); soDesigner.setName("DESIGNER"); soDesigner.setValue(resGenericInfo.getString("vredesigner")); scopeOptionList[0]= soDesigner; ScopeOption soCreator= new ScopeOption(); soCreator.setName("CREATOR"); soCreator.setValue(resGenericInfo.getString("vremanager")); scopeOptionList[1]= soCreator; ScopeOption soEndtime= new ScopeOption(); soEndtime.setName("ENDTIME"); soEndtime.setValue(KGCUBEResource.toXMLDateAndTime(resGenericInfo.getDate("IntervalTo"))); scopeOptionList[2]= soEndtime; ScopeOption soStarttime= new ScopeOption(); soStarttime.setName("STARTTIME"); soStarttime.setValue(KGCUBEResource.toXMLDateAndTime(resGenericInfo.getDate("IntervalFrom"))); scopeOptionList[3]= soStarttime; ScopeOption soDescription= new ScopeOption(); soDescription.setName("DESCRIPTION"); soDescription.setValue(resGenericInfo.getString("description")); scopeOptionList[4]= soDescription; ScopeOption soDisplayname= new ScopeOption(); soDisplayname.setName("DISPLAYNAME"); soDisplayname.setValue(resGenericInfo.getString("name")); scopeOptionList[5]= soDisplayname; ops.setScopeOptionList(scopeOptionList); vreManPortType.setScopeOptions(ops); //Adding the resources to the new VRE AddResourcesParameters arp= new AddResourcesParameters(); ResourceList rl= new ResourceList(); List resItemList= new ArrayList(); //retrieving Collection try{ ResourceItem resItem; ResultSet resRelatedCol =DBInterface.queryDB("select VRERELATEDCOLLECTION.collid from VRERELATEDCOLLECTION where VRERELATEDCOLLECTION.vreid='"+this.getParameter()+"';"); while (resRelatedCol.next()){ resItem= new ResourceItem(); resItem.setID(resRelatedCol.getString(1)); resItem.setType(GCUBECollection.TYPE); resItemList.add(resItem); } }catch(SQLException sqle){logger.error("Error contacting HSQLDB");} //retrieving MDCollection with native MDFormat try{ ResourceItem resItem; ResultSet resMdColNative =DBInterface.queryDB("select mdcollid from SELECTEDNATIVEMDFROMAT AS s where s.vreid='"+this.getParameter()+"';"); while (resMdColNative.next()){ resItem= new ResourceItem(); resItem.setID(resMdColNative.getString(1)); System.out.println(resItem.getID()); resItem.setType(GCUBEMCollection.TYPE); resItemList.add(resItem); } }catch(SQLException sqle){logger.error("Error contacting HSQLDB");} rl.setResource(resItemList.toArray(new ResourceItem[0])); arp.setResources(rl); //retrieve services ServiceList serviceList= new ServiceList(); try{ ServiceItem servItem; List listService= new ArrayList(); ResultSet resMdColNative =DBInterface.queryDB("select s.name, s.class from VRERELATEDFUNCTIONALITY AS vrf, SERVICES AS s where vrf.vreid='"+this.getParameter()+"' AND s.id=vrf.funcid;"); while (resMdColNative.next()){ servItem= new ServiceItem(); servItem.setServiceClass(resMdColNative.getString("class")); servItem.setServiceName(resMdColNative.getString("name")); listService.add(servItem); } serviceList.setService(listService.toArray(new ServiceItem[0])); }catch(SQLException sqle){logger.error("Error contacting HSQLDB");} //retrieve the GHN try{ List listGHN= new ArrayList(); ResultSet resGHN =DBInterface.queryDB("select ghnih, s.class from VRERELATEDGHN where vrf.vreid='"+this.getParameter()+"';"); //eliminating the First GHN used for VREManager Deployment resGHN.next(); while (resGHN.next()){ listGHN.add(resGHN.getString(1)); } serviceList.setGHN(listGHN.toArray(new String[0])); }catch(SQLException sqle){logger.error("Error contacting HSQLDB");} arp.setServices(serviceList); String reportId=vreManPortType.addResources(arp); String report; int attempt=0; GCUBEGenericResource statusResource=null; do{ this.wait(20000); report=vreManPortType.getReport(reportId); attempt++; try { publisher= GHNContext.getImplementation(ISPublisher.class); if (statusResource==null){ statusResource= GHNContext.getImplementation(GCUBEGenericResource.class); statusResource.setID(resourceId); statusResource.setSecondaryType("VREDefinitionStatus"); statusResource.setDescription("VRE Status"); statusResource.setName(vreName); } statusResource.setBody(report); publisher.registerGCUBEResource(statusResource, ServiceContext.getContext().getScope(), ServiceContext.getContext()); }catch(Exception e){logger.error("Error publishing the status");} }while (!isDeploymentStatusFinished(report) && attempt<20); return "FINISHED"; } }; vreManagerHandler.setHandled(new GCUBEServiceClientImpl()); vreManagerHandler.setParameter(this.resourceId); try { vreManagerHandler.run(); } catch (Exception e) { throw new GCUBEFault(e); } } private boolean isDeploymentStatusFinished(String report) { boolean ret = false; String xpath = "/ResourceReport/DeploymentActivity/GHN/LastReportReceived/Status"; DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db; try { db = dbf.newDocumentBuilder(); Document document = db.parse(new ByteArrayInputStream(report.getBytes())); XPath engine = XPathFactory.newInstance().newXPath(); NodeList nl = (NodeList) engine.evaluate(xpath,document, XPathConstants.NODESET); for (int i = 0; i < nl.getLength(); i++) { if(i==0){ ret = true; } if(nl.item(i).getFirstChild().getNodeValue().compareTo("CLOSED")!=0){ ret = false; break; } } } catch (ParserConfigurationException e) { return false; } catch (SAXException e) { return false; } catch (IOException e) { return false; } catch (XPathExpressionException e) { return false; } return ret; } }