package sharpen.xobotos.config.xstream;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.Xpp3DomDriver;
import sharpen.xobotos.api.*;
import sharpen.xobotos.api.actions.*;
import sharpen.xobotos.api.bindings.*;
import sharpen.xobotos.api.interop.*;
import sharpen.xobotos.api.interop.marshal.MarshalAsClass;
import sharpen.xobotos.api.interop.marshal.MarshalAsEnum;
import sharpen.xobotos.api.interop.marshal.MarshalAsPointer;
import sharpen.xobotos.api.interop.marshal.MarshalInfo;
import sharpen.xobotos.api.templates.*;
import sharpen.xobotos.config.ConfigFile;
import sharpen.xobotos.config.LocationFilter;
import sharpen.xobotos.config.SourceInfo;
import sharpen.xobotos.output.NakedStubOutput;
import sharpen.xobotos.output.NullOutput;
import sharpen.xobotos.output.OutputType;
import sharpen.xobotos.output.SharpenOutput;
import sharpen.xobotos.output.StubOutput;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public final class XStreamUtils {
private static XStream prepareXStream() {
XStream xstream = new XStream(new Xpp3DomDriver());
xstream.processAnnotations(new Class[] {
ConfigFile.class,
LocationFilter.class,
SourceInfo.class,
APIDefinition.IncludeFile.class,
TemplateSection.IncludeFile.class,
// API
APIDefinition.class,
Visibility.class,
TypeReference.class,
Filter.class,
MemberKind.class,
// Output Types
OutputType.class,
NullOutput.class,
SharpenOutput.class,
StubOutput.class,
NakedStubOutput.class,
// API Templates
AbstractTemplate.class,
AbstractMemberTemplate.class,
AbstractMethodTemplate.class,
TypeTemplate.class,
AnonymousClassTemplate.class,
MethodTemplate.class,
FieldTemplate.class,
AbstractLocationTemplate.class,
CompilationUnitTemplate.class,
NamespaceTemplate.class,
DestructorTemplate.class,
PropertyTemplate.class,
VariableTemplate.class,
NamespaceTemplateSection.class,
// API Actions
AbstractAction.class,
MemberAction.class,
ModifyMember.class,
ModifyType.class,
ModifyMethodBase.class,
ModifyMethod.class,
ModifyConstructor.class,
ModifyField.class,
ModifyProperty.class,
ModifyEnum.class,
ActionList.class,
// API Bindings
MemberBinding.class,
AbstractTypeBinding.class,
TypeBinding.class,
EnumBinding.class,
EnumBinding.ExtractedEnumInfo.class,
AbstractTypeBinding.class,
CompilationUnitBinding.class,
MethodBinding.class,
VariableBinding.class,
// API Interop
NativeConfiguration.class,
NativeMethod.class,
NativeMethod.Kind.class,
Signature.class,
Signature.Mode.class,
Signature.Flags.class,
Signature.TypeInfo.class,
Signature.ParameterInfo.class,
MarshalInfo.MarshalEntry.class,
MarshalAsClass.Entry.class,
MarshalAsEnum.Entry.class,
MarshalAsPointer.Entry.class,
NativeTypeTemplate.class,
NativeHandle.class,
NativeType.class,
NativeStruct.class,
NativeStruct.MemberInfo.class
});
return xstream;
}
public static <T extends IConfigurationFile> void write(String fileName, T config) throws IOException {
FileWriter writer = new FileWriter(fileName);
XStream xstream = prepareXStream();
xstream.toXML(config, writer);
writer.close();
}
public static <T extends IConfigurationFile> T read(String fileName, Class<T> klass) {
try {
FileReader reader = new FileReader(fileName);
XStream xstream = prepareXStream();
xstream.setMode(XStream.ID_REFERENCES);
return klass.cast(xstream.fromXML(reader));
} catch (FileNotFoundException e) {
throw new RuntimeException("Cannot read configuration file: " + fileName);
}
}
protected static <T extends IConfigurationFile, U extends IConfigurationFragment> U readFragment(
RootContext<T> root, String fileName, Class<U> klass) {
try {
String fullName = root.getProjectRoot().getPath() + File.separatorChar + fileName;
FileReader reader = new FileReader(fullName);
XStream xstream = prepareXStream();
xstream.setMarshallingStrategy(root.getMarshallingStrategy());
U result = klass.cast(xstream.fromXML(reader));
if (result == null)
throw new RuntimeException("Cannot read configuration file: " + fileName);
return result;
} catch (FileNotFoundException e) {
throw new RuntimeException("Cannot read configuration file: " + fileName);
}
}
}