[SYNCOPE-156] fix provision and attribute mapping management + binary attributes default preview provided
Project: http://git-wip-us.apache.org/repos/asf/syncope/repo Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/a9c26245 Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/a9c26245 Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/a9c26245 Branch: refs/heads/master Commit: a9c2624546887787a6e0389e4bbb1fff5f14f612 Parents: 6e41db3 Author: fmartelli <fabio.marte...@gmail.com> Authored: Tue Dec 22 12:06:25 2015 +0100 Committer: fmartelli <fabio.marte...@gmail.com> Committed: Tue Dec 22 12:06:25 2015 +0100 ---------------------------------------------------------------------- .../client/console/commons/PreviewUtils.java | 42 ++++----- .../init/ClassPathScanImplementationLookup.java | 3 +- .../console/panels/ResourceMappingPanel.java | 28 ++++-- .../markup/html/form/BinaryFieldPanel.java | 98 ++++++++++++++------ .../form/preview/AbstractBinaryPreviewer.java | 12 ++- .../html/form/preview/BinaryCertPreviewer.java | 20 ++-- .../html/form/preview/BinaryImagePreviewer.java | 8 +- .../provision/ProvisionWizardBuilder.java | 50 ++++++++-- .../markup/html/form/BinaryFieldPanel.html | 40 ++++---- .../ProvisionWizardBuilder$ObjectType.html | 16 ++-- 10 files changed, 203 insertions(+), 114 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/syncope/blob/a9c26245/client/console/src/main/java/org/apache/syncope/client/console/commons/PreviewUtils.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/commons/PreviewUtils.java b/client/console/src/main/java/org/apache/syncope/client/console/commons/PreviewUtils.java index e88fcb3..ae2661d 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/commons/PreviewUtils.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/commons/PreviewUtils.java @@ -25,8 +25,7 @@ import org.apache.syncope.client.console.SyncopeConsoleApplication; import org.apache.syncope.client.console.init.ClassPathScanImplementationLookup; import org.apache.syncope.client.console.init.ConsoleInitializer; import org.apache.syncope.client.console.wicket.markup.html.form.preview.AbstractBinaryPreviewer; -import org.apache.wicket.Component; -import org.apache.wicket.util.crypt.Base64; +import org.apache.syncope.client.console.wicket.markup.html.form.preview.DefaultPreviewer; import org.springframework.util.Assert; public final class PreviewUtils { @@ -51,30 +50,27 @@ public final class PreviewUtils { getServletContext().getAttribute(ConsoleInitializer.CLASSPATH_LOOKUP); } - public Component getPreviewer(final String mimeType, final String file) - throws InstantiationException, IllegalAccessException, InvocationTargetException { - - Class<? extends AbstractBinaryPreviewer> previewer = StringUtils.isBlank(file) - ? null - : classPathScanImplementationLookup.getPreviewerClass(mimeType); - - return previewer == null - ? null - : getConstructorIfAvailable(previewer, String.class, String.class, byte[].class). - newInstance(new Object[] { "previewer", mimeType, Base64.decodeBase64(file) }). - preview(); + public AbstractBinaryPreviewer getDefaultPreviewer(final String mimeType) { + return new DefaultPreviewer("previewer", mimeType); } - public Component getPreviewer(final String mimeType, final byte[] file) - throws InstantiationException, IllegalAccessException, InvocationTargetException { + public AbstractBinaryPreviewer getPreviewer(final String mimeType) { + + if (StringUtils.isBlank(mimeType)) { + return null; + } - Class<? extends AbstractBinaryPreviewer> previewer = classPathScanImplementationLookup.getPreviewerClass( - mimeType); + final Class<? extends AbstractBinaryPreviewer> previewer + = classPathScanImplementationLookup.getPreviewerClass(mimeType); - return previewer == null - ? null - : getConstructorIfAvailable(previewer, String.class, String.class, byte[].class). - newInstance(new Object[] { "previewer", mimeType, file }). - preview(); + try { + return previewer == null + ? null + : getConstructorIfAvailable(previewer, String.class, String.class). + newInstance(new Object[] { "previewer", mimeType }); + } catch (InstantiationException | IllegalAccessException | IllegalArgumentException + | InvocationTargetException ex) { + return null; + } } } http://git-wip-us.apache.org/repos/asf/syncope/blob/a9c26245/client/console/src/main/java/org/apache/syncope/client/console/init/ClassPathScanImplementationLookup.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/init/ClassPathScanImplementationLookup.java b/client/console/src/main/java/org/apache/syncope/client/console/init/ClassPathScanImplementationLookup.java index 3c28c04..5ec7e58 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/init/ClassPathScanImplementationLookup.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/init/ClassPathScanImplementationLookup.java @@ -86,7 +86,8 @@ public class ClassPathScanImplementationLookup { Class<? extends AbstractBinaryPreviewer> previewer = null; for (Class<? extends AbstractBinaryPreviewer> candidate : previewers) { LOG.debug("Evaluating previewer class {} for MIME type {}", candidate.getName(), mimeType); - if (ArrayUtils.contains(candidate.getAnnotation(BinaryPreview.class).mimeTypes(), mimeType)) { + if (candidate.isAnnotationPresent(BinaryPreview.class) + && ArrayUtils.contains(candidate.getAnnotation(BinaryPreview.class).mimeTypes(), mimeType)) { LOG.debug("Found existing previewer for MIME type {}: {}", mimeType, candidate.getName()); previewer = candidate; } http://git-wip-us.apache.org/repos/asf/syncope/blob/a9c26245/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceMappingPanel.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceMappingPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceMappingPanel.java index 2ee2073..6f25bdd 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceMappingPanel.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceMappingPanel.java @@ -25,8 +25,8 @@ import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Set; -import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.collections4.Transformer; +import org.apache.commons.collections4.IterableUtils; +import org.apache.commons.collections4.Predicate; import org.apache.syncope.client.console.commons.Constants; import org.apache.syncope.client.console.commons.JexlHelpUtils; import org.apache.syncope.client.console.rest.ConnectorRestClient; @@ -310,8 +310,8 @@ public class ResourceMappingPanel extends Panel { intAttrNames.setChoices(Collections.<String>emptyList()); - target.add(intMappingTypes.getField()); - target.add(intAttrNames.getField()); + target.add(intMappingTypes); + target.add(intAttrNames); } }); item.add(entitiesPanel); @@ -445,15 +445,23 @@ public class ResourceMappingPanel extends Panel { connInstanceTO.getConf().addAll(conf); // SYNCOPE-156: use provided info to give schema names (and type!) by ObjectClass - return CollectionUtils.collect(connRestClient.buildObjectClassInfo(connInstanceTO, true), - new Transformer<ConnIdObjectClassTO, String>() { + ConnIdObjectClassTO clazz = IterableUtils.find( + connRestClient.buildObjectClassInfo(connInstanceTO, true), new Predicate<ConnIdObjectClassTO>() { @Override - public String transform(final ConnIdObjectClassTO input) { - return input.getType(); + public boolean evaluate(final ConnIdObjectClassTO object) { + return object.getType().equalsIgnoreCase(ResourceMappingPanel.this.provisionTO.getObjectClass()); } - }, - new ArrayList<String>()); + }); + + return clazz == null ? new ArrayList<String>() + : IterableUtils.toList(IterableUtils.filteredIterable(clazz.getAttributes(), new Predicate<String>() { + @Override + public boolean evaluate(final String object) { + return !("__NAME__".equals(object) || "__ENABLE__".equals(object) + || "__PASSWORD__".equals(object)); + } + })); } private void setEnabled() { http://git-wip-us.apache.org/repos/asf/syncope/blob/a9c26245/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/BinaryFieldPanel.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/BinaryFieldPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/BinaryFieldPanel.java index 2bd4e98..31c3ef7 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/BinaryFieldPanel.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/BinaryFieldPanel.java @@ -18,22 +18,29 @@ */ package org.apache.syncope.client.console.wicket.markup.html.form; +import static de.agilecoders.wicket.jquery.JQuery.$; + import de.agilecoders.wicket.extensions.markup.html.bootstrap.form.fileinput.BootstrapFileInputField; import de.agilecoders.wicket.extensions.markup.html.bootstrap.form.fileinput.FileInputConfig; +import de.agilecoders.wicket.extensions.markup.html.bootstrap.form.fileinput.FileinputJsReference; +import de.agilecoders.wicket.jquery.JQuery; +import de.agilecoders.wicket.jquery.function.IFunction; import java.io.ByteArrayInputStream; -import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import org.apache.commons.lang3.StringUtils; import org.apache.syncope.client.console.commons.HttpResourceStream; import org.apache.syncope.client.console.commons.Constants; import org.apache.syncope.client.console.commons.PreviewUtils; -import org.apache.syncope.client.console.pages.BasePage; +import org.apache.syncope.client.console.wicket.markup.html.form.preview.AbstractBinaryPreviewer; import org.apache.syncope.common.lib.SyncopeConstants; import org.apache.wicket.Component; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.form.AjaxFormSubmitBehavior; import org.apache.wicket.extensions.ajax.markup.html.IndicatingAjaxLink; +import org.apache.wicket.markup.head.IHeaderResponse; +import org.apache.wicket.markup.head.OnDomReadyHeaderItem; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.Form; @@ -44,6 +51,7 @@ import org.apache.wicket.markup.html.link.Link; import org.apache.wicket.markup.html.panel.Fragment; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; +import org.apache.wicket.model.util.ListModel; import org.apache.wicket.request.handler.resource.ResourceStreamRequestHandler; import org.apache.wicket.request.resource.ContentDisposition; import org.apache.wicket.util.crypt.Base64; @@ -63,18 +71,47 @@ public class BinaryFieldPanel extends FieldPanel<String> { private final Fragment emptyFragment; + private final BootstrapFileInputField fileUpload; + private final transient PreviewUtils previewUtils = PreviewUtils.getInstance(); + private final AbstractBinaryPreviewer previewer; + public BinaryFieldPanel(final String id, final String name, final IModel<String> model, final String mimeType) { super(id, name, model); this.mimeType = mimeType; + previewer = previewUtils.getPreviewer(mimeType); + uploadForm = new StatelessForm<>("uploadForm"); uploadForm.setMultiPart(true); uploadForm.setMaxSize(Bytes.megabytes(4)); add(uploadForm); - container = new WebMarkupContainer("previewContainer"); + container = new WebMarkupContainer("previewContainer") { + + private static final long serialVersionUID = 2628490926588791229L; + + @Override + public void renderHead(final IHeaderResponse response) { + if (previewer == null) { + FileinputJsReference.INSTANCE.renderHead(response); + final JQuery fileinputJS = $(fileUpload).chain(new IFunction() { + + private static final long serialVersionUID = -2285418135375523652L; + + @Override + public String build() { + return "fileinput({" + + "'showRemove':false, " + + "'showUpload':false, " + + "'previewFileType':'any'})"; + } + }); + response.render(OnDomReadyHeaderItem.forScript(fileinputJS.get())); + } + } + }; container.setOutputMarkupId(true); emptyFragment = new Fragment("panelPreview", "emptyFragment", container); @@ -111,9 +148,11 @@ public class BinaryFieldPanel extends FieldPanel<String> { FileInputConfig config = new FileInputConfig(); config.showUpload(false); + config.showRemove(false); + config.showPreview(false); - @SuppressWarnings({ "unchecked", "rawtypes" }) - final BootstrapFileInputField fileUpload = new BootstrapFileInputField("fileUpload", new Model(), config); + fileUpload = new BootstrapFileInputField("fileUpload", + new ListModel<FileUpload>(new ArrayList<FileUpload>()), config); fileUpload.setOutputMarkupId(true); fileUpload.add(new AjaxFormSubmitBehavior(Constants.ON_CHANGE) { @@ -124,28 +163,25 @@ public class BinaryFieldPanel extends FieldPanel<String> { protected void onSubmit(final AjaxRequestTarget target) { final FileUpload uploadedFile = fileUpload.getFileUpload(); if (uploadedFile != null) { - try { - final byte[] uploadedBytes = uploadedFile.getBytes(); - final String uploaded = new String( - Base64.encodeBase64(uploadedBytes), - SyncopeConstants.DEFAULT_CHARSET); - field.setModelObject(uploaded); - target.add(field); - - Component panelPreview = previewUtils.getPreviewer(mimeType, uploadedBytes); - if (panelPreview != null) { - changePreviewer(panelPreview); - } - + final byte[] uploadedBytes = uploadedFile.getBytes(); + final String uploaded = new String( + Base64.encodeBase64(uploadedBytes), + SyncopeConstants.DEFAULT_CHARSET); + field.setModelObject(uploaded); + target.add(field); + + if (previewer == null) { + container.addOrReplace(emptyFragment); + } else { + final Component panelPreview = previewer.preview(uploadedBytes); + changePreviewer(panelPreview); fileUpload.setModelObject(null); uploadForm.addOrReplace(fileUpload); - downloadLink.setEnabled(StringUtils.isNotBlank(uploaded)); - target.add(uploadForm); - } catch (InstantiationException | IllegalAccessException | InvocationTargetException e) { - error(getString(Constants.ERROR) + ": " + e.getMessage()); - ((BasePage) getPage()).getFeedbackPanel().refresh(target); - LOG.error("While saving uploaded file", e); } + + downloadLink.setEnabled(StringUtils.isNotBlank(uploaded)); + + target.add(container); } } }); @@ -198,14 +234,20 @@ public class BinaryFieldPanel extends FieldPanel<String> { @Override public FieldPanel<String> setNewModel(final IModel<String> model) { field.setModel(model); - try { - Component panelPreview = previewUtils.getPreviewer(mimeType, model.getObject()); + + if (StringUtils.isNotBlank(model.getObject())) { + final Component panelPreview; + if (previewer == null) { + panelPreview = previewUtils.getDefaultPreviewer(mimeType); + } else { + panelPreview = previewer.preview(model.getObject()); + } + if (panelPreview != null) { changePreviewer(panelPreview); } - } catch (InstantiationException | IllegalAccessException | InvocationTargetException e) { - LOG.error("While loading saved file", e); } + downloadLink.setEnabled(StringUtils.isNotBlank(model.getObject())); uploadForm.addOrReplace(downloadLink); return this; http://git-wip-us.apache.org/repos/asf/syncope/blob/a9c26245/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/preview/AbstractBinaryPreviewer.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/preview/AbstractBinaryPreviewer.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/preview/AbstractBinaryPreviewer.java index 24bdb47..97bb2f3 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/preview/AbstractBinaryPreviewer.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/preview/AbstractBinaryPreviewer.java @@ -20,6 +20,7 @@ package org.apache.syncope.client.console.wicket.markup.html.form.preview; import org.apache.wicket.Component; import org.apache.wicket.markup.html.panel.Panel; +import org.apache.wicket.util.crypt.Base64; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -34,13 +35,14 @@ public abstract class AbstractBinaryPreviewer extends Panel { protected final String mimeType; - protected final byte[] uploadedBytes; - - public AbstractBinaryPreviewer(final String id, final String mimeType, final byte[] uploadedBytes) { + public AbstractBinaryPreviewer(final String id, final String mimeType) { super(id); this.mimeType = mimeType; - this.uploadedBytes = uploadedBytes; } - public abstract Component preview(); + public Component preview(final String uploaded) { + return preview(Base64.decodeBase64(uploaded)); + } + + public abstract Component preview(final byte[] uploadedBytes); } http://git-wip-us.apache.org/repos/asf/syncope/blob/a9c26245/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/preview/BinaryCertPreviewer.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/preview/BinaryCertPreviewer.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/preview/BinaryCertPreviewer.java index 20f2a7b..f7b3831 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/preview/BinaryCertPreviewer.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/preview/BinaryCertPreviewer.java @@ -19,12 +19,15 @@ package org.apache.syncope.client.console.wicket.markup.html.form.preview; import java.io.ByteArrayInputStream; +import java.security.cert.CertificateException; import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; +import javax.naming.InvalidNameException; import javax.naming.ldap.LdapName; import javax.naming.ldap.Rdn; import org.apache.commons.lang3.StringUtils; import org.apache.syncope.client.console.annotations.BinaryPreview; +import org.apache.syncope.client.console.commons.Constants; import org.apache.wicket.Component; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.model.Model; @@ -35,13 +38,18 @@ public class BinaryCertPreviewer extends AbstractBinaryPreviewer { private static final long serialVersionUID = -5843835939538055110L; - public BinaryCertPreviewer(final String id, final String mimeType, final byte[] uploadedBytes) { - super(id, mimeType, uploadedBytes); + public BinaryCertPreviewer(final String id, final String mimeType) { + super(id, mimeType); } @Override - public Component preview() { + public Component preview(final byte[] uploadedBytes) { final Label commonNameLabel = new Label("certCommonName", new Model<String>()); + if (uploadedBytes.length == 0) { + LOG.info("Enpty certificate"); + return commonNameLabel; + } + final ByteArrayInputStream certificateStream = new ByteArrayInputStream(uploadedBytes); try { final X509Certificate certificate = (X509Certificate) CertificateFactory.getInstance("X.509"). @@ -59,12 +67,12 @@ public class BinaryCertPreviewer extends AbstractBinaryPreviewer { } } commonNameLabel.setDefaultModelObject(commonNameBuilder.toString()); - } catch (Exception e) { + } catch (CertificateException | InvalidNameException e) { LOG.error("Error evaluating certificate file", e); - throw new IllegalArgumentException("Error evaluating certificate file", e); + commonNameLabel.setDefaultModelObject(getString(Constants.ERROR)); } finally { IOUtils.closeQuietly(certificateStream); } - return this.add(commonNameLabel); + return this.addOrReplace(commonNameLabel); } } http://git-wip-us.apache.org/repos/asf/syncope/blob/a9c26245/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/preview/BinaryImagePreviewer.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/preview/BinaryImagePreviewer.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/preview/BinaryImagePreviewer.java index 488caf0..dc198ea 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/preview/BinaryImagePreviewer.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/preview/BinaryImagePreviewer.java @@ -30,14 +30,14 @@ public class BinaryImagePreviewer extends AbstractBinaryPreviewer { private static final long serialVersionUID = 3338812359368457349L; - private static final int IMG_SIZE = 230; + private static final int IMG_SIZE = 300; - public BinaryImagePreviewer(final String id, final String mimeType, final byte[] uploadedBytes) { - super(id, mimeType, uploadedBytes); + public BinaryImagePreviewer(final String id, final String mimeType) { + super(id, mimeType); } @Override - public Component preview() { + public Component preview(final byte[] uploadedBytes) { return this.add(new NonCachingImage("previewImage", new ThumbnailImageResource(new DynamicImageResource() { private static final long serialVersionUID = 923201517955737928L; http://git-wip-us.apache.org/repos/asf/syncope/blob/a9c26245/client/console/src/main/java/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder.java index 8c20920..4d60aab 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder.java @@ -28,16 +28,19 @@ import org.apache.syncope.client.console.rest.AnyTypeRestClient; import org.apache.syncope.client.console.wicket.markup.html.form.AjaxCheckBoxPanel; import org.apache.syncope.client.console.wicket.markup.html.form.AjaxDropDownChoicePanel; import org.apache.syncope.client.console.wicket.markup.html.form.AjaxTextFieldPanel; +import org.apache.syncope.client.console.wicket.markup.html.form.FieldPanel; import org.apache.syncope.client.console.wizards.AjaxWizardBuilder; import org.apache.syncope.common.lib.to.AnyTypeTO; import org.apache.syncope.common.lib.to.ProvisionTO; import org.apache.syncope.common.lib.to.ResourceTO; +import org.apache.syncope.common.lib.types.AnyTypeKind; import org.apache.wicket.PageReference; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior; import org.apache.wicket.extensions.wizard.WizardModel; import org.apache.wicket.extensions.wizard.WizardStep; import org.apache.wicket.markup.html.WebMarkupContainer; +import org.apache.wicket.markup.html.form.FormComponent; import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.model.LoadableDetachableModel; import org.apache.wicket.model.Model; @@ -78,11 +81,11 @@ public class ProvisionWizardBuilder extends AjaxWizardBuilder<ProvisionTO> imple } }, res), new Predicate<String>() { - @Override - public boolean evaluate(final String key) { - return !currentlyAdded.contains(key); - } - }); + @Override + public boolean evaluate(final String key) { + return !currentlyAdded.contains(key); + } + }); return res; } @@ -95,6 +98,10 @@ public class ProvisionWizardBuilder extends AjaxWizardBuilder<ProvisionTO> imple private static final long serialVersionUID = 1L; + private static final String ACCOUNT = "__ACCOUNT__"; + + private static final String GROUP = "__GROUP__"; + /** * Construct. */ @@ -102,12 +109,37 @@ public class ProvisionWizardBuilder extends AjaxWizardBuilder<ProvisionTO> imple super(new ResourceModel("type.title", StringUtils.EMPTY), new ResourceModel("type.summary", StringUtils.EMPTY), new Model<ProvisionTO>(item)); - add(new AjaxDropDownChoicePanel<String>("type", "type", new PropertyModel<String>(item, "anyType"), false). + final WebMarkupContainer container = new WebMarkupContainer("container"); + container.setOutputMarkupId(true); + add(container); + + final FieldPanel<String> type = new AjaxDropDownChoicePanel<String>( + "type", "type", new PropertyModel<String>(item, "anyType"), false). setChoices(anyTypes). setStyleSheet("form-control"). - setRequired(true)); + setRequired(true); + container.add(type); + + final FormComponent<String> clazz = new TextField<String>( + "class", new PropertyModel<String>(item, "objectClass")).setRequired(true); + + container.add(clazz); - add(new TextField<String>("class", new PropertyModel<String>(item, "objectClass")).setRequired(true)); + type.getField().add(new AjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) { + + private static final long serialVersionUID = -1107858522700306810L; + + @Override + protected void onUpdate(final AjaxRequestTarget target) { + if (AnyTypeKind.USER.name().equals(type.getModelObject())) { + clazz.setModelObject(ACCOUNT); + target.add(container); + } else if (AnyTypeKind.GROUP.name().equals(type.getModelObject())) { + clazz.setModelObject(GROUP); + target.add(container); + } + } + }); } } @@ -216,6 +248,6 @@ public class ProvisionWizardBuilder extends AjaxWizardBuilder<ProvisionTO> imple @Override protected void onApplyInternal(final ProvisionTO modelObject) { - // do nothing + this.resourceTO.getProvisions().add(modelObject); } } http://git-wip-us.apache.org/repos/asf/syncope/blob/a9c26245/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/BinaryFieldPanel.html ---------------------------------------------------------------------- diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/BinaryFieldPanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/BinaryFieldPanel.html index e1bd8d5..d9a1d56 100644 --- a/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/BinaryFieldPanel.html +++ b/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/BinaryFieldPanel.html @@ -26,27 +26,25 @@ under the License. </wicket:enclosure> <fieldset class="input-group"> <input style="display: none;" wicket:id="textField"/> - <span style="margin-right: 20px;"> - <div style="display: table-cell;"> - <form wicket:id="uploadForm" encType="multipart/form-data" method="post" accept-charset="UTF-8"> - <input wicket:id="fileUpload" type="file"/> - <div style="top: -25px; left: 100%; position: relative; vertical-align: middle;"> - <!--<a href="#" wicket:id="uploadLink"><i title="upload" alt="file upload icon" class="glyphicon glyphicon-upload"></i></a>--> - <a href="#" wicket:id="downloadLink"><i title="download" alt="file download icon" class="glyphicon glyphicon-download"></i></a> - <a href="#" wicket:id="resetLink"><i title="remove value" alt="remove value icon" class="glyphicon glyphicon-remove"></i></a> - <span wicket:id="preview"/> - </div> - <span wicket:id="previewContainer"> - <span wicket:id="panelPreview">[panelPreview]</span> - <wicket:fragment wicket:id="previewFragment"> - <div wicket:id = "previewer" class="ui-widget-content ui-corner-all"></div> - </wicket:fragment> - <wicket:fragment wicket:id="emptyFragment"> - </wicket:fragment> - </span> - </form> - </div> - </span> + <div> + <form wicket:id="uploadForm" encType="multipart/form-data" method="post" accept-charset="UTF-8"> + <span wicket:id="previewContainer"> + <span wicket:id="panelPreview">[panelPreview]</span> + <wicket:fragment wicket:id="previewFragment"> + <div wicket:id = "previewer" class="ui-widget-content ui-corner-all form-group"></div> + </wicket:fragment> + <wicket:fragment wicket:id="emptyFragment"> + </wicket:fragment> + </span> + <input wicket:id="fileUpload" type="file"/> + <div> + <!--<a href="#" wicket:id="uploadLink"><i title="upload" alt="file upload icon" class="glyphicon glyphicon-upload"></i></a>--> + <a href="#" wicket:id="downloadLink"><i title="download" alt="file download icon" class="glyphicon glyphicon-download"></i></a> + <a href="#" wicket:id="resetLink"><i title="remove value" alt="remove value icon" class="glyphicon glyphicon-remove"></i></a> + <span wicket:id="preview"/> + </div> + </form> + </div> </fieldset> </wicket:extend> </body> http://git-wip-us.apache.org/repos/asf/syncope/blob/a9c26245/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$ObjectType.html ---------------------------------------------------------------------- diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$ObjectType.html b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$ObjectType.html index 95b13a9..1692194 100644 --- a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$ObjectType.html +++ b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder$ObjectType.html @@ -20,13 +20,15 @@ under the License. <head><title></title></head> <body> <wicket:panel > - <div class="form-group"> - <label>Object Type</label> - <span wicket:id="type"/> - </div> - <div class="form-group"> - <label>Object Class</label> - <input type="text" placeholder="Object Class ..." class="form-control" wicket:id="class"> + <div wicket:id="container"> + <div class="form-group"> + <label>Object Type</label> + <span wicket:id="type"/> + </div> + <div class="form-group"> + <label>Object Class</label> + <input type="text" placeholder="Object Class ..." class="form-control" wicket:id="class"> + </div> </div> </wicket:panel> </body>