Home | History | Annotate | Download | only in releng
      1 /*******************************************************************************
      2  * Copyright (c) 2000, 2006 IBM Corporation and others.
      3  * All rights reserved. This program and the accompanying materials
      4  * are made available under the terms of the Eclipse Public License v1.0
      5  * which accompanies this distribution, and is available at
      6  * http://www.eclipse.org/legal/epl-v10.html
      7  *
      8  * Contributors:
      9  *     IBM Corporation - initial API and implementation
     10  *******************************************************************************/
     11 /*
     12  * Created on 8-Jan-2004
     13  *
     14  * To change this generated comment go to
     15  * Window>Preferences>Java>Code Generation>Code Template
     16  */
     17 package org.eclipse.releng;
     18 
     19 import java.io.File;
     20 import java.io.FileInputStream;
     21 import java.io.FileNotFoundException;
     22 import java.io.FileWriter;
     23 import java.io.IOException;
     24 import java.util.StringTokenizer;
     25 import java.util.Properties;
     26 import java.io.PrintWriter;
     27 
     28 /**
     29  * @author SDimitrov
     30  *
     31  * This class finds an available build machine by reading a registry of build
     32  * machines and their status.
     33  *
     34  */
     35 public class BuildMachineManager extends Thread {
     36 	// registry mapping of machines being used by a given build
     37 	//list is the path to the configuration of build machines available for a
     38 	// given build type
     39 	// waitInterval is the number of seconds to wait if no machines are
     40 	// available for a given build purpose
     41 	// findKey represents the key in cfg from which which to obtain the list of
     42 	// machines
     43 	// createKey is written to the registry with the machine name that is
     44 	// available
     45 
     46 	private String markerContainer;
     47 	private int waitInterval;
     48 	private String markerName;
     49 	private String markerKey="0";
     50 	private String cfgKey;
     51 	private String cfg;
     52 
     53 	public BuildMachineManager() {
     54 		super();
     55 	}
     56 	public BuildMachineManager(
     57 		String cfg,
     58 		String markerContainer,
     59 		int waitInterval,
     60 		String markerName,
     61 		String markerKey,
     62 		String cfgKey) {
     63 		this.waitInterval = waitInterval;
     64 		this.cfg = cfg;
     65 		this.markerContainer = markerContainer;
     66 		this.markerName = markerName;
     67 		this.markerKey = markerKey;
     68 		this.cfgKey = cfgKey;
     69 		this.run();
     70 	}
     71 
     72 	public void run() {
     73 		String[] machines = getNames();
     74 
     75 		if (new File(markerContainer+"/"+markerName+".marker").exists()){
     76 			System.out.println("Marker already exists: "+markerName+".marker");
     77 			return;
     78 		}
     79 
     80 		boolean machineFound = false;
     81 		try {
     82 			while (!machineFound) {
     83 				for (int i = 0; i < machines.length; i++) {
     84 					if (!inUse(machines[i])) {
     85 						if (createNewMarker(machines[i])) {
     86 							machineFound = true;
     87 							return;
     88 						}
     89 					}
     90 				}
     91 
     92 				//wait a given interval before re-checking for an available
     93 				// build machine.
     94 				sleep(1000 * waitInterval);
     95 			}
     96 		} catch (InterruptedException e) {
     97 			e.printStackTrace();
     98 		}
     99 	}
    100 
    101 	private boolean createNewMarker(String machineName) {
    102 		//create a temporary lock on marker container
    103 
    104 		File lock = new File(markerContainer + "/" + "lock");
    105 		if (lock.exists())
    106 			return false;
    107 
    108 		try {
    109 			File markerFile =  new File(markerContainer+"/"+markerName+".marker");
    110 			lock.createNewFile();
    111 			markerFile.createNewFile();
    112 			PrintWriter out = new PrintWriter(new FileWriter(markerFile));
    113 			out.println(markerKey+"=" + machineName);
    114 			out.flush();
    115 			out.close();
    116 			lock.delete();
    117 		} catch (IOException e) {
    118 			e.printStackTrace();
    119 			return false;
    120 		}
    121 		return true;
    122 	}
    123 
    124 	private boolean inUse(String machineName) {
    125 
    126 		File container = new File(markerContainer);
    127 
    128 		if (container.exists() && container.isDirectory()) {
    129 			Properties properties = null;
    130 			File[] markerFiles = container.listFiles();
    131 			for (int i = 0; i < markerFiles.length; i++) {
    132 				File markerFile = markerFiles[i];
    133 				if (markerFile.getName().endsWith(".marker")) {
    134 					properties = new Properties();
    135 					try {
    136 						FileInputStream in = new FileInputStream(markerFiles[i]);
    137 						properties.load(in);
    138 						in.close();
    139 						if (properties.containsValue(machineName)){
    140 							return true;
    141 						}
    142 					} catch (FileNotFoundException e) {
    143 						e.printStackTrace();
    144 					} catch (IOException e) {
    145 						e.printStackTrace();
    146 					}
    147 				}
    148 			}
    149 		}
    150 		return false;
    151 	}
    152 
    153 	private String[] getNames() {
    154 		StringTokenizer tokenizer = new StringTokenizer(getList(), ",");
    155 		String[] names = new String[tokenizer.countTokens()];
    156 		int i = 0;
    157 
    158 		while (tokenizer.hasMoreTokens()) {
    159 			names[i++] = tokenizer.nextToken();
    160 		}
    161 		return names;
    162 	}
    163 
    164 	private String getList() {
    165 		Properties cfgProperties = new Properties();
    166 		try {
    167 			FileInputStream in = new FileInputStream(new File(cfg));
    168 			cfgProperties.load(in);
    169 			in.close();
    170 
    171 		} catch (FileNotFoundException e) {
    172 			e.printStackTrace();
    173 		} catch (IOException e) {
    174 			e.printStackTrace();
    175 		}
    176 		return cfgProperties.getProperty(cfgKey);
    177 	}
    178 }
    179