| /* |
| * Copyright 2006 The Apache Software Foundation |
| * |
| * 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.apache.felix.examples.spellcheckbinder; |
| |
| |
| import java.util.ArrayList; |
| import java.util.StringTokenizer; |
| |
| import org.apache.felix.examples.dictionaryservice.DictionaryService; |
| import org.apache.felix.examples.spellcheckservice.SpellCheckService; |
| |
| |
| /** |
| * This class re-implements the spell check service of Example 5. This service |
| * implementation behaves exactly like the one in Example 5, specifically, it |
| * aggregates all available dictionary services, monitors their dynamic |
| * availability, and only offers the spell check service if there are dictionary |
| * services available. The service implementation is greatly simplified, though, |
| * by using the Service Binder. Notice that there is no OSGi references in the |
| * application code; intead, the metadata.xml file describes the service |
| * dependencies to the Service Binder, which automatically manages them and it |
| * also automatically registers the spell check services as appropriate. |
| * |
| * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a> |
| */ |
| public class SpellCheckServiceImpl implements SpellCheckService |
| { |
| // List of service objects. |
| private ArrayList m_svcObjList = new ArrayList(); |
| |
| |
| /** |
| * This method is used by the Service Binder to add new dictionaries to the |
| * spell check service. |
| * |
| * @param dictionary |
| * the dictionary to add to the spell check service. |
| */ |
| public void addDictionary( DictionaryService dictionary ) |
| { |
| // Lock list and add service object. |
| synchronized ( m_svcObjList ) |
| { |
| m_svcObjList.add( dictionary ); |
| } |
| } |
| |
| |
| /** |
| * This method is used by the Service Binder to remove dictionaries from the |
| * spell check service. |
| * |
| * @param dictionary |
| * the dictionary to remove from the spell check service. |
| */ |
| public void removeDictionary( DictionaryService dictionary ) |
| { |
| // Lock list and remove service object. |
| synchronized ( m_svcObjList ) |
| { |
| m_svcObjList.remove( dictionary ); |
| } |
| } |
| |
| |
| /** |
| * Checks a given passage for spelling errors. A passage is any number of |
| * words separated by a space and any of the following punctuation marks: |
| * comma (,), period (.), exclamation mark (!), question mark (?), |
| * semi-colon (;), and colon(:). |
| * |
| * @param passage |
| * the passage to spell check. |
| * @return An array of misspelled words or null if no words are misspelled. |
| */ |
| public String[] check( String passage ) |
| { |
| // No misspelled words for an empty string. |
| if ( ( passage == null ) || ( passage.length() == 0 ) ) |
| { |
| return null; |
| } |
| |
| ArrayList errorList = new ArrayList(); |
| |
| // Tokenize the passage using spaces and punctionation. |
| StringTokenizer st = new StringTokenizer( passage, " ,.!?;:" ); |
| |
| // Lock the service list. |
| synchronized ( m_svcObjList ) |
| { |
| // Loop through each word in the passage. |
| while ( st.hasMoreTokens() ) |
| { |
| String word = st.nextToken(); |
| boolean correct = false; |
| |
| // Check each available dictionary for the current word. |
| for ( int i = 0; ( !correct ) && ( i < m_svcObjList.size() ); i++ ) |
| { |
| DictionaryService dictionary = ( DictionaryService ) m_svcObjList.get( i ); |
| |
| if ( dictionary.checkWord( word ) ) |
| { |
| correct = true; |
| } |
| } |
| |
| // If the word is not correct, then add it |
| // to the incorrect word list. |
| if ( !correct ) |
| { |
| errorList.add( word ); |
| } |
| } |
| } |
| |
| // Return null if no words are incorrect. |
| if ( errorList.size() == 0 ) |
| { |
| return null; |
| } |
| |
| // Return the array of incorrect words. |
| return ( String[] ) errorList.toArray( new String[errorList.size()] ); |
| } |
| } |