/**
*
*/
package jframe.core.unit;
import java.io.File;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import jframe.core.conf.Config;
import jframe.core.util.MathUtil;
import jframe.core.util.PropsConf;
/**
* <p>
* UnitManager
* </p>
*
* @author dzh
* @date Sep 24, 2013 11:07:49 AM
* @since 1.0
*/
public class UnitManager {
private static final Logger LOG = LoggerFactory.getLogger(UnitManager.class);
private List<Unit> _units;
private Config _conf;
public UnitManager(Config conf) {
_units = new LinkedList<Unit>();
_conf = conf;
}
public static final UnitManager createManager(Config conf) {
UnitManager um = new UnitManager(conf);
return um;
}
/**
* register unit, to be unregistered if u exist
*
* @param u
* @return
* @throws UnitException
*/
public Unit regUnit(Unit u) throws UnitException {
if (u == null)
throw new UnitException("Unit is null");
try {
synchronized (_units) {
if (u.getID() > 0 && _units.contains(u)) {
// delete old unit
unregUnit(_units.get(_units.indexOf(u)));
}
u.init(_conf.getFrame());
// TODO calculate unique id
int i = 0;
int[] ids = new int[_units.size()];
for (Unit unit : _units) {
ids[i] = unit.getID();
i++;
}
u.setID(MathUtil.calcMinNum(ids));
_units.add(u);
}
LOG.info("u-{}", u);
u.start();
} catch (Exception e) {
unregUnit(u);
throw new UnitException(e.getMessage(), e.getCause());
}
return u;
}
/**
* unregister unit
*
* @param u
* @return
* @throws UnitException
*/
public Unit unregUnit(Unit u) throws UnitException {
if (u == null)
throw new UnitException("Unit is null");
synchronized (_units) {
_units.remove(u);
}
u.stop();
LOG.info("u-{}", u);
return u;
}
public List<Unit> getAllUnits() {
synchronized (_units) {
return Collections.unmodifiableList(_units);
}
}
public void dispose() {
synchronized (_units) {
Unit[] units = _units.toArray(new Unit[_units.size()]);
for (Unit u : units) {
try {
unregUnit(u);
} catch (UnitException e) {
LOG.warn(e.getMessage(), e.fillInStackTrace());
}
}
}
_units = null;
_conf = null;
}
/**
* <p>
* Initialize Manager and Register Units
* </p>
*
* @throws UnitException
*/
public void start() throws UnitException {
String funit = _conf.getConfig("file.unit", _conf.getConfig(Config.APP_CONF + "/unit.properties"));
if (funit != null && new File(funit).exists()) {
loadUnit(funit);
} else {
loadUnit(null);
}
}
/**
* load unit from unit.properties
*
* @param file
* @throws UnitException
*/
private void loadUnit(String file) throws UnitException {
if (file == null) {
LOG.info("reg default unit");
regUnit(new FrameUnit());
regUnit(new PluginUnit());
return;
}
LOG.info("f-{}", file);
try {
PropsConf props = new PropsConf();
props.init(file);
String[] units = props.getGroupIds();
for (String id : units) {
String clazz = props.getConf(id, "class");
Unit unit = (Unit) Class.forName(clazz, true, Thread.currentThread().getContextClassLoader())
.newInstance();
unit.setName(props.getConf(id, "name", unit.getClass().getSimpleName()));
regUnit(unit);
}
} catch (Exception e) {
throw new UnitException("PropsConf.init error unit-" + file, e.getCause());
}
}
}