/* * 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.schemaeditor.view.views; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import org.apache.directory.api.ldap.model.schema.AttributeType; import org.apache.directory.api.ldap.model.schema.ObjectClass; import org.apache.directory.api.ldap.model.schema.SchemaObject; import org.apache.directory.studio.schemaeditor.Activator; import org.apache.directory.studio.schemaeditor.PluginConstants; import org.apache.directory.studio.schemaeditor.view.wrappers.TreeNode; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.Viewer; /** * This class implements the ContentProvider for the SchemaView. * * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a> */ public class SearchViewContentProvider implements IStructuredContentProvider, ITreeContentProvider { /** The preferences store */ private IPreferenceStore store; /** The FirstName Sorter */ private Comparator<SchemaObject> firstNameSorter; /** The OID Sorter */ private Comparator<SchemaObject> oidSorter; /** * Creates a new instance of DifferencesWidgetSchemaContentProvider. */ public SearchViewContentProvider() { store = Activator.getDefault().getPreferenceStore(); firstNameSorter = new Comparator<SchemaObject>() { public int compare( SchemaObject o1, SchemaObject o2 ) { List<String> o1Names = null; List<String> o2Names = null; if ( ( o1 instanceof AttributeType ) && ( o2 instanceof AttributeType ) ) { AttributeType at1 = ( AttributeType ) o1; AttributeType at2 = ( AttributeType ) o2; o1Names = at1.getNames(); o2Names = at2.getNames(); } else if ( ( o1 instanceof ObjectClass ) && ( o2 instanceof ObjectClass ) ) { ObjectClass oc1 = ( ObjectClass ) o1; ObjectClass oc2 = ( ObjectClass ) o2; o1Names = oc1.getNames(); o2Names = oc2.getNames(); } else if ( ( o1 instanceof AttributeType ) && ( o2 instanceof ObjectClass ) ) { AttributeType at = ( AttributeType ) o1; ObjectClass oc = ( ObjectClass ) o2; o1Names = at.getNames(); o2Names = oc.getNames(); } else if ( ( o1 instanceof ObjectClass ) && ( o2 instanceof AttributeType ) ) { ObjectClass oc = ( ObjectClass ) o1; AttributeType at = ( AttributeType ) o2; o1Names = oc.getNames(); o2Names = at.getNames(); } // Comparing the First Name if ( ( o1Names != null ) && ( o2Names != null ) ) { if ( ( o1Names.size() > 0 ) && ( o2Names.size() > 0 ) ) { return o1Names.get( 0 ).compareToIgnoreCase( o2Names.get( 0 ) ); } else if ( ( o1Names.size() == 0 ) && ( o2Names.size() > 0 ) ) { return "".compareToIgnoreCase( o2Names.get( 0 ) ); //$NON-NLS-1$ } else if ( ( o1Names.size() > 0 ) && ( o2Names.size() == 0 ) ) { return o1Names.get( 0 ).compareToIgnoreCase( "" ); //$NON-NLS-1$ } } // Default return o1.toString().compareToIgnoreCase( o2.toString() ); } }; oidSorter = new Comparator<SchemaObject>() { public int compare( SchemaObject o1, SchemaObject o2 ) { if ( ( o1 instanceof AttributeType ) && ( o2 instanceof AttributeType ) ) { AttributeType at1 = ( AttributeType ) o1; AttributeType at2 = ( AttributeType ) o2; return at1.getOid().compareToIgnoreCase( at2.getOid() ); } else if ( ( o1 instanceof ObjectClass ) && ( o2 instanceof ObjectClass ) ) { ObjectClass oc1 = ( ObjectClass ) o1; ObjectClass oc2 = ( ObjectClass ) o2; return oc1.getOid().compareToIgnoreCase( oc2.getOid() ); } else if ( ( o1 instanceof AttributeType ) && ( o2 instanceof ObjectClass ) ) { AttributeType at = ( AttributeType ) o1; ObjectClass oc = ( ObjectClass ) o2; return at.getOid().compareToIgnoreCase( oc.getOid() ); } else if ( ( o1 instanceof ObjectClass ) && ( o2 instanceof AttributeType ) ) { ObjectClass oc = ( ObjectClass ) o1; AttributeType at = ( AttributeType ) o2; return oc.getOid().compareToIgnoreCase( at.getOid() ); } // Default return o1.toString().compareToIgnoreCase( o2.toString() ); } }; } /** * {@inheritDoc} */ public Object[] getElements( Object inputElement ) { return getChildren( inputElement ); } /** * {@inheritDoc} */ public void dispose() { // Nothing to do } /** * {@inheritDoc} */ public void inputChanged( Viewer viewer, Object oldInput, Object newInput ) { // Nothing to do } /** * {@inheritDoc} */ @SuppressWarnings("unchecked") public Object[] getChildren( Object parentElement ) { List<SchemaObject> children = new ArrayList<SchemaObject>(); int group = store.getInt( PluginConstants.PREFS_SEARCH_VIEW_GROUPING ); int sortBy = store.getInt( PluginConstants.PREFS_SEARCH_VIEW_SORTING_BY ); int sortOrder = store.getInt( PluginConstants.PREFS_SEARCH_VIEW_SORTING_ORDER ); if ( parentElement instanceof List ) { List<SchemaObject> searchResults = ( List<SchemaObject> ) parentElement; if ( group == PluginConstants.PREFS_SEARCH_VIEW_GROUPING_ATTRIBUTE_TYPES_FIRST ) { List<AttributeType> attributeTypes = new ArrayList<AttributeType>(); List<ObjectClass> objectClasses = new ArrayList<ObjectClass>(); for ( SchemaObject searchResult : searchResults ) { if ( searchResult instanceof AttributeType ) { attributeTypes.add( ( AttributeType ) searchResult ); } else if ( searchResult instanceof ObjectClass ) { objectClasses.add( ( ObjectClass ) searchResult ); } } // Sort by if ( sortBy == PluginConstants.PREFS_SEARCH_VIEW_SORTING_BY_FIRSTNAME ) { Collections.sort( attributeTypes, firstNameSorter ); Collections.sort( objectClasses, firstNameSorter ); } else if ( sortBy == PluginConstants.PREFS_SEARCH_VIEW_SORTING_BY_OID ) { Collections.sort( attributeTypes, oidSorter ); Collections.sort( objectClasses, oidSorter ); } // Sort Order if ( sortOrder == PluginConstants.PREFS_SEARCH_VIEW_SORTING_ORDER_DESCENDING ) { Collections.reverse( attributeTypes ); Collections.reverse( objectClasses ); } children.addAll( attributeTypes ); children.addAll( objectClasses ); } else if ( group == PluginConstants.PREFS_SEARCH_VIEW_GROUPING_OBJECT_CLASSES_FIRST ) { List<AttributeType> attributeTypes = new ArrayList<AttributeType>(); List<ObjectClass> objectClasses = new ArrayList<ObjectClass>(); for ( SchemaObject searchResult : searchResults ) { if ( searchResult instanceof AttributeType ) { attributeTypes.add( ( AttributeType ) searchResult ); } else if ( searchResult instanceof ObjectClass ) { objectClasses.add( ( ObjectClass ) searchResult ); } } // Sort by if ( sortBy == PluginConstants.PREFS_SEARCH_VIEW_SORTING_BY_FIRSTNAME ) { Collections.sort( attributeTypes, firstNameSorter ); Collections.sort( objectClasses, firstNameSorter ); } else if ( sortBy == PluginConstants.PREFS_SEARCH_VIEW_SORTING_BY_OID ) { Collections.sort( attributeTypes, oidSorter ); Collections.sort( objectClasses, oidSorter ); } // Sort Order if ( sortOrder == PluginConstants.PREFS_SEARCH_VIEW_SORTING_ORDER_DESCENDING ) { Collections.reverse( attributeTypes ); Collections.reverse( objectClasses ); } children.addAll( objectClasses ); children.addAll( attributeTypes ); } else if ( group == PluginConstants.PREFS_SEARCH_VIEW_GROUPING_MIXED ) { children.addAll( searchResults ); // Sort by if ( sortBy == PluginConstants.PREFS_SEARCH_VIEW_SORTING_BY_FIRSTNAME ) { Collections.sort( children, firstNameSorter ); } else if ( sortBy == PluginConstants.PREFS_SEARCH_VIEW_SORTING_BY_OID ) { Collections.sort( children, oidSorter ); } // Sort Order if ( sortOrder == PluginConstants.PREFS_SEARCH_VIEW_SORTING_ORDER_DESCENDING ) { Collections.reverse( children ); } } } return children.toArray(); } /** * {@inheritDoc} */ public Object getParent( Object element ) { if ( element instanceof TreeNode ) { return ( ( TreeNode ) element ).getParent(); } // Default return null; } /** * {@inheritDoc} */ public boolean hasChildren( Object element ) { if ( element instanceof TreeNode ) { return ( ( TreeNode ) element ).hasChildren(); } // Default return false; } }