package com.evolveum.midpoint.tools.ninja;
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.PrismProperty;
import com.evolveum.midpoint.prism.polystring.PolyString;
import com.evolveum.midpoint.repo.api.RepositoryService;
import com.evolveum.midpoint.schema.ResultHandler;
import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.schema.SchemaConstantsGenerated;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
import org.apache.commons.io.IOUtils;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
/**
* @author lazyman
*/
public class ExportObjects extends BaseNinjaAction {
private String filePath;
public ExportObjects(String filePath) {
this.filePath = filePath;
}
private String createHeaderForXml() {
StringBuilder builder = new StringBuilder();
builder.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
builder.append("<objects xmlns='").append(SchemaConstantsGenerated.NS_COMMON).append("'\n");
builder.append("\txmlns:c='").append(SchemaConstantsGenerated.NS_COMMON).append("'\n");
builder.append("\txmlns:org='").append(SchemaConstants.NS_ORG).append("'>\n");
return builder.toString();
}
public boolean execute() throws UnsupportedEncodingException, FileNotFoundException {
System.out.println("Starting objects export.");
File file = new File(filePath);
if (file.exists() || file.canRead()) {
System.out.println("XML file already exists, export won't be done.");
return false;
}
final ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(CONTEXTS);
final OutputStreamWriter stream = new OutputStreamWriter(new FileOutputStream(file), "utf-8");
try {
System.out.println("Loading spring contexts.");
System.out.println("Set repository.");
RepositoryService repository = context.getBean("repositoryService", RepositoryService.class);
ResultHandler<ObjectType> handler = new ResultHandler<ObjectType>()
{
PrismContext prismContext = context.getBean(PrismContext.class);
@Override
public boolean handle(PrismObject<ObjectType> object, OperationResult parentResult)
{
String displayName = getDisplayName(object);
System.out.println("Exporting object " + displayName);
OperationResult resultExport = new OperationResult("Export " + displayName);
try
{
String stringObject = prismContext.serializeObjectToString(object, PrismContext.LANG_XML);
stream.write("\t" + stringObject + "\n");
}
catch (Exception ex)
{
System.out.println("Failed to parse objects to string for xml. Reason: " + ex);
resultExport.recordFatalError("Failed to parse objects to string for xml. Reason: ", ex);
}
return true;
}
};
stream.write(createHeaderForXml());
OperationResult result = new OperationResult("search set");
System.out.println("Creating xml file " + file.getName());
repository.searchObjectsIterative(ObjectType.class, null, handler, null, false, result);
stream.write("</objects>");
System.out.println("Created xml file " + file.getName());
} catch (Exception ex) {
System.out.println("Exception occurred during context loading, reason: " + ex.getMessage());
ex.printStackTrace();
} finally {
destroyContext(context);
if (stream != null)
{
IOUtils.closeQuietly(stream);
}
}
System.out.println("Objects export finished.");
return true;
}
private String getDisplayName(PrismObject object) {
StringBuilder builder = new StringBuilder();
//name
PolyString name = getName(object);
if (name != null) {
builder.append(name.getOrig());
}
//oid
if (builder.length() != 0) {
builder.append(' ');
}
builder.append('\'').append(object.getOid()).append('\'');
return builder.toString();
}
private PolyString getName(PrismObject object) {
PrismProperty property = object.findProperty(ObjectType.F_NAME);
if (property == null || property.isEmpty()) {
return null;
}
return (PolyString) property.getRealValue(PolyString.class);
}
}