/* * Copyright 2012-2014 the original author or authors. * * Licensed 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.lightadmin.core.config.domain.field; import com.google.common.base.Function; import com.google.common.base.Predicate; import com.google.common.base.Predicates; import com.google.common.collect.Collections2; import org.apache.commons.lang3.StringUtils; import org.lightadmin.core.config.domain.filter.FilterMetadata; import java.io.Serializable; import java.util.Comparator; import java.util.Set; import static com.google.common.collect.Sets.newLinkedHashSet; import static org.springframework.util.ClassUtils.isAssignableValue; public class FieldMetadataUtils { public static Set<FieldMetadata> extractFields(Iterable<FilterMetadata> filterMetadatas) { return newLinkedHashSet(Collections2.transform(newLinkedHashSet(filterMetadatas), new FieldMetadataExtractor())); } public static Predicate<FieldMetadata> persistentFieldMetadataPredicate() { return new FieldMetadataTypePredicate(PersistentFieldMetadata.class); } public static Predicate<FieldMetadata> transientFieldMetadataPredicate() { return new FieldMetadataTypePredicate(TransientFieldMetadata.class); } public static Predicate<FieldMetadata> customFieldMetadataPredicate() { return new FieldMetadataTypePredicate(CustomFieldMetadata.class); } public static Set<FieldMetadata> selectFields(Set<FieldMetadata> fieldMetadatas, Predicate<FieldMetadata>... predicates) { return newLinkedHashSet(Collections2.filter(fieldMetadatas, Predicates.and(predicates))); } public static Set<FieldMetadata> persistentFields(Set<FieldMetadata> fieldMetadatas) { return newLinkedHashSet(Collections2.filter(fieldMetadatas, persistentFieldMetadataPredicate())); } public static Set<FieldMetadata> transientFields(Set<FieldMetadata> fieldMetadatas) { return newLinkedHashSet(Collections2.filter(fieldMetadatas, transientFieldMetadataPredicate())); } public static Set<FieldMetadata> customFields(Set<FieldMetadata> fieldMetadatas) { return newLinkedHashSet(Collections2.filter(fieldMetadatas, customFieldMetadataPredicate())); } public static FieldMetadata primaryKeyPersistentField(Set<FieldMetadata> fields) { for (FieldMetadata field : persistentFields(fields)) { PersistentFieldMetadata persistentFieldMetadata = (PersistentFieldMetadata) field; if (persistentFieldMetadata.isPrimaryKey()) { return persistentFieldMetadata; } } return null; } public static PersistentFieldMetadata getPersistentField(final Set<FieldMetadata> fields, String fieldName) { for (FieldMetadata field : persistentFields(fields)) { PersistentFieldMetadata persistentFieldMetadata = (PersistentFieldMetadata) field; if (StringUtils.equals(persistentFieldMetadata.getField(), fieldName)) { return persistentFieldMetadata; } } return null; } public static class FieldMetadataComparator implements Comparator<FieldMetadata>, Serializable { @Override public int compare(final FieldMetadata fieldMetadata, final FieldMetadata fieldMetadata2) { if (isPrimaryKey(fieldMetadata)) { return -1; } if (isPrimaryKey(fieldMetadata2)) { return 1; } if (fieldMetadata.getSortOrder() < fieldMetadata2.getSortOrder()) { return -1; } if (fieldMetadata.getSortOrder() > fieldMetadata2.getSortOrder()) { return 1; } return (fieldMetadata.equals(fieldMetadata2) ? 0 : 1); } private boolean isPrimaryKey(FieldMetadata fieldMetadata) { return isAssignableValue(PersistentFieldMetadata.class, fieldMetadata) && ((PersistentFieldMetadata) fieldMetadata).isPrimaryKey(); } } public static class NameableComparator implements Comparator<Nameable> { @Override public int compare(final Nameable nameable, final Nameable nameable2) { return nameable.getName().compareTo(nameable2.getName()); } } private static class FieldMetadataExtractor implements Function<FilterMetadata, FieldMetadata> { @Override public FieldMetadata apply(final FilterMetadata filterMetadata) { return filterMetadata.getFieldMetadata(); } } private static class FieldMetadataTypePredicate implements Predicate<FieldMetadata> { private final Class<? extends FieldMetadata> fieldMetadataClass; private FieldMetadataTypePredicate(final Class<? extends FieldMetadata> fieldMetadataClass) { this.fieldMetadataClass = fieldMetadataClass; } @Override public boolean apply(final FieldMetadata fieldMetadata) { return isAssignableValue(fieldMetadataClass, fieldMetadata); } } }