Package com.rim.samples.device.unifiedsearchdemo

Source Code of com.rim.samples.device.unifiedsearchdemo.PublisherException

/*
* UnifiedSearchDemoPublisher.java
*
* Copyright � 1998-2011 Research In Motion Limited
*
* 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.
*
* Note: For the sake of simplicity, this sample application may not leverage
* resource bundles and resource strings.  However, it is STRONGLY recommended
* that application developers make use of the localization features available
* within the BlackBerry development platform to ensure a seamless application
* experience across a variety of languages and geographies.  For more information
* on localizing your application, please refer to the BlackBerry Java Development
* Environment Development Guide associated with this release.
*/

package com.rim.samples.device.unifiedsearchdemo;

import java.util.Vector;

import net.rim.device.api.system.Bitmap;
import net.rim.device.api.ui.UiApplication;
import net.rim.device.api.ui.component.Status;
import net.rim.device.api.ui.image.Image;
import net.rim.device.api.ui.image.ImageFactory;
import net.rim.device.api.unifiedsearch.SearchField;
import net.rim.device.api.unifiedsearch.SearchFieldCriteria;
import net.rim.device.api.unifiedsearch.SearchFieldCriteriaList;
import net.rim.device.api.unifiedsearch.content.AppContentListener;
import net.rim.device.api.unifiedsearch.content.AppContentManager;
import net.rim.device.api.unifiedsearch.entity.ExposureLevel;
import net.rim.device.api.unifiedsearch.registry.RegistrationToken;
import net.rim.device.api.unifiedsearch.searchables.SearchableContentTypeConstants;
import net.rim.device.api.unifiedsearch.searchables.adapters.EntityBasedSearchableProvider;

/**
* This class registers a Searchable with the Unified Search Framework and
* inserts data objects in the cache into the Unified Search Framework.
*/
public class UnifiedSearchDemoPublisher implements AppContentListener {
    public static final String SEARCH_FIELD_NAME = "Name";
    public static final String SEARCH_FIELD_DATA = "Data";

    private final EntityBasedSearchableProvider _searchableProvider;
    private final RegistrationToken _regToken;
    private final UiApplication _uiApplication;
    private UnifiedSearchDemoEntity[] _entities;

    /**
     * Creates a new UnifiedSearchDemoPublisher object
     *
     * @throws PublisherException
     *             if registration to the Unified Search Framework fails
     */
    public UnifiedSearchDemoPublisher() throws PublisherException {
        // Instantiate an EntityBasedSearchableProvider. This is the object
        // that allows data belonging to this application to become searchable.
        _searchableProvider = new EntityBasedSearchableProvider();
        _searchableProvider.setPrivacyLevel(ExposureLevel.LEVEL_PUBLIC);
        _searchableProvider
                .setType(SearchableContentTypeConstants.CONTENT_TYPE_BROWSER
                        | SearchableContentTypeConstants.CONTENT_TYPE_CONTACTS
                        | SearchableContentTypeConstants.CONTENT_TYPE_LOCATION);

        final SearchField[] searchFields =
                new SearchField[] { new SearchField(SEARCH_FIELD_NAME),
                        new SearchField(SEARCH_FIELD_DATA) };

        _searchableProvider.setSupportedSearchFields(searchFields);

        final Bitmap bitmap = Bitmap.getBitmapResource("default.png");

        if (bitmap != null) {
            final Image img = ImageFactory.createImage(bitmap);
            _searchableProvider.setIcon(img);
        }

        _searchableProvider.setName("Unified Search Demo");

        // Register EntityBasedSearchableProvider with the Unified Search
        // Framework
        _regToken = _searchableProvider.register();

        if (!_regToken.isValid()) {
            throw new PublisherException(
                    "Application has failed to register with the Unified Search Framework");
        }

        // Cache reference to the UiApplication for later use
        _uiApplication = UiApplication.getUiApplication();
    }

    /**
     * Inserts data objects into the Unified Search Framework
     *
     * @param dataVector
     *            A collection of data objects to insert into the Unified Search
     *            Framework
     */
    public void insertData(final Vector dataVector) {
        UnifiedSearchDemoEntity[] dataEntities;

        synchronized (dataVector) {
            // Build a UnifiedSearchDemoEntity array out of the given data
            // objects
            final int size = dataVector.size();
            dataEntities = new UnifiedSearchDemoEntity[size];

            for (int i = size - 1; i >= 0; --i) {
                final UnifiedSearchDemoDataObject object =
                        (UnifiedSearchDemoDataObject) dataVector.elementAt(i);
                dataEntities[i] =
                        new UnifiedSearchDemoEntity(object, _searchableProvider);
            }
        }

        setEntities(dataEntities);

        _searchableProvider.addSearchableData(dataEntities, this);
    }

