Skip to content

Commit

Permalink
MID-4924 (Post-initial import) removing mistakes with more objects in…
Browse files Browse the repository at this point in the history
… one file
  • Loading branch information
skublik committed Oct 11, 2018
1 parent aff61a7 commit 34d8676
Showing 1 changed file with 48 additions and 47 deletions.
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2010-2013 Evolveum
* Copyright (c) 2010-2018 Evolveum
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand All @@ -19,6 +19,7 @@
import com.evolveum.midpoint.model.api.ScriptExecutionResult;
import com.evolveum.midpoint.model.api.ScriptingService;
import com.evolveum.midpoint.prism.Item;
import com.evolveum.midpoint.prism.PrismContainer;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.PrismProperty;
import com.evolveum.midpoint.prism.delta.ObjectDelta;
Expand Down Expand Up @@ -53,6 +54,7 @@ public class PostInitialDataImport extends DataImport{
private static final Trace LOGGER = TraceManager.getTrace(PostInitialDataImport.class);

private static final String SUFFIX_FOR_IMPORTED_FILE = "done";
private static final String XML_SUFFIX = "xml";

private ScriptingService scripting;

Expand All @@ -68,58 +70,57 @@ public void init() throws SchemaException {
Task task = taskManager.createTaskInstance(OPERATION_INITIAL_OBJECTS_IMPORT);
task.setChannel(SchemaConstants.CHANNEL_GUI_INIT_URI);

int countImpotredObjects = 0;
int countExecutedScripts = 0;

File[] files = getPostInitialImportObjects();
LOGGER.debug("Files to be imported: {}.", Arrays.toString(files));

SecurityContext securityContext = provideFakeSecurityContext();

int countImpotredObjects = 0;
int countExecutedScripts = 0;

for (File file : files) {
if(FilenameUtils.getExtension(file.getName()).equals(SUFFIX_FOR_IMPORTED_FILE)) {
continue;
}
if(!FilenameUtils.getExtension(file.getName()).equals(XML_SUFFIX)) {
LOGGER.warn("Post-initial import support only xml files. Actual file: " + file.getName());
continue;
}
Item item = null;
try {
item = prismContext.parserFor(file).parseItem();
} catch (Exception ex) {
LoggingUtils.logUnexpectedException(LOGGER, "Couldn't parse file {}", ex, file.getName());
mainResult.recordFatalError("Couldn't parse file '" + file.getName() + "'", ex);
}
if(item instanceof PrismObject) {
try {
LOGGER.debug("Considering post-initial import of file {}.", file.getName());
PrismObject object = (PrismObject)item;
if (ReportType.class.equals(object.getCompileTimeClass())) {
ReportTypeUtil.applyDefinition(object, prismContext);
}

Boolean importObject = importObject(object, file, task, mainResult);
if (importObject) {
file.renameTo(new File(file.getPath() + "." + SUFFIX_FOR_IMPORTED_FILE));
countImpotredObjects++;
} else {
break;
}
} catch (Exception ex) {
LoggingUtils.logUnexpectedException(LOGGER, "Couldn't import file {}", ex, file.getName());
mainResult.recordFatalError("Couldn't import file '" + file.getName() + "'", ex);
}
} else if(item instanceof PrismProperty && (((PrismProperty)item).getRealValue() instanceof ScriptingExpressionType) || ((PrismProperty)item).getRealValue() instanceof ExecuteScriptType){
PrismProperty<Object> expression = (PrismProperty<Object>)item;
Boolean executeScript = executeScript(expression, file, task, mainResult);
if (executeScript) {
file.renameTo(new File(file.getPath() + "." + SUFFIX_FOR_IMPORTED_FILE));
countExecutedScripts++;
} else {
break;
}
} else {
mainResult.recordFatalError("\"Provided file" + file.getName() +" is not a bulk action object or prism object.\"");
}

if(item instanceof PrismProperty && (((PrismProperty)item).getRealValue() instanceof ScriptingExpressionType || ((PrismProperty)item).getRealValue() instanceof ExecuteScriptType)){
PrismProperty<Object> expression = (PrismProperty<Object>)item;
Boolean executeScript = executeScript(expression, file, task, mainResult);
if (executeScript) {
file.renameTo(new File(file.getPath() + "." + SUFFIX_FOR_IMPORTED_FILE));
countExecutedScripts++;
} else {
break;
}
} else {
try {
LOGGER.debug("Considering post-initial import of file {}.", file.getName());

Boolean importObject = importObject(file, task, mainResult);
if (importObject) {
file.renameTo(new File(file.getPath() + "." + SUFFIX_FOR_IMPORTED_FILE));
countImpotredObjects++;
} else {
break;
}
} catch (Exception ex) {
LoggingUtils.logUnexpectedException(LOGGER, "Couldn't import file {}", ex, file.getName());
mainResult.recordFatalError("Couldn't import file '" + file.getName() + "'", ex);
}
}
}

securityContext.setAuthentication(null);

mainResult.recomputeStatus("Couldn't import objects.");
Expand All @@ -129,29 +130,24 @@ public void init() throws SchemaException {
LOGGER.trace("Initialization status:\n" + mainResult.debugDump());
}
}

/**
* @param object
* @param task
* @param mainResult
* @return true if it was success, otherwise false
*/
private <O extends ObjectType> Boolean importObject(PrismObject<O> object, File file, Task task, OperationResult mainResult) {
private <O extends ObjectType> Boolean importObject(File file, Task task, OperationResult mainResult) {
OperationResult result = mainResult.createSubresult(OPERATION_IMPORT_OBJECT);
preImportUpdate(object);

ObjectDelta delta = ObjectDelta.createAddDelta(object);
try {
LOGGER.info("Starting post-initial import of file {}.", file.getName());
ImportOptionsType options = new ImportOptionsType();
options.overwrite(true);
model.importObjectsFromFile(file, options, task, result);
result.recordSuccess();
LOGGER.info("Created {} as part of post-initial import", object);
return true;
} catch (Exception e) {
LoggingUtils.logUnexpectedException(LOGGER, "Couldn't import {} from file {}: ", e, object,
file.getName(), e.getMessage());
LoggingUtils.logUnexpectedException(LOGGER, "Couldn't import object from file {}: ", e, file.getName(), e.getMessage());
result.recordFatalError(e);

LOGGER.info("\n" + result.debugDump());
Expand Down Expand Up @@ -220,13 +216,18 @@ private File[] getPostInitialImportObjects() {

private File[] listFiles(File folder) {
File[] files = folder.listFiles();
File[] retFiles =new File[0];
for(File file: files){
if(file.isFile()){
retFiles = (File[])ArrayUtils.add(retFiles, file);
continue;
}
if(file.isDirectory()){
files = (File[])ArrayUtils.removeElement(files, file);
files = (File[])ArrayUtils.addAll(files, listFiles(file));

retFiles = (File[])ArrayUtils.addAll(retFiles, listFiles(file));
}
}
return files;
return retFiles;
}

private boolean checkDirectoryExistence(String dir) {
Expand Down

0 comments on commit 34d8676

Please sign in to comment.