/* * Copyright (C) 2008 Universidade Federal de Campina Grande * * This file is part of OurGrid. * * OurGrid is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free * Software Foundation, either version 3 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * */ package org.ourgrid.broker.controlws; import java.io.File; import java.io.FileDescriptor; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import org.ourgrid.common.interfaces.management.BrokerManager; import org.ourgrid.common.interfaces.to.BrokerCompleteStatus; import org.ourgrid.common.specification.exception.JobSpecificationException; import org.ourgrid.common.specification.job.IOBlock; import org.ourgrid.common.specification.job.IOEntry; import org.ourgrid.common.specification.job.JobSpecification; import org.ourgrid.common.specification.job.TaskSpecification; import org.ourgrid.common.specification.main.CompilerException; import org.ourgrid.common.specification.main.DescriptionFileCompile; import org.ourgrid.common.specification.peer.PeerSpecification; import br.edu.ufcg.lsd.commune.container.control.ControlOperationResult; import br.edu.ufcg.lsd.commune.container.servicemanager.client.InitializationContext; import br.edu.ufcg.lsd.commune.container.servicemanager.client.sync.SyncApplicationClient; import br.edu.ufcg.lsd.commune.container.servicemanager.client.sync.SyncContainerUtil; import br.edu.ufcg.lsd.commune.context.ModuleContext; import br.edu.ufcg.lsd.commune.network.xmpp.CommuneNetworkException; import br.edu.ufcg.lsd.commune.processor.ProcessorStartException; public class BrokerControlWSFacade extends SyncApplicationClient<BrokerManager, BrokerControlWSManagerClient> { private static final String WS_FILES_DIR = "wsfiles"; private static final String FILE_SEP = System.getProperty("file.separator"); public BrokerControlWSFacade(ModuleContext context) throws CommuneNetworkException, ProcessorStartException { super("BROKER_SYNC_WEB_SERVICE", context); } @Override protected InitializationContext<BrokerManager, BrokerControlWSManagerClient> createInitializationContext() { return new BrokerControlWSInitializationContext(); } public ControlOperationResult addJob( WSJobSpec job ) { setJobFilesDir(job); getManager().addJob(getManagerClient(), convertJobSpec(job)); return SyncContainerUtil.waitForResponseObject(queue, ControlOperationResult.class); } public ControlOperationResult cancelJob( int jobID ) { getManager().cancelJob(getManagerClient(), jobID); return SyncContainerUtil.waitForResponseObject(queue, ControlOperationResult.class); } public ControlOperationResult cleanAllFinishedJobs() { getManager().cleanAllFinishedJobs(getManagerClient()); return SyncContainerUtil.waitForResponseObject(queue, ControlOperationResult.class); } public ControlOperationResult cleanFinishedJob( int jobID ) { getManager().cleanFinishedJob(getManagerClient(), jobID); return SyncContainerUtil.waitForResponseObject(queue, ControlOperationResult.class); } public BrokerCompleteStatus getBrokerCompleteStatus() { getManager().getCompleteStatus(getManagerClient()); return SyncContainerUtil.waitForResponseObject(queue, BrokerCompleteStatus.class); } public byte[] getFile(String fileName) { File file = new File(WS_FILES_DIR + FILE_SEP + fileName); InputStream is = null; try { is = new FileInputStream(file); } catch (FileNotFoundException fe) { return new byte[0]; } long length = file.length(); if (length > Integer.MAX_VALUE) { return new byte[0]; } byte[] bytes = new byte[(int)length]; int offset = 0; int numRead = 0; try { while (offset < bytes.length && (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) { offset += numRead; } if (offset < bytes.length) { throw new IOException("N�o foi poss�vel ler o arquivo "+file.getName()); } is.close(); } catch (IOException ioe) { return new byte[0]; } return bytes; } public void sendFile(byte[] file, String fileName) { File ws = new File(WS_FILES_DIR); try{ if (!ws.exists()) { ws.mkdir(); } FileOutputStream fos = new FileOutputStream(WS_FILES_DIR + FILE_SEP + fileName); fos.write(file); FileDescriptor fd = fos.getFD(); fos.flush(); fd.sync(); fos.close(); } catch(Exception e){ e.printStackTrace(); } } private void setJobFilesDir(WSJobSpec job) { File ws = new File(WS_FILES_DIR); if (!ws.exists()) { ws.mkdir(); } List<WSTaskSpec> taskSpecs = job.getTaskSpecs(); if (taskSpecs != null) { List<WSIOEntry> initBlock = null; String srcFile = null; List<WSIOEntry> finalBlock = null; String destFile = null; for (WSTaskSpec task : taskSpecs) { initBlock = task.getInitBlock(); if (initBlock != null) { for (WSIOEntry ioEntry : initBlock) { srcFile = ioEntry.getSourceFile(); ioEntry.setSourceFile(ws.getAbsolutePath() + FILE_SEP + srcFile); } } finalBlock = task.getFinalBlock(); if (finalBlock != null) { for (WSIOEntry ioEntry : finalBlock) { destFile = ioEntry.getDestination(); ioEntry.setDestination(ws.getAbsolutePath() + FILE_SEP + destFile); } } } } } private JobSpecification convertJobSpec(WSJobSpec wsSpec) { JobSpecification spec = new JobSpecification(); spec.setLabel(wsSpec.getLabel()); spec.setRequirements(wsSpec.getRequirements()); List<WSTaskSpec> wsTasks = wsSpec.getTaskSpecs(); List<TaskSpecification> tasks = new ArrayList<TaskSpecification>(); if (wsTasks != null) { TaskSpecification taskSpec = null; IOBlock initBlock = null; IOBlock finalBlock = null; for (WSTaskSpec wsTask : wsTasks) { taskSpec = new TaskSpecification(); taskSpec.setRemoteExec(wsTask.getRemoteExec()); taskSpec.setSabotageCheck(wsTask.getSabotageCheck()); taskSpec.setSourceDirPath(wsTask.getSourceParentDir()); taskSpec.setTaskSequenceNumber(wsTask.getTaskSequenceNumber()); initBlock = new IOBlock(); List<WSIOEntry> wsInitBlock = wsTask.getInitBlock(); if (wsInitBlock != null) { for (WSIOEntry wsEntry : wsInitBlock) { initBlock.putEntry(new IOEntry(wsEntry.getCommand(), wsEntry.getSourceFile(), wsEntry.getDestination())); } taskSpec.setInitBlock(initBlock); } finalBlock = new IOBlock(); List<WSIOEntry> wsFinalBlock = wsTask.getFinalBlock(); if (wsFinalBlock != null) { for (WSIOEntry wsEntry : wsFinalBlock) { finalBlock.putEntry(new IOEntry(wsEntry.getCommand(), wsEntry.getSourceFile(), wsEntry.getDestination())); } taskSpec.setFinalBlock(finalBlock); } tasks.add(taskSpec); } } try { spec.setTaskSpecs(tasks); } catch (JobSpecificationException e) { e.printStackTrace(); } return spec; } }