Skip to content

Commit

Permalink
Merge branch 'master' of git://git.evolveum.com/midpoint
Browse files Browse the repository at this point in the history
  • Loading branch information
1azyman committed Feb 24, 2014
2 parents 09f0a03 + d8272ee commit 9bd5fd7
Show file tree
Hide file tree
Showing 28 changed files with 2,330 additions and 553 deletions.
Expand Up @@ -17,27 +17,31 @@
package com.evolveum.midpoint.init;

import com.evolveum.midpoint.model.api.ModelService;
import com.evolveum.midpoint.prism.Objectable;
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.delta.ObjectDelta;
import com.evolveum.midpoint.prism.dom.PrismDomProcessor;
import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.schema.util.ReportTypeUtil;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.task.api.TaskManager;
import com.evolveum.midpoint.util.exception.ObjectNotFoundException;
import com.evolveum.midpoint.util.logging.LoggingUtils;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.web.util.WebMiscUtil;
import com.evolveum.midpoint.xml.ns._public.common.common_2a.ReportType;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.Validate;
import org.springframework.beans.factory.annotation.Autowired;

import java.io.File;
import java.io.FileFilter;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.List;
import java.util.Arrays;
import java.util.Comparator;

/**
* @author lazyman
Expand All @@ -50,9 +54,7 @@ public class InitialDataImport {
private static final String OPERATION_INITIAL_OBJECTS_IMPORT = DOT_CLASS + "initialObjectsImport";
private static final String OPERATION_IMPORT_OBJECT = DOT_CLASS + "importObject";

private static final String OBJECTS_FILE = "objects.xml";

@Autowired(required = true)
@Autowired
private transient PrismContext prismContext;
private ModelService model;
private TaskManager taskManager;
Expand All @@ -76,53 +78,82 @@ public void init() {

int count = 0;
int errors = 0;
try {
PrismDomProcessor domProcessor = prismContext.getPrismDomProcessor();

List<PrismObject<? extends Objectable>> objects = domProcessor.parseObjects(getResource(OBJECTS_FILE));
for (PrismObject object : objects) {
OperationResult result = mainResult.createSubresult(OPERATION_IMPORT_OBJECT);

boolean importObject = true;
try {
model.getObject(object.getCompileTimeClass(), object.getOid(), null, task, result);
importObject = false;
result.recordSuccess();
} catch (ObjectNotFoundException ex) {
importObject = true;
} catch (Exception ex) {
LoggingUtils.logException(LOGGER, "Couldn't get object with oid {} from model", ex,
object.getOid());
result.recordWarning("Couldn't get object with oid '" + object.getOid() + "' from model",
ex);

PrismDomProcessor domProcessor = prismContext.getPrismDomProcessor();
File[] files = getInitialImportObjects();
LOGGER.info("Importing files {}.", Arrays.toString(files));

for (File file : files) {
try {
LOGGER.info("Initial import of file {}.", file.getName());
PrismObject object = domProcessor.parseObject(file);
if (ReportType.class.equals(object.getCompileTimeClass())) {
ReportTypeUtil.applyDefinition(object, prismContext);
}

if (!importObject) {
Boolean importObject = importObject(object, file, task, mainResult);
if (importObject == null) {
continue;
}

ObjectDelta delta = ObjectDelta.createAddDelta(object);
try {
model.executeChanges(WebMiscUtil.createDeltaCollection(delta), null, task, result);
result.recordSuccess();
LOGGER.info("Created {} as part of initial import", object);
count++;
} catch (Exception e) {
LoggingUtils.logException(LOGGER, "Couldn't import {} from file {}: ", e, object, OBJECTS_FILE, e.getMessage());
result.recordFatalError(e);
errors++;
if (importObject) {
count++;
} else {
errors++;
}
} catch (Exception ex) {
LoggingUtils.logException(LOGGER, "Couldn't import file {}", ex, file.getName());
mainResult.recordFatalError("Couldn't import file '" + file.getName() + "'", ex);
}
} catch (Exception ex) {
LoggingUtils.logException(LOGGER, "Couldn't import file {}", ex, OBJECTS_FILE);
mainResult.recordFatalError("Couldn't import file '" + OBJECTS_FILE + "'", ex);
}

mainResult.recomputeStatus("Couldn't import objects.");

LOGGER.info("Initial object import finished ({} objects imported, {} errors)", count, errors);
if (LOGGER.isTraceEnabled()) {
LOGGER.trace("Initialization status:\n" + mainResult.debugDump());
LOGGER.trace("Initialization status:\n" + mainResult.debugDump());
}
}

/**
* @param object
* @param task
* @param mainResult
* @return null if nothing was imported, true if it was success, otherwise false
*/
private Boolean importObject(PrismObject object, File file, Task task, OperationResult mainResult) {
OperationResult result = mainResult.createSubresult(OPERATION_IMPORT_OBJECT);

boolean importObject = true;
try {
model.getObject(object.getCompileTimeClass(), object.getOid(), null, task, result);
importObject = false;
result.recordSuccess();
} catch (ObjectNotFoundException ex) {
importObject = true;
} catch (Exception ex) {
LoggingUtils.logException(LOGGER, "Couldn't get object with oid {} from model", ex,
object.getOid());
result.recordWarning("Couldn't get object with oid '" + object.getOid() + "' from model",
ex);
}

if (!importObject) {
return null;
}

ObjectDelta delta = ObjectDelta.createAddDelta(object);
try {
model.executeChanges(WebMiscUtil.createDeltaCollection(delta), null, task, result);
result.recordSuccess();
LOGGER.info("Created {} as part of initial import", object);
return true;
} catch (Exception e) {
LoggingUtils.logException(LOGGER, "Couldn't import {} from file {}: ", e, object,
file.getName(), e.getMessage());
result.recordFatalError(e);

LOGGER.info("\n" + result.debugDump());
return false;
}
}

