/* * Copyright 2015 JBoss, by Red Hat, Inc * * 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.uberfire.ext.metadata.backend.lucene.fields; import java.util.Collection; import java.util.Date; import org.apache.lucene.document.DoubleField; import org.apache.lucene.document.Field; import org.apache.lucene.document.FloatField; import org.apache.lucene.document.IntField; import org.apache.lucene.document.LongField; import org.apache.lucene.document.StoredField; import org.apache.lucene.document.StringField; import org.apache.lucene.document.TextField; import org.apache.lucene.index.IndexableField; import org.uberfire.ext.metadata.model.KProperty; import org.uberfire.java.nio.base.version.VersionHistory; import org.uberfire.java.nio.file.attribute.FileTime; import static org.uberfire.ext.metadata.backend.lucene.util.Serializer.toByteArray; public class SimpleFieldFactory implements FieldFactory { @Override public IndexableField[] build(final KProperty<?> property) { if (Enum.class.isAssignableFrom(property.getValue().getClass())) { if (property.isSearchable()) { return new IndexableField[]{new TextField(property.getName(), property.getValue().toString().toLowerCase(), Field.Store.YES)}; } return new IndexableField[]{new StringField(property.getName(), property.getValue().toString().toLowerCase(), Field.Store.YES)}; } if (property.getValue().getClass() == String.class) { if (property.isSearchable()) { return new IndexableField[]{new TextField(property.getName(), property.getValue().toString(), Field.Store.YES)}; } return new IndexableField[]{new StringField(property.getName(), property.getValue().toString(), Field.Store.YES)}; } if (property.getValue().getClass() == Boolean.class) { if (property.isSearchable()) { return new IndexableField[]{new TextField(property.getName(), ((Boolean) property.getValue()) ? "0" : "1", Field.Store.YES)}; } return new IndexableField[]{new StringField(property.getName(), ((Boolean) property.getValue()) ? "0" : "1", Field.Store.YES)}; } if (property.getValue().getClass() == Integer.class) { if (property.isSearchable()) { return new IndexableField[]{new IntField(property.getName(), (Integer) property.getValue(), Field.Store.YES)}; } return new IndexableField[]{new StoredField(property.getName(), (Integer) property.getValue())}; } if (property.getValue().getClass() == Long.class) { if (property.isSearchable()) { return new IndexableField[]{new LongField(property.getName(), (Long) property.getValue(), Field.Store.YES)}; } return new IndexableField[]{new StoredField(property.getName(), (Long) property.getValue())}; } if (property.getValue().getClass() == Double.class) { if (property.isSearchable()) { return new IndexableField[]{new DoubleField(property.getName(), (Double) property.getValue(), Field.Store.YES)}; } return new IndexableField[]{new StoredField(property.getName(), (Double) property.getValue())}; } if (property.getValue().getClass() == Float.class) { if (property.isSearchable()) { return new IndexableField[]{new FloatField(property.getName(), (Float) property.getValue(), Field.Store.YES)}; } return new IndexableField[]{new StoredField(property.getName(), (Float) property.getValue())}; } if (FileTime.class.isAssignableFrom(property.getValue().getClass())) { if (property.isSearchable()) { return new IndexableField[]{new LongField(property.getName(), ((FileTime) property.getValue()).toMillis(), Field.Store.YES)}; } return new IndexableField[]{new StoredField(property.getName(), ((FileTime) property.getValue()).toMillis())}; } if (Date.class.isAssignableFrom(property.getValue().getClass())) { if (property.isSearchable()) { return new IndexableField[]{new LongField(property.getName(), ((Date) property.getValue()).getTime(), Field.Store.YES)}; } return new IndexableField[]{new StoredField(property.getName(), ((Date) property.getValue()).getTime())}; } if (VersionHistory.class.isAssignableFrom(property.getValue().getClass())) { final VersionHistory versionHistory = (VersionHistory) property.getValue(); return build(versionHistory); } if (Collection.class.isAssignableFrom(property.getValue().getClass())) { final StringBuilder sb = new StringBuilder(); for (final java.lang.Object ovalue : (Collection) property.getValue()) { sb.append(ovalue).append(' '); } if (property.isSearchable()) { return new IndexableField[]{new TextField(property.getName(), sb.toString(), Field.Store.YES)}; } return new IndexableField[]{new StringField(property.getName(), sb.toString(), Field.Store.YES)}; } try { return new IndexableField[]{new StoredField(property.getName(), toByteArray(property.getValue()))}; } catch (final Exception ex) { return new IndexableField[]{new StoredField(property.getName(), property.getValue().toString())}; } } private IndexableField[] build(final VersionHistory versionHistory) { if (versionHistory.records().size() == 0) { return new IndexableField[]{}; } final int lastIndex = versionHistory.records().size() - 1; final IndexableField checkinComment = build(new KProperty<String>() { @Override public String getName() { return "checkinComment"; } @Override public String getValue() { return versionHistory.records().get(lastIndex).comment(); } @Override public boolean isSearchable() { return true; } })[0]; final IndexableField lastModifiedBy = build(new KProperty<String>() { @Override public String getName() { return "lastModifiedBy"; } @Override public String getValue() { return versionHistory.records().get(lastIndex).author(); } @Override public boolean isSearchable() { return true; } })[0]; final IndexableField createdBy = build(new KProperty<String>() { @Override public String getName() { return "createdBy"; } @Override public String getValue() { return versionHistory.records().get(0).author(); } @Override public boolean isSearchable() { return true; } })[0]; final IndexableField createdDate = build(new KProperty<Date>() { @Override public String getName() { return "createdDate"; } @Override public Date getValue() { return versionHistory.records().get(0).date(); } @Override public boolean isSearchable() { return true; } })[0]; final IndexableField lastModifiedDate = build(new KProperty<Date>() { @Override public String getName() { return "lastModifiedDate"; } @Override public Date getValue() { return versionHistory.records().get(lastIndex).date(); } @Override public boolean isSearchable() { return true; } })[0]; return new IndexableField[]{checkinComment, lastModifiedBy, createdBy, createdDate, lastModifiedDate}; } }