/* ********************************************************************** ** ** Copyright notice ** ** ** ** (c) 2005-2009 RSSOwl Development Team ** ** http://www.rssowl.org/ ** ** ** ** All rights reserved ** ** ** ** This program and the accompanying materials are made available under ** ** the terms of the Eclipse Public License v1.0 which accompanies this ** ** distribution, and is available at: ** ** http://www.rssowl.org/legal/epl-v10.html ** ** ** ** A copy is found in the file epl-v10.html and important notices to the ** ** license from the team is found in the textfile LICENSE.txt distributed ** ** in this package. ** ** ** ** This copyright notice MUST APPEAR in all copies of the file! ** ** ** ** Contributors: ** ** RSSOwl Development Team - initial API and implementation ** ** ** ** ********************************************************************** */ package org.rssowl.core.internal.persist; import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.Platform; import org.rssowl.core.persist.IAttachment; import org.rssowl.core.persist.IBookMark; import org.rssowl.core.persist.ICategory; import org.rssowl.core.persist.IEntity; import org.rssowl.core.persist.IFeed; import org.rssowl.core.persist.IFolder; import org.rssowl.core.persist.ILabel; import org.rssowl.core.persist.IMark; import org.rssowl.core.persist.INews; import org.rssowl.core.persist.IPerson; import org.rssowl.core.persist.ISearchField; import org.rssowl.core.persist.ISearchMark; import org.rssowl.core.persist.ISearchValueType; import org.rssowl.core.util.CoreUtils; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; /** * <p> * Instances of <code>ISearchField</code> describe the target field for a search * condition. The field is described by its identifier in the system and a * human-readable name, used in the UI. * </p> * <p> * A call to <code>getSearchValueType()</code> will give Information of the * data-type the field is using. This information can be used for validating the * search-value and to perform the search in the persistence layer. * </p> * * @author bpasero */ public class SearchField implements ISearchField { private int fField; private String fEntityName; /** * Instantiates a new SearchField that is describing the field a target type * needs to check for a match. * * @param field The ID of the field from the given Type, which is described by * one of the constants in the type's Interface. * @param entityName entityName The fully qualified Name of the * <code>IEntity</code> this <code>ISearchField</code> is referring to. */ public SearchField(int field, String entityName) { fField = field; Assert.isNotNull(entityName, "The type SearchField requires a entityName that is not NULL"); //$NON-NLS-1$ fEntityName = entityName; } /** * Default constructor for deserialization */ protected SearchField() { // As per javadoc } /* * @see org.rssowl.core.model.search.ISearchField#getField() */ public synchronized int getId() { return fField; } /* * @see org.rssowl.core.model.search.ISearchField#getEntityName() */ public synchronized String getEntityName() { return fEntityName; } /* * @see org.rssowl.core.model.search.ISearchField#getName() */ public synchronized String getName() { /* Field from the Type IAttachment */ if (fEntityName.equals(IAttachment.class.getName())) { switch (fField) { case (IEntity.ALL_FIELDS): return Messages.SearchField_ENTIRE_ATTACHMENT; case (IAttachment.LINK): return Messages.SearchField_LINK; case (IAttachment.LENGTH): return Messages.SearchField_SIZE; case (IAttachment.TYPE): return Messages.SearchField_TYPE; } } /* Field from Type IFolder */ if (fEntityName.equals(IFolder.class.getName())) { switch (fField) { case (IEntity.ALL_FIELDS): return Messages.SearchField_ENTIRE_FOLDER; case (IFolder.NAME): return Messages.SearchField_NAME; case (IFolder.BLOGROLL_LINK): return Messages.SearchField_BLOGROLL_LINK; case (IFolder.FOLDERS): return Messages.SearchField_SUB_FOLDERS; case (IFolder.MARKS): return Messages.SearchField_BOOKMARKS; } } /* Field from Type ILabel */ if (fEntityName.equals(ILabel.class.getName())) { switch (fField) { case (IEntity.ALL_FIELDS): return Messages.SearchField_ENTIRE_LABEL; case (ILabel.NAME): return Messages.SearchField_NAME; case (ILabel.COLOR): return Messages.SearchField_COLOR; } } /* Field from Type ICategory */ if (fEntityName.equals(ICategory.class.getName())) { switch (fField) { case (IEntity.ALL_FIELDS): return Messages.SearchField_ENTIRE_CATEGORY; case (ICategory.NAME): return Messages.SearchField_NAME; case (ICategory.DOMAIN): return Messages.SearchField_DOMAIN; } } /* Field from Type IBookMark */ if (fEntityName.equals(IBookMark.class.getName())) { switch (fField) { case (IEntity.ALL_FIELDS): return Messages.SearchField_ENTIRE_BOOKMARK; case (IMark.CREATION_DATE): return Messages.SearchField_CREATION_DATE; case (IMark.NAME): return Messages.SearchField_NAME; case (IMark.LAST_VISIT_DATE): return Messages.SearchField_LAST_VISIT; case (IMark.POPULARITY): return Messages.SearchField_NUMBER_OF_VISITS; case (IBookMark.IS_ERROR_LOADING): return Messages.SearchField_ERROR_LOADING; } } /* Field from Type ISearchMark */ if (fEntityName.equals(ISearchMark.class.getName())) { switch (fField) { case (IEntity.ALL_FIELDS): return Messages.SearchField_ENTIRE_SEARCHMARK; case (IMark.CREATION_DATE): return Messages.SearchField_CREATION_DATE; case (IMark.NAME): return Messages.SearchField_NAME; case (IMark.LAST_VISIT_DATE): return Messages.SearchField_LAST_VISIT; case (IMark.POPULARITY): return Messages.SearchField_NUMBER_OF_VISITS; } } /* Field from Type IPerson */ if (fEntityName.equals(IPerson.class.getName())) { switch (fField) { case (IEntity.ALL_FIELDS): return Messages.SearchField_ENTIRE_PERSON; case (IPerson.NAME): return Messages.SearchField_NAME; case (IPerson.EMAIL): return Messages.SearchField_EMAIL; case (IPerson.URI): return Messages.SearchField_URI; } } /* Field from Type INews */ if (fEntityName.equals(INews.class.getName())) { switch (fField) { case (IEntity.ALL_FIELDS): return Messages.SearchField_ENTIRE_NEWS; case (INews.TITLE): return Messages.SearchField_TITLE; case (INews.LINK): return Messages.SearchField_LINK; case (INews.DESCRIPTION): return Messages.SearchField_DESCRIPTION; case (INews.PUBLISH_DATE): return Messages.SearchField_PUBLISH_DATE; case (INews.MODIFIED_DATE): return Messages.SearchField_MODIFIED_DATE; case (INews.RECEIVE_DATE): return Messages.SearchField_RECEIVED_DATE; case (INews.AUTHOR): return Messages.SearchField_AUTHOR; case (INews.COMMENTS): return Messages.SearchField_COMMENTS; case (INews.GUID): return Messages.SearchField_GUID; case (INews.SOURCE): return Messages.SearchField_SOURCE; case (INews.HAS_ATTACHMENTS): return Messages.SearchField_HAS_ATTACHMENT; case (INews.ATTACHMENTS_CONTENT): return Messages.SearchField_ATTACHMENT; case (INews.CATEGORIES): return Messages.SearchField_CATEGORY; case (INews.IS_FLAGGED): return Messages.SearchField_IS_STICKY; case (INews.STATE): return Messages.SearchField_STATE_OF_NEWS; case (INews.LABEL): return Messages.SearchField_LABEL; case (INews.RATING): return Messages.SearchField_RATING; case (INews.FEED): return Messages.SearchField_FEED; case (INews.AGE_IN_DAYS): return Messages.SearchField_AGE; case (INews.AGE_IN_MINUTES): return Messages.SearchField_AGE; case (INews.LOCATION): return Messages.SearchField_LOCATION; } } /* Field from Type IFeed */ if (fEntityName.equals(IFeed.class.getName())) { switch (fField) { case (IEntity.ALL_FIELDS): return Messages.SearchField_ENTIRE_NEWS; case (IFeed.LINK): return Messages.SearchField_LINK; case (IFeed.TITLE): return Messages.SearchField_TITLE; case (IFeed.PUBLISH_DATE): return Messages.SearchField_PUBLISH_DATE; case (IFeed.DESCRIPTION): return Messages.SearchField_DESCRIPTION; case (IFeed.HOMEPAGE): return Messages.SearchField_HOMEPAGE; case (IFeed.LANGUAGE): return Messages.SearchField_LANGUAGE; case (IFeed.COPYRIGHT): return Messages.SearchField_COPYRIGHT; case (IFeed.DOCS): return Messages.SearchField_DOCS; case (IFeed.GENERATOR): return Messages.SearchField_GENERATOR; case (IFeed.LAST_BUILD_DATE): return Messages.SearchField_LAST_BUILT_DATE; case (IFeed.WEBMASTER): return Messages.SearchField_WEBMASTER; case (IFeed.LAST_MODIFIED_DATE): return Messages.SearchField_LAST_MODIFIED_DATE; case (IFeed.TTL): return Messages.SearchField_TIME_TO_LIVE; case (IFeed.FORMAT): return Messages.SearchField_FORMAT; case (IFeed.AUTHOR): return Messages.SearchField_AUTHOR; case (IFeed.NEWS): return Messages.SearchField_NUMBER_OF_NEWS; case (IFeed.CATEGORIES): return Messages.SearchField_CATEGORY; case (IFeed.IMAGE): return Messages.SearchField_IMAGE; } } /* Default */ return fEntityName + "#" + fField; //$NON-NLS-1$ } /* * @see org.rssowl.core.model.search.ISearchField#getAllowedSearchTerm() */ public synchronized ISearchValueType getSearchValueType() { /* Field from the Type IAttachment */ if (fEntityName.equals(IAttachment.class.getName())) { switch (fField) { case (IAttachment.LENGTH): return SearchValueType.INTEGER; case (IAttachment.LINK): return SearchValueType.LINK; } } /* Field from Type IFolder */ else if (fEntityName.equals(IFolder.class.getName())) { switch (fField) { case (IFolder.FOLDERS): return SearchValueType.INTEGER; case (IFolder.MARKS): return SearchValueType.INTEGER; } } /* Field from Type IBookMark */ else if (fEntityName.equals(IBookMark.class.getName())) { switch (fField) { case (IMark.CREATION_DATE): return SearchValueType.DATETIME; case (IMark.LAST_VISIT_DATE): return SearchValueType.DATETIME; case (IMark.POPULARITY): return SearchValueType.INTEGER; case (IBookMark.IS_ERROR_LOADING): return SearchValueType.BOOLEAN; } } /* Field from Type ISearchMark */ else if (fEntityName.equals(ISearchMark.class.getName())) { switch (fField) { case (IMark.CREATION_DATE): return SearchValueType.DATETIME; case (IMark.LAST_VISIT_DATE): return SearchValueType.DATETIME; case (IMark.POPULARITY): return SearchValueType.INTEGER; } } /* Field from Type IPerson */ else if (fEntityName.equals(IPerson.class.getName())) return SearchValueType.STRING; /* Field from Type ILabel */ else if (fEntityName.equals(ILabel.class.getName())) return SearchValueType.STRING; /* Field from Type ICategory */ else if (fEntityName.equals(ICategory.class.getName())) return SearchValueType.STRING; /* Field from Type INews */ else if (fEntityName.equals(INews.class.getName())) { switch (fField) { case (INews.PUBLISH_DATE): return SearchValueType.DATETIME; case (INews.MODIFIED_DATE): return SearchValueType.DATETIME; case (INews.RECEIVE_DATE): return SearchValueType.DATETIME; case (INews.IS_FLAGGED): return SearchValueType.BOOLEAN; case (INews.STATE): return new SearchValueType(loadStateValues()); case (INews.LABEL): return new SearchValueType(loadLabelValues()); case (INews.RATING): return SearchValueType.INTEGER; case (INews.LINK): return SearchValueType.LINK; case (INews.FEED): return SearchValueType.LINK; case (INews.AGE_IN_DAYS): return SearchValueType.INTEGER; case (INews.AGE_IN_MINUTES): return SearchValueType.INTEGER; case (INews.SOURCE): return SearchValueType.LINK; case (INews.HAS_ATTACHMENTS): return SearchValueType.BOOLEAN; } } /* Field from Type IFeed */ else if (fEntityName.equals(IFeed.class.getName())) { switch (fField) { case (IFeed.LINK): return SearchValueType.LINK; case (IFeed.PUBLISH_DATE): return SearchValueType.DATETIME; case (IFeed.LANGUAGE): return new SearchValueType(loadLanguageValues()); case (IFeed.LAST_BUILD_DATE): return SearchValueType.DATETIME; case (IFeed.LAST_MODIFIED_DATE): return SearchValueType.DATETIME; case (IFeed.TTL): return SearchValueType.INTEGER; case (IFeed.NEWS): return SearchValueType.INTEGER; } } return SearchValueType.STRING; } /* Return human-readable list of News-States */ private List<String> loadStateValues() { return new ArrayList<String>(Arrays.asList(new String[] { Messages.SearchField_NEW, Messages.SearchField_READ, Messages.SearchField_UNREAD, Messages.SearchField_UPDATED, Messages.SearchField_DELETED })); } private List<String> loadLanguageValues() { return new ArrayList<String>(); } /* Return the Label Values */ private List<String> loadLabelValues() { Collection<ILabel> labels = CoreUtils.loadSortedLabels(); List<String> values = new ArrayList<String>(labels.size()); for (ILabel label : labels) { values.add(label.getName()); } return values; } /** * Returns an object which is an instance of the given class associated with * this object. Returns <code>null</code> if no such object can be found. * <p> * This implementation of the method declared by <code>IAdaptable</code> * passes the request along to the platform's adapter manager; roughly * <code>Platform.getAdapterManager().getAdapter(this, adapter)</code>. * Subclasses may override this method (however, if they do so, they should * invoke the method on their superclass to ensure that the Platform's adapter * manager is consulted). * </p> * * @param adapter the class to adapt to * @return the adapted object or <code>null</code> * @see IAdaptable#getAdapter(Class) * @see Platform#getAdapterManager() */ @SuppressWarnings("unchecked") public Object getAdapter(Class adapter) { return Platform.getAdapterManager().getAdapter(this, adapter); } /* * @see java.lang.Object#equals(java.lang.Object) */ @Override public synchronized boolean equals(Object obj) { if (this == obj) return true; if ((obj == null) || (obj.getClass() != getClass())) return false; synchronized (obj) { SearchField f = (SearchField) obj; return fField == f.fField && fEntityName.equals(f.fEntityName); } } /* * @see java.lang.Object#hashCode() */ @Override public synchronized int hashCode() { int typeHashCode = fEntityName == null ? 0 : fEntityName.hashCode(); return (((fField + 2) * typeHashCode + 17)) * 37; } /* * @see java.lang.Object#toString() */ @Override public synchronized String toString() { return fEntityName + ": " + fField; //$NON-NLS-1$ } /** * Returns a String describing the state of this Entity. * * @return A String describing the state of this Entity. */ public synchronized String toLongString() { return super.toString() + "(Field = " + fField + ", Class = " + fEntityName + ", Name = " + getName() + ", Search-Value-Type = " + getSearchValueType() + ")"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ } }