package net.sf.openrocket.file.openrocket.importt;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import net.sf.openrocket.aerodynamics.Warning;
import net.sf.openrocket.aerodynamics.WarningSet;
import net.sf.openrocket.file.DocumentLoadingContext;
import net.sf.openrocket.file.simplesax.AbstractElementHandler;
import net.sf.openrocket.file.simplesax.ElementHandler;
import net.sf.openrocket.rocketcomponent.RocketComponent;
import net.sf.openrocket.util.BugException;
import net.sf.openrocket.util.Reflection;
/**
* A handler that creates components from the corresponding elements. The control of the
* contents is passed on to ComponentParameterHandler.
*/
class ComponentHandler extends AbstractElementHandler {
private final DocumentLoadingContext context;
private final RocketComponent parent;
public ComponentHandler(RocketComponent parent, DocumentLoadingContext context) {
this.parent = parent;
this.context = context;
}
@Override
public ElementHandler openElement(String element, HashMap<String, String> attributes,
WarningSet warnings) {
// Attempt to construct new component
Constructor<? extends RocketComponent> constructor = DocumentConfig.constructors
.get(element);
if (constructor == null) {
warnings.add(Warning.fromString("Unknown element " + element + ", ignoring."));
return null;
}
RocketComponent c;
try {
c = constructor.newInstance();
} catch (InstantiationException e) {
throw new BugException("Error constructing component.", e);
} catch (IllegalAccessException e) {
throw new BugException("Error constructing component.", e);
} catch (InvocationTargetException e) {
throw Reflection.handleWrappedException(e);
}
parent.addChild(c);
return new ComponentParameterHandler(c, context);
}
}