Repository: syncope Updated Branches: refs/heads/2_0_X 6401942e3 -> a42311f58
[SYNCOPE-1225] Now providing search engine for Schemas Project: http://git-wip-us.apache.org/repos/asf/syncope/repo Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/a42311f5 Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/a42311f5 Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/a42311f5 Branch: refs/heads/2_0_X Commit: a42311f589b7987efc93d431c58667381259948c Parents: 6401942 Author: skylark17 <matteo.alessandr...@tirasa.net> Authored: Mon Mar 5 17:02:45 2018 +0100 Committer: skylark17 <matteo.alessandr...@tirasa.net> Committed: Mon Mar 5 17:02:45 2018 +0100 ---------------------------------------------------------------------- .../client/console/panels/SchemaTypePanel.java | 39 +++++-- .../panels/SchemaTypePanelWithSearch.java | 105 +++++++++++++++++++ .../client/console/panels/SchemasPanel.java | 2 +- .../client/console/rest/SchemaRestClient.java | 21 +++- .../panels/SchemaTypePanelWithSearch.html | 33 ++++++ .../common/rest/api/beans/SchemaQuery.java | 17 +++ .../common/rest/api/service/SchemaService.java | 3 +- .../apache/syncope/core/logic/SchemaLogic.java | 26 ++++- .../core/persistence/api/dao/SchemaDAO.java | 4 +- .../persistence/jpa/dao/JPADerSchemaDAO.java | 9 ++ .../persistence/jpa/dao/JPAPlainSchemaDAO.java | 9 ++ .../persistence/jpa/dao/JPAVirSchemaDAO.java | 9 ++ .../persistence/jpa/inner/DerSchemaTest.java | 6 ++ .../persistence/jpa/inner/PlainSchemaTest.java | 6 ++ .../persistence/jpa/inner/VirSchemaTest.java | 6 ++ .../rest/cxf/service/SchemaServiceImpl.java | 2 +- .../fit/console/AbstractTypesITCase.java | 14 +-- .../syncope/fit/console/SchemasITCase.java | 84 +++++++-------- .../syncope/fit/core/DerSchemaITCase.java | 10 ++ .../syncope/fit/core/PlainSchemaITCase.java | 10 ++ .../syncope/fit/core/VirSchemaITCase.java | 10 ++ 21 files changed, 360 insertions(+), 65 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/syncope/blob/a42311f5/client/console/src/main/java/org/apache/syncope/client/console/panels/SchemaTypePanel.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/SchemaTypePanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/SchemaTypePanel.java index 30c5050..ded6973 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/panels/SchemaTypePanel.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/SchemaTypePanel.java @@ -51,6 +51,7 @@ import org.apache.wicket.PageReference; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.authroles.authorization.strategies.role.metadata.MetaDataRoleAuthorizationStrategy; import org.apache.wicket.event.Broadcast; +import org.apache.wicket.event.IEvent; import org.apache.wicket.extensions.markup.html.repeater.data.sort.SortOrder; import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn; import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn; @@ -80,6 +81,8 @@ public class SchemaTypePanel extends TypesDirectoryPanel<SchemaTO, SchemaProvide private final SchemaType schemaType; + private String keyword; + public SchemaTypePanel(final String id, final SchemaType schemaType, final PageReference pageRef) { super(id, pageRef); this.restClient = new SchemaRestClient(); @@ -250,8 +253,10 @@ public class SchemaTypePanel extends TypesDirectoryPanel<SchemaTO, SchemaProvide @Override public Iterator<SchemaTO> iterator(final long first, final long count) { - final List<SchemaTO> list = restClient.getSchemas(this.schemaType); - Collections.sort(list, comparator); + List<SchemaTO> schemaList = StringUtils.isBlank(keyword) + ? restClient.getSchemas(this.schemaType) + : restClient.getSchemas(this.schemaType, keyword, new String[0]); + Collections.sort(schemaList, comparator); if (SchemaType.PLAIN == this.schemaType) { final List<String> configurations = new ArrayList<>(); @@ -265,22 +270,26 @@ public class SchemaTypePanel extends TypesDirectoryPanel<SchemaTO, SchemaProvide }, configurations); final List<SchemaTO> res = new ArrayList<>(); - for (SchemaTO item : list) { + for (SchemaTO item : schemaList) { if (!configurations.contains(item.getKey())) { res.add(item); } } return res.subList((int) first, (int) first + (int) count).iterator(); } else { - return list.subList((int) first, (int) first + (int) count).iterator(); + return schemaList.subList((int) first, (int) first + (int) count).iterator(); } } @Override public long size() { - int size = restClient.getSchemas(this.schemaType).size(); - return SchemaType.PLAIN == this.schemaType - ? size - confRestClient.list().size() + int size = StringUtils.isBlank(keyword) + ? restClient.getSchemas(this.schemaType).size() + : restClient.getSchemas(this.schemaType, keyword, new String[0]).size(); + return size > confRestClient.list().size() + ? (SchemaType.PLAIN == this.schemaType + ? size - confRestClient.list().size() + : size) : size; } @@ -289,4 +298,20 @@ public class SchemaTypePanel extends TypesDirectoryPanel<SchemaTO, SchemaProvide return new CompoundPropertyModel<>(object); } } + + @Override + public void onEvent(IEvent<?> event) { + if (event.getPayload() instanceof SchemaTypePanelWithSearch.SchemaSearchEvent) { + SchemaTypePanelWithSearch.SchemaSearchEvent payload = + SchemaTypePanelWithSearch.SchemaSearchEvent.class.cast(event.getPayload()); + final AjaxRequestTarget target = payload.getTarget(); + keyword = payload.getKeyword(); + + updateResultTable(target); + ((BasePage) pageRef.getPage()).getNotificationPanel().refresh(target); + } else { + super.onEvent(event); + } + } + } http://git-wip-us.apache.org/repos/asf/syncope/blob/a42311f5/client/console/src/main/java/org/apache/syncope/client/console/panels/SchemaTypePanelWithSearch.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/SchemaTypePanelWithSearch.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/SchemaTypePanelWithSearch.java new file mode 100644 index 0000000..c822630 --- /dev/null +++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/SchemaTypePanelWithSearch.java @@ -0,0 +1,105 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.syncope.client.console.panels; + +import java.io.Serializable; +import org.apache.commons.lang3.StringUtils; +import org.apache.syncope.client.console.wicket.markup.html.form.AjaxTextFieldPanel; +import org.apache.syncope.common.lib.types.SchemaType; +import org.apache.wicket.PageReference; +import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink; +import org.apache.wicket.event.Broadcast; +import org.apache.wicket.markup.html.WebMarkupContainer; +import org.apache.wicket.markup.html.form.Form; +import org.apache.wicket.markup.html.panel.Panel; +import org.apache.wicket.model.Model; + +public class SchemaTypePanelWithSearch extends Panel { + + private static final long serialVersionUID = 433565065115855671L; + + private final SchemaTypePanel schemaTypePanel; + + public SchemaTypePanelWithSearch(final String id, + final SchemaType schemaType, + final PageReference pageReference) { + super(id); + + schemaTypePanel = new SchemaTypePanel(id, schemaType, pageReference); + + addSearchBox(); + add(schemaTypePanel); + } + + private void addSearchBox() { + final Model<String> queryFilter = new Model<>(StringUtils.EMPTY); + + final WebMarkupContainer searchBoxContainer = new WebMarkupContainer("searchBox"); + final Form<?> form = new Form<>("form"); + final AjaxTextFieldPanel filter = new AjaxTextFieldPanel( + "filter", + "filter", + queryFilter, + false); + filter.hideLabel().setOutputMarkupId(true); + form.add(filter); + + form.add(new AjaxSubmitLink("search") { + + private static final long serialVersionUID = -1765773642975892072L; + + @Override + protected void onAfterSubmit(final AjaxRequestTarget target, final Form<?> form) { + super.onAfterSubmit(target, form); + + send(SchemaTypePanelWithSearch.this, + Broadcast.DEPTH, + new SchemaSearchEvent(target, queryFilter.getObject())); + } + }); + searchBoxContainer.add(form); + + add(searchBoxContainer); + } + + public static class SchemaSearchEvent implements Serializable { + + private static final long serialVersionUID = -282052400565266028L; + + private final AjaxRequestTarget target; + + private final String keyword; + + public SchemaSearchEvent(final AjaxRequestTarget target, final String keyword) { + this.target = target; + this.keyword = keyword; + } + + public AjaxRequestTarget getTarget() { + return target; + } + + public String getKeyword() { + return keyword; + } + + } + +} http://git-wip-us.apache.org/repos/asf/syncope/blob/a42311f5/client/console/src/main/java/org/apache/syncope/client/console/panels/SchemasPanel.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/SchemasPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/SchemasPanel.java index 78fb28c..7ad295b 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/panels/SchemasPanel.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/SchemasPanel.java @@ -55,7 +55,7 @@ public class SchemasPanel extends Panel { @Override public Panel getPanel(final String panelId) { - return new SchemaTypePanel(panelId, schemaType, pageReference); + return new SchemaTypePanelWithSearch(panelId, schemaType, pageReference); } }); } http://git-wip-us.apache.org/repos/asf/syncope/blob/a42311f5/client/console/src/main/java/org/apache/syncope/client/console/rest/SchemaRestClient.java ---------------------------------------------------------------------- diff --git a/client/console/src/main/java/org/apache/syncope/client/console/rest/SchemaRestClient.java b/client/console/src/main/java/org/apache/syncope/client/console/rest/SchemaRestClient.java index b902715..ea119df 100644 --- a/client/console/src/main/java/org/apache/syncope/client/console/rest/SchemaRestClient.java +++ b/client/console/src/main/java/org/apache/syncope/client/console/rest/SchemaRestClient.java @@ -82,19 +82,36 @@ public class SchemaRestClient extends BaseRestClient { } public <T extends SchemaTO> List<T> getSchemas(final SchemaType schemaType, final String... kind) { + return doGetSchemas(schemaType, null, kind); + } + + public <T extends SchemaTO> List<T> getSchemas( + final SchemaType schemaType, final String keyword, final String... kind) { + return doGetSchemas(schemaType, keyword, kind); + } + + private <T extends SchemaTO> List<T> doGetSchemas( + final SchemaType schemaType, final String keyword, final String... kind) { List<T> schemas = new ArrayList<>(); try { + SchemaQuery.Builder schemaQuery = + new SchemaQuery.Builder().type(schemaType); + if (keyword != null) { + schemaQuery.keyword(keyword); + } + if (kind == null || kind.length == 0) { schemas.addAll(getService(SchemaService.class). - <T>list(new SchemaQuery.Builder().type(schemaType).build())); + <T>list(schemaQuery.build())); } else { schemas.addAll(getService(SchemaService.class). - <T>list(new SchemaQuery.Builder().type(schemaType).anyTypeClasses(kind).build())); + <T>list(schemaQuery.anyTypeClasses(kind).build())); } } catch (SyncopeClientException e) { LOG.error("While getting all {} schemas for {}", schemaType, kind, e); } + return schemas; } http://git-wip-us.apache.org/repos/asf/syncope/blob/a42311f5/client/console/src/main/resources/org/apache/syncope/client/console/panels/SchemaTypePanelWithSearch.html ---------------------------------------------------------------------- diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/SchemaTypePanelWithSearch.html b/client/console/src/main/resources/org/apache/syncope/client/console/panels/SchemaTypePanelWithSearch.html new file mode 100644 index 0000000..6caa8b6 --- /dev/null +++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/SchemaTypePanelWithSearch.html @@ -0,0 +1,33 @@ +<!-- +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you under the Apache License, Version 2.0 (the +"License"); you may not use this file except in compliance +with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied. See the License for the +specific language governing permissions and limitations +under the License. +--> +<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org"> + <wicket:panel> + <div wicket:id="searchBox"> + <form wicket:id="form"> + <div class="form-group input-group"> + <span wicket:id="filter">[FILTER]</span> + <span class="input-group-addon"> + <a href="#" wicket:id="search"><i class="glyphicon glyphicon-search"></i></a> + </span> + </div> + </form> + </div> + <div wicket:id="content"></div> + </wicket:panel> +</html> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/syncope/blob/a42311f5/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/SchemaQuery.java ---------------------------------------------------------------------- diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/SchemaQuery.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/SchemaQuery.java index 811b664..a35b85c 100644 --- a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/SchemaQuery.java +++ b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/SchemaQuery.java @@ -61,6 +61,12 @@ public class SchemaQuery extends AbstractBaseBean { return anyTypeClasses(Arrays.asList(anyTypeClasses)); } + public Builder keyword(final String keyword) { + instance.setKeyword(keyword); + + return this; + } + public SchemaQuery build() { if (instance.type == null) { throw new IllegalArgumentException("type is required"); @@ -73,6 +79,8 @@ public class SchemaQuery extends AbstractBaseBean { private List<String> anyTypeClasses; + private String keyword; + public SchemaType getType() { return type; } @@ -92,4 +100,13 @@ public class SchemaQuery extends AbstractBaseBean { this.anyTypeClasses = anyTypeClasses; } + public String getKeyword() { + return keyword; + } + + @QueryParam("keyword") + public void setKeyword(final String keyword) { + this.keyword = keyword; + } + } http://git-wip-us.apache.org/repos/asf/syncope/blob/a42311f5/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/SchemaService.java ---------------------------------------------------------------------- diff --git a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/SchemaService.java b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/SchemaService.java index f0cd4a6..e19cce7 100644 --- a/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/SchemaService.java +++ b/common/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/SchemaService.java @@ -56,7 +56,8 @@ public interface SchemaService extends JAXRSService { * * @param <T> actual SchemaTO * @param query query conditions - * @return list of schemas with matching type, for the given anyTypeClass if provided + * @return list of schemas with matching type, for the given anyTypeClass if provided, + * with names containing keyword if provided */ @GET @Path("{type}") http://git-wip-us.apache.org/repos/asf/syncope/blob/a42311f5/core/logic/src/main/java/org/apache/syncope/core/logic/SchemaLogic.java ---------------------------------------------------------------------- diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/SchemaLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/SchemaLogic.java index b06c918..4f16de9 100644 --- a/core/logic/src/main/java/org/apache/syncope/core/logic/SchemaLogic.java +++ b/core/logic/src/main/java/org/apache/syncope/core/logic/SchemaLogic.java @@ -148,7 +148,21 @@ public class SchemaLogic extends AbstractTransactionalLogic<SchemaTO> { @SuppressWarnings("unchecked") public <T extends SchemaTO> List<T> list( final SchemaType schemaType, final List<String> anyTypeClasses) { + return doSearch(schemaType, anyTypeClasses, null); + } + + @PreAuthorize("isAuthenticated()") + @SuppressWarnings("unchecked") + public <T extends SchemaTO> List<T> search( + final SchemaType schemaType, final List<String> anyTypeClasses, final String keyword) { + return doSearch(schemaType, anyTypeClasses, + keyword != null + ? StringUtils.replaceChars(keyword, "*", "%") + : null); + } + private <T extends SchemaTO> List<T> doSearch( + final SchemaType schemaType, final List<String> anyTypeClasses, final String keyword) { List<AnyTypeClass> classes = new ArrayList<>(anyTypeClasses == null ? 0 : anyTypeClasses.size()); if (anyTypeClasses != null) { anyTypeClasses.remove(AnyTypeKind.USER.name()); @@ -167,7 +181,9 @@ public class SchemaLogic extends AbstractTransactionalLogic<SchemaTO> { switch (schemaType) { case VIRTUAL: result = CollectionUtils.collect( - classes.isEmpty() ? virSchemaDAO.findAll() : virSchemaDAO.findByAnyTypeClasses(classes), + classes.isEmpty() + ? (keyword == null ? virSchemaDAO.findAll() : virSchemaDAO.search(keyword)) + : virSchemaDAO.findByAnyTypeClasses(classes), new Transformer<VirSchema, T>() { @Override @@ -179,7 +195,9 @@ public class SchemaLogic extends AbstractTransactionalLogic<SchemaTO> { case DERIVED: result = CollectionUtils.collect( - classes.isEmpty() ? derSchemaDAO.findAll() : derSchemaDAO.findByAnyTypeClasses(classes), + classes.isEmpty() + ? (keyword == null ? derSchemaDAO.findAll() : derSchemaDAO.search(keyword)) + : derSchemaDAO.findByAnyTypeClasses(classes), new Transformer<DerSchema, T>() { @Override @@ -192,7 +210,9 @@ public class SchemaLogic extends AbstractTransactionalLogic<SchemaTO> { case PLAIN: default: result = CollectionUtils.collect( - classes.isEmpty() ? plainSchemaDAO.findAll() : plainSchemaDAO.findByAnyTypeClasses(classes), + classes.isEmpty() + ? (keyword == null ? plainSchemaDAO.findAll() : plainSchemaDAO.search(keyword)) + : plainSchemaDAO.findByAnyTypeClasses(classes), new Transformer<PlainSchema, T>() { @Override http://git-wip-us.apache.org/repos/asf/syncope/blob/a42311f5/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/SchemaDAO.java ---------------------------------------------------------------------- diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/SchemaDAO.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/SchemaDAO.java index 76ce8ed..de2df90 100644 --- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/SchemaDAO.java +++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/SchemaDAO.java @@ -30,7 +30,9 @@ public interface SchemaDAO<S extends Schema> extends DAO<S> { List<S> findByAnyTypeClasses(Collection<AnyTypeClass> anyTypeClasses); List<S> findAll(); - + + List<S> search(String keyword); + S save(S derSchema); void delete(String key); http://git-wip-us.apache.org/repos/asf/syncope/blob/a42311f5/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPADerSchemaDAO.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPADerSchemaDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPADerSchemaDAO.java index 3894adb..98e1bea 100644 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPADerSchemaDAO.java +++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPADerSchemaDAO.java @@ -63,6 +63,15 @@ public class JPADerSchemaDAO extends AbstractDAO<DerSchema> implements DerSchema } @Override + public List<DerSchema> search(final String keyword) { + TypedQuery<DerSchema> query = entityManager().createQuery( + "SELECT e FROM " + JPADerSchema.class.getSimpleName() + " e" + + " WHERE e.id LIKE :keyword", DerSchema.class); + query.setParameter("keyword", keyword); + return query.getResultList(); + } + + @Override public DerSchema save(final DerSchema derSchema) { return entityManager().merge(derSchema); } http://git-wip-us.apache.org/repos/asf/syncope/blob/a42311f5/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPlainSchemaDAO.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPlainSchemaDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPlainSchemaDAO.java index dfc3840..b9b333c 100644 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPlainSchemaDAO.java +++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAPlainSchemaDAO.java @@ -81,6 +81,15 @@ public class JPAPlainSchemaDAO extends AbstractDAO<PlainSchema> implements Plain } @Override + public List<PlainSchema> search(final String keyword) { + TypedQuery<PlainSchema> query = entityManager().createQuery( + "SELECT e FROM " + JPAPlainSchema.class.getSimpleName() + " e" + + " WHERE e.id LIKE :keyword", PlainSchema.class); + query.setParameter("keyword", keyword); + return query.getResultList(); + } + + @Override public <T extends PlainAttr<?>> List<T> findAttrs(final PlainSchema schema, final Class<T> reference) { TypedQuery<T> query = entityManager().createQuery( "SELECT e FROM " + ((JPAPlainAttrDAO) plainAttrDAO).getEntityReference(reference).getSimpleName() http://git-wip-us.apache.org/repos/asf/syncope/blob/a42311f5/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAVirSchemaDAO.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAVirSchemaDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAVirSchemaDAO.java index 4dfc8db..b42b40a 100644 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAVirSchemaDAO.java +++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAVirSchemaDAO.java @@ -115,6 +115,15 @@ public class JPAVirSchemaDAO extends AbstractDAO<VirSchema> implements VirSchema } @Override + public List<VirSchema> search(final String keyword) { + TypedQuery<VirSchema> query = entityManager().createQuery( + "SELECT e FROM " + JPAVirSchema.class.getSimpleName() + " e" + + " WHERE e.id LIKE :keyword", VirSchema.class); + query.setParameter("keyword", keyword); + return query.getResultList(); + } + + @Override public VirSchema save(final VirSchema virSchema) { return entityManager().merge(virSchema); } http://git-wip-us.apache.org/repos/asf/syncope/blob/a42311f5/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/DerSchemaTest.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/DerSchemaTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/DerSchemaTest.java index 97764b8..f1a4fcd 100644 --- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/DerSchemaTest.java +++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/DerSchemaTest.java @@ -47,6 +47,12 @@ public class DerSchemaTest extends AbstractTest { } @Test + public void search() { + List<DerSchema> schemas = derSchemaDAO.search("mderivedd*"); + assertEquals(1, schemas.size()); + } + + @Test public void findByName() { DerSchema attributeSchema = derSchemaDAO.find("cn"); assertNotNull("did not find expected derived attribute schema", attributeSchema); http://git-wip-us.apache.org/repos/asf/syncope/blob/a42311f5/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/PlainSchemaTest.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/PlainSchemaTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/PlainSchemaTest.java index ffe1edc..416998a 100644 --- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/PlainSchemaTest.java +++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/PlainSchemaTest.java @@ -51,6 +51,12 @@ public class PlainSchemaTest extends AbstractTest { } @Test + public void search() { + List<PlainSchema> schemas = plainSchemaDAO.search("fullna*"); + assertEquals(1, schemas.size()); + } + + @Test public void findByName() { PlainSchema schema = plainSchemaDAO.find("fullname"); assertNotNull("did not find expected attribute schema", schema); http://git-wip-us.apache.org/repos/asf/syncope/blob/a42311f5/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/VirSchemaTest.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/VirSchemaTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/VirSchemaTest.java index 192ef0f..83693e4 100644 --- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/VirSchemaTest.java +++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/VirSchemaTest.java @@ -54,6 +54,12 @@ public class VirSchemaTest extends AbstractTest { } @Test + public void search() { + List<VirSchema> schemas = virSchemaDAO.search("rvirtuald*"); + assertEquals(1, schemas.size()); + } + + @Test public void findByName() { VirSchema attributeSchema = virSchemaDAO.find("virtualdata"); assertNotNull("did not find expected virtual attribute schema", attributeSchema); http://git-wip-us.apache.org/repos/asf/syncope/blob/a42311f5/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/SchemaServiceImpl.java ---------------------------------------------------------------------- diff --git a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/SchemaServiceImpl.java b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/SchemaServiceImpl.java index 5c74e41..10db5b5 100644 --- a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/SchemaServiceImpl.java +++ b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/SchemaServiceImpl.java @@ -53,7 +53,7 @@ public class SchemaServiceImpl extends AbstractServiceImpl implements SchemaServ @Override public <T extends SchemaTO> List<T> list(final SchemaQuery query) { - return logic.list(query.getType(), query.getAnyTypeClasses()); + return logic.search(query.getType(), query.getAnyTypeClasses(), query.getKeyword()); } @Override http://git-wip-us.apache.org/repos/asf/syncope/blob/a42311f5/fit/core-reference/src/test/java/org/apache/syncope/fit/console/AbstractTypesITCase.java ---------------------------------------------------------------------- diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/AbstractTypesITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/AbstractTypesITCase.java index 6a395ad..4c9362e 100644 --- a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/AbstractTypesITCase.java +++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/AbstractTypesITCase.java @@ -27,10 +27,10 @@ import org.junit.Before; public abstract class AbstractTypesITCase extends AbstractConsoleITCase { protected static final String PLAIN_DATATABLE_PATH = "body:content:tabbedPanel:panel:" - + "accordionPanel:tabs:0:body:content:container:content:searchContainer:resultTable"; + + "accordionPanel:tabs:0:body:content:content:container:content:searchContainer:resultTable"; protected static final String VIRTUAL_DATATABLE_PATH = "body:content:tabbedPanel:panel:" - + "accordionPanel:tabs:2:body:content:container:content:searchContainer:resultTable"; + + "accordionPanel:tabs:2:body:content:content:container:content:searchContainer:resultTable"; protected static final String DATATABLE_PATH = "body:content:tabbedPanel:panel:container:content:searchContainer:resultTable"; @@ -88,19 +88,19 @@ public abstract class AbstractTypesITCase extends AbstractConsoleITCase { protected void createPlainSchema(final String key) { browsingToPlainSchemas(); TESTER.clickLink( - "body:content:tabbedPanel:panel:accordionPanel:tabs:0:body:content:container:content:add"); + "body:content:tabbedPanel:panel:accordionPanel:tabs:0:body:content:content:container:content:add"); TESTER.assertComponent( - "body:content:tabbedPanel:panel:accordionPanel:tabs:0:body:content:outerObjectsRepeater:0:outer", + "body:content:tabbedPanel:panel:accordionPanel:tabs:0:body:content:content:outerObjectsRepeater:0:outer", Modal.class); final FormTester formTester = TESTER.newFormTester("body:content:tabbedPanel:panel:" - + "accordionPanel:tabs:0:body:content:outerObjectsRepeater:0:outer:form"); + + "accordionPanel:tabs:0:body:content:content:outerObjectsRepeater:0:outer:form"); formTester.setValue("content:details:form:key:textField", key); formTester.setValue("content:details:form:type:dropDownChoiceField", "3"); - TESTER.clickLink("body:content:tabbedPanel:panel:" - + "accordionPanel:tabs:0:body:content:outerObjectsRepeater:0:outer:dialog:footer:inputs:0:submit"); + TESTER.clickLink("body:content:tabbedPanel:panel:accordionPanel:" + + "tabs:0:body:content:content:outerObjectsRepeater:0:outer:dialog:footer:inputs:0:submit"); TESTER.assertInfoMessages("Operation executed successfully"); http://git-wip-us.apache.org/repos/asf/syncope/blob/a42311f5/fit/core-reference/src/test/java/org/apache/syncope/fit/console/SchemasITCase.java ---------------------------------------------------------------------- diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/SchemasITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/SchemasITCase.java index 45303fb..74c9c26 100644 --- a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/SchemasITCase.java +++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/SchemasITCase.java @@ -45,32 +45,32 @@ public class SchemasITCase extends AbstractTypesITCase { Constants.ON_CLICK); TESTER.clickLink( - "body:content:tabbedPanel:panel:accordionPanel:tabs:0:body:content:outerObjectsRepeater:1:outer:" + "body:content:tabbedPanel:panel:accordionPanel:tabs:0:body:content:content:outerObjectsRepeater:1:outer:" + "container:content:togglePanelContainer:container:actions:actions:actionRepeater:0:action:action"); TESTER.assertComponent( "body:content:tabbedPanel:" - + "panel:accordionPanel:tabs:0:body:content:outerObjectsRepeater:0:outer:" + + "panel:accordionPanel:tabs:0:body:content:content:outerObjectsRepeater:0:outer:" + "form:content:kindForm:kind:dropDownChoiceField", DropDownChoice.class); } @Test public void createPlainSchema() { browsingToPlainSchemas(); - TESTER.clickLink( - "body:content:tabbedPanel:panel:accordionPanel:tabs:0:body:content:container:content:add"); + TESTER.clickLink("body:content:tabbedPanel:panel:accordionPanel:" + + "tabs:0:body:content:content:container:content:add"); - TESTER.assertComponent( - "body:content:tabbedPanel:panel:accordionPanel:tabs:0:body:content:outerObjectsRepeater:0:outer", + TESTER.assertComponent("body:content:tabbedPanel:panel:accordionPanel:" + + "tabs:0:body:content:content:outerObjectsRepeater:0:outer", Modal.class); final FormTester formTester = TESTER.newFormTester("body:content:tabbedPanel:panel:" - + "accordionPanel:tabs:0:body:content:outerObjectsRepeater:0:outer:form"); + + "accordionPanel:tabs:0:body:content:content:outerObjectsRepeater:0:outer:form"); formTester.setValue("content:details:form:key:textField", "zBoolean"); formTester.setValue("content:details:form:type:dropDownChoiceField", "3"); - TESTER.clickLink("body:content:tabbedPanel:panel:accordionPanel:tabs:0:body:content:outerObjectsRepeater:0:" - + "outer:dialog:footer:inputs:0:submit"); + TESTER.clickLink("body:content:tabbedPanel:panel:accordionPanel:" + + "tabs:0:body:content:content:outerObjectsRepeater:0:outer:dialog:footer:inputs:0:submit"); TESTER.assertInfoMessages("Operation executed successfully"); @@ -88,21 +88,20 @@ public class SchemasITCase extends AbstractTypesITCase { assertNotNull(result); TESTER.executeAjaxEvent(result.getPageRelativePath(), Constants.ON_CLICK); - TESTER.clickLink( - "body:content:tabbedPanel:panel:accordionPanel:tabs:0:body:content:outerObjectsRepeater:1:outer:" + TESTER.clickLink("body:content:tabbedPanel:panel:accordionPanel:" + + "tabs:0:body:content:content:outerObjectsRepeater:1:outer:" + "container:content:togglePanelContainer:container:actions:actions:actionRepeater:0:action:action"); - TESTER.assertComponent( - "body:content:tabbedPanel:" - + "panel:accordionPanel:tabs:0:body:content:outerObjectsRepeater:0:outer:" + TESTER.assertComponent("body:content:tabbedPanel:panel:accordionPanel:" + + "tabs:0:body:content:content:outerObjectsRepeater:0:outer:" + "form:content:kindForm:kind:dropDownChoiceField", DropDownChoice.class); - FormTester formTester = TESTER.newFormTester( - "body:content:tabbedPanel:panel:accordionPanel:tabs:0:body:content:outerObjectsRepeater:0:outer:form"); + FormTester formTester = TESTER.newFormTester("body:content:tabbedPanel:panel:accordionPanel:" + + "tabs:0:body:content:content:outerObjectsRepeater:0:outer:form"); formTester.setValue("content:details:form:multivalue:checkboxField", "true"); - TESTER.clickLink("body:content:tabbedPanel:panel:" - + "accordionPanel:tabs:0:body:content:outerObjectsRepeater:0:outer:dialog:footer:inputs:0:submit", + TESTER.clickLink("body:content:tabbedPanel:panel:accordionPanel:" + + "tabs:0:body:content:content:outerObjectsRepeater:0:outer:dialog:footer:inputs:0:submit", true); TESTER.assertInfoMessages("Operation executed successfully"); @@ -113,20 +112,20 @@ public class SchemasITCase extends AbstractTypesITCase { browsingToPlainSchemas(); //create new Plain Schema final String schemaName = "zStringDelete"; - TESTER.clickLink( - "body:content:tabbedPanel:panel:accordionPanel:tabs:0:body:content:container:content:add"); + TESTER.clickLink("body:content:tabbedPanel:panel:accordionPanel:" + + "tabs:0:body:content:content:container:content:add"); - TESTER.assertComponent( - "body:content:tabbedPanel:panel:accordionPanel:tabs:0:body:content:outerObjectsRepeater:0:outer", + TESTER.assertComponent("body:content:tabbedPanel:panel:accordionPanel:" + + "tabs:0:body:content:content:outerObjectsRepeater:0:outer", Modal.class); final FormTester formTester = TESTER.newFormTester("body:content:tabbedPanel:panel:" - + "accordionPanel:tabs:0:body:content:outerObjectsRepeater:0:outer:form"); + + "accordionPanel:tabs:0:body:content:content:outerObjectsRepeater:0:outer:form"); formTester.setValue("content:details:form:key:textField", schemaName); formTester.setValue("content:details:form:type:dropDownChoiceField", "0"); - TESTER.clickLink("body:content:tabbedPanel:panel:" - + "accordionPanel:tabs:0:body:content:outerObjectsRepeater:0:outer:dialog:footer:inputs:0:submit"); + TESTER.clickLink("body:content:tabbedPanel:panel:accordionPanel:" + + "tabs:0:body:content:content:outerObjectsRepeater:0:outer:dialog:footer:inputs:0:submit"); TESTER.assertInfoMessages("Operation executed successfully");; @@ -145,12 +144,12 @@ public class SchemasITCase extends AbstractTypesITCase { TESTER.executeAjaxEvent(result.getPageRelativePath(), Constants.ON_CLICK); TESTER.getRequest().addParameter("confirm", "true"); - TESTER.clickLink( - "body:content:tabbedPanel:panel:accordionPanel:tabs:0:body:content:outerObjectsRepeater:1:outer:" + TESTER.clickLink("body:content:tabbedPanel:panel:accordionPanel:" + + "tabs:0:body:content:content:outerObjectsRepeater:1:outer:" + "container:content:togglePanelContainer:container:actions:actions:actionRepeater:1:action:action"); - TESTER.executeAjaxEvent(TESTER.getComponentFromLastRenderedPage( - "body:content:tabbedPanel:panel:accordionPanel:tabs:0:body:content:outerObjectsRepeater:1:outer:" + TESTER.executeAjaxEvent(TESTER.getComponentFromLastRenderedPage("body:content:tabbedPanel:panel:accordionPanel:" + + "tabs:0:body:content:content:outerObjectsRepeater:1:outer:" + "container:content:togglePanelContainer:container:actions:actions:actionRepeater:1:action:action"), Constants.ON_CLICK); @@ -163,19 +162,19 @@ public class SchemasITCase extends AbstractTypesITCase { @Test public void createVirtualSchema() { browsingToVirtualSchemas(); - TESTER.clickLink( - "body:content:tabbedPanel:panel:accordionPanel:tabs:2:body:content:container:content:add"); + TESTER.clickLink("body:content:tabbedPanel:panel:accordionPanel:" + + "tabs:2:body:content:content:container:content:add"); - TESTER.assertComponent( - "body:content:tabbedPanel:panel:accordionPanel:tabs:2:body:content:outerObjectsRepeater:0:outer", + TESTER.assertComponent("body:content:tabbedPanel:panel:accordionPanel:" + + "tabs:2:body:content:content:outerObjectsRepeater:0:outer", Modal.class); - final FormTester formTester = TESTER.newFormTester("body:content:tabbedPanel:panel:" - + "accordionPanel:tabs:2:body:content:outerObjectsRepeater:0:outer:form"); + final FormTester formTester = TESTER.newFormTester("body:content:tabbedPanel:panel:accordionPanel:" + + "tabs:2:body:content:content:outerObjectsRepeater:0:outer:form"); formTester.setValue("content:details:form:resource:dropDownChoiceField", "0"); TESTER.executeAjaxEvent("body:content:tabbedPanel:panel:" - + "accordionPanel:tabs:2:body:content:outerObjectsRepeater:0:outer:form:" + + "accordionPanel:tabs:2:body:content:content:outerObjectsRepeater:0:outer:form:" + "content:details:form:resource:dropDownChoiceField", Constants.ON_CHANGE); formTester.setValue("content:details:form:key:textField", "mynewvir"); @@ -183,8 +182,9 @@ public class SchemasITCase extends AbstractTypesITCase { formTester.setValue("content:details:form:anyType:dropDownChoiceField", "0"); formTester.setValue("content:details:form:extAttrName:textField", "virattr"); - TESTER.executeAjaxEvent("body:content:tabbedPanel:panel:accordionPanel:tabs:2:body:content:" - + "outerObjectsRepeater:0:outer:dialog:footer:inputs:0:submit", Constants.ON_CLICK); + TESTER.executeAjaxEvent("body:content:tabbedPanel:panel:accordionPanel:" + + "tabs:2:body:content:content:outerObjectsRepeater:0:outer:dialog:footer:inputs:0:submit", + Constants.ON_CLICK); TESTER.assertInfoMessages("Operation executed successfully"); TESTER.cleanupFeedbackMessages(); @@ -194,12 +194,12 @@ public class SchemasITCase extends AbstractTypesITCase { TESTER.executeAjaxEvent(result.getPageRelativePath(), Constants.ON_CLICK); TESTER.getRequest().addParameter("confirm", "true"); - TESTER.clickLink( - "body:content:tabbedPanel:panel:accordionPanel:tabs:2:body:content:outerObjectsRepeater:1:outer:" + TESTER.clickLink("body:content:tabbedPanel:panel:accordionPanel:" + + "tabs:2:body:content:content:outerObjectsRepeater:1:outer:" + "container:content:togglePanelContainer:container:actions:actions:actionRepeater:1:action:action"); - TESTER.executeAjaxEvent(TESTER.getComponentFromLastRenderedPage( - "body:content:tabbedPanel:panel:accordionPanel:tabs:2:body:content:outerObjectsRepeater:1:outer:" + TESTER.executeAjaxEvent(TESTER.getComponentFromLastRenderedPage("body:content:tabbedPanel:panel:accordionPanel:" + + "tabs:2:body:content:content:outerObjectsRepeater:1:outer:" + "container:content:togglePanelContainer:container:actions:actions:actionRepeater:1:action:action"), Constants.ON_CLICK); http://git-wip-us.apache.org/repos/asf/syncope/blob/a42311f5/fit/core-reference/src/test/java/org/apache/syncope/fit/core/DerSchemaITCase.java ---------------------------------------------------------------------- diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/DerSchemaITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/DerSchemaITCase.java index db8bdaa..ab877dc 100644 --- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/DerSchemaITCase.java +++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/DerSchemaITCase.java @@ -47,6 +47,16 @@ public class DerSchemaITCase extends AbstractITCase { } @Test + public void search() { + List<DerSchemaTO> derSchemas = + schemaService.list(new SchemaQuery.Builder().type(SchemaType.DERIVED).keyword("mderivedd*").build()); + assertFalse(derSchemas.isEmpty()); + for (DerSchemaTO derivedSchemaTO : derSchemas) { + assertNotNull(derivedSchemaTO); + } + } + + @Test public void read() { DerSchemaTO derivedSchemaTO = schemaService.read(SchemaType.DERIVED, "cn"); assertNotNull(derivedSchemaTO); http://git-wip-us.apache.org/repos/asf/syncope/blob/a42311f5/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PlainSchemaITCase.java ---------------------------------------------------------------------- diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PlainSchemaITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PlainSchemaITCase.java index e36c8e5..83ad9f5 100644 --- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PlainSchemaITCase.java +++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PlainSchemaITCase.java @@ -264,6 +264,16 @@ public class PlainSchemaITCase extends AbstractITCase { } @Test + public void search() { + List<PlainSchemaTO> schemas = + schemaService.list(new SchemaQuery.Builder().type(SchemaType.PLAIN).keyword("fullna*").build()); + assertFalse(schemas.isEmpty()); + for (PlainSchemaTO schemaTO : schemas) { + assertNotNull(schemaTO); + } + } + + @Test public void listByAnyTypeClass() { List<PlainSchemaTO> userSchemas = schemaService.list( new SchemaQuery.Builder().type(SchemaType.PLAIN).anyTypeClass("minimal user").build()); http://git-wip-us.apache.org/repos/asf/syncope/blob/a42311f5/fit/core-reference/src/test/java/org/apache/syncope/fit/core/VirSchemaITCase.java ---------------------------------------------------------------------- diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/VirSchemaITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/VirSchemaITCase.java index faf1a0d..71aed10 100644 --- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/VirSchemaITCase.java +++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/VirSchemaITCase.java @@ -51,6 +51,16 @@ public class VirSchemaITCase extends AbstractITCase { } @Test + public void search() { + List<VirSchemaTO> vSchemas = + schemaService.list(new SchemaQuery.Builder().type(SchemaType.VIRTUAL).keyword("rvirtuald*").build()); + assertFalse(vSchemas.isEmpty()); + for (VirSchemaTO vSchemaTO : vSchemas) { + assertNotNull(vSchemaTO); + } + } + + @Test public void crud() { ResourceTO csv = resourceService.read(RESOURCE_NAME_CSV); assertNotNull(csv);