/* * 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.directory.studio.openldap.config.acl.editor; import org.apache.directory.api.util.Strings; import org.apache.directory.studio.ldapbrowser.core.model.AttributeHierarchy; import org.apache.directory.studio.ldapbrowser.core.model.IBrowserConnection; import org.apache.directory.studio.ldapbrowser.core.model.IEntry; import org.apache.directory.studio.ldapbrowser.core.model.IValue; import org.apache.directory.studio.valueeditors.AbstractDialogStringValueEditor; import org.eclipse.swt.widgets.Shell; import org.apache.directory.studio.openldap.config.acl.OpenLdapAclValueWithContext; import org.apache.directory.studio.openldap.config.acl.dialogs.OpenLdapAclDialog; /** * This class implements a value editor that handle OpenLDAP ACL string values * in a dialog. * * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a> */ public class OpenLdapAclValueEditor extends AbstractDialogStringValueEditor { /** * {@inheritDoc} */ protected boolean openDialog( Shell shell ) { Object value = getValue(); if ( value instanceof OpenLdapAclValueWithContext ) { OpenLdapAclValueWithContext context = ( OpenLdapAclValueWithContext ) value; OpenLdapAclDialog dialog = new OpenLdapAclDialog( shell, context ); if ( ( dialog.open() == OpenLdapAclDialog.OK ) && !"".equals( dialog.getAclValue() ) ) //$NON-NLS-1$ { if ( dialog.hasPrecedence() ) { String aclValue = "{" + dialog.getPrecedence() + "}" + dialog.getAclValue(); setValue( aclValue ); } else { String aclValue = dialog.getAclValue(); setValue( aclValue ); } return true; } } return false; } /** * Returns a ACIItemValueContext with the connection * and entry of the attribute hierarchy and an empty value if there * are no values in attributeHierarchy. * * Returns a ACIItemValueContext with the connection * and entry of the attribute hierarchy and a value if there is * one value in attributeHierarchy. * * @param attributeHierarchy the attribute hierarchy * * @return the raw value */ public Object getRawValue( AttributeHierarchy attributeHierarchy ) { if ( attributeHierarchy == null ) { return null; } if ( ( attributeHierarchy.size() == 1 ) && ( attributeHierarchy.getAttribute().getValueSize() == 0 ) ) { IEntry entry = attributeHierarchy.getAttribute().getEntry(); IBrowserConnection connection = entry.getBrowserConnection(); if ( attributeHierarchy.getAttribute().getValueSize() == 0 ) { return new OpenLdapAclValueWithContext( connection, entry, -1, "" ); //$NON-NLS-1$ } else if ( attributeHierarchy.getAttribute().getValueSize() == 1 ) { String valueStr = getDisplayValue( attributeHierarchy ); int precedence = getPrecedence( valueStr ); String aclValue = valueStr; if ( precedence != -1 ) { aclValue = removePrecedence( valueStr ); } return new OpenLdapAclValueWithContext( connection, entry, precedence, aclValue ); } } return null; } /** * Returns a ACIItemValueContext with the connection, * entry and string value of the given value. * * @param value the value * * @return the raw value */ public Object getRawValue( IValue value ) { Object object = super.getRawValue( value ); if ( object instanceof String ) { IEntry entry = value.getAttribute().getEntry(); IBrowserConnection connection = entry.getBrowserConnection(); String valueStr = ( String ) object; int precedence = getPrecedence( valueStr ); String aclValue = valueStr; if ( precedence != -1 ) { aclValue = removePrecedence( valueStr ); } return new OpenLdapAclValueWithContext( connection, entry, precedence, aclValue ); } return null; } /** * Gets the precedence value (or -1 if none is found). * * @param s the string * @return the precedence value (or -1 if none is found). */ public int getPrecedence( String s ) { // Checking if the acl contains precedence information ("{int}") if ( Strings.isCharASCII( s, 0, '{' ) ) { int precedence = 0; int pos = 1; while ( pos < s.length() ) { char c = s.charAt( pos ); if ( c == '}' ) { if ( pos == 1 ) { return -1; } else { return precedence; } } if ( ( c >= '0' ) && ( c <= '9' ) ) { precedence = precedence*10 + ( c - '0' ); } else { // Not a precedence return -1; } pos++; } return -1; } else { return -1; } } /** * Return the ACII value withoiut the precedence part * * @param str The original ACII, with or without precedence * @return The ACII string minus the precedence part */ public String removePrecedence( String str ) { if ( Strings.isCharASCII( str, 0, '{' ) ) { int pos = 1; while ( pos < str.length() ) { char c = str.charAt( pos ); if ( c == '}' ) { if ( pos == 1 ) { // We just have {}, return the string return str; } else { return str.substring( pos + 1 ); } } if ( ( c < '0' ) && ( c > '9' ) ) { // Not a number, get out return str; } pos++; } return str; } else { return str; } } }