Skip to content

Commit

Permalink
Fix MID-4406: Lookup table export
Browse files Browse the repository at this point in the history
Added lookup table rows, certification campaign cases, and user photos
to exports via repository objects page and ninja tool. In the future
we should make this configurable; currently these items are always
exported (in the same way as they are always shown on repository
objects 'view' page).
  • Loading branch information
mederly committed Feb 12, 2018
1 parent 33d5993 commit 3892324
Show file tree
Hide file tree
Showing 8 changed files with 98 additions and 70 deletions.
Expand Up @@ -19,6 +19,7 @@
import java.util.*;

import com.evolveum.midpoint.model.api.ModelInteractionService;
import com.evolveum.midpoint.prism.*;
import com.evolveum.midpoint.prism.query.ObjectPaging;
import com.evolveum.midpoint.prism.query.OrderDirection;
import com.evolveum.midpoint.schema.RelationalValueSearchQuery;
Expand All @@ -34,9 +35,6 @@

import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.model.api.ModelExecuteOptions;
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.PrismObjectDefinition;
import com.evolveum.midpoint.prism.delta.ChangeType;
import com.evolveum.midpoint.prism.delta.ObjectDelta;
import com.evolveum.midpoint.prism.path.ItemPath;
Expand Down Expand Up @@ -675,4 +673,29 @@ public static void dropPowerOfAttorney(ModelInteractionService modelInteractionS
result.computeStatusIfUnknown();
}
}

// deduplicate with Action.addIncludeOptionsForExport (ninja module)
public static void addIncludeOptionsForExportOrView(Collection<SelectorOptions<GetOperationOptions>> options,
Class<? extends ObjectType> type) {
// todo fix this brutal hack (related to checking whether to include particular options)
boolean all = type == null
|| Objectable.class.equals(type)
|| com.evolveum.prism.xml.ns._public.types_3.ObjectType.class.equals(type)
|| ObjectType.class.equals(type);

if (all || UserType.class.isAssignableFrom(type)) {
options.add(SelectorOptions.create(UserType.F_JPEG_PHOTO,
GetOperationOptions.createRetrieve(RetrieveOption.INCLUDE)));
}
if (all || LookupTableType.class.isAssignableFrom(type)) {
options.add(SelectorOptions.create(LookupTableType.F_ROW,
GetOperationOptions.createRetrieve(
new RelationalValueSearchQuery(
ObjectPaging.createPaging(PrismConstants.T_ID, OrderDirection.ASCENDING)))));
}
if (all || AccessCertificationCampaignType.class.isAssignableFrom(type)) {
options.add(SelectorOptions.create(AccessCertificationCampaignType.F_CASE,
GetOperationOptions.createRetrieve(RetrieveOption.INCLUDE)));
}
}
}
Expand Up @@ -16,18 +16,13 @@

package com.evolveum.midpoint.web.component;

import java.io.IOException;
import java.io.InputStream;

import org.apache.commons.lang3.StringUtils;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.behavior.AbstractAjaxBehavior;
import org.apache.wicket.request.IRequestCycle;
import org.apache.wicket.request.handler.resource.ResourceStreamRequestHandler;
import org.apache.wicket.request.resource.ContentDisposition;
import org.apache.wicket.util.resource.AbstractResourceStream;
import org.apache.wicket.util.resource.IResourceStream;
import org.apache.wicket.util.resource.ResourceStreamNotFoundException;
import org.apache.wicket.util.time.Duration;

