/* | |
* Copyright (C) 2012 The Android Open Source Project | |
* | |
* 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 com.motorolamobility.preflighting.checkers.orphanedstrings; | |
import java.util.Collections; | |
import java.util.List; | |
import java.util.Set; | |
import org.eclipse.core.runtime.IStatus; | |
import com.motorolamobility.preflighting.checkers.CheckerPlugin; | |
import com.motorolamobility.preflighting.checkers.i18n.CheckerNLS; | |
import com.motorolamobility.preflighting.core.PreflightingCorePlugin; | |
import com.motorolamobility.preflighting.core.applicationdata.ApplicationData; | |
import com.motorolamobility.preflighting.core.applicationdata.Element; | |
import com.motorolamobility.preflighting.core.applicationdata.Element.Type; | |
import com.motorolamobility.preflighting.core.applicationdata.ElementUtils; | |
import com.motorolamobility.preflighting.core.applicationdata.ResourcesFolderElement; | |
import com.motorolamobility.preflighting.core.checker.condition.CanExecuteConditionStatus; | |
import com.motorolamobility.preflighting.core.checker.condition.Condition; | |
import com.motorolamobility.preflighting.core.checker.condition.ICondition; | |
import com.motorolamobility.preflighting.core.devicespecification.DeviceSpecification; | |
import com.motorolamobility.preflighting.core.exception.PreflightingCheckerException; | |
import com.motorolamobility.preflighting.core.internal.cond.utils.ConditionUtils; | |
import com.motorolamobility.preflighting.core.logging.PreflightingLogger; | |
import com.motorolamobility.preflighting.core.validation.ValidationManagerConfiguration; | |
import com.motorolamobility.preflighting.core.validation.ValidationResult; | |
import com.motorolamobility.preflighting.core.validation.ValidationResultData; | |
/** | |
* Condition that looks for declared strings that are not used in the code (Java or resources XML) | |
*/ | |
public class OrphanedStringsCondition extends Condition implements ICondition | |
{ | |
private ResourcesFolderElement resFolder; | |
/** | |
* @see com.motorolamobility.preflighting.core.checker.condition.Condition#execute(com.motorolamobility.preflighting.core.applicationdata.ApplicationData, java.util.List, com.motorolamobility.preflighting.core.devicespecification.internal.PlatformRules, com.motorolamobility.preflighting.core.validation.ValidationManagerConfiguration, com.motorolamobility.preflighting.core.validation.ValidationResult) | |
*/ | |
@Override | |
public void execute(ApplicationData data, List<DeviceSpecification> deviceSpecs, | |
ValidationManagerConfiguration valManagerConfig, ValidationResult results) | |
throws PreflightingCheckerException | |
{ | |
Set<String> usedStringsSet = data.getUsedStringsInApplication(); | |
PreflightingLogger.debug("Used strings: " + usedStringsSet); | |
//notUsedStringsSet - initially we have the entire set of declared strings | |
Set<String> notUsedStringsSet = data.getDeclaredStringsInResourceFiles(); | |
PreflightingLogger.debug("Declared strings: " + notUsedStringsSet); | |
//removing all used strings (notUsedStringSet = declaredStringsSet - usedStringsSet) | |
notUsedStringsSet.removeAll(usedStringsSet); | |
PreflightingLogger.debug("Not used strings: " + notUsedStringsSet); | |
if ((notUsedStringsSet != null) && !notUsedStringsSet.isEmpty()) | |
{ | |
//we found strings not used | |
addResults(results, notUsedStringsSet, valManagerConfig); | |
} | |
} | |
private void addResults(ValidationResult results, Set<String> notUsedStringsSet, | |
ValidationManagerConfiguration valManagerConfig) | |
{ | |
for (String notUsedString : notUsedStringsSet) | |
{ | |
//adding string result (reached max number of chars) | |
ValidationResultData result = new ValidationResultData(); | |
// Create a result and return it | |
result.setSeverity(getSeverityLevel()); | |
result.setConditionID(getId()); | |
//Associate the result to the resFolder | |
result.addFileToIssueLines(resFolder.getFile(), Collections.<Integer> emptyList()); | |
// Construct description | |
String resultDescription = | |
CheckerNLS.bind(CheckerNLS.OrphanedStringsCondition_Result_Description, | |
notUsedString); | |
result.setIssueDescription(resultDescription.toString()); | |
// Set quickfix | |
result.setQuickFixSuggestion(CheckerNLS.OrphanedStringsCondition_Result_QuickFix); | |
result.setInfoURL(ConditionUtils.getDescriptionLink(getChecker().getId(), getId(), | |
valManagerConfig)); | |
// Add result to the result list | |
results.addValidationResult(result); | |
} | |
} | |
/** | |
* @see com.motorolamobility.preflighting.core.checker.condition.Condition#canExecute(com.motorolamobility.preflighting.core.applicationdata.ApplicationData, java.util.List) | |
*/ | |
@Override | |
public CanExecuteConditionStatus canExecute(ApplicationData data, | |
List<DeviceSpecification> deviceSpecs) throws PreflightingCheckerException | |
{ | |
CanExecuteConditionStatus status = | |
new CanExecuteConditionStatus(IStatus.OK, PreflightingCorePlugin.PLUGIN_ID, ""); | |
//Verify if model contains res folder | |
List<Element> folderResElements = | |
ElementUtils.getElementByType(data.getRootElement(), Type.FOLDER_RES); | |
resFolder = | |
folderResElements.size() > 0 ? (ResourcesFolderElement) folderResElements.get(0) | |
: null; | |
if (resFolder == null) | |
{ | |
status = | |
new CanExecuteConditionStatus(IStatus.ERROR, CheckerPlugin.PLUGIN_ID, | |
CheckerNLS.Missing_res_folder); | |
} | |
if (status.isOK()) | |
{ | |
// Check if at least one "values" folder exist with a appropriate "strings.xml" file | |
int numberOfFoundValuesResources = 0; | |
for (Element e : resFolder.getChildren()) | |
{ | |
if (e.getType() == Element.Type.FOLDER_VALUES) | |
{ | |
for (Element children : e.getChildren()) | |
{ | |
if (children.getType() == Element.Type.FILE_STRINGS) | |
{ | |
numberOfFoundValuesResources++; | |
} | |
} | |
} | |
} | |
if (numberOfFoundValuesResources == 0) | |
{ | |
status = | |
new CanExecuteConditionStatus(IStatus.ERROR, CheckerPlugin.PLUGIN_ID, | |
CheckerNLS.LocalizationStringsChecker_Missing_stringsXml_File); | |
} | |
} | |
status.setConditionId(getId()); | |
return status; | |
} | |
} |