Expand All @@ -135,4 +166,40 @@ private File getResource(String name) {
}
return new File(path);
}

private File[] getInitialImportObjects() {
File folder = getResource("initial-objects");
File[] files = folder.listFiles(new FileFilter() {

@Override
public boolean accept(File pathname) {
if (pathname.isDirectory()) {
return false;
}

return true;
}
});
Arrays.sort(files, new Comparator<File>() {

@Override
public int compare(File o1, File o2) {
int n1 = getNumberFromName(o1);
int n2 = getNumberFromName(o2);

return n1 - n2;
}
});

return files;
}

private int getNumberFromName(File file) {
String name = file.getName();
String number = StringUtils.left(name, 3);
if (number.matches("[\\d]+")) {
return Integer.parseInt(number);
}
return 0;
}
}
Expand Up @@ -61,6 +61,11 @@ public void initiate(AjaxRequestTarget target) {

public void onRequest() {
final InputStream byteStream = initStream();

if(byteStream == null){
return;
}

IResourceStream resourceStream = new AbstractResourceStream(){

@Override
Expand All @@ -76,7 +81,6 @@ public InputStream getInputStream() throws ResourceStreamNotFoundException {
@Override
public void close() throws IOException {
byteStream.close();

}

};
Expand All @@ -94,6 +98,5 @@ public void setContentType(String contentType) {
this.contentType = contentType;
}


protected abstract InputStream initStream();
}
Expand Up @@ -17,6 +17,7 @@
package com.evolveum.midpoint.web.component.data;

import com.evolveum.midpoint.web.component.AjaxButton;
import com.evolveum.midpoint.web.component.AjaxSubmitButton;
import com.evolveum.midpoint.web.component.data.column.DoubleButtonColumn;
import com.evolveum.midpoint.web.component.util.SimplePanel;
import org.apache.wicket.ajax.AjaxRequestTarget;
Expand Down Expand Up @@ -48,6 +49,12 @@ private void createLayout(){
public void onClick(AjaxRequestTarget target) {
firstPerformed(target, DoubleButtonPanel.this.getModel());
}

@Override
public boolean isEnabled(){
return isFirstEnabled(DoubleButtonPanel.this.getModel());
}

};
firstButton.add(new AttributeAppender("class", getFirstCssClass()));

Expand All @@ -56,6 +63,11 @@ public void onClick(AjaxRequestTarget target) {
public void onClick(AjaxRequestTarget target) {
secondPerformed(target, DoubleButtonPanel.this.getModel());
}

@Override
public boolean isEnabled(){
return isSecondEnabled(DoubleButtonPanel.this.getModel());
}
};
secondButton.add(new AttributeAppender("class", getSecondCssClass()));

Expand Down Expand Up @@ -111,4 +123,20 @@ private StringResourceModel createButtonStringResource(String caption){

public void firstPerformed(AjaxRequestTarget target, IModel<T> model){}
public void secondPerformed(AjaxRequestTarget target, IModel<T> model){}

public boolean isFirstEnabled(IModel<T> model){
return true;
}

public boolean isSecondEnabled(IModel<T> model){
return true;
}

public AjaxButton getFirstButton(){
return (AjaxButton) get(ID_BUTTON_FIRST);
}

public AjaxButton getSecondButton(){
return (AjaxButton) get(ID_BUTTON_SECOND);
}
}
Expand Up @@ -31,6 +31,9 @@
public class DoubleButtonColumn<T extends Serializable> extends AbstractColumn<T, String>{

public static final String BUTTON_BASE_CLASS = "btn";
public static final String BUTTON_DISABLED = "btn-disabled";

private DoubleButtonPanel panel;

public enum BUTTON_COLOR_CLASS{
DEFAULT("btn-default"), PRIMARY("btn-primary"), SUCCESS("btn-success"),
Expand Down Expand Up @@ -65,7 +68,7 @@ public DoubleButtonColumn(IModel<String> displayModel, String propertyExpression
public void populateItem(final Item<ICellPopulator<T>> cellItem, String componentId,
final IModel<T> rowModel){

cellItem.add(new DoubleButtonPanel<T>(componentId, rowModel){
panel = new DoubleButtonPanel<T>(componentId, rowModel){

@Override
public String getFirstCssSizeClass(){
Expand Down Expand Up @@ -106,7 +109,16 @@ public void firstPerformed(AjaxRequestTarget target, IModel<T> model){
public void secondPerformed(AjaxRequestTarget target, IModel<T> model){
secondClicked(target, model);
}
});

public boolean isFirstEnabled(IModel<T> model){
return isFirstButtonEnabled(model);
}

public boolean isSecondEnabled(IModel<T> model){
return isSecondButtonEnabled(model);
}
};
cellItem.add(panel);
}

public void firstClicked(AjaxRequestTarget target, IModel<T> model){}
Expand Down Expand Up @@ -135,4 +147,16 @@ public String getFirstCap(){
public String getSecondCap(){
return secondCaption;
}

public boolean isFirstButtonEnabled(IModel<T> model){
return true;
}

public boolean isSecondButtonEnabled(IModel<T> model){
return true;
}

public DoubleButtonPanel getButtonPanel(){
return panel;
}
}
Expand Up @@ -20,6 +20,13 @@
<div wicket:id="confirmDeletePopup" />

<form wicket:id="searchForm" class="form-inline pull-right search-form">
<div class="form-group">
<label class="sr-only">
<wicket:message key="pageCreatedReports.filter.reportType" />
</label>
<select class="form-control input-sm" wicket:id="reportType" />
</div>

<div class="form-group">
<label class="sr-only">
<wicket:message key="pageCreatedReports.filter.filetype"/>
Expand Down

0 comments on commit 9bd5fd7

Please sign in to comment.