public abstract class AbstractAjaxDownloadBehavior extends AbstractAjaxBehavior {
Expand Down
Expand Up @@ -16,19 +16,11 @@

package com.evolveum.midpoint.web.component;

import java.io.IOException;
import java.io.InputStream;

import org.apache.commons.lang3.StringUtils;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.behavior.AbstractAjaxBehavior;
import org.apache.wicket.request.IRequestCycle;
import org.apache.wicket.request.handler.resource.ResourceStreamRequestHandler;
import org.apache.wicket.request.resource.ContentDisposition;
import org.apache.wicket.util.resource.AbstractResourceStream;
import org.apache.wicket.util.resource.IResourceStream;
import org.apache.wicket.util.resource.ResourceStreamNotFoundException;
import org.apache.wicket.util.time.Duration;

import java.io.IOException;
import java.io.InputStream;

public abstract class AjaxDownloadBehaviorFromStream extends AbstractAjaxDownloadBehavior {

Expand All @@ -37,17 +29,14 @@ public abstract class AjaxDownloadBehaviorFromStream extends AbstractAjaxDownloa
private String contentType = "text";
private String fileName = null;


public AjaxDownloadBehaviorFromStream() {
super();
}

public AjaxDownloadBehaviorFromStream(boolean addAntiCache) {
super(addAntiCache);

}


@Override
public IResourceStream getResourceStream() {
final InputStream byteStream = initStream();
Expand All @@ -56,26 +45,24 @@ public IResourceStream getResourceStream() {
return null;
}

IResourceStream resourceStream = new AbstractResourceStream(){

return new AbstractResourceStream() {
private static final long serialVersionUID = 1L;

@Override
public String getContentType() {
return contentType;
}

@Override
public InputStream getInputStream() throws ResourceStreamNotFoundException {
public InputStream getInputStream() {
return byteStream;
}

@Override
public void close() throws IOException {
byteStream.close();
}

};
return resourceStream;
}

protected abstract InputStream initStream();
Expand Down
Expand Up @@ -56,14 +56,13 @@ private void initLayout(final boolean isReadOnly) {
fileUpload.add(new AjaxFormSubmitBehavior(form, "change")
{
@Override
protected void onSubmit ( AjaxRequestTarget target )
{
protected void onSubmit(AjaxRequestTarget target) {
super.onSubmit(target);
UploadDownloadPanel.this.uploadFilePerformed(target);
}

@Override
protected void onError (AjaxRequestTarget target){
protected void onError(AjaxRequestTarget target) {
super.onError(target);
UploadDownloadPanel.this.uploadFilePerformed(target);
}
Expand Down
Expand Up @@ -17,21 +17,18 @@
package com.evolveum.midpoint.web.page.admin.configuration;

import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils;
import com.evolveum.midpoint.model.api.ModelExecuteOptions;
import com.evolveum.midpoint.prism.Objectable;
import com.evolveum.midpoint.prism.PrismConstants;
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.delta.ObjectDelta;
import com.evolveum.midpoint.prism.query.ObjectPaging;
import com.evolveum.midpoint.prism.query.OrderDirection;
import com.evolveum.midpoint.schema.*;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.security.api.AuthorizationConstants;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.util.Holder;
import com.evolveum.midpoint.util.MiscUtil;
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.application.AuthorizationAction;
Expand Down Expand Up @@ -148,26 +145,12 @@ private void initObjectViewObject() {
//todo on page debug list create page params, put there oid and class for object type and send that to this page....read it here
Class type = ObjectType.class;
StringValue objectType = getPageParameters().get(PARAM_OBJECT_TYPE);
if (objectType != null && StringUtils.isNotBlank(objectType.toString())){
if (objectType != null && StringUtils.isNotBlank(objectType.toString())) {
type = getPrismContext().getSchemaRegistry().determineCompileTimeClass(new QName(SchemaConstantsGenerated.NS_COMMON, objectType.toString()));
}

// TODO make this configurable (or at least do not show campaign cases in production)
if (UserType.class.isAssignableFrom(type)) {
options.add(SelectorOptions.create(UserType.F_JPEG_PHOTO,
GetOperationOptions.createRetrieve(RetrieveOption.INCLUDE)));
}
if (LookupTableType.class.isAssignableFrom(type)) {
options.add(SelectorOptions.create(LookupTableType.F_ROW,
GetOperationOptions.createRetrieve(
new RelationalValueSearchQuery(
ObjectPaging.createPaging(PrismConstants.T_ID, OrderDirection.ASCENDING)))));
}
if (AccessCertificationCampaignType.class.isAssignableFrom(type)) {
options.add(SelectorOptions.create(AccessCertificationCampaignType.F_CASE,
GetOperationOptions.createRetrieve(RetrieveOption.INCLUDE)));
}

WebModelServiceUtils.addIncludeOptionsForExportOrView(options, type);
PrismObject<ObjectType> object = getModelService().getObject(type, objectOid.toString(), options, task, result);

PrismContext context = application.getPrismContext();
Expand Down
Expand Up @@ -2,9 +2,9 @@

import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils;
import com.evolveum.midpoint.model.api.ModelService;
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.schema.GetOperationOptions;
import com.evolveum.midpoint.schema.ResultHandler;
Expand All @@ -30,6 +30,7 @@
import org.apache.wicket.util.file.Files;

import java.io.*;
import java.util.Collection;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

Expand Down Expand Up @@ -102,7 +103,7 @@ protected File initFile() {

Writer writer = null;
try {
LOGGER.debug("Creating file '{}'.", new Object[]{file.getAbsolutePath()});
LOGGER.debug("Creating file '{}'.", file.getAbsolutePath());
writer = createWriter(file);
LOGGER.debug("Exporting objects.");
dumpHeader(writer);
Expand Down Expand Up @@ -153,29 +154,24 @@ private Writer createWriter(File file) throws IOException {
private <T extends ObjectType> void dumpObjectsToStream(final Writer writer, OperationResult result) throws Exception {
final PageBase page = getPage();

ResultHandler handler = new ResultHandler() {

@Override
public boolean handle(PrismObject object, OperationResult parentResult) {
try {
String xml = page.getPrismContext().serializeObjectToString(object, PrismContext.LANG_XML);
writer.write('\t');
writer.write(xml);
writer.write('\n');
} catch (IOException ex) {
throw new SystemException(ex.getMessage(), ex);
} catch (SchemaException ex) {
throw new SystemException(ex.getMessage(), ex);
}

return true;
ResultHandler handler = (object, parentResult) -> {
try {
String xml = page.getPrismContext().serializeObjectToString(object, PrismContext.LANG_XML);
writer.write('\t');
writer.write(xml);
writer.write('\n');
} catch (IOException|SchemaException ex) {
throw new SystemException(ex.getMessage(), ex);
}
return true;
};

ModelService service = page.getModelService();
GetOperationOptions options = GetOperationOptions.createRaw();
options.setResolveNames(true);
service.searchObjectsIterative(type, query, handler, SelectorOptions.createCollection(options),
Collection<SelectorOptions<GetOperationOptions>> optionsCollection = SelectorOptions.createCollection(options);
WebModelServiceUtils.addIncludeOptionsForExportOrView(optionsCollection, type);
service.searchObjectsIterative(type, query, handler, optionsCollection,
page.createSimpleTask(OPERATION_SEARCH_OBJECT), result);
}

Expand Down
Expand Up @@ -6,7 +6,21 @@
import com.evolveum.midpoint.ninja.util.CountStatus;
import com.evolveum.midpoint.ninja.util.Log;
import com.evolveum.midpoint.ninja.util.NinjaUtils;
import com.evolveum.midpoint.prism.Objectable;
import com.evolveum.midpoint.prism.PrismConstants;
import com.evolveum.midpoint.prism.query.ObjectPaging;
import com.evolveum.midpoint.prism.query.OrderDirection;
import com.evolveum.midpoint.schema.GetOperationOptions;
import com.evolveum.midpoint.schema.RelationalValueSearchQuery;
import com.evolveum.midpoint.schema.RetrieveOption;
import com.evolveum.midpoint.schema.SelectorOptions;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationCampaignType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.LookupTableType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType;

import java.util.Collection;

/**
* Created by Viliam Repan (lazyman).
Expand Down Expand Up @@ -72,4 +86,30 @@ protected void logCountProgress(CountStatus status) {
}

public abstract void execute() throws Exception;

// deduplicate with WebModelServiceUtils.addIncludeOptionsForExportOrView
protected static void addIncludeOptionsForExport(Collection<SelectorOptions<GetOperationOptions>> options,
Class<? extends ObjectType> type) {
// todo fix this brutal hack (related to checking whether to include particular options)
boolean all = type == null
|| Objectable.class.equals(type)
|| com.evolveum.prism.xml.ns._public.types_3.ObjectType.class.equals(type)
|| ObjectType.class.equals(type);

if (all || UserType.class.isAssignableFrom(type)) {
options.add(SelectorOptions.create(UserType.F_JPEG_PHOTO,
GetOperationOptions.createRetrieve(RetrieveOption.INCLUDE)));
}
if (all || LookupTableType.class.isAssignableFrom(type)) {
options.add(SelectorOptions.create(LookupTableType.F_ROW,
GetOperationOptions.createRetrieve(
new RelationalValueSearchQuery(
ObjectPaging.createPaging(PrismConstants.T_ID, OrderDirection.ASCENDING)))));
}
if (all || AccessCertificationCampaignType.class.isAssignableFrom(type)) {
options.add(SelectorOptions.create(AccessCertificationCampaignType.F_CASE,
GetOperationOptions.createRetrieve(RetrieveOption.INCLUDE)));
}
}

}
Expand Up @@ -22,6 +22,7 @@
import java.io.IOException;
import java.io.Writer;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;

Expand Down Expand Up @@ -74,6 +75,7 @@ private void exportByOid(Writer writer) throws SchemaException, ObjectNotFoundEx
if (options.isRaw()) {
opts = GetOperationOptions.createRawCollection();
}
addIncludeOptionsForExport(opts, type.getClassDefinition());

OperationResult result = new OperationResult(OPERATION_EXPORT);

Expand Down Expand Up @@ -120,10 +122,13 @@ private void exportByType(ObjectTypes type, Writer writer, CountStatus status, O
PrismContext prismContext = context.getPrismContext();
PrismSerializer<String> serializer = prismContext.xmlSerializer();

Collection<SelectorOptions<GetOperationOptions>> opts = Collections.emptyList();
Collection<SelectorOptions<GetOperationOptions>> opts;
if (options.isRaw()) {
opts = GetOperationOptions.createRawCollection();
} else {
opts = new ArrayList<>();
}
addIncludeOptionsForExport(opts, type.getClassDefinition());

ObjectQuery query = NinjaUtils.createObjectQuery(options.getFilter(), context);

Expand Down

0 comments on commit 3892324

Please sign in to comment.