| /* |
| * 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.core.provisioning.api; |
| |
| import java.text.ParseException; |
| import java.util.regex.Matcher; |
| import java.util.regex.Pattern; |
| import org.apache.commons.lang3.tuple.Pair; |
| import org.apache.syncope.common.lib.SyncopeConstants; |
| import org.apache.syncope.common.lib.types.AnyTypeKind; |
| import org.apache.syncope.common.lib.types.SchemaType; |
| import org.apache.syncope.core.persistence.api.dao.DerSchemaDAO; |
| import org.apache.syncope.core.persistence.api.dao.PlainSchemaDAO; |
| import org.apache.syncope.core.persistence.api.dao.VirSchemaDAO; |
| import org.apache.syncope.core.persistence.api.entity.AnyUtilsFactory; |
| import org.apache.syncope.core.persistence.api.entity.Schema; |
| import org.springframework.transaction.annotation.Transactional; |
| |
| @SuppressWarnings({ "squid:S4784", "squid:S3776" }) |
| public class IntAttrNameParser { |
| |
| protected static final String END_PATTERN = ")\\]\\.(.+)"; |
| |
| protected static final Pattern PRIVILEGE_PATTERN = Pattern.compile( |
| "^privileges\\[(" + SyncopeConstants.NAME_PATTERN + ")\\]"); |
| |
| protected static final Pattern ENCLOSING_GROUP_PATTERN = Pattern.compile( |
| "^groups\\[(" + SyncopeConstants.NAME_PATTERN + END_PATTERN); |
| |
| protected static final Pattern RELATED_USER_PATTERN = Pattern.compile( |
| "^users\\[(" + SyncopeConstants.NAME_PATTERN + END_PATTERN); |
| |
| protected static final Pattern RELATED_ANY_OBJECT_PATTERN = Pattern.compile( |
| "^anyObjects\\[(" + SyncopeConstants.NAME_PATTERN + END_PATTERN); |
| |
| protected static final Pattern MEMBERSHIP_PATTERN = Pattern.compile( |
| "^memberships\\[(" + SyncopeConstants.NAME_PATTERN + END_PATTERN); |
| |
| protected static final Pattern RELATIONSHIP_PATTERN = Pattern.compile( |
| "^relationships\\[(" + SyncopeConstants.NAME_PATTERN + ")\\]" |
| + "\\[(" + SyncopeConstants.NAME_PATTERN + END_PATTERN); |
| |
| protected final PlainSchemaDAO plainSchemaDAO; |
| |
| protected final DerSchemaDAO derSchemaDAO; |
| |
| protected final VirSchemaDAO virSchemaDAO; |
| |
| protected final AnyUtilsFactory anyUtilsFactory; |
| |
| public IntAttrNameParser( |
| final PlainSchemaDAO plainSchemaDAO, |
| final DerSchemaDAO derSchemaDAO, |
| final VirSchemaDAO virSchemaDAO, |
| final AnyUtilsFactory anyUtilsFactory) { |
| |
| this.plainSchemaDAO = plainSchemaDAO; |
| this.derSchemaDAO = derSchemaDAO; |
| this.virSchemaDAO = virSchemaDAO; |
| this.anyUtilsFactory = anyUtilsFactory; |
| } |
| |
| protected Pair<Schema, SchemaType> find(final String key) { |
| Schema schema = plainSchemaDAO.find(key); |
| if (schema == null) { |
| schema = derSchemaDAO.find(key); |
| if (schema == null) { |
| schema = virSchemaDAO.find(key); |
| if (schema == null) { |
| return null; |
| } else { |
| return Pair.of(schema, SchemaType.VIRTUAL); |
| } |
| } else { |
| return Pair.of(schema, SchemaType.DERIVED); |
| } |
| } else { |
| return Pair.of(schema, SchemaType.PLAIN); |
| } |
| } |
| |
| protected void setFieldOrSchemaName( |
| final String fieldOrSchemaName, |
| final AnyTypeKind anyTypeKind, |
| final IntAttrName result) { |
| |
| if (anyUtilsFactory.getInstance(anyTypeKind).getField(fieldOrSchemaName) == null) { |
| Pair<Schema, SchemaType> schemaInfo = find(fieldOrSchemaName); |
| if (schemaInfo != null) { |
| result.setSchemaType(schemaInfo.getRight()); |
| result.setSchema(schemaInfo.getLeft()); |
| } |
| } else { |
| result.setField(fieldOrSchemaName); |
| } |
| } |
| |
| @Transactional(readOnly = true) |
| public IntAttrName parse(final String intAttrName, final AnyTypeKind provisionAnyTypeKind) throws ParseException { |
| IntAttrName result = new IntAttrName(); |
| |
| Matcher matcher; |
| if (intAttrName.indexOf('.') == -1) { |
| matcher = PRIVILEGE_PATTERN.matcher(intAttrName); |
| if (matcher.matches()) { |
| result.setAnyTypeKind(AnyTypeKind.USER); |
| result.setPrivilegesOfApplication(matcher.group(1)); |
| } else { |
| result.setAnyTypeKind(provisionAnyTypeKind); |
| setFieldOrSchemaName(intAttrName, result.getAnyTypeKind(), result); |
| } |
| } else { |
| matcher = ENCLOSING_GROUP_PATTERN.matcher(intAttrName); |
| if (matcher.matches()) { |
| result.setAnyTypeKind(AnyTypeKind.GROUP); |
| result.setEnclosingGroup(matcher.group(1)); |
| setFieldOrSchemaName(matcher.group(2), result.getAnyTypeKind(), result); |
| } else { |
| matcher = RELATED_ANY_OBJECT_PATTERN.matcher(intAttrName); |
| if (matcher.matches()) { |
| result.setAnyTypeKind(AnyTypeKind.ANY_OBJECT); |
| result.setRelatedAnyObject(matcher.group(1)); |
| setFieldOrSchemaName(matcher.group(2), result.getAnyTypeKind(), result); |
| } else { |
| matcher = MEMBERSHIP_PATTERN.matcher(intAttrName); |
| if (matcher.matches()) { |
| result.setAnyTypeKind(AnyTypeKind.USER); |
| result.setMembershipOfGroup(matcher.group(1)); |
| setFieldOrSchemaName(matcher.group(2), result.getAnyTypeKind(), result); |
| } else { |
| matcher = RELATED_USER_PATTERN.matcher(intAttrName); |
| if (matcher.matches()) { |
| result.setAnyTypeKind(AnyTypeKind.USER); |
| result.setRelatedUser(matcher.group(1)); |
| setFieldOrSchemaName(matcher.group(2), result.getAnyTypeKind(), result); |
| } else { |
| matcher = RELATIONSHIP_PATTERN.matcher(intAttrName); |
| if (matcher.matches()) { |
| result.setAnyTypeKind(AnyTypeKind.ANY_OBJECT); |
| result.setRelationshipType(matcher.group(1)); |
| result.setRelationshipAnyType(matcher.group(2)); |
| setFieldOrSchemaName(matcher.group(3), result.getAnyTypeKind(), result); |
| } else { |
| throw new ParseException("Unparsable expression: " + intAttrName, 0); |
| } |
| } |
| } |
| } |
| } |
| } |
| |
| return result; |
| } |
| } |