Fixed recently introduced multiplexer issue where DoC couldn't be written

directly to command-line.


git-svn-id: file:///humgen/gsa-scr1/gsa-engineering/svn_contents/trunk@4839 348d0f76-0448-11de-a6fe-93d51630548a
This commit is contained in:
hanna 2010-12-14 19:35:15 +00:00
parent c167c6f9eb
commit 67c07d1a6a
6 changed files with 27 additions and 11 deletions

View File

@ -167,6 +167,23 @@ public class ArgumentSource {
return field.isAnnotationPresent(Deprecated.class);
}
/**
* Returns false if a type-specific default can be employed.
* @return True to throw in a type specific default. False otherwise.
*/
public boolean createsTypeDefault() {
return typeDescriptor.createsTypeDefault(this);
}
/**
* Generates a default for the given type.
* @param parsingEngine the parsing engine used to validate this argument type descriptor.
* @return A default value for the given type.
*/
public Object createTypeDefault(ParsingEngine parsingEngine) {
return typeDescriptor.createTypeDefault(parsingEngine,this,field.getType());
}
/**
* Builds out a new type descriptor for the given dependent argument as a function
* of the containing object.

View File

@ -84,9 +84,10 @@ public abstract class ArgumentTypeDescriptor {
* Generates a default for the given type.
* @param parsingEngine the parsing engine used to validate this argument type descriptor.
* @param source Source of the command-line argument.
* @param type Type of value to create, in case the command-line argument system wants influence.
* @return A default value for the given type.
*/
public Object createTypeDefault(ParsingEngine parsingEngine,ArgumentSource source) { throw new UnsupportedOperationException("Unable to create default for type " + getClass()); }
public Object createTypeDefault(ParsingEngine parsingEngine,ArgumentSource source,Class<?> type) { throw new UnsupportedOperationException("Unable to create default for type " + getClass()); }
/**
* Given the given argument source and attributes, synthesize argument definitions for command-line arguments.
@ -503,7 +504,7 @@ class MultiplexArgumentTypeDescriptor extends ArgumentTypeDescriptor {
}
@Override
public Object createTypeDefault(ParsingEngine parsingEngine,ArgumentSource source) {
public Object createTypeDefault(ParsingEngine parsingEngine,ArgumentSource source,Class<?> type) {
if(multiplexer == null || multiplexedIds == null)
throw new ReviewedStingException("No multiplexed ids available");
@ -514,7 +515,7 @@ class MultiplexArgumentTypeDescriptor extends ArgumentTypeDescriptor {
for(Object id: multiplexedIds) {
Object value = null;
if(componentTypeDescriptor.createsTypeDefault(source))
value = componentTypeDescriptor.createTypeDefault(parsingEngine,source);
value = componentTypeDescriptor.createTypeDefault(parsingEngine,source,componentType);
multiplexedMapping.put(id,value);
}
return multiplexedMapping;

View File

@ -326,10 +326,8 @@ public class ParsingEngine {
* @param instance Object into which to inject the value. The target might be in a container within the instance.
*/
private void loadValueIntoObject( ArgumentSource source, Object instance, ArgumentMatches argumentMatches ) {
ArgumentTypeDescriptor typeDescriptor = selectBestTypeDescriptor(source.field.getType());
// Nothing to load
if( argumentMatches.size() == 0 && !(typeDescriptor.createsTypeDefault(source) && source.isRequired()))
if( argumentMatches.size() == 0 && !(source.createsTypeDefault() && source.isRequired()))
return;
// Target instance into which to inject the value.
@ -340,7 +338,7 @@ public class ParsingEngine {
throw new ReviewedStingException("Internal command-line parser error: unable to find a home for argument matches " + argumentMatches);
for( Object target: targets ) {
Object value = (argumentMatches.size() != 0) ? source.parse(this,argumentMatches) : typeDescriptor.createTypeDefault(this,source);
Object value = (argumentMatches.size() != 0) ? source.parse(this,argumentMatches) : source.createTypeDefault(this);
JVMUtils.setFieldValue(source.field,target,value);
}

View File

@ -69,12 +69,12 @@ public class OutputStreamArgumentTypeDescriptor extends ArgumentTypeDescriptor {
}
@Override
public Object createTypeDefault(ParsingEngine parsingEngine,ArgumentSource source) {
public Object createTypeDefault(ParsingEngine parsingEngine,ArgumentSource source,Class type) {
if(!source.isRequired())
throw new ReviewedStingException("BUG: tried to create type default for argument type descriptor that can't support a type default.");
OutputStreamStub stub = new OutputStreamStub(defaultOutputStream);
engine.addOutput(stub);
return createInstanceOfClass(source.field.getType(),stub);
return createInstanceOfClass(type,stub);
}
@Override

View File

@ -88,7 +88,7 @@ public class SAMFileWriterArgumentTypeDescriptor extends ArgumentTypeDescriptor
}
@Override
public Object createTypeDefault(ParsingEngine parsingEngine,ArgumentSource source) {
public Object createTypeDefault(ParsingEngine parsingEngine,ArgumentSource source,Class<?> type) {
if(!source.isRequired())
throw new ReviewedStingException("BUG: tried to create type default for argument type descriptor that can't support a type default.");
SAMFileWriterStub stub = new SAMFileWriterStub(engine,defaultOutputStream);

View File

@ -108,7 +108,7 @@ public class VCFWriterArgumentTypeDescriptor extends ArgumentTypeDescriptor {
}
@Override
public Object createTypeDefault(ParsingEngine parsingEngine,ArgumentSource source) {
public Object createTypeDefault(ParsingEngine parsingEngine,ArgumentSource source,Class<?> type) {
if(!source.isRequired())
throw new ReviewedStingException("BUG: tried to create type default for argument type descriptor that can't support a type default.");
VCFWriterStub stub = new VCFWriterStub(engine, defaultOutputStream, false, argumentSources, false);