    /**
     * Stores the UnifiedSearchDemoEntity array that was added to the Unified
     * Search Framework.
     *
     * @param entities
     *            The UnifiedSearchDemoEntity array that was added to the
     *            Unified Search Framework
     */
    private void setEntities(final UnifiedSearchDemoEntity[] entities) {
        _entities = entities;
    }

    /**
     * Retrieves the stored UnifiedSearchDemoEntity[] object that was added to
     * the Unified Search Framework.
     *
     * @return The PointOfInterestEntitiy[] that was added to the Unified Search
     *         Framework
     */
    private UnifiedSearchDemoEntity[] getEntities() {
        return _entities;
    }

    /**
     * Looks through all the UnifiedSearchDemoEntity data and look for data that
     * has an e-mail in it. Add the keyword "email" to that entity's
     * SearchCriteria.
     *
     * @param entities
     *            UnifiedSearchDemoEntity array to be added to the Unified
     *            Search Framework
     */
    private void
            addAdditionalCriteria(final UnifiedSearchDemoEntity[] entities) {
        final int size = entities.length;

        // Iterate through the UnifiedSearchDemoEntity array and look
        // for instances that contain an email address.
        for (int i = size - 1; i >= 0; --i) {
            final String data = entities[i].getSummary();

            // Check if the data is a well formed email address
            if (validateEmail(data)) {
                final EntityBasedSearchableProvider searchable =
                        (EntityBasedSearchableProvider) entities[i]
                                .getSearchable();
                final SearchField[] fields =
                        searchable.getSupportedSearchFields();

                // Go through all the SeachFields for the particular
                // UnifiedSearchDemoEntity
                for (int j = 0; j < fields.length; j++) {
                    // Create the criteria that will be added
                    final SearchFieldCriteria criteria =
                            new SearchFieldCriteria(fields[j],
                                    new String[] { "email" });
                    final SearchFieldCriteriaList criteriaList =
                            new SearchFieldCriteriaList();
                    criteriaList.addCriteria(criteria);

                    // Add the additional search criteria to the Unified Search
                    // Framework
                    try {
                        AppContentManager.getInstance().addSearchCriteria(
                                entities[i], criteriaList, _regToken);
                    } catch (final Exception e) {
                    }
                }
            }
        }
    }

    /**
     * Validates the well formedness of an email address string. This method
     * does not make sure that the email is active or a real email. It only
     * looks to see if it is reasonably well formed.
     *
     * @param email
     *            The possible email address that is going to get validated
     * @return true if the email is well formed, false if the email is not well
     *         formed
     */
    private boolean validateEmail(final String email) {
        final int posAt = email.indexOf("@");
        final int posDot = email.lastIndexOf('.');

        // Either "@" or "." is not in the string
        if (posAt == -1 || posDot == -1) {
            // Not well formed
            return false;
        }

        // "@" is the first character || "@" is the last character || "." is the
        // last char
        if (email.startsWith("@") || email.endsWith("@") || email.endsWith(".")) {
            // Not well formed
            return false;
        }

        // "." before "@" || The first "@" is not the last "@"
        // --> more than one "@" || The char directly after the
        // "@" is a "." ie dave@.rim.com
        if (posDot < posAt || posAt != email.lastIndexOf('@')
                || email.charAt(posAt + 1) == '.') {
            // Not well formed
            return false;
        }

        // If the length of the email address is less than 6 it is too small.
        // Smallest email example :: "a@b.ca" = 6 char length.
        if (email.length() < 6) {
            // Not well formed
            return false;
        }

        // The email address is reasonably well formed
        return true;
    }

    // AppContentListener implementation
    // -----------------------------------------

    /**
     * @see AppContentListener#onInsertComplete(int)
     */
    public void onInsertComplete(final int insertCount) {
        _uiApplication.invokeLater(new Runnable() {
            public void run() {
                // Inform user of successful insert
                final StringBuffer buffer = new StringBuffer("Inserted ");
                buffer.append(insertCount);
                buffer.append(" data objects. Try the search word \"email\"!");
                Status.show(buffer.toString(), 2000);
            }
        });

        // Add additional criteria
        final UnifiedSearchDemoEntity[] entities = getEntities();
        addAdditionalCriteria(entities);
    }

    /**
     * @see AppContentListener#onUpdateComplete(int)
     */
    public void onUpdateComplete(final int updCount) {
        // Not implemented
    }

    /**
     * @see AppContentListener#onDeleteComplete(int)
     */
    public void onDeleteComplete(final int delCount) {
        // Not implemented
    }
}

/**
* A subclass of Exception to indicate a Unified Search Framework registration
* error.
*/
class PublisherException extends Exception {
    PublisherException(final String message) {
        super(message);
    }
}
TOP

Related Classes of com.rim.samples.device.unifiedsearchdemo.PublisherException

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.