From 763d2968169be1d86937bc1f4354cf2f8e201866 Mon Sep 17 00:00:00 2001 From: justinedelson Date: Thu, 16 Nov 2017 17:13:39 -0500 Subject: [PATCH] Add Codeclimate configuration and resolve all Java issues (#1178) * Added code climate and fixed all outstanding code climate issues --- .codeclimate.yml | 49 + .codeclimate/checkstyle.xml | 157 ++++ .csslintrc | 2 + .eslintignore | 1 + .eslintrc.yml | 277 ++++++ CHANGELOG.md | 4 + CONTRIBUTING.md | 2 +- .../twitter/impl/TwitterAdapterFactory.java | 18 +- .../twitter/impl/TwitterFeedScheduler.java | 1 + .../twitter/impl/TwitterFeedUpdaterImpl.java | 9 +- .../jcrchecksum/ChecksumGeneratorOptions.java | 1 + .../jcrchecksum/impl/JSONGenerator.java | 166 ++-- .../ChecksumGeneratorOptionsFactory.java | 3 - .../CustomChecksumGeneratorOptions.java | 39 +- .../DefaultChecksumGeneratorOptions.java | 3 - .../RequestChecksumGeneratorOptions.java | 18 +- .../impl/servlets/BaseChecksumServlet.java | 2 +- .../AuditLogSearchRequest.java | 264 +++--- .../impl/AuditLogSearchServlet.java | 264 +++--- .../longformtext/LongFormTextComponent.java | 1 + .../impl/ContentFinderHitBuilder.java | 48 +- .../viewhandler/ContentFinderConstants.java | 6 + .../GQLToQueryBuilderConverter.java | 91 +- .../acs/commons/dam/ColorConversion.java | 34 +- .../commons/dam/RenditionPatternPicker.java | 12 +- .../dam/audio/impl/AudioHelperImpl.java | 25 +- .../audio/impl/FFMpegAudioEncodeProcess.java | 13 +- .../dam/audio/impl/FFMpegAudioUtils.java | 17 +- .../watson/impl/TranscriptionProcess.java | 8 +- .../watson/impl/TranscriptionServiceImpl.java | 10 +- .../impl/AddWatermarkToRenditionProcess.java | 1 + .../impl/AssetsFolderPropertiesSupport.java | 17 +- .../commons/dam/impl/ColorConversionImpl.java | 2 + .../dam/impl/MatteRenditionProcess.java | 1 + .../dam/impl/ReviewTaskAssetMoverHandler.java | 112 +-- .../designer/DesignHtmlLibraryManager.java | 1 + .../commons/designer/impl/OptionsServlet.java | 1 + .../commons/email/impl/EmailServiceImpl.java | 9 +- .../impl/SendTemplatedEmailProcess.java | 20 +- .../process/impl/SendTemplatedEmailUtils.java | 13 +- .../ErrorPageHandlerService.java | 3 + .../cache/impl/ErrorPageCacheImpl.java | 7 +- .../cache/impl/ErrorPageCacheMBean.java | 1 + .../impl/ErrorPageHandlerImpl.java | 91 +- .../exporters/impl/users/Parameters.java | 12 +- .../impl/users/UsersExportServlet.java | 4 +- .../impl/users/UsersInitServlet.java | 17 +- .../adobe/acs/commons/fam/ActionManager.java | 15 +- .../adobe/acs/commons/fam/CancelHandler.java | 2 +- .../acs/commons/fam/DeferredActions.java | 23 +- .../com/adobe/acs/commons/fam/Failure.java | 3 +- .../acs/commons/fam/ThrottledTaskRunner.java | 11 +- .../acs/commons/fam/actions/Actions.java | 3 + .../acs/commons/fam/actions/AssetActions.java | 3 +- .../acs/commons/fam/actions/Filters.java | 2 +- .../fam/actions/ReplicationActions.java | 14 +- .../commons/fam/impl/ActionManagerImpl.java | 139 +-- .../commons/fam/impl/RunningStatistic.java | 2 +- .../fam/impl/ThrottledTaskRunnerImpl.java | 31 +- .../acs/commons/fam/impl/TimedRunnable.java | 2 + .../adobe/acs/commons/forms/FormsRouter.java | 1 + .../forms/components/FormComponent.java | 131 +-- .../components/MultiStepFormComponent.java | 135 +-- .../acs/commons/forms/helpers/FormHelper.java | 1 + .../forms/helpers/ForwardAsGetFormHelper.java | 53 +- .../helpers/PostRedirectGetFormHelper.java | 71 +- .../helpers/impl/AbstractFormHelperImpl.java | 18 +- .../SyntheticSlingHttpServletGetRequest.java | 54 +- .../forms/impl/FormsPostFilterImpl.java | 2 + .../impl/FormsPostRedirectGetFilterImpl.java | 2 + .../acs/commons/functions/BiConsumer.java | 3 +- .../acs/commons/functions/BiFunction.java | 3 +- .../commons/functions/CheckedBiConsumer.java | 1 + .../commons/functions/CheckedBiFunction.java | 1 + .../commons/functions/CheckedConsumer.java | 1 + .../commons/functions/CheckedFunction.java | 1 + .../adobe/acs/commons/functions/Consumer.java | 3 +- .../adobe/acs/commons/functions/Function.java | 3 +- .../genericlists/impl/GenericListImpl.java | 22 +- .../hc/impl/HealthCheckStatusEmailer.java | 16 +- .../hc/impl/SMTPMailServiceHealthCheck.java | 32 +- .../AbstractDispatcherCacheHeaderFilter.java | 7 +- .../http/impl/HttpClientFactoryImpl.java | 12 +- .../AbstractHtmlRequestInjector.java | 3 + .../AuthenticationStatusConfigConstants.java | 1 - .../impl/GroupHttpCacheConfigExtension.java | 8 +- .../config/impl/HttpCacheConfigImpl.java | 65 +- .../ResourceTypeHttpCacheConfigExtension.java | 4 + .../httpcache/engine/CacheContent.java | 3 - .../HttpCacheServletResponseWrapper.java | 1 + .../engine/impl/HttpCacheEngineImpl.java | 9 +- .../httpcache/engine/impl/TeePrintWriter.java | 18 +- .../engine/impl/TeeServletOutputStream.java | 12 +- .../HttpCacheConfigConflictException.java | 1 + .../HttpCacheDataStreamException.java | 1 + .../HttpCacheKeyCreationException.java | 1 + .../HttpCachePersistenceException.java | 1 + .../HttpCacheRepositoryAccessException.java | 1 + .../filter/impl/AbstractHttpCacheFilter.java | 1 + .../filter/impl/HttpCacheIncludeFilter.java | 2 + .../filter/impl/HttpCacheRequestFilter.java | 2 + .../CacheInvalidationJobConstants.java | 1 - .../HttpCacheInvalidationJobConsumer.java | 6 +- .../event/JCRNodeChangeEventHandler.java | 8 +- .../httpcache/store/HttpCacheStore.java | 11 +- .../disk/impl/DiskHttpCacheStoreImpl.java | 4 +- .../store/jcr/impl/JCRHttpCacheStoreImpl.java | 4 +- .../mem/impl/MemCachePersistenceObject.java | 5 +- .../store/mem/impl/MemHttpCacheStoreImpl.java | 20 +- .../commons/httpcache/util/CacheUtils.java | 4 +- .../acs/commons/httpcache/util/UserUtils.java | 4 +- .../acs/commons/images/ImageTransformer.java | 1 + .../commons/images/NamedImageTransformer.java | 1 + .../impl/NamedTransformImageServlet.java | 22 +- ...gressiveJPEG.java => ProgressiveJpeg.java} | 4 +- .../impl/CropImageTransformerImpl.java | 1 + .../contexts/MultiplyCompositeContext.java | 2 +- .../commons/logging/impl/JsonEventLogger.java | 35 +- .../commons/logging/impl/SyslogAppender.java | 33 +- ...istratorsOnlyProcessDefinitionFactory.java | 9 +- .../acs/commons/mcp/ProcessDefinition.java | 8 +- .../commons/mcp/ProcessDefinitionFactory.java | 5 +- .../acs/commons/mcp/ProcessInstance.java | 3 +- .../acs/commons/mcp/form/FieldComponent.java | 2 +- .../commons/mcp/form/FileUploadComponent.java | 17 +- .../commons/mcp/form/PathfieldComponent.java | 10 +- .../acs/commons/mcp/form/RadioComponent.java | 6 +- .../acs/commons/mcp/form/SelectComponent.java | 6 +- .../mcp/impl/AbstractResourceImpl.java | 2 +- .../impl/ControlledProcessManagerImpl.java | 6 +- .../impl/ControlledProcessManagerServlet.java | 4 +- .../mcp/impl/GenericReportExcelServlet.java | 8 +- .../commons/mcp/impl/ProcessInstanceImpl.java | 85 +- .../mcp/impl/processes/AssetIngestor.java | 20 +- .../mcp/impl/processes/AssetReport.java | 26 +- .../mcp/impl/processes/BrokenLinksReport.java | 28 +- .../commons/mcp/impl/processes/DeepPrune.java | 12 +- .../mcp/impl/processes/FileAssetIngestor.java | 10 +- .../mcp/impl/processes/FolderRelocator.java | 46 +- .../mcp/impl/processes/PageRelocator.java | 50 +- .../mcp/impl/processes/ProcessCleanup.java | 2 +- .../mcp/impl/processes/ReplicatorQueue.java | 6 +- .../mcp/impl/processes/S3AssetIngestor.java | 10 +- .../processes/S3AssetIngestorFactory.java | 3 +- .../mcp/impl/processes/TagCreator.java | 76 +- .../mcp/impl/processes/TagCreatorFactory.java | 7 +- .../adobe/acs/commons/mcp/mbean/CPMBean.java | 1 + .../model/AvailableProcessDefinitions.java | 4 +- .../acs/commons/mcp/model/GenericReport.java | 18 +- .../acs/commons/mcp/model/ManagedProcess.java | 8 +- .../acs/commons/mcp/model/ValueFormat.java | 9 +- .../model/impl/ArchivedProcessInstance.java | 19 +- .../mcp/util/AnnotatedFieldDeserializer.java | 27 +- .../acs/commons/mcp/util/FrozenAsset.java | 1 + .../acs/commons/mcp/util/FrozenRendition.java | 8 +- .../commons/mcp/util/IntrospectionUtil.java | 4 +- .../acs/commons/mcp/util/StringUtil.java | 2 +- .../AemObjectAnnotationProcessorFactory.java | 3 +- .../acs/commons/oak/impl/EnsureOakIndex.java | 2 +- .../oak/impl/EnsureOakIndexJobHandler.java | 2 + .../oak/impl/EnsureOakIndexManagerImpl.java | 1 + .../commons/oak/impl/EnsurePropertyIndex.java | 7 +- .../acs/commons/packaging/PackageHelper.java | 2 + .../impl/ACLPackagerServletImpl.java | 16 +- .../JcrPackageCoverageProgressListener.java | 2 +- .../packaging/impl/PackageHelperImpl.java | 36 +- .../impl/QueryPackagerServletImpl.java | 25 - .../adobe/acs/commons/quickly/Command.java | 12 +- .../acs/commons/quickly/QuicklyEngine.java | 1 + .../quickly/impl/QuicklyEngineImpl.java | 3 +- .../commons/quickly/impl/QuicklyFilter.java | 7 +- .../commons/quickly/operations/Operation.java | 1 + .../operations/impl/HelpOperationImpl.java | 4 +- .../impl/LastModifiedOperationImpl.java | 9 +- .../acs/commons/quickly/results/Action.java | 2 + .../acs/commons/quickly/results/Result.java | 1 + .../quickly/results/ResultSerializer.java | 3 +- .../results/impl/ResultBuilderImpl.java | 3 +- .../results/impl/lists/ACSToolsResults.java | 1 + .../impl/lists/AbstractAccessibleResults.java | 5 +- .../results/impl/lists/DevConsoleResults.java | 2 + .../results/impl/lists/HelpResults.java | 4 +- .../serializers/AbstractResultSerializer.java | 2 +- .../GenericResultSerializerImpl.java | 2 +- .../serializers/OpenResultSerializerImpl.java | 2 +- .../impl/FakeSlingHttpServletRequest.java | 840 ++++++++++-------- .../redirectmaps/impl/RedirectMapServlet.java | 22 +- .../commons/redirectmaps/models/MapEntry.java | 66 +- .../models/RedirectConfigModel.java | 72 +- .../redirectmaps/models/RedirectMapModel.java | 222 ++--- .../replication/BrandPortalAgentFilter.java | 10 +- .../replication/ReplicationResult.java | 1 + .../dispatcher/DispatcherFlushFilter.java | 3 +- .../impl/DispatcherFlushRulesImpl.java | 4 +- .../impl/DispatcherFlusherServlet.java | 1 + .../impl/ReplicationResultListener.java | 3 + .../impl/ReplicateVersionImpl.java | 15 +- .../impl/ReplicateVersionServlet.java | 106 +-- .../AutomaticPackageReplicatorMBean.java | 4 +- .../impl/AutomaticPackageReplicatorJob.java | 158 ++-- .../impl/ConfigurationUpdateListener.java | 243 ++--- .../impl/ReplicatePackageProcess.java | 70 +- .../AutomaticPackageReplicatorModel.java | 61 +- .../status/ReplicationStatusManager.java | 2 +- ...rPackageReplicationStatusEventHandler.java | 77 +- .../impl/ReplicatedByWorkflowProcess.java | 2 +- .../impl/ReplicationStatusManagerImpl.java | 49 +- .../impl/SetReplicationStatusProcess.java | 142 +-- .../rewriter/impl/ContentHandlerAdapter.java | 11 + .../rewriter/impl/PlainXMLSerializer.java | 1 + ...ResourceResolverMapTransformerFactory.java | 13 +- ...ElementUtils.java => SaxElementUtils.java} | 6 +- ...ticReferenceRewriteTransformerFactory.java | 73 +- .../StylesheetInlinerTransformerFactory.java | 8 +- ...VersionedClientlibsTransformerFactory.java | 22 +- .../impl/NodeExistsPredicateEvaluator.java | 1 + .../children/InvalidDataFormatException.java | 1 + .../SyntheticChildAsPropertyResource.java | 5 +- .../impl/JSONModifiableValueMapDecorator.java | 38 +- .../com/adobe/acs/commons/users/impl/Ace.java | 35 +- .../commons/users/impl/EnsureServiceUser.java | 46 +- .../impl/EnsureServiceUserManagerImpl.java | 9 +- .../users/impl/ProtectedSystemUsers.java | 2 + .../acs/commons/users/impl/ServiceUser.java | 2 +- .../adobe/acs/commons/util/CookieUtil.java | 56 +- .../com/adobe/acs/commons/util/ModeUtil.java | 1 + .../acs/commons/util/ResourceDataUtil.java | 1 + .../commons/util/ResourceServiceManager.java | 9 +- .../adobe/acs/commons/util/TemplateUtil.java | 1 + .../com/adobe/acs/commons/util/TypeUtil.java | 4 +- .../acs/commons/util/WorkflowHelper.java | 3 +- .../ResourceDefinitionBuilder.java | 20 + .../impl/BasicResourceDefinition.java | 6 +- ...ercaseWithDashesDefinitionBuilderImpl.java | 2 +- .../util/impl/AbstractGuavaCacheMBean.java | 1 + .../commons/util/impl/ComponentDisabler.java | 4 +- .../commons/util/impl/GenericCacheMBean.java | 1 + .../commons/util/impl/QueryHelperImpl.java | 90 +- .../acs/commons/util/impl/UrlFilter.java | 1 + .../mbeans/ResourceServiceManagerMBean.java | 10 +- .../commons/util/visitors/ContentVisitor.java | 5 +- .../util/visitors/ResourceRunnable.java | 1 + .../SimpleFilteringResourceVisitor.java | 11 +- .../impl/CurrentEvolutionEntryImpl.java | 8 +- .../commons/version/impl/EvolutionConfig.java | 14 +- .../version/impl/EvolutionEntryImpl.java | 11 +- .../commons/version/impl/EvolutionImpl.java | 1 + .../version/impl/EvolutionPathUtil.java | 2 + .../acs/commons/wcm/ComponentEditType.java | 5 +- .../commons/wcm/ComponentErrorHandler.java | 1 + .../acs/commons/wcm/ComponentHelper.java | 2 + .../impl/PageCompareDataLineImpl.java | 6 +- .../wcm/comparisons/impl/Properties.java | 2 + .../wcm/comparisons/impl/lines/Stepper.java | 4 +- .../comparisons/model/PageCompareModel.java | 11 +- .../wcm/datasources/DataSourceBuilder.java | 1 + .../impl/AemEnvironmentIndicatorFilter.java | 29 +- .../commons/wcm/impl/AuthorUIHelperImpl.java | 24 +- .../CQIncludePropertyNamespaceServlet.java | 14 +- .../wcm/impl/ComponentErrorHandlerImpl.java | 25 +- .../commons/wcm/impl/ComponentHelperImpl.java | 4 + .../CustomPollingImporterListServlet.java | 6 +- .../acs/commons/wcm/impl/FileImporter.java | 17 +- .../wcm/impl/PageRootProviderConfig.java | 6 +- .../wcm/impl/PageRootProviderImpl.java | 11 +- .../wcm/impl/PropertyMergePostProcessor.java | 4 +- .../acs/commons/wcm/impl/QrCodeServlet.java | 8 +- .../wcm/impl/RTEConfigurationServlet.java | 11 +- .../acs/commons/wcm/impl/SiteMapServlet.java | 2 + .../impl/TagWidgetConfigurationServlet.java | 14 +- .../wcm/impl/WCMInboxWebConsolePlugin.java | 1 + .../WorkflowModelFilterPageInfoProvider.java | 1 + .../impl/SystemNotificationsImpl.java | 16 +- .../shared/SharedComponentProperties.java | 20 + .../commons/wcm/vanity/VanityURLService.java | 19 +- .../impl/ExtensionlessRequestWrapper.java | 22 +- .../wcm/vanity/impl/VanityURLServiceImpl.java | 93 +- .../wcm/views/impl/WCMViewsFilter.java | 13 +- .../wcm/views/impl/WCMViewsServlet.java | 13 +- .../bulk/execution/BulkWorkflowEngine.java | 1 + .../bulk/execution/BulkWorkflowRunner.java | 16 +- .../impl/BulkWorkflowEngineImpl.java | 1 + .../execution/impl/ConfigResourceVisitor.java | 8 +- .../AEMTransientWorkflowRunnerImpl.java | 6 +- .../impl/runners/AEMWorkflowRunnerImpl.java | 23 +- .../runners/AbstractAEMWorkflowRunner.java | 6 +- .../impl/runners/AbstractWorkflowRunner.java | 18 +- .../runners/FastActionManagerRunnerImpl.java | 13 +- .../runners/SyntheticWorkflowRunnerImpl.java | 8 +- .../impl/servlets/InitFormServlet.java | 100 ++- .../execution/impl/servlets/StartServlet.java | 1 + .../impl/servlets/StatusServlet.java | 2 + .../workflow/bulk/execution/model/Config.java | 7 +- .../bulk/execution/model/Failure.java | 3 - .../bulk/execution/model/Payload.java | 8 +- .../bulk/execution/model/PayloadGroup.java | 3 - .../bulk/execution/model/Workspace.java | 21 +- .../bulk/removal/WorkflowInstanceRemover.java | 1 + .../bulk/removal/WorkflowRemovalStatus.java | 22 +- .../WorkflowInstanceFolderComparator.java | 3 - .../impl/WorkflowInstanceRemoverImpl.java | 202 +++-- .../WorkflowInstanceRemoverScheduler.java | 2 + .../process/impl/BrandPortalSyncProcess.java | 6 +- .../ReplicateWithOptionsWorkflowProcess.java | 16 +- .../impl/SyntheticWrapperWorkflowProcess.java | 4 +- .../process/impl/WorkflowDelegationStep.java | 6 +- .../synthetic/SyntheticWorkflowRunner.java | 4 + .../synthetic/impl/SyntheticMetaDataMap.java | 10 +- .../synthetic/impl/SyntheticWorkflowData.java | 4 + .../impl/SyntheticWorkflowModelImpl.java | 1 - .../impl/SyntheticWorkflowProcess.java | 1 + .../impl/SyntheticWorkflowRunnerImpl.java | 70 +- .../synthetic/impl/cq/SyntheticWorkItem.java | 4 + .../synthetic/impl/cq/SyntheticWorkflow.java | 4 + .../impl/cq/SyntheticWorkflowSession.java | 6 + .../SyntheticCompleteWorkflowException.java | 2 +- .../SyntheticRestartWorkflowException.java | 2 +- .../SyntheticTerminateWorkflowException.java | 2 +- .../SyntheticWorkflowModelException.java | 1 + .../granite/SyntheticWorkflowModelImpl.java | 1 - .../granite/SyntheticWorkflowSession.java | 3 + .../SyntheticCompleteWorkflowException.java | 2 +- .../SyntheticRestartWorkflowException.java | 2 +- .../SyntheticTerminateWorkflowException.java | 2 +- .../SyntheticWorkflowModelException.java | 1 + .../adobe/acs/commons/xss/XSSFunctions.java | 14 +- ...JPEGTest.java => ProgressiveJpegTest.java} | 4 +- .../mcp/impl/processes/BrokenLinksTest.java | 10 +- .../mcp/impl/processes/PageRelocatorTest.java | 2 +- ...tilsTest.java => SaxElementUtilsTest.java} | 38 +- .../clientlibs/css/errorpagehandler.css | 2 +- .../widgets/source/js/multipanel.js | 2 +- .../widgets/source/js/node-multi-panel.js | 4 +- .../js/RightToLeftKeyboardShortcut.js | 3 +- 334 files changed, 4245 insertions(+), 3285 deletions(-) create mode 100644 .codeclimate.yml create mode 100644 .codeclimate/checkstyle.xml create mode 100644 .csslintrc create mode 100644 .eslintignore create mode 100644 .eslintrc.yml rename bundle/src/main/java/com/adobe/acs/commons/images/impl/{ProgressiveJPEG.java => ProgressiveJpeg.java} (98%) rename bundle/src/main/java/com/adobe/acs/commons/rewriter/impl/{SAXElementUtils.java => SaxElementUtils.java} (91%) rename bundle/src/test/java/com/adobe/acs/commons/images/impl/{ProgressiveJPEGTest.java => ProgressiveJpegTest.java} (96%) rename bundle/src/test/java/com/adobe/acs/commons/rewriter/impl/{SAXElementUtilsTest.java => SaxElementUtilsTest.java} (74%) diff --git a/.codeclimate.yml b/.codeclimate.yml new file mode 100644 index 0000000000..3c6b6906e5 --- /dev/null +++ b/.codeclimate.yml @@ -0,0 +1,49 @@ +--- +engines: + sonar-java: + enabled: true + config: + sonar.java.source: 8 + checkstyle: + enabled: true + config: + file: ".codeclimate/checkstyle.xml" +# csslint: +# enabled: true +# duplication: +# enabled: true +# config: +# languages: +# - javascript +# eslint: +# enabled: true +# fixme: +# enabled: true + pmd: + enabled: true +ratings: + paths: + - "**.java" + - "**.css" + - "**.js" +exclude_paths: +- ".idea/" +- "**/vendor/" +- "**/extensions/contentfinder/" +- "**/src/test/" +- "*/target/" + + +# Common exclusions +# squid:S3776 - Cognitive Complexity +# squid:S1214 - constants in interface +# squid:S1141 - nested try +# squid:S1192 - literals +# squid:S1149 - Hashtable +# squid:S00112 - specific exceptions +# squid:S2095 - close stream +# squid:S1172 - unused method param +# squid:S00115 - constant name +# squid:S1144 - unused private method +# +# checkstyle:abbreviationaswordinname - abbreviation \ No newline at end of file diff --git a/.codeclimate/checkstyle.xml b/.codeclimate/checkstyle.xml new file mode 100644 index 0000000000..b5c4e4922d --- /dev/null +++ b/.codeclimate/checkstyle.xml @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.csslintrc b/.csslintrc new file mode 100644 index 0000000000..aacba956e5 --- /dev/null +++ b/.csslintrc @@ -0,0 +1,2 @@ +--exclude-exts=.min.css +--ignore=adjoining-classes,box-model,ids,order-alphabetical,unqualified-attributes diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000000..96212a3593 --- /dev/null +++ b/.eslintignore @@ -0,0 +1 @@ +**/*{.,-}min.js diff --git a/.eslintrc.yml b/.eslintrc.yml new file mode 100644 index 0000000000..dec0e53b1f --- /dev/null +++ b/.eslintrc.yml @@ -0,0 +1,277 @@ +--- +parserOptions: + sourceType: module + ecmaFeatures: + jsx: true + +env: + amd: true + browser: true + es6: true + jquery: true + node: true + +# http://eslint.org/docs/rules/ +rules: + # Possible Errors + no-await-in-loop: off + no-cond-assign: error + no-console: off + no-constant-condition: error + no-control-regex: error + no-debugger: error + no-dupe-args: error + no-dupe-keys: error + no-duplicate-case: error + no-empty-character-class: error + no-empty: error + no-ex-assign: error + no-extra-boolean-cast: error + no-extra-parens: off + no-extra-semi: error + no-func-assign: error + no-inner-declarations: + - error + - functions + no-invalid-regexp: error + no-irregular-whitespace: error + no-negated-in-lhs: error + no-obj-calls: error + no-prototype-builtins: off + no-regex-spaces: error + no-sparse-arrays: error + no-template-curly-in-string: off + no-unexpected-multiline: error + no-unreachable: error + no-unsafe-finally: off + no-unsafe-negation: off + use-isnan: error + valid-jsdoc: off + valid-typeof: error + + # Best Practices + accessor-pairs: error + array-callback-return: off + block-scoped-var: off + class-methods-use-this: off + complexity: + - error + - 6 + consistent-return: off + curly: off + default-case: off + dot-location: off + dot-notation: off + eqeqeq: error + guard-for-in: error + no-alert: error + no-caller: error + no-case-declarations: error + no-div-regex: error + no-else-return: off + no-empty-function: off + no-empty-pattern: error + no-eq-null: error + no-eval: error + no-extend-native: error + no-extra-bind: error + no-extra-label: off + no-fallthrough: error + no-floating-decimal: off + no-global-assign: off + no-implicit-coercion: off + no-implied-eval: error + no-invalid-this: off + no-iterator: error + no-labels: + - error + - allowLoop: true + allowSwitch: true + no-lone-blocks: error + no-loop-func: error + no-magic-number: off + no-multi-spaces: off + no-multi-str: off + no-native-reassign: error + no-new-func: error + no-new-wrappers: error + no-new: error + no-octal-escape: error + no-octal: error + no-param-reassign: off + no-proto: error + no-redeclare: error + no-restricted-properties: off + no-return-assign: error + no-return-await: off + no-script-url: error + no-self-assign: off + no-self-compare: error + no-sequences: off + no-throw-literal: off + no-unmodified-loop-condition: off + no-unused-expressions: error + no-unused-labels: off + no-useless-call: error + no-useless-concat: error + no-useless-escape: off + no-useless-return: off + no-void: error + no-warning-comments: off + no-with: error + prefer-promise-reject-errors: off + radix: error + require-await: off + vars-on-top: off + wrap-iife: error + yoda: off + + # Strict + strict: off + + # Variables + init-declarations: off + no-catch-shadow: error + no-delete-var: error + no-label-var: error + no-restricted-globals: off + no-shadow-restricted-names: error + no-shadow: off + no-undef-init: error + no-undef: off + no-undefined: off + no-unused-vars: off + no-use-before-define: off + + # Node.js and CommonJS + callback-return: error + global-require: error + handle-callback-err: error + no-mixed-requires: off + no-new-require: off + no-path-concat: error + no-process-env: off + no-process-exit: error + no-restricted-modules: off + no-sync: off + + # Stylistic Issues + array-bracket-spacing: off + block-spacing: off + brace-style: off + camelcase: off + capitalized-comments: off + comma-dangle: + - error + - never + comma-spacing: off + comma-style: off + computed-property-spacing: off + consistent-this: off + eol-last: off + func-call-spacing: off + func-name-matching: off + func-names: off + func-style: off + id-length: off + id-match: off + indent: off + jsx-quotes: off + key-spacing: off + keyword-spacing: off + line-comment-position: off + linebreak-style: off + lines-around-comment: off + lines-around-directive: off + max-depth: off + max-len: off + max-nested-callbacks: off + max-params: off + max-statements-per-line: off + max-statements: + - error + - 30 + multiline-ternary: off + new-cap: off + new-parens: off + newline-after-var: off + newline-before-return: off + newline-per-chained-call: off + no-array-constructor: off + no-bitwise: off + no-continue: off + no-inline-comments: off + no-lonely-if: off + no-mixed-operators: off + no-mixed-spaces-and-tabs: off + no-multi-assign: off + no-multiple-empty-lines: off + no-negated-condition: off + no-nested-ternary: off + no-new-object: off + no-plusplus: off + no-restricted-syntax: off + no-spaced-func: off + no-tabs: error + no-ternary: off + no-trailing-spaces: off + no-underscore-dangle: off + no-unneeded-ternary: off + object-curly-newline: off + object-curly-spacing: off + object-property-newline: off + one-var-declaration-per-line: off + one-var: off + operator-assignment: off + operator-linebreak: off + padded-blocks: off + quote-props: off + quotes: off + require-jsdoc: off + semi-spacing: off + semi: off + sort-keys: off + sort-vars: off + space-before-blocks: off + space-before-function-paren: off + space-in-parens: off + space-infix-ops: off + space-unary-ops: off + spaced-comment: off + template-tag-spacing: off + unicode-bom: off + wrap-regex: off + + # ECMAScript 6 + arrow-body-style: off + arrow-parens: off + arrow-spacing: off + constructor-super: off + generator-star-spacing: off + no-class-assign: off + no-confusing-arrow: off + no-const-assign: off + no-dupe-class-members: off + no-duplicate-imports: off + no-new-symbol: off + no-restricted-imports: off + no-this-before-super: off + no-useless-computed-key: off + no-useless-constructor: off + no-useless-rename: off + no-var: off + object-shorthand: off + prefer-arrow-callback: off + prefer-const: off + prefer-destructuring: off + prefer-numeric-literals: off + prefer-rest-params: off + prefer-reflect: off + prefer-spread: off + prefer-template: off + require-yield: off + rest-spread-spacing: off + sort-imports: off + symbol-description: off + template-curly-spacing: off + yield-star-spacing: off diff --git a/CHANGELOG.md b/CHANGELOG.md index 6efd72560c..a9cacc7b87 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,10 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/) - #1145 - New Redirect Map Manager feature +### Changed + +- #1174 - Introduced CodeClimate quality checks. Resulted in lots of miscellaneous non-API changes. + ### Fixed - #1171 - Reduce duplicate coverage comments in pull requests. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 91bd564247..cf81dd18fa 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -37,7 +37,7 @@ There's a good guide to performing pull requests at [https://help.github.com/art The best pull request are small and focused. Don't try to change the world in one pull request. And while the focus of this project is reusability, that doesn't mean that every option under the sun needs to be available. Stick to the 80/20 rule and provide a way to extend for that extra 20% on a project. -* Run Maven build by running `mvn -Panalysis clean install` to run the static analysis checks. +* Check code quality proactively by using [https://github.com/codeclimate/codeclimate](CodeClimate CLI). * Ensure license is applied correctly by running `mvn license:update-file-header` * Add JUnit test for Java code. Our coverage ratio isn't great, but we don't want it to get worse. * Until explicitly enabled, features should be invisible to AEM users and excluded from any execution stack. diff --git a/bundle-twitter/src/main/java/com/adobe/acs/commons/twitter/impl/TwitterAdapterFactory.java b/bundle-twitter/src/main/java/com/adobe/acs/commons/twitter/impl/TwitterAdapterFactory.java index 1f553e465d..9098a7de06 100644 --- a/bundle-twitter/src/main/java/com/adobe/acs/commons/twitter/impl/TwitterAdapterFactory.java +++ b/bundle-twitter/src/main/java/com/adobe/acs/commons/twitter/impl/TwitterAdapterFactory.java @@ -86,9 +86,9 @@ public class TwitterAdapterFactory implements AdapterFactory { public AdapterType getAdapter(Object adaptable, Class type) { TwitterClient client = null; if (adaptable instanceof Page) { - client = createTwitterClient((Page) adaptable); + client = createTwitterClientFromPage((Page) adaptable); } else if (adaptable instanceof com.day.cq.wcm.webservicesupport.Configuration) { - client = createTwitterClient((com.day.cq.wcm.webservicesupport.Configuration) adaptable); + client = createTwitterClientFromConfiguration((com.day.cq.wcm.webservicesupport.Configuration) adaptable); } if (client != null) { @@ -114,19 +114,19 @@ private Configuration buildConfiguration() { return builder.build(); } - private TwitterClient createTwitterClient(com.day.cq.wcm.webservicesupport.Configuration config) { + private TwitterClient createTwitterClientFromConfiguration(com.day.cq.wcm.webservicesupport.Configuration config) { Resource oauthConfig = config.getContentResource().listChildren().next(); ValueMap oauthProps = oauthConfig.getValueMap(); String consumerKey = oauthProps.get("oauth.client.id", String.class); String consumerSecret = oauthProps.get("oauth.client.secret", String.class); if (consumerKey != null && consumerSecret != null) { - Twitter t = getInstance(); + Twitter twitter = getInstance(); log.debug("Creating client for key {}.", consumerKey); - t.setOAuthConsumer(consumerKey, consumerSecret); + twitter.setOAuthConsumer(consumerKey, consumerSecret); try { - t.getOAuth2Token(); - return new TwitterClientImpl(t, config); + twitter.getOAuth2Token(); + return new TwitterClientImpl(twitter, config); } catch (TwitterException e) { log.error("Unable to create Twitter client.", e); return null; @@ -143,10 +143,10 @@ Twitter getInstance() { return factory.getInstance(); } - private TwitterClient createTwitterClient(Page page) { + private TwitterClient createTwitterClientFromPage(Page page) { com.day.cq.wcm.webservicesupport.Configuration config = findTwitterConfiguration(page); if (config != null) { - return createTwitterClient(config); + return createTwitterClientFromConfiguration(config); } return null; } diff --git a/bundle-twitter/src/main/java/com/adobe/acs/commons/twitter/impl/TwitterFeedScheduler.java b/bundle-twitter/src/main/java/com/adobe/acs/commons/twitter/impl/TwitterFeedScheduler.java index ce70b0b81b..561e529981 100644 --- a/bundle-twitter/src/main/java/com/adobe/acs/commons/twitter/impl/TwitterFeedScheduler.java +++ b/bundle-twitter/src/main/java/com/adobe/acs/commons/twitter/impl/TwitterFeedScheduler.java @@ -50,6 +50,7 @@ public final class TwitterFeedScheduler extends RunnableOnMaster { private static final String SERVICE_NAME = "twitter-updater"; private static final Map AUTH_INFO; + static { AUTH_INFO = Collections.singletonMap(ResourceResolverFactory.SUBSERVICE, (Object) SERVICE_NAME); } diff --git a/bundle-twitter/src/main/java/com/adobe/acs/commons/twitter/impl/TwitterFeedUpdaterImpl.java b/bundle-twitter/src/main/java/com/adobe/acs/commons/twitter/impl/TwitterFeedUpdaterImpl.java index d9b65b65e1..21024d2ef6 100644 --- a/bundle-twitter/src/main/java/com/adobe/acs/commons/twitter/impl/TwitterFeedUpdaterImpl.java +++ b/bundle-twitter/src/main/java/com/adobe/acs/commons/twitter/impl/TwitterFeedUpdaterImpl.java @@ -84,6 +84,7 @@ protected void activate(ComponentContext ctx) { } @Override + @SuppressWarnings("squid:S3776") public void updateTwitterFeedComponents(ResourceResolver resourceResolver) { PageManager pageManager = resourceResolver.adaptTo(PageManager.class); @@ -120,7 +121,7 @@ public void updateTwitterFeedComponents(ResourceResolver resourceResolver) { map.put("tweetsJson", jsonList.toArray(new String[jsonList.size()])); twitterResource.getResourceResolver().commit(); - handleReplication(pageManager, twitterResource); + handleReplication(twitterResource); } } @@ -150,9 +151,9 @@ private List findTwitterResources(ResourceResolver resourceResolver) { predicateMap.put("path", "/content"); predicateMap.put("property", "sling:resourceType"); - int i = 1; + int counter = 1; for (String path : twitterComponentPaths) { - predicateMap.put("property." + (i++) + "_value", path.toString()); + predicateMap.put("property." + (counter++) + "_value", path.toString()); } @@ -182,7 +183,7 @@ private String processTweet(Status status) { } - private void handleReplication(PageManager pageManager, Resource twitterResource) throws ReplicationException { + private void handleReplication(Resource twitterResource) throws ReplicationException { if (isReplicationEnabled(twitterResource)) { Session session = twitterResource.getResourceResolver().adaptTo(Session.class); replicator.replicate(session, ReplicationActionType.ACTIVATE, twitterResource.getPath()); diff --git a/bundle/src/main/java/com/adobe/acs/commons/analysis/jcrchecksum/ChecksumGeneratorOptions.java b/bundle/src/main/java/com/adobe/acs/commons/analysis/jcrchecksum/ChecksumGeneratorOptions.java index adf7e78bc2..ef1549753e 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/analysis/jcrchecksum/ChecksumGeneratorOptions.java +++ b/bundle/src/main/java/com/adobe/acs/commons/analysis/jcrchecksum/ChecksumGeneratorOptions.java @@ -25,6 +25,7 @@ import java.util.Set; @ProviderType +@SuppressWarnings("squid:S1214") public interface ChecksumGeneratorOptions { String DATA = "data"; diff --git a/bundle/src/main/java/com/adobe/acs/commons/analysis/jcrchecksum/impl/JSONGenerator.java b/bundle/src/main/java/com/adobe/acs/commons/analysis/jcrchecksum/impl/JSONGenerator.java index 9505036407..78050a290e 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/analysis/jcrchecksum/impl/JSONGenerator.java +++ b/bundle/src/main/java/com/adobe/acs/commons/analysis/jcrchecksum/impl/JSONGenerator.java @@ -112,17 +112,16 @@ private static void traverseTree(Node node, ChecksumGeneratorOptions opts, String primaryNodeType; try { primaryNodeType = node.getPrimaryNodeType().getName(); - NodeIterator nIt; if (nodeTypes.contains(primaryNodeType) && !nodeTypeExcludes.contains(primaryNodeType)) { - generateJSON(node, opts, out); + generateNodeJSON(node, opts, out); } else { - nIt = node.getNodes(); - while (nIt.hasNext()) { + NodeIterator nodeIterator = node.getNodes(); + while (nodeIterator.hasNext()) { primaryNodeType = node.getPrimaryNodeType().getName(); - Node child = nIt.nextNode(); + Node child = nodeIterator.nextNode(); if (nodeTypes.contains(primaryNodeType)) { - generateJSON(child, opts, out); + generateNodeJSON(child, opts, out); } else { traverseTree(child, opts, out); } @@ -134,8 +133,8 @@ private static void traverseTree(Node node, ChecksumGeneratorOptions opts, } } - private static void generateJSON(Node node, - ChecksumGeneratorOptions opts, JSONWriter out) + private static void generateNodeJSON(Node node, + ChecksumGeneratorOptions opts, JSONWriter out) throws RepositoryException, JSONException { out.key(node.getPath()); out.object(); @@ -174,77 +173,74 @@ private static void outputProperties(Node node, ChecksumGeneratorOptions opts, JSONWriter out) throws RepositoryException, JSONException, ValueFormatException { Set excludes = opts.getExcludedProperties(); - Set sortValues = opts.getSortedProperties(); SortedMap props = new TreeMap(); - PropertyIterator pi = node.getProperties(); + PropertyIterator propertyIterator = node.getProperties(); // sort the properties by name as the JCR makes no guarantees on property order - while (pi.hasNext()) { - Property p = pi.nextProperty(); + while (propertyIterator.hasNext()) { + Property property = propertyIterator.nextProperty(); //skip the property if it is in the excludes list - if (excludes.contains(p.getName())) { + if (excludes.contains(property.getName())) { continue; } else { - props.put(p.getName(), p); + props.put(property.getName(), property); } } - pi = null; - for (Property p : props.values()) { - int type = p.getType(); + for (Property property : props.values()) { + outputProperty(property, opts, out); + } + } - if (p.isMultiple()) { - out.key(p.getName()); - // create an array for multi value output - out.array(); - boolean isSortedValues = sortValues.contains(p.getName()); - Value[] values = p.getValues(); - TreeMap sortedValueMap = new TreeMap(); - for (Value v : values) { - type = v.getType(); - if (type == PropertyType.BINARY) { - if (isSortedValues) { - try { - java.io.InputStream stream = - v.getBinary().getStream(); - String ckSum = DigestUtils.shaHex(stream); - stream.close(); - sortedValueMap.put(ckSum, v); - } catch (IOException e) { - sortedValueMap.put("ERROR: generating hash for binary of " - + p.getPath() + " : " + e.getMessage(), v); - } - } else { - outputPropertyValue(p, v, out); + @SuppressWarnings("squid:S3776") + private static void outputProperty(Property property, ChecksumGeneratorOptions opts, JSONWriter out) + throws RepositoryException, JSONException { + Set sortValues = opts.getSortedProperties(); + if (property.isMultiple()) { + out.key(property.getName()); + // create an array for multi value output + out.array(); + boolean isSortedValues = sortValues.contains(property.getName()); + Value[] values = property.getValues(); + TreeMap sortedValueMap = new TreeMap(); + for (Value v : values) { + int type = v.getType(); + if (type == PropertyType.BINARY) { + if (isSortedValues) { + try { + java.io.InputStream stream = + v.getBinary().getStream(); + String ckSum = DigestUtils.shaHex(stream); + stream.close(); + sortedValueMap.put(ckSum, v); + } catch (IOException e) { + sortedValueMap.put("ERROR: generating hash for binary of " + + property.getPath() + " : " + e.getMessage(), v); } } else { - String val = v.getString(); - if (isSortedValues) { - sortedValueMap.put(val, v); - } else { - outputPropertyValue(p, v, out); - } + outputPropertyValue(property, v, out); } - } - if (isSortedValues) { - for (Value v : sortedValueMap.values()) { - outputPropertyValue(p, v, out); + } else { + String val = v.getString(); + if (isSortedValues) { + sortedValueMap.put(val, v); + } else { + outputPropertyValue(property, v, out); } } - out.endArray(); - // end multi value property output - } else { - out.key(p.getName()); - outputPropertyValue(p, p.getValue(), out); } + if (isSortedValues) { + for (Value v : sortedValueMap.values()) { + outputPropertyValue(property, v, out); + } + } + out.endArray(); + // end multi value property output + } else { + out.key(property.getName()); + outputPropertyValue(property, property.getValue(), out); } - // if (nodeTypes.contains(primaryNodeType)) { - // out.print(node.getPath()); - // out.print("\t"); - // out.println(DigestUtils.shaHex(checkSums.toString())); - // out.flush(); - // } } /** @@ -258,17 +254,17 @@ private static void outputChildNodes(Node node, ChecksumGeneratorOptions opts, J throws RepositoryException, JSONException { Set nodeTypeExcludes = opts.getExcludedNodeTypes(); - NodeIterator nIt; - nIt = node.getNodes(); + NodeIterator nodeIterator = node.getNodes(); TreeMap childSortMap = new TreeMap(); boolean hasOrderedChildren = false; try { hasOrderedChildren = node.getPrimaryNodeType().hasOrderableChildNodes(); - } catch (Exception e) { + } catch (Exception expected) { + // ignore } - while (nIt.hasNext()) { - Node child = nIt.nextNode(); + while (nodeIterator.hasNext()) { + Node child = nodeIterator.nextNode(); if (!nodeTypeExcludes .contains(child.getPrimaryNodeType().getName())) { if (hasOrderedChildren) { @@ -293,44 +289,44 @@ private static void outputChildNodes(Node node, ChecksumGeneratorOptions opts, J } } - private static void outputPropertyValue(Property p, Value v, JSONWriter out) + private static void outputPropertyValue(Property property, Value value, JSONWriter out) throws RepositoryException, JSONException { - if (v.getType() == PropertyType.STRING) { - out.value(v.getString()); - } else if (v.getType() == PropertyType.BINARY) { + if (value.getType() == PropertyType.STRING) { + out.value(value.getString()); + } else if (value.getType() == PropertyType.BINARY) { try { - java.io.InputStream stream = v.getBinary().getStream(); + java.io.InputStream stream = value.getBinary().getStream(); String ckSum = DigestUtils.shaHex(stream); stream.close(); out.value(ckSum); } catch (IOException e) { - out.value("ERROR: calculating hash for binary of " + p.getPath() + " : " + e.getMessage()); + out.value("ERROR: calculating hash for binary of " + property.getPath() + " : " + e.getMessage()); } - } else if (v.getType() == PropertyType.BOOLEAN) { - out.value(v.getBoolean()); - } else if (v.getType() == PropertyType.DATE) { - Calendar cal = v.getDate(); + } else if (value.getType() == PropertyType.BOOLEAN) { + out.value(value.getBoolean()); + } else if (value.getType() == PropertyType.DATE) { + Calendar cal = value.getDate(); if (cal != null) { out.object(); out.key("type"); - out.value(PropertyType.nameFromValue(v.getType())); + out.value(PropertyType.nameFromValue(value.getType())); out.key("val"); out.value(cal.getTime().toString()); out.endObject(); } - } else if (v.getType() == PropertyType.LONG) { - out.value(v.getLong()); - } else if (v.getType() == PropertyType.DOUBLE) { - out.value(v.getDouble()); - } else if (v.getType() == PropertyType.DECIMAL) { - out.value(v.getDecimal()); + } else if (value.getType() == PropertyType.LONG) { + out.value(value.getLong()); + } else if (value.getType() == PropertyType.DOUBLE) { + out.value(value.getDouble()); + } else if (value.getType() == PropertyType.DECIMAL) { + out.value(value.getDecimal()); } else { out.object(); out.key("type"); - out.value(PropertyType.nameFromValue(v.getType())); + out.value(PropertyType.nameFromValue(value.getType())); out.key("val"); - out.value(v.getString()); + out.value(value.getString()); out.endObject(); } } diff --git a/bundle/src/main/java/com/adobe/acs/commons/analysis/jcrchecksum/impl/options/ChecksumGeneratorOptionsFactory.java b/bundle/src/main/java/com/adobe/acs/commons/analysis/jcrchecksum/impl/options/ChecksumGeneratorOptionsFactory.java index c621c2a86c..b6f7db2d19 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/analysis/jcrchecksum/impl/options/ChecksumGeneratorOptionsFactory.java +++ b/bundle/src/main/java/com/adobe/acs/commons/analysis/jcrchecksum/impl/options/ChecksumGeneratorOptionsFactory.java @@ -23,13 +23,10 @@ import com.adobe.acs.commons.analysis.jcrchecksum.ChecksumGeneratorOptions; import org.apache.commons.lang.StringUtils; import org.apache.sling.api.SlingHttpServletRequest; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.io.IOException; public class ChecksumGeneratorOptionsFactory { - private static final Logger log = LoggerFactory.getLogger(ChecksumGeneratorOptionsFactory.class); private ChecksumGeneratorOptionsFactory() { // Private cstor diff --git a/bundle/src/main/java/com/adobe/acs/commons/analysis/jcrchecksum/impl/options/CustomChecksumGeneratorOptions.java b/bundle/src/main/java/com/adobe/acs/commons/analysis/jcrchecksum/impl/options/CustomChecksumGeneratorOptions.java index e700d61a46..dd00c21988 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/analysis/jcrchecksum/impl/options/CustomChecksumGeneratorOptions.java +++ b/bundle/src/main/java/com/adobe/acs/commons/analysis/jcrchecksum/impl/options/CustomChecksumGeneratorOptions.java @@ -20,57 +20,48 @@ package com.adobe.acs.commons.analysis.jcrchecksum.impl.options; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.util.Collection; public class CustomChecksumGeneratorOptions extends AbstractChecksumGeneratorOptions { - private static final Logger log = LoggerFactory.getLogger(DefaultChecksumGeneratorOptions.class); - - public CustomChecksumGeneratorOptions() { - - } @Override public void addIncludedNodeTypes(String[] arr) { super.addIncludedNodeTypes(arr); } - @Override - public void addExcludedNodeTypes(String[] arr) { - super.addExcludedNodeTypes(arr); - } - - @Override - public void addExcludedProperties(String[] arr) { - super.addExcludedProperties(arr); - } - - @Override - public void addSortedProperties(String[] arr) { - super.addSortedProperties(arr); - } - - public void addIncludedNodeTypes(Collection col) { if (col != null) { super.addIncludedNodeTypes(col.toArray(new String[col.size()])); } } + @Override + public void addExcludedNodeTypes(String[] arr) { + super.addExcludedNodeTypes(arr); + } + public void addExcludedNodeTypes(Collection col) { if (col != null) { super.addExcludedNodeTypes(col.toArray(new String[col.size()])); } } + @Override + public void addExcludedProperties(String[] arr) { + super.addExcludedProperties(arr); + } + public void addExcludedProperties(Collection col) { if (col != null) { super.addExcludedProperties(col.toArray(new String[col.size()])); } } + @Override + public void addSortedProperties(String[] arr) { + super.addSortedProperties(arr); + } + public void addSortedProperties(Collection col) { if (col != null) { super.addSortedProperties(col.toArray(new String[col.size()])); diff --git a/bundle/src/main/java/com/adobe/acs/commons/analysis/jcrchecksum/impl/options/DefaultChecksumGeneratorOptions.java b/bundle/src/main/java/com/adobe/acs/commons/analysis/jcrchecksum/impl/options/DefaultChecksumGeneratorOptions.java index 2f50713931..50bf77448a 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/analysis/jcrchecksum/impl/options/DefaultChecksumGeneratorOptions.java +++ b/bundle/src/main/java/com/adobe/acs/commons/analysis/jcrchecksum/impl/options/DefaultChecksumGeneratorOptions.java @@ -22,12 +22,9 @@ import aQute.bnd.annotation.ProviderType; import org.apache.sling.api.SlingHttpServletRequest; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; @ProviderType public class DefaultChecksumGeneratorOptions extends AbstractChecksumGeneratorOptions { - private static final Logger log = LoggerFactory.getLogger(DefaultChecksumGeneratorOptions.class); public DefaultChecksumGeneratorOptions() { diff --git a/bundle/src/main/java/com/adobe/acs/commons/analysis/jcrchecksum/impl/options/RequestChecksumGeneratorOptions.java b/bundle/src/main/java/com/adobe/acs/commons/analysis/jcrchecksum/impl/options/RequestChecksumGeneratorOptions.java index 5b64065570..126a3a5e71 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/analysis/jcrchecksum/impl/options/RequestChecksumGeneratorOptions.java +++ b/bundle/src/main/java/com/adobe/acs/commons/analysis/jcrchecksum/impl/options/RequestChecksumGeneratorOptions.java @@ -26,8 +26,6 @@ import org.apache.sling.api.request.RequestParameter; import org.apache.sling.api.resource.Resource; import org.apache.sling.api.resource.ResourceResolver; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.io.BufferedReader; import java.io.IOException; @@ -43,7 +41,6 @@ @ProviderType public class RequestChecksumGeneratorOptions extends AbstractChecksumGeneratorOptions { - private static final Logger log = LoggerFactory.getLogger(RequestChecksumGeneratorOptions.class); public RequestChecksumGeneratorOptions(SlingHttpServletRequest request) throws IOException { this.addIncludedNodeTypes(request.getParameterValues(NODES_TYPES)); @@ -101,27 +98,14 @@ private static Set getPathsFromInputstream(InputStream is, String encodi Set paths = new HashSet(); encoding = (encoding != null) ? encoding : Charset.defaultCharset().name(); - BufferedReader br = new BufferedReader(new InputStreamReader(is, encoding)); - try { + try (BufferedReader br = new BufferedReader(new InputStreamReader(is, encoding))) { String path; while ((path = br.readLine()) != null) { paths.add(path); } - } finally { - if (br != null) { - br.close(); - } } return paths; } - - private static List asList(String[] arr) { - if (arr == null) { - return Collections.EMPTY_LIST; - } else { - return Arrays.asList(arr); - } - } } \ No newline at end of file diff --git a/bundle/src/main/java/com/adobe/acs/commons/analysis/jcrchecksum/impl/servlets/BaseChecksumServlet.java b/bundle/src/main/java/com/adobe/acs/commons/analysis/jcrchecksum/impl/servlets/BaseChecksumServlet.java index b79e91cb8f..03d222aa53 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/analysis/jcrchecksum/impl/servlets/BaseChecksumServlet.java +++ b/bundle/src/main/java/com/adobe/acs/commons/analysis/jcrchecksum/impl/servlets/BaseChecksumServlet.java @@ -30,7 +30,7 @@ /** * Provides CORS functionality required by the server-to-server XHR communication */ -@SuppressWarnings("serial") +@SuppressWarnings({"serial", "checkstyle:abbreviationaswordinname"}) public class BaseChecksumServlet extends SlingAllMethodsServlet { private static final String ACCESS_CONTROL_ALLOW_CREDENTIALS = "Access-Control-Allow-Credentials"; diff --git a/bundle/src/main/java/com/adobe/acs/commons/audit_log_search/AuditLogSearchRequest.java b/bundle/src/main/java/com/adobe/acs/commons/audit_log_search/AuditLogSearchRequest.java index 6fca5304ae..1896c3265b 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/audit_log_search/AuditLogSearchRequest.java +++ b/bundle/src/main/java/com/adobe/acs/commons/audit_log_search/AuditLogSearchRequest.java @@ -48,137 +48,137 @@ */ public class AuditLogSearchRequest { - private static final FastDateFormat HTML5_DATETIME_FORMAT = FastDateFormat.getInstance("yyyy-MM-dd'T'HH:mm", TimeZone.getTimeZone("GMT")); - private static final FastDateFormat QUERY_DATE_FORMAT = FastDateFormat.getInstance("yyyy-MM-dd'T'HH:mm:ss", TimeZone.getTimeZone("GMT")); - - private static String getJCRSQLDate(Date date) { - return QUERY_DATE_FORMAT.format(date) + ".000Z"; - } - - private final String contentRoot; - private final boolean includeChildren; - private final String type; - private final String user; - private final Date startDate; - private final Date endDate; - private final String order; - private Map userNames = new HashMap(); - - private Map userPaths = new HashMap(); - - /** - * Constructs a new AuditLogSearchRequest from the SlingHttpServletRequest - * - * @param request - * yep, that's a request... guess what it does - * @throws ParseException - * an exception occurred parsing the start / end date - */ - public AuditLogSearchRequest(SlingHttpServletRequest request) throws ParseException { - contentRoot = request.getParameter("contentRoot"); - includeChildren = "true".equals(request.getParameter("includeChildren")); - type = request.getParameter("type"); - user = request.getParameter("user"); - startDate = loadDate(request.getParameter("startDate")); - endDate = loadDate(request.getParameter("endDate")); - order = request.getParameter("order"); - } - - public String getContentRoot() { - return contentRoot; - } - - public Date getEndDate() { - return endDate; - } - - public String getOrder() { - return order; - } - - public String getQueryParameters() { - List expressions = new ArrayList(); - - if (!StringUtils.isEmpty(type)) { - expressions.add("[cq:type]='" + StringEscapeUtils.escapeSql(type) + "'"); - } - if (!StringUtils.isEmpty(user)) { - expressions.add("[cq:userid]='" + StringEscapeUtils.escapeSql(user) + "'"); - } - if (StringUtils.isNotEmpty(contentRoot)) { - if (includeChildren) { - expressions.add("[cq:path] LIKE '" + StringEscapeUtils.escapeSql(contentRoot) + "%'"); - } else { - expressions.add("[cq:path]='" + StringEscapeUtils.escapeSql(contentRoot) + "'"); - } - } - if (startDate != null) { - expressions.add("[cq:time] > CAST('" + getJCRSQLDate(startDate) + "' AS DATE)"); - } - if (endDate != null) { - expressions.add("[cq:time] < CAST('" + getJCRSQLDate(endDate) + "' AS DATE)"); - } - String q = StringUtils.join(expressions, " AND "); - if (!StringUtils.isEmpty(order)) { - q += " ORDER BY " + order; - } - return q; - } - - public Date getStartDate() { - return startDate; - } - - public String getType() { - return type; - } - - public String getUser() { - return user; - } - - public String getUserName(ResourceResolver resolver, String userId) throws RepositoryException { - if (!userNames.containsKey(userId)) { - final UserPropertiesManager upm = resolver.adaptTo(UserPropertiesManager.class); - UserProperties userProperties = upm.getUserProperties(userId, UserPropertiesService.PROFILE_PATH); - String name = userId; - if (userProperties != null && !StringUtils.isEmpty(userProperties.getDisplayName())) { - name = userProperties.getDisplayName(); - } - userNames.put(userId, name); - } - return userNames.get(userId); - } - - public String getUserPath(ResourceResolver resolver, String userId) - throws UnsupportedRepositoryOperationException, RepositoryException { - if (!userPaths.containsKey(userId)) { - final UserManager userManager = resolver.adaptTo(UserManager.class); - final Authorizable usr = userManager.getAuthorizable(userId); - if (usr != null) { - userPaths.put(userId, usr.getPath()); - } - } - return userPaths.get(userId); - } - - public boolean isIncludehildren() { - return includeChildren; - } - - private Date loadDate(String dateStr) throws ParseException { - Date date = null; - if (!StringUtils.isEmpty(dateStr)) { - date = HTML5_DATETIME_FORMAT.parse(dateStr); - } - return date; - } - - @Override - public String toString() { - return "AuditLogSearchRequest [contentRoot=" + contentRoot + ", includeChildren=" + includeChildren + ", type=" - + type + ", user=" + user + ", startDate=" + startDate + ", endDate=" + endDate + ", order=" + order - + ", userNames=" + userNames + ", userPaths=" + userPaths + "]"; - } + private static final FastDateFormat HTML5_DATETIME_FORMAT = FastDateFormat.getInstance("yyyy-MM-dd'T'HH:mm", TimeZone.getTimeZone("GMT")); + private static final FastDateFormat QUERY_DATE_FORMAT = FastDateFormat.getInstance("yyyy-MM-dd'T'HH:mm:ss", TimeZone.getTimeZone("GMT")); + + private static String getJcrSqlDate(Date date) { + return QUERY_DATE_FORMAT.format(date) + ".000Z"; + } + + private final String contentRoot; + private final boolean includeChildren; + private final String type; + private final String user; + private final Date startDate; + private final Date endDate; + private final String order; + private Map userNames = new HashMap(); + + private Map userPaths = new HashMap(); + + /** + * Constructs a new AuditLogSearchRequest from the SlingHttpServletRequest + * + * @param request + * yep, that's a request... guess what it does + * @throws ParseException + * an exception occurred parsing the start / end date + */ + public AuditLogSearchRequest(SlingHttpServletRequest request) throws ParseException { + contentRoot = request.getParameter("contentRoot"); + includeChildren = "true".equals(request.getParameter("includeChildren")); + type = request.getParameter("type"); + user = request.getParameter("user"); + startDate = loadDate(request.getParameter("startDate")); + endDate = loadDate(request.getParameter("endDate")); + order = request.getParameter("order"); + } + + public String getContentRoot() { + return contentRoot; + } + + public Date getEndDate() { + return endDate; + } + + public String getOrder() { + return order; + } + + public String getQueryParameters() { + List expressions = new ArrayList(); + + if (!StringUtils.isEmpty(type)) { + expressions.add("[cq:type]='" + StringEscapeUtils.escapeSql(type) + "'"); + } + if (!StringUtils.isEmpty(user)) { + expressions.add("[cq:userid]='" + StringEscapeUtils.escapeSql(user) + "'"); + } + if (StringUtils.isNotEmpty(contentRoot)) { + if (includeChildren) { + expressions.add("[cq:path] LIKE '" + StringEscapeUtils.escapeSql(contentRoot) + "%'"); + } else { + expressions.add("[cq:path]='" + StringEscapeUtils.escapeSql(contentRoot) + "'"); + } + } + if (startDate != null) { + expressions.add("[cq:time] > CAST('" + getJcrSqlDate(startDate) + "' AS DATE)"); + } + if (endDate != null) { + expressions.add("[cq:time] < CAST('" + getJcrSqlDate(endDate) + "' AS DATE)"); + } + String query = StringUtils.join(expressions, " AND "); + if (!StringUtils.isEmpty(order)) { + query += " ORDER BY " + order; + } + return query; + } + + public Date getStartDate() { + return startDate; + } + + public String getType() { + return type; + } + + public String getUser() { + return user; + } + + public String getUserName(ResourceResolver resolver, String userId) throws RepositoryException { + if (!userNames.containsKey(userId)) { + final UserPropertiesManager upm = resolver.adaptTo(UserPropertiesManager.class); + UserProperties userProperties = upm.getUserProperties(userId, UserPropertiesService.PROFILE_PATH); + String name = userId; + if (userProperties != null && !StringUtils.isEmpty(userProperties.getDisplayName())) { + name = userProperties.getDisplayName(); + } + userNames.put(userId, name); + } + return userNames.get(userId); + } + + public String getUserPath(ResourceResolver resolver, String userId) + throws UnsupportedRepositoryOperationException, RepositoryException { + if (!userPaths.containsKey(userId)) { + final UserManager userManager = resolver.adaptTo(UserManager.class); + final Authorizable usr = userManager.getAuthorizable(userId); + if (usr != null) { + userPaths.put(userId, usr.getPath()); + } + } + return userPaths.get(userId); + } + + public boolean isIncludehildren() { + return includeChildren; + } + + private Date loadDate(String dateStr) throws ParseException { + Date date = null; + if (!StringUtils.isEmpty(dateStr)) { + date = HTML5_DATETIME_FORMAT.parse(dateStr); + } + return date; + } + + @Override + public String toString() { + return "AuditLogSearchRequest [contentRoot=" + contentRoot + ", includeChildren=" + includeChildren + ", type=" + + type + ", user=" + user + ", startDate=" + startDate + ", endDate=" + endDate + ", order=" + order + + ", userNames=" + userNames + ", userPaths=" + userPaths + "]"; + } } diff --git a/bundle/src/main/java/com/adobe/acs/commons/audit_log_search/impl/AuditLogSearchServlet.java b/bundle/src/main/java/com/adobe/acs/commons/audit_log_search/impl/AuditLogSearchServlet.java index f8f2041139..d9cc44ed43 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/audit_log_search/impl/AuditLogSearchServlet.java +++ b/bundle/src/main/java/com/adobe/acs/commons/audit_log_search/impl/AuditLogSearchServlet.java @@ -1,4 +1,3 @@ - /* * #%L * ACS AEM Commons Bundle @@ -50,142 +49,135 @@ import java.util.Set; @SlingServlet(label = "ACS AEM Commons - Audit Log Search Servlet", methods = { "GET" }, resourceTypes = { - "acs-commons/components/utilities/audit-log-search" }, selectors = { - "auditlogsearch" }, extensions = { "json" }, metatype = true) + "acs-commons/components/utilities/audit-log-search" }, selectors = { + "auditlogsearch" }, extensions = { "json" }, metatype = true) +@SuppressWarnings("serial") public class AuditLogSearchServlet extends SlingSafeMethodsServlet { - private static final long serialVersionUID = 7661105540626580845L; - - private static final Logger log = LoggerFactory.getLogger(AuditLogSearchServlet.class); - - /* - * (non-Javadoc) - * - * @see - * org.apache.sling.api.servlets.SlingSafeMethodsServlet#doGet(org.apache. - * sling.api.SlingHttpServletRequest, - * org.apache.sling.api.SlingHttpServletResponse) - */ - @Override - protected final void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) - throws ServletException, IOException { - - log.trace("doGet"); - - AuditLogSearchRequest req = null; - try { - JSONObject result = new JSONObject(); - boolean succeeded = true; - try { - req = new AuditLogSearchRequest(request); - log.debug("Loaded search request: {}", req); - - JSONArray results = new JSONArray(); - long count = 0; - String whereClause = req.getQueryParameters(); - StringBuilder queryBuilder = new StringBuilder("SELECT * FROM [cq:AuditEvent] AS s"); - if (StringUtils.isNotEmpty(whereClause)) { - queryBuilder.append(" WHERE ").append(whereClause); - } - String queryStr = queryBuilder.toString(); - log.debug("Finding audit events with: {}", queryStr); - ResourceResolver resolver = request.getResourceResolver(); - QueryManager queryManager = resolver.adaptTo(Session.class).getWorkspace().getQueryManager(); - Query query = queryManager.createQuery(queryStr, Query.JCR_SQL2); - - int limit = -1; - if (StringUtils.isNotEmpty(request.getParameter("limit"))) { - limit = Integer.parseInt(request.getParameter("limit"), 10); - if (limit > 0) { - log.debug("Limiting to {} results", limit); - query.setLimit(limit); - } - } - - NodeIterator nodes = query.execute().getNodes(); - log.debug("Query execution complete!"); - while (nodes.hasNext()) { - results.put(serializeAuditEvent(resolver.getResource(nodes.nextNode().getPath()), req)); - count++; - } - result.put("count", count); - result.put("events", results); - log.debug("Found {} audit events", count); - } catch (ParseException e) { - log.warn("Encountered exception parsing start / end date", e); - succeeded = false; - } catch (RepositoryException e) { - log.warn("Encountered respository exception attempting to retrieve audit events", e); - succeeded = false; - } catch (ClassNotFoundException e) { - log.warn("Encountered exception deserializing attributes", e); - succeeded = false; - } - - result.put("succeeded", succeeded); - - response.setContentType("application/json"); - response.getWriter().write(result.toString()); - } catch (JSONException e) { - throw new ServletException("Failed to serialize JSON", e); - } - } - - private JSONObject serializeAuditEvent(Resource auditEventResource, AuditLogSearchRequest request) - throws JSONException, RepositoryException, IOException, ClassNotFoundException { - JSONObject auditEvent = new JSONObject(); - ValueMap properties = auditEventResource.getValueMap(); - auditEvent.put("category", properties.get("cq:category", String.class)); - auditEvent.put("eventPath", auditEventResource.getPath()); - auditEvent.put("path", properties.get("cq:path", String.class)); - auditEvent.put("type", properties.get("cq:type", String.class)); - String userId = properties.get("cq:userid", String.class); - auditEvent.put("userId", userId); - auditEvent.put("userName", request.getUserName(auditEventResource.getResourceResolver(), userId)); - auditEvent.put("userPath", request.getUserPath(auditEventResource.getResourceResolver(), userId)); - auditEvent.put("time", properties.get("cq:time", new Date()).getTime()); - - JSONArray modified = getModifiedProperties(properties); - if (properties.get("above", String.class) != null) { - modified.put("above=" + properties.get("above", String.class)); - } - if (properties.get("destination", String.class) != null) { - modified.put("destination=" + properties.get("destination", String.class)); - } - if (properties.get("versionId", String.class) != null) { - modified.put("versionId=" + properties.get("versionId", String.class)); - } - if (modified.length() != 0) { - auditEvent.put("modified", modified); - } - - return auditEvent; - } - - @SuppressWarnings("unchecked") - private JSONArray getModifiedProperties(ValueMap properties) throws IOException { - JSONArray modifiedProperties = new JSONArray(); - InputStream is = properties.get("cq:properties", InputStream.class); - if (is != null) { - ObjectInputStream ois = new ObjectInputStream(is); - ois.readInt(); - - while (ois.available() != -1) { - try { - Object obj = ois.readObject(); - if (obj instanceof HashSet) { - Set propertiesSet = (Set) obj; - for (String property : propertiesSet) { - modifiedProperties.put(property); - } - break; - } - } catch (Exception e) { - break; - } - } - } - return modifiedProperties; - } + private static final Logger log = LoggerFactory.getLogger(AuditLogSearchServlet.class); + + + @Override + @SuppressWarnings("squid:S1141") + protected final void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) + throws ServletException, IOException { + + log.trace("doGet"); + + AuditLogSearchRequest req = null; + try { + JSONObject result = new JSONObject(); + boolean succeeded = true; + try { + req = new AuditLogSearchRequest(request); + log.debug("Loaded search request: {}", req); + + JSONArray results = new JSONArray(); + long count = 0; + String whereClause = req.getQueryParameters(); + StringBuilder queryBuilder = new StringBuilder("SELECT * FROM [cq:AuditEvent] AS s"); + if (StringUtils.isNotEmpty(whereClause)) { + queryBuilder.append(" WHERE ").append(whereClause); + } + String queryStr = queryBuilder.toString(); + log.debug("Finding audit events with: {}", queryStr); + ResourceResolver resolver = request.getResourceResolver(); + QueryManager queryManager = resolver.adaptTo(Session.class).getWorkspace().getQueryManager(); + Query query = queryManager.createQuery(queryStr, Query.JCR_SQL2); + + int limit = -1; + if (StringUtils.isNotEmpty(request.getParameter("limit"))) { + limit = Integer.parseInt(request.getParameter("limit"), 10); + if (limit > 0) { + log.debug("Limiting to {} results", limit); + query.setLimit(limit); + } + } + + NodeIterator nodes = query.execute().getNodes(); + log.debug("Query execution complete!"); + while (nodes.hasNext()) { + results.put(serializeAuditEvent(resolver.getResource(nodes.nextNode().getPath()), req)); + count++; + } + result.put("count", count); + result.put("events", results); + log.debug("Found {} audit events", count); + } catch (ParseException e) { + log.warn("Encountered exception parsing start / end date", e); + succeeded = false; + } catch (RepositoryException e) { + log.warn("Encountered respository exception attempting to retrieve audit events", e); + succeeded = false; + } catch (ClassNotFoundException e) { + log.warn("Encountered exception deserializing attributes", e); + succeeded = false; + } + + result.put("succeeded", succeeded); + + response.setContentType("application/json"); + response.getWriter().write(result.toString()); + } catch (JSONException e) { + throw new ServletException("Failed to serialize JSON", e); + } + } + + private JSONObject serializeAuditEvent(Resource auditEventResource, AuditLogSearchRequest request) + throws JSONException, RepositoryException, IOException, ClassNotFoundException { + JSONObject auditEvent = new JSONObject(); + ValueMap properties = auditEventResource.getValueMap(); + auditEvent.put("category", properties.get("cq:category", String.class)); + auditEvent.put("eventPath", auditEventResource.getPath()); + auditEvent.put("path", properties.get("cq:path", String.class)); + auditEvent.put("type", properties.get("cq:type", String.class)); + String userId = properties.get("cq:userid", String.class); + auditEvent.put("userId", userId); + auditEvent.put("userName", request.getUserName(auditEventResource.getResourceResolver(), userId)); + auditEvent.put("userPath", request.getUserPath(auditEventResource.getResourceResolver(), userId)); + auditEvent.put("time", properties.get("cq:time", new Date()).getTime()); + + JSONArray modified = getModifiedProperties(properties); + if (properties.get("above", String.class) != null) { + modified.put("above=" + properties.get("above", String.class)); + } + if (properties.get("destination", String.class) != null) { + modified.put("destination=" + properties.get("destination", String.class)); + } + if (properties.get("versionId", String.class) != null) { + modified.put("versionId=" + properties.get("versionId", String.class)); + } + if (modified.length() != 0) { + auditEvent.put("modified", modified); + } + + return auditEvent; + } + + @SuppressWarnings("unchecked") + private JSONArray getModifiedProperties(ValueMap properties) throws IOException { + JSONArray modifiedProperties = new JSONArray(); + InputStream is = properties.get("cq:properties", InputStream.class); + if (is != null) { + ObjectInputStream ois = new ObjectInputStream(is); + ois.readInt(); + + while (ois.available() != -1) { + try { + Object obj = ois.readObject(); + if (obj instanceof HashSet) { + Set propertiesSet = (Set) obj; + for (String property : propertiesSet) { + modifiedProperties.put(property); + } + break; + } + } catch (Exception e) { + break; + } + } + } + return modifiedProperties; + } } diff --git a/bundle/src/main/java/com/adobe/acs/commons/components/longformtext/LongFormTextComponent.java b/bundle/src/main/java/com/adobe/acs/commons/components/longformtext/LongFormTextComponent.java index b33ed1b5f3..a5ef753a12 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/components/longformtext/LongFormTextComponent.java +++ b/bundle/src/main/java/com/adobe/acs/commons/components/longformtext/LongFormTextComponent.java @@ -25,6 +25,7 @@ import javax.jcr.RepositoryException; @ProviderType +@SuppressWarnings("squid:S1214") public interface LongFormTextComponent { String LONG_FORM_TEXT_PAR = "long-form-text-par-"; diff --git a/bundle/src/main/java/com/adobe/acs/commons/contentfinder/querybuilder/impl/ContentFinderHitBuilder.java b/bundle/src/main/java/com/adobe/acs/commons/contentfinder/querybuilder/impl/ContentFinderHitBuilder.java index fed0deb1d6..16885669ee 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/contentfinder/querybuilder/impl/ContentFinderHitBuilder.java +++ b/bundle/src/main/java/com/adobe/acs/commons/contentfinder/querybuilder/impl/ContentFinderHitBuilder.java @@ -36,6 +36,8 @@ import java.util.LinkedHashMap; import java.util.Map; +import static com.adobe.acs.commons.contentfinder.querybuilder.impl.viewhandler.ContentFinderConstants.*; + public final class ContentFinderHitBuilder { private static final Long ONE_MILLION = 1000000L; @@ -116,13 +118,13 @@ private static Map addPageData(final Page page, final Hit hit, M } } - map.put("path", page.getPath()); - map.put("name", page.getName()); - map.put("title", title); - map.put("excerpt", excerpt); - map.put("ddGroups", "page"); - map.put("type", "Page"); - map.put("lastModified", getLastModified(page)); + map.put(CF_PATH, page.getPath()); + map.put(CF_NAME, page.getName()); + map.put(CF_TITLE, title); + map.put(CF_EXCERPT, excerpt); + map.put(CF_DD_GROUPS, "page"); + map.put(CF_TYPE, "Page"); + map.put(CF_LAST_MODIFIED, getLastModified(page)); return map; } @@ -153,15 +155,15 @@ private static Map addAssetData(final Asset asset, final Hit hit } } - map.put("path", asset.getPath()); - map.put("name", asset.getName()); - map.put("title", title); - map.put("excerpt", excerpt); - map.put("mimeType", asset.getMimeType()); - map.put("size", getSize(asset)); - map.put("ck", getCK(asset)); - map.put("type", "Asset"); - map.put("lastModified", getLastModified(asset)); + map.put(CF_PATH, asset.getPath()); + map.put(CF_NAME, asset.getName()); + map.put(CF_TITLE, title); + map.put(CF_EXCERPT, excerpt); + map.put(CF_MIMETYPE, asset.getMimeType()); + map.put(CF_SIZE, getSize(asset)); + map.put(CF_CACHE_KILLER, getCacheKiller(asset)); + map.put(CF_TYPE, "Asset"); + map.put(CF_LAST_MODIFIED, getLastModified(asset)); return map; } @@ -179,12 +181,12 @@ private static Map addOtherData(final Hit hit, Map addName(final SlingHttpServletRequest request, return map; } + @SuppressWarnings("squid:S3776") public static Map addOrder(final SlingHttpServletRequest request, Map map, final String queryString) { if (has(request, CF_ORDER)) { @@ -113,11 +95,10 @@ public static Map addOrder(final SlingHttpServletRequest request int count = 1; for (String value : getAll(request, CF_ORDER)) { value = StringUtils.trim(value); - final String orderGroupId = String.valueOf(GROUP_ORDERBY_USERDEFINED + count) + "_orderby"; + final String orderGroupId = String.valueOf(GROUP_ORDERBY_USERDEFINED + count) + SUFFIX_ORDERBY; boolean sortAsc = false; if (StringUtils.startsWith(value, "-")) { - sortAsc = false; value = StringUtils.removeStart(value, "-"); } else if (StringUtils.startsWith(value, "+")) { sortAsc = true; @@ -137,19 +118,19 @@ public static Map addOrder(final SlingHttpServletRequest request final String prefix = getPropertyPrefix(request); if (StringUtils.isNotBlank(queryString)) { - map.put(GROUP_ORDERBY_SCORE + "_orderby", "@" + JcrConstants.JCR_SCORE); - map.put(GROUP_ORDERBY_SCORE + "_orderby.sort", Predicate.SORT_DESCENDING); + map.put(GROUP_ORDERBY_SCORE + SUFFIX_ORDERBY, AT + JcrConstants.JCR_SCORE); + map.put(GROUP_ORDERBY_SCORE + SUFFIX_ORDERBY_SORT, Predicate.SORT_DESCENDING); } - String modifiedOrderProperty = "@" + JcrConstants.JCR_LASTMODIFIED; + String modifiedOrderProperty = AT + JcrConstants.JCR_LASTMODIFIED; if (isPage) { - modifiedOrderProperty = "@" + prefix + NameConstants.PN_PAGE_LAST_MOD; + modifiedOrderProperty = AT + prefix + NameConstants.PN_PAGE_LAST_MOD; } else if (isAsset) { - modifiedOrderProperty = "@" + prefix + JcrConstants.JCR_LASTMODIFIED; + modifiedOrderProperty = AT + prefix + JcrConstants.JCR_LASTMODIFIED; } - map.put(GROUP_ORDERBY_MODIFIED + "_orderby", modifiedOrderProperty); - map.put(GROUP_ORDERBY_MODIFIED + "_orderby.sort", Predicate.SORT_DESCENDING); + map.put(GROUP_ORDERBY_MODIFIED + SUFFIX_ORDERBY, modifiedOrderProperty); + map.put(GROUP_ORDERBY_MODIFIED + SUFFIX_ORDERBY_SORT, Predicate.SORT_DESCENDING); } return map; @@ -172,20 +153,20 @@ public static Map addTags(final SlingHttpServletRequest request, if (has(request, CF_TAGS)) { final String prefix = getPropertyPrefix(request); - final String groupId = GROUP_TAGS + "_group"; + final String groupId = GROUP_TAGS + SUFFIX_GROUP; final String tagProperty = prefix + NameConstants.PN_TAGS; - map.put(groupId + ".p.or", "true"); + map.put(groupId + SUFFIX_P_OR, "true"); if (hasMany(request, CF_TAGS)) { final String[] tags = getAll(request, CF_TAGS); - int i = 1; + int counter = 1; for (final String tag : tags) { - map.put(groupId + "." + i + "_tagid.property", tagProperty); - map.put(groupId + "." + i + "_tagid", tag); + map.put(groupId + "." + counter + "_tagid.property", tagProperty); + map.put(groupId + "." + counter + "_tagid", tag); - i++; + counter++; } } else { map.put(groupId + ".1_tagid.property", tagProperty); @@ -196,13 +177,14 @@ public static Map addTags(final SlingHttpServletRequest request, return map; } + @SuppressWarnings("squid:S1172") public static Map addFulltext(final SlingHttpServletRequest request, Map map, final String queryString) { if (StringUtils.isNotBlank(queryString)) { - final String groupId = GROUP_FULLTEXT + "_group"; + final String groupId = GROUP_FULLTEXT + SUFFIX_GROUP; map.put(groupId + "." + FulltextPredicateEvaluator.FULLTEXT, queryString); - map.put(groupId + ".p.or", "true"); + map.put(groupId + SUFFIX_P_OR, "true"); } return map; } @@ -340,7 +322,7 @@ public static Map putProperty(SlingHttpServletRequest request, M */ public static Map putAll(Map map, String predicate, String[] values, int group, boolean or) { - final String groupId = String.valueOf(group) + "_group"; + final String groupId = String.valueOf(group) + SUFFIX_GROUP; int count = 1; for (final String value : values) { @@ -350,7 +332,7 @@ public static Map putAll(Map map, String predica count++; } - map.put(groupId + ".p.or", String.valueOf(or)); + map.put(groupId + SUFFIX_P_OR, String.valueOf(or)); return map; } @@ -367,7 +349,7 @@ public static Map putAll(Map map, String predica */ public static Map putAll(Map map, String predicate, String predicateValue, String predicateSuffix, String[] values, int group, boolean or) { - final String groupId = String.valueOf(group) + "_group"; + final String groupId = String.valueOf(group) + SUFFIX_GROUP; map.put(groupId + "." + predicate, predicateValue); @@ -379,7 +361,7 @@ public static Map putAll(Map map, String predica count++; } - map.put(groupId + ".p.or", String.valueOf(or)); + map.put(groupId + SUFFIX_P_OR, String.valueOf(or)); return map; } @@ -467,14 +449,9 @@ public static int getOffset(final SlingHttpServletRequest request) { final String value = get(request, CF_LIMIT); final String[] offsets = StringUtils.split(value, ".."); - if (value.matches("^(\\d)+\\.\\.(\\d)+$")) { - // 10..20 - return Integer.parseInt(offsets[0]); - } else if (value.matches("^\\.\\.(\\d)+$")) { - // ..20 - return Integer.parseInt(offsets[0]); - } else if (value.matches("^(\\d)+\\.\\.$")) { - // 20.. + if (value.matches("^(\\d)+\\.\\.(\\d)+$") // 10..20 + || value.matches("^\\.\\.(\\d)+$") // ..20 + || value.matches("^(\\d)+\\.\\.$") ) { // 20.. return Integer.parseInt(offsets[0]); } log.info("Could not find valid OFFSET for QueryBuilder-based ContentFinder: {}", value); diff --git a/bundle/src/main/java/com/adobe/acs/commons/dam/ColorConversion.java b/bundle/src/main/java/com/adobe/acs/commons/dam/ColorConversion.java index 899673cdb4..3921153c09 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/dam/ColorConversion.java +++ b/bundle/src/main/java/com/adobe/acs/commons/dam/ColorConversion.java @@ -25,6 +25,7 @@ * Service interface for performing color space conversion operations. */ @ProviderType +@SuppressWarnings("checkstyle:abbreviationaswordinname") public interface ColorConversion { /** @@ -57,15 +58,16 @@ public RGB(int red, int green, int blue) { @Override public String toString() { - return "RGB{" + - "red=" + red + - ", green=" + green + - ", blue=" + blue + - '}'; + return "RGB{" + + "red=" + red + + ", green=" + green + + ", blue=" + blue + + '}'; } } @ProviderType + @SuppressWarnings({"checkstyle:membername", "checkstyle:parametername"}) final class LAB { public final float lightness; public final int a; @@ -79,11 +81,11 @@ public LAB(float lightness, int a, int b) { @Override public String toString() { - return "LAB{" + - "lightness=" + lightness + - ", a=" + a + - ", b=" + b + - '}'; + return "LAB{" + + "lightness=" + lightness + + ", a=" + a + + ", b=" + b + + '}'; } } @@ -103,12 +105,12 @@ public CMYK(int cyan, int magenta, int yellow, int black) { @Override public String toString() { - return "CYMK{" + - "cyan=" + cyan + - ", magenta=" + magenta + - ", yellow=" + yellow + - ", black=" + black + - '}'; + return "CYMK{" + + "cyan=" + cyan + + ", magenta=" + magenta + + ", yellow=" + yellow + + ", black=" + black + + '}'; } } } diff --git a/bundle/src/main/java/com/adobe/acs/commons/dam/RenditionPatternPicker.java b/bundle/src/main/java/com/adobe/acs/commons/dam/RenditionPatternPicker.java index 848460d65e..95a1523f34 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/dam/RenditionPatternPicker.java +++ b/bundle/src/main/java/com/adobe/acs/commons/dam/RenditionPatternPicker.java @@ -42,20 +42,20 @@ public class RenditionPatternPicker implements RenditionPicker { * Create an Asset Rendition Picker that will pick a Rendition by matching * the supplied Regex pattern (as String). * - * @param p Regex pattern to match against Rendition names. + * @param pattern Regex pattern to match against Rendition names. */ - public RenditionPatternPicker(String p) { - this.pattern = Pattern.compile(p); + public RenditionPatternPicker(String pattern) { + this.pattern = Pattern.compile(pattern); } /** * Create an Asset Rendition Picker that will pick a Rendition by matching * the supplied Regex pattern. * - * @param p Pattern used to find the Asset rendition + * @param pattern Pattern used to find the Asset rendition */ - public RenditionPatternPicker(final Pattern p) { - this.pattern = p; + public RenditionPatternPicker(final Pattern pattern) { + this.pattern = pattern; } private Pattern getPattern() { diff --git a/bundle/src/main/java/com/adobe/acs/commons/dam/audio/impl/AudioHelperImpl.java b/bundle/src/main/java/com/adobe/acs/commons/dam/audio/impl/AudioHelperImpl.java index 0ab04ddf5d..0eb88a27b9 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/dam/audio/impl/AudioHelperImpl.java +++ b/bundle/src/main/java/com/adobe/acs/commons/dam/audio/impl/AudioHelperImpl.java @@ -59,31 +59,34 @@ public class AudioHelperImpl implements AudioHelper { protected final void activate(ComponentContext ctx) { String slingHome = ctx.getBundleContext().getProperty("sling.home"); workingDir = FFMpegAudioUtils.resolveWorkingDir(slingHome, (String) ctx.getProperties().get(PROP_WORKING_DIR)); - if (!workingDir.exists()) { - if (!workingDir.mkdirs()) { - throw new IllegalStateException("Could not create " + workingDir.getPath()); - } + if (!workingDir.exists() && !workingDir.mkdirs()) { + throw new IllegalStateException("Could not create " + workingDir.getPath()); } } @Override + @SuppressWarnings("squid:S2095") public R process(Asset asset, ResourceResolver resourceResolver, A args, AudioProcessor audioProcessor) throws AudioException { File tmpDir = null; File tmpWorkingDir = null; - FileOutputStream fos = null; - InputStream is = null; + try { // creating temp directory tmpDir = FFMpegAudioUtils.createTempDir(null); // creating temp working directory for ffmpeg tmpWorkingDir = FFMpegAudioUtils.createTempDir(workingDir); + } catch (IOException e) { + throw new AudioException(e); + } + + // streaming file to temp directory + final File tmpFile = new File(tmpDir, asset.getName().replace(' ', '_')); + + try (FileOutputStream fos = new FileOutputStream(tmpFile); + InputStream is = asset.getOriginal().getStream();) { - // streaming file to temp directory - final File tmpFile = new File(tmpDir, asset.getName().replace(' ', '_')); - fos = new FileOutputStream(tmpFile); - is = asset.getOriginal().getStream(); IOUtils.copy(is, fos); return audioProcessor.processAudio(asset, resourceResolver, tmpFile, locator, tmpWorkingDir, args); @@ -94,8 +97,6 @@ public R process(Asset asset, ResourceResolver resourceResolver, A args, log.error(e.getMessage(), e); return null; } finally { - IOUtils.closeQuietly(is); - IOUtils.closeQuietly(fos); try { // cleaning up temp directory if (tmpDir != null) { diff --git a/bundle/src/main/java/com/adobe/acs/commons/dam/audio/impl/FFMpegAudioEncodeProcess.java b/bundle/src/main/java/com/adobe/acs/commons/dam/audio/impl/FFMpegAudioEncodeProcess.java index ae1d008a57..e7a113c88e 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/dam/audio/impl/FFMpegAudioEncodeProcess.java +++ b/bundle/src/main/java/com/adobe/acs/commons/dam/audio/impl/FFMpegAudioEncodeProcess.java @@ -22,6 +22,7 @@ import java.io.File; import java.io.FileInputStream; import java.io.IOException; +import java.nio.file.Files; import java.util.List; import javax.jcr.Node; @@ -61,6 +62,7 @@ @Component @Service(WorkflowProcess.class) @Properties({ @Property(name = "process.label", value = "Encode Audio") }) +@SuppressWarnings("checkstyle:abbreviationaswordinname") public final class FFMpegAudioEncodeProcess implements WorkflowProcess, AudioHelper.AudioProcessor { @Reference @@ -71,7 +73,7 @@ public final class FFMpegAudioEncodeProcess implements WorkflowProcess, AudioHel private static final Logger log = LoggerFactory.getLogger(FFMpegAudioEncodeProcess.class); - @SuppressWarnings("PMD.CollapsibleIfStatements") + @SuppressWarnings({"PMD.CollapsibleIfStatements", "squid:S1066"}) @Override public final void execute(WorkItem workItem, WorkflowSession wfSession, MetaDataMap metaData) throws WorkflowException { @@ -86,7 +88,7 @@ public final void execute(WorkItem workItem, WorkflowSession wfSession, MetaData } final String assetMimeType = pair.asset.getMimeType(); - if (assetMimeType == null || !assetMimeType.startsWith("audio/")) { + if ((assetMimeType == null || !assetMimeType.startsWith("audio/"))) { if (!pair.asset.getName().endsWith(".wav") || !pair.asset.getName().endsWith(".mp3") || !pair.asset.getName().endsWith(".ogg")) { log.info("execute: asset [{}] is not of a audio mime type, asset ignored.", pair.asset.getPath()); @@ -104,6 +106,7 @@ public final void execute(WorkItem workItem, WorkflowSession wfSession, MetaData } @Override + @SuppressWarnings({"squid:S3776", "squid:S1141"}) public Void processAudio(final Asset asset, final ResourceResolver resourceResolver, final File tempFile, final ExecutableLocator locator, final File workingDir, final MetaDataMap metaData) throws AudioException { @@ -125,8 +128,10 @@ public Void processAudio(final Asset asset, final ResourceResolver resourceResol final File transcodedAudio = ffmpegWrapper.transcode(); fis = new FileInputStream(transcodedAudio); asset.addRendition(renditionName, fis, ffmpegWrapper.getOutputMimetype()); - if (!transcodedAudio.delete()) { - log.error("Transcoded audio file @ {} coud not be deleted"); + try { + Files.delete(transcodedAudio.toPath()); + } catch (Exception e) { + log.error("Transcoded audio file @ " + transcodedAudio.getAbsolutePath() +" coud not be deleted", e); } } catch (IOException e) { log.error(e.getMessage(), e); diff --git a/bundle/src/main/java/com/adobe/acs/commons/dam/audio/impl/FFMpegAudioUtils.java b/bundle/src/main/java/com/adobe/acs/commons/dam/audio/impl/FFMpegAudioUtils.java index 520d70decf..b34d0ca39a 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/dam/audio/impl/FFMpegAudioUtils.java +++ b/bundle/src/main/java/com/adobe/acs/commons/dam/audio/impl/FFMpegAudioUtils.java @@ -19,13 +19,14 @@ */ package com.adobe.acs.commons.dam.audio.impl; -import org.apache.felix.scr.annotations.Property; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; import java.io.IOException; +import java.nio.file.Files; +@SuppressWarnings("checkstyle:abbreviationaswordinname") public class FFMpegAudioUtils { private static final Logger log = LoggerFactory.getLogger(FFMpegAudioUtils.class); @@ -65,18 +66,6 @@ public static File resolveWorkingDir(String slingHome, String path) { } public static final File createTempDir(File parentDir) throws IOException { - File tempDir = null; - try { - tempDir = File.createTempFile("cqdam", null, parentDir); - if (!tempDir.delete()) { - throw new IOException("Unable to delete temp directory."); - } - if (!tempDir.mkdir()) { - throw new IOException("Unable to create temp directory."); - } - } catch (IOException e) { - log.warn("could not create temp directory in the [{}] with the exception", parentDir, e); - } - return tempDir; + return Files.createTempDirectory(parentDir.toPath(), "cqdam").toFile(); } } diff --git a/bundle/src/main/java/com/adobe/acs/commons/dam/audio/watson/impl/TranscriptionProcess.java b/bundle/src/main/java/com/adobe/acs/commons/dam/audio/watson/impl/TranscriptionProcess.java index 2f99c2ecb1..6bf2180656 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/dam/audio/watson/impl/TranscriptionProcess.java +++ b/bundle/src/main/java/com/adobe/acs/commons/dam/audio/watson/impl/TranscriptionProcess.java @@ -48,6 +48,7 @@ import java.io.FileInputStream; import java.io.IOException; import java.io.Serializable; +import java.nio.file.Files; import java.util.Map; @Component(metatype = true, label = "ACS AEM Commons - Watson Transcription Workflow Process", @@ -104,6 +105,7 @@ public Serializable execute(WorkItem workItem, WorkflowSession workflowSession, } @Override + @SuppressWarnings("squid:S1141") public Serializable processAudio(Asset asset, ResourceResolver resourceResolver, File tempFile, ExecutableLocator locator, File workingDir, MetaDataMap args) throws AudioException { final long start = System.currentTimeMillis(); @@ -122,8 +124,10 @@ public Serializable processAudio(Asset asset, ResourceResolver resourceResolver, FileInputStream stream = new FileInputStream(transcodedAudio); jobId = transcriptionService.startTranscriptionJob(stream, ffmpegWrapper.getOutputMimetype()); IOUtils.closeQuietly(stream); - if (!transcodedAudio.delete()) { - log.error("Transcoded audio file @ {} coud not be deleted"); + try { + Files.delete(transcodedAudio.toPath()); + } catch (Exception e) { + log.error("Transcoded audio file @ " + transcodedAudio.getAbsolutePath() + " coud not be deleted", e); } } catch (IOException e) { log.error("processAudio: failed creating audio from profile [{}]: {}", diff --git a/bundle/src/main/java/com/adobe/acs/commons/dam/audio/watson/impl/TranscriptionServiceImpl.java b/bundle/src/main/java/com/adobe/acs/commons/dam/audio/watson/impl/TranscriptionServiceImpl.java index a880c10752..5f334ab19c 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/dam/audio/watson/impl/TranscriptionServiceImpl.java +++ b/bundle/src/main/java/com/adobe/acs/commons/dam/audio/watson/impl/TranscriptionServiceImpl.java @@ -46,15 +46,11 @@ public class TranscriptionServiceImpl implements TranscriptionService { @Reference(target = "(factory.name=watson-speech-to-text)") private HttpClientFactory httpClientFactory; - @Activate - protected void activate(Map config) { - } - @Override public String startTranscriptionJob(InputStream stream, String mimeType) { - Request request = httpClientFactory.post("/speech-to-text/api/v1/recognitions?continuous=true×tamps=true"). - addHeader("Content-Type", mimeType). - bodyStream(stream); + Request request = httpClientFactory.post("/speech-to-text/api/v1/recognitions?continuous=true×tamps=true") + .addHeader("Content-Type", mimeType) + .bodyStream(stream); try { JSONObject json = httpClientFactory.getExecutor().execute(request).handleResponse(HANDLER); diff --git a/bundle/src/main/java/com/adobe/acs/commons/dam/impl/AddWatermarkToRenditionProcess.java b/bundle/src/main/java/com/adobe/acs/commons/dam/impl/AddWatermarkToRenditionProcess.java index 03e5095054..aba13b2a77 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/dam/impl/AddWatermarkToRenditionProcess.java +++ b/bundle/src/main/java/com/adobe/acs/commons/dam/impl/AddWatermarkToRenditionProcess.java @@ -70,6 +70,7 @@ private static void logMissingWatermark(final String path) { log.warn("Watermark path {} is not found.", path); } } + private static void logInvalidWatermark(final String path) { if (watermarkLogCache.putIfAbsent(path, new Object()) == null) { log.warn("Watermark path {} is not valid.", path); diff --git a/bundle/src/main/java/com/adobe/acs/commons/dam/impl/AssetsFolderPropertiesSupport.java b/bundle/src/main/java/com/adobe/acs/commons/dam/impl/AssetsFolderPropertiesSupport.java index 914f0754e4..62e20c6ede 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/dam/impl/AssetsFolderPropertiesSupport.java +++ b/bundle/src/main/java/com/adobe/acs/commons/dam/impl/AssetsFolderPropertiesSupport.java @@ -21,7 +21,12 @@ package com.adobe.acs.commons.dam.impl; import org.apache.commons.lang3.StringUtils; -import org.apache.felix.scr.annotations.*; +import org.apache.felix.scr.annotations.Component; +import org.apache.felix.scr.annotations.ConfigurationPolicy; +import org.apache.felix.scr.annotations.Properties; +import org.apache.felix.scr.annotations.Property; +import org.apache.felix.scr.annotations.Reference; +import org.apache.felix.scr.annotations.Service; import org.apache.sling.api.SlingHttpServletRequest; import org.apache.sling.api.SlingHttpServletResponse; import org.apache.sling.api.resource.Resource; @@ -38,7 +43,12 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.servlet.*; +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.HashMap; @@ -148,6 +158,7 @@ public void process(SlingHttpServletRequest request, List changes) * @param request the request * @return true if Assets Folder Properties Support should process this request. */ + @SuppressWarnings("squid:S3923") protected boolean accepts(SlingHttpServletRequest request) { if (!StringUtils.equalsIgnoreCase(POST_METHOD, request.getMethod())) { // Only POST methods are processed @@ -170,7 +181,7 @@ protected boolean accepts(SlingHttpServletRequest request) { /** * This method handles the READING of the properties so that granite UI widgets can display stored data in the form. - * This needs to be included AFTER /apps/dam/gui/content/assets/foldersharewizard/jcr:content/body/items/form/items/wizard/items/settingStep/items/fixedColumns/items/fixedColumn2/items/tabs/items/tab1/items/folderproperties + * This needs to be included AFTER /apps/dam/gui/content/assets/foldersharewizard/jcr:content/body/items/form/items/wizard/items/settingStep/items/fixedColumns/items/fixedColumn2/items/tabs/items/tab1/items/folderproperties * such that it can augment the Property map constructed by that OOTB script. * * Note that this exposes a value map for the [sling:*Folder] node, and NOT the [sling:*Folder]/jcr:content, so properties must be prefixed with jcr:content/... diff --git a/bundle/src/main/java/com/adobe/acs/commons/dam/impl/ColorConversionImpl.java b/bundle/src/main/java/com/adobe/acs/commons/dam/impl/ColorConversionImpl.java index e6c4fc4682..fcf237d343 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/dam/impl/ColorConversionImpl.java +++ b/bundle/src/main/java/com/adobe/acs/commons/dam/impl/ColorConversionImpl.java @@ -35,6 +35,7 @@ @Component(label = "ACS AEM Commons - Color Conversion", description = "ACS AEM Commons - Color Conversion", metatype = true) @Service +@SuppressWarnings({"checkstyle:abbreviationaswordinname", "checkstyle:localvariablename"}) public final class ColorConversionImpl implements ColorConversion { private static final String DEFAULT_CMYK_PROFILE = "JapanColor2001Coated"; @@ -171,6 +172,7 @@ private XYZ toXYZ(LAB lab) { } + @SuppressWarnings("checkstyle.membername") private class XYZ { private double x; private double y; diff --git a/bundle/src/main/java/com/adobe/acs/commons/dam/impl/MatteRenditionProcess.java b/bundle/src/main/java/com/adobe/acs/commons/dam/impl/MatteRenditionProcess.java index 61e9c64ce7..4dbded8648 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/dam/impl/MatteRenditionProcess.java +++ b/bundle/src/main/java/com/adobe/acs/commons/dam/impl/MatteRenditionProcess.java @@ -44,6 +44,7 @@ @Component(metatype = false) @Service @Property(name = "process.label", value = "Matte Rendition") +@SuppressWarnings({"squid:S00115", "checkstyle:localvariablename"}) public final class MatteRenditionProcess extends AbstractRenditionModifyingProcess implements WorkflowProcess { private static final int RADIX_HEX = 16; diff --git a/bundle/src/main/java/com/adobe/acs/commons/dam/impl/ReviewTaskAssetMoverHandler.java b/bundle/src/main/java/com/adobe/acs/commons/dam/impl/ReviewTaskAssetMoverHandler.java index 990a0e8270..e296a39747 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/dam/impl/ReviewTaskAssetMoverHandler.java +++ b/bundle/src/main/java/com/adobe/acs/commons/dam/impl/ReviewTaskAssetMoverHandler.java @@ -31,6 +31,7 @@ import com.day.cq.search.Query; import com.day.cq.search.QueryBuilder; import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang.UnhandledException; import org.apache.felix.scr.annotations.Activate; import org.apache.felix.scr.annotations.Component; import org.apache.felix.scr.annotations.ConfigurationPolicy; @@ -115,6 +116,7 @@ public class ReviewTaskAssetMoverHandler implements EventHandler { private static final String SERVICE_NAME = "review-task-asset-mover"; private static final Map AUTH_INFO; + static { AUTH_INFO = Collections.singletonMap(ResourceResolverFactory.SUBSERVICE, (Object) SERVICE_NAME); } @@ -221,14 +223,7 @@ public void run() { while (assets.hasNext()) { final Asset asset = assets.next().adaptTo(Asset.class); - - try { - moveAsset(resourceResolver, assetManager, asset, taskProperties); - } catch (Exception e) { - log.error("Could not move reviewed asset [ {} ]", asset.getPath(), e); - resourceResolver.revert(); - resourceResolver.refresh(); - } + moveAsset(resourceResolver, assetManager, asset, taskProperties); } } } @@ -279,9 +274,9 @@ private Iterator findAssets(ResourceResolver resourceResolver, String * @param destPath the folder the asset will be moved into * @param assetName the asset name * @return a unique asset path to the asset - * @throws Exception + * @throws PersistenceException */ - private String createUniqueAssetPath(AssetManager assetManager, String destPath, String assetName) throws Exception { + private String createUniqueAssetPath(AssetManager assetManager, String destPath, String assetName) throws PersistenceException { final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); final String now = sdf.format(new Date()); String destAssetPath = destPath + "/" + assetName; @@ -289,7 +284,7 @@ private String createUniqueAssetPath(AssetManager assetManager, String destPath, int count = 0; while (assetManager.assetExists(destAssetPath)) { if (count > 1000) { - throw new Exception("Unable to generate a unique name after 1000 attempts. Something must be wrong!"); + throw new PersistenceException("Unable to generate a unique name after 1000 attempts. Something must be wrong!"); } if (count == 0) { @@ -352,60 +347,67 @@ private void createRevision(ResourceResolver resourceResolver, AssetManager asse * @param asset the asset to move * @param taskProperties the task properties containing the target onApproveMoveTo and onRejectMoveTo paths */ - private void moveAsset(ResourceResolver resourceResolver, AssetManager assetManager, Asset asset, ValueMap taskProperties) throws Exception { - final String status = asset.getValueMap().get(REL_PN_DAM_STATUS, String.class); - final String conflictResolution = taskProperties.get(PN_CONFLICT_RESOLUTION, defaultConflictResolution); - final String onApprovePath = taskProperties.get(PN_ON_APPROVE, String.class); - final String onRejectPath = taskProperties.get(PN_ON_REJECT, String.class); - - String destPath = null; - - if (StringUtils.equals(APPROVED, status)) { - destPath = onApprovePath; - } else if (StringUtils.equals(REJECTED, status)) { - destPath = onRejectPath; - } + @SuppressWarnings("squid:S3776") + private void moveAsset(ResourceResolver resourceResolver, AssetManager assetManager, Asset asset, ValueMap taskProperties) { + try { + final String status = asset.getValueMap().get(REL_PN_DAM_STATUS, String.class); + final String conflictResolution = taskProperties.get(PN_CONFLICT_RESOLUTION, defaultConflictResolution); + final String onApprovePath = taskProperties.get(PN_ON_APPROVE, String.class); + final String onRejectPath = taskProperties.get(PN_ON_REJECT, String.class); - if (destPath != null) { - if (StringUtils.startsWith(destPath, PATH_CONTENT_DAM)) { + String destPath = null; - String destAssetPath = destPath + "/" + asset.getName(); - final boolean exists = assetManager.assetExists(destAssetPath); + if (StringUtils.equals(APPROVED, status)) { + destPath = onApprovePath; + } else if (StringUtils.equals(REJECTED, status)) { + destPath = onRejectPath; + } - if (exists) { - if (StringUtils.equals(asset.getPath(), destAssetPath)) { - log.info("Reviewed asset [ {} ] is already in its final location, so there is nothing to do.", asset.getPath()); - } else if (CONFLICT_RESOLUTION_REPLACE.equals(conflictResolution)) { - assetManager.removeAsset(destAssetPath); - resourceResolver.commit(); - assetManager.moveAsset(asset.getPath(), destAssetPath); - log.info("Moved with replace [ {} ] ~> [ {} ] based on approval status [ {} ]", - new String[]{asset.getPath(), destAssetPath, status}); - } else if (CONFLICT_RESOLUTION_NEW_ASSET.equals(conflictResolution)) { - destAssetPath = createUniqueAssetPath(assetManager, destPath, asset.getName()); + if (destPath != null) { + if (StringUtils.startsWith(destPath, PATH_CONTENT_DAM)) { + + String destAssetPath = destPath + "/" + asset.getName(); + final boolean exists = assetManager.assetExists(destAssetPath); + + if (exists) { + if (StringUtils.equals(asset.getPath(), destAssetPath)) { + log.info("Reviewed asset [ {} ] is already in its final location, so there is nothing to do.", asset.getPath()); + } else if (CONFLICT_RESOLUTION_REPLACE.equals(conflictResolution)) { + assetManager.removeAsset(destAssetPath); + resourceResolver.commit(); + assetManager.moveAsset(asset.getPath(), destAssetPath); + log.info("Moved with replace [ {} ] ~> [ {} ] based on approval status [ {} ]", + new String[]{asset.getPath(), destAssetPath, status}); + } else if (CONFLICT_RESOLUTION_NEW_ASSET.equals(conflictResolution)) { + destAssetPath = createUniqueAssetPath(assetManager, destPath, asset.getName()); + assetManager.moveAsset(asset.getPath(), destAssetPath); + log.info("Moved with unique asset name [ {} ] ~> [ {} ] based on approval status [ {} ]", + new String[]{asset.getPath(), destAssetPath, status}); + } else if (CONFLICT_RESOLUTION_NEW_VERSION.equals(conflictResolution)) { + log.info("Creating new version of existing asset [ {} ] ~> [ {} ] based on approval status [ {} ]", + new String[]{asset.getPath(), destAssetPath, status}); + createRevision(resourceResolver, assetManager, assetManager.getAsset(destAssetPath), asset); + } else if (CONFLICT_RESOLUTION_SKIP.equals(conflictResolution)) { + log.info("Skipping with due to existing asset at the same destination [ {} ] ~> [ {} ] based on approval status [ {} ]", + new String[]{asset.getPath(), destAssetPath, status}); + } + } else { assetManager.moveAsset(asset.getPath(), destAssetPath); - log.info("Moved with unique asset name [ {} ] ~> [ {} ] based on approval status [ {} ]", - new String[]{asset.getPath(), destAssetPath, status}); - } else if (CONFLICT_RESOLUTION_NEW_VERSION.equals(conflictResolution)) { - log.info("Creating new version of existing asset [ {} ] ~> [ {} ] based on approval status [ {} ]", + log.info("Moved [ {} ] ~> [ {} ] based on approval status [ {} ]", new String[]{asset.getPath(), destAssetPath, status}); - createRevision(resourceResolver, assetManager, assetManager.getAsset(destAssetPath), asset); - } else if (CONFLICT_RESOLUTION_SKIP.equals(conflictResolution)) { - log.info("Skipping with due to existing asset at the same destination [ {} ] ~> [ {} ] based on approval status [ {} ]", - new String[] { asset.getPath(), destAssetPath, status }); } } else { - assetManager.moveAsset(asset.getPath(), destAssetPath); - log.info("Moved [ {} ] ~> [ {} ] based on approval status [ {} ]", - new String[]{asset.getPath(), destAssetPath, status}); + log.warn("Request to move reviewed asset to a non DAM Asset path [ {} ]", destPath); } - } else { - log.warn("Request to move reviewed asset to a non DAM Asset path [ {} ]", destPath); } - } - if (resourceResolver.hasChanges()) { - resourceResolver.commit(); + if (resourceResolver.hasChanges()) { + resourceResolver.commit(); + } + } catch (PersistenceException e) { + log.error("Could not move reviewed asset [ {} ]", asset.getPath(), e); + resourceResolver.revert(); + resourceResolver.refresh(); } } } diff --git a/bundle/src/main/java/com/adobe/acs/commons/designer/DesignHtmlLibraryManager.java b/bundle/src/main/java/com/adobe/acs/commons/designer/DesignHtmlLibraryManager.java index bba7bb2b36..89fd7c9043 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/designer/DesignHtmlLibraryManager.java +++ b/bundle/src/main/java/com/adobe/acs/commons/designer/DesignHtmlLibraryManager.java @@ -32,6 +32,7 @@ * A service interface for looking up client libraries based on a Design. */ @ProviderType +@SuppressWarnings("squid:S1214") public interface DesignHtmlLibraryManager { /** diff --git a/bundle/src/main/java/com/adobe/acs/commons/designer/impl/OptionsServlet.java b/bundle/src/main/java/com/adobe/acs/commons/designer/impl/OptionsServlet.java index e5d9bb4e4e..080bb86f2f 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/designer/impl/OptionsServlet.java +++ b/bundle/src/main/java/com/adobe/acs/commons/designer/impl/OptionsServlet.java @@ -51,6 +51,7 @@ public class OptionsServlet extends SlingSafeMethodsServlet { private HtmlLibraryManager libraryManager; @Override + @SuppressWarnings({"squid:S3776", "squid:S1141"}) protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException { response.setContentType("application/json"); diff --git a/bundle/src/main/java/com/adobe/acs/commons/email/impl/EmailServiceImpl.java b/bundle/src/main/java/com/adobe/acs/commons/email/impl/EmailServiceImpl.java index d6c89f7858..7c0631d032 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/email/impl/EmailServiceImpl.java +++ b/bundle/src/main/java/com/adobe/acs/commons/email/impl/EmailServiceImpl.java @@ -73,6 +73,7 @@ public final class EmailServiceImpl implements EmailService { private static final Logger log = LoggerFactory.getLogger(EmailServiceImpl.class); + private static final String MSG_INVALID_RECIPIENTS = "Invalid Recipients"; @Reference private MessageGatewayService messageGatewayService; @@ -109,7 +110,7 @@ public List sendEmail(final String templatePath, List failureList = new ArrayList(); if (recipients == null || recipients.length <= 0) { - throw new IllegalArgumentException("Invalid Recipients"); + throw new IllegalArgumentException(MSG_INVALID_RECIPIENTS); } List addresses = new ArrayList(recipients.length); @@ -138,7 +139,7 @@ public List sendEmail(final String templatePath, final Map failureList = new ArrayList(); if (recipients == null || recipients.length <= 0) { - throw new IllegalArgumentException("Invalid Recipients"); + throw new IllegalArgumentException(MSG_INVALID_RECIPIENTS); } final MailTemplate mailTemplate = this.getMailTemplate(templatePath); @@ -166,7 +167,7 @@ public List sendEmail(String templatePath, Map List failureList = new ArrayList(); if (recipients == null || recipients.length <= 0) { - throw new IllegalArgumentException("Invalid Recipients"); + throw new IllegalArgumentException(MSG_INVALID_RECIPIENTS); } final MailTemplate mailTemplate = this.getMailTemplate(templatePath); @@ -205,7 +206,7 @@ public List sendEmail(String templatePath, Map emailPara List failureList = new ArrayList(); if (recipients == null || recipients.length <= 0) { - throw new IllegalArgumentException("Invalid Recipients"); + throw new IllegalArgumentException(MSG_INVALID_RECIPIENTS); } List addresses = new ArrayList(recipients.length); diff --git a/bundle/src/main/java/com/adobe/acs/commons/email/process/impl/SendTemplatedEmailProcess.java b/bundle/src/main/java/com/adobe/acs/commons/email/process/impl/SendTemplatedEmailProcess.java index 52c3c64a02..079a2c853e 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/email/process/impl/SendTemplatedEmailProcess.java +++ b/bundle/src/main/java/com/adobe/acs/commons/email/process/impl/SendTemplatedEmailProcess.java @@ -110,7 +110,7 @@ public class SendTemplatedEmailProcess implements WorkflowProcess { * Service used to generate a link to the payload on author environment */ @Reference - private AuthorUIHelper authorUIHelper; + private AuthorUIHelper authorUiHelper; @Reference private ResourceResolverFactory resourceResolverFactory; @@ -203,16 +203,12 @@ public final void execute(WorkItem workItem, WorkflowSession workflowSession, Me } // Get Url params - Map urlParams = getURLs(payloadRes); - if (urlParams != null) { - emailParams.putAll(urlParams); - } + Map urlParams = getUrls(payloadRes); + emailParams.putAll(urlParams); // Get Additional Parameters to add Map wfParams = getAdditionalParams(workItem, workflowSession, payloadRes); - if (wfParams != null) { - emailParams.putAll(wfParams); - } + emailParams.putAll(wfParams); // get email addresses based on CQ user or group String[] emailTo = getEmailAddrs(workItem, payloadRes, args); @@ -292,7 +288,7 @@ protected Map getAdditionalParams(WorkItem workItem, WorkflowSes * @param arguments * @return String of the argument value or null if not found */ - protected String getValueFromArgs(String key, String arguments[]) { + protected String getValueFromArgs(String key, String[] arguments) { for (String str : arguments) { String trimmedStr = str.trim(); if (trimmedStr.startsWith(key + ":")) { @@ -309,7 +305,7 @@ protected String getValueFromArgs(String key, String arguments[]) { * @param payloadRes * @return */ - private Map getURLs(Resource payloadRes) { + private Map getUrls(Resource payloadRes) { Map urlParams = new HashMap(); if (payloadRes == null) { @@ -321,7 +317,7 @@ private Map getURLs(Resource payloadRes) { if (DamUtil.isAsset(payloadRes)) { // add author url - String assetDetailsUrl = authorUIHelper.generateEditAssetLink(payloadPath, true, resolver); + String assetDetailsUrl = authorUiHelper.generateEditAssetLink(payloadPath, true, resolver); urlParams.put(SendTemplatedEmailConstants.AUTHOR_LINK, assetDetailsUrl); // add publish url @@ -331,7 +327,7 @@ private Map getURLs(Resource payloadRes) { } else { // add absolute author url - String assetDetailsUrl = authorUIHelper.generateEditPageLink(payloadPath, true, resolver); + String assetDetailsUrl = authorUiHelper.generateEditPageLink(payloadPath, true, resolver); urlParams.put(SendTemplatedEmailConstants.AUTHOR_LINK, assetDetailsUrl); // add publish url diff --git a/bundle/src/main/java/com/adobe/acs/commons/email/process/impl/SendTemplatedEmailUtils.java b/bundle/src/main/java/com/adobe/acs/commons/email/process/impl/SendTemplatedEmailUtils.java index 796f2f59f6..74e0fc3fa9 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/email/process/impl/SendTemplatedEmailUtils.java +++ b/bundle/src/main/java/com/adobe/acs/commons/email/process/impl/SendTemplatedEmailUtils.java @@ -50,6 +50,8 @@ public class SendTemplatedEmailUtils { private static final String PN_USER_EMAIL = "profile/email"; + private SendTemplatedEmailUtils() {} + /*** * Tests whether the payload is a DAM asset or a cq:Page for DAM asset * returns all properties at the metadata node for DAM assets for cq:Page @@ -63,7 +65,7 @@ public class SendTemplatedEmailUtils { * used by the method to transform Date properties into Strings * @return Map String representation of jcr properties */ - protected final static Map getPayloadProperties(Resource payloadRes, SimpleDateFormat sdf) { + protected static final Map getPayloadProperties(Resource payloadRes, SimpleDateFormat sdf) { Map emailParams = new HashMap(); @@ -103,7 +105,8 @@ protected final static Map getPayloadProperties(Resource payload * path to a CQ user or group * @return String[] of email(s) associated with account */ - protected final static String[] getEmailAddrsFromUserPath(ResourceResolver resourceResolver, String principlePath) { + @SuppressWarnings({"squid:S3776"}) + protected static final String[] getEmailAddrsFromUserPath(ResourceResolver resourceResolver, String principlePath) { List emailList = new LinkedList(); try { @@ -120,14 +123,16 @@ protected final static String[] getEmailAddrsFromUserPath(ResourceResolver resou Iterator memberIt = authGroup.getMembers(); while (memberIt.hasNext()) { String currEmail = getAuthorizableEmail(memberIt.next()); - if (currEmail != null) + if (currEmail != null) { emailList.add(currEmail); + } } } else { // otherwise is an individual user String authEmail = getAuthorizableEmail(authorizable); - if (authEmail != null) + if (authEmail != null) { emailList.add(authEmail); + } } } } diff --git a/bundle/src/main/java/com/adobe/acs/commons/errorpagehandler/ErrorPageHandlerService.java b/bundle/src/main/java/com/adobe/acs/commons/errorpagehandler/ErrorPageHandlerService.java index c200a708d3..6e8bbddfd1 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/errorpagehandler/ErrorPageHandlerService.java +++ b/bundle/src/main/java/com/adobe/acs/commons/errorpagehandler/ErrorPageHandlerService.java @@ -31,6 +31,8 @@ * This service is used via the ACS-AEM-Commons error page handler implementation to create author-able error pages. */ @ProviderType + +@SuppressWarnings("squid:S1214") public interface ErrorPageHandlerService { int DEFAULT_STATUS_CODE = SlingHttpServletResponse.SC_INTERNAL_SERVER_ERROR; @@ -117,6 +119,7 @@ public interface ErrorPageHandlerService { * @param response the response * @param path the path */ + @SuppressWarnings("checkstyle:abbreviationaswordinname") void includeUsingGET(SlingHttpServletRequest request, SlingHttpServletResponse response, String path); diff --git a/bundle/src/main/java/com/adobe/acs/commons/errorpagehandler/cache/impl/ErrorPageCacheImpl.java b/bundle/src/main/java/com/adobe/acs/commons/errorpagehandler/cache/impl/ErrorPageCacheImpl.java index 599ca77d26..224c2bdd1c 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/errorpagehandler/cache/impl/ErrorPageCacheImpl.java +++ b/bundle/src/main/java/com/adobe/acs/commons/errorpagehandler/cache/impl/ErrorPageCacheImpl.java @@ -153,11 +153,7 @@ public final int getTotalHits() { @Override public final int getCacheEntriesCount() { - if (this.cache == null) { - return 0; - } else { - return this.cache.size(); - } + return this.cache.size(); } @Override @@ -188,6 +184,7 @@ public final long getCacheSizeInKB() { } + @SuppressWarnings("squid:S1192") public final TabularData getCacheEntries() throws OpenDataException { final CompositeType cacheEntryType = new CompositeType( diff --git a/bundle/src/main/java/com/adobe/acs/commons/errorpagehandler/cache/impl/ErrorPageCacheMBean.java b/bundle/src/main/java/com/adobe/acs/commons/errorpagehandler/cache/impl/ErrorPageCacheMBean.java index 826d628595..3f63faa2f6 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/errorpagehandler/cache/impl/ErrorPageCacheMBean.java +++ b/bundle/src/main/java/com/adobe/acs/commons/errorpagehandler/cache/impl/ErrorPageCacheMBean.java @@ -43,6 +43,7 @@ public interface ErrorPageCacheMBean { int getCacheEntriesCount(); @Description("Total cache size in KB") + @SuppressWarnings("checkstyle:abbreviationaswordinname") long getCacheSizeInKB(); @Description("Details for each cache entry") diff --git a/bundle/src/main/java/com/adobe/acs/commons/errorpagehandler/impl/ErrorPageHandlerImpl.java b/bundle/src/main/java/com/adobe/acs/commons/errorpagehandler/impl/ErrorPageHandlerImpl.java index 74213188bf..6960012337 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/errorpagehandler/impl/ErrorPageHandlerImpl.java +++ b/bundle/src/main/java/com/adobe/acs/commons/errorpagehandler/impl/ErrorPageHandlerImpl.java @@ -32,12 +32,22 @@ import com.day.cq.search.QueryBuilder; import org.apache.commons.lang.ArrayUtils; import org.apache.commons.lang.StringUtils; -import org.apache.felix.scr.annotations.*; +import org.apache.felix.scr.annotations.Activate; +import org.apache.felix.scr.annotations.Component; +import org.apache.felix.scr.annotations.Deactivate; +import org.apache.felix.scr.annotations.Property; +import org.apache.felix.scr.annotations.PropertyOption; +import org.apache.felix.scr.annotations.Reference; +import org.apache.felix.scr.annotations.Service; import org.apache.sling.api.SlingConstants; import org.apache.sling.api.SlingHttpServletRequest; import org.apache.sling.api.SlingHttpServletResponse; import org.apache.sling.api.request.RequestProgressTracker; -import org.apache.sling.api.resource.*; +import org.apache.sling.api.resource.LoginException; +import org.apache.sling.api.resource.Resource; +import org.apache.sling.api.resource.ResourceResolver; +import org.apache.sling.api.resource.ResourceResolverFactory; +import org.apache.sling.api.resource.ResourceUtil; import org.apache.sling.api.wrappers.SlingHttpServletRequestWrapper; import org.apache.sling.auth.core.AuthUtil; import org.apache.sling.commons.auth.Authenticator; @@ -54,7 +64,16 @@ import java.io.PrintWriter; import java.io.StringWriter; import java.util.AbstractMap.SimpleEntry; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Dictionary; +import java.util.HashSet; +import java.util.Hashtable; +import java.util.Locale; +import java.util.Map; +import java.util.SortedMap; +import java.util.TreeMap; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -90,8 +109,8 @@ public final class ErrorPageHandlerImpl implements ErrorPageHandlerService { private boolean vanityDispatchCheckEnabled = DEFAULT_VANITY_DISPATCH_ENABLED; @Property(label = "Vanity Dispatch Check", description = "Enables/Disables Vanity Dispatch check, " - + "if this is enabled and current request URI is a valid vanity (after performing resource resolver mapping), " - + "request will be forwarded to it. [Optional... but recommended when using resource resolver based out-going mapping] [Default: false]", + + "if this is enabled and current request URI is a valid vanity (after performing resource resolver mapping), " + + "request will be forwarded to it. [Optional... but recommended when using resource resolver based out-going mapping] [Default: false]", boolValue = DEFAULT_VANITY_DISPATCH_ENABLED) private static final String PROP_VANITY_DISPATCH_ENABLED = "vanity.dispatch.enabled"; @@ -236,7 +255,7 @@ public final class ErrorPageHandlerImpl implements ErrorPageHandlerService { private ComponentHelper componentHelper; @Reference - private VanityURLService vanityURLService; + private VanityURLService vanityUrlService; private ErrorPageCache cache; @@ -251,6 +270,8 @@ public final class ErrorPageHandlerImpl implements ErrorPageHandlerService { * @param errorResource * @return */ + @Override + @SuppressWarnings("squid:S3776") public String findErrorPage(SlingHttpServletRequest request, Resource errorResource) { if (!isEnabled()) { return null; @@ -260,12 +281,12 @@ public String findErrorPage(SlingHttpServletRequest request, Resource errorResou Resource errorPage = null; if (StringUtils.isNotBlank(errorsPath)) { - final ResourceResolver resourceResolver = errorResource.getResourceResolver(); + final ResourceResolver resourceResolver = errorResource.getResourceResolver(); final String errorPath = errorsPath + "/" + getErrorPageName(request); errorPage = getResource(resourceResolver, errorPath); if (errorPage == null && StringUtils.isNotBlank(errorsPath)) { - log.trace("No error-specific errorPage could be found, use the 'default' error errorPage for the Root content path"); + log.trace("No error-specific errorPage could be found, use the 'default' error errorPage for the Root content path"); errorPage = resourceResolver.resolve(errorsPath); } } @@ -320,9 +341,9 @@ public String findErrorPage(SlingHttpServletRequest request, Resource errorResou * @param errorResource * @return path to the default error page or "root" error page */ - private String findErrorsPath(SlingHttpServletRequest request, Resource errorResource) { - final String errorResourcePath = errorResource.getPath(); - Resource real = findFirstRealParentOrSelf(request, errorResource); + private String findErrorsPath(SlingHttpServletRequest request, Resource errorResource) { + final String errorResourcePath = errorResource.getPath(); + Resource real = findFirstRealParentOrSelf(request, errorResource); String errorsPath = null; if (real != null) { @@ -333,17 +354,17 @@ private String findErrorsPath(SlingHttpServletRequest request, Resource errorRes real = tmp; } } - final InheritanceValueMap pageProperties = new HierarchyNodeInheritanceValueMap(real); - errorsPath = pageProperties.getInherited(ERROR_PAGE_PROPERTY, String.class); + final InheritanceValueMap pageProperties = new HierarchyNodeInheritanceValueMap(real); + errorsPath = pageProperties.getInherited(ERROR_PAGE_PROPERTY, String.class); } else { - log.trace("No page found for [ {} ]", errorResource); + log.trace("No page found for [ {} ]", errorResource); } if (errorsPath == null) { - log.trace("could not find inherited property for [ {} ]", errorResource); + log.trace("could not find inherited property for [ {} ]", errorResource); for (final Map.Entry mapPage : pathMap.entrySet()) { if (errorResourcePath.startsWith(mapPage.getKey())) { - log.trace("found error path in map [ {} ]", mapPage.getKey()); + log.trace("found error path in map [ {} ]", mapPage.getKey()); errorsPath = mapPage.getValue(); break; } @@ -351,8 +372,8 @@ private String findErrorsPath(SlingHttpServletRequest request, Resource errorRes } log.debug("Best matching errors path for request is: {}", errorsPath); - return errorsPath; - } + return errorsPath; + } /** * Gets the resource object for the provided path. @@ -382,6 +403,7 @@ private Resource getResource(ResourceResolver resourceResolver, String path) { * @param request * @return */ + @Override public int getStatusCode(SlingHttpServletRequest request) { Integer statusCode = (Integer) request.getAttribute(SlingConstants.ERROR_STATUS); @@ -400,6 +422,7 @@ public int getStatusCode(SlingHttpServletRequest request) { * @param request * @return */ + @Override public String getErrorPageName(SlingHttpServletRequest request) { // Get status code from request // Set the servlet name ot find to statusCode; update later if needed @@ -408,23 +431,6 @@ public String getErrorPageName(SlingHttpServletRequest request) { // Only support Status codes as error exception lookup scheme is too complex/expensive at this time. // Using the 500 response code/default error page should suffice for all errors pages generated from exceptions. - /* - final Object tmp = request.getAttribute(SlingConstants.ERROR_EXCEPTION_TYPE); - - if(tmp != null && tmp instanceof Class) { - final Class clazz = (Class) tmp; - - final String exceptionName = clazz.getSimpleName(); - log.debug("Servlet path used to derived exception name: {} ", exceptionName); - - if(StringUtils.isNotBlank(exceptionName)) { - servletName = exceptionName; - } - } - - if(StringUtils.isBlank(servletName)) { servletName = this.fallbackErrorName; } - */ - servletName = StringUtils.lowerCase(servletName); log.debug("Error page name to (try to) use: {} ", servletName); @@ -442,6 +448,7 @@ public String getErrorPageName(SlingHttpServletRequest request) { * * @return true is the Service should be considered enabled */ + @Override public boolean isEnabled() { return enabled; } @@ -737,6 +744,7 @@ public String getException(SlingHttpServletRequest request) { * @param request * @return */ + @Override public String getRequestProgress(SlingHttpServletRequest request) { StringWriter stringWriter = new StringWriter(); if (request != null) { @@ -757,12 +765,10 @@ public String getRequestProgress(SlingHttpServletRequest request) { * @param response * @param statusCode */ + @Override public void resetRequestAndResponse(SlingHttpServletRequest request, SlingHttpServletResponse response, int statusCode) { - // Clear client libraries - - // Replace with proper API call is HtmlLibraryManager provides one in the future; - // Currently this is our only option. + // Clear client libraries. Would be better if there was a proper API call for this, but there isn't at present. request.setAttribute("com.day.cq.widget.HtmlLibraryManager.included", new HashSet()); @@ -811,6 +817,7 @@ protected void deactivate(ComponentContext componentContext) { } } + @SuppressWarnings("squid:S1149") private void configure(ComponentContext componentContext) { Dictionary config = componentContext.getProperties(); final String legacyPrefix = "prop."; @@ -981,6 +988,7 @@ private SortedMap configurePathMap(String[] paths) { return sortedMap; } + @Override public void includeUsingGET(final SlingHttpServletRequest request, final SlingHttpServletResponse response, final String path) { if (cache == null @@ -1018,9 +1026,10 @@ public String getMethod() { return "GET"; } } - + + @Override public boolean isVanityDispatchCheckEnabled(){ - return this.vanityDispatchCheckEnabled; + return this.vanityDispatchCheckEnabled; } } diff --git a/bundle/src/main/java/com/adobe/acs/commons/exporters/impl/users/Parameters.java b/bundle/src/main/java/com/adobe/acs/commons/exporters/impl/users/Parameters.java index 027cd3e31c..dcc38db04b 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/exporters/impl/users/Parameters.java +++ b/bundle/src/main/java/com/adobe/acs/commons/exporters/impl/users/Parameters.java @@ -49,28 +49,28 @@ public Parameters(Resource resource) { public Parameters(SlingHttpServletRequest request) throws IOException, JSONException { final JSONObject json = new JSONObject(request.getParameter("params")); - final List customProperties = new ArrayList(); - final List groups = new ArrayList(); + final List tmpCustomProperties = new ArrayList(); + final List tmpGroups = new ArrayList(); groupFilter = json.getString(GROUP_FILTER); JSONArray groupsJSON = json.getJSONArray(GROUPS); for (int i = 0; i < groupsJSON.length(); i++) { - groups.add(groupsJSON.getString(i)); + tmpGroups.add(groupsJSON.getString(i)); } - this.groups = groups.toArray(new String[groups.size()]); + this.groups = tmpGroups.toArray(new String[tmpGroups.size()]); JSONArray customPropertiesJSON = json.getJSONArray(CUSTOM_PROPERTIES); for (int i = 0; i < customPropertiesJSON.length(); i++) { JSONObject tmp = customPropertiesJSON.getJSONObject(i); String relativePropertyPath = tmp.optString(RELATIVE_PROPERTY_PATH); if (StringUtils.isNotBlank(relativePropertyPath)) { - customProperties.add(relativePropertyPath); + tmpCustomProperties.add(relativePropertyPath); } } - this.customProperties = customProperties.toArray(new String[customProperties.size()]); + this.customProperties = tmpCustomProperties.toArray(new String[tmpCustomProperties.size()]); } public String[] getCustomProperties() { diff --git a/bundle/src/main/java/com/adobe/acs/commons/exporters/impl/users/UsersExportServlet.java b/bundle/src/main/java/com/adobe/acs/commons/exporters/impl/users/UsersExportServlet.java index 6ed772b47d..e99ae93f78 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/exporters/impl/users/UsersExportServlet.java +++ b/bundle/src/main/java/com/adobe/acs/commons/exporters/impl/users/UsersExportServlet.java @@ -30,7 +30,8 @@ import org.apache.jackrabbit.api.security.user.UserManager; import org.apache.sling.api.SlingHttpServletRequest; import org.apache.sling.api.SlingHttpServletResponse; -import org.apache.sling.api.resource.*; +import org.apache.sling.api.resource.Resource; +import org.apache.sling.api.resource.ValueMap; import org.apache.sling.api.servlets.SlingSafeMethodsServlet; import org.apache.sling.commons.json.JSONException; import org.slf4j.Logger; @@ -247,6 +248,7 @@ public String getPath() throws RepositoryException { return authorizable.getPath(); } + @SuppressWarnings("checkstyle:abbreviationaswordinname") public String getID() throws RepositoryException { return authorizable.getID(); } diff --git a/bundle/src/main/java/com/adobe/acs/commons/exporters/impl/users/UsersInitServlet.java b/bundle/src/main/java/com/adobe/acs/commons/exporters/impl/users/UsersInitServlet.java index f157def7c4..067fcb375c 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/exporters/impl/users/UsersInitServlet.java +++ b/bundle/src/main/java/com/adobe/acs/commons/exporters/impl/users/UsersInitServlet.java @@ -51,6 +51,8 @@ ) public class UsersInitServlet extends SlingSafeMethodsServlet { private static final String QUERY = "SELECT * FROM [rep:Group] WHERE ISDESCENDANTNODE([/home/groups]) ORDER BY [rep:principalName]"; + private static final String KEY_TEXT = "text"; + private static final String KEY_VALUE = "value"; /** * Returns a JSON containing the options available to the form, and any prior saved data that should pre-populate the form. @@ -115,21 +117,20 @@ private JSONArray getGroupOptions(ResourceResolver resourceResolver) throws Repo * @throws JSONException */ private JSONArray getGroupFilterOptions() throws JSONException { - JSONArray jsonArray = new JSONArray(); - JSONObject both = new JSONObject(); - both.put("text", "Direct or Indirect Membership"); - both.put("value", GROUP_FILTER_BOTH); + both.put(KEY_TEXT, "Direct or Indirect Membership"); + both.put(KEY_VALUE, GROUP_FILTER_BOTH); JSONObject direct = new JSONObject(); - direct.put("text", "Direct Membership"); - direct.put("value", GROUP_FILTER_DIRECT); + direct.put(KEY_TEXT, "Direct Membership"); + direct.put(KEY_VALUE, GROUP_FILTER_DIRECT); JSONObject indirect = new JSONObject(); - indirect.put("text", "Indirect Membership"); - indirect.put("value", GROUP_FILTER_INDIRECT); + indirect.put(KEY_TEXT, "Indirect Membership"); + indirect.put(KEY_VALUE, GROUP_FILTER_INDIRECT); + JSONArray jsonArray = new JSONArray(); jsonArray.put(direct); jsonArray.put(indirect); jsonArray.put(both); diff --git a/bundle/src/main/java/com/adobe/acs/commons/fam/ActionManager.java b/bundle/src/main/java/com/adobe/acs/commons/fam/ActionManager.java index 78b01da226..0a05c314d6 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/fam/ActionManager.java +++ b/bundle/src/main/java/com/adobe/acs/commons/fam/ActionManager.java @@ -34,6 +34,7 @@ * */ @ProviderType +@SuppressWarnings("squid:S00112") public interface ActionManager { /** @@ -48,7 +49,8 @@ public interface ActionManager { * @return Count of items found in query * @throws RepositoryException * @throws PersistenceException - * @throws Exception + * @throws Exception + * @deprecated Use the method which supports CheckedBiConsumer instead */ @Deprecated int withQueryResults(final String queryStatement, final String language, final BiConsumer callback, final BiFunction... filters) throws RepositoryException, PersistenceException, Exception; @@ -73,6 +75,7 @@ public interface ActionManager { /** * Perform action at some later time using a provided pooled resolver * @param action Action to perform + * @deprecated Use the method which supports CheckedConsumer instead */ @Deprecated void deferredWithResolver(final Consumer action); @@ -87,6 +90,7 @@ public interface ActionManager { * Perform action right now using a provided pooled resolver * @param action Action to perform * @throws java.lang.Exception + * @deprecated Use the method which supports CheckedConsumer instead */ @Deprecated void withResolver(Consumer action) throws Exception; @@ -110,26 +114,27 @@ public interface ActionManager { * NOTE: This is automatic now -- only included for backwards compatibility. * @deprecated No need to use this, cleanup is automatic. */ - void addCleanupTask(); + @Deprecated + void addCleanupTask(); /** * Register a handler to be fired when the work has completed with no errors. * @param successTask */ - void onSuccess(CheckedConsumer successTask); + void onSuccess(CheckedConsumer successTask); /** * Register a handler to be fired when the work has completed and there was at least one error. * @param failureTask */ - void onFailure(CheckedBiConsumer, ResourceResolver> failureTask); + void onFailure(CheckedBiConsumer, ResourceResolver> failureTask); /** * Register a handler to be fired when the work is completed, successfully or not. * Note: These handlers are called after the success/fail handlers. * @param finishHandler */ - void onFinish(Runnable finishHandler); + void onFinish(Runnable finishHandler); /** * Have all actions completed? diff --git a/bundle/src/main/java/com/adobe/acs/commons/fam/CancelHandler.java b/bundle/src/main/java/com/adobe/acs/commons/fam/CancelHandler.java index be5c7797f3..bdf45ae333 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/fam/CancelHandler.java +++ b/bundle/src/main/java/com/adobe/acs/commons/fam/CancelHandler.java @@ -28,7 +28,7 @@ public class CancelHandler implements Serializable { private static final long serialVersionUID = 7526472295622776147L; - transient private final Set activeWork = ConcurrentHashMap.newKeySet(); + private final transient Set activeWork = ConcurrentHashMap.newKeySet(); private boolean cancelled = false; private boolean force = false; diff --git a/bundle/src/main/java/com/adobe/acs/commons/fam/DeferredActions.java b/bundle/src/main/java/com/adobe/acs/commons/fam/DeferredActions.java index 93e31f6280..f18abd59ef 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/fam/DeferredActions.java +++ b/bundle/src/main/java/com/adobe/acs/commons/fam/DeferredActions.java @@ -18,14 +18,16 @@ import aQute.bnd.annotation.ProviderType; import com.adobe.acs.commons.fam.actions.Actions; import com.adobe.acs.commons.fam.actions.AssetActions; -import com.adobe.acs.commons.fam.actions.ReplicationActions; import com.adobe.acs.commons.fam.actions.Filters; -import com.adobe.acs.commons.functions.*; +import com.adobe.acs.commons.fam.actions.ReplicationActions; +import com.adobe.acs.commons.functions.BiConsumer; +import com.adobe.acs.commons.functions.BiFunction; +import com.adobe.acs.commons.functions.Consumer; +import com.adobe.acs.commons.functions.Function; import com.adobe.acs.commons.workflow.synthetic.SyntheticWorkflowModel; import com.adobe.acs.commons.workflow.synthetic.SyntheticWorkflowRunner; import com.day.cq.replication.ReplicationOptions; import com.day.cq.replication.Replicator; - import org.apache.felix.scr.annotations.Component; import org.apache.felix.scr.annotations.Reference; import org.apache.felix.scr.annotations.Service; @@ -38,6 +40,7 @@ @Component @Service(DeferredActions.class) @ProviderType +@Deprecated public final class DeferredActions { public static final String ORIGINAL_RENDITION = Filters.ORIGINAL_RENDITION; @@ -227,7 +230,7 @@ public Consumer retry(final int retries, final long pausePerRe * @param path * @return */ - final public Consumer startSyntheticWorkflow(SyntheticWorkflowModel model, String path) { + public final Consumer startSyntheticWorkflow(SyntheticWorkflowModel model, String path) { return Consumer.adapt(Actions.startSyntheticWorkflow(model, path, workflowRunner)); } @@ -237,7 +240,7 @@ final public Consumer startSyntheticWorkflow(SyntheticWorkflow * @param path * @return */ - final public Consumer removeRenditions(String path) { + public final Consumer removeRenditions(String path) { return Consumer.adapt(AssetActions.removeRenditions(path)); } @@ -248,7 +251,7 @@ final public Consumer removeRenditions(String path) { * @param name * @return */ - final public Consumer removeRenditionsNamed(String path, String name) { + public final Consumer removeRenditionsNamed(String path, String name) { return Consumer.adapt(AssetActions.removeRenditionsNamed(path, name)); } @@ -258,7 +261,7 @@ final public Consumer removeRenditionsNamed(String path, Strin * @param path * @return */ - final public Consumer activate(String path) { + public final Consumer activate(String path) { return Consumer.adapt(ReplicationActions.activate(replicator, path)); } @@ -269,7 +272,7 @@ final public Consumer activate(String path) { * @param options * @return */ - final public Consumer activateWithOptions(String path, ReplicationOptions options) { + public final Consumer activateWithOptions(String path, ReplicationOptions options) { return Consumer.adapt(ReplicationActions.activateWithOptions(replicator, path, options)); } @@ -279,7 +282,7 @@ final public Consumer activateWithOptions(String path, Replica * @param path * @return */ - final public Consumer deactivate(String path) { + public final Consumer deactivate(String path) { return Consumer.adapt(ReplicationActions.deactivate(replicator, path)); } @@ -290,7 +293,7 @@ final public Consumer deactivate(String path) { * @param options * @return */ - final public Consumer deactivateWithOptions(String path, ReplicationOptions options) { + public final Consumer deactivateWithOptions(String path, ReplicationOptions options) { return Consumer.adapt(ReplicationActions.deactivateWithOptions(replicator, path, options)); } } diff --git a/bundle/src/main/java/com/adobe/acs/commons/fam/Failure.java b/bundle/src/main/java/com/adobe/acs/commons/fam/Failure.java index e3b9dc7091..e6af4cac4a 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/fam/Failure.java +++ b/bundle/src/main/java/com/adobe/acs/commons/fam/Failure.java @@ -25,6 +25,7 @@ * Represents a failure on a specific node */ @ProviderType +@SuppressWarnings("squid:S1068") public final class Failure implements Serializable { private static final long serialVersionUID = 7526472295622776148L; @@ -32,7 +33,7 @@ public final class Failure implements Serializable { private String error; private String stackTrace; private Long time; - transient private Exception exception; + private transient Exception exception; private final Calendar failedAt; public Failure() { diff --git a/bundle/src/main/java/com/adobe/acs/commons/fam/ThrottledTaskRunner.java b/bundle/src/main/java/com/adobe/acs/commons/fam/ThrottledTaskRunner.java index 80f72521e4..0ed788cc4a 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/fam/ThrottledTaskRunner.java +++ b/bundle/src/main/java/com/adobe/acs/commons/fam/ThrottledTaskRunner.java @@ -17,6 +17,7 @@ import aQute.bnd.annotation.ProviderType; import com.adobe.acs.commons.fam.mbean.ThrottledTaskRunnerMBean; + /** * In addition to MBean operations, a ThrottledTaskRunner lets the caller schedule work and provides a throttle method. * The logCompletion method should also allow a runnable action provide appropriate notification of success/failure @@ -30,14 +31,14 @@ public interface ThrottledTaskRunner extends ThrottledTaskRunnerMBean { * Only call this BEFORE starting a critical section. * @throws InterruptedException If the thread was interrupted */ - public void waitForLowCpuAndLowMemory() throws InterruptedException; + void waitForLowCpuAndLowMemory() throws InterruptedException; /** * Schedule some kind of work to run in the future using the internal thread pool. * The work will be throttled according to the CPU/Memory settings * @param work */ - public void scheduleWork(Runnable work); + void scheduleWork(Runnable work); /** * Schedule some kind of work to run in the future using the internal thread pool. @@ -45,7 +46,7 @@ public interface ThrottledTaskRunner extends ThrottledTaskRunnerMBean { * @param work * @param cancelHandler */ - public void scheduleWork(Runnable work, CancelHandler cancelHandler); + void scheduleWork(Runnable work, CancelHandler cancelHandler); /** * Record statistics @@ -56,11 +57,11 @@ public interface ThrottledTaskRunner extends ThrottledTaskRunnerMBean { * @param successful If true, action concluded normally * @param error Exception caught, if any. */ - public void logCompletion(long created, long started, long executed, long finished, boolean successful, Throwable error); + void logCompletion(long created, long started, long executed, long finished, boolean successful, Throwable error); /** * Get number of maximum threads supported by this thread manager * @return Thread pool maximum size */ - public int getMaxThreads(); + int getMaxThreads(); } diff --git a/bundle/src/main/java/com/adobe/acs/commons/fam/actions/Actions.java b/bundle/src/main/java/com/adobe/acs/commons/fam/actions/Actions.java index 9fdcc70857..c746371c4a 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/fam/actions/Actions.java +++ b/bundle/src/main/java/com/adobe/acs/commons/fam/actions/Actions.java @@ -31,6 +31,7 @@ * Various deferred actions to be used with the ActionManager */ @ProviderType +@SuppressWarnings({"squid:S1181", "squid:S1193"}) public final class Actions { private Actions() { } @@ -38,6 +39,7 @@ private Actions() { private static final Logger LOG = LoggerFactory.getLogger(Actions.class); private static ThreadLocal currentActionManager = new ThreadLocal<>(); + /** * Obtain the current action manager -- this is necessary for additional tracking such as current item * @return current action manager @@ -126,6 +128,7 @@ public static final CheckedBiConsumer startSyntheticWo * @param action Action to attempt * @return New retry wrapper around provided action */ + @SuppressWarnings("squid:S3776") public static final CheckedConsumer retry(final int retries, final long pausePerRetry, final CheckedConsumer action) { return (ResourceResolver r) -> { int remaining = retries; diff --git a/bundle/src/main/java/com/adobe/acs/commons/fam/actions/AssetActions.java b/bundle/src/main/java/com/adobe/acs/commons/fam/actions/AssetActions.java index 0619cf625f..7261158c2b 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/fam/actions/AssetActions.java +++ b/bundle/src/main/java/com/adobe/acs/commons/fam/actions/AssetActions.java @@ -35,7 +35,8 @@ public class AssetActions { private AssetActions() { // Utility class cannot be instantiated directly. } - + + @SuppressWarnings("squid:S3776") public static final CheckedBiConsumer withAllRenditions( final CheckedBiConsumer action, final CheckedBiFunction... filters) { diff --git a/bundle/src/main/java/com/adobe/acs/commons/fam/actions/Filters.java b/bundle/src/main/java/com/adobe/acs/commons/fam/actions/Filters.java index b155e76581..de22ed83b1 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/fam/actions/Filters.java +++ b/bundle/src/main/java/com/adobe/acs/commons/fam/actions/Filters.java @@ -31,7 +31,7 @@ private Filters() { // Utility class cannot be instantiated directly. } - static final public String ORIGINAL_RENDITION = "original"; + public static final String ORIGINAL_RENDITION = "original"; //--- Filters (for using withQueryResults) /** diff --git a/bundle/src/main/java/com/adobe/acs/commons/fam/actions/ReplicationActions.java b/bundle/src/main/java/com/adobe/acs/commons/fam/actions/ReplicationActions.java index ab7a69d32d..1ab5cb7758 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/fam/actions/ReplicationActions.java +++ b/bundle/src/main/java/com/adobe/acs/commons/fam/actions/ReplicationActions.java @@ -35,6 +35,10 @@ */ @ProviderType public class ReplicationActions { + + private static final String PREFIX_ACTIVATE = "activate-"; + private static final String PREFIX_DEACTIVATE = "deactivate-"; + private ReplicationActions() { // Utility class cannot be instantiated directly. } @@ -46,7 +50,7 @@ private ReplicationActions() { */ public static final CheckedBiConsumer activateAll(Replicator replicator) { return (ResourceResolver r, String path) -> { - nameThread("activate-" + path); + nameThread(PREFIX_ACTIVATE + path); replicator.replicate(r.adaptTo(Session.class), ReplicationActionType.ACTIVATE, path); }; } @@ -61,7 +65,7 @@ public static final CheckedBiConsumer activateAll(Repl */ public static final CheckedBiConsumer activateAllWithOptions(Replicator replicator, final ReplicationOptions options) { return (ResourceResolver r, String path) -> { - nameThread("activate-" + path); + nameThread(PREFIX_ACTIVATE + path); replicator.replicate(r.adaptTo(Session.class), ReplicationActionType.ACTIVATE, path, options); }; } @@ -78,7 +82,7 @@ public static final CheckedBiConsumer activateAllWithR final List allTheOptions = Arrays.asList(options); final Iterator roundRobin = new RoundRobin(allTheOptions).iterator(); return (ResourceResolver r, String path) -> { - nameThread("activate-" + path); + nameThread(PREFIX_ACTIVATE + path); replicator.replicate(r.adaptTo(Session.class), ReplicationActionType.ACTIVATE, path, roundRobin.next()); }; } @@ -90,7 +94,7 @@ public static final CheckedBiConsumer activateAllWithR */ public static final CheckedBiConsumer deactivateAll(final Replicator replicator) { return (ResourceResolver r, String path) -> { - nameThread("deactivate-" + path); + nameThread(PREFIX_DEACTIVATE + path); replicator.replicate(r.adaptTo(Session.class), ReplicationActionType.DEACTIVATE, path); }; } @@ -103,7 +107,7 @@ public static final CheckedBiConsumer deactivateAll(fi */ public static final CheckedBiConsumer deactivateAllWithOptions(final Replicator replicator, final ReplicationOptions options) { return (ResourceResolver r, String path) -> { - nameThread("deactivate-" + path); + nameThread(PREFIX_DEACTIVATE + path); replicator.replicate(r.adaptTo(Session.class), ReplicationActionType.DEACTIVATE, path, options); }; } diff --git a/bundle/src/main/java/com/adobe/acs/commons/fam/impl/ActionManagerImpl.java b/bundle/src/main/java/com/adobe/acs/commons/fam/impl/ActionManagerImpl.java index 860b89ac79..4627027306 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/fam/impl/ActionManagerImpl.java +++ b/bundle/src/main/java/com/adobe/acs/commons/fam/impl/ActionManagerImpl.java @@ -15,20 +15,23 @@ */ package com.adobe.acs.commons.fam.impl; -import com.adobe.acs.commons.fam.CancelHandler; import com.adobe.acs.commons.fam.ActionManager; +import com.adobe.acs.commons.fam.CancelHandler; import com.adobe.acs.commons.fam.Failure; import com.adobe.acs.commons.fam.ThrottledTaskRunner; import com.adobe.acs.commons.fam.actions.Actions; -import com.adobe.acs.commons.functions.*; -import java.io.Serializable; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.concurrent.atomic.AtomicLong; +import com.adobe.acs.commons.functions.BiConsumer; +import com.adobe.acs.commons.functions.BiFunction; +import com.adobe.acs.commons.functions.CheckedBiConsumer; +import com.adobe.acs.commons.functions.CheckedBiFunction; +import com.adobe.acs.commons.functions.CheckedConsumer; +import com.adobe.acs.commons.functions.Consumer; +import org.apache.sling.api.resource.LoginException; +import org.apache.sling.api.resource.PersistenceException; +import org.apache.sling.api.resource.ResourceResolver; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import javax.jcr.NodeIterator; import javax.jcr.RepositoryException; import javax.jcr.Session; @@ -42,25 +45,29 @@ import javax.management.openmbean.OpenType; import javax.management.openmbean.SimpleType; import javax.management.openmbean.TabularType; -import org.apache.sling.api.resource.LoginException; -import org.apache.sling.api.resource.PersistenceException; -import org.apache.sling.api.resource.ResourceResolver; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicLong; /** * Manages a pool of reusable resource resolvers and injects them into tasks */ +@SuppressWarnings("squid:S1192") class ActionManagerImpl extends CancelHandler implements ActionManager, Serializable { private static final long serialVersionUID = 7526472295622776150L; - transient private static final Logger LOG = LoggerFactory.getLogger(ActionManagerImpl.class); + private static final transient Logger LOG = LoggerFactory.getLogger(ActionManagerImpl.class); // This is a delay of how long an action manager should wait before it can safely assume it really is done and no more work is being added // This helps prevent an action manager from closing itself down while the queue is warming up. - transient public static final int HESITATION_DELAY = 50; + public static final transient int HESITATION_DELAY = 50; // The cleanup task will wait this many milliseconds between its polling to see if the queue has been completely processed - transient public static final int COMPLETION_CHECK_INTERVAL = 100; + public static final transient int COMPLETION_CHECK_INTERVAL = 100; private final AtomicInteger tasksAdded = new AtomicInteger(); private final AtomicInteger tasksCompleted = new AtomicInteger(); private final AtomicInteger tasksFilteredOut = new AtomicInteger(); @@ -71,16 +78,16 @@ class ActionManagerImpl extends CancelHandler implements ActionManager, Serializ private long finished; private int saveInterval; - transient private final ResourceResolver baseResolver; - transient private final List resolvers = Collections.synchronizedList(new ArrayList<>()); - transient private final ThreadLocal currentResolver = new ThreadLocal<>(); - transient private final ThrottledTaskRunner taskRunner; - transient private final ThreadLocal currentPath; + private final transient ResourceResolver baseResolver; + private final transient List resolvers = Collections.synchronizedList(new ArrayList<>()); + private final transient ThreadLocal currentResolver = new ThreadLocal<>(); + private final transient ThrottledTaskRunner taskRunner; + private final transient ThreadLocal currentPath; private final List failures; - transient private final AtomicBoolean cleanupHandlerRegistered = new AtomicBoolean(false); - transient private final List> successHandlers = Collections.synchronizedList(new ArrayList<>()); - transient private final List, ResourceResolver>> errorHandlers = Collections.synchronizedList(new ArrayList<>()); - transient private final List finishHandlers = Collections.synchronizedList(new ArrayList<>()); + private final transient AtomicBoolean cleanupHandlerRegistered = new AtomicBoolean(false); + private final transient List> successHandlers = Collections.synchronizedList(new ArrayList<>()); + private final transient List, ResourceResolver>> errorHandlers = Collections.synchronizedList(new ArrayList<>()); + private final transient List finishHandlers = Collections.synchronizedList(new ArrayList<>()); ActionManagerImpl(String name, ThrottledTaskRunner taskRunner, ResourceResolver resolver, int saveInterval) throws LoginException { this.name = name; @@ -136,12 +143,43 @@ public void deferredWithResolver(final CheckedConsumer action) deferredWithResolver(action, false); } + @SuppressWarnings("squid:S1181") + private void deferredWithResolver( + final CheckedConsumer action, + final boolean closesResolver) { + if (!closesResolver) { + tasksAdded.incrementAndGet(); + } + taskRunner.scheduleWork(() -> { + started.compareAndSet(0, System.currentTimeMillis()); + try { + withResolver(action); + if (!closesResolver) { + logCompletetion(); + } + } catch (Exception ex) { + LOG.error("Error in error handler for action " + getName(), ex); + if (!closesResolver) { + logError(ex); + } + } catch (Throwable t) { + LOG.error("Fatal uncaught error in error handler for action " + getName(), t); + if (!closesResolver) { + logError(new RuntimeException(t)); + } + throw t; + } + }, this); + + } + @Override public void withResolver(Consumer action) throws Exception { withResolver((CheckedConsumer) action); } @Override + @SuppressWarnings({"squid:S1181", "squid:S1163", "squid:S1143"}) public void withResolver(CheckedConsumer action) throws Exception { Actions.setCurrentActionManager(this); ReusableResolver resolver = getResourceResolver(); @@ -174,6 +212,7 @@ public int withQueryResults( } @Override + @SuppressWarnings("squid:S3776") public int withQueryResults( final String queryStatement, final String language, @@ -258,6 +297,7 @@ private void runCompletionTasks() { } } + @SuppressWarnings("squid:S2142") private void performAutomaticCleanup() { if (!cleanupHandlerRegistered.getAndSet(true)) { taskRunner.scheduleWork(() -> { @@ -279,35 +319,6 @@ public void setCurrentItem(String item) { currentPath.set(item); } - private void deferredWithResolver( - final CheckedConsumer action, - final boolean closesResolver) { - if (!closesResolver) { - tasksAdded.incrementAndGet(); - } - taskRunner.scheduleWork(() -> { - started.compareAndSet(0, System.currentTimeMillis()); - try { - withResolver(action); - if (!closesResolver) { - logCompletetion(); - } - } catch (Exception ex) { - LOG.error("Error in error handler for action " + getName(), ex); - if (!closesResolver) { - logError(ex); - } - } catch (Throwable t) { - LOG.error("Fatal uncaught error in error handler for action " + getName(), t); - if (!closesResolver) { - logError(new RuntimeException(t)); - } - throw t; - } - }, this); - - } - private ReusableResolver getResourceResolver() throws LoginException { ReusableResolver resolver = currentResolver.get(); if (resolver == null || !resolver.getResolver().isLive()) { @@ -375,11 +386,13 @@ public static TabularType getStaticsTableType() { } @Override + @SuppressWarnings("squid:S2142") public boolean isComplete() { if (tasksCompleted.get() == tasksAdded.get()) { try { Thread.sleep(HESITATION_DELAY); } catch (InterruptedException ex) { + // no-op } return tasksCompleted.get() == tasksAdded.get(); } else { @@ -414,7 +427,7 @@ public synchronized void closeAllResolvers() { baseResolver.close(); } - static public TabularType getFailuresTableType() { + public static TabularType getFailuresTableType() { return failureTabularType; } @@ -434,12 +447,12 @@ public List getFailures() throws OpenDataException { return failureData; } - transient private static String[] statsItemNames; - transient private static CompositeType statsCompositeType; - transient private static TabularType statsTabularType; - transient private static String[] failureItemNames; - transient private static CompositeType failureCompositeType; - transient private static TabularType failureTabularType; + private static transient String[] statsItemNames; + private static transient CompositeType statsCompositeType; + private static transient TabularType statsTabularType; + private static transient String[] failureItemNames; + private static transient CompositeType failureCompositeType; + private static transient TabularType failureTabularType; static { try { diff --git a/bundle/src/main/java/com/adobe/acs/commons/fam/impl/RunningStatistic.java b/bundle/src/main/java/com/adobe/acs/commons/fam/impl/RunningStatistic.java index 56bf5cea7d..44f5735caa 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/fam/impl/RunningStatistic.java +++ b/bundle/src/main/java/com/adobe/acs/commons/fam/impl/RunningStatistic.java @@ -34,7 +34,7 @@ */ public class RunningStatistic { - static private int rollingAverageWidth = 20; + private static int rollingAverageWidth = 20; private final String name; private final AtomicLong counter = new AtomicLong(); private final AtomicLong min = new AtomicLong(); diff --git a/bundle/src/main/java/com/adobe/acs/commons/fam/impl/ThrottledTaskRunnerImpl.java b/bundle/src/main/java/com/adobe/acs/commons/fam/impl/ThrottledTaskRunnerImpl.java index 6d6bf0430e..755a1db6a5 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/fam/impl/ThrottledTaskRunnerImpl.java +++ b/bundle/src/main/java/com/adobe/acs/commons/fam/impl/ThrottledTaskRunnerImpl.java @@ -19,10 +19,15 @@ import com.adobe.acs.commons.fam.ThrottledTaskRunner; import com.adobe.acs.commons.fam.mbean.ThrottledTaskRunnerMBean; import com.adobe.granite.jmx.annotation.AnnotatedStandardMBean; -import java.lang.management.ManagementFactory; -import java.util.Dictionary; -import java.util.List; -import java.util.concurrent.*; +import org.apache.felix.scr.annotations.Component; +import org.apache.felix.scr.annotations.Properties; +import org.apache.felix.scr.annotations.Property; +import org.apache.felix.scr.annotations.Service; +import org.apache.sling.commons.osgi.PropertiesUtil; +import org.osgi.service.component.ComponentContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import javax.management.Attribute; import javax.management.AttributeList; import javax.management.AttributeNotFoundException; @@ -36,14 +41,14 @@ import javax.management.openmbean.CompositeData; import javax.management.openmbean.OpenDataException; import javax.management.openmbean.TabularDataSupport; -import org.apache.felix.scr.annotations.Component; -import org.apache.felix.scr.annotations.Properties; -import org.apache.felix.scr.annotations.Property; -import org.apache.felix.scr.annotations.Service; -import org.apache.sling.commons.osgi.PropertiesUtil; -import org.osgi.service.component.ComponentContext; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import java.lang.management.ManagementFactory; +import java.util.Dictionary; +import java.util.List; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.LinkedBlockingDeque; +import java.util.concurrent.Semaphore; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; @Component(metatype = true, immediate = true, label = "ACS AEM Commons - Throttled Task Runner Service") @Service({ThrottledTaskRunner.class, ThrottledTaskRunnerStats.class}) @@ -176,6 +181,7 @@ public int getMaxThreads() { private long lastCheck = -1; private boolean wasRecentlyBusy = false; + @SuppressWarnings("squid:S3776") private boolean isTooBusy() throws InterruptedException { if (maxCpu <= 0 && maxHeap <= 0) { return false; @@ -257,6 +263,7 @@ public void setThreadPoolSize(int newSize) { initThreadPool(); } + @SuppressWarnings("squid:S2142") private void initThreadPool() { if (workQueue == null) { workQueue = new LinkedBlockingDeque<>(); diff --git a/bundle/src/main/java/com/adobe/acs/commons/fam/impl/TimedRunnable.java b/bundle/src/main/java/com/adobe/acs/commons/fam/impl/TimedRunnable.java index afab42d103..fd34d93e29 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/fam/impl/TimedRunnable.java +++ b/bundle/src/main/java/com/adobe/acs/commons/fam/impl/TimedRunnable.java @@ -57,6 +57,7 @@ public TimedRunnable(Runnable work, ThrottledTaskRunner runner, int timeout, Tim * throwing an interruption */ @Override + @SuppressWarnings("squid:S1181") public void run() { if (cancelHandler.isPresent() && cancelHandler.get().isCancelled()) { return; @@ -89,6 +90,7 @@ public void run() { runner.logCompletion(created, started, executed, finished, successful, error); } + @SuppressWarnings("squid:S2142") private Runnable watchThread(Thread workThread, Semaphore timerSemaphore) { return () -> { boolean finished1 = false; diff --git a/bundle/src/main/java/com/adobe/acs/commons/forms/FormsRouter.java b/bundle/src/main/java/com/adobe/acs/commons/forms/FormsRouter.java index 83dac92172..0826d5b0de 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/forms/FormsRouter.java +++ b/bundle/src/main/java/com/adobe/acs/commons/forms/FormsRouter.java @@ -29,6 +29,7 @@ * Internal routing used for internal routing of POST form submissions in the Filters. */ @ProviderType +@SuppressWarnings("squid:S1214") public interface FormsRouter { String FORM_RESOURCE_INPUT = FormHelper.FORM_RESOURCE_INPUT; String FORM_NAME_INPUT = FormHelper.FORM_NAME_INPUT; diff --git a/bundle/src/main/java/com/adobe/acs/commons/forms/components/FormComponent.java b/bundle/src/main/java/com/adobe/acs/commons/forms/components/FormComponent.java index 6d2e155cd2..76fc0291f0 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/forms/components/FormComponent.java +++ b/bundle/src/main/java/com/adobe/acs/commons/forms/components/FormComponent.java @@ -1,74 +1,75 @@ -/* - * #%L - * ACS AEM Commons Bundle - * %% - * Copyright (C) 2013 Adobe - * %% - * 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. - * #L% - */ +/* + * #%L + * ACS AEM Commons Bundle + * %% + * Copyright (C) 2013 Adobe + * %% + * 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. + * #L% + */ package com.adobe.acs.commons.forms.components; -import aQute.bnd.annotation.ProviderType; - +import aQute.bnd.annotation.ProviderType; + import com.adobe.acs.commons.forms.Form; - + import org.apache.sling.api.SlingHttpServletRequest; import org.apache.sling.api.SlingHttpServletResponse; - + @ProviderType +@SuppressWarnings("squid:S00112") public interface FormComponent { /** - * - * @return - */ - public String getFormName(); - - /** - * Get the data from the HTTP Request and move into the Map-based Form abstraction - * @param request - * @return - */ - public Form getForm(SlingHttpServletRequest request); - - /** - * Validate the provided form data. Create any Error records on the form itself. - * - * @param form - * @return - */ - public Form validate(Form form); - - /** - * Save the data to the underlying data store; implementation specific. This could be CRX or external data store. - * @param form - * @return - */ - public boolean save(Form form); - - /** - * Handle successful form submission. Typically includes a 302 redirect to a Success page. - * @param form - * @param request - * @param response - */ - public void onSuccess(Form form, SlingHttpServletRequest request, SlingHttpServletResponse response) throws Exception; - - /** - * Handle unsuccessful form submission. Typically includes a 302 redirect back to self. - * @param form - * @param request - * @param response - */ - public void onFailure(Form form, SlingHttpServletRequest request, SlingHttpServletResponse response) throws Exception; + * + * @return + */ + public String getFormName(); + + /** + * Get the data from the HTTP Request and move into the Map-based Form abstraction + * @param request + * @return + */ + public Form getForm(SlingHttpServletRequest request); + + /** + * Validate the provided form data. Create any Error records on the form itself. + * + * @param form + * @return + */ + public Form validate(Form form); + + /** + * Save the data to the underlying data store; implementation specific. This could be CRX or external data store. + * @param form + * @return + */ + public boolean save(Form form); + + /** + * Handle successful form submission. Typically includes a 302 redirect to a Success page. + * @param form + * @param request + * @param response + */ + public void onSuccess(Form form, SlingHttpServletRequest request, SlingHttpServletResponse response) throws Exception; + + /** + * Handle unsuccessful form submission. Typically includes a 302 redirect back to self. + * @param form + * @param request + * @param response + */ + public void onFailure(Form form, SlingHttpServletRequest request, SlingHttpServletResponse response) throws Exception; } \ No newline at end of file diff --git a/bundle/src/main/java/com/adobe/acs/commons/forms/components/MultiStepFormComponent.java b/bundle/src/main/java/com/adobe/acs/commons/forms/components/MultiStepFormComponent.java index c97ea8f488..a89fdfedb4 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/forms/components/MultiStepFormComponent.java +++ b/bundle/src/main/java/com/adobe/acs/commons/forms/components/MultiStepFormComponent.java @@ -1,81 +1,82 @@ -/* - * #%L - * ACS AEM Commons Bundle - * %% - * Copyright (C) 2013 Adobe - * %% - * 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. - * #L% - */ +/* + * #%L + * ACS AEM Commons Bundle + * %% + * Copyright (C) 2013 Adobe + * %% + * 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. + * #L% + */ package com.adobe.acs.commons.forms.components; -import aQute.bnd.annotation.ProviderType; - +import aQute.bnd.annotation.ProviderType; + import com.adobe.acs.commons.forms.Form; - + import org.apache.sling.api.SlingHttpServletRequest; import org.apache.sling.api.SlingHttpServletResponse; - + @ProviderType +@SuppressWarnings("squid:S00112") public interface MultiStepFormComponent { - /** - * Get the data from the HTTP Request and move into the Map-based Form - * abstraction - * - * @param request - * @return - */ - public Form getForm(SlingHttpServletRequest request, String step); - - /** - * Validate the provided form data. Create any Error records on the form - * itself. - * - * @param form - * @return - */ - public Form validate(Form form, String step); + /** + * Get the data from the HTTP Request and move into the Map-based Form + * abstraction + * + * @param request + * @return + */ + Form getForm(SlingHttpServletRequest request, String step); + + /** + * Validate the provided form data. Create any Error records on the form + * itself. + * + * @param form + * @return + */ + Form validate(Form form, String step); - /** - * Save the data to the underlying data store; implementation specific. This - * could be CRX or external data store. - * - * @param form - * @return - */ - public boolean save(Form form, String step); + /** + * Save the data to the underlying data store; implementation specific. This + * could be CRX or external data store. + * + * @param form + * @return + */ + boolean save(Form form, String step); - /** - * Handle successful form submission. Typically includes a 302 redirect to a - * Success page. - * - * @param form - * @param request - * @param response - */ - public void onSuccess(Form form, String step, + /** + * Handle successful form submission. Typically includes a 302 redirect to a + * Success page. + * + * @param form + * @param request + * @param response + */ + void onSuccess(Form form, String step, SlingHttpServletRequest request, SlingHttpServletResponse response) - throws Exception; + throws Exception; - /** - * Handle unsuccessful form submission. Typically includes a 302 redirect - * back to self. - * - * @param form - * @param request - * @param response - */ - public void onFailure(Form form, String step, SlingHttpServletRequest request, + /** + * Handle unsuccessful form submission. Typically includes a 302 redirect + * back to self. + * + * @param form + * @param request + * @param response + */ + void onFailure(Form form, String step, SlingHttpServletRequest request, SlingHttpServletResponse response) throws Exception; } diff --git a/bundle/src/main/java/com/adobe/acs/commons/forms/helpers/FormHelper.java b/bundle/src/main/java/com/adobe/acs/commons/forms/helpers/FormHelper.java index fe6264cdef..49111ced54 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/forms/helpers/FormHelper.java +++ b/bundle/src/main/java/com/adobe/acs/commons/forms/helpers/FormHelper.java @@ -34,6 +34,7 @@ import java.io.IOException; @ProviderType +@SuppressWarnings("squid:S1214") public interface FormHelper { String EXTENSION = ".html"; diff --git a/bundle/src/main/java/com/adobe/acs/commons/forms/helpers/ForwardAsGetFormHelper.java b/bundle/src/main/java/com/adobe/acs/commons/forms/helpers/ForwardAsGetFormHelper.java index 28686a3490..efb853ae76 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/forms/helpers/ForwardAsGetFormHelper.java +++ b/bundle/src/main/java/com/adobe/acs/commons/forms/helpers/ForwardAsGetFormHelper.java @@ -1,42 +1,43 @@ -/* - * #%L - * ACS AEM Commons Bundle - * %% - * Copyright (C) 2013 Adobe - * %% - * 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. - * #L% - */ +/* + * #%L + * ACS AEM Commons Bundle + * %% + * Copyright (C) 2013 Adobe + * %% + * 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. + * #L% + */ package com.adobe.acs.commons.forms.helpers; -import aQute.bnd.annotation.ProviderType; - +import aQute.bnd.annotation.ProviderType; + import com.adobe.acs.commons.forms.Form; import com.day.cq.wcm.api.Page; - + import org.apache.sling.api.SlingHttpServletRequest; import org.apache.sling.api.SlingHttpServletResponse; import org.apache.sling.api.request.RequestDispatcherOptions; import org.apache.sling.api.resource.Resource; - + import javax.servlet.ServletException; - + import java.io.IOException; /** * Interface used for working with ACS-AEM-Commons forms. - */ -@ProviderType + */ +@ProviderType +@SuppressWarnings("squid:S1214") public interface ForwardAsGetFormHelper extends FormHelper { public final String REQUEST_ATTR_FORM_KEY = ForwardAsGetFormHelper.class.getName() + "__Form_"; diff --git a/bundle/src/main/java/com/adobe/acs/commons/forms/helpers/PostRedirectGetFormHelper.java b/bundle/src/main/java/com/adobe/acs/commons/forms/helpers/PostRedirectGetFormHelper.java index 90e05d4c02..eb337cb04f 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/forms/helpers/PostRedirectGetFormHelper.java +++ b/bundle/src/main/java/com/adobe/acs/commons/forms/helpers/PostRedirectGetFormHelper.java @@ -1,42 +1,43 @@ -/* - * #%L - * ACS AEM Commons Bundle - * %% - * Copyright (C) 2013 Adobe - * %% - * 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. - * #L% - */ +/* + * #%L + * ACS AEM Commons Bundle + * %% + * Copyright (C) 2013 Adobe + * %% + * 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. + * #L% + */ package com.adobe.acs.commons.forms.helpers; -import aQute.bnd.annotation.ProviderType; - +import aQute.bnd.annotation.ProviderType; + import com.adobe.acs.commons.forms.Form; import com.day.cq.wcm.api.Page; - + import org.apache.sling.api.SlingHttpServletResponse; import org.apache.sling.api.resource.Resource; import org.apache.sling.commons.json.JSONException; - + import java.io.IOException; - + @ProviderType +@SuppressWarnings("squid:S1214") public interface PostRedirectGetFormHelper extends FormHelper { - public final static String KEY_FORM_NAME = "n"; - public final static String KEY_FORM = "f"; - public final static String KEY_ERRORS = "e"; - public final static String KEY_PREFIX_FORM_NAME = "f_"; - public final static String QUERY_PARAM_FORM_SELECTOR = "f_selector"; + String KEY_FORM_NAME = "n"; + String KEY_FORM = "f"; + String KEY_ERRORS = "e"; + String KEY_PREFIX_FORM_NAME = "f_"; + String QUERY_PARAM_FORM_SELECTOR = "f_selector"; /** * Issues a 302 redirect with the form serialized into a JSON object that can be @@ -50,7 +51,7 @@ public interface PostRedirectGetFormHelper extends FormHelper { * @throws IOException * @throws JSONException */ - public void sendRedirect(Form form, String path, SlingHttpServletResponse response) throws IOException, JSONException; + void sendRedirect(Form form, String path, SlingHttpServletResponse response) throws IOException, JSONException; /** * Issues a 302 redirect with the form serialized into a JSON object that can be @@ -64,7 +65,7 @@ public interface PostRedirectGetFormHelper extends FormHelper { * @throws IOException * @throws JSONException */ - public void sendRedirect(Form form, Page page, SlingHttpServletResponse response) throws IOException, JSONException; + void sendRedirect(Form form, Page page, SlingHttpServletResponse response) throws IOException, JSONException; /** /** @@ -79,7 +80,7 @@ public interface PostRedirectGetFormHelper extends FormHelper { * @throws IOException * @throws JSONException */ - public void sendRedirect(Form form, Resource resource, SlingHttpServletResponse response) throws IOException, JSONException; + void sendRedirect(Form form, Resource resource, SlingHttpServletResponse response) throws IOException, JSONException; /** @@ -96,7 +97,7 @@ public interface PostRedirectGetFormHelper extends FormHelper { * @throws IOException * @throws JSONException */ - public void sendRedirect(Form form, String path, String formSelector, SlingHttpServletResponse response) throws IOException, JSONException; + void sendRedirect(Form form, String path, String formSelector, SlingHttpServletResponse response) throws IOException, JSONException; /** * Same as: @@ -112,7 +113,7 @@ public interface PostRedirectGetFormHelper extends FormHelper { * @throws IOException * @throws JSONException */ - public void sendRedirect(Form form, Page page, String formSelector, SlingHttpServletResponse response) throws IOException, JSONException; + void sendRedirect(Form form, Page page, String formSelector, SlingHttpServletResponse response) throws IOException, JSONException; /** * Same as: @@ -128,5 +129,5 @@ public interface PostRedirectGetFormHelper extends FormHelper { * @throws IOException * @throws JSONException */ - public void sendRedirect(Form form, Resource resource, String formSelector, SlingHttpServletResponse response) throws IOException, JSONException; + void sendRedirect(Form form, Resource resource, String formSelector, SlingHttpServletResponse response) throws IOException, JSONException; } \ No newline at end of file diff --git a/bundle/src/main/java/com/adobe/acs/commons/forms/helpers/impl/AbstractFormHelperImpl.java b/bundle/src/main/java/com/adobe/acs/commons/forms/helpers/impl/AbstractFormHelperImpl.java index 667ce3dc0c..57f455efcf 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/forms/helpers/impl/AbstractFormHelperImpl.java +++ b/bundle/src/main/java/com/adobe/acs/commons/forms/helpers/impl/AbstractFormHelperImpl.java @@ -60,6 +60,7 @@ public abstract class AbstractFormHelperImpl { private static final String SERVICE_NAME = "form-helper"; private static final Map AUTH_INFO; + static { AUTH_INFO = Collections.singletonMap(ResourceResolverFactory.SUBSERVICE, (Object) SERVICE_NAME); } @@ -75,25 +76,27 @@ public abstract class AbstractFormHelperImpl { public final String getFormInputsHTML(final Form form, final String... keys) { // The form objects data and errors should be xssProtected before being passed into this method - StringBuffer html = new StringBuffer(); + StringBuilder html = new StringBuilder(); - html.append("\n"); + appendHiddenTag(html, FormHelper.FORM_NAME_INPUT, form.getName()); final String resourcePath = form.getResourcePath(); - html.append("\n"); + appendHiddenTag(html, FormHelper.FORM_RESOURCE_INPUT, resourcePath); for (final String key : keys) { if (form.has(key)) { - html.append("\n"); + appendHiddenTag(html, key, form.get(key)); } } return html.toString(); } + private void appendHiddenTag(StringBuilder html, String name, String value) { + html.append("\n"); + } + public final String getAction(final Page page) { return this.getAction(page.getPath()); } @@ -208,6 +211,7 @@ protected final Form getPostForm(final String formName, * @param formName * @return */ + @SuppressWarnings("squid:S1172") protected final String getPostLookupKey(final String formName) { // This may change; keeping as method call to ease future refactoring return FormHelper.FORM_NAME_INPUT; diff --git a/bundle/src/main/java/com/adobe/acs/commons/forms/helpers/impl/synthetics/SyntheticSlingHttpServletGetRequest.java b/bundle/src/main/java/com/adobe/acs/commons/forms/helpers/impl/synthetics/SyntheticSlingHttpServletGetRequest.java index c427d477d1..acce441152 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/forms/helpers/impl/synthetics/SyntheticSlingHttpServletGetRequest.java +++ b/bundle/src/main/java/com/adobe/acs/commons/forms/helpers/impl/synthetics/SyntheticSlingHttpServletGetRequest.java @@ -1,22 +1,22 @@ -/* - * #%L - * ACS AEM Commons Bundle - * %% - * Copyright (C) 2013 Adobe - * %% - * 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. - * #L% - */ +/* + * #%L + * ACS AEM Commons Bundle + * %% + * Copyright (C) 2013 Adobe + * %% + * 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. + * #L% + */ package com.adobe.acs.commons.forms.helpers.impl.synthetics; import org.apache.sling.api.SlingHttpServletRequest; @@ -26,14 +26,14 @@ * Used to turn a POST request into a GET request for Internal Forwarding */ public class SyntheticSlingHttpServletGetRequest extends SlingHttpServletRequestWrapper { - private static final String METHOD_GET = "GET"; + private static final String METHOD_GET = "GET"; - public SyntheticSlingHttpServletGetRequest(final SlingHttpServletRequest request) { - super(request); - } + public SyntheticSlingHttpServletGetRequest(final SlingHttpServletRequest request) { + super(request); + } - @Override - public String getMethod() { - return METHOD_GET; - } + @Override + public String getMethod() { + return METHOD_GET; + } } diff --git a/bundle/src/main/java/com/adobe/acs/commons/forms/impl/FormsPostFilterImpl.java b/bundle/src/main/java/com/adobe/acs/commons/forms/impl/FormsPostFilterImpl.java index 759a3a0b68..e1f8dda80d 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/forms/impl/FormsPostFilterImpl.java +++ b/bundle/src/main/java/com/adobe/acs/commons/forms/impl/FormsPostFilterImpl.java @@ -66,6 +66,7 @@ public class FormsPostFilterImpl implements javax.servlet.Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { + // no-op } @Override @@ -123,6 +124,7 @@ public final void doFilter(ServletRequest servletRequest, ServletResponse servle @Override public void destroy() { + // no-op } private String getParameter(SlingHttpServletRequest slingRequest, String param) { diff --git a/bundle/src/main/java/com/adobe/acs/commons/forms/impl/FormsPostRedirectGetFilterImpl.java b/bundle/src/main/java/com/adobe/acs/commons/forms/impl/FormsPostRedirectGetFilterImpl.java index 2c2d1c2f34..e431e17509 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/forms/impl/FormsPostRedirectGetFilterImpl.java +++ b/bundle/src/main/java/com/adobe/acs/commons/forms/impl/FormsPostRedirectGetFilterImpl.java @@ -68,6 +68,7 @@ public class FormsPostRedirectGetFilterImpl implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { + // no-op } @Override @@ -136,5 +137,6 @@ public final void doFilter(ServletRequest servletRequest, ServletResponse servle @Override public void destroy() { + // no-op } } \ No newline at end of file diff --git a/bundle/src/main/java/com/adobe/acs/commons/functions/BiConsumer.java b/bundle/src/main/java/com/adobe/acs/commons/functions/BiConsumer.java index cc9408de6d..5517794584 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/functions/BiConsumer.java +++ b/bundle/src/main/java/com/adobe/acs/commons/functions/BiConsumer.java @@ -28,6 +28,7 @@ * @param the type of the second argument to the operation * * @see Consumer + * @deprecated Use CheckedBiConsumer instead */ @ConsumerType @Deprecated @@ -54,7 +55,7 @@ public BiConsumer andThen(final BiConsumer after) { private static class Adapter extends BiConsumer { - final private CheckedBiConsumer delegate; + private final CheckedBiConsumer delegate; public Adapter(CheckedBiConsumer delegate) { this.delegate = delegate; diff --git a/bundle/src/main/java/com/adobe/acs/commons/functions/BiFunction.java b/bundle/src/main/java/com/adobe/acs/commons/functions/BiFunction.java index 10b11d8c38..b06f4763a1 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/functions/BiFunction.java +++ b/bundle/src/main/java/com/adobe/acs/commons/functions/BiFunction.java @@ -27,6 +27,7 @@ * @param the type of the result of the function * * @see Function + * @deprecated Use CheckedBiFunction instead */ @ConsumerType @Deprecated @@ -54,7 +55,7 @@ public static BiFunction adapt(CheckedBiFunction del private static class Adapter extends BiFunction { - final private CheckedBiFunction delegate; + private final CheckedBiFunction delegate; public Adapter(CheckedBiFunction delegate) { this.delegate = delegate; diff --git a/bundle/src/main/java/com/adobe/acs/commons/functions/CheckedBiConsumer.java b/bundle/src/main/java/com/adobe/acs/commons/functions/CheckedBiConsumer.java index f0064d5d0b..22b028ba12 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/functions/CheckedBiConsumer.java +++ b/bundle/src/main/java/com/adobe/acs/commons/functions/CheckedBiConsumer.java @@ -31,6 +31,7 @@ */ @ConsumerType @FunctionalInterface +@SuppressWarnings("squid:S00112") public interface CheckedBiConsumer { /** diff --git a/bundle/src/main/java/com/adobe/acs/commons/functions/CheckedBiFunction.java b/bundle/src/main/java/com/adobe/acs/commons/functions/CheckedBiFunction.java index 4ea3893b33..8dae8c68d2 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/functions/CheckedBiFunction.java +++ b/bundle/src/main/java/com/adobe/acs/commons/functions/CheckedBiFunction.java @@ -30,6 +30,7 @@ */ @ConsumerType @FunctionalInterface +@SuppressWarnings("squid:S00112") public interface CheckedBiFunction { /** diff --git a/bundle/src/main/java/com/adobe/acs/commons/functions/CheckedConsumer.java b/bundle/src/main/java/com/adobe/acs/commons/functions/CheckedConsumer.java index 7e5ef5cb91..12235c5af2 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/functions/CheckedConsumer.java +++ b/bundle/src/main/java/com/adobe/acs/commons/functions/CheckedConsumer.java @@ -27,6 +27,7 @@ */ @ConsumerType @FunctionalInterface +@SuppressWarnings("squid:S00112") public interface CheckedConsumer { void accept(T t) throws Exception; diff --git a/bundle/src/main/java/com/adobe/acs/commons/functions/CheckedFunction.java b/bundle/src/main/java/com/adobe/acs/commons/functions/CheckedFunction.java index e8731967ce..d5db0ab2c7 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/functions/CheckedFunction.java +++ b/bundle/src/main/java/com/adobe/acs/commons/functions/CheckedFunction.java @@ -26,6 +26,7 @@ */ @ConsumerType @FunctionalInterface +@SuppressWarnings("squid:S00112") public interface CheckedFunction { /** diff --git a/bundle/src/main/java/com/adobe/acs/commons/functions/Consumer.java b/bundle/src/main/java/com/adobe/acs/commons/functions/Consumer.java index 63b5115e9a..7d9c6ff50b 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/functions/Consumer.java +++ b/bundle/src/main/java/com/adobe/acs/commons/functions/Consumer.java @@ -24,6 +24,7 @@ * to operate via side-effects. * * @param the type of the input to the operation + * @deprecated Use CheckedConsumer instead */ @ConsumerType @Deprecated @@ -50,7 +51,7 @@ public static Consumer adapt(CheckedConsumer delegate) { private static class Adapter extends Consumer { - final private CheckedConsumer delegate; + private final CheckedConsumer delegate; public Adapter(CheckedConsumer delegate) { this.delegate = delegate; diff --git a/bundle/src/main/java/com/adobe/acs/commons/functions/Function.java b/bundle/src/main/java/com/adobe/acs/commons/functions/Function.java index de674065ca..02c009d445 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/functions/Function.java +++ b/bundle/src/main/java/com/adobe/acs/commons/functions/Function.java @@ -23,6 +23,7 @@ * * @param the type of the input to the function * @param the type of the result of the function + * @deprecated Use CheckedFunction instead */ @ConsumerType @Deprecated @@ -81,7 +82,7 @@ public static Function adapt(CheckedFunction delegate) { private static class Adapter extends Function { - final private CheckedFunction delegate; + private final CheckedFunction delegate; public Adapter(CheckedFunction delegate) { this.delegate = delegate; diff --git a/bundle/src/main/java/com/adobe/acs/commons/genericlists/impl/GenericListImpl.java b/bundle/src/main/java/com/adobe/acs/commons/genericlists/impl/GenericListImpl.java index 1a4259d945..77d38e6d41 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/genericlists/impl/GenericListImpl.java +++ b/bundle/src/main/java/com/adobe/acs/commons/genericlists/impl/GenericListImpl.java @@ -51,14 +51,11 @@ public ItemImpl(String t, String v, ValueMap props) { this.props = props; } + @Override public String getTitle() { return title; } - public String getValue() { - return value; - } - @Override public String getTitle(Locale locale) { // no locale - return default title @@ -72,20 +69,20 @@ public String getTitle(Locale locale) { return getTitle(); } - String title = null; + String localizedTitle = null; // try property name like jcr:title.de_ch if (locale.getCountry().length() > 0) { - title = getLocalizedTitle(locale); + localizedTitle = getLocalizedTitle(locale); } // then just jcr:title.de - if (title == null) { - title = getLocalizedTitle(new Locale(language)); + if (localizedTitle == null) { + localizedTitle = getLocalizedTitle(new Locale(language)); } - if (title == null) { + if (localizedTitle == null) { return getTitle(); } else { - return title; + return localizedTitle; } } @@ -93,6 +90,11 @@ private String getLocalizedTitle(Locale locale) { return props.get(TITLE_PREFIX + locale.toString().toLowerCase(), String.class); } + @Override + public String getValue() { + return value; + } + } private final List items; diff --git a/bundle/src/main/java/com/adobe/acs/commons/hc/impl/HealthCheckStatusEmailer.java b/bundle/src/main/java/com/adobe/acs/commons/hc/impl/HealthCheckStatusEmailer.java index 799ac6b022..a72a086884 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/hc/impl/HealthCheckStatusEmailer.java +++ b/bundle/src/main/java/com/adobe/acs/commons/hc/impl/HealthCheckStatusEmailer.java @@ -81,6 +81,8 @@ public class HealthCheckStatusEmailer implements Runnable { private static final int HEALTH_CHECK_STATUS_PADDING = 20; private static final int NUM_DASHES = 100; + private static final Object LOCK = new Object(); + private Calendar nextEmailTime = Calendar.getInstance(); /* OSGi Properties */ @@ -196,10 +198,10 @@ public final void run() { final long timeTaken = System.currentTimeMillis() - start; log.info("Executed ACS Commons Health Check E-mailer scheduled service in [ {} ms ]", timeTaken); - if (!sendEmailOnlyOnFailure || (sendEmailOnlyOnFailure && failure.size() > 0)) { + if (!sendEmailOnlyOnFailure || failure.size() > 0) { if (nextEmailTime == null || Calendar.getInstance().after(nextEmailTime)) { sendEmail(success, failure, timeTaken); - synchronized (nextEmailTime) { + synchronized (LOCK) { nextEmailTime = Calendar.getInstance(); nextEmailTime.add(Calendar.MINUTE, throttleInMins); } @@ -218,6 +220,7 @@ public final void run() { * @param failure the list of unsuccessful Health Check Execution Results * @param timeTaken the time taken to execute all Health Checks */ + @SuppressWarnings("squid:S1192") protected final void sendEmail(final List success, final List failure, final long timeTaken) { final ProductInfo[] productInfos = productInfoService.getInfos(); final String hostname = getHostname(); @@ -316,13 +319,14 @@ protected final void activate(final Map config) { * * @return the AEM Instance's hostname. */ + @SuppressWarnings({"squid:S3776", "squid:S1192"}) private String getHostname() { String hostname = null; - final String OS = System.getProperty("os.name").toLowerCase(); + final String os = System.getProperty("os.name").toLowerCase(); // Unpleasant 'if structure' to avoid making unnecessary Runtime calls; only call Runtime. - if (OS.indexOf("win") >= 0) { + if (os.indexOf("win") >= 0) { hostname = System.getenv("COMPUTERNAME"); if (StringUtils.isBlank(hostname)) { try { @@ -331,7 +335,7 @@ private String getHostname() { log.warn("Unable to collect hostname from Windows via 'hostname' command.", ex); } } - } else if (OS.indexOf("nix") >= 0 || OS.indexOf("nux") >= 0 || OS.indexOf("mac") >= 0) { + } else if (os.indexOf("nix") >= 0 || os.indexOf("nux") >= 0 || os.indexOf("mac") >= 0) { hostname = System.getenv("HOSTNAME"); if (StringUtils.isBlank(hostname)) { @@ -350,7 +354,7 @@ private String getHostname() { } } } else { - log.warn("Unidentifiable OS [ {} ]. Could not collect hostname.", OS); + log.warn("Unidentifiable OS [ {} ]. Could not collect hostname.", os); } hostname = StringUtils.trimToNull(hostname); diff --git a/bundle/src/main/java/com/adobe/acs/commons/hc/impl/SMTPMailServiceHealthCheck.java b/bundle/src/main/java/com/adobe/acs/commons/hc/impl/SMTPMailServiceHealthCheck.java index 1d37dfb213..a8012baaad 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/hc/impl/SMTPMailServiceHealthCheck.java +++ b/bundle/src/main/java/com/adobe/acs/commons/hc/impl/SMTPMailServiceHealthCheck.java @@ -26,8 +26,15 @@ import org.apache.commons.lang.CharEncoding; import org.apache.commons.lang.text.StrLookup; import org.apache.commons.mail.SimpleEmail; -import org.apache.felix.scr.annotations.*; +import org.apache.felix.scr.annotations.Activate; +import org.apache.felix.scr.annotations.Component; +import org.apache.felix.scr.annotations.ConfigurationPolicy; import org.apache.felix.scr.annotations.Properties; +import org.apache.felix.scr.annotations.Property; +import org.apache.felix.scr.annotations.PropertyUnbounded; +import org.apache.felix.scr.annotations.Reference; +import org.apache.felix.scr.annotations.ReferenceCardinality; +import org.apache.felix.scr.annotations.Service; import org.apache.sling.commons.osgi.PropertiesUtil; import org.apache.sling.hc.api.HealthCheck; import org.apache.sling.hc.api.Result; @@ -36,7 +43,10 @@ import org.slf4j.LoggerFactory; import javax.mail.internet.InternetAddress; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; @Component(metatype = true, label = "ACS AEM Commons - Health Check - SMTP E-Mail Service", @@ -59,6 +69,7 @@ value = "smtpMailService", propertyPrivate = true)}) @Service +@SuppressWarnings("checkstyle:abbreviationaswordinname") public class SMTPMailServiceHealthCheck implements HealthCheck { private static final Logger log = LoggerFactory.getLogger(SMTPMailServiceHealthCheck.class); @@ -66,8 +77,8 @@ public class SMTPMailServiceHealthCheck implements HealthCheck { private static final int TIMEOUT = 1000 * 10; private static String MAIL_TEMPLATE = - System.getProperty("line.separator") + - "Sling Health Check for AEM E-mail Service connectivity"; + System.getProperty("line.separator") + + "Sling Health Check for AEM E-mail Service connectivity"; private static final String DEFAULT_EMAIL = "healthcheck@example.com"; @Property( @@ -75,17 +86,18 @@ public class SMTPMailServiceHealthCheck implements HealthCheck { description = "E-mail address to send test message to.", value = DEFAULT_EMAIL) private static final String PROP_EMAIL = "email"; - private String email; + private String toEmail; @Reference(cardinality = ReferenceCardinality.OPTIONAL_UNARY) private MessageGatewayService messageGatewayService; @Activate protected void activate(Map properties) { - this.email = PropertiesUtil.toString(properties.get(PROP_EMAIL), DEFAULT_EMAIL); + this.toEmail = PropertiesUtil.toString(properties.get(PROP_EMAIL), DEFAULT_EMAIL); } @Override + @SuppressWarnings("squid:S1141") public Result execute() { final FormattingResultLog resultLog = new FormattingResultLog(); @@ -102,7 +114,7 @@ public Result execute() { } else { try { List emailAddresses = new ArrayList(); - emailAddresses.add(new InternetAddress(this.email)); + emailAddresses.add(new InternetAddress(this.toEmail)); MailTemplate mailTemplate = new MailTemplate(IOUtils.toInputStream(MAIL_TEMPLATE), CharEncoding.UTF_8); SimpleEmail email = mailTemplate.getEmail(StrLookup.mapLookup(Collections.emptyMap()), SimpleEmail.class); @@ -113,15 +125,15 @@ public Result execute() { email.setSocketTimeout(TIMEOUT); try { messageGateway.send(email); - resultLog.info("The E-mail Service appears to be working properly. Verify the health check e-mail was sent to [ {} ]", this.email); + resultLog.info("The E-mail Service appears to be working properly. Verify the health check e-mail was sent to [ {} ]", this.toEmail); } catch (Exception e) { - resultLog.critical("Failed sending e-mail. Unable to send a test email via the configured E-mail server: " + e.getMessage(), e); + resultLog.critical("Failed sending e-mail. Unable to send a test toEmail via the configured E-mail server: " + e.getMessage(), e); log.warn("Failed to send E-mail for E-mail Service health check", e); } logMailServiceConfig(resultLog, email); } catch (Exception e) { - resultLog.healthCheckError("Sling Health check could not formulate a test email: " + e.getMessage(), e); + resultLog.healthCheckError("Sling Health check could not formulate a test toEmail: " + e.getMessage(), e); log.error("Unable to execute E-mail health check", e); } } diff --git a/bundle/src/main/java/com/adobe/acs/commons/http/headers/impl/AbstractDispatcherCacheHeaderFilter.java b/bundle/src/main/java/com/adobe/acs/commons/http/headers/impl/AbstractDispatcherCacheHeaderFilter.java index bfb384374b..b483b701cb 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/http/headers/impl/AbstractDispatcherCacheHeaderFilter.java +++ b/bundle/src/main/java/com/adobe/acs/commons/http/headers/impl/AbstractDispatcherCacheHeaderFilter.java @@ -123,9 +123,9 @@ protected boolean accepts(final HttpServletRequest request) { // - GET request // - No Params // - From Dispatcher - if (StringUtils.equalsIgnoreCase("get", request.getMethod()) && - request.getParameterMap().isEmpty() && - serverAgents.contains(DISPATCHER_AGENT_HEADER_VALUE)) { + if (StringUtils.equalsIgnoreCase("get", request.getMethod()) + && request.getParameterMap().isEmpty() + && serverAgents.contains(DISPATCHER_AGENT_HEADER_VALUE)) { return true; } @@ -133,6 +133,7 @@ protected boolean accepts(final HttpServletRequest request) { } @Activate + @SuppressWarnings("squid:S1149") protected final void activate(ComponentContext context) throws Exception { Dictionary properties = context.getProperties(); diff --git a/bundle/src/main/java/com/adobe/acs/commons/http/impl/HttpClientFactoryImpl.java b/bundle/src/main/java/com/adobe/acs/commons/http/impl/HttpClientFactoryImpl.java index 0097edf904..ecd93b2939 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/http/impl/HttpClientFactoryImpl.java +++ b/bundle/src/main/java/com/adobe/acs/commons/http/impl/HttpClientFactoryImpl.java @@ -20,7 +20,13 @@ package com.adobe.acs.commons.http.impl; import com.adobe.acs.commons.http.HttpClientFactory; -import org.apache.felix.scr.annotations.*; +import org.apache.felix.scr.annotations.Activate; +import org.apache.felix.scr.annotations.Component; +import org.apache.felix.scr.annotations.ConfigurationPolicy; +import org.apache.felix.scr.annotations.Deactivate; +import org.apache.felix.scr.annotations.Property; +import org.apache.felix.scr.annotations.Reference; +import org.apache.felix.scr.annotations.Service; import org.apache.http.HttpHost; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.fluent.Executor; @@ -73,6 +79,7 @@ public class HttpClientFactoryImpl implements HttpClientFactory { private static final String PROP_USERNAME = "username"; @Property(label = "Password", description = "Password for requests (using basic authentication)") + @SuppressWarnings("squid:S2068") private static final String PROP_PASSWORD = "password"; @Property(label = "Socket Timeout", description = "Socket timeout in milliseconds", intValue = DEFAULT_SOCKET_TIMEOUT) @@ -91,7 +98,6 @@ public class HttpClientFactoryImpl implements HttpClientFactory { @Activate protected void activate(Map config) throws Exception { boolean useSSL = PropertiesUtil.toBoolean(config.get(PROP_USE_SSL), DEFAULT_USE_SSL); - boolean disableCertCheck = PropertiesUtil.toBoolean(config.get(PROP_DISABLE_CERT_CHECK), DEFAULT_DISABLE_CERT_CHECK); String scheme = useSSL ? "https" : "http"; String hostname = PropertiesUtil.toString(config.get(PROP_HOST_DOMAIN), null); @@ -114,6 +120,8 @@ protected void activate(Map config) throws Exception { .build(); builder.setDefaultRequestConfig(requestConfig); + boolean disableCertCheck = PropertiesUtil.toBoolean(config.get(PROP_DISABLE_CERT_CHECK), DEFAULT_DISABLE_CERT_CHECK); + if (useSSL && disableCertCheck) { SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() { public boolean isTrusted(X509Certificate[] arg0, String arg1) throws CertificateException { diff --git a/bundle/src/main/java/com/adobe/acs/commons/http/injectors/AbstractHtmlRequestInjector.java b/bundle/src/main/java/com/adobe/acs/commons/http/injectors/AbstractHtmlRequestInjector.java index f6072f9a1b..8be08d6502 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/http/injectors/AbstractHtmlRequestInjector.java +++ b/bundle/src/main/java/com/adobe/acs/commons/http/injectors/AbstractHtmlRequestInjector.java @@ -108,6 +108,7 @@ public void destroy() { } + @SuppressWarnings("squid:S3923") protected boolean accepts(final ServletRequest servletRequest, final ServletResponse servletResponse) { @@ -143,6 +144,7 @@ protected boolean accepts(final ServletRequest servletRequest, return true; } + @SuppressWarnings("squid:S1149") protected final void registerAsFilter(ComponentContext ctx, int ranking, String pattern) { Dictionary filterProps = new Hashtable(); @@ -152,6 +154,7 @@ protected final void registerAsFilter(ComponentContext ctx, int ranking, String filterRegistration = ctx.getBundleContext().registerService(Filter.class.getName(), this, filterProps); } + @SuppressWarnings("squid:S1149") protected final void registerAsSlingFilter(ComponentContext ctx, int ranking, String pattern) { Dictionary filterProps = new Hashtable(); diff --git a/bundle/src/main/java/com/adobe/acs/commons/httpcache/config/AuthenticationStatusConfigConstants.java b/bundle/src/main/java/com/adobe/acs/commons/httpcache/config/AuthenticationStatusConfigConstants.java index 2678aa7827..fe469227c1 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/httpcache/config/AuthenticationStatusConfigConstants.java +++ b/bundle/src/main/java/com/adobe/acs/commons/httpcache/config/AuthenticationStatusConfigConstants.java @@ -24,7 +24,6 @@ */ public final class AuthenticationStatusConfigConstants { private AuthenticationStatusConfigConstants() { - throw new Error(AuthenticationStatusConfigConstants.class.getName() + " is not meant to be instantiated."); } /** Unauthenticated public requests */ diff --git a/bundle/src/main/java/com/adobe/acs/commons/httpcache/config/impl/GroupHttpCacheConfigExtension.java b/bundle/src/main/java/com/adobe/acs/commons/httpcache/config/impl/GroupHttpCacheConfigExtension.java index 4ec9b719f4..3f48d8d7d3 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/httpcache/config/impl/GroupHttpCacheConfigExtension.java +++ b/bundle/src/main/java/com/adobe/acs/commons/httpcache/config/impl/GroupHttpCacheConfigExtension.java @@ -58,8 +58,8 @@ * user's group membership list. Made it as config factory as it could move along 1-1 with HttpCacheConfig. */ @Component(label = "ACS AEM Commons - HTTP Cache - Group based extension for HttpCacheConfig and CacheKeyFactory.", - description = "HttpCacheConfig custom extension for group based configuration and associated cache key " + - "creation.", + description = "HttpCacheConfig custom extension for group based configuration and associated cache key " + + "creation.", metatype = true, configurationFactory = true, policy = ConfigurationPolicy.REQUIRE @@ -171,6 +171,10 @@ public boolean equals(Object o) { return false; } + if (o == null) { + return false; + } + GroupCacheKey that = (GroupCacheKey) o; return new EqualsBuilder() diff --git a/bundle/src/main/java/com/adobe/acs/commons/httpcache/config/impl/HttpCacheConfigImpl.java b/bundle/src/main/java/com/adobe/acs/commons/httpcache/config/impl/HttpCacheConfigImpl.java index bdbea1e2e4..5f4948c982 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/httpcache/config/impl/HttpCacheConfigImpl.java +++ b/bundle/src/main/java/com/adobe/acs/commons/httpcache/config/impl/HttpCacheConfigImpl.java @@ -66,12 +66,12 @@ ) @Properties({ @Property(name = "webconsole.configurationFactory.nameHint", - value = "Order: {httpcache.config.order}, " + - "Request URIs: {httpcache.config.requesturi.patterns}, " + - "Request URIs blacklist: {httpcache.config.requesturi.patterns.blacklisted}, " + - "Authentication: {httpcache.config.request.authentication}, " + - "Invalidation paths: {httpcache.config.invalidation.oak.paths}, " + - "Cache type: {httpcache.config.cachestore}", + value = "Order: {httpcache.config.order}, " + + "Request URIs: {httpcache.config.requesturi.patterns}, " + + "Request URIs blacklist: {httpcache.config.requesturi.patterns.blacklisted}, " + + "Authentication: {httpcache.config.request.authentication}, " + + "Invalidation paths: {httpcache.config.invalidation.oak.paths}, " + + "Cache type: {httpcache.config.cachestore}", propertyPrivate = true) }) @Service @@ -84,16 +84,16 @@ public class HttpCacheConfigImpl implements HttpCacheConfig { public static final int DEFAULT_ORDER = 1000; private int order = DEFAULT_ORDER; @Property(label = "Priority order", - description = "Order in which the HttpCacheEngine should evaluate the HttpCacheConfigs against the " + - "request. Evaluates smallest to largest (Integer.MIN_VALUE -> Integer.MAX_VALUE). Defaults to " + - "1000 ", + description = "Order in which the HttpCacheEngine should evaluate the HttpCacheConfigs against the " + + "request. Evaluates smallest to largest (Integer.MIN_VALUE -> Integer.MAX_VALUE). Defaults to " + + "1000 ", intValue = DEFAULT_ORDER) public static final String PROP_ORDER = "httpcache.config.order"; // Request URIs - Whitelisted. @Property(label = "Request URI patterns", - description = "Request URI patterns (REGEX) to be cached. Example - /content/mysite(.*).product-data" + - ".json. Mandatory parameter.", + description = "Request URI patterns (REGEX) to be cached. Example - /content/mysite(.*).product-data" + + ".json. Mandatory parameter.", cardinality = Integer.MAX_VALUE) private static final String PROP_REQUEST_URI_PATTERNS = "httpcache.config.requesturi.patterns"; private List requestUriPatterns; @@ -101,8 +101,8 @@ public class HttpCacheConfigImpl implements HttpCacheConfig { // Request URIs - Blacklisted. @Property(label = "Blacklisted request URI patterns", - description = "Blacklisted request URI patterns (REGEX). Evaluated post applying the above request uri " + - "" + "patterns (httpcache.config.requesturi.patterns). Optional parameter.", + description = "Blacklisted request URI patterns (REGEX). Evaluated post applying the above request uri " + + "patterns (httpcache.config.requesturi.patterns). Optional parameter.", cardinality = Integer.MAX_VALUE) private static final String PROP_BLACKLISTED_REQUEST_URI_PATTERNS = "httpcache.config.requesturi.patterns.blacklisted"; @@ -119,8 +119,7 @@ public class HttpCacheConfigImpl implements HttpCacheConfig { @PropertyOption(name = AuthenticationStatusConfigConstants.AUTHENTICATED_REQUEST, value = AuthenticationStatusConfigConstants.AUTHENTICATED_REQUEST), @PropertyOption(name = AuthenticationStatusConfigConstants.BOTH_ANONYMOUS_AUTHENTICATED_REQUESTS, - value = AuthenticationStatusConfigConstants - .BOTH_ANONYMOUS_AUTHENTICATED_REQUESTS) + value = AuthenticationStatusConfigConstants.BOTH_ANONYMOUS_AUTHENTICATED_REQUESTS) }, value = AuthenticationStatusConfigConstants.ANONYMOUS_REQUEST) // @formatter:on @@ -131,8 +130,8 @@ public class HttpCacheConfigImpl implements HttpCacheConfig { // Invalidation paths @Property(label = "JCR path pattern (REGEX) for cache invalidation ", - description = "Optional set of paths in JCR (Oak) repository for which this cache has to be invalidated" + - ". This accepts " + "REGEX. Example - /etc/my-products(.*)", + description = "Optional set of paths in JCR (Oak) repository for which this cache has to be invalidated" + + ". This accepts " + "REGEX. Example - /etc/my-products(.*)", cardinality = Integer.MAX_VALUE) private static final String PROP_CACHE_INVALIDATION_PATH_PATTERNS = "httpcache.config.invalidation.oak.paths"; private List cacheInvalidationPathPatterns; @@ -179,9 +178,9 @@ public class HttpCacheConfigImpl implements HttpCacheConfig { // Making the cache config extension configurable. @Property(name = "cacheConfigExtension.target", label = "HttpCacheConfigExtension service pid", - description = "Service pid of target implementation of HttpCacheConfigExtension to be used. Example - " + - "(service.pid=com.adobe.acs.commons.httpcache.config.impl.GroupHttpCacheConfigExtension)." + - " Optional parameter.", + description = "Service pid of target implementation of HttpCacheConfigExtension to be used. Example - " + + "(service.pid=com.adobe.acs.commons.httpcache.config.impl.GroupHttpCacheConfigExtension)." + + " Optional parameter.", value = "(service.pid=com.adobe.acs.commons.httpcache.config.impl.GroupHttpCacheConfigExtension)") @Reference(cardinality = ReferenceCardinality.OPTIONAL_UNARY, policy = ReferencePolicy.DYNAMIC, @@ -191,9 +190,9 @@ public class HttpCacheConfigImpl implements HttpCacheConfig { // Making the cache key factory configurable. @Property(name = "cacheKeyFactory.target", label = "CacheKeyFactory service pid", - description = "Service pid of target implementation of CacheKeyFactory to be used. Example - " + - "(service.pid=com.adobe.acs.commons.httpcac`he.config.impl.GroupHttpCacheConfigExtension)." + - " Mandatory parameter.", + description = "Service pid of target implementation of CacheKeyFactory to be used. Example - " + + "(service.pid=com.adobe.acs.commons.httpcac`he.config.impl.GroupHttpCacheConfigExtension)." + + " Mandatory parameter.", value = "(service.pid=com.adobe.acs.commons.httpcache.config.impl.GroupHttpCacheConfigExtension)") @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY, @@ -203,8 +202,8 @@ public class HttpCacheConfigImpl implements HttpCacheConfig { @Property(label = "Config-specific HttpCacheHandlingRules", - description = "List of Service pid of HttpCacheHandlingRule applicable for this cache config. Optional " + - "parameter", + description = "List of Service pid of HttpCacheHandlingRule applicable for this cache config. Optional " + + "parameter", unbounded = PropertyUnbounded.ARRAY) private static final String PROP_CACHE_HANDLING_RULES_PID = "httpcache.config.cache-handling-rules.pid"; private List cacheHandlingRulesPid; @@ -218,8 +217,8 @@ protected void activate(Map configs) { requestUriPatternsAsRegEx = compileToPatterns(requestUriPatterns); // Request URIs - Blacklisted. - blacklistedRequestUriPatterns = Arrays.asList(PropertiesUtil.toStringArray(configs.get - (PROP_BLACKLISTED_REQUEST_URI_PATTERNS), new String[]{})); + blacklistedRequestUriPatterns = Arrays.asList(PropertiesUtil.toStringArray(configs + .get(PROP_BLACKLISTED_REQUEST_URI_PATTERNS), new String[]{})); blacklistedRequestUriPatternsAsRegEx = compileToPatterns(blacklistedRequestUriPatterns); // Authentication requirement. @@ -230,8 +229,8 @@ protected void activate(Map configs) { cacheStore = PropertiesUtil.toString(configs.get(PROP_CACHE_STORE), DEFAULT_CACHE_STORE); // Cache invalidation paths. - cacheInvalidationPathPatterns = Arrays.asList(PropertiesUtil.toStringArray(configs.get - (PROP_CACHE_INVALIDATION_PATH_PATTERNS), new String[]{})); + cacheInvalidationPathPatterns = Arrays.asList(PropertiesUtil.toStringArray(configs + .get(PROP_CACHE_INVALIDATION_PATH_PATTERNS), new String[]{})); cacheInvalidationPathPatternsAsRegEx = compileToPatterns(cacheInvalidationPathPatterns); order = PropertiesUtil.toInteger(configs.get(PROP_ORDER), DEFAULT_ORDER); @@ -239,8 +238,8 @@ protected void activate(Map configs) { filterScope = FilterScope.valueOf(PropertiesUtil.toString(configs.get(PROP_FILTER_SCOPE), DEFAULT_FILTER_SCOPE).toUpperCase()); // PIDs of cache handling rules. - cacheHandlingRulesPid = new ArrayList(Arrays.asList(PropertiesUtil.toStringArray(configs.get - (PROP_CACHE_HANDLING_RULES_PID), new String[]{}))); + cacheHandlingRulesPid = new ArrayList(Arrays.asList(PropertiesUtil.toStringArray(configs + .get(PROP_CACHE_HANDLING_RULES_PID), new String[]{}))); ListIterator listIterator = cacheHandlingRulesPid.listIterator(); while (listIterator.hasNext()) { String value = listIterator.next(); @@ -288,8 +287,8 @@ public boolean accepts(SlingHttpServletRequest request) throws HttpCacheReposito // Match authentication requirement. if (UserUtils.isAnonymous(request.getResourceResolver().getUserID())) { if (AuthenticationStatusConfigConstants.AUTHENTICATED_REQUEST.equals(this.authenticationRequirement)) { - log.trace("Rejected: Request is anonymous but the config accepts only authenticated request and hence" + - " reject"); + log.trace("Rejected: Request is anonymous but the config accepts only authenticated request and hence" + + " reject"); return false; } } else { diff --git a/bundle/src/main/java/com/adobe/acs/commons/httpcache/config/impl/ResourceTypeHttpCacheConfigExtension.java b/bundle/src/main/java/com/adobe/acs/commons/httpcache/config/impl/ResourceTypeHttpCacheConfigExtension.java index add3382087..b44b54e96d 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/httpcache/config/impl/ResourceTypeHttpCacheConfigExtension.java +++ b/bundle/src/main/java/com/adobe/acs/commons/httpcache/config/impl/ResourceTypeHttpCacheConfigExtension.java @@ -171,6 +171,10 @@ public boolean equals(Object o) { return false; } + if (o == null) { + return false; + } + ResourceTypeCacheKey that = (ResourceTypeCacheKey) o; return new EqualsBuilder() .append(getUri(), that.getUri()) diff --git a/bundle/src/main/java/com/adobe/acs/commons/httpcache/engine/CacheContent.java b/bundle/src/main/java/com/adobe/acs/commons/httpcache/engine/CacheContent.java index 9810939e48..4003fa0071 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/httpcache/engine/CacheContent.java +++ b/bundle/src/main/java/com/adobe/acs/commons/httpcache/engine/CacheContent.java @@ -21,8 +21,6 @@ import com.adobe.acs.commons.httpcache.exception.HttpCacheDataStreamException; import com.adobe.acs.commons.httpcache.store.TempSink; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import javax.servlet.http.HttpServletResponse; import java.io.InputStream; @@ -35,7 +33,6 @@ * Represents response content to be cached. */ public class CacheContent { - private static final Logger log = LoggerFactory.getLogger(CacheContent.class); /** Response status **/ private int status; diff --git a/bundle/src/main/java/com/adobe/acs/commons/httpcache/engine/HttpCacheServletResponseWrapper.java b/bundle/src/main/java/com/adobe/acs/commons/httpcache/engine/HttpCacheServletResponseWrapper.java index a60bf501d6..34670d5f31 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/httpcache/engine/HttpCacheServletResponseWrapper.java +++ b/bundle/src/main/java/com/adobe/acs/commons/httpcache/engine/HttpCacheServletResponseWrapper.java @@ -69,6 +69,7 @@ public ServletOutputStream getOutputStream() throws IOException { } @Override + @SuppressWarnings("squid:S2095") public PrintWriter getWriter() throws IOException { if (this.servletOutputStream != null) { throw new IllegalStateException("Cannot invoke getWriter() once getOutputStream() has been called."); diff --git a/bundle/src/main/java/com/adobe/acs/commons/httpcache/engine/impl/HttpCacheEngineImpl.java b/bundle/src/main/java/com/adobe/acs/commons/httpcache/engine/impl/HttpCacheEngineImpl.java index bbbf0b3a55..c83dc03c43 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/httpcache/engine/impl/HttpCacheEngineImpl.java +++ b/bundle/src/main/java/com/adobe/acs/commons/httpcache/engine/impl/HttpCacheEngineImpl.java @@ -275,8 +275,8 @@ protected void unbindHttpCacheHandlingRule(final HttpCacheHandlingRule cacheHand protected void activate(Map configs) { // PIDs of global cache handling rules. - globalCacheHandlingRulesPid = new ArrayList(Arrays.asList(PropertiesUtil.toStringArray(configs.get - (PROP_GLOBAL_CACHE_HANDLING_RULES_PID), new String[]{}))); + globalCacheHandlingRulesPid = new ArrayList(Arrays.asList(PropertiesUtil.toStringArray(configs + .get(PROP_GLOBAL_CACHE_HANDLING_RULES_PID), new String[]{}))); ListIterator listIterator = globalCacheHandlingRulesPid.listIterator(); while (listIterator.hasNext()) { String value = listIterator.next(); @@ -362,6 +362,7 @@ public boolean isCacheHit(SlingHttpServletRequest request, HttpCacheConfig cache } @Override + @SuppressWarnings("squid:S3776") public boolean deliverCacheContent(SlingHttpServletRequest request, SlingHttpServletResponse response, HttpCacheConfig cacheConfig) throws HttpCacheKeyCreationException, HttpCacheDataStreamException, HttpCachePersistenceException { @@ -486,6 +487,7 @@ public boolean isPathPotentialToInvalidate(String path) { } @Override + @SuppressWarnings("squid:S3776") public void invalidateCache(String path) throws HttpCachePersistenceException, HttpCacheKeyCreationException { // Find out all the cache config which has this path applicable for invalidation. @@ -533,6 +535,7 @@ public HttpCacheEngineImpl() throws NotCompliantMBeanException { } @Override + @SuppressWarnings("squid:S1192") public TabularData getRegisteredHttpCacheRules() throws OpenDataException { // @formatter:off final CompositeType cacheEntryType = new CompositeType( @@ -561,6 +564,7 @@ public TabularData getRegisteredHttpCacheRules() throws OpenDataException { } @Override + @SuppressWarnings("squid:S1192") public TabularData getRegisteredHttpCacheConfigs() throws OpenDataException { // @formatter:off // Exposing all google guava stats. @@ -595,6 +599,7 @@ public TabularData getRegisteredHttpCacheConfigs() throws OpenDataException { } @Override + @SuppressWarnings("squid:S1192") public TabularData getRegisteredPersistenceStores() throws OpenDataException { // @formatter:off final CompositeType cacheEntryType = new CompositeType( diff --git a/bundle/src/main/java/com/adobe/acs/commons/httpcache/engine/impl/TeePrintWriter.java b/bundle/src/main/java/com/adobe/acs/commons/httpcache/engine/impl/TeePrintWriter.java index 1d3a667f8b..b9e6672931 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/httpcache/engine/impl/TeePrintWriter.java +++ b/bundle/src/main/java/com/adobe/acs/commons/httpcache/engine/impl/TeePrintWriter.java @@ -34,27 +34,31 @@ public TeePrintWriter(PrintWriter main, PrintWriter branch) { this.branch = branch; } - public void write(char buf[], int off, int len) { + @Override + public void write(char[] buf, int off, int len) { super.write(buf, off, len); super.flush(); branch.write(buf, off, len); branch.flush(); } - public void write(String s, int off, int len) { - super.write(s, off, len); + @Override + public void write(String string, int off, int len) { + super.write(string, off, len); super.flush(); - branch.write(s, off, len); + branch.write(string, off, len); branch.flush(); } - public void write(int c) { - super.write(c); + @Override + public void write(int character) { + super.write(character); super.flush(); - branch.write(c); + branch.write(character); branch.flush(); } + @Override public void flush() { super.flush(); branch.flush(); diff --git a/bundle/src/main/java/com/adobe/acs/commons/httpcache/engine/impl/TeeServletOutputStream.java b/bundle/src/main/java/com/adobe/acs/commons/httpcache/engine/impl/TeeServletOutputStream.java index b52e835c06..8135ce8c86 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/httpcache/engine/impl/TeeServletOutputStream.java +++ b/bundle/src/main/java/com/adobe/acs/commons/httpcache/engine/impl/TeeServletOutputStream.java @@ -37,18 +37,18 @@ public TeeServletOutputStream(OutputStream one, OutputStream two) { } @Override - public void write(int arg0) throws IOException { - this.teeOutputStream.write(arg0); + public void write(int character) throws IOException { + this.teeOutputStream.write(character); } @Override - public void write(byte b[], int off, int len) throws IOException { - this.teeOutputStream.write(b, off, len); + public void write(byte[] oneByte, int off, int len) throws IOException { + this.teeOutputStream.write(oneByte, off, len); } @Override - public void write(byte b[]) throws IOException { - this.teeOutputStream.write(b); + public void write(byte[] oneByte) throws IOException { + this.teeOutputStream.write(oneByte); } @Override diff --git a/bundle/src/main/java/com/adobe/acs/commons/httpcache/exception/HttpCacheConfigConflictException.java b/bundle/src/main/java/com/adobe/acs/commons/httpcache/exception/HttpCacheConfigConflictException.java index 9b3c8edf28..39b78bdf0c 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/httpcache/exception/HttpCacheConfigConflictException.java +++ b/bundle/src/main/java/com/adobe/acs/commons/httpcache/exception/HttpCacheConfigConflictException.java @@ -22,6 +22,7 @@ /** * Custom exception representing a conflict in resolving cache config. */ +@SuppressWarnings({"serial", "squid:S2166"}) public class HttpCacheConfigConflictException extends HttpCacheException { public HttpCacheConfigConflictException() { } diff --git a/bundle/src/main/java/com/adobe/acs/commons/httpcache/exception/HttpCacheDataStreamException.java b/bundle/src/main/java/com/adobe/acs/commons/httpcache/exception/HttpCacheDataStreamException.java index 9bfa9dfaff..fea265dd51 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/httpcache/exception/HttpCacheDataStreamException.java +++ b/bundle/src/main/java/com/adobe/acs/commons/httpcache/exception/HttpCacheDataStreamException.java @@ -22,6 +22,7 @@ /** * Custom exception representing failure conditions in accessing data streams. */ +@SuppressWarnings({"serial", "squid:S2166"}) public class HttpCacheDataStreamException extends HttpCacheException { public HttpCacheDataStreamException() { } diff --git a/bundle/src/main/java/com/adobe/acs/commons/httpcache/exception/HttpCacheKeyCreationException.java b/bundle/src/main/java/com/adobe/acs/commons/httpcache/exception/HttpCacheKeyCreationException.java index 701a6e23df..92dcc822ee 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/httpcache/exception/HttpCacheKeyCreationException.java +++ b/bundle/src/main/java/com/adobe/acs/commons/httpcache/exception/HttpCacheKeyCreationException.java @@ -22,6 +22,7 @@ /** * Custom exception representing failure conditions in creating a cache key. */ +@SuppressWarnings({"serial", "squid:S2166"}) public class HttpCacheKeyCreationException extends HttpCacheException { public HttpCacheKeyCreationException() { } diff --git a/bundle/src/main/java/com/adobe/acs/commons/httpcache/exception/HttpCachePersistenceException.java b/bundle/src/main/java/com/adobe/acs/commons/httpcache/exception/HttpCachePersistenceException.java index 84ba1a9a55..eb2e1e4b1d 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/httpcache/exception/HttpCachePersistenceException.java +++ b/bundle/src/main/java/com/adobe/acs/commons/httpcache/exception/HttpCachePersistenceException.java @@ -22,6 +22,7 @@ /** * Custom exception representing failure conditions in persistence of cached items. */ +@SuppressWarnings({"serial", "squid:S2166"}) public class HttpCachePersistenceException extends HttpCacheException { public HttpCachePersistenceException() { } diff --git a/bundle/src/main/java/com/adobe/acs/commons/httpcache/exception/HttpCacheRepositoryAccessException.java b/bundle/src/main/java/com/adobe/acs/commons/httpcache/exception/HttpCacheRepositoryAccessException.java index 8b85983f17..0946900328 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/httpcache/exception/HttpCacheRepositoryAccessException.java +++ b/bundle/src/main/java/com/adobe/acs/commons/httpcache/exception/HttpCacheRepositoryAccessException.java @@ -22,6 +22,7 @@ /** * Custom exception representing failure condition in accessing JCR repository. */ +@SuppressWarnings({"serial", "squid:S2166"}) public class HttpCacheRepositoryAccessException extends HttpCacheException { public HttpCacheRepositoryAccessException() { } diff --git a/bundle/src/main/java/com/adobe/acs/commons/httpcache/filter/impl/AbstractHttpCacheFilter.java b/bundle/src/main/java/com/adobe/acs/commons/httpcache/filter/impl/AbstractHttpCacheFilter.java index 5e050a6f81..7861958018 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/httpcache/filter/impl/AbstractHttpCacheFilter.java +++ b/bundle/src/main/java/com/adobe/acs/commons/httpcache/filter/impl/AbstractHttpCacheFilter.java @@ -43,6 +43,7 @@ public abstract class AbstractHttpCacheFilter implements Filter { public abstract void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException; + @SuppressWarnings("squid:S3776") protected void doFilter(ServletRequest request, ServletResponse response, FilterChain chain, HttpCacheEngine cacheEngine, HttpCacheConfig.FilterScope filterScope) throws IOException, ServletException { log.trace("In HttpCache filter."); diff --git a/bundle/src/main/java/com/adobe/acs/commons/httpcache/filter/impl/HttpCacheIncludeFilter.java b/bundle/src/main/java/com/adobe/acs/commons/httpcache/filter/impl/HttpCacheIncludeFilter.java index 8ec4657a8b..6f385dcc9e 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/httpcache/filter/impl/HttpCacheIncludeFilter.java +++ b/bundle/src/main/java/com/adobe/acs/commons/httpcache/filter/impl/HttpCacheIncludeFilter.java @@ -70,9 +70,11 @@ public void doFilter(ServletRequest request, ServletResponse response, FilterCha //--------------- @Override public void init(FilterConfig filterConfig) throws ServletException { + // no-op } @Override public void destroy() { + // no-op } } diff --git a/bundle/src/main/java/com/adobe/acs/commons/httpcache/filter/impl/HttpCacheRequestFilter.java b/bundle/src/main/java/com/adobe/acs/commons/httpcache/filter/impl/HttpCacheRequestFilter.java index 4d7d5abbad..fedb2a54d4 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/httpcache/filter/impl/HttpCacheRequestFilter.java +++ b/bundle/src/main/java/com/adobe/acs/commons/httpcache/filter/impl/HttpCacheRequestFilter.java @@ -70,9 +70,11 @@ public void doFilter(ServletRequest request, ServletResponse response, FilterCha //--------------- @Override public void init(FilterConfig filterConfig) throws ServletException { + // no-op } @Override public void destroy() { + // no-op } } diff --git a/bundle/src/main/java/com/adobe/acs/commons/httpcache/invalidator/CacheInvalidationJobConstants.java b/bundle/src/main/java/com/adobe/acs/commons/httpcache/invalidator/CacheInvalidationJobConstants.java index ac4b86a70c..087c00a347 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/httpcache/invalidator/CacheInvalidationJobConstants.java +++ b/bundle/src/main/java/com/adobe/acs/commons/httpcache/invalidator/CacheInvalidationJobConstants.java @@ -35,6 +35,5 @@ public final class CacheInvalidationJobConstants { public static final String PAYLOAD_KEY_DATA_CHANGE_PATH = "path"; private CacheInvalidationJobConstants() { - throw new Error(CacheInvalidationJobConstants.class.getName() + " is not meant to be instantiated."); } } diff --git a/bundle/src/main/java/com/adobe/acs/commons/httpcache/invalidator/HttpCacheInvalidationJobConsumer.java b/bundle/src/main/java/com/adobe/acs/commons/httpcache/invalidator/HttpCacheInvalidationJobConsumer.java index c4b1f6a9f9..c90884c7f2 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/httpcache/invalidator/HttpCacheInvalidationJobConsumer.java +++ b/bundle/src/main/java/com/adobe/acs/commons/httpcache/invalidator/HttpCacheInvalidationJobConsumer.java @@ -123,7 +123,7 @@ void invalidate(String path){ * * @param path the path to search for */ - void invalidateReferences(String path){ + void invalidateReferences(String path) { ResourceResolver adminResolver = null; try { adminResolver = resolverFactory.getServiceResourceResolver(null); @@ -137,7 +137,9 @@ void invalidateReferences(String path){ } catch (Exception e){ log.debug("failed to invalidate references of {}", path); } finally { - if(adminResolver != null) adminResolver.close(); + if (adminResolver != null) { + adminResolver.close(); + } } } } diff --git a/bundle/src/main/java/com/adobe/acs/commons/httpcache/invalidator/event/JCRNodeChangeEventHandler.java b/bundle/src/main/java/com/adobe/acs/commons/httpcache/invalidator/event/JCRNodeChangeEventHandler.java index 73db3106fc..3e30a3e6c1 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/httpcache/invalidator/event/JCRNodeChangeEventHandler.java +++ b/bundle/src/main/java/com/adobe/acs/commons/httpcache/invalidator/event/JCRNodeChangeEventHandler.java @@ -59,10 +59,10 @@ name = EventConstants.EVENT_TOPIC, propertyPrivate = true), @Property(label = "JCR paths to watch for changes.", - value = "(|(" + SlingConstants.PROPERTY_PATH + "=" + - "/content*)(" + SlingConstants.PROPERTY_PATH + "=" + "/etc*))", - description = "Paths expressed in LDAP syntax. Example: (|(path=/content*)(path=/etc*))" + - " - Watches for changes under /content or /etc. ", + value = "(|(" + SlingConstants.PROPERTY_PATH + "=" + + "/content*)(" + SlingConstants.PROPERTY_PATH + "=" + "/etc*))", + description = "Paths expressed in LDAP syntax. Example: (|(path=/content*)(path=/etc*))" + + " - Watches for changes under /content or /etc. ", name = EventConstants.EVENT_FILTER), @Property(name = "webconsole.configurationFactory.nameHint", value = "JCR paths to watch for changes: {" + EventConstants.EVENT_FILTER + "}", diff --git a/bundle/src/main/java/com/adobe/acs/commons/httpcache/store/HttpCacheStore.java b/bundle/src/main/java/com/adobe/acs/commons/httpcache/store/HttpCacheStore.java index 2fd0da4eb6..df07cd4f5b 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/httpcache/store/HttpCacheStore.java +++ b/bundle/src/main/java/com/adobe/acs/commons/httpcache/store/HttpCacheStore.java @@ -28,6 +28,7 @@ * Data store for persisting cache items. Data store implementation could be in-memory, disk or even JCR repository. * Multiple implementation of this cache store can be present at any time and they can work in conjunction. */ +@SuppressWarnings("squid:S1214") public interface HttpCacheStore { /** Represents the key to find out the type of cache data store. Type could be MEM, DISK, JCR, etc. */ String KEY_CACHE_STORE_TYPE = "httpcache.cachestore.type"; @@ -78,11 +79,6 @@ public interface HttpCacheStore { */ void invalidate(CacheKey key); - /** - * Invalidate all entries in the cache. - */ - void invalidateAll(); - /** * Invalidate all the cached items applicable for the given cache config. * @@ -90,6 +86,11 @@ public interface HttpCacheStore { */ void invalidate(HttpCacheConfig cacheConfig); + /** + * Invalidate all entries in the cache. + */ + void invalidateAll(); + /** * Create a temp sink for stashing response stream. * @return diff --git a/bundle/src/main/java/com/adobe/acs/commons/httpcache/store/disk/impl/DiskHttpCacheStoreImpl.java b/bundle/src/main/java/com/adobe/acs/commons/httpcache/store/disk/impl/DiskHttpCacheStoreImpl.java index 0d9fd8b90b..a1f59ed9e9 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/httpcache/store/disk/impl/DiskHttpCacheStoreImpl.java +++ b/bundle/src/main/java/com/adobe/acs/commons/httpcache/store/disk/impl/DiskHttpCacheStoreImpl.java @@ -67,12 +67,12 @@ public void invalidate(CacheKey key) { } @Override - public void invalidateAll() { + public void invalidate(HttpCacheConfig cacheConfig) { throw new NotImplementedException(); } @Override - public void invalidate(HttpCacheConfig cacheConfig) { + public void invalidateAll() { throw new NotImplementedException(); } diff --git a/bundle/src/main/java/com/adobe/acs/commons/httpcache/store/jcr/impl/JCRHttpCacheStoreImpl.java b/bundle/src/main/java/com/adobe/acs/commons/httpcache/store/jcr/impl/JCRHttpCacheStoreImpl.java index 150f725eb5..0d6c5ee8c3 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/httpcache/store/jcr/impl/JCRHttpCacheStoreImpl.java +++ b/bundle/src/main/java/com/adobe/acs/commons/httpcache/store/jcr/impl/JCRHttpCacheStoreImpl.java @@ -69,12 +69,12 @@ public void invalidate(CacheKey key) { } @Override - public void invalidateAll() { + public void invalidate(HttpCacheConfig cacheConfig) { throw new NotImplementedException(); } @Override - public void invalidate(HttpCacheConfig cacheConfig) { + public void invalidateAll() { throw new NotImplementedException(); } diff --git a/bundle/src/main/java/com/adobe/acs/commons/httpcache/store/mem/impl/MemCachePersistenceObject.java b/bundle/src/main/java/com/adobe/acs/commons/httpcache/store/mem/impl/MemCachePersistenceObject.java index 1d3e04d66f..63ba86ef6c 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/httpcache/store/mem/impl/MemCachePersistenceObject.java +++ b/bundle/src/main/java/com/adobe/acs/commons/httpcache/store/mem/impl/MemCachePersistenceObject.java @@ -101,6 +101,7 @@ public MemCachePersistenceObject buildForCaching(int status, String charEncoding public int getStatus() { return status; } + /** * Get char encoding. * @@ -157,5 +158,7 @@ public void incrementHitCount() { /** * @return the number of times this cache entry has been requested */ - public int getHitCount() { return count.get(); } + public int getHitCount() { + return count.get(); + } } diff --git a/bundle/src/main/java/com/adobe/acs/commons/httpcache/store/mem/impl/MemHttpCacheStoreImpl.java b/bundle/src/main/java/com/adobe/acs/commons/httpcache/store/mem/impl/MemHttpCacheStoreImpl.java index 8bb7787c2c..6b5c8b61d7 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/httpcache/store/mem/impl/MemHttpCacheStoreImpl.java +++ b/bundle/src/main/java/com/adobe/acs/commons/httpcache/store/mem/impl/MemHttpCacheStoreImpl.java @@ -69,8 +69,8 @@ value = "com.adobe.acs.httpcache:type=In Memory HTTP Cache Store", propertyPrivate = true), @Property(name = "webconsole.configurationFactory.nameHint", - value = "TTL: {httpcache.cachestore.memcache.ttl}, " + - "Max size in MB: {httpcache.cachestore.memcache.maxsize}", + value = "TTL: {httpcache.cachestore.memcache.ttl}, " + + "Max size in MB: {httpcache.cachestore.memcache.maxsize}", propertyPrivate = true) }) @Service(value = {DynamicMBean.class, HttpCacheStore.class}) @@ -88,8 +88,8 @@ public class MemHttpCacheStoreImpl extends AbstractGuavaCacheMBean cacheAsMap = cache.asMap(); @@ -232,6 +227,11 @@ public void invalidate(HttpCacheConfig cacheConfig) { } } + @Override + public void invalidateAll() { + cache.invalidateAll(); + } + @Override public TempSink createTempSink() { return new MemTempSinkImpl(); @@ -260,6 +260,7 @@ protected long getBytesLength(MemCachePersistenceObject cacheObj) { } @Override + @SuppressWarnings("squid:S1192") protected void addCacheData(Map data, MemCachePersistenceObject cacheObj) { int hitCount = cacheObj.getHitCount(); long size = cacheObj.getBytes().length; @@ -280,6 +281,7 @@ protected String toString(MemCachePersistenceObject cacheObj) throws Exception{ } @Override + @SuppressWarnings("squid:S1192") protected CompositeType getCacheEntryType() throws OpenDataException { return new CompositeType("Cache Entry", "Cache Entry", new String[] { "Cache Key", "Status", "Size", "Content Type", "Character Encoding", "Hits", "Total Size Served from Cache" }, diff --git a/bundle/src/main/java/com/adobe/acs/commons/httpcache/util/CacheUtils.java b/bundle/src/main/java/com/adobe/acs/commons/httpcache/util/CacheUtils.java index 034538808b..132a8f6ca6 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/httpcache/util/CacheUtils.java +++ b/bundle/src/main/java/com/adobe/acs/commons/httpcache/util/CacheUtils.java @@ -32,9 +32,7 @@ public class CacheUtils { private static final Logger log = LoggerFactory.getLogger(CacheUtils.class); - private CacheUtils() { - throw new Error(CacheUtils.class.getName() + " is not meant to be instantiated."); - } + private CacheUtils() {} /** * Create a temporary file for taking copy of servlet response stream. diff --git a/bundle/src/main/java/com/adobe/acs/commons/httpcache/util/UserUtils.java b/bundle/src/main/java/com/adobe/acs/commons/httpcache/util/UserUtils.java index f5116ec75f..0b2dd5dec6 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/httpcache/util/UserUtils.java +++ b/bundle/src/main/java/com/adobe/acs/commons/httpcache/util/UserUtils.java @@ -31,9 +31,7 @@ * Utilties tied to user groups and authentication. */ public class UserUtils { - private UserUtils() { - throw new Error(UserUtils.class.getName() + " is not meant to be instantiated."); - } + private UserUtils() {} /** User id for anonymous requests */ public static final String USER_ID_ANONYMOUS = "anonymous"; diff --git a/bundle/src/main/java/com/adobe/acs/commons/images/ImageTransformer.java b/bundle/src/main/java/com/adobe/acs/commons/images/ImageTransformer.java index b43dc149e8..ccff699421 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/images/ImageTransformer.java +++ b/bundle/src/main/java/com/adobe/acs/commons/images/ImageTransformer.java @@ -27,6 +27,7 @@ import org.apache.sling.api.resource.ValueMap; @ConsumerType +@SuppressWarnings("squid:S1214") public interface ImageTransformer { /** * OSGi Property used to identify the ImageTransformer. diff --git a/bundle/src/main/java/com/adobe/acs/commons/images/NamedImageTransformer.java b/bundle/src/main/java/com/adobe/acs/commons/images/NamedImageTransformer.java index c281217d09..6adc974231 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/images/NamedImageTransformer.java +++ b/bundle/src/main/java/com/adobe/acs/commons/images/NamedImageTransformer.java @@ -28,6 +28,7 @@ import java.util.Map; @ProviderType +@SuppressWarnings("squid:S1214") public interface NamedImageTransformer { /** * The OSGi config property used to identify the named transform. diff --git a/bundle/src/main/java/com/adobe/acs/commons/images/impl/NamedTransformImageServlet.java b/bundle/src/main/java/com/adobe/acs/commons/images/impl/NamedTransformImageServlet.java index 4b9f596050..3b620e2295 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/images/impl/NamedTransformImageServlet.java +++ b/bundle/src/main/java/com/adobe/acs/commons/images/impl/NamedTransformImageServlet.java @@ -92,7 +92,7 @@ + NamedTransformImageServlet.DEFAULT_FILENAME_PATTERN + " ]", name = NamedTransformImageServlet.NAMED_IMAGE_FILENAME_PATTERN, value = NamedTransformImageServlet.DEFAULT_FILENAME_PATTERN - ), + ), @Property( label = "Extension", description = "", @@ -163,7 +163,7 @@ public class NamedTransformImageServlet extends SlingSafeMethodsServlet implemen value = DEFAULT_ASSET_RENDITION_PICKER_REGEX) private static final String PROP_ASSET_RENDITION_PICKER_REGEX = "prop.asset-rendition-picker-regex"; - private static RenditionPatternPicker renditionPatternPicker = + private RenditionPatternPicker renditionPatternPicker = new RenditionPatternPicker(Pattern.compile(DEFAULT_ASSET_RENDITION_PICKER_REGEX)); /** @@ -234,7 +234,7 @@ protected final void doGet(final SlingHttpServletRequest request, final SlingHtt response.setContentType(mimeType); if (progressiveJpeg) { - ProgressiveJPEG.write(layer, quality, response.getOutputStream()); + ProgressiveJpeg.write(layer, quality, response.getOutputStream()); } else { layer.write(mimeType, quality, response.getOutputStream()); } @@ -372,7 +372,7 @@ protected final Image resolveImage(final SlingHttpServletRequest request) { return new Image(resource); } } else { - if (resourceResolver.isResourceType(resource, RT_LOCAL_SOCIAL_IMAGE) + if (resourceResolver.isResourceType(resource, RT_LOCAL_SOCIAL_IMAGE) && resource.getValueMap().get("mimetype", StringUtils.EMPTY).startsWith("image/")) { // Is a UGC image return new SocialImageImpl(resource, NAME_IMAGE); @@ -457,7 +457,7 @@ protected final double getQuality(final String mimeType, final ValueMap transfor final int defaultQuality = 82; final int maxQuality = 100; final int minQuality = 0; - final int maxQualityGIF = 255; + final int maxQualityGif = 255; final double oneHundred = 100D; log.debug("Transforming with [ quality ]"); @@ -471,7 +471,7 @@ protected final double getQuality(final String mimeType, final ValueMap transfor quality = quality / oneHundred; if (StringUtils.equals("image/gif", mimeType)) { - quality = quality * maxQualityGIF; + quality = quality * maxQualityGif; } return quality; @@ -500,11 +500,11 @@ protected boolean isProgressiveJpeg(final String mimeType, final ValueMap transf protected final void activate(final Map properties) throws Exception { final String regex = PropertiesUtil.toString(properties.get(PROP_ASSET_RENDITION_PICKER_REGEX), DEFAULT_ASSET_RENDITION_PICKER_REGEX); - final String fileNameRegex = PropertiesUtil.toString(properties.get(NAMED_IMAGE_FILENAME_PATTERN), - DEFAULT_FILENAME_PATTERN); - if(StringUtils.isNotEmpty(fileNameRegex)) { - lastSuffixPattern = Pattern.compile(fileNameRegex); - } + final String fileNameRegex = PropertiesUtil.toString(properties.get(NAMED_IMAGE_FILENAME_PATTERN), + DEFAULT_FILENAME_PATTERN); + if(StringUtils.isNotEmpty(fileNameRegex)) { + lastSuffixPattern = Pattern.compile(fileNameRegex); + } try { renditionPatternPicker = new RenditionPatternPicker(regex); log.info("Asset Rendition Pattern Picker: {}", regex); diff --git a/bundle/src/main/java/com/adobe/acs/commons/images/impl/ProgressiveJPEG.java b/bundle/src/main/java/com/adobe/acs/commons/images/impl/ProgressiveJpeg.java similarity index 98% rename from bundle/src/main/java/com/adobe/acs/commons/images/impl/ProgressiveJPEG.java rename to bundle/src/main/java/com/adobe/acs/commons/images/impl/ProgressiveJpeg.java index cd18a5c48a..5ec463414d 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/images/impl/ProgressiveJPEG.java +++ b/bundle/src/main/java/com/adobe/acs/commons/images/impl/ProgressiveJpeg.java @@ -35,7 +35,9 @@ /** * Extension for {@link Layer} with progressive JPEG support. */ -public class ProgressiveJPEG { +public class ProgressiveJpeg { + + private ProgressiveJpeg() {} /** * For JPEG images, this method behaves similar to {@link Layer#write(String, double, OutputStream)}. The major diff --git a/bundle/src/main/java/com/adobe/acs/commons/images/transformers/impl/CropImageTransformerImpl.java b/bundle/src/main/java/com/adobe/acs/commons/images/transformers/impl/CropImageTransformerImpl.java index be83a704a3..4c202556c9 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/images/transformers/impl/CropImageTransformerImpl.java +++ b/bundle/src/main/java/com/adobe/acs/commons/images/transformers/impl/CropImageTransformerImpl.java @@ -99,6 +99,7 @@ public final Layer transform(final Layer layer, final ValueMap properties) { return layer; } + @SuppressWarnings("squid:S2589") private Rectangle getSmartBounds(int x, int y, int width, int height, int layerWidth, int layerHeight) { final Rectangle rectangle = new Rectangle(); diff --git a/bundle/src/main/java/com/adobe/acs/commons/images/transformers/impl/composites/contexts/MultiplyCompositeContext.java b/bundle/src/main/java/com/adobe/acs/commons/images/transformers/impl/composites/contexts/MultiplyCompositeContext.java index 10d0cc39ed..f442e6af05 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/images/transformers/impl/composites/contexts/MultiplyCompositeContext.java +++ b/bundle/src/main/java/com/adobe/acs/commons/images/transformers/impl/composites/contexts/MultiplyCompositeContext.java @@ -121,7 +121,7 @@ private int processAlphaOpacity(int blended, int dest) { @Override public void dispose() { - + // no-op } public float getAlpha() { diff --git a/bundle/src/main/java/com/adobe/acs/commons/logging/impl/JsonEventLogger.java b/bundle/src/main/java/com/adobe/acs/commons/logging/impl/JsonEventLogger.java index 50ba88abc4..0b86decc6d 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/logging/impl/JsonEventLogger.java +++ b/bundle/src/main/java/com/adobe/acs/commons/logging/impl/JsonEventLogger.java @@ -19,8 +19,14 @@ */ package com.adobe.acs.commons.logging.impl; -import org.apache.felix.scr.annotations.*; +import org.apache.felix.scr.annotations.Activate; +import org.apache.felix.scr.annotations.Component; +import org.apache.felix.scr.annotations.ConfigurationPolicy; +import org.apache.felix.scr.annotations.Deactivate; import org.apache.felix.scr.annotations.Properties; +import org.apache.felix.scr.annotations.Property; +import org.apache.felix.scr.annotations.PropertyOption; +import org.apache.felix.scr.annotations.PropertyUnbounded; import org.apache.jackrabbit.util.ISO8601; import org.apache.sling.commons.json.JSONArray; import org.apache.sling.commons.json.JSONException; @@ -34,7 +40,13 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.*; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Collection; +import java.util.Date; +import java.util.Dictionary; +import java.util.Hashtable; +import java.util.Map; /** * Logs OSGi Events for any set of topics to an SLF4j Logger Category, as JSON objects. @@ -182,7 +194,7 @@ protected static String constructMessage(Event event) throws JSONException { * @return {@code val} if not handled, or return a converted JSONObject, JSONArray, or String * @throws JSONException */ - @SuppressWarnings("unchecked") + @SuppressWarnings({"unchecked", "squid:S3776"}) protected static Object convertValue(Object val) throws JSONException { if (val.getClass().isArray()) { Object[] vals = (Object[]) val; @@ -255,6 +267,7 @@ public void handleEvent(Event event) { // @Activate + @SuppressWarnings("squid:S1149") protected void activate(ComponentContext ctx) { log.trace("[activate] entered activate method."); Dictionary props = ctx.getProperties(); @@ -299,14 +312,14 @@ protected void deactivate() { @Override public String toString() { - return "EventLogger{" + - "valid=" + valid + - ", topics=" + Arrays.toString(topics) + - ", filter='" + filter + '\'' + - ", category='" + category + '\'' + - ", level='" + level + '\'' + - ", enabled=" + isLoggerEnabled() + - '}'; + return "EventLogger{" + + "valid=" + valid + + ", topics=" + Arrays.toString(topics) + + ", filter='" + filter + '\'' + + ", category='" + category + '\'' + + ", level='" + level + '\'' + + ", enabled=" + isLoggerEnabled() + + '}'; } diff --git a/bundle/src/main/java/com/adobe/acs/commons/logging/impl/SyslogAppender.java b/bundle/src/main/java/com/adobe/acs/commons/logging/impl/SyslogAppender.java index 0cafea8525..97a4d1ecad 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/logging/impl/SyslogAppender.java +++ b/bundle/src/main/java/com/adobe/acs/commons/logging/impl/SyslogAppender.java @@ -73,18 +73,18 @@ public final class SyslogAppender { private static final String PROP_SUFFIX_PATTERN = "suffix.pattern"; @Property(label = "Syslog Facility", value = DEFAULT_FACILITY, propertyPrivate = true, - description = "The Syslog Facility is meant to identify the source of a message, separately from any context " + - "included in the Suffix Pattern. The facility option must be set to one of the strings KERN, USER, MAIL, DAEMON, " + - "AUTH, SYSLOG, LPR, NEWS, UUCP, CRON, AUTHPRIV, FTP, NTP, AUDIT, ALERT, CLOCK, LOCAL0, LOCAL1, LOCAL2, LOCAL3, LOCAL4, " + - "LOCAL5, LOCAL6, LOCAL7. Case is not important.") + description = "The Syslog Facility is meant to identify the source of a message, separately from any context " + + "included in the Suffix Pattern. The facility option must be set to one of the strings KERN, USER, MAIL, DAEMON, " + + "AUTH, SYSLOG, LPR, NEWS, UUCP, CRON, AUTHPRIV, FTP, NTP, AUDIT, ALERT, CLOCK, LOCAL0, LOCAL1, LOCAL2, LOCAL3, LOCAL4, " + + "LOCAL5, LOCAL6, LOCAL7. Case is not important.") private static final String PROP_FACILITY = "facility"; - @Property(label = "Stack Trace Pattern", description = "Logback Pattern for customizing the string appearing just before each stack " + - "trace line. The default value for this property is a single tab character.") + @Property(label = "Stack Trace Pattern", description = "Logback Pattern for customizing the string appearing just before each stack " + + "trace line. The default value for this property is a single tab character.") private static final String PROP_STACK_TRACE_PATTERN = "stack.trace.pattern"; - @Property(label = "Exclude Throwables", description = "Set to true to cause stack trace data associated with a Throwable to be omitted. " + - "By default, this is set to false so that stack trace data is sent to the syslog server.", boolValue = DEFAULT_THROWABLE_EXCLUDED) + @Property(label = "Exclude Throwables", description = "Set to true to cause stack trace data associated with a Throwable to be omitted. " + + "By default, this is set to false so that stack trace data is sent to the syslog server.", boolValue = DEFAULT_THROWABLE_EXCLUDED) private static final String PROP_THROWABLE_EXCLUDED = "throwable.excluded"; private ch.qos.logback.classic.net.SyslogAppender appender; @@ -92,16 +92,17 @@ public final class SyslogAppender { private ServiceRegistration appenderRegistration; @Activate + @SuppressWarnings("squid:S1149") protected void activate(ComponentContext ctx) { final Dictionary properties = ctx.getProperties(); - String[] loggers = PropertiesUtil.toStringArray(properties.get(PROP_LOGGERS), new String[] {ROOT}); - String suffixPattern = PropertiesUtil + final String[] loggers = PropertiesUtil.toStringArray(properties.get(PROP_LOGGERS), new String[] {ROOT}); + final String suffixPattern = PropertiesUtil .toString(properties.get(PROP_SUFFIX_PATTERN), DEFAULT_SUFFIX_PATTERN); - int port = PropertiesUtil.toInteger(properties.get(PROP_PORT), DEFAULT_PORT); - String host = PropertiesUtil.toString(properties.get(PROP_HOST), null); - String facility = PropertiesUtil.toString(properties.get(PROP_FACILITY), DEFAULT_FACILITY); - String stackTracePattern = PropertiesUtil.toString(properties.get(PROP_STACK_TRACE_PATTERN), null); - boolean throwableExcluded = PropertiesUtil.toBoolean(properties.get(PROP_THROWABLE_EXCLUDED), DEFAULT_THROWABLE_EXCLUDED); + final int port = PropertiesUtil.toInteger(properties.get(PROP_PORT), DEFAULT_PORT); + final String host = PropertiesUtil.toString(properties.get(PROP_HOST), null); + final String facility = PropertiesUtil.toString(properties.get(PROP_FACILITY), DEFAULT_FACILITY); + final String stackTracePattern = PropertiesUtil.toString(properties.get(PROP_STACK_TRACE_PATTERN), null); + final boolean throwableExcluded = PropertiesUtil.toBoolean(properties.get(PROP_THROWABLE_EXCLUDED), DEFAULT_THROWABLE_EXCLUDED); if (host == null || port == -1) { throw new IllegalArgumentException( @@ -111,7 +112,7 @@ protected void activate(ComponentContext ctx) { // throws a descriptive IllegalArgumentException if facility is not valid. SyslogAppenderBase.facilityStringToint(facility); - BundleContext bundleContext = ctx.getBundleContext(); + final BundleContext bundleContext = ctx.getBundleContext(); appender = new ch.qos.logback.classic.net.SyslogAppender(); diff --git a/bundle/src/main/java/com/adobe/acs/commons/mcp/AdministratorsOnlyProcessDefinitionFactory.java b/bundle/src/main/java/com/adobe/acs/commons/mcp/AdministratorsOnlyProcessDefinitionFactory.java index ea86352f1d..d3ae13bfec 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/mcp/AdministratorsOnlyProcessDefinitionFactory.java +++ b/bundle/src/main/java/com/adobe/acs/commons/mcp/AdministratorsOnlyProcessDefinitionFactory.java @@ -35,11 +35,12 @@ public abstract class AdministratorsOnlyProcessDefinitionFactory

extends ProcessDefinitionFactory

{ @Override + @SuppressWarnings("squid:S1141") public boolean isAllowed(User user) { try { - return user.isAdmin() || - StreamSupport.stream(Spliterators.spliteratorUnknownSize(user.memberOf(), Spliterator.ORDERED),false). - anyMatch(g -> { + return user.isAdmin() + || StreamSupport.stream(Spliterators.spliteratorUnknownSize(user.memberOf(), Spliterator.ORDERED),false) + .anyMatch(g -> { try { return g.getID().equals("administrators"); } catch (RepositoryException e) { @@ -52,5 +53,5 @@ public boolean isAllowed(User user) { } @Override - abstract protected P createProcessDefinitionInstance(); + protected abstract P createProcessDefinitionInstance(); } diff --git a/bundle/src/main/java/com/adobe/acs/commons/mcp/ProcessDefinition.java b/bundle/src/main/java/com/adobe/acs/commons/mcp/ProcessDefinition.java index 123e5ab587..478bad278a 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/mcp/ProcessDefinition.java +++ b/bundle/src/main/java/com/adobe/acs/commons/mcp/ProcessDefinition.java @@ -30,15 +30,15 @@ public abstract class ProcessDefinition implements FormProcessor { String name; - final public void setName(String n) { + public final void setName(String n) { name = n; } - final public String getName() { + public final String getName() { return name; } - abstract public void buildProcess(ProcessInstance instance, ResourceResolver rr) throws LoginException, RepositoryException; + public abstract void buildProcess(ProcessInstance instance, ResourceResolver rr) throws LoginException, RepositoryException; - abstract public void storeReport(ProcessInstance instance, ResourceResolver rr) throws RepositoryException, PersistenceException; + public abstract void storeReport(ProcessInstance instance, ResourceResolver rr) throws RepositoryException, PersistenceException; } diff --git a/bundle/src/main/java/com/adobe/acs/commons/mcp/ProcessDefinitionFactory.java b/bundle/src/main/java/com/adobe/acs/commons/mcp/ProcessDefinitionFactory.java index 20e5bf3699..0f4768f8f5 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/mcp/ProcessDefinitionFactory.java +++ b/bundle/src/main/java/com/adobe/acs/commons/mcp/ProcessDefinitionFactory.java @@ -25,8 +25,9 @@ @ConsumerType public abstract class ProcessDefinitionFactory

{ - abstract public String getName(); + public abstract String getName(); + @SuppressWarnings("squid:S1172") public boolean isAllowed(User user) { return true; } @@ -37,5 +38,5 @@ public final P createProcessDefinition() { return processDefinition; } - abstract protected P createProcessDefinitionInstance(); + protected abstract P createProcessDefinitionInstance(); } diff --git a/bundle/src/main/java/com/adobe/acs/commons/mcp/ProcessInstance.java b/bundle/src/main/java/com/adobe/acs/commons/mcp/ProcessInstance.java index 32d7d788fd..599177c65b 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/mcp/ProcessInstance.java +++ b/bundle/src/main/java/com/adobe/acs/commons/mcp/ProcessInstance.java @@ -32,9 +32,10 @@ * actions. */ @ProviderType +@SuppressWarnings("squid:S1214") public interface ProcessInstance { - public static final String RESOURCE_TYPE = "acs-commons/components/utilities/process-instance"; + String RESOURCE_TYPE = "acs-commons/components/utilities/process-instance"; String getName(); diff --git a/bundle/src/main/java/com/adobe/acs/commons/mcp/form/FieldComponent.java b/bundle/src/main/java/com/adobe/acs/commons/mcp/form/FieldComponent.java index 3fe3f3b8cd..5d4d00de7b 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/mcp/form/FieldComponent.java +++ b/bundle/src/main/java/com/adobe/acs/commons/mcp/form/FieldComponent.java @@ -52,7 +52,7 @@ public final void setup(String name, Field javaField, FormField field, SlingScri init(); } - abstract public void init(); + public abstract void init(); public SlingScriptHelper getHelper() { return sling; diff --git a/bundle/src/main/java/com/adobe/acs/commons/mcp/form/FileUploadComponent.java b/bundle/src/main/java/com/adobe/acs/commons/mcp/form/FileUploadComponent.java index a8ac50dec6..c13798906c 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/mcp/form/FileUploadComponent.java +++ b/bundle/src/main/java/com/adobe/acs/commons/mcp/form/FileUploadComponent.java @@ -16,23 +16,14 @@ package com.adobe.acs.commons.mcp.form; import aQute.bnd.annotation.ProviderType; -import com.adobe.acs.commons.mcp.impl.AbstractResourceImpl; -import com.adobe.acs.commons.mcp.util.StringUtil; -import org.apache.commons.lang3.StringUtils; -import org.apache.sling.api.resource.Resource; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.Map; -import java.util.stream.Collectors; -import java.util.stream.Stream; /** * File upload component */ @ProviderType public class FileUploadComponent extends FieldComponent { - private static final Logger log = LoggerFactory.getLogger(FileUploadComponent.class); + + private static final String OPTION_MIME_TYPES = "mimeTypes"; @Override public void init() { @@ -40,8 +31,8 @@ public void init() { getComponentMetadata().put("text", "Upload " + getFieldDefinition().name()); getComponentMetadata().put("autoStart", false); - if (hasOption("mimeTypes")) { - getComponentMetadata().put("mimeTypes", getOption("mimeTypes").get()); + if (hasOption(OPTION_MIME_TYPES)) { + getComponentMetadata().put(OPTION_MIME_TYPES, getOption(OPTION_MIME_TYPES).get()); } } } diff --git a/bundle/src/main/java/com/adobe/acs/commons/mcp/form/PathfieldComponent.java b/bundle/src/main/java/com/adobe/acs/commons/mcp/form/PathfieldComponent.java index ead2da9722..a279a072ef 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/mcp/form/PathfieldComponent.java +++ b/bundle/src/main/java/com/adobe/acs/commons/mcp/form/PathfieldComponent.java @@ -25,12 +25,14 @@ @ProviderType public abstract class PathfieldComponent extends FieldComponent { + private static final String OPTION_PREDICATE = "predicate"; + @Override public void init() { setResourceType("granite/ui/components/coral/foundation/form/pathbrowser"); getComponentMetadata().put("pickerMultiselect", hasOption("multiple")); getOption("base").ifPresent(path->getComponentMetadata().put("rootPath", path)); - getComponentMetadata().put("predicate", "nosystem"); + getComponentMetadata().put(OPTION_PREDICATE, "nosystem"); } public static class AssetSelectComponent extends PathfieldComponent { @@ -38,7 +40,7 @@ public static class AssetSelectComponent extends PathfieldComponent { @Override public void init() { super.init(); - getComponentMetadata().put("predicate", "hierarchy"); + getComponentMetadata().put(OPTION_PREDICATE, "hierarchy"); } } @@ -47,7 +49,7 @@ public static class PageSelectComponent extends PathfieldComponent { @Override public void init() { super.init(); - getComponentMetadata().put("predicate", "hierarchyNotFile"); + getComponentMetadata().put(OPTION_PREDICATE, "hierarchyNotFile"); } } @@ -56,7 +58,7 @@ public static class FolderSelectComponent extends PathfieldComponent { @Override public void init() { super.init(); - getComponentMetadata().put("predicate", "folder"); + getComponentMetadata().put(OPTION_PREDICATE, "folder"); } } } diff --git a/bundle/src/main/java/com/adobe/acs/commons/mcp/form/RadioComponent.java b/bundle/src/main/java/com/adobe/acs/commons/mcp/form/RadioComponent.java index 2bdd5e5cf5..ae5e4bbbbb 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/mcp/form/RadioComponent.java +++ b/bundle/src/main/java/com/adobe/acs/commons/mcp/form/RadioComponent.java @@ -55,8 +55,8 @@ public Resource buildComponentResource() { String defaultValue = getOption("default").orElse(null); getOptions().forEach((value, name)->{ - ResourceMetadata meta = new ResourceMetadata(); - String nodeName = JcrUtil.escapeIllegalJcrChars(value); + final ResourceMetadata meta = new ResourceMetadata(); + final String nodeName = JcrUtil.escapeIllegalJcrChars(value); if (value.equals(defaultValue)) { meta.put("checked", true); @@ -70,5 +70,5 @@ public Resource buildComponentResource() { return component; } - abstract public Map getOptions(); + public abstract Map getOptions(); } diff --git a/bundle/src/main/java/com/adobe/acs/commons/mcp/form/SelectComponent.java b/bundle/src/main/java/com/adobe/acs/commons/mcp/form/SelectComponent.java index 8e77f1f20c..b9084ee692 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/mcp/form/SelectComponent.java +++ b/bundle/src/main/java/com/adobe/acs/commons/mcp/form/SelectComponent.java @@ -54,8 +54,8 @@ public Resource buildComponentResource() { String defaultValue = getOption("default").orElse(null); getOptions().forEach((value, name)->{ - ResourceMetadata meta = new ResourceMetadata(); - String nodeName = JcrUtil.escapeIllegalJcrChars(value); + final ResourceMetadata meta = new ResourceMetadata(); + final String nodeName = JcrUtil.escapeIllegalJcrChars(value); if (value.equals(defaultValue)) { meta.put("selected", true); @@ -72,5 +72,5 @@ public Resource buildComponentResource() { return component; } - abstract public Map getOptions(); + public abstract Map getOptions(); } diff --git a/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/AbstractResourceImpl.java b/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/AbstractResourceImpl.java index f1e7a5e11d..2f7c4a0256 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/AbstractResourceImpl.java +++ b/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/AbstractResourceImpl.java @@ -75,7 +75,7 @@ public void addChild(Resource res) { @Override public String getName() { - return path.substring(path.lastIndexOf("/")+1); + return path.substring(path.lastIndexOf('/')+1); } @Override diff --git a/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/ControlledProcessManagerImpl.java b/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/ControlledProcessManagerImpl.java index fa893dedec..b4e9396294 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/ControlledProcessManagerImpl.java +++ b/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/ControlledProcessManagerImpl.java @@ -63,6 +63,7 @@ public class ControlledProcessManagerImpl implements ControlledProcessManager { static { AUTH_INFO = Collections.singletonMap(ResourceResolverFactory.SUBSERVICE, (Object) SERVICE_NAME); } + Map activeProcesses = Collections.synchronizedMap(new LinkedHashMap<>()); @Reference @@ -132,13 +133,14 @@ public ProcessDefinition findDefinitionByNameOrPath(String nameOrPath) throws Re } private ProcessDefinition findDefinitionByName(String name) throws ReflectiveOperationException { - ProcessDefinitionFactory factory = processDefinitionFactories.stream(). - filter(f -> name.equals(f.getName())).findFirst() + ProcessDefinitionFactory factory = processDefinitionFactories.stream() + .filter(f -> name.equals(f.getName())).findFirst() .orElseThrow(()->new IllegalArgumentException("Unable to find process " + name)); return factory.createProcessDefinition(); } + @SuppressWarnings("squid:S1172") private ProcessDefinition findDefinitionByPath(String path) throws ReflectiveOperationException { throw new UnsupportedOperationException("Not supported yet."); } diff --git a/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/ControlledProcessManagerServlet.java b/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/ControlledProcessManagerServlet.java index b9c0121ed8..c582e2738e 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/ControlledProcessManagerServlet.java +++ b/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/ControlledProcessManagerServlet.java @@ -90,7 +90,7 @@ protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse r result = doPurgeCompleted(request); break; default: - throw new Exception("Action not understood."); + throw new IllegalArgumentException("Action not understood."); } } catch (Exception ex) { result = "Exception occurred " + ex.getMessage(); @@ -127,11 +127,13 @@ private Object doHaltProcess(SlingHttpServletRequest request) { return instance; } + @SuppressWarnings("squid:S1172") private boolean doHaltAllProcesses(SlingHttpServletRequest request) { manager.haltActiveProcesses(); return true; } + @SuppressWarnings("squid:S1172") private boolean doPurgeCompleted(SlingHttpServletRequest request) { manager.purgeCompletedProcesses(); return true; diff --git a/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/GenericReportExcelServlet.java b/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/GenericReportExcelServlet.java index 3ca80bab3c..f0d82545ca 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/GenericReportExcelServlet.java +++ b/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/GenericReportExcelServlet.java @@ -75,6 +75,7 @@ protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse r } } + @SuppressWarnings("squid:S3776") private Workbook createSpreadsheet(GenericReport report) { Workbook wb = new XSSFWorkbook(); @@ -146,8 +147,11 @@ void autosize(Sheet sheet, int lastColumnIndex){ } int cw = sheet.getColumnWidth(i); // increase width to accommodate drop-down arrow in the header - if(cw/256 < 20) sheet.setColumnWidth(i, 256*12); - else if(cw/256 > 120) sheet.setColumnWidth(i, 256*120); + if (cw/256 < 20) { + sheet.setColumnWidth(i, 256*12); + } else if (cw/256 > 120) { + sheet.setColumnWidth(i, 256*120); + } } } } diff --git a/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/ProcessInstanceImpl.java b/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/ProcessInstanceImpl.java index 81a93ecf50..e82fc89ed6 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/ProcessInstanceImpl.java +++ b/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/ProcessInstanceImpl.java @@ -15,34 +15,19 @@ */ package com.adobe.acs.commons.mcp.impl; -import com.adobe.acs.commons.mcp.*; import com.adobe.acs.commons.fam.ActionManager; import com.adobe.acs.commons.fam.ActionManagerFactory; import com.adobe.acs.commons.fam.Failure; import com.adobe.acs.commons.functions.CheckedConsumer; -import com.adobe.acs.commons.mcp.model.impl.ArchivedProcessFailure; +import com.adobe.acs.commons.mcp.ControlledProcessManager; +import com.adobe.acs.commons.mcp.ProcessDefinition; +import com.adobe.acs.commons.mcp.ProcessInstance; import com.adobe.acs.commons.mcp.model.ManagedProcess; import com.adobe.acs.commons.mcp.model.Result; +import com.adobe.acs.commons.mcp.model.impl.ArchivedProcessFailure; import com.adobe.acs.commons.mcp.util.DeserializeException; import com.adobe.acs.commons.mcp.util.ValueMapSerializer; import com.day.cq.commons.jcr.JcrUtil; -import java.io.Serializable; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Random; -import java.util.stream.Collectors; -import javax.jcr.RepositoryException; -import javax.jcr.Session; -import javax.management.openmbean.CompositeData; -import javax.management.openmbean.CompositeDataSupport; -import javax.management.openmbean.CompositeType; -import javax.management.openmbean.OpenDataException; -import javax.management.openmbean.OpenType; -import javax.management.openmbean.SimpleType; -import javax.management.openmbean.TabularType; import org.apache.jackrabbit.JcrConstants; import org.apache.sling.api.resource.LoginException; import org.apache.sling.api.resource.ModifiableValueMap; @@ -54,6 +39,24 @@ import org.apache.sling.api.wrappers.ModifiableValueMapDecorator; import org.slf4j.LoggerFactory; +import javax.jcr.RepositoryException; +import javax.jcr.Session; +import javax.management.openmbean.CompositeData; +import javax.management.openmbean.CompositeDataSupport; +import javax.management.openmbean.CompositeType; +import javax.management.openmbean.OpenDataException; +import javax.management.openmbean.OpenType; +import javax.management.openmbean.SimpleType; +import javax.management.openmbean.TabularType; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Random; +import java.util.stream.Collectors; + /** * Abstraction of a Process which runs using FAM and consists of one or more * actions. @@ -65,13 +68,13 @@ public class ProcessInstanceImpl implements ProcessInstance, Serializable { private final ManagedProcess infoBean; private final String id; private final String path; - transient private static final org.slf4j.Logger LOG = LoggerFactory.getLogger(ProcessInstanceImpl.class); - transient private final List actions; - transient public static final String BASE_PATH = "/var/acs-commons/mcp/instances"; - transient private ControlledProcessManager manager = null; - transient private final ProcessDefinition definition; - transient private boolean completedNormally = false; - transient private static final Random RANDOM = new Random(); + private static final transient org.slf4j.Logger LOG = LoggerFactory.getLogger(ProcessInstanceImpl.class); + private final transient List actions; + public static final transient String BASE_PATH = "/var/acs-commons/mcp/instances"; + private transient ControlledProcessManager manager = null; + private final transient ProcessDefinition definition; + private transient boolean completedNormally = false; + private static final transient Random RANDOM = new Random(); @Override public String getId() { @@ -127,13 +130,19 @@ public ProcessInstanceImpl(ControlledProcessManager cpm, ProcessDefinition proce @Override public String getName() { - return definition.getName() != null - ? (infoBean.getDescription() != null - ? definition.getName() + ": " + infoBean.getDescription() - : definition.getName()) - : (infoBean.getDescription() != null - ? infoBean.getDescription() - : "No idea"); + if (definition.getName() != null) { + if (infoBean.getDescription() != null) { + return definition.getName() + ": " + infoBean.getDescription(); + } else { + return definition.getName(); + } + } else { + if (infoBean.getDescription() != null) { + return infoBean.getDescription(); + } else { + return "No idea"; + } + } } @Override @@ -149,12 +158,12 @@ public ActionManagerFactory getActionManagerFactory() { } @Override - final public ActionManager defineCriticalAction(String name, ResourceResolver rr, CheckedConsumer builder) throws LoginException { + public final ActionManager defineCriticalAction(String name, ResourceResolver rr, CheckedConsumer builder) throws LoginException { return defineAction(name, rr, builder, true); } @Override - final public ActionManager defineAction(String name, ResourceResolver rr, CheckedConsumer builder) throws LoginException { + public final ActionManager defineAction(String name, ResourceResolver rr, CheckedConsumer builder) throws LoginException { return defineAction(name, rr, builder, false); } @@ -169,7 +178,7 @@ private ActionManager defineAction(String name, ResourceResolver rr, CheckedCons } @Override - final public void run(ResourceResolver rr) { + public final void run(ResourceResolver rr) { try { infoBean.setRequester(rr.getUserID()); infoBean.setStartTime(System.currentTimeMillis()); @@ -279,7 +288,7 @@ private void persistStatus(ResourceResolver rr) throws PersistenceException { props.put(JcrConstants.JCR_PRIMARYTYPE, JcrConstants.NT_FOLDER); ResourceUtil.getOrCreateResource(rr, BASE_PATH, props, null, true); props.put(JcrConstants.JCR_PRIMARYTYPE, "cq:Page"); - Resource r = ResourceUtil.getOrCreateResource(rr, getPath(), props, null, true); + ResourceUtil.getOrCreateResource(rr, getPath(), props, null, true); ModifiableValueMap jcrContent = ResourceUtil.getOrCreateResource(rr, getPath() + "/jcr:content", ProcessInstance.RESOURCE_TYPE, null, false).adaptTo(ModifiableValueMap.class); jcrContent.put("jcr:primaryType", "cq:PageContent"); jcrContent.put("jcr:title", getName()); @@ -300,7 +309,7 @@ public ManagedProcess getInfo() { } @Override - final public void halt() { + public final void halt() { updateProgress(); infoBean.setStopTime(System.currentTimeMillis()); infoBean.getResult().setRuntime(infoBean.getStopTime() - infoBean.getStartTime()); diff --git a/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/processes/AssetIngestor.java b/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/processes/AssetIngestor.java index 717dde1eec..dcbffa06d5 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/processes/AssetIngestor.java +++ b/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/processes/AssetIngestor.java @@ -53,6 +53,7 @@ public abstract class AssetIngestor extends ProcessDefinition { private final MimeTypeService mimetypeService; + @SuppressWarnings("squid:S00115") public enum AssetAction { skip, version, replace } @@ -143,6 +144,7 @@ public void init() throws RepositoryException { ignoreExtensionList = Arrays.asList(ignoreExtensions.trim().toLowerCase().split(",")); } + @SuppressWarnings("squid:S00112") private void createAsset(Source source, String assetPath, ResourceResolver r, boolean versioning) throws Exception { r.adaptTo(Session.class).getWorkspace().getObservationManager().setUserData(CHANGED_BY_WORKFLOW); AssetManager assetManager = r.adaptTo(AssetManager.class); @@ -177,7 +179,7 @@ protected void handleExistingAsset(Source source, String assetPath, ResourceReso //if replace we just create a new one and the old one goes away createAsset(source, assetPath, r, false); break; - case version: + default: //only option left is replace, we'll save current version as a version and then replace it versionExistingAsset(source, assetPath, r); } @@ -221,6 +223,7 @@ protected boolean createFolderNode(HierarchialElement el, ResourceResolver r) th return true; } + @SuppressWarnings("squid:S00112") private void versionExistingAsset(Source source, String assetPath, ResourceResolver r) throws Exception { createAsset(source, assetPath, r, r.getResource(assetPath) != null); } @@ -278,9 +281,11 @@ protected boolean canImportContainingFolder(HierarchialElement element) { } } + @SuppressWarnings("squid:S00115") + enum ReportColumns {folder_count, asset_count, files_skipped, @FieldFormat(ValueFormat.storageSize) data_imported} - enum ReportColumns {folder_count, asset_count, files_skipped, @FieldFormat(ValueFormat.storageSize) data_imported}; GenericReport report = new GenericReport(); + @Override public void storeReport(ProcessInstance instance, ResourceResolver rr) throws RepositoryException, PersistenceException { EnumMap values = new EnumMap<>(ReportColumns.class); @@ -297,25 +302,36 @@ public void storeReport(ProcessInstance instance, ResourceResolver rr) throws Re protected interface Source { String getName(); + InputStream getStream() throws IOException; + long getLength(); + HierarchialElement getElement(); } protected interface HierarchialElement { + boolean isFile(); + boolean isFolder(); + HierarchialElement getParent(); + String getName(); + String getItemName(); + Source getSource(); + String getJcrBasePath(); default String getNodePath() { HierarchialElement parent = getParent(); return (parent == null ? getJcrBasePath() : parent.getNodePath()) + "/" + getNodeName(); } + default String getNodeName() { String name = getName(); if (isFile() && name.contains(".")) { diff --git a/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/processes/AssetReport.java b/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/processes/AssetReport.java index 5aa4640e12..71e190e3c3 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/processes/AssetReport.java +++ b/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/processes/AssetReport.java @@ -55,10 +55,11 @@ public class AssetReport extends ProcessDefinition implements Serializable { private static final long serialVersionUID = 7526472295622776160L; - transient public static final String SHA1 = "dam:sha1"; + public static final transient String SHA1 = "dam:sha1"; public static final String NAME = "Asset Report"; - public static enum Column { + @SuppressWarnings("squid:S00115") + public enum Column { level, asset_count, subfolder_count, rendition_count, version_count, subasset_count, @FieldFormat(ValueFormat.storageSize) @@ -102,7 +103,7 @@ public static enum Column { options = {"checked"} ) private boolean includeVersions = false; - transient private int depthLimit; + private transient int depthLimit; @Override public void init() throws RepositoryException { @@ -120,16 +121,22 @@ public void buildProcess(ProcessInstance instance, ResourceResolver rr) throws L instance.defineAction("First pass", rr, this::examineAssets); instance.defineAction("Deep scan", rr, this::evaluateDeepStructure); instance.defineAction("Final pass", rr, this::examineAssets); - String detail = includeSubassets && includeVersions ? "full" - : includeSubassets || includeVersions ? "partial" : "light"; + String detail; + if (includeSubassets && includeVersions) { + detail = "full"; + } else if (includeSubassets || includeVersions) { + detail = "partial"; + } else { + detail = "light"; + } instance.getInfo().setDescription(baseFolder + " - " + detail); } - transient private final GenericReport report = new GenericReport(); - transient private final Map> reportData = new TreeMap<>(); + private final transient GenericReport report = new GenericReport(); + private final transient Map> reportData = new TreeMap<>(); - transient private final Queue assetList = new ConcurrentLinkedQueue<>(); - transient private final Queue folderList = new ConcurrentLinkedQueue<>(); + private final transient Queue assetList = new ConcurrentLinkedQueue<>(); + private final transient Queue folderList = new ConcurrentLinkedQueue<>(); public void evaluateStructure(ActionManager manager) { TreeFilteringResourceVisitor visitor = new TreeFilteringResourceVisitor(); @@ -213,6 +220,7 @@ private void tabulate(String path, Column counter, long amount) { } } + @SuppressWarnings("squid:S00112") private void examineAsset(ResourceResolver rr, String assetPath) throws RepositoryException, Exception { Actions.setCurrentItem(assetPath); String folderPath = getParentPath(assetPath); diff --git a/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/processes/BrokenLinksReport.java b/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/processes/BrokenLinksReport.java index ae1581f03e..d0ed806595 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/processes/BrokenLinksReport.java +++ b/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/processes/BrokenLinksReport.java @@ -88,9 +88,9 @@ public class BrokenLinksReport extends ProcessDefinition implements Serializable options = {"default=text"}) private String htmlFields; - transient private Set excludeList; - transient private Set deepCheckList; - transient private Pattern regex; + private transient Set excludeList; + private transient Set deepCheckList; + private transient Pattern regex; @Override public void init() throws RepositoryException { @@ -100,13 +100,14 @@ public void init() throws RepositoryException { regex = Pattern.compile(propertyRegex); } - transient private final GenericReport report = new GenericReport(); + private final transient GenericReport report = new GenericReport(); - enum REPORT { + @SuppressWarnings("squid:S00115") + enum Report { reference } - transient private final Map> reportData = new ConcurrentHashMap<>(); + private final transient Map> reportData = new ConcurrentHashMap<>(); @Override public void buildProcess(ProcessInstance instance, ResourceResolver rr) throws LoginException, RepositoryException { @@ -118,9 +119,9 @@ public void buildProcess(ProcessInstance instance, ResourceResolver rr) throws L @Override public void storeReport(ProcessInstance instance, ResourceResolver rr) throws RepositoryException, PersistenceException { - GenericReport report = new GenericReport(); - report.setRows(reportData, "Source", REPORT.class); - report.persist(rr, instance.getPath() + "/jcr:content/report"); + GenericReport genericReport = new GenericReport(); + genericReport.setRows(reportData, "Source", Report.class); + genericReport.persist(rr, instance.getPath() + "/jcr:content/report"); } @@ -134,8 +135,8 @@ public void buildReport(ActionManager manager) { for(Map.Entry> ref : brokenRefs.entrySet()){ String propertyPath = ref.getKey(); List refs = ref.getValue(); - reportData.put(propertyPath, new EnumMap<>(REPORT.class)); - reportData.get(propertyPath).put(REPORT.reference, refs.stream().collect(Collectors.joining(","))); + reportData.put(propertyPath, new EnumMap<>(Report.class)); + reportData.get(propertyPath).put(Report.reference, refs.stream().collect(Collectors.joining(","))); } }); }); @@ -214,8 +215,9 @@ static Map> collectBrokenReferences(Resource resource, Patt })).entrySet().stream().filter(e -> !e.getValue().isEmpty()) .collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue())); } - // access from unit tests - Map> getReportData() { + + // access from unit tests + Map> getReportData() { return reportData; } } diff --git a/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/processes/DeepPrune.java b/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/processes/DeepPrune.java index 6b59765028..826578554b 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/processes/DeepPrune.java +++ b/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/processes/DeepPrune.java @@ -46,14 +46,15 @@ public class DeepPrune extends ProcessDefinition implements Serializable { private static final long serialVersionUID = 7526472295622776160L; - transient private final JobManager jobManager; - - static enum FolderRule {all(s->true),numeric(StringUtils::isNumeric),hexadecimal(StringUtil::isHex),none(s->false); + private final transient JobManager jobManager; + + @SuppressWarnings("squid:S00115") + enum FolderRule {all(s->true),numeric(StringUtils::isNumeric),hexadecimal(StringUtil::isHex),none(s->false); Function matcher; FolderRule(Function m) { matcher = m; } - }; + } @FormField(name="Starting folder", description="Starting point for event removal", @@ -108,7 +109,7 @@ static enum FolderRule {all(s->true),numeric(StringUtils::isNumeric),hexadecimal private boolean stopJobs = true; public static final String JOB_TYPE = "slingevent:Job"; - transient private final List suspendedQueues = new ArrayList<>(); + private final transient List suspendedQueues = new ArrayList<>(); public DeepPrune(JobManager jobManager) { this.jobManager = jobManager; @@ -205,5 +206,6 @@ private void resumeJobQueues(ActionManager manager) { @Override public void storeReport(ProcessInstance instance, ResourceResolver rr) { + // no-op } } \ No newline at end of file diff --git a/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/processes/FileAssetIngestor.java b/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/processes/FileAssetIngestor.java index 74abaf65b3..4f41acc06c 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/processes/FileAssetIngestor.java +++ b/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/processes/FileAssetIngestor.java @@ -41,6 +41,7 @@ public class FileAssetIngestor extends AssetIngestor { public FileAssetIngestor(MimeTypeService mimeTypeService) { super(mimeTypeService); } + @FormField( name = "Source", description = "Source folder for content ingestion", @@ -70,8 +71,8 @@ void createFolders(ActionManager manager) throws IOException { manager.deferredWithResolver(r->{ JcrUtil.createPath(jcrBasePath, DEFAULT_FOLDER_TYPE, DEFAULT_FOLDER_TYPE, r.adaptTo(Session.class), true); manager.setCurrentItem(fileBasePath); - Files.walk(baseFolder.toPath()).map(Path::toFile).filter(f -> !f.equals(baseFolder)). - map(FileHierarchialElement::new).filter(FileHierarchialElement::isFolder).filter(this::canImportFolder).forEach(f->{ + Files.walk(baseFolder.toPath()).map(Path::toFile).filter(f -> !f.equals(baseFolder)) + .map(FileHierarchialElement::new).filter(FileHierarchialElement::isFolder).filter(this::canImportFolder).forEach(f->{ manager.deferredWithResolver(Actions.retry(10, 100, rr-> { manager.setCurrentItem(f.getItemName()); createFolderNode(f, rr); @@ -84,8 +85,8 @@ void importAssets(ActionManager manager) throws IOException { manager.deferredWithResolver(rr->{ JcrUtil.createPath(jcrBasePath, DEFAULT_FOLDER_TYPE, DEFAULT_FOLDER_TYPE, rr.adaptTo(Session.class), true); manager.setCurrentItem(fileBasePath); - Files.walk(baseFolder.toPath()).map(FileHierarchialElement::new).filter(FileHierarchialElement::isFile). - filter(this::canImportContainingFolder).map(FileHierarchialElement::getSource).forEach(fs->{ + Files.walk(baseFolder.toPath()).map(FileHierarchialElement::new).filter(FileHierarchialElement::isFile) + .filter(this::canImportContainingFolder).map(FileHierarchialElement::getSource).forEach(fs->{ if (canImportFile(fs)) { manager.deferredWithResolver(Actions.retry(5, 25, importAsset(fs, manager))); } else { @@ -133,6 +134,7 @@ class FileHierarchialElement implements HierarchialElement { this.file = f; } + @SuppressWarnings("squid:S1144") private FileHierarchialElement(Path p) { this(p.toFile()); } diff --git a/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/processes/FolderRelocator.java b/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/processes/FolderRelocator.java index 80705be2b6..3db682088a 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/processes/FolderRelocator.java +++ b/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/processes/FolderRelocator.java @@ -78,9 +78,10 @@ public class FolderRelocator extends ProcessDefinition implements Serializable { private static final long serialVersionUID = 7526472295622776160L; - public static enum Mode { + public enum Mode { RENAME, MOVE - }; + } + private Map sourceToDestination; @FormField(name="Source folder(s)", description="One or more source folders must be provided. Multiple folders implies a move operation.", @@ -101,19 +102,19 @@ public static enum Mode { options={"horizontal","default=MOVE"}) private Mode mode; - transient private final String[] requiredFolderPrivilegeNames = { + private final transient String[] requiredFolderPrivilegeNames = { Privilege.JCR_READ, Privilege.JCR_WRITE, Privilege.JCR_REMOVE_CHILD_NODES, Privilege.JCR_REMOVE_NODE }; - transient private final String[] requiredNodePrivilegeNames = { + private final transient String[] requiredNodePrivilegeNames = { Privilege.JCR_ALL }; - transient private Privilege[] requiredFolderPrivileges; - transient private Privilege[] requiredNodePrivileges; + private transient Privilege[] requiredFolderPrivileges; + private transient Privilege[] requiredNodePrivileges; private int batchSize = 5; @@ -208,32 +209,33 @@ public void buildProcess(ProcessInstance instance, ResourceResolver rr) throws L } } + @SuppressWarnings("squid:S3776") private void validateInputs(ResourceResolver res) throws RepositoryException { Optional error = sourceToDestination.entrySet().stream().map((pair) -> { - String sourcePath = pair.getKey(); - String destinationPath = pair.getValue(); - if (sourcePath == null) { + String entrySourcePath = pair.getKey(); + String entryDestinationPath = pair.getValue(); + if (entrySourcePath == null) { return new RepositoryException("Source path should not be null"); } - if (destinationPath == null) { + if (entryDestinationPath == null) { return new RepositoryException("Destination path should not be null"); } - if (destinationPath.contains(sourcePath + "/")) { + if (entryDestinationPath.contains(entrySourcePath + "/")) { return new RepositoryException("Destination must be outside of source folder"); } - if (!resourceExists(res, sourcePath)) { - if (!sourcePath.startsWith("/")) { - return new RepositoryException("Paths are not valid unless they start with a forward slash, you provided: " + sourcePath); + if (!resourceExists(res, entrySourcePath)) { + if (!entrySourcePath.startsWith("/")) { + return new RepositoryException("Paths are not valid unless they start with a forward slash, you provided: " + entrySourcePath); } else { - return new RepositoryException("Unable to find source " + sourcePath); + return new RepositoryException("Unable to find source " + entrySourcePath); } } - if (!resourceExists(res, destinationPath.substring(0, destinationPath.lastIndexOf('/')))) { - if (!destinationPath.startsWith("/")) { - return new RepositoryException("Paths are not valid unless they start with a forward slash, you provided: " + destinationPath); + if (!resourceExists(res, entryDestinationPath.substring(0, entryDestinationPath.lastIndexOf('/')))) { + if (!entryDestinationPath.startsWith("/")) { + return new RepositoryException("Paths are not valid unless they start with a forward slash, you provided: " + entryDestinationPath); } else { - return new RepositoryException("Unable to find destination " + destinationPath); + return new RepositoryException("Unable to find destination " + entryDestinationPath); } } return null; @@ -313,11 +315,12 @@ private void buildDestinationFolder(ResourceResolver rr, String sourceFolder) th rr.commit(); rr.refresh(); } - if (resourceExists(rr, sourceFolder + "/jcr:content")) { + String sourceJcrContent = sourceFolder + "/jcr:content"; + if (resourceExists(rr, sourceJcrContent)) { Actions.getCurrentActionManager().deferredWithResolver(Actions.retry(5,50,(rrr)->{ if (!resourceExists(rrr, targetPath + "/jcr:content")) { waitUntilResourceFound(rrr, targetPath); - rrr.copy(sourceFolder + "/jcr:content", targetPath); + rrr.copy(sourceJcrContent, targetPath); rrr.commit(); rrr.refresh(); } @@ -390,5 +393,6 @@ private void beginStep(ActionManager step, String startingNode, SimpleFilteringR @Override public void storeReport(ProcessInstance instance, ResourceResolver rr) { + // no-op } } diff --git a/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/processes/PageRelocator.java b/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/processes/PageRelocator.java index 398cfaf132..68db9b6d8d 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/processes/PageRelocator.java +++ b/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/processes/PageRelocator.java @@ -72,13 +72,13 @@ public PageRelocator(PageManagerFactory pageManagerFactory, Replicator replicato private final PageManagerFactory pageManagerFactory; private final Replicator replicator; - public static enum Mode { + public enum Mode { RENAME, MOVE - }; + } - public enum PUBLISH_METHOD { + public enum PublishMethod { NONE, SELF_MANAGED, QUEUE - }; + } @FormField(name = "Source page", description = "Select page/site to be moved", @@ -122,7 +122,7 @@ public enum PUBLISH_METHOD { required = false, component = RadioComponent.EnumerationSelector.class, options = {"horizontal", "default=SELF_MANAGED"}) - public PUBLISH_METHOD publishMethod; + public PublishMethod publishMethod; @FormField(name = "Create versions", description = "Create versions for anything being replicated", @@ -147,7 +147,7 @@ public enum PUBLISH_METHOD { options = {"checked"}) private boolean dryRun = true; - transient private final String[] requiredPrivilegeNames = { + private final transient String[] requiredPrivilegeNames = { Privilege.JCR_READ, Privilege.JCR_WRITE, Privilege.JCR_REMOVE_CHILD_NODES, @@ -171,7 +171,7 @@ public void init() throws RepositoryException { case SELF_MANAGED: replicationOptions.setSynchronous(true); break; - case QUEUE: + default: replicationOptions.setSynchronous(false); break; } @@ -210,6 +210,7 @@ private void validateInputs(ResourceResolver res) throws RepositoryException { } ManagedProcess instanceInfo; + @Override public void buildProcess(ProcessInstance instance, ResourceResolver rr) throws LoginException, RepositoryException { validateInputs(rr); @@ -221,7 +222,7 @@ public void buildProcess(ProcessInstance instance, ResourceResolver rr) throws L requiredPrivileges = getPrivilegesFromNames(rr, requiredPrivilegeNames); instance.defineCriticalAction("Check ACLs", rr, this::validateAllAcls); instance.defineAction("Move Pages", rr, this::movePages); - if (publishMethod != PUBLISH_METHOD.NONE) { + if (publishMethod != PublishMethod.NONE) { instance.defineAction("Activate New", rr, this::activateNew); instance.defineAction("Activate References", rr, this::activateReferences); instance.defineAction("Deactivate Old", rr, this::deactivateOld); @@ -299,15 +300,17 @@ private void beginStep(ActionManager step, String startingNode, SimpleFilteringR } } - enum REPORT { + @SuppressWarnings("squid:S00115") + enum Report { target, acl_check, all_references, published_references, move_time, activate_time, deactivate_time - }; - final private Map> reportData = new TreeMap<>(); + } - private void note(String page, REPORT col, Object value) { + private final Map> reportData = new TreeMap<>(); + + private void note(String page, Report col, Object value) { synchronized (reportData) { if (!reportData.containsKey(page)) { - reportData.put(page, new EnumMap<>(REPORT.class)); + reportData.put(page, new EnumMap<>(Report.class)); } reportData.get(page).put(col, value); } @@ -316,7 +319,7 @@ private void note(String page, REPORT col, Object value) { @Override public void storeReport(ProcessInstance instance, ResourceResolver rr) throws RepositoryException, PersistenceException { GenericReport report = new GenericReport(); - report.setRows(reportData, "Source", REPORT.class); + report.setRows(reportData, "Source", Report.class); report.persist(rr, instance.getPath() + "/jcr:content/report"); } @@ -352,22 +355,23 @@ private void checkNodeAcls(ResourceResolver res, String path, Privilege[] prvlgs Session session = res.adaptTo(Session.class); boolean report = res.getResource(path).getResourceType().equals(NameConstants.NT_PAGE); if (!session.getAccessControlManager().hasPrivileges(path, prvlgs)) { - note(path, REPORT.acl_check, "FAIL"); + note(path, Report.acl_check, "FAIL"); throw new RepositoryException("Insufficient permissions to permit move operation"); } else if (report) { - note(path, REPORT.acl_check, "PASS"); + note(path, Report.acl_check, "PASS"); } } + @SuppressWarnings("squid:S00112") private void movePage(ResourceResolver rr, String sourcePage) throws Exception { PageManager manager = pageManagerFactory.getPageManager(rr); Field replicatorField = FieldUtils.getDeclaredField(manager.getClass(), "replicator", true); FieldUtils.writeField(replicatorField, manager, replicatorQueue); String destination = convertSourceToDestination(sourcePage); String destinationParent = destination.substring(0, destination.lastIndexOf('/')); - note(sourcePage, REPORT.target, destination); + note(sourcePage, Report.target, destination); String beforeName = ""; - long start = System.currentTimeMillis(); + final long start = System.currentTimeMillis(); String contentPath = sourcePage + "/jcr:content"; List refs = new ArrayList<>(); @@ -385,8 +389,8 @@ private void movePage(ResourceResolver rr, String sourcePage) throws Exception { .map(ReferenceSearch.Info::getPagePath) .collect(Collectors.toCollection(()->publishRefs)); } - note(sourcePage, REPORT.all_references, refs.size()); - note(sourcePage, REPORT.published_references, publishRefs.size()); + note(sourcePage, Report.all_references, refs.size()); + note(sourcePage, Report.published_references, publishRefs.size()); if (!dryRun) { Actions.retry(10, 500, res -> { @@ -412,7 +416,7 @@ private void movePage(ResourceResolver rr, String sourcePage) throws Exception { }).accept(rr); } long end = System.currentTimeMillis(); - note(sourcePage, REPORT.move_time, end - start); + note(sourcePage, Report.move_time, end - start); } @@ -447,9 +451,9 @@ private void performNecessaryReplication(ResourceResolver rr, String path) throw } long end = System.currentTimeMillis(); if (path.startsWith(sourcePath)) { - note(path, REPORT.deactivate_time, end - start); + note(path, Report.deactivate_time, end - start); } else { - note(reversePathLookup(path), REPORT.activate_time, end - start); + note(reversePathLookup(path), Report.activate_time, end - start); } } diff --git a/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/processes/ProcessCleanup.java b/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/processes/ProcessCleanup.java index 40ce1867b1..e9c7664ac5 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/processes/ProcessCleanup.java +++ b/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/processes/ProcessCleanup.java @@ -58,8 +58,8 @@ public void init() throws RepositoryException { // No init needed, do nothing. } + @SuppressWarnings("squid:S00112") private void performCleanupActivity(ActionManager manager) throws Exception { - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Calendar c = Calendar.getInstance(); c.clear(Calendar.HOUR_OF_DAY); c.clear(Calendar.MINUTE); diff --git a/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/processes/ReplicatorQueue.java b/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/processes/ReplicatorQueue.java index fc75acfa62..377c5f970f 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/processes/ReplicatorQueue.java +++ b/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/processes/ReplicatorQueue.java @@ -42,7 +42,7 @@ public void replicate(Session session, ReplicationActionType actionType, String @Override public void replicate(Session session, ReplicationActionType actionType, String path, ReplicationOptions replicationOptions) throws ReplicationException { - Map queue = null; + Map queue; switch (actionType) { case ACTIVATE: queue = activateOperations; @@ -50,6 +50,9 @@ public void replicate(Session session, ReplicationActionType actionType, String case DEACTIVATE: case DELETE: queue = deactivateOperations; + break; + default: + queue = null; } if (queue != null) { queue.put(path, replicationOptions); @@ -58,6 +61,7 @@ public void replicate(Session session, ReplicationActionType actionType, String @Override public void checkPermission(Session sn, ReplicationActionType rat, String string) throws ReplicationException { + // no-op } @Override diff --git a/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/processes/S3AssetIngestor.java b/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/processes/S3AssetIngestor.java index 0c0bcf17c8..479a1d060c 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/processes/S3AssetIngestor.java +++ b/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/processes/S3AssetIngestor.java @@ -119,9 +119,10 @@ void createFolders(ActionManager manager) { createFolders(manager, listing); }); } + private void createFolders(ActionManager manager, ObjectListing listing) { - listing.getObjectSummaries().stream().filter(sum -> !sum.getKey().equals(s3BasePath)).map(S3HierarchialElement::new). - filter(S3HierarchialElement::isFolder).filter(this::canImportFolder).forEach(el-> { + listing.getObjectSummaries().stream().filter(sum -> !sum.getKey().equals(s3BasePath)).map(S3HierarchialElement::new) + .filter(S3HierarchialElement::isFolder).filter(this::canImportFolder).forEach(el-> { manager.deferredWithResolver(Actions.retry(10, 100, rr-> { manager.setCurrentItem(el.getItemName()); createFolderNode(el, rr); @@ -142,8 +143,9 @@ void importAssets(ActionManager manager) { } private void importAssets(ActionManager manager, ObjectListing listing) { - listing.getObjectSummaries().stream().map(S3HierarchialElement::new). - filter(S3HierarchialElement::isFile).filter(this::canImportContainingFolder).map(S3HierarchialElement::getSource).forEach(ss-> { + listing.getObjectSummaries().stream().map(S3HierarchialElement::new) + .filter(S3HierarchialElement::isFile).filter(this::canImportContainingFolder) + .map(S3HierarchialElement::getSource).forEach(ss-> { if (canImportFile(ss)) { manager.deferredWithResolver(Actions.retry(5, 25, importAsset(ss, manager))); } else { diff --git a/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/processes/S3AssetIngestorFactory.java b/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/processes/S3AssetIngestorFactory.java index 3a0d47a563..7a6aec3ccd 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/processes/S3AssetIngestorFactory.java +++ b/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/processes/S3AssetIngestorFactory.java @@ -52,9 +52,10 @@ public boolean isAllowed(User user) { if (super.isAllowed(user)) { // check if S3 SDK is available try { - AmazonS3 s3Client = new AmazonS3Client(); + new AmazonS3Client(); return true; } catch (NoClassDefFoundError e) { + // ignore } } return false; diff --git a/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/processes/TagCreator.java b/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/processes/TagCreator.java index 01da737618..9e7ae38a88 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/processes/TagCreator.java +++ b/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/processes/TagCreator.java @@ -18,7 +18,9 @@ import com.adobe.acs.commons.fam.ActionManager; import com.adobe.acs.commons.mcp.ProcessDefinition; import com.adobe.acs.commons.mcp.ProcessInstance; -import com.adobe.acs.commons.mcp.form.*; +import com.adobe.acs.commons.mcp.form.FileUploadComponent; +import com.adobe.acs.commons.mcp.form.FormField; +import com.adobe.acs.commons.mcp.form.SelectComponent; import com.adobe.acs.commons.mcp.model.GenericReport; import com.adobe.acs.commons.mcp.util.StringUtil; import com.adobe.acs.commons.util.datadefinitions.ResourceDefinition; @@ -43,7 +45,12 @@ import java.io.IOException; import java.io.InputStream; import java.io.Serializable; -import java.util.*; +import java.util.ArrayList; +import java.util.EnumMap; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.Map; /** * Creates cq:Tags based on a well defined Excel document. @@ -62,7 +69,7 @@ public enum TagBuilder { LOWERCASE_WITH_DASHES, LOCALIZED_TITLE, NONE - }; + } public TagCreator(Map resourceDefinitionBuilders) { this.resourceDefinitionBuilders = resourceDefinitionBuilders; @@ -74,7 +81,7 @@ public TagCreator(Map resourceDefinitionBuild component = FileUploadComponent.class, options = {"mimeTypes=application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "required"} ) - public InputStream tagDefinitionFile = null; + public transient InputStream tagDefinitionFile = null; @FormField( name = "Primary Converter", @@ -94,7 +101,7 @@ public TagCreator(Map resourceDefinitionBuild @Override public void init() throws RepositoryException { - + // nothing to do here } @Override @@ -114,6 +121,7 @@ public void buildProcess(ProcessInstance instance, ResourceResolver rr) throws L * @param manager the action manager * @throws IOException */ + @SuppressWarnings({"squid:S3776", "squid:S1141"}) public void parseTags(ActionManager manager) throws Exception { manager.withResolver(rr -> { final XSSFWorkbook workbook = new XSSFWorkbook(tagDefinitionFile); @@ -160,7 +168,7 @@ public void parseTags(ActionManager manager) throws Exception { } } } - }; + } log.info("Finished Parsing and collected [ {} ] tags for import.", tagDefinitions.size()); }); } @@ -177,25 +185,7 @@ public void importTags(ActionManager manager) { final TagManager tagManager = rr.adaptTo(TagManager.class); ReportRowSatus status; - try { - if (tagManager.resolve(tagDefinition.getId()) == null) { - status = ReportRowSatus.CREATED; - } else { - status = ReportRowSatus.UPDATED_EXISTING; - } - - final Tag tag = tagManager.createTag( - tagDefinition.getId(), - tagDefinition.getTitle(), - tagDefinition.getDescription(), - false); - setTitles(tag, tagDefinition); - record(status, tag.getTagID(), tag.getPath(), tag.getTitle()); - log.debug("Created tag [ {} -> {} ]", tagDefinition.getId(), tagDefinition.getTitle()); - } catch (Exception e) { - record(ReportRowSatus.FAILED_TO_CREATE, tagDefinition.getId(), tagDefinition.getPath(), tagDefinition.getTitle()); - log.error("Unable to create tag [ {} -> {} ]", tagDefinition.getId(), tagDefinition.getTitle()); - } + createTag(tagDefinition, tagManager); }); } catch (Exception e) { log.error("Unable to import tags via ACS Commons MCP - Tag Creator", e); @@ -203,6 +193,33 @@ public void importTags(ActionManager manager) { }); } + private void createTag(TagDefinition tagDefinition, TagManager tagManager) { + ReportRowSatus status; + try { + if (tagManager.resolve(tagDefinition.getId()) == null) { + status = ReportRowSatus.CREATED; + } else { + status = ReportRowSatus.UPDATED_EXISTING; + } + + final Tag tag = tagManager.createTag( + tagDefinition.getId(), + tagDefinition.getTitle(), + tagDefinition.getDescription(), + false); + if (tag != null) { + setTitles(tag, tagDefinition); + record(status, tag.getTagID(), tag.getPath(), tag.getTitle()); + log.debug("Created tag [ {} -> {} ]", tagDefinition.getId(), tagDefinition.getTitle()); + } else { + log.error("Tag [ {} ] is null", tagDefinition.getId()); + } + } catch (Exception e) { + record(ReportRowSatus.FAILED_TO_CREATE, tagDefinition.getId(), tagDefinition.getPath(), tagDefinition.getTitle()); + log.error("Unable to create tag [ {} -> {} ]", tagDefinition.getId(), tagDefinition.getTitle()); + } + } + /** * Generates the Tag Definition. * @param tagBuilder The tag builder to use to construct the Tag definition. @@ -232,11 +249,6 @@ private TagDefinition getTagDefinition(final TagBuilder tagBuilder, final int in } private void setTitles(final Tag tag, final TagDefinition tagDefinition) throws RepositoryException { - if (tag == null) { - log.error("Tag [ {} ] is null", tagDefinition.getId()); - return; - } - final Node node = tag.adaptTo(Node.class); if (node == null) { @@ -260,7 +272,7 @@ private void setTitles(final Tag tag, final TagDefinition tagDefinition) throws /** Reporting **/ - transient private final GenericReport report = new GenericReport(); + private final transient GenericReport report = new GenericReport(); private final ArrayList> reportRows = new ArrayList<>(); @@ -276,7 +288,7 @@ public enum ReportRowSatus { UPDATED_EXISTING, FAILED_TO_PARSE, FAILED_TO_CREATE, - }; + } private void record(ReportRowSatus status, String tagId, String path, String title) { final EnumMap row = new EnumMap<>(ReportColumns.class); diff --git a/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/processes/TagCreatorFactory.java b/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/processes/TagCreatorFactory.java index a767d20934..fd6c9c8947 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/processes/TagCreatorFactory.java +++ b/bundle/src/main/java/com/adobe/acs/commons/mcp/impl/processes/TagCreatorFactory.java @@ -21,7 +21,12 @@ import com.adobe.acs.commons.mcp.ProcessDefinitionFactory; import com.adobe.acs.commons.util.datadefinitions.ResourceDefinitionBuilder; -import org.apache.felix.scr.annotations.*; +import org.apache.felix.scr.annotations.Component; +import org.apache.felix.scr.annotations.Reference; +import org.apache.felix.scr.annotations.ReferenceCardinality; +import org.apache.felix.scr.annotations.ReferencePolicy; +import org.apache.felix.scr.annotations.References; +import org.apache.felix.scr.annotations.Service; import org.apache.sling.commons.osgi.PropertiesUtil; import java.util.Map; diff --git a/bundle/src/main/java/com/adobe/acs/commons/mcp/mbean/CPMBean.java b/bundle/src/main/java/com/adobe/acs/commons/mcp/mbean/CPMBean.java index 60d423f4ff..012a80f095 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/mcp/mbean/CPMBean.java +++ b/bundle/src/main/java/com/adobe/acs/commons/mcp/mbean/CPMBean.java @@ -26,6 +26,7 @@ */ @Description("Controlled Process Management") @ProviderType +@SuppressWarnings("checkstyle:abbreviationaswordinname") public interface CPMBean { @Description("Processes") public TabularDataSupport getStatistics() throws OpenDataException; diff --git a/bundle/src/main/java/com/adobe/acs/commons/mcp/model/AvailableProcessDefinitions.java b/bundle/src/main/java/com/adobe/acs/commons/mcp/model/AvailableProcessDefinitions.java index dfb81c5246..a438ad6545 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/mcp/model/AvailableProcessDefinitions.java +++ b/bundle/src/main/java/com/adobe/acs/commons/mcp/model/AvailableProcessDefinitions.java @@ -28,8 +28,6 @@ import org.apache.commons.lang.StringUtils; import org.apache.jackrabbit.api.security.user.User; import org.apache.sling.api.scripting.SlingScriptHelper; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Produce a list of available process definitions that can be started by the @@ -37,12 +35,12 @@ */ @ProviderType public class AvailableProcessDefinitions extends WCMUsePojo { - private static final Logger LOG = LoggerFactory.getLogger(AvailableProcessDefinitions.class); Map definitions = Collections.emptyMap(); Map fieldComponents = Collections.emptyMap(); @Override + @SuppressWarnings("checkstyle:parametername") public void activate() throws Exception { SlingScriptHelper sling = getSlingScriptHelper(); User user = sling.getRequest().getResourceResolver().adaptTo(User.class); diff --git a/bundle/src/main/java/com/adobe/acs/commons/mcp/model/GenericReport.java b/bundle/src/main/java/com/adobe/acs/commons/mcp/model/GenericReport.java index e4dd617e78..7f7e1320b7 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/mcp/model/GenericReport.java +++ b/bundle/src/main/java/com/adobe/acs/commons/mcp/model/GenericReport.java @@ -91,18 +91,18 @@ public , V> void setRows(Map> reportData } getRows().clear(); reportData.forEach((path, row) -> { - Map r = new LinkedHashMap<>(); - r.put(keyName, path); + Map rowData = new LinkedHashMap<>(); + rowData.put(keyName, path); for (Enum c : enumClass.getEnumConstants()) { if (row.containsKey(c)) { ValueFormat format = ValueFormat.forField(c); - r.put(c.toString(), row.get(c)); + rowData.put(c.toString(), row.get(c)); if (format.columnCount > 1) { - r.put(c.toString()+format.suffix, format.getAlternateValue(row.get(c))); + rowData.put(c.toString()+format.suffix, format.getAlternateValue(row.get(c))); } } } - getRows().add(new ValueMapDecorator(r)); + getRows().add(new ValueMapDecorator(rowData)); }); } @@ -118,17 +118,17 @@ public , V> void setRows(List> reportData, Class } getRows().clear(); reportData.forEach(row -> { - Map r = new LinkedHashMap<>(); + Map rowData = new LinkedHashMap<>(); for (Enum c : enumClass.getEnumConstants()) { if (row.containsKey(c)) { ValueFormat format = ValueFormat.forField(c); - r.put(c.toString(), row.get(c)); + rowData.put(c.toString(), row.get(c)); if (format.columnCount > 1) { - r.put(c.toString()+format.suffix, format.getAlternateValue(row.get(c))); + rowData.put(c.toString()+format.suffix, format.getAlternateValue(row.get(c))); } } } - getRows().add(new ValueMapDecorator(r)); + getRows().add(new ValueMapDecorator(rowData)); }); } diff --git a/bundle/src/main/java/com/adobe/acs/commons/mcp/model/ManagedProcess.java b/bundle/src/main/java/com/adobe/acs/commons/mcp/model/ManagedProcess.java index 51372f356a..a7eff3db65 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/mcp/model/ManagedProcess.java +++ b/bundle/src/main/java/com/adobe/acs/commons/mcp/model/ManagedProcess.java @@ -65,7 +65,7 @@ public class ManagedProcess implements Serializable { private Collection reportedErrors; @Inject - transient private Resource resource; + private transient Resource resource; /** * @return the reportedErrors @@ -255,10 +255,10 @@ private String formatDate(long time) { today.clear(Calendar.HOUR_OF_DAY); today.clear(Calendar.MINUTE); today.clear(Calendar.SECOND); - Calendar c = Calendar.getInstance(); - c.setTimeInMillis(time); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(time); DateFormat format; - if (c.after(today)) { + if (cal.after(today)) { format = SimpleDateFormat.getTimeInstance(); } else { format = SimpleDateFormat.getDateTimeInstance(); diff --git a/bundle/src/main/java/com/adobe/acs/commons/mcp/model/ValueFormat.java b/bundle/src/main/java/com/adobe/acs/commons/mcp/model/ValueFormat.java index 0e2e4482cf..db1b1c5e65 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/mcp/model/ValueFormat.java +++ b/bundle/src/main/java/com/adobe/acs/commons/mcp/model/ValueFormat.java @@ -21,6 +21,7 @@ /** * Describes the desired output format of a value within a report */ +@SuppressWarnings({"checkstyle:constantname", "squid:S00115"}) public enum ValueFormat { plain, storageSize("_short", ValueFormat::getHumanSize); int columnCount = 1; @@ -36,13 +37,13 @@ public enum ValueFormat { altFunction = altFunc; } - public static ValueFormat forField(Enum e) { + public static ValueFormat forField(Enum anEnum) { try { - Field f = e.getDeclaringClass().getField(e.name()); - if (!f.isAnnotationPresent(FieldFormat.class)) { + Field field = anEnum.getDeclaringClass().getField(anEnum.name()); + if (!field.isAnnotationPresent(FieldFormat.class)) { return ValueFormat.plain; } else { - FieldFormat rf = f.getAnnotation(FieldFormat.class); + FieldFormat rf = field.getAnnotation(FieldFormat.class); return rf.value(); } } catch (IllegalArgumentException | NoSuchFieldException | SecurityException ex) { diff --git a/bundle/src/main/java/com/adobe/acs/commons/mcp/model/impl/ArchivedProcessInstance.java b/bundle/src/main/java/com/adobe/acs/commons/mcp/model/impl/ArchivedProcessInstance.java index 9e4780e014..4b73f095fa 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/mcp/model/impl/ArchivedProcessInstance.java +++ b/bundle/src/main/java/com/adobe/acs/commons/mcp/model/impl/ArchivedProcessInstance.java @@ -41,9 +41,10 @@ @Model(adaptables = Resource.class, defaultInjectionStrategy = DefaultInjectionStrategy.OPTIONAL) public class ArchivedProcessInstance implements ProcessInstance, Serializable { private static final long serialVersionUID = 7526472295622776155L; + private static final String MSG_ARCHIVED_PROCESSES_HAVE_NO_ACTIONS = "Archived processes have no actions"; @Inject - transient private Resource resource; + private transient Resource resource; @Inject @Via("path") @@ -93,41 +94,41 @@ protected void setValues() { @Override public void init(ResourceResolver resourceResolver, Map parameterMap) throws DeserializeException, RepositoryException { - throw new UnsupportedOperationException("Archived processes have no actions"); + throw new UnsupportedOperationException(MSG_ARCHIVED_PROCESSES_HAVE_NO_ACTIONS); } @Override public ActionManagerFactory getActionManagerFactory() { - throw new UnsupportedOperationException("Archived processes have no actions"); + throw new UnsupportedOperationException(MSG_ARCHIVED_PROCESSES_HAVE_NO_ACTIONS); } @Override public ActionManager defineCriticalAction(String name, ResourceResolver rr, CheckedConsumer builder) throws LoginException { - throw new UnsupportedOperationException("Archived processes have no actions"); + throw new UnsupportedOperationException(MSG_ARCHIVED_PROCESSES_HAVE_NO_ACTIONS); } @Override public ActionManager defineAction(String name, ResourceResolver rr, CheckedConsumer builder) throws LoginException { - throw new UnsupportedOperationException("Archived processes have no actions"); + throw new UnsupportedOperationException(MSG_ARCHIVED_PROCESSES_HAVE_NO_ACTIONS); } @Override public double updateProgress() { - throw new UnsupportedOperationException("Archived processes have no actions"); + throw new UnsupportedOperationException(MSG_ARCHIVED_PROCESSES_HAVE_NO_ACTIONS); } @Override public void run(ResourceResolver rr) { - throw new UnsupportedOperationException("Archived processes have no actions"); + throw new UnsupportedOperationException(MSG_ARCHIVED_PROCESSES_HAVE_NO_ACTIONS); } @Override public void halt() { - throw new UnsupportedOperationException("Archived processes have no actions"); + throw new UnsupportedOperationException(MSG_ARCHIVED_PROCESSES_HAVE_NO_ACTIONS); } @Override public CompositeData getStatistics() { - throw new UnsupportedOperationException("Archived processes have no actions"); + throw new UnsupportedOperationException(MSG_ARCHIVED_PROCESSES_HAVE_NO_ACTIONS); } } diff --git a/bundle/src/main/java/com/adobe/acs/commons/mcp/util/AnnotatedFieldDeserializer.java b/bundle/src/main/java/com/adobe/acs/commons/mcp/util/AnnotatedFieldDeserializer.java index b6be0d0ff9..b46e2f00d0 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/mcp/util/AnnotatedFieldDeserializer.java +++ b/bundle/src/main/java/com/adobe/acs/commons/mcp/util/AnnotatedFieldDeserializer.java @@ -16,29 +16,30 @@ package com.adobe.acs.commons.mcp.util; import com.adobe.acs.commons.mcp.form.FieldComponent; +import com.adobe.acs.commons.mcp.form.FormField; +import org.apache.commons.lang3.reflect.FieldUtils; +import org.apache.sling.api.resource.ValueMap; +import org.apache.sling.api.scripting.SlingScriptHelper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.io.InputStream; +import java.lang.reflect.Array; import java.lang.reflect.Field; import java.text.NumberFormat; import java.text.ParseException; import java.util.ArrayList; import java.util.Collection; -import java.util.List; -import org.apache.commons.lang3.reflect.FieldUtils; -import org.apache.sling.api.resource.ValueMap; -import com.adobe.acs.commons.mcp.form.FormField; -import static com.adobe.acs.commons.mcp.util.IntrospectionUtil.getCollectionComponentType; -import java.lang.reflect.Array; +import java.util.LinkedHashMap; import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; + +import static com.adobe.acs.commons.mcp.util.IntrospectionUtil.getCollectionComponentType; import static com.adobe.acs.commons.mcp.util.IntrospectionUtil.hasMultipleValues; import static com.adobe.acs.commons.mcp.util.ValueMapSerializer.serializeToStringArray; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.stream.Collectors; -import org.apache.sling.api.scripting.SlingScriptHelper; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * Processing routines for handing ProcessInput within a FormProcessor @@ -62,6 +63,7 @@ public static void deserializeFields(Object target, List fields, ValueMap } } + @SuppressWarnings("squid:S3776") private static void parseInput(Object target, ValueMap input, Field field) throws ReflectiveOperationException, ParseException { FormField inputAnnotation = field.getAnnotation(FormField.class); Object value; @@ -133,6 +135,7 @@ private static Object convertValue(String value, Class type) throws ParseExce return null; } + @SuppressWarnings("squid:S3776") private static Object convertPrimitiveValue(String value, Class type) throws ParseException { if (type.equals(Boolean.class) || type.equals(Boolean.TYPE)) { return value.toLowerCase().trim().equals("true"); diff --git a/bundle/src/main/java/com/adobe/acs/commons/mcp/util/FrozenAsset.java b/bundle/src/main/java/com/adobe/acs/commons/mcp/util/FrozenAsset.java index a51427babc..719f550979 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/mcp/util/FrozenAsset.java +++ b/bundle/src/main/java/com/adobe/acs/commons/mcp/util/FrozenAsset.java @@ -72,6 +72,7 @@ public static Asset createFrozenAsset(Asset asset, Revision revision) throws Rep return (Asset) Proxy.newProxyInstance(FrozenAsset.class.getClassLoader(), new Class[] { Asset.class }, handler); } + @SuppressWarnings("squid:S1144") private static Asset createFrozenAsset(ResourceResolver resourceResolver, String path) throws RepositoryException { InvocationHandler handler = new FrozenAsset(resourceResolver, path); return (Asset) Proxy.newProxyInstance(FrozenAsset.class.getClassLoader(), new Class[] { Asset.class }, handler); diff --git a/bundle/src/main/java/com/adobe/acs/commons/mcp/util/FrozenRendition.java b/bundle/src/main/java/com/adobe/acs/commons/mcp/util/FrozenRendition.java index 62f4a26d8d..10079978ca 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/mcp/util/FrozenRendition.java +++ b/bundle/src/main/java/com/adobe/acs/commons/mcp/util/FrozenRendition.java @@ -38,20 +38,18 @@ public class FrozenRendition implements InvocationHandler { private static final Logger LOG = LoggerFactory.getLogger(FrozenRendition.class); - private final Asset asset; - private final Resource container; private final Resource renditionData; - private FrozenRendition(Asset asset, Resource container) { - this.asset = asset; + private FrozenRendition(Resource container) { this.container = container; this.renditionData = container.getChild(JcrConstants.JCR_CONTENT); } + @SuppressWarnings("squid:S1172") public static Rendition createFrozenRendition(Asset asset, Resource resource) { - InvocationHandler handler = new FrozenRendition(asset, resource); + InvocationHandler handler = new FrozenRendition(resource); return (Rendition) Proxy.newProxyInstance(FrozenRendition.class.getClassLoader(), new Class[] { Rendition.class }, handler); } diff --git a/bundle/src/main/java/com/adobe/acs/commons/mcp/util/IntrospectionUtil.java b/bundle/src/main/java/com/adobe/acs/commons/mcp/util/IntrospectionUtil.java index f4d1e3feae..2830094ed4 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/mcp/util/IntrospectionUtil.java +++ b/bundle/src/main/java/com/adobe/acs/commons/mcp/util/IntrospectionUtil.java @@ -65,7 +65,7 @@ public static Class getCollectionComponentType(Field field) { */ public static boolean isPrimitive(Field field) { Class basicType = getCollectionComponentType(field); - return basicType.isPrimitive() || Number.class.isAssignableFrom(basicType) || basicType == String.class; + return basicType != null && (basicType.isPrimitive() || Number.class.isAssignableFrom(basicType) || basicType == String.class); } /** @@ -75,7 +75,7 @@ public static boolean isPrimitive(Field field) { */ public static boolean isSimple(Field field) { Class basicType = getCollectionComponentType(field); - return isPrimitive(field) || basicType.isEnum() || basicType == String.class; + return basicType != null && (isPrimitive(field) || basicType.isEnum() || basicType == String.class); } private IntrospectionUtil() { diff --git a/bundle/src/main/java/com/adobe/acs/commons/mcp/util/StringUtil.java b/bundle/src/main/java/com/adobe/acs/commons/mcp/util/StringUtil.java index f1ccc5e335..b2928c4917 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/mcp/util/StringUtil.java +++ b/bundle/src/main/java/com/adobe/acs/commons/mcp/util/StringUtil.java @@ -25,7 +25,7 @@ public class StringUtil { public static String getFriendlyName(String orig) { - String parts[] = org.apache.commons.lang.StringUtils.split(orig, "._-"); + String[] parts = org.apache.commons.lang.StringUtils.split(orig, "._-"); if (parts.length == 1) { parts = org.apache.commons.lang.StringUtils.splitByCharacterTypeCamelCase(orig); } diff --git a/bundle/src/main/java/com/adobe/acs/commons/models/injectors/annotation/impl/AemObjectAnnotationProcessorFactory.java b/bundle/src/main/java/com/adobe/acs/commons/models/injectors/annotation/impl/AemObjectAnnotationProcessorFactory.java index 5d2360ed25..471b6bb054 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/models/injectors/annotation/impl/AemObjectAnnotationProcessorFactory.java +++ b/bundle/src/main/java/com/adobe/acs/commons/models/injectors/annotation/impl/AemObjectAnnotationProcessorFactory.java @@ -29,6 +29,7 @@ import org.apache.sling.models.spi.injectorspecific.StaticInjectAnnotationProcessorFactory; import com.adobe.acs.commons.models.injectors.annotation.AemObject; + /** * The annotation processor for the {@link AemObject} annotation * @@ -38,7 +39,7 @@ @Service public class AemObjectAnnotationProcessorFactory implements StaticInjectAnnotationProcessorFactory{ - @Override + @Override public InjectAnnotationProcessor2 createAnnotationProcessor(final AnnotatedElement element) { // check if the element has the expected annotation AemObject annotation = element.getAnnotation(AemObject.class); diff --git a/bundle/src/main/java/com/adobe/acs/commons/oak/impl/EnsureOakIndex.java b/bundle/src/main/java/com/adobe/acs/commons/oak/impl/EnsureOakIndex.java index 2cbb867026..26e24c8ef8 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/oak/impl/EnsureOakIndex.java +++ b/bundle/src/main/java/com/adobe/acs/commons/oak/impl/EnsureOakIndex.java @@ -192,7 +192,7 @@ public String getOakIndexesPath() { public final String toString() { return String.format("EnsureOakIndex( %s => %s )", - new Object[]{ensureDefinitionsPath, oakIndexesPath}); + ensureDefinitionsPath, oakIndexesPath); } ChecksumGenerator getChecksumGenerator() { diff --git a/bundle/src/main/java/com/adobe/acs/commons/oak/impl/EnsureOakIndexJobHandler.java b/bundle/src/main/java/com/adobe/acs/commons/oak/impl/EnsureOakIndexJobHandler.java index 394357e8d6..cce5368f6a 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/oak/impl/EnsureOakIndexJobHandler.java +++ b/bundle/src/main/java/com/adobe/acs/commons/oak/impl/EnsureOakIndexJobHandler.java @@ -124,6 +124,7 @@ public class EnsureOakIndexJobHandler implements Runnable { } @Override + @SuppressWarnings("squid:S1141") public void run() { ResourceResolver resourceResolver = null; @@ -372,6 +373,7 @@ public Resource create(final @Nonnull Resource ensuredDefinition, final @Nonnull * @throws RepositoryException * @throws IOException */ + @SuppressWarnings("squid:S3776") public Resource update(final @Nonnull Resource ensureDefinition, final @Nonnull Resource oakIndexes, boolean forceReindex) throws RepositoryException, IOException { diff --git a/bundle/src/main/java/com/adobe/acs/commons/oak/impl/EnsureOakIndexManagerImpl.java b/bundle/src/main/java/com/adobe/acs/commons/oak/impl/EnsureOakIndexManagerImpl.java index 5bffd5d49d..72e7a6d0c1 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/oak/impl/EnsureOakIndexManagerImpl.java +++ b/bundle/src/main/java/com/adobe/acs/commons/oak/impl/EnsureOakIndexManagerImpl.java @@ -178,6 +178,7 @@ protected final void unbindAppliableEnsureOakIndex(AppliableEnsureOakIndex index * @throws OpenDataException */ @Override + @SuppressWarnings("squid:S1192") public final TabularData getEnsureOakIndexes() throws OpenDataException { final CompositeType configType = new CompositeType( diff --git a/bundle/src/main/java/com/adobe/acs/commons/oak/impl/EnsurePropertyIndex.java b/bundle/src/main/java/com/adobe/acs/commons/oak/impl/EnsurePropertyIndex.java index 32ab6168b7..0874de107d 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/oak/impl/EnsurePropertyIndex.java +++ b/bundle/src/main/java/com/adobe/acs/commons/oak/impl/EnsurePropertyIndex.java @@ -40,6 +40,10 @@ import javax.jcr.ValueFactory; import java.util.Map; + +/** + * @deprecated use EnsureOakIndex instead + */ @Deprecated @Component(configurationFactory = true, metatype = true, @@ -143,11 +147,12 @@ private void updateIndex(Node indexNode, IndexDefinition def) throws RepositoryE } @Activate + @SuppressWarnings("squid:S3776") protected void activate(Map properties) throws RepositoryException { log.warn("EnsurePropertyIndex is deprecated. Please switch to EnsureOakIndex immediately."); if (capabilityHelper.isOak()) { - String name = PropertiesUtil.toString(properties.get(PROP_INDEX_NAME), null); + final String name = PropertiesUtil.toString(properties.get(PROP_INDEX_NAME), null); IndexDefinition def = new IndexDefinition(); def.propertyName = PropertiesUtil.toString(properties.get(PROP_PROPERTY_NAME), null); diff --git a/bundle/src/main/java/com/adobe/acs/commons/packaging/PackageHelper.java b/bundle/src/main/java/com/adobe/acs/commons/packaging/PackageHelper.java index 6e7be19901..c68809293b 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/packaging/PackageHelper.java +++ b/bundle/src/main/java/com/adobe/acs/commons/packaging/PackageHelper.java @@ -42,6 +42,7 @@ * Helper interface for dynamic package creation. */ @ProviderType +@SuppressWarnings("squid:S1214") public interface PackageHelper { /** * JCR Path to default ACS thumbnail resource. @@ -54,6 +55,7 @@ public interface PackageHelper { * Replace: If a conflicting package exists; remove that package and create a new w updated params. * IncrementVersion: If a conflict package exists; increment the package minor version to the next free minor. */ + @SuppressWarnings("squid:S00115") enum ConflictResolution { None, Replace, diff --git a/bundle/src/main/java/com/adobe/acs/commons/packaging/impl/ACLPackagerServletImpl.java b/bundle/src/main/java/com/adobe/acs/commons/packaging/impl/ACLPackagerServletImpl.java index b899d009b3..92c7b04f2b 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/packaging/impl/ACLPackagerServletImpl.java +++ b/bundle/src/main/java/com/adobe/acs/commons/packaging/impl/ACLPackagerServletImpl.java @@ -73,8 +73,6 @@ public class ACLPackagerServletImpl extends AbstractPackagerServlet { private static final String DEFAULT_PACKAGE_GROUP_NAME = "ACLs"; - private static final String DEFAULT_PACKAGE_VERSION = "1.0.0"; - private static final String DEFAULT_PACKAGE_DESCRIPTION = "ACL Package initially defined by a ACS AEM Commons - " + "ACL Packager configuration."; @@ -155,6 +153,7 @@ private ValueMap getProperties(final SlingHttpServletRequest request) { * @return Set (ordered by path) of rep:ACE coverage who hold permissions for at least one Principal * enumerated in principleNames */ + @SuppressWarnings("squid:S3776") private List findResources(final ResourceResolver resourceResolver, final List principalNames, final List includePatterns) { @@ -289,12 +288,9 @@ protected PackageHelper getPackageHelper() { * @return true if the resource's path matches any of the include patterns */ private boolean isIncluded(final Resource resource, final List includePatterns) { - if (resource == null) { - // Resource is null; so dont accept this + if (resource == null // Resource is null; so dont accept this + || (!resource.isResourceType("rep:ACL"))) { // ONLY accept the resource is a rep:ACL node return false; - } else if (!resource.isResourceType("rep:ACL")) { - // ONLY accept the resource is a rep:ACL node - return false; } if (includePatterns == null || includePatterns.isEmpty()) { @@ -339,9 +335,5 @@ private List toPatterns(final List data) { /** * Compares and sorts resources alphabetically (descending) by path. */ - private static Comparator resourceComparator = new Comparator() { - public int compare(final Resource r1, final Resource r2) { - return r1.getPath().compareTo(r2.getPath()); - } - }; + private static Comparator resourceComparator = Comparator.comparing(Resource::getPath); } diff --git a/bundle/src/main/java/com/adobe/acs/commons/packaging/impl/JcrPackageCoverageProgressListener.java b/bundle/src/main/java/com/adobe/acs/commons/packaging/impl/JcrPackageCoverageProgressListener.java index 450aa3d569..d358d3d0f8 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/packaging/impl/JcrPackageCoverageProgressListener.java +++ b/bundle/src/main/java/com/adobe/acs/commons/packaging/impl/JcrPackageCoverageProgressListener.java @@ -35,7 +35,7 @@ public final void onMessage(final Mode mode, final String action, final String p @Override public final void onError(final Mode mode, final String path, final Exception e) { - + // no need to track errors } public final List getCoverage() { diff --git a/bundle/src/main/java/com/adobe/acs/commons/packaging/impl/PackageHelperImpl.java b/bundle/src/main/java/com/adobe/acs/commons/packaging/impl/PackageHelperImpl.java index 9bea165698..e94553d606 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/packaging/impl/PackageHelperImpl.java +++ b/bundle/src/main/java/com/adobe/acs/commons/packaging/impl/PackageHelperImpl.java @@ -67,6 +67,12 @@ public final class PackageHelperImpl implements PackageHelper { private static final String JSON_EXCEPTION_MSG = "{\"status\": \"error\", \"msg\": \"Error creating JSON response.\"}"; + private static final String KEY_STATUS = "status"; + private static final String KEY_MSG = "msg"; + private static final String KEY_PATH = "path"; + private static final String KEY_FILTER_SETS = "filterSets"; + private static final String KEY_IMPORT_MODE = "importMode"; + private static final String KEY_ROOT_PATH = "rootPath"; @Reference private Packaging packaging; @@ -106,9 +112,7 @@ public void addThumbnail(final JcrPackage jcrPackage, Resource thumbnailResource } } - /** - * {@inheritDoc} - */ + @SuppressWarnings("squid:S3776") public Version getNextVersion(final JcrPackageManager jcrPackageManager, final String groupName, final String name, final String version) throws RepositoryException { @@ -322,17 +326,17 @@ public List getContents(final JcrPackage jcrPackage) throws IOException, public String getSuccessJSON(final JcrPackage jcrPackage) throws JSONException, RepositoryException { final JSONObject json = new JSONObject(); - json.put("status", "success"); - json.put("path", jcrPackage.getNode().getPath()); - json.put("filterSets", new JSONArray()); + json.put(KEY_STATUS, "success"); + json.put(KEY_PATH, jcrPackage.getNode().getPath()); + json.put(KEY_FILTER_SETS, new JSONArray()); final List filterSets = jcrPackage.getDefinition().getMetaInf().getFilter().getFilterSets(); for (final PathFilterSet filterSet : filterSets) { final JSONObject jsonFilterSet = new JSONObject(); - jsonFilterSet.put("importMode", filterSet.getImportMode().name()); - jsonFilterSet.put("rootPath", filterSet.getRoot()); + jsonFilterSet.put(KEY_IMPORT_MODE, filterSet.getImportMode().name()); + jsonFilterSet.put(KEY_ROOT_PATH, filterSet.getRoot()); - json.accumulate("filterSets", jsonFilterSet); + json.accumulate(KEY_FILTER_SETS, jsonFilterSet); } return json.toString(); @@ -370,14 +374,14 @@ public String getPreviewJSONForPaths(Collection paths) throws JSONExcept public String getPathFilterSetPreviewJSON(final Collection pathFilterSets) throws JSONException { final JSONObject json = new JSONObject(); - json.put("status", "preview"); - json.put("path", "Not applicable (Preview)"); - json.put("filterSets", new JSONArray()); + json.put(KEY_STATUS, "preview"); + json.put(KEY_PATH, "Not applicable (Preview)"); + json.put(KEY_FILTER_SETS, new JSONArray()); for (final PathFilterSet pathFilterSet : pathFilterSets) { final JSONObject tmp = new JSONObject(); - tmp.put("importMode", "Not applicable (Preview)"); - tmp.put("rootPath", pathFilterSet.getRoot()); + tmp.put(KEY_IMPORT_MODE, "Not applicable (Preview)"); + tmp.put(KEY_ROOT_PATH, pathFilterSet.getRoot()); json.accumulate("filterSets", tmp); } @@ -392,8 +396,8 @@ public String getPathFilterSetPreviewJSON(final Collection pathFi public String getErrorJSON(final String msg) { final JSONObject json = new JSONObject(); try { - json.put("status", "error"); - json.put("msg", msg); + json.put(KEY_STATUS, "error"); + json.put(KEY_MSG, msg); return json.toString(); } catch (JSONException e) { log.error("Error creating JSON Error response message: {}", e); diff --git a/bundle/src/main/java/com/adobe/acs/commons/packaging/impl/QueryPackagerServletImpl.java b/bundle/src/main/java/com/adobe/acs/commons/packaging/impl/QueryPackagerServletImpl.java index b44c80fe6a..ab2a8d7a76 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/packaging/impl/QueryPackagerServletImpl.java +++ b/bundle/src/main/java/com/adobe/acs/commons/packaging/impl/QueryPackagerServletImpl.java @@ -87,10 +87,6 @@ public class QueryPackagerServletImpl extends SlingAllMethodsServlet { private static final String QUERY_PACKAGE_THUMBNAIL_RESOURCE_PATH = "/apps/acs-commons/components/utilities/packager/query-packager/definition/package-thumbnail.png"; - private static final String QUERY_BUILDER = "queryBuilder"; - - private static final String LIST = "list"; - @Reference private Packaging packaging; @@ -184,25 +180,4 @@ private ValueMap getProperties(final SlingHttpServletRequest request) { return request.getResource().getChild("configuration").adaptTo(ValueMap.class); } } - - - /** - * Get the relative resource of the given resource if it resolves otherwise - * the provided resource. - * - * @param resource the resource - * @param relPath the relative path to resolve against the resource - * @return the relative resource if it resolves otherwise the resource - */ - private Resource getRelativeAwareResource(final Resource resource, final String relPath) { - if (resource != null && StringUtils.isNotBlank(relPath)) { - final Resource relResource = resource.getChild(relPath); - - if (relResource != null) { - return relResource; - } - } - - return resource; - } } diff --git a/bundle/src/main/java/com/adobe/acs/commons/quickly/Command.java b/bundle/src/main/java/com/adobe/acs/commons/quickly/Command.java index 2499bde247..9bfe0dd206 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/quickly/Command.java +++ b/bundle/src/main/java/com/adobe/acs/commons/quickly/Command.java @@ -81,10 +81,16 @@ public String getParam() { return this.param; } - public String toString() { return this.raw; } + public String toString() { + return this.raw; + } - public String[] getParams() { return Arrays.copyOf(this.params, this.params.length); } + public String[] getParams() { + return Arrays.copyOf(this.params, this.params.length); + } - public String[] getPunctuation() { return Arrays.copyOf(this.punctuation, this.punctuation.length); } + public String[] getPunctuation() { + return Arrays.copyOf(this.punctuation, this.punctuation.length); + } } diff --git a/bundle/src/main/java/com/adobe/acs/commons/quickly/QuicklyEngine.java b/bundle/src/main/java/com/adobe/acs/commons/quickly/QuicklyEngine.java index 6a8de6f6e5..d42a736f6a 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/quickly/QuicklyEngine.java +++ b/bundle/src/main/java/com/adobe/acs/commons/quickly/QuicklyEngine.java @@ -28,6 +28,7 @@ import aQute.bnd.annotation.ProviderType; @ProviderType +@SuppressWarnings("squid:S1214") public interface QuicklyEngine { String CONFIG_RESULTS = "results"; diff --git a/bundle/src/main/java/com/adobe/acs/commons/quickly/impl/QuicklyEngineImpl.java b/bundle/src/main/java/com/adobe/acs/commons/quickly/impl/QuicklyEngineImpl.java index a8b9ae0be6..1f7069df3d 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/quickly/impl/QuicklyEngineImpl.java +++ b/bundle/src/main/java/com/adobe/acs/commons/quickly/impl/QuicklyEngineImpl.java @@ -56,7 +56,8 @@ label = "ACS AEM Commons - Quickly", metatype = true, policy = ConfigurationPolicy.REQUIRE -)@Reference( +) +@Reference( name = "operations", referenceInterface = Operation.class, policy = ReferencePolicy.DYNAMIC, diff --git a/bundle/src/main/java/com/adobe/acs/commons/quickly/impl/QuicklyFilter.java b/bundle/src/main/java/com/adobe/acs/commons/quickly/impl/QuicklyFilter.java index 46aac51cbd..482e491b7d 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/quickly/impl/QuicklyFilter.java +++ b/bundle/src/main/java/com/adobe/acs/commons/quickly/impl/QuicklyFilter.java @@ -65,14 +65,14 @@ public class QuicklyFilter implements Filter { private static final String HTML_FILE = "/quickly/inject.html"; - private static String appHTML = ""; + private String appHTML = ""; @Reference private QuicklyEngine quicklyEngine; @Override public void init(final FilterConfig filterConfig) throws ServletException { - + // no-op } @Override @@ -117,9 +117,10 @@ public void doFilter(final ServletRequest servletRequest, @Override public void destroy() { - + // no-op } + @SuppressWarnings("squid:S3923") private boolean accepts(final HttpServletRequest request) { if (!StringUtils.equalsIgnoreCase("get", request.getMethod())) { // Only inject on GET requests diff --git a/bundle/src/main/java/com/adobe/acs/commons/quickly/operations/Operation.java b/bundle/src/main/java/com/adobe/acs/commons/quickly/operations/Operation.java index 655edce1fe..5b8334f985 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/quickly/operations/Operation.java +++ b/bundle/src/main/java/com/adobe/acs/commons/quickly/operations/Operation.java @@ -30,6 +30,7 @@ import java.util.Collection; @ProviderType +@SuppressWarnings("squid:S1214") public interface Operation { final String PROP_CMD = "cmd"; diff --git a/bundle/src/main/java/com/adobe/acs/commons/quickly/operations/impl/HelpOperationImpl.java b/bundle/src/main/java/com/adobe/acs/commons/quickly/operations/impl/HelpOperationImpl.java index cb6e633439..7ca1f6e4c6 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/quickly/operations/impl/HelpOperationImpl.java +++ b/bundle/src/main/java/com/adobe/acs/commons/quickly/operations/impl/HelpOperationImpl.java @@ -55,8 +55,8 @@ public class HelpOperationImpl extends AbstractOperation { public boolean accepts(final SlingHttpServletRequest request, final Command cmd) { - return StringUtils.equalsIgnoreCase(CMD, cmd.getOp()) || - StringUtils.equalsIgnoreCase(CMD_ALIAS, cmd.getOp()); + return StringUtils.equalsIgnoreCase(CMD, cmd.getOp()) + || StringUtils.equalsIgnoreCase(CMD_ALIAS, cmd.getOp()); } @Override diff --git a/bundle/src/main/java/com/adobe/acs/commons/quickly/operations/impl/LastModifiedOperationImpl.java b/bundle/src/main/java/com/adobe/acs/commons/quickly/operations/impl/LastModifiedOperationImpl.java index e569317108..9e8c646d35 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/quickly/operations/impl/LastModifiedOperationImpl.java +++ b/bundle/src/main/java/com/adobe/acs/commons/quickly/operations/impl/LastModifiedOperationImpl.java @@ -159,10 +159,10 @@ protected List withParams(final SlingHttpServletRequest request, private List getLastModifiedPages(final ResourceResolver resourceResolver, final Command cmd) { final String relativeDateRange = this.getRelativeDateRangeLowerBoundParam(cmd); - final String userID = this.getUserIDParam(cmd, resourceResolver.getUserID()); + final String userId = this.getUserIdParam(cmd, resourceResolver.getUserID()); return this.getLastModifiedQuery(resourceResolver, - userID, + userId, relativeDateRange, "cq:PageContent", "@" + NameConstants.PN_PAGE_LAST_MOD, MAX_QUERY_RESULTS); @@ -196,6 +196,7 @@ private List getLastModifiedQuery(final ResourceResolver resourceResol try { log.debug("Lastmod QueryBuilder Map: {}", new JSONObject(map).toString(2)); } catch (JSONException e) { + // no-op } final Query query = queryBuilder.createQuery(PredicateGroup.create(map), @@ -236,7 +237,7 @@ private String getRelativeDateRangeLowerBoundParam(final Command cmd) { } - private String getUserIDParam(final Command cmd, String currentUserID) { + private String getUserIdParam(final Command cmd, String currentUserId) { final String[] params = cmd.getParams(); if (params.length > 0) { @@ -249,7 +250,7 @@ private String getUserIDParam(final Command cmd, String currentUserID) { } } - return currentUserID; + return currentUserId; } } \ No newline at end of file diff --git a/bundle/src/main/java/com/adobe/acs/commons/quickly/results/Action.java b/bundle/src/main/java/com/adobe/acs/commons/quickly/results/Action.java index d890401f5f..5a0c36071e 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/quickly/results/Action.java +++ b/bundle/src/main/java/com/adobe/acs/commons/quickly/results/Action.java @@ -39,6 +39,7 @@ public enum Target { this.value = value; } + @Override public String toString() { return this.value; } @@ -57,6 +58,7 @@ public enum Method { this.value = value; } + @Override public String toString() { return this.value; } diff --git a/bundle/src/main/java/com/adobe/acs/commons/quickly/results/Result.java b/bundle/src/main/java/com/adobe/acs/commons/quickly/results/Result.java index b96752fcbf..52e7ca311e 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/quickly/results/Result.java +++ b/bundle/src/main/java/com/adobe/acs/commons/quickly/results/Result.java @@ -42,6 +42,7 @@ public enum Mode { this.value = value; } + @Override public String toString() { return this.value; } diff --git a/bundle/src/main/java/com/adobe/acs/commons/quickly/results/ResultSerializer.java b/bundle/src/main/java/com/adobe/acs/commons/quickly/results/ResultSerializer.java index 426f8415bf..a2bcb6e2cd 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/quickly/results/ResultSerializer.java +++ b/bundle/src/main/java/com/adobe/acs/commons/quickly/results/ResultSerializer.java @@ -26,8 +26,9 @@ import org.apache.sling.commons.json.JSONObject; @ProviderType +@SuppressWarnings("squid:S1214") public interface ResultSerializer { - public static final String PROP_TYPE = "type"; + String PROP_TYPE = "type"; /** * Turns a Result object into a JSON object diff --git a/bundle/src/main/java/com/adobe/acs/commons/quickly/results/impl/ResultBuilderImpl.java b/bundle/src/main/java/com/adobe/acs/commons/quickly/results/impl/ResultBuilderImpl.java index 2d07539242..d72f2aded4 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/quickly/results/impl/ResultBuilderImpl.java +++ b/bundle/src/main/java/com/adobe/acs/commons/quickly/results/impl/ResultBuilderImpl.java @@ -96,7 +96,7 @@ public JSONObject toJSON(final Command cmd, Result result, final ValueMap config } if (serializer != null) { - //log.trace("Serializing results using Result Serializer [ {} ] w/ [ {} ]", result.getResultType(), serializer.getClass().getSimpleName()); + log.trace("Serializing results using Result Serializer [ {} ] w/ [ {} ]", result.getResultType(), serializer.getClass().getSimpleName()); return serializer.toJSON(result, config); } else { log.trace("Could not find Quickly Result Serializer for type [ {} ]", result.getResultType()); @@ -113,6 +113,7 @@ public JSONObject toJSON(final Command cmd, Result result, final ValueMap config return null; } + @SuppressWarnings("checkstyle:abbreviationaswordinname") protected final boolean acceptsAuthoringUIMode(Result result, AuthoringUIMode authoringUIMode) { if (result.getAuthoringMode() == null) { // All Authoring Modes diff --git a/bundle/src/main/java/com/adobe/acs/commons/quickly/results/impl/lists/ACSToolsResults.java b/bundle/src/main/java/com/adobe/acs/commons/quickly/results/impl/lists/ACSToolsResults.java index 3b906c73cd..2c79e9565b 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/quickly/results/impl/lists/ACSToolsResults.java +++ b/bundle/src/main/java/com/adobe/acs/commons/quickly/results/impl/lists/ACSToolsResults.java @@ -26,6 +26,7 @@ import java.util.ArrayList; import java.util.List; +@SuppressWarnings("checkstyle:abbreviationaswordinname") public class ACSToolsResults extends AbstractAccessibleResults { public final List getResults() { diff --git a/bundle/src/main/java/com/adobe/acs/commons/quickly/results/impl/lists/AbstractAccessibleResults.java b/bundle/src/main/java/com/adobe/acs/commons/quickly/results/impl/lists/AbstractAccessibleResults.java index 6def1626cf..ad57936216 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/quickly/results/impl/lists/AbstractAccessibleResults.java +++ b/bundle/src/main/java/com/adobe/acs/commons/quickly/results/impl/lists/AbstractAccessibleResults.java @@ -34,9 +34,8 @@ public final List getResults(final ResourceResolver resourceResolver) { List results = new ArrayList(); for(Result result : getResults()) { - if(StringUtils.isNotBlank(result.getPath())) { - results.add(result); - } else if (resourceResolver.resolve(result.getPath()) != null) { + if (StringUtils.isNotBlank(result.getPath()) + || resourceResolver.resolve(result.getPath()) != null) { results.add(result); } } diff --git a/bundle/src/main/java/com/adobe/acs/commons/quickly/results/impl/lists/DevConsoleResults.java b/bundle/src/main/java/com/adobe/acs/commons/quickly/results/impl/lists/DevConsoleResults.java index b85af49173..690690aa77 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/quickly/results/impl/lists/DevConsoleResults.java +++ b/bundle/src/main/java/com/adobe/acs/commons/quickly/results/impl/lists/DevConsoleResults.java @@ -28,6 +28,8 @@ public class DevConsoleResults { + private DevConsoleResults() {} + public static final List getResults() { List results = new ArrayList(); diff --git a/bundle/src/main/java/com/adobe/acs/commons/quickly/results/impl/lists/HelpResults.java b/bundle/src/main/java/com/adobe/acs/commons/quickly/results/impl/lists/HelpResults.java index af8117fcae..ff771412e6 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/quickly/results/impl/lists/HelpResults.java +++ b/bundle/src/main/java/com/adobe/acs/commons/quickly/results/impl/lists/HelpResults.java @@ -68,8 +68,8 @@ public final List getResults() { .build()); results.add(new Result.Builder("*") - .description("Self managed favorites. " + - "'Add Favorite' adds the current page as a favorite. '* rm' removes favorite'd pages.") + .description("Self managed favorites. " + + "'Add Favorite' adds the current page as a favorite. '* rm' removes favorite'd pages.") .action(new Action.Builder().method(Action.Method.NOOP).build()) .build()); diff --git a/bundle/src/main/java/com/adobe/acs/commons/quickly/results/impl/serializers/AbstractResultSerializer.java b/bundle/src/main/java/com/adobe/acs/commons/quickly/results/impl/serializers/AbstractResultSerializer.java index 5c125be3bb..3c863b7c7d 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/quickly/results/impl/serializers/AbstractResultSerializer.java +++ b/bundle/src/main/java/com/adobe/acs/commons/quickly/results/impl/serializers/AbstractResultSerializer.java @@ -28,7 +28,7 @@ public abstract class AbstractResultSerializer { - public JSONObject toJSON(final Result result, final ValueMap config) throws JSONException { + public JSONObject toJSON(final Result result) throws JSONException { final JSONObject json = new JSONObject(); json.put("title", result.getTitle()); diff --git a/bundle/src/main/java/com/adobe/acs/commons/quickly/results/impl/serializers/GenericResultSerializerImpl.java b/bundle/src/main/java/com/adobe/acs/commons/quickly/results/impl/serializers/GenericResultSerializerImpl.java index 2c99452a2b..8d67f31f8b 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/quickly/results/impl/serializers/GenericResultSerializerImpl.java +++ b/bundle/src/main/java/com/adobe/acs/commons/quickly/results/impl/serializers/GenericResultSerializerImpl.java @@ -47,6 +47,6 @@ public class GenericResultSerializerImpl extends AbstractResultSerializer implem public JSONObject toJSON(final Result result, final ValueMap config) throws JSONException { log.trace("Entering Generic Result Serializer for {}", result.getPath()); - return super.toJSON(result, config); + return super.toJSON(result); } } diff --git a/bundle/src/main/java/com/adobe/acs/commons/quickly/results/impl/serializers/OpenResultSerializerImpl.java b/bundle/src/main/java/com/adobe/acs/commons/quickly/results/impl/serializers/OpenResultSerializerImpl.java index 872a898734..079866545f 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/quickly/results/impl/serializers/OpenResultSerializerImpl.java +++ b/bundle/src/main/java/com/adobe/acs/commons/quickly/results/impl/serializers/OpenResultSerializerImpl.java @@ -53,6 +53,6 @@ public JSONObject toJSON(final Result result, final ValueMap config) throws JSON result.getAction().setUri("/editor.html" + result.getPath() + ".html"); } - return super.toJSON(result, config); + return super.toJSON(result); } } diff --git a/bundle/src/main/java/com/adobe/acs/commons/redirectmaps/impl/FakeSlingHttpServletRequest.java b/bundle/src/main/java/com/adobe/acs/commons/redirectmaps/impl/FakeSlingHttpServletRequest.java index 1d1921d48c..f66a38851f 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/redirectmaps/impl/FakeSlingHttpServletRequest.java +++ b/bundle/src/main/java/com/adobe/acs/commons/redirectmaps/impl/FakeSlingHttpServletRequest.java @@ -74,399 +74,457 @@ * Fake request object, used to support mapping requests without using a "real" * request. Based on the Apache Sling Testing Mock Servlet Request. */ +@SuppressWarnings({"checkstyle:abbreviationaswordinname", "squid:S1149", "squid:S1168"}) public class FakeSlingHttpServletRequest implements SlingHttpServletRequest { - private Resource resource; + private Resource resource; - private String method; + private String method; + + private final String scheme; + private final String server; + private final int port; + + private boolean secure = false; - private final String scheme; - private final String server; - private final int port; - - private boolean secure = false; - - public static final String RESOURCE_TYPE = "foo/bar"; - - private ResourceResolver resolver; - - public FakeSlingHttpServletRequest(ResourceResolver resolver, String scheme, String server, int port) { - this.resource = new SyntheticResource(null, "", RESOURCE_TYPE); - this.scheme = scheme; - this.server = server; - this.port = port; - - setMethod(null); - } - - public void setResource(Resource resource) { - this.resource = resource; - } - - public void setSecure(boolean secure) { - this.secure = secure; - } - - public void setMethod(String method) { - this.method = (method == null) ? "GET" : method.toUpperCase(); - } - - public Cookie getCookie(String name) { - return null; - } - - public RequestDispatcher getRequestDispatcher(String path, RequestDispatcherOptions options) { - return null; - } - - public RequestDispatcher getRequestDispatcher(Resource resource, RequestDispatcherOptions options) { - return null; - } - - public RequestDispatcher getRequestDispatcher(Resource resource) { - return null; - } - - public RequestParameter getRequestParameter(String name) { - return null; - } - - public RequestParameterMap getRequestParameterMap() { - return null; - } - - public RequestParameter[] getRequestParameters(String name) { - return null; - } - - public RequestPathInfo getRequestPathInfo() { - return null; - } - - public RequestProgressTracker getRequestProgressTracker() { - return null; - } - - public Resource getResource() { - return resource; - } - - public ResourceBundle getResourceBundle(Locale locale) { - return null; - } - - public ResourceBundle getResourceBundle(String baseName, Locale locale) { - return null; - } - - public ResourceResolver getResourceResolver() { - return resolver; - } - - public String getResponseContentType() { - return null; - } - - public Enumeration getResponseContentTypes() { - return null; - } - - public String getAuthType() { - return null; - } - - public String getContextPath() { - return ""; - } - - public Cookie[] getCookies() { - return null; - } - - public long getDateHeader(String name) { - return 0; - } - - public String getHeader(String name) { - return null; - } - - public Enumeration getHeaderNames() { - return null; - } - - public Enumeration getHeaders(String name) { - return null; - } - - public int getIntHeader(String name) { - return 0; - } - - public String getMethod() { - return method; - } - - public String getPathInfo() { - return null; - } - - public String getPathTranslated() { - return null; - } - - public String getQueryString() { - return null; - } - - public String getRemoteUser() { - return null; - } - - public String getRequestURI() { - return null; - } - - public StringBuffer getRequestURL() { - return null; - } - - public String getRequestedSessionId() { - return null; - } - - public String getServletPath() { - return null; - } - - public HttpSession getSession() { - return null; - } - - public HttpSession getSession(boolean create) { - return null; - } - - public Principal getUserPrincipal() { - return null; - } - - public boolean isRequestedSessionIdFromCookie() { - return false; - } - - public boolean isRequestedSessionIdFromURL() { - return false; - } - - public boolean isRequestedSessionIdFromUrl() { - return false; - } - - public boolean isRequestedSessionIdValid() { - return false; - } - - public boolean isUserInRole(String role) { - return false; - } - - public Object getAttribute(String name) { - return null; - } - - public Enumeration getAttributeNames() { - return null; - } - - public String getCharacterEncoding() { - return null; - } - - public int getContentLength() { - return 0; - } - - public String getContentType() { - return null; - } - - public ServletInputStream getInputStream() { - return null; - } - - public String getLocalAddr() { - return null; - } - - public String getLocalName() { - return null; - } - - public int getLocalPort() { - return 0; - } - - public Locale getLocale() { - return null; - } - - public Enumeration getLocales() { - return null; - } - - public String getParameter(String name) { - return null; - } - - public Map getParameterMap() { - return null; - } - - public Enumeration getParameterNames() { - return null; - } - - public String[] getParameterValues(String name) { - return null; - } - - public String getProtocol() { - return null; - } - - public BufferedReader getReader() { - return null; - } - - public String getRealPath(String path) { - return null; - } - - public String getRemoteAddr() { - return null; - } - - public String getRemoteHost() { - return null; - } - - public int getRemotePort() { - return 0; - } - - public RequestDispatcher getRequestDispatcher(String path) { - return null; - } - - public String getScheme() { - return scheme; - } - - public String getServerName() { - return server; - } - - public int getServerPort() { - return port; - } - - public boolean isSecure() { - return this.secure; - } - - public void removeAttribute(String name) { - - } - - public void setAttribute(String name, Object o) { - - } - - public void setCharacterEncoding(String env) { - - } - - public AdapterType adaptTo(Class type) { - return null; - } - - @Override - public boolean authenticate(HttpServletResponse response) throws IOException, ServletException { - // TODO Auto-generated method stub - return false; - } - - @Override - public void login(String username, String password) throws ServletException { - // TODO Auto-generated method stub - - } - - @Override - public void logout() throws ServletException { - // TODO Auto-generated method stub - - } - - @Override - public Collection getParts() throws IOException, ServletException { - // TODO Auto-generated method stub - return null; - } - - @Override - public Part getPart(String name) throws IOException, ServletException { - // TODO Auto-generated method stub - return null; - } - - @Override - public ServletContext getServletContext() { - // TODO Auto-generated method stub - return null; - } - - @Override - public AsyncContext startAsync() throws IllegalStateException { - // TODO Auto-generated method stub - return null; - } - - @Override - public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse servletResponse) - throws IllegalStateException { - // TODO Auto-generated method stub - return null; - } - - @Override - public boolean isAsyncStarted() { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean isAsyncSupported() { - // TODO Auto-generated method stub - return false; - } - - @Override - public AsyncContext getAsyncContext() { - // TODO Auto-generated method stub - return null; - } - - @Override - public DispatcherType getDispatcherType() { - // TODO Auto-generated method stub - return null; - } - - @Override - public List getRequestParameterList() { - // TODO Auto-generated method stub - return null; - } + public static final String RESOURCE_TYPE = "foo/bar"; + + private ResourceResolver resolver; + + public FakeSlingHttpServletRequest(ResourceResolver resolver, String scheme, String server, int port) { + this.resource = new SyntheticResource(null, "", RESOURCE_TYPE); + this.scheme = scheme; + this.server = server; + this.port = port; + + setMethod(null); + } + + public void setResource(Resource resource) { + this.resource = resource; + } + + public void setSecure(boolean secure) { + this.secure = secure; + } + + public void setMethod(String method) { + this.method = (method == null) ? "GET" : method.toUpperCase(); + } + + @Override + public Cookie getCookie(String name) { + return null; + } + + @Override + public RequestDispatcher getRequestDispatcher(String path, RequestDispatcherOptions options) { + return null; + } + + @Override + public RequestDispatcher getRequestDispatcher(Resource resource, RequestDispatcherOptions options) { + return null; + } + + @Override + public RequestDispatcher getRequestDispatcher(Resource resource) { + return null; + } + + @Override + public RequestDispatcher getRequestDispatcher(String path) { + return null; + } + + @Override + public RequestParameter getRequestParameter(String name) { + return null; + } + + @Override + public RequestParameterMap getRequestParameterMap() { + return null; + } + + @Override + public RequestParameter[] getRequestParameters(String name) { + return null; + } + + @Override + public RequestPathInfo getRequestPathInfo() { + return null; + } + + @Override + public RequestProgressTracker getRequestProgressTracker() { + return null; + } + + @Override + public Resource getResource() { + return resource; + } + + @Override + public ResourceBundle getResourceBundle(Locale locale) { + return null; + } + + @Override + public ResourceBundle getResourceBundle(String baseName, Locale locale) { + return null; + } + + @Override + public ResourceResolver getResourceResolver() { + return resolver; + } + + @Override + public String getResponseContentType() { + return null; + } + + @Override + public Enumeration getResponseContentTypes() { + return null; + } + + @Override + public String getAuthType() { + return null; + } + + @Override + public String getContextPath() { + return ""; + } + + @Override + public Cookie[] getCookies() { + return null; + } + + @Override + public long getDateHeader(String name) { + return 0; + } + + @Override + public String getHeader(String name) { + return null; + } + + @Override + public Enumeration getHeaderNames() { + return null; + } + + @Override + public Enumeration getHeaders(String name) { + return null; + } + + @Override + public int getIntHeader(String name) { + return 0; + } + + @Override + public String getMethod() { + return method; + } + + @Override + public String getPathInfo() { + return null; + } + + @Override + public String getPathTranslated() { + return null; + } + + @Override + public String getQueryString() { + return null; + } + + @Override + public String getRemoteUser() { + return null; + } + + @Override + public String getRequestURI() { + return null; + } + + @Override + public StringBuffer getRequestURL() { + return null; + } + + @Override + public String getRequestedSessionId() { + return null; + } + + @Override + public String getServletPath() { + return null; + } + + @Override + public HttpSession getSession() { + return null; + } + + @Override + public HttpSession getSession(boolean create) { + return null; + } + + @Override + public Principal getUserPrincipal() { + return null; + } + + @Override + public boolean isRequestedSessionIdFromCookie() { + return false; + } + + @Override + public boolean isRequestedSessionIdFromURL() { + return false; + } + + @Override + public boolean isRequestedSessionIdFromUrl() { + return false; + } + + @Override + public boolean isRequestedSessionIdValid() { + return false; + } + + @Override + public boolean isUserInRole(String role) { + return false; + } + + @Override + public Object getAttribute(String name) { + return null; + } + + @Override + public Enumeration getAttributeNames() { + return null; + } + + @Override + public String getCharacterEncoding() { + return null; + } + + @Override + public int getContentLength() { + return 0; + } + + @Override + public String getContentType() { + return null; + } + + @Override + public ServletInputStream getInputStream() { + return null; + } + + @Override + public String getLocalAddr() { + return null; + } + + @Override + public String getLocalName() { + return null; + } + + @Override + public int getLocalPort() { + return 0; + } + + @Override + public Locale getLocale() { + return null; + } + + @Override + public Enumeration getLocales() { + return null; + } + + @Override + public String getParameter(String name) { + return null; + } + + @Override + public Map getParameterMap() { + return null; + } + + @Override + public Enumeration getParameterNames() { + return null; + } + + @Override + public String[] getParameterValues(String name) { + return null; + } + + @Override + public String getProtocol() { + return null; + } + + @Override + public BufferedReader getReader() { + return null; + } + + @Override + public String getRealPath(String path) { + return null; + } + + @Override + public String getRemoteAddr() { + return null; + } + + @Override + public String getRemoteHost() { + return null; + } + + @Override + public int getRemotePort() { + return 0; + } + + @Override + public String getScheme() { + return scheme; + } + + @Override + public String getServerName() { + return server; + } + + @Override + public int getServerPort() { + return port; + } + + @Override + public boolean isSecure() { + return this.secure; + } + + @Override + public void removeAttribute(String name) { + // no-op + } + + @Override + public void setAttribute(String name, Object o) { + // no-op + } + + @Override + public void setCharacterEncoding(String env) { + // no-op + } + + @Override + public AdapterType adaptTo(Class type) { + return null; + } + + @Override + public boolean authenticate(HttpServletResponse response) throws IOException, ServletException { + return false; + } + + @Override + public void login(String username, String password) throws ServletException { + // no-op + } + + @Override + public void logout() throws ServletException { + // no-op + } + + @Override + public Collection getParts() throws IOException, ServletException { + return null; + } + + @Override + public Part getPart(String name) throws IOException, ServletException { + return null; + } + + @Override + public ServletContext getServletContext() { + return null; + } + + @Override + public AsyncContext startAsync() throws IllegalStateException { + return null; + } + + @Override + public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse servletResponse) + throws IllegalStateException { + return null; + } + + @Override + public boolean isAsyncStarted() { + return false; + } + + @Override + public boolean isAsyncSupported() { + return false; + } + + @Override + public AsyncContext getAsyncContext() { + return null; + } + + @Override + public DispatcherType getDispatcherType() { + return null; + } + + @Override + public List getRequestParameterList() { + return null; + } } diff --git a/bundle/src/main/java/com/adobe/acs/commons/redirectmaps/impl/RedirectMapServlet.java b/bundle/src/main/java/com/adobe/acs/commons/redirectmaps/impl/RedirectMapServlet.java index 6d30a7f587..6b1cc3327f 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/redirectmaps/impl/RedirectMapServlet.java +++ b/bundle/src/main/java/com/adobe/acs/commons/redirectmaps/impl/RedirectMapServlet.java @@ -39,20 +39,20 @@ * and a list vanity properties in cq:Page and dam:Asset nodes. */ @SlingServlet(methods = { "GET" }, resourceTypes = { "acs-commons/components/utilities/redirectmappage" }, selectors = { - "redirectmap" }, extensions = { "txt" }, metatype = false) + "redirectmap" }, extensions = { "txt" }, metatype = false) public class RedirectMapServlet extends SlingSafeMethodsServlet { - private static final Logger log = LoggerFactory.getLogger(RedirectMapServlet.class); - private static final long serialVersionUID = -3564475196678277711L; + private static final Logger log = LoggerFactory.getLogger(RedirectMapServlet.class); + private static final long serialVersionUID = -3564475196678277711L; - protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) - throws ServletException, IOException { - log.trace("doGet"); + protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) + throws ServletException, IOException { + log.trace("doGet"); - log.debug("Requesting redirect maps from {}", request.getResource()); - RedirectMapModel redirectMap = request.getResource().adaptTo(RedirectMapModel.class); + log.debug("Requesting redirect maps from {}", request.getResource()); + RedirectMapModel redirectMap = request.getResource().adaptTo(RedirectMapModel.class); - response.setContentType(MediaType.PLAIN_TEXT_UTF_8.toString()); - response.getOutputStream().write(redirectMap.getRedirectMap().getBytes(StandardCharsets.UTF_8)); - } + response.setContentType(MediaType.PLAIN_TEXT_UTF_8.toString()); + response.getOutputStream().write(redirectMap.getRedirectMap().getBytes(StandardCharsets.UTF_8)); + } } diff --git a/bundle/src/main/java/com/adobe/acs/commons/redirectmaps/models/MapEntry.java b/bundle/src/main/java/com/adobe/acs/commons/redirectmaps/models/MapEntry.java index 87612b3712..aba15fd396 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/redirectmaps/models/MapEntry.java +++ b/bundle/src/main/java/com/adobe/acs/commons/redirectmaps/models/MapEntry.java @@ -25,44 +25,44 @@ * Simple POJO for map entry items based on Vanity paths for Redirect Maps. */ public class MapEntry { - private final Resource resource; - private final String source; - private final String target; - private final boolean valid; + private final Resource resource; + private final String source; + private final String target; + private final boolean valid; - public MapEntry(Resource resource, String source, String target) { - source = source.trim(); - if (source.matches(".*\\s.*")) { - RedirectMapModel.log.warn("Source path {} for content {} contains whitespace", source, resource); - valid = false; - } else { - valid = true; - } - this.source = source; - this.target = target; - this.resource = resource; + public MapEntry(Resource resource, String source, String target) { + source = source.trim(); + if (source.matches(".*\\s.*")) { + RedirectMapModel.log.warn("Source path {} for content {} contains whitespace", source, resource); + valid = false; + } else { + valid = true; + } + this.source = source; + this.target = target; + this.resource = resource; - } + } - public Resource getResource() { - return resource; - } + public Resource getResource() { + return resource; + } - public String getSource() { - return source; - } + public String getSource() { + return source; + } - public String getTarget() { - return target; - } + public String getTarget() { + return target; + } - public boolean isValid() { - return valid; - } + public boolean isValid() { + return valid; + } - @Override - public String toString() { - return "MapEntry [resource=" + resource + ", source=" + source + ", target=" + target + ", valid=" + valid - + "]"; - } + @Override + public String toString() { + return "MapEntry [resource=" + resource + ", source=" + source + ", target=" + target + ", valid=" + valid + + "]"; + } } \ No newline at end of file diff --git a/bundle/src/main/java/com/adobe/acs/commons/redirectmaps/models/RedirectConfigModel.java b/bundle/src/main/java/com/adobe/acs/commons/redirectmaps/models/RedirectConfigModel.java index 090674bbe5..d14fea3245 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/redirectmaps/models/RedirectConfigModel.java +++ b/bundle/src/main/java/com/adobe/acs/commons/redirectmaps/models/RedirectConfigModel.java @@ -31,45 +31,45 @@ @Model(adaptables = Resource.class) public interface RedirectConfigModel { - /** - * Gets the domain for mapping the request - * - * @return - */ - @Inject - String getDomain(); + /** + * Gets the domain for mapping the request + * + * @return + */ + @Inject + String getDomain(); - /** - * Gets the path under which to search for items to check for the vanity - * property - * - * @return - */ - @Inject - String getPath(); + /** + * Gets the path under which to search for items to check for the vanity + * property + * + * @return + */ + @Inject + String getPath(); - /** - * Gets the property to use for the vanity paths - * - * @return - */ - @Inject - String getProperty(); + /** + * Gets the property to use for the vanity paths + * + * @return + */ + @Inject + String getProperty(); - /** - * Gets the protocol (http or https) for mapping the request - * - * @return - */ - @Inject - String getProtocol(); + /** + * Gets the protocol (http or https) for mapping the request + * + * @return + */ + @Inject + String getProtocol(); - /** - * The resource for this configurations - * - * @return - */ - @Self - Resource getResource(); + /** + * The resource for this configurations + * + * @return + */ + @Self + Resource getResource(); } diff --git a/bundle/src/main/java/com/adobe/acs/commons/redirectmaps/models/RedirectMapModel.java b/bundle/src/main/java/com/adobe/acs/commons/redirectmaps/models/RedirectMapModel.java index c7e1e1054f..f78b972761 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/redirectmaps/models/RedirectMapModel.java +++ b/bundle/src/main/java/com/adobe/acs/commons/redirectmaps/models/RedirectMapModel.java @@ -49,116 +49,116 @@ @Model(adaptables = Resource.class) public class RedirectMapModel { - static final Logger log = LoggerFactory.getLogger(RedirectMapModel.class); - - @Inject - @Optional - @Named("redirectMap.txt") - private Resource redirectMap; - - @Inject - @Optional - private List redirects; - - @Inject - @Source("sling-object") - private ResourceResolver resourceResolver; - - private List addItems(RedirectConfigModel config, Iterator items, StringBuilder sb, - String suffix) { - List invalidEntries = new ArrayList(); - while (items.hasNext()) { - Resource item = items.next(); - String path = item.getPath(); - ValueMap properties = item.getChild(JcrConstants.JCR_CONTENT).getValueMap(); - FakeSlingHttpServletRequest mockRequest = new FakeSlingHttpServletRequest(resourceResolver, - config.getProtocol(), config.getDomain(), (config.getProtocol().equals("https") ? 443 : 80)); - String pageUrl = config.getProtocol() + "://" + config.getDomain() - + resourceResolver.map(mockRequest, item.getPath() + suffix); - - String[] sources = properties.get(config.getProperty(), String[].class); - for (String source : sources) { - MapEntry entry = new MapEntry(item, source, pageUrl); - if (!entry.isValid()) { - log.warn("Source path {} for content {} contains whitespace", entry.getSource(), path); - invalidEntries.add(entry); - } else { - sb.append(entry.getSource() + " " + entry.getTarget() + "\n"); - } - } - } - return invalidEntries; - } - - private List gatherEntries(RedirectConfigModel config, StringBuilder sb) { - log.trace("gatherEntries"); - - log.debug("Getting all of the entries for {}", config.getResource()); - - List invalidEntries = new ArrayList(); - - sb.append("\n# Dynamic entries for " + config.getResource().getPath() + "\n"); - - String pageQuery = "SELECT * FROM [cq:Page] WHERE [jcr:content/" + config.getProperty() - + "] IS NOT NULL AND (ISDESCENDANTNODE([" + config.getPath() + "]) OR [jcr:path]='" + config.getPath() - + "')"; - log.debug("Finding pages with redirects with query: {}", pageQuery); - invalidEntries.addAll(addItems(config, resourceResolver.findResources(pageQuery, Query.JCR_SQL2), sb, ".html")); - String assetQuery = "SELECT * FROM [dam:Asset] WHERE [jcr:content/" + config.getProperty() - + "] IS NOT NULL AND (ISDESCENDANTNODE([" + config.getPath() + "]) OR [jcr:path]='" + config.getPath() - + "')"; - log.debug("Finding assets with redirects with query: {}", assetQuery); - invalidEntries.addAll(addItems(config, resourceResolver.findResources(assetQuery, Query.JCR_SQL2), sb, "")); - return invalidEntries; - } - - /** - * Get all of the entries from the cq:Pages and dam:Assets which contain - * whitespace in their vanity URL. - * - * @return - */ - public List getInvalidEntries() { - log.trace("getInvalidEntries"); - List invalidEntries = new ArrayList(); - StringBuilder sb = new StringBuilder(); - if (redirects != null) { - for (RedirectConfigModel config : redirects) { - invalidEntries.addAll(gatherEntries(config, sb)); - } - } - log.debug("Found {} invalid entries", invalidEntries.size()); - return invalidEntries; - } - - /** - * Get the contents of the RedirectMap as a String - * - * @return - * @throws IOException - */ - public String getRedirectMap() throws IOException { - log.debug("Retrieving redirect map from {}", redirectMap); - - StringBuilder sb = new StringBuilder(); - - if (redirectMap != null) { - log.debug("Loading RedirectMap file from {}", redirectMap); - sb.append("# Redirect Map File\n"); - InputStream is = redirectMap.adaptTo(InputStream.class); - sb.append(IOUtils.toString(is)); - } else { - log.debug("No redirect map specified"); - } - - if (redirects != null) { - for (RedirectConfigModel config : redirects) { - gatherEntries(config, sb); - } - } else { - log.debug("No redirect configurations specified"); - } - return sb.toString(); - } + static final Logger log = LoggerFactory.getLogger(RedirectMapModel.class); + + @Inject + @Optional + @Named("redirectMap.txt") + private Resource redirectMap; + + @Inject + @Optional + private List redirects; + + @Inject + @Source("sling-object") + private ResourceResolver resourceResolver; + + private List addItems(RedirectConfigModel config, Iterator items, StringBuilder sb, + String suffix) { + List invalidEntries = new ArrayList(); + while (items.hasNext()) { + Resource item = items.next(); + String path = item.getPath(); + ValueMap properties = item.getChild(JcrConstants.JCR_CONTENT).getValueMap(); + FakeSlingHttpServletRequest mockRequest = new FakeSlingHttpServletRequest(resourceResolver, + config.getProtocol(), config.getDomain(), (config.getProtocol().equals("https") ? 443 : 80)); + String pageUrl = config.getProtocol() + "://" + config.getDomain() + + resourceResolver.map(mockRequest, item.getPath() + suffix); + + String[] sources = properties.get(config.getProperty(), String[].class); + for (String source : sources) { + MapEntry entry = new MapEntry(item, source, pageUrl); + if (!entry.isValid()) { + log.warn("Source path {} for content {} contains whitespace", entry.getSource(), path); + invalidEntries.add(entry); + } else { + sb.append(entry.getSource() + " " + entry.getTarget() + "\n"); + } + } + } + return invalidEntries; + } + + private List gatherEntries(RedirectConfigModel config, StringBuilder sb) { + log.trace("gatherEntries"); + + log.debug("Getting all of the entries for {}", config.getResource()); + + List invalidEntries = new ArrayList(); + + sb.append("\n# Dynamic entries for " + config.getResource().getPath() + "\n"); + + String pageQuery = "SELECT * FROM [cq:Page] WHERE [jcr:content/" + config.getProperty() + + "] IS NOT NULL AND (ISDESCENDANTNODE([" + config.getPath() + "]) OR [jcr:path]='" + config.getPath() + + "')"; + log.debug("Finding pages with redirects with query: {}", pageQuery); + invalidEntries.addAll(addItems(config, resourceResolver.findResources(pageQuery, Query.JCR_SQL2), sb, ".html")); + String assetQuery = "SELECT * FROM [dam:Asset] WHERE [jcr:content/" + config.getProperty() + + "] IS NOT NULL AND (ISDESCENDANTNODE([" + config.getPath() + "]) OR [jcr:path]='" + config.getPath() + + "')"; + log.debug("Finding assets with redirects with query: {}", assetQuery); + invalidEntries.addAll(addItems(config, resourceResolver.findResources(assetQuery, Query.JCR_SQL2), sb, "")); + return invalidEntries; + } + + /** + * Get all of the entries from the cq:Pages and dam:Assets which contain + * whitespace in their vanity URL. + * + * @return + */ + public List getInvalidEntries() { + log.trace("getInvalidEntries"); + List invalidEntries = new ArrayList(); + StringBuilder sb = new StringBuilder(); + if (redirects != null) { + for (RedirectConfigModel config : redirects) { + invalidEntries.addAll(gatherEntries(config, sb)); + } + } + log.debug("Found {} invalid entries", invalidEntries.size()); + return invalidEntries; + } + + /** + * Get the contents of the RedirectMap as a String + * + * @return + * @throws IOException + */ + public String getRedirectMap() throws IOException { + log.debug("Retrieving redirect map from {}", redirectMap); + + StringBuilder sb = new StringBuilder(); + + if (redirectMap != null) { + log.debug("Loading RedirectMap file from {}", redirectMap); + sb.append("# Redirect Map File\n"); + InputStream is = redirectMap.adaptTo(InputStream.class); + sb.append(IOUtils.toString(is)); + } else { + log.debug("No redirect map specified"); + } + + if (redirects != null) { + for (RedirectConfigModel config : redirects) { + gatherEntries(config, sb); + } + } else { + log.debug("No redirect configurations specified"); + } + return sb.toString(); + } } diff --git a/bundle/src/main/java/com/adobe/acs/commons/replication/BrandPortalAgentFilter.java b/bundle/src/main/java/com/adobe/acs/commons/replication/BrandPortalAgentFilter.java index 51651a273b..e383b52e36 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/replication/BrandPortalAgentFilter.java +++ b/bundle/src/main/java/com/adobe/acs/commons/replication/BrandPortalAgentFilter.java @@ -32,6 +32,7 @@ import org.slf4j.LoggerFactory; import java.util.ArrayList; +import java.util.Collections; import java.util.List; public class BrandPortalAgentFilter implements AgentFilter { @@ -54,10 +55,10 @@ public boolean isIncluded(Agent agent) { } final ValueMap properties = config.getValueMap(); - final String tenantURL = StringUtils.stripToNull(properties.get(PROP_TENTANT_URL, String.class)); + final String tenantUrl = StringUtils.stripToNull(properties.get(PROP_TENTANT_URL, String.class)); - if (StringUtils.isNotBlank(tenantURL)) { - boolean included = StringUtils.startsWith(transportURI, tenantURL + "/"); + if (StringUtils.isNotBlank(tenantUrl)) { + boolean included = StringUtils.startsWith(transportURI, tenantUrl + "/"); if (included) { log.debug("Including replication agent [ {} ]", agent.getId()); @@ -69,9 +70,10 @@ public boolean isIncluded(Agent agent) { return false; } + @SuppressWarnings("squid:S3776") protected List getBrandPortalConfigs(Resource content) { if (content == null) { - return null; + return Collections.emptyList(); } else if (JcrConstants.JCR_CONTENT.equals(content.getName())) { content = content.getParent(); } diff --git a/bundle/src/main/java/com/adobe/acs/commons/replication/ReplicationResult.java b/bundle/src/main/java/com/adobe/acs/commons/replication/ReplicationResult.java index 10d2b6c153..ec43f38530 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/replication/ReplicationResult.java +++ b/bundle/src/main/java/com/adobe/acs/commons/replication/ReplicationResult.java @@ -60,6 +60,7 @@ public String toString() { return String.format("ReplicationResult [path=%s, status=%s, version=%s]", path, status, version); } + @SuppressWarnings("squid:S00115") public enum Status { replicated, not_replicated, error } diff --git a/bundle/src/main/java/com/adobe/acs/commons/replication/dispatcher/DispatcherFlushFilter.java b/bundle/src/main/java/com/adobe/acs/commons/replication/dispatcher/DispatcherFlushFilter.java index c213874835..4523f85c82 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/replication/dispatcher/DispatcherFlushFilter.java +++ b/bundle/src/main/java/com/adobe/acs/commons/replication/dispatcher/DispatcherFlushFilter.java @@ -40,7 +40,8 @@ public class DispatcherFlushFilter implements AgentFilter { * Hierarchical: "Normal" flush invalidation that effects entire content hierarchies. * ResourceOnly: Targets agents with a CQ-Action-Scope of "Resource Only" defined. */ - public static enum FlushType { + @SuppressWarnings("squid:S00115") + public enum FlushType { All, Hierarchical, ResourceOnly diff --git a/bundle/src/main/java/com/adobe/acs/commons/replication/dispatcher/impl/DispatcherFlushRulesImpl.java b/bundle/src/main/java/com/adobe/acs/commons/replication/dispatcher/impl/DispatcherFlushRulesImpl.java index 0d5468bf92..a3d5b0ac33 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/replication/dispatcher/impl/DispatcherFlushRulesImpl.java +++ b/bundle/src/main/java/com/adobe/acs/commons/replication/dispatcher/impl/DispatcherFlushRulesImpl.java @@ -124,6 +124,7 @@ public class DispatcherFlushRulesImpl implements Preprocessor { private static final String SERVICE_NAME = "dispatcher-flush"; protected static final Map AUTH_INFO; + static { AUTH_INFO = Collections.singletonMap(ResourceResolverFactory.SUBSERVICE, (Object) SERVICE_NAME); } @@ -145,6 +146,7 @@ public class DispatcherFlushRulesImpl implements Preprocessor { * {@inheritDoc} */ @Override + @SuppressWarnings("squid:S3776") public final void preprocess(final ReplicationAction replicationAction, final ReplicationOptions replicationOptions) throws ReplicationException { if (!this.accepts(replicationAction, replicationOptions)) { @@ -315,5 +317,5 @@ protected static final class DispatcherFlushRulesFilter extends DispatcherFlushF public DispatcherFlushRulesFilter(final FlushType flushType) { super(flushType); } - }; + } } diff --git a/bundle/src/main/java/com/adobe/acs/commons/replication/dispatcher/impl/DispatcherFlusherServlet.java b/bundle/src/main/java/com/adobe/acs/commons/replication/dispatcher/impl/DispatcherFlusherServlet.java index 1bec9779ae..6815a33ae9 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/replication/dispatcher/impl/DispatcherFlusherServlet.java +++ b/bundle/src/main/java/com/adobe/acs/commons/replication/dispatcher/impl/DispatcherFlusherServlet.java @@ -78,6 +78,7 @@ public class DispatcherFlusherServlet extends SlingAllMethodsServlet { public static final String PROP_FLUSH_WITH_ADMIN_RESOURCE_RESOLVER = "flush-with-admin-resource-resolver"; @Override + @SuppressWarnings("squid:S3776") protected final void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException { final Resource resource = request.getResource(); diff --git a/bundle/src/main/java/com/adobe/acs/commons/replication/dispatcher/impl/ReplicationResultListener.java b/bundle/src/main/java/com/adobe/acs/commons/replication/dispatcher/impl/ReplicationResultListener.java index 16779b497f..eba87856a6 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/replication/dispatcher/impl/ReplicationResultListener.java +++ b/bundle/src/main/java/com/adobe/acs/commons/replication/dispatcher/impl/ReplicationResultListener.java @@ -37,9 +37,11 @@ public class ReplicationResultListener implements ReplicationListener { private final Map results = new HashMap(); public final void onStart(final Agent agent, final ReplicationAction action) { + // no-op } public final void onMessage(final ReplicationLog.Level level, final String message) { + // no-op } public final void onEnd(final Agent agent, final ReplicationAction action, final ReplicationResult result) { @@ -47,6 +49,7 @@ public final void onEnd(final Agent agent, final ReplicationAction action, final } public final void onError(final Agent agent, final ReplicationAction action, final Exception error) { + // no-op } /** diff --git a/bundle/src/main/java/com/adobe/acs/commons/replication/impl/ReplicateVersionImpl.java b/bundle/src/main/java/com/adobe/acs/commons/replication/impl/ReplicateVersionImpl.java index 8fb390594e..92a8ea8a67 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/replication/impl/ReplicateVersionImpl.java +++ b/bundle/src/main/java/com/adobe/acs/commons/replication/impl/ReplicateVersionImpl.java @@ -115,7 +115,6 @@ private void buildResourceList(ResourceResolver resolver, Resource res, for (Iterator iter = resolver.listChildren(res); iter.hasNext();) { Resource resChild = iter.next(); buildResourceList(resolver, resChild, resources); - resChild = null; } } @@ -161,13 +160,11 @@ private Version getAppropriateVersion(Resource resource, Date date, String path = resource.getPath(); List versions = findAllVersions(path, session); - Collections.sort(versions, new Comparator() { - public int compare(Version v1, Version v2) { - try { - return v2.getCreated().compareTo(v1.getCreated()); - } catch (RepositoryException e) { - return 0; - } + Collections.sort(versions, (v1, v2) -> { + try { + return v2.getCreated().compareTo(v1.getCreated()); + } catch (RepositoryException e) { + return 0; } }); Calendar cal = GregorianCalendar.getInstance(); @@ -210,11 +207,11 @@ private List getVersions(String nodePath, Session session) throws Repos .getAllVersions(); iter.hasNext();) { Version v = iter.nextVersion(); versions.add(v); - v = null; } return versions; } + private String getNormalizedPath(String path) { String root = path; if (root == null || "".equals(root)) { diff --git a/bundle/src/main/java/com/adobe/acs/commons/replication/impl/ReplicateVersionServlet.java b/bundle/src/main/java/com/adobe/acs/commons/replication/impl/ReplicateVersionServlet.java index a8e7760ea4..4f73f990ea 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/replication/impl/ReplicateVersionServlet.java +++ b/bundle/src/main/java/com/adobe/acs/commons/replication/impl/ReplicateVersionServlet.java @@ -21,6 +21,8 @@ import com.adobe.acs.commons.replication.ReplicateVersion; import com.adobe.acs.commons.replication.ReplicationResult; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; import org.apache.commons.lang.ArrayUtils; import org.apache.commons.lang.StringUtils; import org.apache.felix.scr.annotations.Reference; @@ -28,9 +30,6 @@ import org.apache.sling.api.SlingHttpServletRequest; import org.apache.sling.api.SlingHttpServletResponse; import org.apache.sling.api.servlets.SlingAllMethodsServlet; -import org.apache.sling.commons.json.JSONArray; -import org.apache.sling.commons.json.JSONException; -import org.apache.sling.commons.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -56,6 +55,11 @@ public class ReplicateVersionServlet extends SlingAllMethodsServlet { private static final Logger log = LoggerFactory .getLogger(ReplicateVersionServlet.class); + private static final String KEY_ERROR = "error"; + private static final String KEY_RESULT = "result"; + private static final String KEY_STATUS = "status"; + private static final String KEY_PATH = "path"; + private static final String KEY_VERSION = "version"; @Reference private ReplicateVersion replicateVersion; @@ -66,107 +70,83 @@ public final void doPost(SlingHttpServletRequest req, log.debug("Entering ReplicatePageVersionServlet.doPost(..)"); - JSONObject obj = null; + String[] rootPaths = req.getParameterValues("rootPaths"); + Date date = getDate(req.getParameter("datetimecal")); + String[] agents = req.getParameterValues("cmbAgent"); - try { - String[] rootPaths = req.getParameterValues("rootPaths"); - Date date = getDate(req.getParameter("datetimecal")); - String[] agents = req.getParameterValues("cmbAgent"); - - obj = validate(rootPaths, agents, date); + JsonObject obj = validate(rootPaths, agents, date); - if (!obj.has("error")) { - log.debug("Initiating version replication"); + if (!obj.has(KEY_ERROR)) { + log.debug("Initiating version replication"); - List response = replicateVersion.replicate( - req.getResourceResolver(), rootPaths, agents, date); + List response = replicateVersion.replicate( + req.getResourceResolver(), rootPaths, agents, date); - if (log.isDebugEnabled()) { - for (final ReplicationResult replicationResult : response) { - log.debug("Replication result: {} -- {}", - replicationResult.getPath(), - replicationResult.getStatus()); - } + if (log.isDebugEnabled()) { + for (final ReplicationResult replicationResult : response) { + log.debug("Replication result: {} -- {}", + replicationResult.getPath(), + replicationResult.getStatus()); } + } - JSONArray arr = convertResponseToJson(response); - obj = new JSONObject(); - obj.put("result", arr); + JsonArray arr = convertResponseToJson(response); + obj = new JsonObject(); + obj.add(KEY_RESULT, arr); - } else { - log.debug("Did not attempt to replicate version due to issue with input params"); + } else { + log.debug("Did not attempt to replicate version due to issue with input params"); - try { - res.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); - obj.put("status", "error"); - } catch (JSONException e) { - log.error("exception occurred", e); - } - } - } catch (JSONException ex) { - try { - if (obj == null) { - obj = new JSONObject(); - } - res.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); - obj.put("error", "System Error."); - obj.put("status", "error"); - } catch (JSONException e) { - log.error("exception occurred", e); - } + res.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + obj.addProperty(KEY_STATUS, KEY_ERROR); } - try { - res.setContentType("application/json"); - obj.write(res.getWriter()); - } catch (JSONException e) { - log.error("exception occurred", e); - } + res.setContentType("application/json"); + res.getWriter().print(obj.toString()); } - private JSONArray convertResponseToJson(List list) throws JSONException { - JSONArray arr = new JSONArray(); + private JsonArray convertResponseToJson(List list) { + JsonArray arr = new JsonArray(); for (ReplicationResult result : list) { - JSONObject resultObject = new JSONObject(); + JsonObject resultObject = new JsonObject(); - resultObject.put("path", result.getPath()); - resultObject.put("status", result.getStatus().name()); - resultObject.put("version", result.getVersion()); + resultObject.addProperty(KEY_PATH, result.getPath()); + resultObject.addProperty(KEY_STATUS, result.getStatus().name()); + resultObject.addProperty(KEY_VERSION, result.getVersion()); - arr.put(resultObject); + arr.add(resultObject); } return arr; } - private JSONObject validate(String[] rootPaths, String[] agents, Date date) - throws JSONException { + private JsonObject validate(String[] rootPaths, String[] agents, Date date) { - final JSONObject obj = new JSONObject(); + final JsonObject obj = new JsonObject(); if (ArrayUtils.isEmpty(rootPaths)) { - obj.put("error", "Select at least 1 root path."); + obj.addProperty(KEY_ERROR, "Select at least 1 root path."); log.debug("Error validating root paths (they're empty)"); return obj; } for (final String rootPath : rootPaths) { if (StringUtils.isBlank(rootPath)) { - obj.put("error", "Root paths cannot be empty."); + obj.addProperty(KEY_ERROR, "Root paths cannot be empty."); log.debug("Error validating a root path"); return obj; } } if (date == null) { - obj.put("error", "Specify the date and time to select the appropriate resource versions for replication."); + obj.addProperty(KEY_ERROR, "Specify the date and time to select the appropriate resource versions for replication."); log.debug("Error validating date"); return obj; } if (ArrayUtils.isEmpty(agents)) { - obj.put("error", "Select at least 1 replication agent."); + obj.addProperty(KEY_ERROR, "Select at least 1 replication agent."); log.debug("Error validating agents"); return obj; } diff --git a/bundle/src/main/java/com/adobe/acs/commons/replication/packages/automatic/AutomaticPackageReplicatorMBean.java b/bundle/src/main/java/com/adobe/acs/commons/replication/packages/automatic/AutomaticPackageReplicatorMBean.java index 671e9b16f7..9efd7ddfcc 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/replication/packages/automatic/AutomaticPackageReplicatorMBean.java +++ b/bundle/src/main/java/com/adobe/acs/commons/replication/packages/automatic/AutomaticPackageReplicatorMBean.java @@ -28,6 +28,6 @@ @Description("MBean for managing the Automatic Package Replicator.") public interface AutomaticPackageReplicatorMBean extends ResourceServiceManagerMBean { - @Description("Executes the automatic package replication configuration with the specified id") - void execute(String id); + @Description("Executes the automatic package replication configuration with the specified id") + void execute(String id); } diff --git a/bundle/src/main/java/com/adobe/acs/commons/replication/packages/automatic/impl/AutomaticPackageReplicatorJob.java b/bundle/src/main/java/com/adobe/acs/commons/replication/packages/automatic/impl/AutomaticPackageReplicatorJob.java index 2f15955031..369b0a4e98 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/replication/packages/automatic/impl/AutomaticPackageReplicatorJob.java +++ b/bundle/src/main/java/com/adobe/acs/commons/replication/packages/automatic/impl/AutomaticPackageReplicatorJob.java @@ -20,6 +20,7 @@ package com.adobe.acs.commons.replication.packages.automatic.impl; import java.io.IOException; +import java.util.Collections; import java.util.HashMap; import javax.jcr.RepositoryException; @@ -46,86 +47,81 @@ * Simple Job Runnable for automatically replicating a package. */ public class AutomaticPackageReplicatorJob implements Runnable, EventHandler { - private static final Logger log = LoggerFactory.getLogger(AutomaticPackageReplicatorJob.class); - public static final String SERVICE_USER_NAME = "acs-commons-automatic-package-replication-service"; - public static final String OSGI_EVENT_REPLICATED_TOPIC = "com/adobe/acs/commons/automatic_page_replicator/REPLICATED"; - public static final String OSGI_EVENT_FAILED_TOPIC = "com/adobe/acs/commons/automatic_page_replicator/REPLICATION_FAILED"; - public static final String OSGI_EVENT_PACKAGE_PATH_PARAM = "packagePath"; - - private final Replicator replicator; - private final String packagePath; - private final ResourceResolverFactory resolverFactory; - private final EventAdmin eventAdmin; - - public AutomaticPackageReplicatorJob(final ResourceResolverFactory resolverFactory, final Replicator replicator, - final EventAdmin eventAdmin, final String packagePath) { - this.replicator = replicator; - this.packagePath = packagePath; - this.resolverFactory = resolverFactory; - this.eventAdmin = eventAdmin; - } - - public void excute() throws RepositoryException, PackageException, IOException, ReplicationException { - - boolean succeeded = false; - ResourceResolver resolver = null; - try { - resolver = ConfigurationUpdateListener.getResourceResolver(resolverFactory); - - Session session = resolver.adaptTo(Session.class); - - JcrPackageManager pkgMgr = PackagingService.getPackageManager(session); - PackageId packageId = new PackageId(packagePath); - - // check if the package exists - JcrPackage jcrPackage = pkgMgr.open(packageId); - if (jcrPackage == null || jcrPackage.getNode() == null) { - log.warn("Package at path " + packagePath + " does not exist"); - throw new IllegalArgumentException("Package at path " + packagePath + " does not exist"); - } - - log.debug("Assembling package {}", packagePath); - pkgMgr.assemble(jcrPackage, null); - - log.debug("Replicating package {}", packagePath); - replicator.replicate(session, ReplicationActionType.ACTIVATE, jcrPackage.getNode().getPath()); - - log.debug("Package {} replicated successfully!", packagePath); - fireEvent(OSGI_EVENT_REPLICATED_TOPIC); - succeeded = true; - } finally { - if(resolver != null){ - resolver.close(); - } - if(!succeeded){ - fireEvent(OSGI_EVENT_FAILED_TOPIC); - } - } - } - - private void fireEvent(String topic) { - final Event event = new Event(topic, new HashMap() { - private static final long serialVersionUID = 1L; - { - put(OSGI_EVENT_PACKAGE_PATH_PARAM, packagePath); - } - }); - eventAdmin.postEvent(event); - } - - @Override - public void run() { - log.trace("run"); - try { - excute(); - } catch (Exception e) { - log.error("Excepting running Automatic Package Replication task", e); - } - } - - @Override - public void handleEvent(Event event) { - run(); - } + private static final Logger log = LoggerFactory.getLogger(AutomaticPackageReplicatorJob.class); + public static final String SERVICE_USER_NAME = "acs-commons-automatic-package-replication-service"; + public static final String OSGI_EVENT_REPLICATED_TOPIC = "com/adobe/acs/commons/automatic_page_replicator/REPLICATED"; + public static final String OSGI_EVENT_FAILED_TOPIC = "com/adobe/acs/commons/automatic_page_replicator/REPLICATION_FAILED"; + public static final String OSGI_EVENT_PACKAGE_PATH_PARAM = "packagePath"; + + private final Replicator replicator; + private final String packagePath; + private final ResourceResolverFactory resolverFactory; + private final EventAdmin eventAdmin; + + public AutomaticPackageReplicatorJob(final ResourceResolverFactory resolverFactory, final Replicator replicator, + final EventAdmin eventAdmin, final String packagePath) { + this.replicator = replicator; + this.packagePath = packagePath; + this.resolverFactory = resolverFactory; + this.eventAdmin = eventAdmin; + } + + public void excute() throws RepositoryException, PackageException, IOException, ReplicationException { + + boolean succeeded = false; + ResourceResolver resolver = null; + try { + resolver = ConfigurationUpdateListener.getResourceResolver(resolverFactory); + + Session session = resolver.adaptTo(Session.class); + + JcrPackageManager pkgMgr = PackagingService.getPackageManager(session); + PackageId packageId = new PackageId(packagePath); + + // check if the package exists + JcrPackage jcrPackage = pkgMgr.open(packageId); + if (jcrPackage == null || jcrPackage.getNode() == null) { + log.warn("Package at path " + packagePath + " does not exist"); + throw new IllegalArgumentException("Package at path " + packagePath + " does not exist"); + } + + log.debug("Assembling package {}", packagePath); + pkgMgr.assemble(jcrPackage, null); + + log.debug("Replicating package {}", packagePath); + replicator.replicate(session, ReplicationActionType.ACTIVATE, jcrPackage.getNode().getPath()); + + log.debug("Package {} replicated successfully!", packagePath); + fireEvent(OSGI_EVENT_REPLICATED_TOPIC); + succeeded = true; + } finally { + if(resolver != null){ + resolver.close(); + } + if(!succeeded){ + fireEvent(OSGI_EVENT_FAILED_TOPIC); + } + } + } + + private void fireEvent(String topic) { + final Event event = new Event(topic, Collections.singletonMap(OSGI_EVENT_PACKAGE_PATH_PARAM, packagePath)); + eventAdmin.postEvent(event); + } + + @Override + public void run() { + log.trace("run"); + try { + excute(); + } catch (Exception e) { + log.error("Excepting running Automatic Package Replication task", e); + } + } + + @Override + public void handleEvent(Event event) { + run(); + } } diff --git a/bundle/src/main/java/com/adobe/acs/commons/replication/packages/automatic/impl/ConfigurationUpdateListener.java b/bundle/src/main/java/com/adobe/acs/commons/replication/packages/automatic/impl/ConfigurationUpdateListener.java index 5fc70cd54c..2d25db78ce 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/replication/packages/automatic/impl/ConfigurationUpdateListener.java +++ b/bundle/src/main/java/com/adobe/acs/commons/replication/packages/automatic/impl/ConfigurationUpdateListener.java @@ -59,126 +59,127 @@ @Component(immediate = true) @Service(value = { EventHandler.class, AutomaticPackageReplicatorMBean.class }) @Properties({ - @Property(name = EventConstants.EVENT_TOPIC, value = { SlingConstants.TOPIC_RESOURCE_ADDED, - SlingConstants.TOPIC_RESOURCE_CHANGED, SlingConstants.TOPIC_RESOURCE_REMOVED }), - @Property(name = "jmx.objectname", value = "com.adobe.acs.commons:type=Automatic Package Replicator"), - @Property(name = EventConstants.EVENT_FILTER, value = "(path=/etc/acs-commons/automatic-package-replication/*/jcr:content)") }) + @Property(name = EventConstants.EVENT_TOPIC, value = { SlingConstants.TOPIC_RESOURCE_ADDED, + SlingConstants.TOPIC_RESOURCE_CHANGED, SlingConstants.TOPIC_RESOURCE_REMOVED }), + @Property(name = "jmx.objectname", value = "com.adobe.acs.commons:type=Automatic Package Replicator"), + @Property(name = EventConstants.EVENT_FILTER, value = "(path=/etc/acs-commons/automatic-package-replication/*/jcr:content)") }) public class ConfigurationUpdateListener extends ResourceServiceManager - implements EventHandler, AutomaticPackageReplicatorMBean { - - private static final Logger log = LoggerFactory.getLogger(ConfigurationUpdateListener.class); - - private static final String ROOT_PATH = "/etc/acs-commons/automatic-package-replication"; - - private static final String TRIGGER_KEY = "trigger.name"; - - private static final String SERVICE_NAME = "automatic-package-replicator"; - - private static final Map AUTH_INFO = Collections.singletonMap(ResourceResolverFactory.SUBSERVICE, - (Object) SERVICE_NAME); - - /** - * Creating this as a separate method to make migrating to service users - * easier. Callers of this method must ensure the resource resolver is - * closed. - * - * @param factory - * the resource resolver factory to use for getting the resource - * resolver - * @return the resource resolver or null if there is an exception allocating - * the resource resolver - */ - final static ResourceResolver getResourceResolver(ResourceResolverFactory factory) { - ResourceResolver resolver = null; - try { - resolver = factory.getServiceResourceResolver(AUTH_INFO); - - } catch (LoginException e) { - log.error("Exception allocating resource resolver", e); - } - return resolver; - } - - @Reference - private ResourceResolverFactory resourceResolverFactory; - - @Reference - private Scheduler scheduler; - - @Reference - private Replicator replicator; - - @Reference - private EventAdmin eventAdmin; - - public ConfigurationUpdateListener() throws NotCompliantMBeanException { - super(AutomaticPackageReplicatorMBean.class); - } - - protected ConfigurationUpdateListener(Class mbeanInterface) throws NotCompliantMBeanException { - super(mbeanInterface); - } - - @Override - public void execute(String id) { - AutomaticPackageReplicatorJob job = (AutomaticPackageReplicatorJob) getBundleContext() - .getService(super.getRegisteredServices().get(id).getReference()); - job.run(); - } - - @Override - protected boolean isServiceUpdated(Resource config, ServiceReference reference) { - boolean updated = false; - AutomaticPackageReplicatorModel model = new AutomaticPackageReplicatorModel(config); - String triggerStr = (String) reference.getProperty(TRIGGER_KEY); - if (model.getTrigger() == TRIGGER.cron && model.getTrigger() == TRIGGER.valueOf(triggerStr) && ObjectUtils - .equals(reference.getProperty(Scheduler.PROPERTY_SCHEDULER_EXPRESSION), model.getCronTrigger())) { - updated = true; - } else if (model.getTrigger() == TRIGGER.event && model.getTrigger() == TRIGGER.valueOf(triggerStr) - && ObjectUtils.equals(reference.getProperty(EventConstants.EVENT_TOPIC), model.getEventTopic()) - && ObjectUtils.equals(reference.getProperty(EventConstants.EVENT_FILTER), model.getEventFilter())) { - updated = true; - } - return updated; - } - - @Override - public String getRootPath() { - return ROOT_PATH; - } - - @Override - protected ResourceResolver getResourceResolver() { - return getResourceResolver(resourceResolverFactory); - } - - @Override - protected ServiceRegistration registerServiceObject(Resource config, Hashtable props) { - AutomaticPackageReplicatorModel model = new AutomaticPackageReplicatorModel(config); - AutomaticPackageReplicatorJob job = new AutomaticPackageReplicatorJob(resourceResolverFactory, replicator, - eventAdmin, model.getPackagePath()); - ServiceRegistration serviceRegistration = null; - props.put(TRIGGER_KEY, model.getTrigger().name()); - if (AutomaticPackageReplicatorModel.TRIGGER.cron == model.getTrigger()) { - if(StringUtils.isEmpty(model.getCronTrigger())){ - throw new IllegalArgumentException("No cron trigger specified"); - } - props.put(Scheduler.PROPERTY_SCHEDULER_EXPRESSION, model.getCronTrigger()); - log.debug("Registering cron runner with: {}", props); - serviceRegistration = super.getBundleContext().registerService(Runnable.class.getCanonicalName(), job, - props); - } else { - if(StringUtils.isEmpty(model.getEventTopic())){ - throw new IllegalArgumentException("No event topic specified"); - } - props.put(EventConstants.EVENT_TOPIC, new String[] { model.getEventTopic() }); - if (StringUtils.isNotEmpty(model.getEventFilter())) { - props.put(EventConstants.EVENT_FILTER, model.getEventFilter()); - } - log.debug("Registering event handler runner with: {}", props); - serviceRegistration = super.getBundleContext().registerService(EventHandler.class.getCanonicalName(), job, - props); - } - return serviceRegistration; - } + implements EventHandler, AutomaticPackageReplicatorMBean { + + private static final Logger log = LoggerFactory.getLogger(ConfigurationUpdateListener.class); + + private static final String ROOT_PATH = "/etc/acs-commons/automatic-package-replication"; + + private static final String TRIGGER_KEY = "trigger.name"; + + private static final String SERVICE_NAME = "automatic-package-replicator"; + + private static final Map AUTH_INFO = Collections.singletonMap(ResourceResolverFactory.SUBSERVICE, + (Object) SERVICE_NAME); + + /** + * Creating this as a separate method to make migrating to service users + * easier. Callers of this method must ensure the resource resolver is + * closed. + * + * @param factory + * the resource resolver factory to use for getting the resource + * resolver + * @return the resource resolver or null if there is an exception allocating + * the resource resolver + */ + static final ResourceResolver getResourceResolver(ResourceResolverFactory factory) { + ResourceResolver resolver = null; + try { + resolver = factory.getServiceResourceResolver(AUTH_INFO); + + } catch (LoginException e) { + log.error("Exception allocating resource resolver", e); + } + return resolver; + } + + @Override + protected ResourceResolver getResourceResolver() { + return getResourceResolver(resourceResolverFactory); + } + + @Reference + private ResourceResolverFactory resourceResolverFactory; + + @Reference + private Scheduler scheduler; + + @Reference + private Replicator replicator; + + @Reference + private EventAdmin eventAdmin; + + public ConfigurationUpdateListener() throws NotCompliantMBeanException { + super(AutomaticPackageReplicatorMBean.class); + } + + protected ConfigurationUpdateListener(Class mbeanInterface) throws NotCompliantMBeanException { + super(mbeanInterface); + } + + @Override + public void execute(String id) { + AutomaticPackageReplicatorJob job = (AutomaticPackageReplicatorJob) getBundleContext() + .getService(super.getRegisteredServices().get(id).getReference()); + job.run(); + } + + @Override + @SuppressWarnings("squid:S3923") + protected boolean isServiceUpdated(Resource config, ServiceReference reference) { + boolean updated = false; + AutomaticPackageReplicatorModel model = new AutomaticPackageReplicatorModel(config); + String triggerStr = (String) reference.getProperty(TRIGGER_KEY); + if (model.getTrigger() == TRIGGER.cron && model.getTrigger() == TRIGGER.valueOf(triggerStr) && ObjectUtils + .equals(reference.getProperty(Scheduler.PROPERTY_SCHEDULER_EXPRESSION), model.getCronTrigger())) { + updated = true; + } else if (model.getTrigger() == TRIGGER.event && model.getTrigger() == TRIGGER.valueOf(triggerStr) + && ObjectUtils.equals(reference.getProperty(EventConstants.EVENT_TOPIC), model.getEventTopic()) + && ObjectUtils.equals(reference.getProperty(EventConstants.EVENT_FILTER), model.getEventFilter())) { + updated = true; + } + return updated; + } + + @Override + public String getRootPath() { + return ROOT_PATH; + } + + @Override + protected ServiceRegistration registerServiceObject(Resource config, Hashtable props) { + AutomaticPackageReplicatorModel model = new AutomaticPackageReplicatorModel(config); + AutomaticPackageReplicatorJob job = new AutomaticPackageReplicatorJob(resourceResolverFactory, replicator, + eventAdmin, model.getPackagePath()); + ServiceRegistration serviceRegistration = null; + props.put(TRIGGER_KEY, model.getTrigger().name()); + if (AutomaticPackageReplicatorModel.TRIGGER.cron == model.getTrigger()) { + if(StringUtils.isEmpty(model.getCronTrigger())){ + throw new IllegalArgumentException("No cron trigger specified"); + } + props.put(Scheduler.PROPERTY_SCHEDULER_EXPRESSION, model.getCronTrigger()); + log.debug("Registering cron runner with: {}", props); + serviceRegistration = super.getBundleContext().registerService(Runnable.class.getCanonicalName(), job, + props); + } else { + if(StringUtils.isEmpty(model.getEventTopic())){ + throw new IllegalArgumentException("No event topic specified"); + } + props.put(EventConstants.EVENT_TOPIC, new String[] { model.getEventTopic() }); + if (StringUtils.isNotEmpty(model.getEventFilter())) { + props.put(EventConstants.EVENT_FILTER, model.getEventFilter()); + } + log.debug("Registering event handler runner with: {}", props); + serviceRegistration = super.getBundleContext().registerService(EventHandler.class.getCanonicalName(), job, + props); + } + return serviceRegistration; + } } diff --git a/bundle/src/main/java/com/adobe/acs/commons/replication/packages/automatic/impl/ReplicatePackageProcess.java b/bundle/src/main/java/com/adobe/acs/commons/replication/packages/automatic/impl/ReplicatePackageProcess.java index 1bf55da10d..a21571d9f6 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/replication/packages/automatic/impl/ReplicatePackageProcess.java +++ b/bundle/src/main/java/com/adobe/acs/commons/replication/packages/automatic/impl/ReplicatePackageProcess.java @@ -45,44 +45,44 @@ @Service public class ReplicatePackageProcess implements WorkflowProcess { - private static final Logger log = LoggerFactory.getLogger(ReplicatePackageProcess.class); + private static final Logger log = LoggerFactory.getLogger(ReplicatePackageProcess.class); - @Reference - private ResourceResolverFactory resourceResolverFactory; + @Reference + private ResourceResolverFactory resourceResolverFactory; - @Reference - private Replicator replicator; + @Reference + private Replicator replicator; - @Reference - private EventAdmin eventAdmin; + @Reference + private EventAdmin eventAdmin; - /* - * (non-Javadoc) - * - * @see - * com.day.cq.workflow.exec.WorkflowProcess#execute(com.day.cq.workflow.exec - * .WorkItem, com.day.cq.workflow.WorkflowSession, - * com.day.cq.workflow.metadata.MetaDataMap) - */ - @Override - public void execute(WorkItem item, WorkflowSession session, MetaDataMap args) throws WorkflowException { - log.trace("execute"); - String packagePath = args.get(WorkflowHelper.PROCESS_ARGS, String.class); - if (StringUtils.isNotEmpty(packagePath)) { - log.debug("Executing Automatic Package Replicator Job for package {}", packagePath); - AutomaticPackageReplicatorJob aprJob = new AutomaticPackageReplicatorJob(resourceResolverFactory, - replicator, eventAdmin, packagePath); - try { - aprJob.excute(); - } catch (Exception e) { - log.error("Exception executing Automatic Package Replicator Job for package " + packagePath, e); - throw new WorkflowException( - "Exception executing Automatic Package Replicator Job for package " + packagePath, e); - } - } else { - log.warn("No package path specified"); - throw new WorkflowException("No package path specified for Automatic Package Replicator Job"); - } - } + /* + * (non-Javadoc) + * + * @see + * com.day.cq.workflow.exec.WorkflowProcess#execute(com.day.cq.workflow.exec + * .WorkItem, com.day.cq.workflow.WorkflowSession, + * com.day.cq.workflow.metadata.MetaDataMap) + */ + @Override + public void execute(WorkItem item, WorkflowSession session, MetaDataMap args) throws WorkflowException { + log.trace("execute"); + String packagePath = args.get(WorkflowHelper.PROCESS_ARGS, String.class); + if (StringUtils.isNotEmpty(packagePath)) { + log.debug("Executing Automatic Package Replicator Job for package {}", packagePath); + AutomaticPackageReplicatorJob aprJob = new AutomaticPackageReplicatorJob(resourceResolverFactory, + replicator, eventAdmin, packagePath); + try { + aprJob.excute(); + } catch (Exception e) { + log.error("Exception executing Automatic Package Replicator Job for package " + packagePath, e); + throw new WorkflowException( + "Exception executing Automatic Package Replicator Job for package " + packagePath, e); + } + } else { + log.warn("No package path specified"); + throw new WorkflowException("No package path specified for Automatic Package Replicator Job"); + } + } } diff --git a/bundle/src/main/java/com/adobe/acs/commons/replication/packages/automatic/model/AutomaticPackageReplicatorModel.java b/bundle/src/main/java/com/adobe/acs/commons/replication/packages/automatic/model/AutomaticPackageReplicatorModel.java index ebc625a253..5fb3695a5d 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/replication/packages/automatic/model/AutomaticPackageReplicatorModel.java +++ b/bundle/src/main/java/com/adobe/acs/commons/replication/packages/automatic/model/AutomaticPackageReplicatorModel.java @@ -30,43 +30,44 @@ */ public class AutomaticPackageReplicatorModel { - private ValueMap properties; + private ValueMap properties; - public AutomaticPackageReplicatorModel(Resource resource) { - properties = resource.getValueMap(); - } + public AutomaticPackageReplicatorModel(Resource resource) { + properties = resource.getValueMap(); + } - public enum TRIGGER { - cron, event - } + @SuppressWarnings({"checkstyle:abbreviationaswordinname", "squid:S00115"}) + public enum TRIGGER { + cron, event + } - public String getTitle() { - return properties.get("jcr:content", String.class); - } + public String getTitle() { + return properties.get("jcr:content", String.class); + } - public String getPackagePath() { - return properties.get("packagePath", String.class); - } + public String getPackagePath() { + return properties.get("packagePath", String.class); + } - public String getCronTrigger() { - return properties.get("cronTrigger", String.class); - } + public String getCronTrigger() { + return properties.get("cronTrigger", String.class); + } - public String getEventTopic() { - String topic = properties.get("eventTopic", String.class); - if (StringUtils.isEmpty(topic)) { - return null; - } else { - return topic; - } - } + public String getEventTopic() { + String topic = properties.get("eventTopic", String.class); + if (StringUtils.isEmpty(topic)) { + return null; + } else { + return topic; + } + } - public String getEventFilter() { - return properties.get("eventFilter", String.class); - } + public String getEventFilter() { + return properties.get("eventFilter", String.class); + } - public TRIGGER getTrigger() { - return TRIGGER.valueOf(properties.get("trigger", String.class)); - } + public TRIGGER getTrigger() { + return TRIGGER.valueOf(properties.get("trigger", String.class)); + } } diff --git a/bundle/src/main/java/com/adobe/acs/commons/replication/status/ReplicationStatusManager.java b/bundle/src/main/java/com/adobe/acs/commons/replication/status/ReplicationStatusManager.java index d5162fad9b..515cd73185 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/replication/status/ReplicationStatusManager.java +++ b/bundle/src/main/java/com/adobe/acs/commons/replication/status/ReplicationStatusManager.java @@ -52,7 +52,7 @@ enum Status { *

* Pages and Assets return their respective content resource while any other path returns itself * - * @param path The path to retrieve the resource for. + * @param path The path to retrieve the resource for. * @param resourceResolver The resource resolver must have access to read the specified path. */ Resource getReplicationStatusResource(String path, ResourceResolver resourceResolver); diff --git a/bundle/src/main/java/com/adobe/acs/commons/replication/status/impl/JcrPackageReplicationStatusEventHandler.java b/bundle/src/main/java/com/adobe/acs/commons/replication/status/impl/JcrPackageReplicationStatusEventHandler.java index 0f44389b07..9dda6fd1f1 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/replication/status/impl/JcrPackageReplicationStatusEventHandler.java +++ b/bundle/src/main/java/com/adobe/acs/commons/replication/status/impl/JcrPackageReplicationStatusEventHandler.java @@ -177,11 +177,13 @@ private enum ReplicatedAt { private static final String SERVICE_NAME = "package-replication-status-event-listener"; private static final Map AUTH_INFO; + static { AUTH_INFO = Collections.singletonMap(ResourceResolverFactory.SUBSERVICE, (Object) SERVICE_NAME); } @Override + @SuppressWarnings("squid:S3776") public final void handleEvent(final Event event) { if (this.isMaster) { // Only run on master @@ -235,39 +237,7 @@ public final JobResult process(final Job job) { } for (final JcrPackage jcrPackage : jcrPackages) { - try { - final List resources = new ArrayList(); - - for (final String packagePath : packageHelper.getContents(jcrPackage)) { - final Resource resource = resourceResolver.getResource(packagePath); - if (this.accept(resource)) { - resources.add(resource); - } - } - - if (resources.size() > 0) { - replicationStatusManager.setReplicationStatus(resourceResolver, - replicatedBy, - getJcrPackageLastModified(resourceResolver, jcrPackage), - ReplicationStatusManager.Status.ACTIVATED, - resources.toArray(new Resource[resources.size()])); - - log.info("Updated Replication Status for JCR Package: {}", jcrPackage.getDefinition().getId()); - } else { - log.info("Could not find any resources in JCR Package [ {} ] that are candidates to have their Replication Status updated", - jcrPackage.getDefinition().getId()); - } - } catch (RepositoryException e) { - log.error("RepositoryException occurred updating replication status for contents of package", e); - } catch (IOException e) { - log.error("IOException occurred updating replication status for contents of package", e); - - } catch (PackageException e) { - log.error("Could not retrieve the Packages contents.", e); - } finally { - // Close each package when we are done. - jcrPackage.close(); - } + setReplicationStatus(jcrPackage, replicatedBy, resourceResolver); } } catch (LoginException e) { log.error("Could not obtain a resource resolver for applying replication status updates", e); @@ -281,6 +251,42 @@ public final JobResult process(final Job job) { return JobResult.OK; } + private void setReplicationStatus(JcrPackage jcrPackage, String replicatedBy, ResourceResolver resourceResolver) { + try { + final List resources = new ArrayList(); + + for (final String packagePath : packageHelper.getContents(jcrPackage)) { + final Resource resource = resourceResolver.getResource(packagePath); + if (this.accept(resource)) { + resources.add(resource); + } + } + + if (resources.size() > 0) { + replicationStatusManager.setReplicationStatus(resourceResolver, + replicatedBy, + getJcrPackageLastModified(jcrPackage), + ReplicationStatusManager.Status.ACTIVATED, + resources.toArray(new Resource[resources.size()])); + + log.info("Updated Replication Status for JCR Package: {}", jcrPackage.getDefinition().getId()); + } else { + log.info("Could not find any resources in JCR Package [ {} ] that are candidates to have their Replication Status updated", + jcrPackage.getDefinition().getId()); + } + } catch (RepositoryException e) { + log.error("RepositoryException occurred updating replication status for contents of package", e); + } catch (IOException e) { + log.error("IOException occurred updating replication status for contents of package", e); + + } catch (PackageException e) { + log.error("Could not retrieve the Packages contents.", e); + } finally { + // Close each package when we are done. + jcrPackage.close(); + } + } + /** * Extracts relevant event information from a Granite Replication Event OR a Day CQ Replication event. * @param event the Osgi Event @@ -369,6 +375,7 @@ private List getJcrPackages(final ResourceResolver resourceResolver, * @return true is the resource is markable resource * @throws RepositoryException */ + @SuppressWarnings("squid:S3776") private boolean accept(final Resource resource) throws RepositoryException { if (resource == null || ResourceUtil.isNonExistingResource(resource)) { return false; @@ -408,13 +415,11 @@ private boolean accept(final Resource resource) throws RepositoryException { /** * Gets the last build time of the package. * - * @param resourceResolver the resource resolver to access the package properties * @param jcrPackage the package obj * @return the package's last build time or null if none can be found * @throws RepositoryException */ - private Calendar getJcrPackageLastModified(final ResourceResolver resourceResolver, - final JcrPackage jcrPackage) throws RepositoryException, IOException { + private Calendar getJcrPackageLastModified(final JcrPackage jcrPackage) throws RepositoryException, IOException { if (ReplicatedAt.CURRENT_TIME.equals(this.replicatedAt)) { return Calendar.getInstance(); } else { diff --git a/bundle/src/main/java/com/adobe/acs/commons/replication/status/impl/ReplicatedByWorkflowProcess.java b/bundle/src/main/java/com/adobe/acs/commons/replication/status/impl/ReplicatedByWorkflowProcess.java index a5a0173b1d..4b16d0170b 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/replication/status/impl/ReplicatedByWorkflowProcess.java +++ b/bundle/src/main/java/com/adobe/acs/commons/replication/status/impl/ReplicatedByWorkflowProcess.java @@ -107,7 +107,7 @@ public final void execute(WorkItem workItem, WorkflowSession workflowSession, for (final String path : paths) { // For each item in the WF Package, or if not a WF Package, path = payloadPath - Resource resource = replStatusManager.getReplicationStatusResource(path, resourceResolver); + Resource resource = replStatusManager.getReplicationStatusResource(path, resourceResolver); final ModifiableValueMap mvm = resource.adaptTo(ModifiableValueMap.class); diff --git a/bundle/src/main/java/com/adobe/acs/commons/replication/status/impl/ReplicationStatusManagerImpl.java b/bundle/src/main/java/com/adobe/acs/commons/replication/status/impl/ReplicationStatusManagerImpl.java index edf3535c96..33a1c1297c 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/replication/status/impl/ReplicationStatusManagerImpl.java +++ b/bundle/src/main/java/com/adobe/acs/commons/replication/status/impl/ReplicationStatusManagerImpl.java @@ -61,28 +61,28 @@ public class ReplicationStatusManagerImpl implements ReplicationStatusManager { * {@inheritDoc} */ @Override - public Resource getReplicationStatusResource(String path, ResourceResolver resourceResolver) { - final Page page = resourceResolver.adaptTo(PageManager.class).getContainingPage(path); - final Asset asset = DamUtil.resolveToAsset(resourceResolver.getResource(path)); - - Resource resource; - String type; - - if (page != null) { - type = "Page"; - resource = page.getContentResource(); - } else if (asset != null) { - type = "Asset"; - Resource assetResource = resourceResolver.getResource(asset.getPath()); - resource = assetResource.getChild(JcrConstants.JCR_CONTENT); - } else { - type = "Resource"; - resource = resourceResolver.getResource(path); - } - - log.trace(type + "'s resource that tracks replication status is " + resource.getPath()); - return resource; - } + public Resource getReplicationStatusResource(String path, ResourceResolver resourceResolver) { + final Page page = resourceResolver.adaptTo(PageManager.class).getContainingPage(path); + final Asset asset = DamUtil.resolveToAsset(resourceResolver.getResource(path)); + + Resource resource; + String type; + + if (page != null) { + type = "Page"; + resource = page.getContentResource(); + } else if (asset != null) { + type = "Asset"; + Resource assetResource = resourceResolver.getResource(asset.getPath()); + resource = assetResource.getChild(JcrConstants.JCR_CONTENT); + } else { + type = "Resource"; + resource = resourceResolver.getResource(path); + } + + log.trace(type + "'s resource that tracks replication status is " + resource.getPath()); + return resource; + } /** * {@inheritDoc} @@ -107,6 +107,7 @@ public final void setReplicationStatus(final ResourceResolver resourceResolver, /** * {@inheritDoc} */ + @SuppressWarnings("squid:S3776") public final void setReplicationStatus(final ResourceResolver resourceResolver, final String replicatedBy, final Calendar replicatedAt, @@ -179,8 +180,8 @@ public final void clearReplicationStatus(final ResourceResolver resourceResolver * @throws RepositoryException */ private void addReplicationStatusMixin(final Node node) throws RepositoryException { - if (!this.hasMixin(node, ReplicationStatus.NODE_TYPE) && - node.canAddMixin(ReplicationStatus.NODE_TYPE)) { + if (!this.hasMixin(node, ReplicationStatus.NODE_TYPE) + && node.canAddMixin(ReplicationStatus.NODE_TYPE)) { node.addMixin(ReplicationStatus.NODE_TYPE); } } diff --git a/bundle/src/main/java/com/adobe/acs/commons/replication/status/impl/SetReplicationStatusProcess.java b/bundle/src/main/java/com/adobe/acs/commons/replication/status/impl/SetReplicationStatusProcess.java index f7134bc572..274bcdd538 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/replication/status/impl/SetReplicationStatusProcess.java +++ b/bundle/src/main/java/com/adobe/acs/commons/replication/status/impl/SetReplicationStatusProcess.java @@ -55,77 +55,77 @@ @Service public class SetReplicationStatusProcess implements WorkflowProcess { - private static final Logger log = LoggerFactory.getLogger(SetReplicationStatusProcess.class); - - private final String ARG_REPL_DATE = "replicationDate"; - private final String ARG_REPL_BY = "replicatedBy"; - private final String ARG_REPL_ACTION = "replicationAction"; - - @Reference + private static final Logger log = LoggerFactory.getLogger(SetReplicationStatusProcess.class); + + private static final String ARG_REPL_DATE = "replicationDate"; + private static final String ARG_REPL_BY = "replicatedBy"; + private static final String ARG_REPL_ACTION = "replicationAction"; + + @Reference private WorkflowHelper workflowHelper; - - @Reference - private ReplicationStatusManager replStatusMgr; - - - @Override - public void execute(WorkItem workItem, WorkflowSession workflowSession, MetaDataMap metadataMap) throws WorkflowException { - - ResourceResolver resourceResolver = null; - - try { - resourceResolver = workflowHelper.getResourceResolver(workflowSession); - String replicatedResourcePath = getReplicatedResourcePath(workItem, resourceResolver); - - Map params = extractWorkflowParams(metadataMap); - - String replAction; - if (!params.containsKey(ARG_REPL_ACTION)) { - log.warn("Please add a replicationAction to your process arguments (ACTIVATED, DEACTIVATED or CLEAR). Will now exit without processing."); - return; - } else { - replAction = params.get(ARG_REPL_ACTION); - } - - Calendar replicatedAt; - if (!params.containsKey(ARG_REPL_DATE)) { - log.info("No replicationDate argument specified, will default to current time."); - replicatedAt = Calendar.getInstance(); - } else { - replicatedAt = getReplicationDate(params); - } - - String replicatedBy; - if (!params.containsKey(ARG_REPL_BY)) { - log.info("No replicatedBy argument specified, will default to 'migration'."); - replicatedBy = "migration"; - } else { - replicatedBy = params.get(ARG_REPL_BY); - } - - replStatusMgr.setReplicationStatus(resourceResolver, replicatedBy, replicatedAt, ReplicationStatusManager.Status.valueOf(replAction), replicatedResourcePath); - } catch (Exception e) { - log.error("An exception occurred while setting replication status.", e); - } - } - - private String getReplicatedResourcePath(WorkItem workItem, ResourceResolver resourceResolver) { - String payloadPath = workItem.getWorkflowData().getPayload().toString(); - Resource resource = replStatusMgr.getReplicationStatusResource(payloadPath, resourceResolver); - return resource.getPath(); - } - - private Map extractWorkflowParams(MetaDataMap metadataMap) { - String[] lines = StringUtils.split(metadataMap.get(WorkflowHelper.PROCESS_ARGS, ""), System.lineSeparator()); - Map params = ParameterUtil.toMap(lines, "="); - return params; - } - - private Calendar getReplicationDate(Map params) throws ParseException { - Calendar replicatedAt = Calendar.getInstance(); - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm", Locale.ENGLISH); - replicatedAt.setTime(sdf.parse(params.get(ARG_REPL_DATE))); - return replicatedAt; - } + + @Reference + private ReplicationStatusManager replStatusMgr; + + + @Override + public void execute(WorkItem workItem, WorkflowSession workflowSession, MetaDataMap metadataMap) throws WorkflowException { + + ResourceResolver resourceResolver = null; + + try { + resourceResolver = workflowHelper.getResourceResolver(workflowSession); + final String replicatedResourcePath = getReplicatedResourcePath(workItem, resourceResolver); + + Map params = extractWorkflowParams(metadataMap); + + String replAction; + if (!params.containsKey(ARG_REPL_ACTION)) { + log.warn("Please add a replicationAction to your process arguments (ACTIVATED, DEACTIVATED or CLEAR). Will now exit without processing."); + return; + } else { + replAction = params.get(ARG_REPL_ACTION); + } + + Calendar replicatedAt; + if (!params.containsKey(ARG_REPL_DATE)) { + log.info("No replicationDate argument specified, will default to current time."); + replicatedAt = Calendar.getInstance(); + } else { + replicatedAt = getReplicationDate(params); + } + + String replicatedBy; + if (!params.containsKey(ARG_REPL_BY)) { + log.info("No replicatedBy argument specified, will default to 'migration'."); + replicatedBy = "migration"; + } else { + replicatedBy = params.get(ARG_REPL_BY); + } + + replStatusMgr.setReplicationStatus(resourceResolver, replicatedBy, replicatedAt, ReplicationStatusManager.Status.valueOf(replAction), replicatedResourcePath); + } catch (Exception e) { + log.error("An exception occurred while setting replication status.", e); + } + } + + private String getReplicatedResourcePath(WorkItem workItem, ResourceResolver resourceResolver) { + String payloadPath = workItem.getWorkflowData().getPayload().toString(); + Resource resource = replStatusMgr.getReplicationStatusResource(payloadPath, resourceResolver); + return resource.getPath(); + } + + private Map extractWorkflowParams(MetaDataMap metadataMap) { + String[] lines = StringUtils.split(metadataMap.get(WorkflowHelper.PROCESS_ARGS, ""), System.lineSeparator()); + Map params = ParameterUtil.toMap(lines, "="); + return params; + } + + private Calendar getReplicationDate(Map params) throws ParseException { + Calendar replicatedAt = Calendar.getInstance(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm", Locale.ENGLISH); + replicatedAt.setTime(sdf.parse(params.get(ARG_REPL_DATE))); + return replicatedAt; + } } diff --git a/bundle/src/main/java/com/adobe/acs/commons/rewriter/impl/ContentHandlerAdapter.java b/bundle/src/main/java/com/adobe/acs/commons/rewriter/impl/ContentHandlerAdapter.java index 08cf89b232..bcf7544ed1 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/rewriter/impl/ContentHandlerAdapter.java +++ b/bundle/src/main/java/com/adobe/acs/commons/rewriter/impl/ContentHandlerAdapter.java @@ -33,46 +33,57 @@ public final class ContentHandlerAdapter extends DefaultHandler { private final ContentHandler handler; + @Override public void setDocumentLocator(Locator locator) { handler.setDocumentLocator(locator); } + @Override public void startDocument() throws SAXException { handler.startDocument(); } + @Override public void endDocument() throws SAXException { handler.endDocument(); } + @Override public void startPrefixMapping(String prefix, String uri) throws SAXException { handler.startPrefixMapping(prefix, uri); } + @Override public void endPrefixMapping(String prefix) throws SAXException { handler.endPrefixMapping(prefix); } + @Override public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException { handler.startElement(uri, localName, qName, atts); } + @Override public void endElement(String uri, String localName, String qName) throws SAXException { handler.endElement(uri, localName, qName); } + @Override public void characters(char[] ch, int start, int length) throws SAXException { handler.characters(ch, start, length); } + @Override public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException { handler.ignorableWhitespace(ch, start, length); } + @Override public void processingInstruction(String target, String data) throws SAXException { handler.processingInstruction(target, data); } + @Override public void skippedEntity(String name) throws SAXException { handler.skippedEntity(name); } diff --git a/bundle/src/main/java/com/adobe/acs/commons/rewriter/impl/PlainXMLSerializer.java b/bundle/src/main/java/com/adobe/acs/commons/rewriter/impl/PlainXMLSerializer.java index 4487d9ec64..9f913ce1c9 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/rewriter/impl/PlainXMLSerializer.java +++ b/bundle/src/main/java/com/adobe/acs/commons/rewriter/impl/PlainXMLSerializer.java @@ -99,6 +99,7 @@ public void init(ProcessingContext context, ProcessingComponentConfiguration con @Override public void dispose() { + // no-op } } diff --git a/bundle/src/main/java/com/adobe/acs/commons/rewriter/impl/ResourceResolverMapTransformerFactory.java b/bundle/src/main/java/com/adobe/acs/commons/rewriter/impl/ResourceResolverMapTransformerFactory.java index 445dec6430..cf9c900e09 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/rewriter/impl/ResourceResolverMapTransformerFactory.java +++ b/bundle/src/main/java/com/adobe/acs/commons/rewriter/impl/ResourceResolverMapTransformerFactory.java @@ -23,7 +23,12 @@ import com.adobe.acs.commons.util.ParameterUtil; import org.apache.commons.lang.ArrayUtils; import org.apache.commons.lang.StringUtils; -import org.apache.felix.scr.annotations.*; +import org.apache.felix.scr.annotations.Activate; +import org.apache.felix.scr.annotations.Component; +import org.apache.felix.scr.annotations.ConfigurationPolicy; +import org.apache.felix.scr.annotations.Properties; +import org.apache.felix.scr.annotations.Property; +import org.apache.felix.scr.annotations.Service; import org.apache.sling.api.SlingHttpServletRequest; import org.apache.sling.commons.osgi.PropertiesUtil; import org.apache.sling.rewriter.ProcessingComponentConfiguration; @@ -103,10 +108,8 @@ protected void activate(final Map config) { String[] normalizedValue = PropertiesUtil.toStringArray(config.get(PROP_ATTRIBUTES), DEFAULT_ATTRIBUTES); - if (test.length == 1) { - if (StringUtils.contains(test[0], ",")) { - normalizedValue = StringUtils.split(test[0], ","); - } + if (test.length == 1 && StringUtils.contains(test[0], ",")) { + normalizedValue = StringUtils.split(test[0], ","); } this.attributes = ParameterUtil.toMap(normalizedValue, ":", ","); diff --git a/bundle/src/main/java/com/adobe/acs/commons/rewriter/impl/SAXElementUtils.java b/bundle/src/main/java/com/adobe/acs/commons/rewriter/impl/SaxElementUtils.java similarity index 91% rename from bundle/src/main/java/com/adobe/acs/commons/rewriter/impl/SAXElementUtils.java rename to bundle/src/main/java/com/adobe/acs/commons/rewriter/impl/SaxElementUtils.java index 9f5285cf38..15cfc2ec25 100755 --- a/bundle/src/main/java/com/adobe/acs/commons/rewriter/impl/SAXElementUtils.java +++ b/bundle/src/main/java/com/adobe/acs/commons/rewriter/impl/SaxElementUtils.java @@ -24,12 +24,14 @@ import com.adobe.granite.ui.clientlibs.LibraryType; -public class SAXElementUtils { +public class SaxElementUtils { + + private SaxElementUtils() {} public static final String CSS_TYPE = "text/css"; public static final String JS_TYPE = "text/javascript"; - public static boolean isCSS(final String elementName, final Attributes attrs) { + public static boolean isCss(final String elementName, final Attributes attrs) { final String type = attrs.getValue("", "type"); final String href = attrs.getValue("", "href"); diff --git a/bundle/src/main/java/com/adobe/acs/commons/rewriter/impl/StaticReferenceRewriteTransformerFactory.java b/bundle/src/main/java/com/adobe/acs/commons/rewriter/impl/StaticReferenceRewriteTransformerFactory.java index ff6c1acb80..2f78c18ffe 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/rewriter/impl/StaticReferenceRewriteTransformerFactory.java +++ b/bundle/src/main/java/com/adobe/acs/commons/rewriter/impl/StaticReferenceRewriteTransformerFactory.java @@ -54,8 +54,8 @@ */ @Component( label = "ACS AEM Commons - Static Reference Rewriter", - description = "Rewriter pipeline component which rewrites host name on static references " + - "for cookie-less domain support", + description = "Rewriter pipeline component which rewrites host name on static references " + + "for cookie-less domain support", metatype = true, configurationFactory = true, policy = ConfigurationPolicy.REQUIRE) @Service @Properties({ @@ -161,16 +161,12 @@ private Attributes rebuildAttributes(final String elementName, final Attributes if (attributes.containsKey(elementName)) { final String[] modifyableAttributes = attributes.get(elementName); - // clone the attributes - final AttributesImpl newAttrs = new AttributesImpl(attrs); - final int len = newAttrs.getLength(); - // first - check for the nostatic class boolean rewriteStatic = true; - for (int i = 0; i < len; i++) { - final String attrName = newAttrs.getLocalName(i); + for (int i = 0; i < attrs.getLength(); i++) { + final String attrName = attrs.getLocalName(i); if (ATTR_CLASS.equals(attrName)) { - String attrValue = newAttrs.getValue(i); + String attrValue = attrs.getValue(i); if (attrValue.contains(CLASS_NOSTATIC)) { rewriteStatic = false; } @@ -178,34 +174,43 @@ private Attributes rebuildAttributes(final String elementName, final Attributes } if (rewriteStatic) { - for (int i = 0; i < len; i++) { - final String attrName = newAttrs.getLocalName(i); - if (ArrayUtils.contains(modifyableAttributes, attrName)) { - final String attrValue = newAttrs.getValue(i); - - String key = elementName + ":" + attrName; - if (matchingPatterns.containsKey(key)) { - // Find value based on matching pattern - Pattern matchingPattern = matchingPatterns.get(key); - try { - newAttrs.setValue(i, handleMatchingPatternAttribute(matchingPattern, attrValue)); - } catch (Exception e) { - log.error("Could not perform replacement based on matching pattern", e); - } - } else { - for (String prefix : prefixes) { - if (attrValue.startsWith(prefix)) { - newAttrs.setValue(i, prependHostName(attrValue)); - } - } + return rebuildAttributes(elementName, attrs, modifyableAttributes); + } + } + + return attrs; + } + + @SuppressWarnings("squid:S3776") + private Attributes rebuildAttributes(String elementName, Attributes attrs, String[] modifyableAttributes) { + // clone the attributes + final AttributesImpl newAttrs = new AttributesImpl(attrs); + + for (int i = 0; i < newAttrs.getLength(); i++) { + final String attrName = newAttrs.getLocalName(i); + if (ArrayUtils.contains(modifyableAttributes, attrName)) { + final String attrValue = newAttrs.getValue(i); + + String key = elementName + ":" + attrName; + if (matchingPatterns.containsKey(key)) { + // Find value based on matching pattern + Pattern matchingPattern = matchingPatterns.get(key); + try { + newAttrs.setValue(i, handleMatchingPatternAttribute(matchingPattern, attrValue)); + } catch (Exception e) { + log.error("Could not perform replacement based on matching pattern", e); + } + } else { + for (String prefix : prefixes) { + if (attrValue.startsWith(prefix)) { + newAttrs.setValue(i, prependHostName(attrValue)); } } } } - return newAttrs; - } else { - return attrs; } + + return newAttrs; } private String handleMatchingPatternAttribute(Pattern pattern, String attrValue) { @@ -266,10 +271,11 @@ private static Map initializeMatchingPatterns(String[] matching return result; } - private static interface ShardNameProvider { + private interface ShardNameProvider { String lookup(int idx); } + @SuppressWarnings("squid:S1604") private static final ShardNameProvider toStringShardNameProvider = new ShardNameProvider() { @Override @@ -278,6 +284,7 @@ public String lookup(int idx) { } }; + @SuppressWarnings("squid:S1604") private ShardNameProvider lookupShardNameProvider = new ShardNameProvider() { @Override diff --git a/bundle/src/main/java/com/adobe/acs/commons/rewriter/impl/StylesheetInlinerTransformerFactory.java b/bundle/src/main/java/com/adobe/acs/commons/rewriter/impl/StylesheetInlinerTransformerFactory.java index dcdabcf871..152e9fa0fd 100755 --- a/bundle/src/main/java/com/adobe/acs/commons/rewriter/impl/StylesheetInlinerTransformerFactory.java +++ b/bundle/src/main/java/com/adobe/acs/commons/rewriter/impl/StylesheetInlinerTransformerFactory.java @@ -72,10 +72,10 @@ public final class StylesheetInlinerTransformerFactory implements TransformerFac public Transformer createTransformer() { - return new CSSInlinerTransformer(); + return new CssInlinerTransformer(); } - private class CSSInlinerTransformer extends AbstractTransformer { + private class CssInlinerTransformer extends AbstractTransformer { protected boolean afterHeadElement = false; protected List stylesheetsInHead = new ArrayList(); @@ -91,7 +91,7 @@ public void init(ProcessingContext context, ProcessingComponentConfiguration con public void startElement(final String namespaceURI, final String localName, final String qName, final Attributes attrs) throws SAXException { try { - if (SAXElementUtils.isCSS(localName, attrs)) { + if (SaxElementUtils.isCss(localName, attrs)) { String sheet = attrs.getValue("", "href"); if (!afterHeadElement) { stylesheetsInHead.add(sheet); @@ -126,7 +126,7 @@ public void endElement(String uri, String localName, String qName) throws SAXExc getContentHandler().endElement(uri, localName, qName); } - private void inlineSheet(final String namespaceURI, String s) throws Exception { + private void inlineSheet(final String namespaceURI, String s) throws IOException, SAXException { InputStream inputStream = null; String withoutExtension = s.substring(0, s.indexOf(LibraryType.CSS.extension)); diff --git a/bundle/src/main/java/com/adobe/acs/commons/rewriter/impl/VersionedClientlibsTransformerFactory.java b/bundle/src/main/java/com/adobe/acs/commons/rewriter/impl/VersionedClientlibsTransformerFactory.java index 802fd569c4..0154a72c31 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/rewriter/impl/VersionedClientlibsTransformerFactory.java +++ b/bundle/src/main/java/com/adobe/acs/commons/rewriter/impl/VersionedClientlibsTransformerFactory.java @@ -45,9 +45,6 @@ import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletResponse; -import ch.qos.logback.classic.Level; -import ch.qos.logback.classic.turbo.TurboFilter; -import ch.qos.logback.core.spi.FilterReply; import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.lang.StringUtils; import org.apache.felix.scr.annotations.Activate; @@ -74,7 +71,6 @@ import org.osgi.service.event.EventHandler; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.slf4j.Marker; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.AttributesImpl; @@ -153,6 +149,7 @@ public VersionedClientlibsTransformerFactory() throws NotCompliantMBeanException } @Activate + @SuppressWarnings("squid:S1149") protected void activate(ComponentContext componentContext) { final BundleContext bundleContext = componentContext.getBundleContext(); final Dictionary props = componentContext.getProperties(); @@ -184,11 +181,11 @@ public Transformer createTransformer() { } private Attributes versionClientLibs(final String elementName, final Attributes attrs, final SlingHttpServletRequest request) { - if (SAXElementUtils.isCSS(elementName, attrs)) { + if (SaxElementUtils.isCss(elementName, attrs)) { return this.rebuildAttributes(new AttributesImpl(attrs), attrs.getIndex("", ATTR_CSS_PATH), attrs.getValue("", ATTR_CSS_PATH), LibraryType.CSS, request); - } else if (SAXElementUtils.isJavaScript(elementName, attrs)) { + } else if (SaxElementUtils.isJavaScript(elementName, attrs)) { return this.rebuildAttributes(new AttributesImpl(attrs), attrs.getIndex("", ATTR_JS_PATH), attrs.getValue("", ATTR_JS_PATH), LibraryType.JS, request); @@ -332,6 +329,7 @@ protected long getBytesLength(String cacheObj) { } @Override + @SuppressWarnings("squid:S1192") protected void addCacheData(Map data, String cacheObj) { data.put("Value", cacheObj); } @@ -342,6 +340,7 @@ protected String toString(String cacheObj) throws Exception { } @Override + @SuppressWarnings("squid:S1192") protected CompositeType getCacheEntryType() throws OpenDataException { return new CompositeType("Cache Entry", "Cache Entry", new String[] { "Cache Key", "Value" }, @@ -375,6 +374,7 @@ UriInfo getUriInfo(@Nullable final String uri, @Nonnull ResourceResolver resourc class BadMd5VersionedClientLibsFilter implements Filter { @Override + @SuppressWarnings("squid:S3776") public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain filterChain) throws IOException, ServletException { @@ -427,23 +427,25 @@ public void doFilter(final ServletRequest request, } @Override - public void init(final FilterConfig filterConfig) throws ServletException {} + public void init(final FilterConfig filterConfig) throws ServletException { + // no-op + } @Override - public void destroy() {} + public void destroy() { + // no-op + } } static class UriInfo { private final String cleanedUri; private final String md5; - private final LibraryType libraryType; private final HtmlLibrary htmlLibrary; private final String cacheKey; UriInfo(String cleanedUri, String md5, LibraryType libraryType, HtmlLibrary htmlLibrary) { this.cleanedUri = cleanedUri; this.md5 = md5; - this.libraryType = libraryType; this.htmlLibrary = htmlLibrary; if (libraryType != null && htmlLibrary != null) { cacheKey = htmlLibrary.getLibraryPath() + libraryType.extension; diff --git a/bundle/src/main/java/com/adobe/acs/commons/search/impl/NodeExistsPredicateEvaluator.java b/bundle/src/main/java/com/adobe/acs/commons/search/impl/NodeExistsPredicateEvaluator.java index 57eb7a6775..5647fb9e6d 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/search/impl/NodeExistsPredicateEvaluator.java +++ b/bundle/src/main/java/com/adobe/acs/commons/search/impl/NodeExistsPredicateEvaluator.java @@ -85,6 +85,7 @@ public final boolean isFiltering(final Predicate predicate, final EvaluationCont } @Override + @SuppressWarnings("squid:S3776") public final boolean includes(final Predicate predicate, final Row row, final EvaluationContext context) { boolean or = predicate.getBool(OR); diff --git a/bundle/src/main/java/com/adobe/acs/commons/synth/children/InvalidDataFormatException.java b/bundle/src/main/java/com/adobe/acs/commons/synth/children/InvalidDataFormatException.java index 9001d48c45..426dbb48a8 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/synth/children/InvalidDataFormatException.java +++ b/bundle/src/main/java/com/adobe/acs/commons/synth/children/InvalidDataFormatException.java @@ -7,6 +7,7 @@ /** * Exception indicating the data representing the children is invalid. */ +@SuppressWarnings("squid:S2166") public final class InvalidDataFormatException extends RepositoryException { public InvalidDataFormatException(final Resource resource, final String propertyName, final String data) { super("Property Value in invalid format [ " + resource.getPath() + "/" + propertyName + " = " diff --git a/bundle/src/main/java/com/adobe/acs/commons/synth/children/SyntheticChildAsPropertyResource.java b/bundle/src/main/java/com/adobe/acs/commons/synth/children/SyntheticChildAsPropertyResource.java index 06efacff7b..deb0d83d35 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/synth/children/SyntheticChildAsPropertyResource.java +++ b/bundle/src/main/java/com/adobe/acs/commons/synth/children/SyntheticChildAsPropertyResource.java @@ -57,9 +57,8 @@ public final ValueMap getValueMap() { @Override @SuppressWarnings("unchecked") public final AdapterType adaptTo(Class type) { - if (type == ValueMap.class) { - return (AdapterType) this.data; - } else if (type == ModifiableValueMap.class) { + if (type == ValueMap.class + || type == ModifiableValueMap.class) { return (AdapterType) this.data; } diff --git a/bundle/src/main/java/com/adobe/acs/commons/synth/children/impl/JSONModifiableValueMapDecorator.java b/bundle/src/main/java/com/adobe/acs/commons/synth/children/impl/JSONModifiableValueMapDecorator.java index 9855ea8535..ec1ef0da94 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/synth/children/impl/JSONModifiableValueMapDecorator.java +++ b/bundle/src/main/java/com/adobe/acs/commons/synth/children/impl/JSONModifiableValueMapDecorator.java @@ -61,6 +61,25 @@ public T get(String name, Class type) { } } + /** + * {@inheritDoc} + */ + @Override + public T get(String name, T defaultValue) { + if (defaultValue == null) { + return (T) this.get(name); + } + + Class type = (Class) defaultValue.getClass(); + + T value = get(name, type); + if (value == null) { + value = defaultValue; + } + + return value; + } + /** * Coerces the value at {@param name} to a Calendar object. * @@ -155,23 +174,4 @@ private BigDecimal getBigDecimal(String name) { return new BigDecimal(tmp); } } - - /** - * {@inheritDoc} - */ - @Override - public T get(String name, T defaultValue) { - if (defaultValue == null) { - return (T) this.get(name); - } - - Class type = (Class) defaultValue.getClass(); - - T value = get(name, type); - if (value == null) { - value = defaultValue; - } - - return value; - } } \ No newline at end of file diff --git a/bundle/src/main/java/com/adobe/acs/commons/users/impl/Ace.java b/bundle/src/main/java/com/adobe/acs/commons/users/impl/Ace.java index 7cbe0c94e8..133b7755e7 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/users/impl/Ace.java +++ b/bundle/src/main/java/com/adobe/acs/commons/users/impl/Ace.java @@ -40,43 +40,44 @@ public final class Ace { private static final String KEY_VALUE_SEPARATOR = "="; private static final String LIST_SEPARATOR = ","; - public static final String TYPE = "type"; - public static final String PATH = "path"; - public static final String PRIVILEGES = "privileges"; - public static final String REP_GLOB = AccessControlConstants.REP_GLOB; - public static final String REP_NT_NAMES = AccessControlConstants.REP_NT_NAMES; - public static final String REP_ITEM_NAMES = AccessControlConstants.REP_ITEM_NAMES; - public static final String REP_PREFIXES = AccessControlConstants.REP_PREFIXES; + private static final String PROP_TYPE = "type"; + private static final String PROP_PATH = "path"; + private static final String PROP_PRIVILEGES = "privileges"; + private static final String PROP_REP_GLOB = AccessControlConstants.REP_GLOB; + private static final String PROP_REP_NT_NAMES = AccessControlConstants.REP_NT_NAMES; + private static final String PROP_REP_ITEM_NAMES = AccessControlConstants.REP_ITEM_NAMES; + private static final String PROP_REP_PREFIXES = AccessControlConstants.REP_PREFIXES; private String type; private String path; private String repGlob = null; private List repNtNames = new ArrayList(); - private List repItemNames = new ArrayList();; - private List repPrefixes = new ArrayList();; + private List repItemNames = new ArrayList(); + private List repPrefixes = new ArrayList(); private final List privilegeNames = new ArrayList(); private boolean exists = false; + @SuppressWarnings("squid:S3776") public Ace(String raw) throws EnsureServiceUserException { String[] segments = StringUtils.split(raw, PARAM_DELIMITER); for (String segment : segments) { AbstractMap.SimpleEntry entry = ParameterUtil.toSimpleEntry(segment, KEY_VALUE_SEPARATOR); - if (StringUtils.equals(TYPE, entry.getKey())) { + if (StringUtils.equals(PROP_TYPE, entry.getKey())) { this.type = StringUtils.stripToNull(entry.getValue()); - } else if (StringUtils.equals(PATH, entry.getKey())) { + } else if (StringUtils.equals(PROP_PATH, entry.getKey())) { this.path = StringUtils.stripToNull(entry.getValue()); - } else if (StringUtils.equals(REP_GLOB, entry.getKey())) { + } else if (StringUtils.equals(PROP_REP_GLOB, entry.getKey())) { this.repGlob = StringUtils.stripToEmpty(entry.getValue()); - } else if (StringUtils.equals(REP_NT_NAMES, entry.getKey())) { + } else if (StringUtils.equals(PROP_REP_NT_NAMES, entry.getKey())) { this.repNtNames.addAll(Arrays.asList(StringUtils.split(StringUtils.stripToEmpty(entry.getValue()), LIST_SEPARATOR))); - } else if (StringUtils.equals(REP_ITEM_NAMES, entry.getKey())) { + } else if (StringUtils.equals(PROP_REP_ITEM_NAMES, entry.getKey())) { this.repItemNames.addAll(Arrays.asList(StringUtils.split(StringUtils.stripToEmpty(entry.getValue()), LIST_SEPARATOR))); - } else if (StringUtils.equals(REP_PREFIXES, entry.getKey())) { + } else if (StringUtils.equals(PROP_REP_PREFIXES, entry.getKey())) { this.repPrefixes.addAll(Arrays.asList(StringUtils.split(StringUtils.stripToEmpty(entry.getValue()), LIST_SEPARATOR))); - } else if (StringUtils.equals(PRIVILEGES, entry.getKey())) { + } else if (StringUtils.equals(PROP_PRIVILEGES, entry.getKey())) { for (String privilege : StringUtils.split(entry.getValue(), LIST_SEPARATOR)) { privilege = StringUtils.stripToNull(privilege); if (privilege != null) { @@ -218,7 +219,7 @@ public boolean isSameAs(JackrabbitAccessControlEntry actual) throws RepositoryEx return true; } - + @SuppressWarnings("squid:S2589") private boolean isRestrictionValid(boolean configExists, Value[] actualValues, List configValues) { final ArrayList actualRestrictions = new ArrayList(); diff --git a/bundle/src/main/java/com/adobe/acs/commons/users/impl/EnsureServiceUser.java b/bundle/src/main/java/com/adobe/acs/commons/users/impl/EnsureServiceUser.java index 8953051a2e..798c657b97 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/users/impl/EnsureServiceUser.java +++ b/bundle/src/main/java/com/adobe/acs/commons/users/impl/EnsureServiceUser.java @@ -4,9 +4,14 @@ import com.day.cq.search.Query; import com.day.cq.search.QueryBuilder; import org.apache.commons.lang.StringUtils; -import org.apache.felix.scr.annotations.*; +import org.apache.felix.scr.annotations.Activate; +import org.apache.felix.scr.annotations.Component; +import org.apache.felix.scr.annotations.ConfigurationPolicy; import org.apache.felix.scr.annotations.Properties; import org.apache.felix.scr.annotations.Property; +import org.apache.felix.scr.annotations.PropertyOption; +import org.apache.felix.scr.annotations.Reference; +import org.apache.felix.scr.annotations.Service; import org.apache.jackrabbit.api.security.JackrabbitAccessControlEntry; import org.apache.jackrabbit.api.security.JackrabbitAccessControlList; import org.apache.jackrabbit.api.security.JackrabbitAccessControlManager; @@ -15,15 +20,29 @@ import org.apache.jackrabbit.api.security.user.UserManager; import org.apache.jackrabbit.commons.jackrabbit.authorization.AccessControlUtils; import org.apache.jackrabbit.oak.spi.security.authorization.accesscontrol.AccessControlConstants; -import org.apache.sling.api.resource.*; +import org.apache.sling.api.resource.Resource; +import org.apache.sling.api.resource.ResourceResolver; +import org.apache.sling.api.resource.ResourceResolverFactory; import org.apache.sling.commons.osgi.PropertiesUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.jcr.*; +import javax.jcr.PropertyType; +import javax.jcr.RepositoryException; +import javax.jcr.Session; +import javax.jcr.Value; +import javax.jcr.ValueFactory; +import javax.jcr.ValueFormatException; import javax.jcr.security.AccessControlPolicy; import javax.jcr.security.Privilege; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; @Component( label = "ACS AEM Commons - Ensure Service User", @@ -45,6 +64,7 @@ public final class EnsureServiceUser { private static final String SERVICE_NAME = "ensure-service-user"; private static final Map AUTH_INFO; + static { AUTH_INFO = Collections.singletonMap(ResourceResolverFactory.SUBSERVICE, (Object) SERVICE_NAME); } @@ -154,11 +174,12 @@ public void ensure(Operation operation, ServiceUser serviceUser) throws EnsureSe * @throws RepositoryException * @throws EnsureServiceUserException */ + @SuppressWarnings("squid:S2583") protected void ensureExistance(ResourceResolver resourceResolver, ServiceUser serviceUser) throws RepositoryException, EnsureServiceUserException { final User systemUser = ensureSystemUser(resourceResolver, serviceUser); if (systemUser != null) { - ensureACEs(resourceResolver, systemUser, serviceUser); + ensureAces(resourceResolver, systemUser, serviceUser); } else { log.error("Could not create or locate System User with principal name [ {} ]", serviceUser.getPrincipalName()); } @@ -175,7 +196,7 @@ protected void ensureExistance(ResourceResolver resourceResolver, ServiceUser se private void ensureRemoval(ResourceResolver resourceResolver, ServiceUser serviceUser) throws RepositoryException, EnsureServiceUserException { final User systemUser = findSystemUser(resourceResolver, serviceUser.getPrincipalName()); - removeACEs(resourceResolver, systemUser, serviceUser); + removeAces(resourceResolver, systemUser, serviceUser); if (systemUser != null) { systemUser.remove(); @@ -215,12 +236,13 @@ private User ensureSystemUser(ResourceResolver resourceResolver, ServiceUser ser * return # of ace entries that could not be processed * @throws RepositoryException */ - private int ensureACEs(ResourceResolver resourceResolver, User systemUser, ServiceUser serviceUser) throws RepositoryException { + @SuppressWarnings("squid:S3776") + private int ensureAces(ResourceResolver resourceResolver, User systemUser, ServiceUser serviceUser) throws RepositoryException { int failures = 0; final Session session = resourceResolver.adaptTo(Session.class); final JackrabbitAccessControlManager accessControlManager = (JackrabbitAccessControlManager) session.getAccessControlManager(); - final List acls = findACLs(resourceResolver, serviceUser.getPrincipalName(), accessControlManager); + final List acls = findAcls(resourceResolver, serviceUser.getPrincipalName(), accessControlManager); // For each rep:policy (ACL) this service user participates in ... for (final JackrabbitAccessControlList acl : acls) { @@ -319,11 +341,11 @@ private int ensureACEs(ResourceResolver resourceResolver, User systemUser, Servi * @param serviceUser the Service User * @throws RepositoryException */ - private void removeACEs(ResourceResolver resourceResolver, User systemUser, ServiceUser serviceUser) throws RepositoryException { + private void removeAces(ResourceResolver resourceResolver, User systemUser, ServiceUser serviceUser) throws RepositoryException { final Session session = resourceResolver.adaptTo(Session.class); final JackrabbitAccessControlManager accessControlManager = (JackrabbitAccessControlManager) session.getAccessControlManager(); - final List acls = findACLs(resourceResolver, serviceUser.getPrincipalName(), accessControlManager); + final List acls = findAcls(resourceResolver, serviceUser.getPrincipalName(), accessControlManager); for (final JackrabbitAccessControlList acl : acls) { final JackrabbitAccessControlEntry[] aces = (JackrabbitAccessControlEntry[]) acl.getAccessControlEntries(); @@ -369,7 +391,7 @@ private User findSystemUser(ResourceResolver resourceResolver, String principalN throw new EnsureServiceUserException(String.format("User [ %s ] ensureExistance at [ %s ] but is NOT a system user", principalName, user.getPath())); } } else { - throw new EnsureServiceUserException(String.format("Authorizable [ %s ] at [ %s ] is not a user", principalName, user.getPath())); + throw new EnsureServiceUserException(String.format("Authorizable [ %s ] at [ %s ] is not a user", principalName, authorizable.getPath())); } } @@ -385,7 +407,7 @@ private User findSystemUser(ResourceResolver resourceResolver, String principalN * @return a list of ACLs that principal participates in. * @throws RepositoryException */ - private List findACLs(ResourceResolver resourceResolver, String principalName, JackrabbitAccessControlManager accessControlManager) throws RepositoryException { + private List findAcls(ResourceResolver resourceResolver, String principalName, JackrabbitAccessControlManager accessControlManager) throws RepositoryException { final Set paths = new HashSet(); final List acls = new ArrayList(); diff --git a/bundle/src/main/java/com/adobe/acs/commons/users/impl/EnsureServiceUserManagerImpl.java b/bundle/src/main/java/com/adobe/acs/commons/users/impl/EnsureServiceUserManagerImpl.java index 274af9b33f..38782a5a93 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/users/impl/EnsureServiceUserManagerImpl.java +++ b/bundle/src/main/java/com/adobe/acs/commons/users/impl/EnsureServiceUserManagerImpl.java @@ -2,7 +2,14 @@ import com.adobe.granite.jmx.annotation.AnnotatedStandardMBean; import org.apache.commons.lang.StringUtils; -import org.apache.felix.scr.annotations.*; +import org.apache.felix.scr.annotations.Component; +import org.apache.felix.scr.annotations.Properties; +import org.apache.felix.scr.annotations.Property; +import org.apache.felix.scr.annotations.Reference; +import org.apache.felix.scr.annotations.ReferenceCardinality; +import org.apache.felix.scr.annotations.ReferencePolicy; +import org.apache.felix.scr.annotations.References; +import org.apache.felix.scr.annotations.Service; import org.apache.sling.commons.osgi.PropertiesUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/bundle/src/main/java/com/adobe/acs/commons/users/impl/ProtectedSystemUsers.java b/bundle/src/main/java/com/adobe/acs/commons/users/impl/ProtectedSystemUsers.java index a64d1d274d..24f8f26fdb 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/users/impl/ProtectedSystemUsers.java +++ b/bundle/src/main/java/com/adobe/acs/commons/users/impl/ProtectedSystemUsers.java @@ -3,6 +3,8 @@ import org.apache.commons.lang.ArrayUtils; public final class ProtectedSystemUsers { + private ProtectedSystemUsers() {} + private static final String[] PRINCIPAL_NAMES = new String[] { /** AEM SYSTEM USERS **/ diff --git a/bundle/src/main/java/com/adobe/acs/commons/users/impl/ServiceUser.java b/bundle/src/main/java/com/adobe/acs/commons/users/impl/ServiceUser.java index 363f6c30b5..c07b584fd1 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/users/impl/ServiceUser.java +++ b/bundle/src/main/java/com/adobe/acs/commons/users/impl/ServiceUser.java @@ -17,7 +17,7 @@ public final class ServiceUser { private static final Logger log = LoggerFactory.getLogger(ServiceUser.class); - private final String PATH_SYSTEM_USERS = "/home/users/system"; + private static final String PATH_SYSTEM_USERS = "/home/users/system"; private final String principalName; private final String intermediatePath; private final List aces = new ArrayList(); diff --git a/bundle/src/main/java/com/adobe/acs/commons/util/CookieUtil.java b/bundle/src/main/java/com/adobe/acs/commons/util/CookieUtil.java index 676bc2fb78..befeb36b2e 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/util/CookieUtil.java +++ b/bundle/src/main/java/com/adobe/acs/commons/util/CookieUtil.java @@ -168,6 +168,34 @@ public static int dropCookies(final HttpServletRequest request, final HttpServle return dropCookies(response, cookies.toArray(new Cookie[cookies.size()]), cookiePath); } + /** + * Internal method used for dropping cookies + * + * @param response + * @param cookies + * @param cookiePath + * @return + */ + private static int dropCookies(final HttpServletResponse response, final Cookie[] cookies, final String cookiePath) { + int count = 0; + + for (final Cookie cookie : cookies) { + if (cookie == null) { + continue; + } + + final Cookie responseCookie = (Cookie) cookie.clone(); + responseCookie.setMaxAge(0); + responseCookie.setPath(cookiePath); + responseCookie.setValue(""); + + addCookie(responseCookie, response); + count++; + } + + return count; + } + /** * Remove the Cookies whose names match the provided Regex from Response * @@ -217,32 +245,4 @@ public static int dropAllCookies(final HttpServletRequest request, final HttpSer return dropCookies(response, cookies, cookiePath); } - - /** - * Internal method used for dropping cookies - * - * @param response - * @param cookies - * @param cookiePath - * @return - */ - private static int dropCookies(final HttpServletResponse response, final Cookie[] cookies, final String cookiePath) { - int count = 0; - - for (final Cookie cookie : cookies) { - if (cookie == null) { - continue; - } - - final Cookie responseCookie = (Cookie) cookie.clone(); - responseCookie.setMaxAge(0); - responseCookie.setPath(cookiePath); - responseCookie.setValue(""); - - addCookie(responseCookie, response); - count++; - } - - return count; - } } \ No newline at end of file diff --git a/bundle/src/main/java/com/adobe/acs/commons/util/ModeUtil.java b/bundle/src/main/java/com/adobe/acs/commons/util/ModeUtil.java index aaaa5bf5e5..b9c1ecd3a5 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/util/ModeUtil.java +++ b/bundle/src/main/java/com/adobe/acs/commons/util/ModeUtil.java @@ -36,6 +36,7 @@ @ProviderType @Component(immediate = true) +@SuppressWarnings("squid:S1118") public final class ModeUtil { private static boolean isAuthor = false; diff --git a/bundle/src/main/java/com/adobe/acs/commons/util/ResourceDataUtil.java b/bundle/src/main/java/com/adobe/acs/commons/util/ResourceDataUtil.java index 98ef4d022b..c6892545ef 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/util/ResourceDataUtil.java +++ b/bundle/src/main/java/com/adobe/acs/commons/util/ResourceDataUtil.java @@ -40,6 +40,7 @@ import java.io.InputStream; @ProviderType +@SuppressWarnings({"checkstyle:abbreviationaswordinname", "squid:S1118"}) public class ResourceDataUtil { public static final String ENCODING_UTF_8 = "UTF-8"; private static final Logger log = LoggerFactory.getLogger(ResourceDataUtil.class); diff --git a/bundle/src/main/java/com/adobe/acs/commons/util/ResourceServiceManager.java b/bundle/src/main/java/com/adobe/acs/commons/util/ResourceServiceManager.java index 8faf5f1997..8d33e528b5 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/util/ResourceServiceManager.java +++ b/bundle/src/main/java/com/adobe/acs/commons/util/ResourceServiceManager.java @@ -28,7 +28,11 @@ import org.apache.sling.api.resource.LoginException; import org.apache.sling.api.resource.Resource; import org.apache.sling.api.resource.ResourceResolver; -import org.osgi.framework.*; +import org.osgi.framework.BundleContext; +import org.osgi.framework.Constants; +import org.osgi.framework.InvalidSyntaxException; +import org.osgi.framework.ServiceReference; +import org.osgi.framework.ServiceRegistration; import org.osgi.service.component.ComponentContext; import org.osgi.service.event.Event; import org.osgi.service.event.EventHandler; @@ -129,6 +133,7 @@ public void handleEvent(Event event) { protected abstract boolean isServiceUpdated(Resource config, ServiceReference reference); @Override + @SuppressWarnings({"squid:S3776", "squid:S1141"}) public synchronized void refreshCache() { log.trace("refreshCache"); @@ -178,6 +183,7 @@ public synchronized void refreshCache() { } } + @SuppressWarnings("squid:S1149") private ServiceRegistration registerService(String id, Resource config) { Hashtable props = new Hashtable(); props.put(SERVICE_OWNER_KEY, getClass().getCanonicalName()); @@ -200,6 +206,7 @@ private ServiceRegistration registerService(String id, Resource config) { * the default properties * @return the ServiceRegistration from registering the service */ + @SuppressWarnings("squid:S1149") protected abstract ServiceRegistration registerServiceObject(Resource config, Hashtable props); private void unregisterService(String id) { diff --git a/bundle/src/main/java/com/adobe/acs/commons/util/TemplateUtil.java b/bundle/src/main/java/com/adobe/acs/commons/util/TemplateUtil.java index 66b96de011..0b1807882e 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/util/TemplateUtil.java +++ b/bundle/src/main/java/com/adobe/acs/commons/util/TemplateUtil.java @@ -54,6 +54,7 @@ public static boolean hasTemplate(@CheckForNull final Page page, @CheckForNull f return hasTemplate(page.getProperties(), templatePath); } + @SuppressWarnings("squid:S1144") private static boolean hasTemplate(@CheckForNull final ValueMap valueMap, @CheckForNull final String templatePath) { if (valueMap != null && templatePath != null) { String path = valueMap.get(NameConstants.NN_TEMPLATE, String.class); diff --git a/bundle/src/main/java/com/adobe/acs/commons/util/TypeUtil.java b/bundle/src/main/java/com/adobe/acs/commons/util/TypeUtil.java index 74b2b3f320..56240b03d8 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/util/TypeUtil.java +++ b/bundle/src/main/java/com/adobe/acs/commons/util/TypeUtil.java @@ -70,8 +70,8 @@ public static Map arrayToMap(T[] list) { "Array must be even in length, representing a series of Key, Value pairs."); } - for (int i = 0; i < list.length; i++) { - map.put(list[i], list[++i]); + for (int i = 0; i < list.length; i = i + 2) { + map.put(list[i], list[i + 1]); } return map; diff --git a/bundle/src/main/java/com/adobe/acs/commons/util/WorkflowHelper.java b/bundle/src/main/java/com/adobe/acs/commons/util/WorkflowHelper.java index cc7c536fb4..b0ba1fd39b 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/util/WorkflowHelper.java +++ b/bundle/src/main/java/com/adobe/acs/commons/util/WorkflowHelper.java @@ -33,6 +33,7 @@ import java.util.List; @ProviderType +@SuppressWarnings("squid:S1214") public interface WorkflowHelper { String PROCESS_ARGS = "PROCESS_ARGS"; String TYPE_JCR_PATH = "JCR_PATH"; @@ -87,7 +88,7 @@ public interface WorkflowHelper { * @param args the arguments array * @return the values list */ - List getValuesFromArgs(String name, String args[]); + List getValuesFromArgs(String name, String[] args); /** * Parse the provided quality string, from 1 to 100, and diff --git a/bundle/src/main/java/com/adobe/acs/commons/util/datadefinitions/ResourceDefinitionBuilder.java b/bundle/src/main/java/com/adobe/acs/commons/util/datadefinitions/ResourceDefinitionBuilder.java index ecda0fe9af..ed3be0e622 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/util/datadefinitions/ResourceDefinitionBuilder.java +++ b/bundle/src/main/java/com/adobe/acs/commons/util/datadefinitions/ResourceDefinitionBuilder.java @@ -1,5 +1,25 @@ +/* + * #%L + * ACS AEM Commons Bundle + * %% + * Copyright (C) 2017 Adobe + * %% + * 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. + * #L% + */ package com.adobe.acs.commons.util.datadefinitions; +@SuppressWarnings("squid:S1214") public interface ResourceDefinitionBuilder { String PROP_NAME = "name"; diff --git a/bundle/src/main/java/com/adobe/acs/commons/util/datadefinitions/impl/BasicResourceDefinition.java b/bundle/src/main/java/com/adobe/acs/commons/util/datadefinitions/impl/BasicResourceDefinition.java index cbe9e410ae..7a8b1166ef 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/util/datadefinitions/impl/BasicResourceDefinition.java +++ b/bundle/src/main/java/com/adobe/acs/commons/util/datadefinitions/impl/BasicResourceDefinition.java @@ -95,8 +95,8 @@ public boolean equals(Object obj) { public int hashCode() { // you pick a hard-coded, randomly chosen, non-zero, odd number // ideally different for each class - return new HashCodeBuilder(3748317, 3479337). - append(getId()). - toHashCode(); + return new HashCodeBuilder(3748317, 3479337) + .append(getId()) + .toHashCode(); } } \ No newline at end of file diff --git a/bundle/src/main/java/com/adobe/acs/commons/util/datadefinitions/impl/LowercaseWithDashesDefinitionBuilderImpl.java b/bundle/src/main/java/com/adobe/acs/commons/util/datadefinitions/impl/LowercaseWithDashesDefinitionBuilderImpl.java index 8a7f1bcdb3..f8579efd6c 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/util/datadefinitions/impl/LowercaseWithDashesDefinitionBuilderImpl.java +++ b/bundle/src/main/java/com/adobe/acs/commons/util/datadefinitions/impl/LowercaseWithDashesDefinitionBuilderImpl.java @@ -22,7 +22,7 @@ public class LowercaseWithDashesDefinitionBuilderImpl implements ResourceDefinit @Override public final ResourceDefinition convert(final String data) { - String title = data; + final String title = data; String name = data; name = StringUtils.stripToEmpty(name); diff --git a/bundle/src/main/java/com/adobe/acs/commons/util/impl/AbstractGuavaCacheMBean.java b/bundle/src/main/java/com/adobe/acs/commons/util/impl/AbstractGuavaCacheMBean.java index 98a0381506..f03b919e2a 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/util/impl/AbstractGuavaCacheMBean.java +++ b/bundle/src/main/java/com/adobe/acs/commons/util/impl/AbstractGuavaCacheMBean.java @@ -84,6 +84,7 @@ public final String getCacheSize() { } @Override + @SuppressWarnings("squid:S1192") public final TabularData getCacheStats() throws OpenDataException { // Exposing all google guava stats. final CompositeType cacheEntryType = new CompositeType("Cache Stats", "Cache Stats", diff --git a/bundle/src/main/java/com/adobe/acs/commons/util/impl/ComponentDisabler.java b/bundle/src/main/java/com/adobe/acs/commons/util/impl/ComponentDisabler.java index 84cbc72134..2161b22be5 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/util/impl/ComponentDisabler.java +++ b/bundle/src/main/java/com/adobe/acs/commons/util/impl/ComponentDisabler.java @@ -64,7 +64,7 @@ public class ComponentDisabler implements EventHandler { private static final Logger log = LoggerFactory.getLogger(ComponentDisabler.class); @Reference(policyOption = ReferencePolicyOption.GREEDY) - private ComponentDisablerDriver componentDisabler; + private ComponentDisablerDriver componentDisablerDriver; @Property(label = "Disabled components", description = "The names of the components/services you want to disable", cardinality = Integer.MAX_VALUE) @@ -85,7 +85,7 @@ public void handleEvent(Event event) { log.trace("Disabling components and services {}", Arrays.toString(disabledComponents)); for (String component : disabledComponents) { - componentDisabler.disable(component); + componentDisablerDriver.disable(component); } } } diff --git a/bundle/src/main/java/com/adobe/acs/commons/util/impl/GenericCacheMBean.java b/bundle/src/main/java/com/adobe/acs/commons/util/impl/GenericCacheMBean.java index e406c093c9..33a972e5ca 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/util/impl/GenericCacheMBean.java +++ b/bundle/src/main/java/com/adobe/acs/commons/util/impl/GenericCacheMBean.java @@ -25,6 +25,7 @@ import com.adobe.granite.jmx.annotation.Description; import com.adobe.granite.jmx.annotation.Name; +@SuppressWarnings("squid:S00112") public interface GenericCacheMBean { @Description("Clear entire cache") diff --git a/bundle/src/main/java/com/adobe/acs/commons/util/impl/QueryHelperImpl.java b/bundle/src/main/java/com/adobe/acs/commons/util/impl/QueryHelperImpl.java index 3dfa7ae48c..1102225452 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/util/impl/QueryHelperImpl.java +++ b/bundle/src/main/java/com/adobe/acs/commons/util/impl/QueryHelperImpl.java @@ -35,8 +35,13 @@ import javax.jcr.NodeIterator; import javax.jcr.RepositoryException; import javax.jcr.Session; -import javax.jcr.query.*; +import javax.jcr.query.Query; +import javax.jcr.query.QueryManager; +import javax.jcr.query.QueryResult; +import javax.jcr.query.Row; +import javax.jcr.query.RowIterator; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Map; @@ -65,48 +70,47 @@ public List findResources(final ResourceResolver resourceResolver, final String language, final String statement, final String relPath) throws RepositoryException { + if (StringUtils.isEmpty(statement)) { + return Collections.emptyList(); + } - final List resources = new ArrayList(); final String[] lines = StringUtils.split(statement, '\n'); if (QUERY_BUILDER.equalsIgnoreCase(language)) { - final Map params = ParameterUtil.toMap(lines, "=", false, null, true); + return getResourcesFromQueryBuilder(resourceResolver, lines); + } else if (LIST.equalsIgnoreCase(language)) { + return getResourcesFromList(resourceResolver, lines, relPath); + } else { + return getResourcesFromQuery(resourceResolver, language, statement, relPath); + } + } - // ensure all results are returned - if (!params.containsKey("p.limit")) { - params.put("p.limit", "-1"); - } + private List getResourcesFromQuery(ResourceResolver resourceResolver, String language, String statement, String relPath) throws RepositoryException { + final List resources = new ArrayList<>(); + QueryManager queryManager = resourceResolver.adaptTo(Session.class).getWorkspace().getQueryManager(); + NodeIterator nodeIter = queryManager.createQuery(statement, language).execute().getNodes(); - final com.day.cq.search.Query query = queryBuilder.createQuery(PredicateGroup.create(params), resourceResolver.adaptTo(Session.class)); - final List hits = query.getResult().getHits(); - for (final Hit hit : hits) { - resources.add(hit.getResource()); - } - } else if (LIST.equalsIgnoreCase(language)) { - if (StringUtils.isNotBlank(statement)) { - for (String line : lines) { - if (StringUtils.isNotBlank(line)) { - final Resource resource = resourceResolver.getResource(line); - final Resource relativeAwareResource = getRelativeAwareResource(resource, relPath); - - if (relativeAwareResource != null) { - resources.add(relativeAwareResource); - } - } - } + while (nodeIter.hasNext()) { + Resource resource = resourceResolver.getResource(nodeIter.nextNode().getPath()); + final Resource relativeAwareResource = getRelativeAwareResource(resource, relPath); + + if (relativeAwareResource != null) { + resources.add(relativeAwareResource); } - } else { - QueryManager queryManager = resourceResolver.adaptTo(Session.class).getWorkspace().getQueryManager(); - NodeIterator nodeIter = queryManager.createQuery(statement, language).execute().getNodes(); + } - while (nodeIter.hasNext()) { - Resource resource = resourceResolver.getResource(nodeIter.nextNode().getPath()); - if (resource != null) { - final Resource relativeAwareResource = getRelativeAwareResource(resource, relPath); + return resources; + } + + private List getResourcesFromList(ResourceResolver resourceResolver, String[] lines, String relPath) { + final List resources = new ArrayList<>(); + for (String line : lines) { + if (StringUtils.isNotBlank(line)) { + final Resource resource = resourceResolver.getResource(line); + final Resource relativeAwareResource = getRelativeAwareResource(resource, relPath); - if (relativeAwareResource != null) { - resources.add(relativeAwareResource); - } + if (relativeAwareResource != null) { + resources.add(relativeAwareResource); } } } @@ -114,6 +118,24 @@ public List findResources(final ResourceResolver resourceResolver, return resources; } + private List getResourcesFromQueryBuilder(ResourceResolver resourceResolver, String[] lines) throws RepositoryException { + final List resources = new ArrayList<>(); + final Map params = ParameterUtil.toMap(lines, "=", false, null, true); + + // ensure all results are returned + if (!params.containsKey("p.limit")) { + params.put("p.limit", "-1"); + } + + final com.day.cq.search.Query query = queryBuilder.createQuery(PredicateGroup.create(params), resourceResolver.adaptTo(Session.class)); + final List hits = query.getResult().getHits(); + for (final Hit hit : hits) { + resources.add(hit.getResource()); + } + + return resources; + } + @Override public boolean isTraversal(ResourceResolver resourceResolver, String language, String statement) throws RepositoryException { final QueryManager queryManager = resourceResolver.adaptTo(Session.class).getWorkspace().getQueryManager(); diff --git a/bundle/src/main/java/com/adobe/acs/commons/util/impl/UrlFilter.java b/bundle/src/main/java/com/adobe/acs/commons/util/impl/UrlFilter.java index 66b87e1856..d80f4b8944 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/util/impl/UrlFilter.java +++ b/bundle/src/main/java/com/adobe/acs/commons/util/impl/UrlFilter.java @@ -54,6 +54,7 @@ */ @org.apache.felix.scr.annotations.Component(policy = ConfigurationPolicy.REQUIRE) @SlingFilter(scope = SlingFilterScope.REQUEST, order = Integer.MIN_VALUE, generateComponent = false) +@SuppressWarnings("squid:S3776") public class UrlFilter implements Filter { /** diff --git a/bundle/src/main/java/com/adobe/acs/commons/util/mbeans/ResourceServiceManagerMBean.java b/bundle/src/main/java/com/adobe/acs/commons/util/mbeans/ResourceServiceManagerMBean.java index ff336ea39b..b7dd7c5ad3 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/util/mbeans/ResourceServiceManagerMBean.java +++ b/bundle/src/main/java/com/adobe/acs/commons/util/mbeans/ResourceServiceManagerMBean.java @@ -27,15 +27,13 @@ /** * Base methods for the JMX Interface for a ResourceServiceManager - * - * @author danklco */ @ProviderType public interface ResourceServiceManagerMBean { - @Description("Gets the configurations currently registered") - List getRegisteredConfigurations(); + @Description("Gets the configurations currently registered") + List getRegisteredConfigurations(); - @Description("Refreshes the cache of registered configurations") - void refreshCache() throws LoginException; + @Description("Refreshes the cache of registered configurations") + void refreshCache() throws LoginException; } diff --git a/bundle/src/main/java/com/adobe/acs/commons/util/visitors/ContentVisitor.java b/bundle/src/main/java/com/adobe/acs/commons/util/visitors/ContentVisitor.java index 7ea1ff512c..64c1179067 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/util/visitors/ContentVisitor.java +++ b/bundle/src/main/java/com/adobe/acs/commons/util/visitors/ContentVisitor.java @@ -35,8 +35,8 @@ public class ContentVisitor extends AbstractResourceVisitor { private static final Logger log = LoggerFactory.getLogger(ContentVisitor.class); - private final String[] DEFAULT_CONTAINER_TYPES = {JcrResourceConstants.NT_SLING_FOLDER, JcrResourceConstants.NT_SLING_ORDERED_FOLDER, JcrConstants.NT_FOLDER}; - private final String[] DEFAULT_CONTENT_TYPES = {NameConstants.NT_PAGE, DamConstants.NT_DAM_ASSET}; + private static final String[] DEFAULT_CONTAINER_TYPES = {JcrResourceConstants.NT_SLING_FOLDER, JcrResourceConstants.NT_SLING_ORDERED_FOLDER, JcrConstants.NT_FOLDER}; + private static final String[] DEFAULT_CONTENT_TYPES = {NameConstants.NT_PAGE, DamConstants.NT_DAM_ASSET}; private final T runnable; private final String[] contentTypes; @@ -47,6 +47,7 @@ public ContentVisitor(T runnable) { this.containerTypes = DEFAULT_CONTAINER_TYPES; this.contentTypes = DEFAULT_CONTENT_TYPES; } + public ContentVisitor(T runnable, String[] containerTypes, String[] contentTypes) { this.runnable = runnable; this.containerTypes = Arrays.copyOf(containerTypes, containerTypes.length); diff --git a/bundle/src/main/java/com/adobe/acs/commons/util/visitors/ResourceRunnable.java b/bundle/src/main/java/com/adobe/acs/commons/util/visitors/ResourceRunnable.java index ff49bbeafa..43d09d6b92 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/util/visitors/ResourceRunnable.java +++ b/bundle/src/main/java/com/adobe/acs/commons/util/visitors/ResourceRunnable.java @@ -31,5 +31,6 @@ public interface ResourceRunnable { * @param resource the resource * @throws Exception */ + @SuppressWarnings("squid:S00112") void run(Resource resource) throws Exception; } diff --git a/bundle/src/main/java/com/adobe/acs/commons/util/visitors/SimpleFilteringResourceVisitor.java b/bundle/src/main/java/com/adobe/acs/commons/util/visitors/SimpleFilteringResourceVisitor.java index bdbb9966ea..73d29eaa7a 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/util/visitors/SimpleFilteringResourceVisitor.java +++ b/bundle/src/main/java/com/adobe/acs/commons/util/visitors/SimpleFilteringResourceVisitor.java @@ -26,9 +26,10 @@ public class SimpleFilteringResourceVisitor { - public static enum TraversalMode { + public enum TraversalMode { DEPTH, BREADTH - }; + } + TraversalMode mode = TraversalMode.BREADTH; BiConsumer, Integer> propertyVisitor = null; BiConsumer resourceVisitor = null; @@ -37,9 +38,6 @@ public static enum TraversalMode { Function propertyFilter = s -> true; Function traversalFilter = r -> true; - public SimpleFilteringResourceVisitor() { - } - public void setPropertyFilter(Function filter) { propertyFilter = filter; } @@ -97,9 +95,8 @@ public void accept(final Resource head) { case BREADTH: stack.addAll(toList(res.getChildren())); break; - case DEPTH: + default: stack.addAll(0, toList(res.getChildren())); - break; } } else if (leafVisitor != null) { leafVisitor.accept(res, level); diff --git a/bundle/src/main/java/com/adobe/acs/commons/version/impl/CurrentEvolutionEntryImpl.java b/bundle/src/main/java/com/adobe/acs/commons/version/impl/CurrentEvolutionEntryImpl.java index e3b828b702..d8ac8f164b 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/version/impl/CurrentEvolutionEntryImpl.java +++ b/bundle/src/main/java/com/adobe/acs/commons/version/impl/CurrentEvolutionEntryImpl.java @@ -90,11 +90,11 @@ public String getValueString() { @Override public String getValueStringShort() { - String value = getValueString(); - if (value.length() > MAX_CHARS) { - return value.substring(0, MAX_CHARS) + "..."; + String tmpValue = getValueString(); + if (tmpValue.length() > MAX_CHARS) { + return tmpValue.substring(0, MAX_CHARS) + "..."; } - return value; + return tmpValue; } @Override diff --git a/bundle/src/main/java/com/adobe/acs/commons/version/impl/EvolutionConfig.java b/bundle/src/main/java/com/adobe/acs/commons/version/impl/EvolutionConfig.java index 16dc0dedd7..090d113842 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/version/impl/EvolutionConfig.java +++ b/bundle/src/main/java/com/adobe/acs/commons/version/impl/EvolutionConfig.java @@ -32,7 +32,6 @@ import javax.jcr.RepositoryException; import javax.jcr.Value; -import org.apache.commons.lang.StringUtils; import org.apache.commons.lang3.ArrayUtils; public class EvolutionConfig { @@ -66,7 +65,7 @@ public boolean handleResource(String name) { public static String printProperty(javax.jcr.Property property) { try { - return printObject(toJavaObject(property)); + return printObject(propertyToJavaObject(property)); } catch (RepositoryException e1) { return e1.getMessage(); } @@ -100,12 +99,13 @@ public static String printObject(Object obj) { } } - private static Object toJavaObject(Property property) + @SuppressWarnings("squid:S3776") + private static Object propertyToJavaObject(Property property) throws RepositoryException { // multi-value property: return an array of values if (property.isMultiple()) { Value[] values = property.getValues(); - final Object firstValue = values.length > 0 ? toJavaObject(values[0]) : null; + final Object firstValue = values.length > 0 ? valueToJavaObject(values[0]) : null; final Object[] result; if ( firstValue instanceof Boolean ) { result = new Boolean[values.length]; @@ -125,17 +125,17 @@ private static Object toJavaObject(Property property) for (int i = 0; i < values.length; i++) { Value value = values[i]; if (value != null) { - result[i] = toJavaObject(value); + result[i] = valueToJavaObject(value); } } return result; } // single value property - return toJavaObject(property.getValue()); + return valueToJavaObject(property.getValue()); } - private static Object toJavaObject(Value value) throws RepositoryException { + private static Object valueToJavaObject(Value value) throws RepositoryException { switch (value.getType()) { case PropertyType.DECIMAL: return value.getDecimal(); diff --git a/bundle/src/main/java/com/adobe/acs/commons/version/impl/EvolutionEntryImpl.java b/bundle/src/main/java/com/adobe/acs/commons/version/impl/EvolutionEntryImpl.java index aae455fd4a..327699dbba 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/version/impl/EvolutionEntryImpl.java +++ b/bundle/src/main/java/com/adobe/acs/commons/version/impl/EvolutionEntryImpl.java @@ -105,11 +105,11 @@ public String getValueString() { @Override public String getValueStringShort() { - String value = getValueString(); - if (value.length() > MAX_CHARS) { - return value.substring(0, MAX_CHARS) + "..."; + String tempValue = getValueString(); + if (tempValue.length() > MAX_CHARS) { + return tempValue.substring(0, MAX_CHARS) + "..."; } - return value; + return tempValue; } @Override @@ -125,6 +125,7 @@ public boolean isCurrent() { return true; } } catch (RepositoryException e) { + // no-op } return false; } @@ -157,6 +158,7 @@ public boolean isAdded() { return prop == null; } } catch (Exception e) { + // no-op } return true; } @@ -175,6 +177,7 @@ public boolean isWillBeRemoved() { return prop == null; } } catch (Exception e) { + // no-op } return true; } diff --git a/bundle/src/main/java/com/adobe/acs/commons/version/impl/EvolutionImpl.java b/bundle/src/main/java/com/adobe/acs/commons/version/impl/EvolutionImpl.java index e69f5ef15e..4e52da51b1 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/version/impl/EvolutionImpl.java +++ b/bundle/src/main/java/com/adobe/acs/commons/version/impl/EvolutionImpl.java @@ -93,6 +93,7 @@ public boolean isCurrent() { return true; } } catch (RepositoryException e) { + // no-op } return false; } diff --git a/bundle/src/main/java/com/adobe/acs/commons/version/impl/EvolutionPathUtil.java b/bundle/src/main/java/com/adobe/acs/commons/version/impl/EvolutionPathUtil.java index 83f5786931..f435ed7949 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/version/impl/EvolutionPathUtil.java +++ b/bundle/src/main/java/com/adobe/acs/commons/version/impl/EvolutionPathUtil.java @@ -25,6 +25,8 @@ public class EvolutionPathUtil { + private EvolutionPathUtil() {} + public static int getDepthForPath(String path) { return StringUtils.countMatches(StringUtils.substringAfterLast(path, "jcr:frozenNode"), "/"); } diff --git a/bundle/src/main/java/com/adobe/acs/commons/wcm/ComponentEditType.java b/bundle/src/main/java/com/adobe/acs/commons/wcm/ComponentEditType.java index 1a1a26e3a8..4b95c2ef66 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/wcm/ComponentEditType.java +++ b/bundle/src/main/java/com/adobe/acs/commons/wcm/ComponentEditType.java @@ -32,6 +32,7 @@ * } */ @ProviderType +@SuppressWarnings("squid:S1118") public final class ComponentEditType { public static final Type CHART = new Type("CHART"); public static final Type IMAGE = new Type("IMAGE"); @@ -52,8 +53,8 @@ public final class ComponentEditType { * */ public static class Type { - private final static String CSS_PREFIX = "cq-"; - private final static String CSS_POSTFIX = "-placeholder"; + private static final String CSS_PREFIX = "cq-"; + private static final String CSS_POSTFIX = "-placeholder"; private final String name; private final String cssClass; diff --git a/bundle/src/main/java/com/adobe/acs/commons/wcm/ComponentErrorHandler.java b/bundle/src/main/java/com/adobe/acs/commons/wcm/ComponentErrorHandler.java index 47ec0179f7..c16074e11c 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/wcm/ComponentErrorHandler.java +++ b/bundle/src/main/java/com/adobe/acs/commons/wcm/ComponentErrorHandler.java @@ -25,6 +25,7 @@ import aQute.bnd.annotation.ProviderType; @ProviderType +@SuppressWarnings("squid:S1214") public interface ComponentErrorHandler { /** * When attribute is set on the Request causes Component Error Handler implementation to be skipped. diff --git a/bundle/src/main/java/com/adobe/acs/commons/wcm/ComponentHelper.java b/bundle/src/main/java/com/adobe/acs/commons/wcm/ComponentHelper.java index 3faf8cf4a1..b4e79eca0c 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/wcm/ComponentHelper.java +++ b/bundle/src/main/java/com/adobe/acs/commons/wcm/ComponentHelper.java @@ -29,6 +29,7 @@ import aQute.bnd.annotation.ProviderType; @ProviderType +@SuppressWarnings("checkstyle:abbreviationaswordinname") public interface ComponentHelper { /** * Checks if Page equals in WCM Mode DESIGN. @@ -210,6 +211,7 @@ String getEditBlock(SlingHttpServletRequest request, */ String getDDEditBlock(SlingHttpServletRequest request, String name, ComponentEditType.Type editType, boolean... isConfigured); + /** * Get the edit icon HTML img tag (>img ...<) for the specified * EditType diff --git a/bundle/src/main/java/com/adobe/acs/commons/wcm/comparisons/impl/PageCompareDataLineImpl.java b/bundle/src/main/java/com/adobe/acs/commons/wcm/comparisons/impl/PageCompareDataLineImpl.java index 00bacbe2db..c9136c449b 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/wcm/comparisons/impl/PageCompareDataLineImpl.java +++ b/bundle/src/main/java/com/adobe/acs/commons/wcm/comparisons/impl/PageCompareDataLineImpl.java @@ -55,10 +55,12 @@ class PageCompareDataLineImpl implements PageCompareDataLine { @Override public boolean equals(Object obj) { - if (!(obj instanceof PageCompareDataLineImpl)) + if (!(obj instanceof PageCompareDataLineImpl)) { return false; - if (obj == this) + } + if (obj == this) { return true; + } PageCompareDataLineImpl other = (PageCompareDataLineImpl) obj; return new EqualsBuilder() .append(path, other.getPath()) diff --git a/bundle/src/main/java/com/adobe/acs/commons/wcm/comparisons/impl/Properties.java b/bundle/src/main/java/com/adobe/acs/commons/wcm/comparisons/impl/Properties.java index 1b186b77bb..aad1f6764b 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/wcm/comparisons/impl/Properties.java +++ b/bundle/src/main/java/com/adobe/acs/commons/wcm/comparisons/impl/Properties.java @@ -28,6 +28,8 @@ class Properties { + private Properties() {} + static Date lastModified(Resource resource) { if (resource != null) { return resource.getValueMap().get(NameConstants.PN_LAST_MOD, new Date()); diff --git a/bundle/src/main/java/com/adobe/acs/commons/wcm/comparisons/impl/lines/Stepper.java b/bundle/src/main/java/com/adobe/acs/commons/wcm/comparisons/impl/lines/Stepper.java index ebba57b73a..adf1af74ef 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/wcm/comparisons/impl/lines/Stepper.java +++ b/bundle/src/main/java/com/adobe/acs/commons/wcm/comparisons/impl/lines/Stepper.java @@ -52,7 +52,9 @@ public int positionOfIdAfterCurrent(T t) { if (t != null) { Serializable searchId = toId.apply(t); for (int i = step; i < ids.size(); i++) { - if (ids.get(i).equals(searchId)) return i + 1 - step; + if (ids.get(i).equals(searchId)) { + return i + 1 - step; + } } } return -1; diff --git a/bundle/src/main/java/com/adobe/acs/commons/wcm/comparisons/model/PageCompareModel.java b/bundle/src/main/java/com/adobe/acs/commons/wcm/comparisons/model/PageCompareModel.java index 57168fceff..cc18ec7984 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/wcm/comparisons/model/PageCompareModel.java +++ b/bundle/src/main/java/com/adobe/acs/commons/wcm/comparisons/model/PageCompareModel.java @@ -77,12 +77,12 @@ public class PageCompareModel { public PageCompareModel(SlingHttpServletRequest request) { this.pathA = request.getParameter("path"); - String versionA = request.getParameter("a"); + String paramVersionA = request.getParameter("a"); this.pathB = request.getParameter("pathB"); - String versionB = request.getParameter("b"); + String paramVersionB = request.getParameter("b"); - this.versionA = isNullOrEmpty(versionA) ? LATEST : versionA; - this.versionB = isNullOrEmpty(versionB) ? LATEST : versionB; + this.versionA = isNullOrEmpty(paramVersionA) ? LATEST : paramVersionA; + this.versionB = isNullOrEmpty(paramVersionB) ? LATEST : paramVersionB; } @PostConstruct @@ -94,9 +94,6 @@ public void activate() { improveDefaultVersionCompare(resource); - final String versionA = getVersionA(); - final String versionB = getVersionB(); - this.a = load(resource, versionA); Resource resourceB = pathB != null ? resolver.resolve(pathB) : resource; diff --git a/bundle/src/main/java/com/adobe/acs/commons/wcm/datasources/DataSourceBuilder.java b/bundle/src/main/java/com/adobe/acs/commons/wcm/datasources/DataSourceBuilder.java index dc59bb45ca..d8648218a0 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/wcm/datasources/DataSourceBuilder.java +++ b/bundle/src/main/java/com/adobe/acs/commons/wcm/datasources/DataSourceBuilder.java @@ -26,6 +26,7 @@ import java.io.IOException; import java.util.List; +@SuppressWarnings("squid:S1214") public interface DataSourceBuilder { String TEXT = "text"; diff --git a/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/AemEnvironmentIndicatorFilter.java b/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/AemEnvironmentIndicatorFilter.java index 7a319c29a7..9db886f732 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/AemEnvironmentIndicatorFilter.java +++ b/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/AemEnvironmentIndicatorFilter.java @@ -56,9 +56,9 @@ public class AemEnvironmentIndicatorFilter implements Filter { + "height: 5px;" + "z-index: 100000000000000;"; - private static final String TITLE_UPDATE_SCRIPT = "\n"; + private static final String TITLE_UPDATE_SCRIPT = "\n"; @Reference private XSSAPI xss; @@ -109,8 +109,8 @@ public class AemEnvironmentIndicatorFilter implements Filter { private static final String[] DEFAULT_EXCLUDED_WCMMODES = {"DISABLED"}; @Property (label = "Excluded WCM modes", - description = "Do not display the indicator when these WCM modes", - cardinality = Integer.MAX_VALUE) + description = "Do not display the indicator when these WCM modes", + cardinality = Integer.MAX_VALUE) public static final String PROP_EXCLUDED_WCMMODES = "excluded-wcm-modes"; private String[] excludedWCMModes; @@ -122,10 +122,11 @@ public class AemEnvironmentIndicatorFilter implements Filter { @Override public void init(final FilterConfig filterConfig) throws ServletException { - + // no-op } @Override + @SuppressWarnings("squid:S3776") public final void doFilter(final ServletRequest servletRequest, final ServletResponse servletResponse, final FilterChain filterChain) throws IOException, ServletException { @@ -149,10 +150,10 @@ public final void doFilter(final ServletRequest servletRequest, final ServletRes boolean doInclude = true; if (ArrayUtils.isNotEmpty(excludedWCMModes)) { - // Test for configured WCM modes, where the indicators are not displayed - WCMMode wcmmode = extractFromRequest(request); + // Test for configured WCM modes, where the indicators are not displayed + WCMMode wcmmode = extractFromRequest(request); - if (wcmmode != null) { + if (wcmmode != null) { for (String m : excludedWCMModes) { if (StringUtils.equalsIgnoreCase(wcmmode.name(), m)) { doInclude = false; @@ -197,9 +198,10 @@ public final void doFilter(final ServletRequest servletRequest, final ServletRes @Override public void destroy() { - + // no-op } + @SuppressWarnings("squid:S3923") private boolean accepts(final HttpServletRequest request) { if (StringUtils.isBlank(css) && StringUtils.isBlank(titlePrefix)) { // Only accept is properly configured @@ -225,13 +227,14 @@ private boolean accepts(final HttpServletRequest request) { return true; } - private String createCSS(final String providedColor) { + private String createCss(final String providedColor) { return "#" + DIV_ID + " { " + "background-color:" + providedColor + BASE_DEFAULT_STYLE + " }"; } @Activate + @SuppressWarnings("squid:S1149") protected final void activate(ComponentContext ctx) { Dictionary config = ctx.getProperties(); @@ -244,7 +247,7 @@ protected final void activate(ComponentContext ctx) { if (StringUtils.isNotBlank(cssOverride)) { css = cssOverride; } else if (StringUtils.isNotBlank(color)) { - css = createCSS(color); + css = createCss(color); } titlePrefix = xss.encodeForJSString( @@ -274,7 +277,7 @@ protected final void deactivate(final Map config) { // extract the WCMMode from the request; we cannot use // WCMMode.fromRequest(), because this is not a SlingHttpServletRequest - private WCMMode extractFromRequest (HttpServletRequest request) { + private WCMMode extractFromRequest(HttpServletRequest request) { return (WCMMode) request.getAttribute( WCMMode.REQUEST_ATTRIBUTE_NAME); diff --git a/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/AuthorUIHelperImpl.java b/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/AuthorUIHelperImpl.java index b0755b203c..813e2d4f4d 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/AuthorUIHelperImpl.java +++ b/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/AuthorUIHelperImpl.java @@ -65,19 +65,19 @@ public class AuthorUIHelperImpl implements AuthorUIHelper { @Property(label = "Touch UI Page Editor", description = "URL of the page editor used when authoring UI mode is Touch-Optimized", value = WCM_EDITOR_URL_TOUCH_DEFAULT) public static final String WCM_EDITOR_URL_TOUCH = "wcmEditorTouchURL"; - private String wcmEditorTouchURL = WCM_EDITOR_URL_TOUCH_DEFAULT; + private String wcmEditorTouchUrl = WCM_EDITOR_URL_TOUCH_DEFAULT; @Property(label = "Classic UI Page Editor", description = "URL of the page editor used when authoring UI mode is Classic", value = WCM_EDITOR_URL_CLASSIC_DEFAULT) public static final String WCM_EDITOR_URL_CLASSIC = "wcmEditorClassicURL"; - private String wcmEditorClassicURL = WCM_EDITOR_URL_CLASSIC_DEFAULT; + private String wcmEditorClassicUrl = WCM_EDITOR_URL_CLASSIC_DEFAULT; @Property(label = "Touch UI Asset Editor", description = "URL of the asset editor used when authoring UI mode is Touch-Optimized", value = DAM_EDITOR_URL_TOUCH_DEFAULT) public static final String DAM_EDITOR_URL_TOUCH = "damEditorTouchURL"; - private String damEditorTouchURL = DAM_EDITOR_URL_TOUCH_DEFAULT; + private String damEditorTouchUrl = DAM_EDITOR_URL_TOUCH_DEFAULT; @Property(label = "Classic UI Asset Editor", description = "URL of the asset editor used when authoring UI mode is Classic", value = DAM_EDITOR_URL_CLASSIC_DEFAULT) public static final String DAM_EDITOR_URL_CLASSIC = "damEditorClassicURL"; - private String damEditorClassicURL = DAM_EDITOR_URL_CLASSIC_DEFAULT; + private String damEditorClassicUrl = DAM_EDITOR_URL_CLASSIC_DEFAULT; @Override public boolean isTouchUI() { @@ -89,9 +89,9 @@ public String generateEditPageLink(String pagePath, boolean absoluteUrl, Resourc String pageUrl; if (isTouch) { - pageUrl = wcmEditorTouchURL + pagePath + ".html"; + pageUrl = wcmEditorTouchUrl + pagePath + ".html"; } else { - pageUrl = wcmEditorClassicURL + pagePath + ".html"; + pageUrl = wcmEditorClassicUrl + pagePath + ".html"; } if (absoluteUrl) { @@ -106,9 +106,9 @@ public String generateEditAssetLink(String assetPath, boolean absoluteUrl, Resou String assetUrl; if (isTouch) { - assetUrl = damEditorTouchURL + assetPath; + assetUrl = damEditorTouchUrl + assetPath; } else { - assetUrl = damEditorClassicURL + assetPath; + assetUrl = damEditorClassicUrl + assetPath; } if (absoluteUrl) { @@ -123,15 +123,15 @@ private void configure(Map config) { this.isTouch = PropertiesUtil.toBoolean(config.get(TOUCH_UI), DEFAULT_TOUCH_UI); // wcm editor configurations - this.wcmEditorTouchURL = PropertiesUtil + this.wcmEditorTouchUrl = PropertiesUtil .toString(config.get(WCM_EDITOR_URL_TOUCH), WCM_EDITOR_URL_TOUCH_DEFAULT); - this.wcmEditorClassicURL = PropertiesUtil.toString(config.get(WCM_EDITOR_URL_CLASSIC), + this.wcmEditorClassicUrl = PropertiesUtil.toString(config.get(WCM_EDITOR_URL_CLASSIC), WCM_EDITOR_URL_CLASSIC_DEFAULT); // dam editor configurations - this.damEditorTouchURL = PropertiesUtil + this.damEditorTouchUrl = PropertiesUtil .toString(config.get(DAM_EDITOR_URL_TOUCH), DAM_EDITOR_URL_TOUCH_DEFAULT); - this.damEditorClassicURL = PropertiesUtil.toString(config.get(DAM_EDITOR_URL_CLASSIC), + this.damEditorClassicUrl = PropertiesUtil.toString(config.get(DAM_EDITOR_URL_CLASSIC), DAM_EDITOR_URL_CLASSIC_DEFAULT); } diff --git a/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/CQIncludePropertyNamespaceServlet.java b/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/CQIncludePropertyNamespaceServlet.java index 4abedda19d..1863d76e10 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/CQIncludePropertyNamespaceServlet.java +++ b/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/CQIncludePropertyNamespaceServlet.java @@ -55,7 +55,7 @@ * ACS AEM Commons - CQInclude Property Namespace. */ //@formatter:off -@SuppressWarnings("serial") +@SuppressWarnings({"serial", "checkstyle:abbreviationaswordinname"}) @SlingServlet( label = "ACS AEM Commons - CQInclude Property Namespace", metatype = true, @@ -254,8 +254,8 @@ protected boolean isCqincludeNamespaceWidget(JSONObject jsonObject) { if (StringUtils.equals(jsonObject.optString(JcrConstants.JCR_PRIMARYTYPE), NT_CQ_WIDGET) && (StringUtils.equals(jsonObject.optString(PN_XTYPE), "cqinclude"))) { String path = jsonObject.optString(PN_PATH); - if (StringUtils.isNotBlank(path) && - path.matches(CQINCLUDE_NAMESPACE_URL_REGEX)) { + if (StringUtils.isNotBlank(path) + && path.matches(CQINCLUDE_NAMESPACE_URL_REGEX)) { return true; } @@ -282,15 +282,13 @@ protected JSONObject makeMultiLevel(JSONObject jsonObject) { return jsonObject; } - @SuppressWarnings("PMD.CollapsibleIfStatements") + @SuppressWarnings("squid:S3776") @Override protected void visit(JSONObject jsonObject) { if (StringUtils.equals(jsonObject.optString(JcrConstants.JCR_PRIMARYTYPE), NT_CQ_WIDGET)) { - if (supportMultiLevel) { - if (isCqincludeNamespaceWidget(jsonObject)) { - jsonObject = makeMultiLevel(jsonObject); - } + if (supportMultiLevel && isCqincludeNamespaceWidget(jsonObject)) { + jsonObject = makeMultiLevel(jsonObject); } final Iterator keys = jsonObject.keys(); diff --git a/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/ComponentErrorHandlerImpl.java b/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/ComponentErrorHandlerImpl.java index f197f57d86..5cdb46d4b2 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/ComponentErrorHandlerImpl.java +++ b/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/ComponentErrorHandlerImpl.java @@ -90,6 +90,9 @@ public class ComponentErrorHandlerImpl implements ComponentErrorHandler, Filter private static final String SERVICE_NAME = "component-error-handler"; private static final Map AUTH_INFO; + private static final String DISABLED = "Disabled"; + private static final String ENABLED = "Enabled"; + static { AUTH_INFO = Collections.singletonMap(ResourceResolverFactory.SUBSERVICE, (Object) SERVICE_NAME); } @@ -178,6 +181,7 @@ public class ComponentErrorHandlerImpl implements ComponentErrorHandler, Filter @Override public void init(FilterConfig filterConfig) throws ServletException { + // no-op } @Override @@ -302,21 +306,16 @@ private String getHTML(final String path) { protected final boolean accepts(final SlingHttpServletRequest request, final SlingHttpServletResponse response) { - if (!StringUtils.endsWith(request.getRequestURI(), ".html") || - !StringUtils.contains(response.getContentType(), "html")) { + if (!StringUtils.endsWith(request.getRequestURI(), ".html") + || !StringUtils.contains(response.getContentType(), "html")) { // Do not inject around non-HTML requests return false; } final ComponentContext componentContext = WCMUtils.getComponentContext(request); - if (componentContext == null) { - // ComponentContext is null - return false; - } else if (componentContext.getComponent() == null) { - // Component is null - return false; - } else if (componentContext.isRoot()) { - // Suppress on root context + if (componentContext == null // ComponentContext is null + || componentContext.getComponent() == null // Component is null + || componentContext.isRoot()) { // Suppress on root context return false; } @@ -385,15 +384,15 @@ public final void activate(final Map config) { log.info("Component Error Handling for Edit Modes: {} ~> {}", - editModeEnabled ? "Enabled" : "Disabled", + editModeEnabled ? ENABLED : DISABLED, editErrorHTMLPath); log.info("Component Error Handling for Preview Modes: {} ~> {}", - previewModeEnabled ? "Enabled" : "Disabled", + previewModeEnabled ? ENABLED : DISABLED, previewErrorHTMLPath); log.info("Component Error Handling for Publish Modes: {} ~> {}", - publishModeEnabled ? "Enabled" : "Disabled", + publishModeEnabled ? ENABLED : DISABLED, publishErrorHTMLPath); suppressedResourceTypes = PropertiesUtil.toStringArray(config.get(PROP_SUPPRESSED_RESOURCE_TYPES), diff --git a/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/ComponentHelperImpl.java b/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/ComponentHelperImpl.java index 4a39f91692..504b5863c3 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/ComponentHelperImpl.java +++ b/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/ComponentHelperImpl.java @@ -51,6 +51,7 @@ description = "Component Helper is a service used in the context of CQ Components for " + "encapsulating common tasks and performing common checks.") @Service +@SuppressWarnings({"checkstyle:abbreviationaswordinname", "squid:S1192"}) public final class ComponentHelperImpl implements ComponentHelper { private static final String CSS_EDIT_MODE = "wcm-helper-edit-mode"; @@ -159,6 +160,8 @@ public boolean printDDEditBlock(SlingHttpServletRequest request, return true; } + + @SuppressWarnings("squid:S3776") public String getEditBlock(SlingHttpServletRequest request, ComponentEditType.Type editType, boolean... isConfigured) { @@ -233,6 +236,7 @@ public String getDDEditBlock(SlingHttpServletRequest request, String name, boole return getDDEditBlock(request, name, null, isConfigured); } + @SuppressWarnings("squid:S3776") public String getDDEditBlock(SlingHttpServletRequest request, String name, ComponentEditType.Type editType, boolean... isConfigured) { if (!isAuthoringMode(request) || conditionAndCheck(isConfigured)) { diff --git a/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/CustomPollingImporterListServlet.java b/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/CustomPollingImporterListServlet.java index f1deb36dde..5500e05bee 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/CustomPollingImporterListServlet.java +++ b/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/CustomPollingImporterListServlet.java @@ -53,7 +53,7 @@ public final class CustomPollingImporterListServlet extends SlingSafeMethodsServ @Activate protected void activate(ComponentContext ctx) throws InvalidSyntaxException { - BundleContext bundleContext = ctx.getBundleContext(); + final BundleContext bundleContext = ctx.getBundleContext(); StringBuilder builder = new StringBuilder(); builder.append("(&("); builder.append(Constants.OBJECTCLASS).append("=").append(Importer.SERVICE_NAME).append(")"); @@ -71,7 +71,7 @@ protected void deactivate() { @Override protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException { - XSSAPI xssAPI = request.adaptTo(XSSAPI.class); + XSSAPI xssApi = request.adaptTo(XSSAPI.class); try { JSONObject result = new JSONObject(); JSONArray list = new JSONArray(); @@ -87,7 +87,7 @@ protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse r JSONObject obj = new JSONObject(); obj.put("qtip", ""); obj.put("text", displayName); - obj.put("text_xss", xssAPI.encodeForJSString(displayName)); + obj.put("text_xss", xssApi.encodeForJSString(displayName)); obj.put("value", scheme); list.put(obj); } diff --git a/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/FileImporter.java b/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/FileImporter.java index 7bad0fdb33..c6b1c9e85a 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/FileImporter.java +++ b/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/FileImporter.java @@ -22,6 +22,7 @@ import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; +import java.io.IOException; import java.util.Calendar; import java.util.Map; @@ -73,9 +74,10 @@ protected void activate(Map properties) { } @Override + @SuppressWarnings("squid:S3776") public void importData(String schemeValue, String dataSource, Resource target) { if (scheme.equals(schemeValue)) { - File file = new File(dataSource); + final File file = new File(dataSource); if (file.exists()) { Calendar fileLastMod = Calendar.getInstance(); fileLastMod.setTimeInMillis(file.lastModified()); @@ -85,11 +87,9 @@ public void importData(String schemeValue, String dataSource, Resource target) { final Node targetParent; final String targetName; - FileInputStream stream = null; - Node node = target.adaptTo(Node.class); if (node != null) { - try { + try (FileInputStream stream = new FileInputStream(file)) { if (node.isNodeType(JcrConstants.NT_FILE)) { // assume that we are intending to replace this file targetParent = node.getParent(); @@ -115,18 +115,13 @@ public void importData(String schemeValue, String dataSource, Resource target) { } } - stream = new FileInputStream(file); JcrUtils.putFile(targetParent, targetName, mimeType, stream); node.getSession().save(); } catch (RepositoryException e) { throw new ImportException("Unable to import from file '" + dataSource + "' to '" + target.getPath() + "'", e); - } catch (FileNotFoundException e) { - throw new ImportException("Unexpected FileNotFoundException while importing", e); - } finally { - if (stream != null) { - IOUtils.closeQuietly(stream); - } + } catch (IOException e) { + throw new ImportException("Unexpected IOException while importing", e); } } else { log.warn("Target '{}' is not a JCR node. Skipping import from '{}'.", target.getPath(), dataSource); diff --git a/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/PageRootProviderConfig.java b/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/PageRootProviderConfig.java index 29894b38bf..ddfca24d2e 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/PageRootProviderConfig.java +++ b/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/PageRootProviderConfig.java @@ -77,20 +77,20 @@ public List getPageRootPatterns() { @Activate protected void activate(Map props) { - List pageRootPatterns = new ArrayList(); + List patterns = new ArrayList(); String[] regexes = PropertiesUtil.toStringArray(props.get(PAGE_ROOT_PATH), new String[] { DEFAULT_PAGE_ROOT_PATH }); for(String regex : regexes) { try { Pattern p = Pattern.compile("^(" + regex + ")(|/.*)$"); - pageRootPatterns.add(p); + patterns.add(p); log.debug("Added Page Root Pattern [ {} ] to PageRootProvider", p.toString()); } catch (Exception e) { log.error("Could not compile regex [ {} ] to pattern. Skipping...", regex, e); } } - this.pageRootPatterns = Collections.unmodifiableList(pageRootPatterns); + this.pageRootPatterns = Collections.unmodifiableList(patterns); } @Deactivate diff --git a/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/PageRootProviderImpl.java b/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/PageRootProviderImpl.java index 348f633626..5ad1e485c8 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/PageRootProviderImpl.java +++ b/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/PageRootProviderImpl.java @@ -30,6 +30,12 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +/** + * Backward compatible configuration for Page Root Provider. + * + * @see PageRootProviderConfig + * @deprecated use PageRootProviderConfig instead + */ @Component( label = "ACS AEM Commons - Page Root Provider (deprecated)", description = "Deprecated configuration for Page Root Provider. Please use PageRootProviderConfig instead.", @@ -39,11 +45,6 @@ ) @Service(PageRootProviderConfig.class) @Deprecated -/** - * Backward compatible configuration for Page Root Provider. - * - * @see PageRootProviderConfig - */ public class PageRootProviderImpl extends PageRootProviderConfig { @Property( diff --git a/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/PropertyMergePostProcessor.java b/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/PropertyMergePostProcessor.java index 6e86a37edf..0737437273 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/PropertyMergePostProcessor.java +++ b/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/PropertyMergePostProcessor.java @@ -67,6 +67,7 @@ public final void process(final SlingHttpServletRequest request, * @param requestParameterMap the Request Param Map * @return a list of the PropertyMerge directives by Destination */ + @SuppressWarnings("squid:S3776") private List getPropertyMerges(final RequestParameterMap requestParameterMap) { final HashMap> mapping = new HashMap>(); @@ -110,8 +111,7 @@ private List getPropertyMerges(final RequestParameterMap requestP RequestParameter allowDuplicatesParam = requestParameterMap.getValue(IGNORE_PREFIX + destination + ALLOW_DUPLICATES_SUFFIX); - final boolean allowDuplicates = - allowDuplicatesParam != null ? Boolean.valueOf(allowDuplicatesParam.getString()) : false; + final boolean allowDuplicates = allowDuplicatesParam != null && Boolean.valueOf(allowDuplicatesParam.getString()); RequestParameter typeHintParam = requestParameterMap.getValue(IGNORE_PREFIX + destination + TYPE_HINT_SUFFIX); diff --git a/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/QrCodeServlet.java b/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/QrCodeServlet.java index 7fc8f9dc8a..0f99682d19 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/QrCodeServlet.java +++ b/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/QrCodeServlet.java @@ -64,16 +64,16 @@ protected final void doGet(final SlingHttpServletRequest request, final SlingHtt } else if (request.getResource().getValueMap().get(PN_ENABLED, false)) { final JSONObject json = new JSONObject(); - final String publishURL = externalizer.publishLink(request.getResourceResolver(), request.getRequestPathInfo().getSuffix()); + final String publishUrl = externalizer.publishLink(request.getResourceResolver(), request.getRequestPathInfo().getSuffix()); log.debug("Externalized path [ {} ] for QR Code generation to [ {} ]", request.getRequestPathInfo().getSuffix(), - publishURL); + publishUrl); - if (StringUtils.isNotBlank(publishURL)) { + if (StringUtils.isNotBlank(publishUrl)) { try { json.put(JSON_KEY_ENABLED, true); - json.put(JSON_KEY_PUBLISH_URL, publishURL); + json.put(JSON_KEY_PUBLISH_URL, publishUrl); } catch (JSONException e) { log.error("Could not construct the QR Code Servlet JSON response", e); throw new ServletException(e); diff --git a/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/RTEConfigurationServlet.java b/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/RTEConfigurationServlet.java index a0b4ee599f..4b41e68108 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/RTEConfigurationServlet.java +++ b/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/RTEConfigurationServlet.java @@ -58,7 +58,7 @@ * . This will iterate through nodes under /etc/rteconfig to find a matching site (by regex). Then, look for a node * named CONFIGNAME and use that configuration. */ -@SuppressWarnings("serial") +@SuppressWarnings({"serial", "checkstyle:abbreviationaswordinname"}) @SlingServlet(extensions = "json", selectors = "rte", resourceTypes = "sling/servlet/default") public final class RTEConfigurationServlet extends AbstractWidgetConfigurationServlet { @@ -103,13 +103,13 @@ private void returnDefault(String rteName, SlingHttpServletRequest request, Slin return; } - writeConfigResource(root, rteName, true, request, response); + writeConfigResource(root, rteName, request, response); } catch (JSONException e) { throw new ServletException(e); } } - private void writeConfigResource(Resource resource, String rteName, boolean isDefault, + private void writeConfigResource(Resource resource, String rteName, SlingHttpServletRequest request, SlingHttpServletResponse response) throws IOException, JSONException, ServletException { JSONObject widget = createEmptyWidget(rteName); @@ -166,6 +166,7 @@ protected void activate(Map props) { } @Override + @SuppressWarnings("squid:S3776") protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException { String componentPath = request.getResource().getPath(); @@ -181,15 +182,13 @@ protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse r while (children.hasNext()) { Resource child = children.next(); if (matches(componentPath, child)) { - boolean isDefault = false; Resource config = child.getChild(configName); if (config == null) { config = child.getChild(DEFAULT_CONFIG_NAME); - isDefault = true; } if (config != null) { try { - writeConfigResource(config, rteName, isDefault, request, response); + writeConfigResource(config, rteName, request, response); } catch (JSONException e) { throw new ServletException(e); } diff --git a/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/SiteMapServlet.java b/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/SiteMapServlet.java index 1717911dc1..1c166490e9 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/SiteMapServlet.java +++ b/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/SiteMapServlet.java @@ -216,6 +216,7 @@ private Collection getAssetFolders(Page page, ResourceResolver resolve return allAssetFolders; } + @SuppressWarnings("squid:S1192") private void write(Page page, XMLStreamWriter stream, ResourceResolver resolver) throws XMLStreamException { if (isHidden(page)) { return; @@ -306,6 +307,7 @@ private void writeFirstPropertyValue(final XMLStreamWriter stream, final String } } + @SuppressWarnings("squid:S1144") private void writeFirstPropertyValue(final XMLStreamWriter stream, final String elementName, final String[] propertyNames, final InheritanceValueMap properties) throws XMLStreamException { for (String prop : propertyNames) { diff --git a/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/TagWidgetConfigurationServlet.java b/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/TagWidgetConfigurationServlet.java index 6e683e58f0..2bbf4dd354 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/TagWidgetConfigurationServlet.java +++ b/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/TagWidgetConfigurationServlet.java @@ -83,6 +83,7 @@ protected void activate(Map props) { } @Override + @SuppressWarnings("squid:S3776") protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException { String componentPath = request.getResource().getPath(); @@ -98,15 +99,13 @@ protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse r while (children.hasNext()) { Resource child = children.next(); if (matches(componentPath, child)) { - boolean isDefault = false; Resource config = child.getChild(configName); if (config == null) { config = child.getChild(DEFAULT_CONFIG_NAME); - isDefault = true; } if (config != null) { try { - writeConfigResource(config, propertyName, isDefault, request, response); + writeConfigResource(config, propertyName, request, response); } catch (JSONException e) { throw new ServletException(e); } @@ -141,22 +140,17 @@ private void returnDefault(String propertyName, SlingHttpServletRequest request, return; } - writeConfigResource(root, propertyName, true, request, response); + writeConfigResource(root, propertyName, request, response); } catch (JSONException e) { throw new ServletException(e); } } - private void writeConfigResource(Resource resource, String propertyName, boolean isDefault, + private void writeConfigResource(Resource resource, String propertyName, SlingHttpServletRequest request, SlingHttpServletResponse response) throws IOException, JSONException, ServletException { JSONObject widget = createEmptyWidget(propertyName); - // these two size properties seem to be necessary to get the size correct - // in a component dialog - //widget.put("width", WIDGET_WIDTH); - //widget.put("height", WIDGET_HEIGHT); - RequestParameterMap map = request.getRequestParameterMap(); for (Map.Entry entry : map.entrySet()) { String key = entry.getKey(); diff --git a/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/WCMInboxWebConsolePlugin.java b/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/WCMInboxWebConsolePlugin.java index 104e752fa0..962510e1e6 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/WCMInboxWebConsolePlugin.java +++ b/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/WCMInboxWebConsolePlugin.java @@ -61,6 +61,7 @@ public class WCMInboxWebConsolePlugin extends HttpServlet { private static final String SERVICE_NAME = "wcm-inbox-cleanup"; private static final Map AUTH_INFO; + static { AUTH_INFO = Collections.singletonMap(ResourceResolverFactory.SUBSERVICE, (Object) SERVICE_NAME); } diff --git a/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/WorkflowModelFilterPageInfoProvider.java b/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/WorkflowModelFilterPageInfoProvider.java index 76599e87b4..85558814b2 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/WorkflowModelFilterPageInfoProvider.java +++ b/bundle/src/main/java/com/adobe/acs/commons/wcm/impl/WorkflowModelFilterPageInfoProvider.java @@ -73,6 +73,7 @@ public void updatePageInfo(SlingHttpServletRequest request, JSONObject info, Res } } + @SuppressWarnings("squid:S3776") private void filter(JSONObject typeObject, String resourcePath, ResourceResolver resourceResolver) throws JSONException { final JSONArray models = typeObject.getJSONArray(KEY_MODELS); final JSONArray newModels = new JSONArray(); diff --git a/bundle/src/main/java/com/adobe/acs/commons/wcm/notifications/impl/SystemNotificationsImpl.java b/bundle/src/main/java/com/adobe/acs/commons/wcm/notifications/impl/SystemNotificationsImpl.java index 67c8e6ff37..f668f2a857 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/wcm/notifications/impl/SystemNotificationsImpl.java +++ b/bundle/src/main/java/com/adobe/acs/commons/wcm/notifications/impl/SystemNotificationsImpl.java @@ -92,6 +92,7 @@ public class SystemNotificationsImpl extends AbstractHtmlRequestInjector impleme private static final String SERVICE_NAME = "system-notifications"; private static final Map AUTH_INFO; + static { AUTH_INFO = Collections.singletonMap(ResourceResolverFactory.SUBSERVICE, (Object) SERVICE_NAME); } @@ -122,8 +123,8 @@ protected void inject(HttpServletRequest servletRequest, HttpServletResponse ser protected boolean accepts(final ServletRequest servletRequest, final ServletResponse servletResponse) { - if (!(servletRequest instanceof SlingHttpServletRequest) || - !(servletResponse instanceof SlingHttpServletResponse)) { + if (!(servletRequest instanceof SlingHttpServletRequest) + || !(servletResponse instanceof SlingHttpServletResponse)) { return false; } @@ -204,8 +205,8 @@ public String getMessage(String message, String onTime, String offTime) { private boolean isActiveNotification(final SlingHttpServletRequest request, final Resource resource) { - if (JcrConstants.JCR_CONTENT.equals(resource.getName()) || - REP_POLICY.equals(resource.getName())) { + if (JcrConstants.JCR_CONTENT.equals(resource.getName()) + || REP_POLICY.equals(resource.getName())) { return false; } @@ -274,8 +275,8 @@ private boolean hasNotifications() { while (resources.hasNext()) { final Resource resource = resources.next(); - if (!JcrConstants.JCR_CONTENT.equals(resource.getName()) && - !REP_POLICY.equals(resource.getName())) { + if (!JcrConstants.JCR_CONTENT.equals(resource.getName()) + && !REP_POLICY.equals(resource.getName())) { return true; } } @@ -296,6 +297,7 @@ private void registerAsFilter() { log.debug("Registered System Notifications as Sling Filter"); } + @SuppressWarnings("squid:S1149") private void registerAsEventHandler() { final Hashtable filterProps = new Hashtable(); @@ -319,7 +321,7 @@ private void registerAsEventHandler() { @Override public void handleEvent(final Event event) { - long start = System.currentTimeMillis(); + final long start = System.currentTimeMillis(); if (!this.isAuthor()) { log.warn("This event handler should ONLY run on AEM Author."); diff --git a/bundle/src/main/java/com/adobe/acs/commons/wcm/properties/shared/SharedComponentProperties.java b/bundle/src/main/java/com/adobe/acs/commons/wcm/properties/shared/SharedComponentProperties.java index 22b56ffa83..ab665044fa 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/wcm/properties/shared/SharedComponentProperties.java +++ b/bundle/src/main/java/com/adobe/acs/commons/wcm/properties/shared/SharedComponentProperties.java @@ -1,8 +1,28 @@ +/* + * #%L + * ACS AEM Commons Bundle + * %% + * Copyright (C) 2017 Adobe + * %% + * 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. + * #L% + */ package com.adobe.acs.commons.wcm.properties.shared; import aQute.bnd.annotation.ProviderType; @ProviderType +@SuppressWarnings("squid:S1214") public interface SharedComponentProperties { String SHARED_PROPERTIES = "sharedProperties"; String GLOBAL_PROPERTIES = "globalProperties"; diff --git a/bundle/src/main/java/com/adobe/acs/commons/wcm/vanity/VanityURLService.java b/bundle/src/main/java/com/adobe/acs/commons/wcm/vanity/VanityURLService.java index 512bb3344d..165e829260 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/wcm/vanity/VanityURLService.java +++ b/bundle/src/main/java/com/adobe/acs/commons/wcm/vanity/VanityURLService.java @@ -9,15 +9,16 @@ import java.io.IOException; @ProviderType +@SuppressWarnings("checkstyle:abbreviationaswordinname") public interface VanityURLService { - /** - * This method checks if a given request URI (after performing the Resource Resolver Mapping) is a valid vanity URL, - * if true it will perform the FORWARD using Request Dispatcher. - * - * @param request the request object - * @param response the response object - * @return true if this request is dispatched because it's a valid Vanity path, else false. - */ - boolean dispatch(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException, RepositoryException; + /** + * This method checks if a given request URI (after performing the Resource Resolver Mapping) is a valid vanity URL, + * if true it will perform the FORWARD using Request Dispatcher. + * + * @param request the request object + * @param response the response object + * @return true if this request is dispatched because it's a valid Vanity path, else false. + */ + boolean dispatch(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException, RepositoryException; } \ No newline at end of file diff --git a/bundle/src/main/java/com/adobe/acs/commons/wcm/vanity/impl/ExtensionlessRequestWrapper.java b/bundle/src/main/java/com/adobe/acs/commons/wcm/vanity/impl/ExtensionlessRequestWrapper.java index 4f673fae9f..2d9bb2a49d 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/wcm/vanity/impl/ExtensionlessRequestWrapper.java +++ b/bundle/src/main/java/com/adobe/acs/commons/wcm/vanity/impl/ExtensionlessRequestWrapper.java @@ -1,3 +1,22 @@ +/* + * #%L + * ACS AEM Commons Bundle + * %% + * Copyright (C) 2017 Adobe + * %% + * 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. + * #L% + */ package com.adobe.acs.commons.wcm.vanity.impl; import org.apache.sling.api.SlingHttpServletRequest; @@ -5,11 +24,8 @@ import org.apache.sling.api.resource.Resource; import org.apache.sling.api.resource.ValueMap; import org.apache.sling.api.wrappers.SlingHttpServletRequestWrapper; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; public class ExtensionlessRequestWrapper extends SlingHttpServletRequestWrapper { - private static final Logger log = LoggerFactory.getLogger(ExtensionlessRequestWrapper.class); private static final String SLING_STATUS = "sling:status"; diff --git a/bundle/src/main/java/com/adobe/acs/commons/wcm/vanity/impl/VanityURLServiceImpl.java b/bundle/src/main/java/com/adobe/acs/commons/wcm/vanity/impl/VanityURLServiceImpl.java index ea72439a12..4a16527520 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/wcm/vanity/impl/VanityURLServiceImpl.java +++ b/bundle/src/main/java/com/adobe/acs/commons/wcm/vanity/impl/VanityURLServiceImpl.java @@ -19,55 +19,56 @@ @Component @Service +@SuppressWarnings("checkstyle:abbreviationaswordinname") public class VanityURLServiceImpl implements VanityURLService { - private static final Logger log = LoggerFactory.getLogger(VanityURLServiceImpl.class); + private static final Logger log = LoggerFactory.getLogger(VanityURLServiceImpl.class); private static final String VANITY_DISPATCH_CHECK_ATTR = "acs-aem-commons__vanity-check-loop-detection"; private static final String DEFAULT_PATH_SCOPE = "/content"; - public boolean dispatch(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException, RepositoryException { - if (request.getAttribute(VANITY_DISPATCH_CHECK_ATTR) != null) { - log.trace("Processing a previously vanity dispatched request. Skipping..."); - return false; - } + public boolean dispatch(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException, RepositoryException { + if (request.getAttribute(VANITY_DISPATCH_CHECK_ATTR) != null) { + log.trace("Processing a previously vanity dispatched request. Skipping..."); + return false; + } - request.setAttribute(VANITY_DISPATCH_CHECK_ATTR, true); + request.setAttribute(VANITY_DISPATCH_CHECK_ATTR, true); - final String requestURI = request.getRequestURI(); + final String requestURI = request.getRequestURI(); final RequestPathInfo mappedPathInfo = new PathInfo(request.getResourceResolver(), requestURI); final String candidateVanity = mappedPathInfo.getResourcePath(); - final String pathScope = StringUtils.removeEnd(requestURI, candidateVanity); - - log.debug("Candidate vanity URL to check and dispatch: [ {} ]", candidateVanity); - - // Check if... - // 1) the candidateVanity and the requestURI are the same; If they are it means the request has already - // gone through resource resolution and failed so there is no sense in sending it through again. - // 2) the candidate is in at least 1 sling:vanityPath under /content - if (!StringUtils.equals(candidateVanity, requestURI) && isVanityPath(pathScope, candidateVanity, request)) { - log.debug("Forwarding request to vanity resource [ {} ]", candidateVanity); - - final RequestDispatcher requestDispatcher = request.getRequestDispatcher(candidateVanity); - requestDispatcher.forward(new ExtensionlessRequestWrapper(request), response); - return true; - } - - return false; - } - - /** - * Checks if the provided vanity path is a valid redirect - * - * @param pathScope The content path to scope the vanity path too. - * @param vanityPath Vanity path that needs to be validated. - * @param request SlingHttpServletRequest object used for performing query/lookup - * @return return true if the vanityPath is a registered sling:vanityPath under /content - */ - protected boolean isVanityPath(String pathScope, String vanityPath, SlingHttpServletRequest request) throws RepositoryException { - final Resource vanityResource = request.getResourceResolver().resolve(vanityPath); - - if (vanityResource != null) { + final String pathScope = StringUtils.removeEnd(requestURI, candidateVanity); + + log.debug("Candidate vanity URL to check and dispatch: [ {} ]", candidateVanity); + + // Check if... + // 1) the candidateVanity and the requestURI are the same; If they are it means the request has already + // gone through resource resolution and failed so there is no sense in sending it through again. + // 2) the candidate is in at least 1 sling:vanityPath under /content + if (!StringUtils.equals(candidateVanity, requestURI) && isVanityPath(pathScope, candidateVanity, request)) { + log.debug("Forwarding request to vanity resource [ {} ]", candidateVanity); + + final RequestDispatcher requestDispatcher = request.getRequestDispatcher(candidateVanity); + requestDispatcher.forward(new ExtensionlessRequestWrapper(request), response); + return true; + } + + return false; + } + + /** + * Checks if the provided vanity path is a valid redirect + * + * @param pathScope The content path to scope the vanity path too. + * @param vanityPath Vanity path that needs to be validated. + * @param request SlingHttpServletRequest object used for performing query/lookup + * @return return true if the vanityPath is a registered sling:vanityPath under /content + */ + protected boolean isVanityPath(String pathScope, String vanityPath, SlingHttpServletRequest request) throws RepositoryException { + final Resource vanityResource = request.getResourceResolver().resolve(vanityPath); + + if (vanityResource != null) { String targetPath = null; if (vanityResource.isResourceType("sling:redirect")) { @@ -76,14 +77,14 @@ protected boolean isVanityPath(String pathScope, String vanityPath, SlingHttpSer targetPath = vanityResource.getPath(); } - if (targetPath != null && StringUtils.startsWith(targetPath, StringUtils.defaultIfEmpty(pathScope, DEFAULT_PATH_SCOPE))) { - log.debug("Found vanity resource at [ {} ] for sling:vanityPath [ {} ]", targetPath, vanityPath); - return true; - } - } + if (targetPath != null && StringUtils.startsWith(targetPath, StringUtils.defaultIfEmpty(pathScope, DEFAULT_PATH_SCOPE))) { + log.debug("Found vanity resource at [ {} ] for sling:vanityPath [ {} ]", targetPath, vanityPath); + return true; + } + } - return false; - } + return false; + } } \ No newline at end of file diff --git a/bundle/src/main/java/com/adobe/acs/commons/wcm/views/impl/WCMViewsFilter.java b/bundle/src/main/java/com/adobe/acs/commons/wcm/views/impl/WCMViewsFilter.java index f91aea8729..1ddcd11d25 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/wcm/views/impl/WCMViewsFilter.java +++ b/bundle/src/main/java/com/adobe/acs/commons/wcm/views/impl/WCMViewsFilter.java @@ -185,14 +185,14 @@ private void processChain(final ServletRequest request, * @param request the request * @return true is the filter should attempt to process */ + @SuppressWarnings("squid:S3776") private boolean accepts(final SlingHttpServletRequest request) { final PageManager pageManager = request.getResourceResolver().adaptTo(PageManager.class); final Resource resource = request.getResource(); // Only process requests that match the include path prefixes if any are provided - if (ArrayUtils.isEmpty(this.includePathPrefixes)) { - return false; - } else if (!StringUtils.startsWithAny(request.getResource().getPath(), this.includePathPrefixes)) { + if (ArrayUtils.isEmpty(this.includePathPrefixes) + || (!StringUtils.startsWithAny(request.getResource().getPath(), this.includePathPrefixes))) { return false; } @@ -212,11 +212,8 @@ private boolean accepts(final SlingHttpServletRequest request) { try { // Do not process cq:Page or cq:PageContent nodes as this will break all sorts of things, // and they dont have dropzone of their own - if (node.isNodeType(NameConstants.NT_PAGE) || node.isNodeType("cq:PageContent")) { - // Do not process Page node inclusions - return false; - } else if (JcrConstants.JCR_CONTENT.equals(node.getName())) { - // Do not process Page jcr:content nodes (that may not have the cq:PageContent jcr:primaryType) + if (node.isNodeType(NameConstants.NT_PAGE) || node.isNodeType("cq:PageContent") // Do not process Page node inclusions + || JcrConstants.JCR_CONTENT.equals(node.getName())) { // Do not process Page jcr:content nodes (that may not have the cq:PageContent jcr:primaryType) return false; } } catch (RepositoryException e) { diff --git a/bundle/src/main/java/com/adobe/acs/commons/wcm/views/impl/WCMViewsServlet.java b/bundle/src/main/java/com/adobe/acs/commons/wcm/views/impl/WCMViewsServlet.java index ec682bb87d..c245588c70 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/wcm/views/impl/WCMViewsServlet.java +++ b/bundle/src/main/java/com/adobe/acs/commons/wcm/views/impl/WCMViewsServlet.java @@ -26,7 +26,6 @@ import com.day.cq.wcm.api.WCMMode; import com.day.cq.wcm.api.components.Component; import com.day.cq.wcm.commons.WCMUtils; - import org.apache.commons.lang.ArrayUtils; import org.apache.commons.lang.StringUtils; import org.apache.felix.scr.annotations.Activate; @@ -46,9 +45,16 @@ import org.slf4j.LoggerFactory; import javax.servlet.ServletException; - import java.io.IOException; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeSet; @SuppressWarnings("serial") @SlingServlet( @@ -64,6 +70,7 @@ public class WCMViewsServlet extends SlingSafeMethodsServlet { private static final String[] DEFAULT_VIEWS = new String[]{}; private Map defaultViews = new HashMap(); + @Property(label = "WCM Views by Path", description = "Views to add to the Sidekick by default. Takes format [/path=view-1;view-2]", cardinality = Integer.MAX_VALUE, diff --git a/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/BulkWorkflowEngine.java b/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/BulkWorkflowEngine.java index f1e61b6f0f..0df2a757cc 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/BulkWorkflowEngine.java +++ b/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/BulkWorkflowEngine.java @@ -27,6 +27,7 @@ import javax.jcr.RepositoryException; @ProviderType +@SuppressWarnings("squid:S1214") public interface BulkWorkflowEngine { String SLING_RESOURCE_TYPE = "acs-commons/components/utilities/bulk-workflow-manager"; diff --git a/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/BulkWorkflowRunner.java b/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/BulkWorkflowRunner.java index dad7846daa..d6f617cac1 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/BulkWorkflowRunner.java +++ b/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/BulkWorkflowRunner.java @@ -107,27 +107,29 @@ void initialize(QueryHelper queryHelper, Config config) throws PersistenceExcept */ void complete(Workspace workspace) throws PersistenceException; - /** - * Processes a payload under the Workspace. - * @param workspace the Workspace - * @param payload the Payload to process - */ - void run(Workspace workspace, Payload payload); - /** * Marks a payload as being completed. * @param workspace the Workspace * @param payload the completed Payload * @throws Exception */ + @SuppressWarnings("squid:S00112") void complete(Workspace workspace, Payload payload) throws Exception; + /** + * Processes a payload under the Workspace. + * @param workspace the Workspace + * @param payload the Payload to process + */ + void run(Workspace workspace, Payload payload); + /** * Marks a payload being force terminated. * @param workspace the Workspace * @param payload the completed Payload * @throws Exception */ + @SuppressWarnings("squid:S00112") void forceTerminate(Workspace workspace, Payload payload) throws Exception; } diff --git a/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/impl/BulkWorkflowEngineImpl.java b/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/impl/BulkWorkflowEngineImpl.java index b874437725..f20d0fca75 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/impl/BulkWorkflowEngineImpl.java +++ b/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/impl/BulkWorkflowEngineImpl.java @@ -56,6 +56,7 @@ public class BulkWorkflowEngineImpl implements BulkWorkflowEngine { private static final String SERVICE_NAME = "bulk-workflow"; private static final Map AUTH_INFO; + static { AUTH_INFO = Collections.singletonMap(ResourceResolverFactory.SUBSERVICE, (Object) SERVICE_NAME); } diff --git a/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/impl/ConfigResourceVisitor.java b/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/impl/ConfigResourceVisitor.java index 388f02dc81..f610df629e 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/impl/ConfigResourceVisitor.java +++ b/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/impl/ConfigResourceVisitor.java @@ -29,14 +29,11 @@ import org.apache.sling.api.resource.Resource; import org.apache.sling.api.resource.ValueMap; import org.apache.sling.jcr.resource.JcrResourceConstants; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.List; public class ConfigResourceVisitor extends AbstractResourceVisitor { - private static final Logger log = LoggerFactory.getLogger(ConfigResourceVisitor.class); private static final String BULK_WORKFLOW_MANAGER_PAGE_FOLDER_PATH = "/etc/acs-commons/bulk-workflow-manager"; private static final String NT_PAGE_CONTENT = "cq:PageContent"; @@ -55,9 +52,8 @@ public final void accept(final Resource resource) { final ValueMap properties = resource.adaptTo(ValueMap.class); final String primaryType = properties.get(JcrConstants.JCR_PRIMARYTYPE, String.class); - if (BULK_WORKFLOW_MANAGER_PAGE_FOLDER_PATH.equals(resource.getPath())) { - super.accept(resource); - } else if (ArrayUtils.contains(ACCEPTED_PRIMARY_TYPES, primaryType)) { + if (BULK_WORKFLOW_MANAGER_PAGE_FOLDER_PATH.equals(resource.getPath()) + || ArrayUtils.contains(ACCEPTED_PRIMARY_TYPES, primaryType)) { super.accept(resource); } } diff --git a/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/impl/runners/AEMTransientWorkflowRunnerImpl.java b/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/impl/runners/AEMTransientWorkflowRunnerImpl.java index 3d57d6b6ef..e22436f815 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/impl/runners/AEMTransientWorkflowRunnerImpl.java +++ b/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/impl/runners/AEMTransientWorkflowRunnerImpl.java @@ -124,6 +124,7 @@ public AEMTransientWorkflowRunnable(Config config, this.jobManager = jobManager; } + @SuppressWarnings("squid:S3776") public void run() { log.debug("Running Bulk AEM Transient Workflow job [ {} ]", jobName); @@ -213,12 +214,13 @@ public void run() { workspace.commit(); } } catch (Exception e) { - log.error("Error processing periodic execution for job [ {} ] for workspace [ {} ]", new String[]{ jobName, workspace.getPath() }, e); + String workspacePath = workspace != null ? workspace.getPath() : "unknown"; + log.error("Error processing periodic execution for job [ {} ] for workspace [ {} ]", new String[]{ jobName, workspacePath }, e); unscheduleJob(scheduler, jobName, configResource, workspace); try { stop(workspace); } catch (PersistenceException e1) { - log.error("Unable to mark this workspace [ {} ] as stopped.", workspace.getPath(), e1); + log.error("Unable to mark this workspace [ {} ] as stopped.", workspacePath, e1); } } finally { if (serviceResourceResolver != null) { diff --git a/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/impl/runners/AEMWorkflowRunnerImpl.java b/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/impl/runners/AEMWorkflowRunnerImpl.java index 4dac4a314e..0a489d14a9 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/impl/runners/AEMWorkflowRunnerImpl.java +++ b/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/impl/runners/AEMWorkflowRunnerImpl.java @@ -65,9 +65,6 @@ public class AEMWorkflowRunnerImpl extends AbstractAEMWorkflowRunner implements @Reference private ResourceResolverFactory resourceResolverFactory; - @Reference - private ThrottledTaskRunner throttledTaskRunner; - @Reference private JobManager jobManager; @@ -76,7 +73,7 @@ public class AEMWorkflowRunnerImpl extends AbstractAEMWorkflowRunner implements */ @Override public Runnable getRunnable(final Config config) { - return new AEMWorkflowRunnable(config, scheduler, resourceResolverFactory, workflowService, throttledTaskRunner); + return new AEMWorkflowRunnable(config, scheduler, resourceResolverFactory, workflowService); } @Override @@ -89,6 +86,7 @@ public ScheduleOptions getOptions(Config config) { return options; } + @SuppressWarnings("squid:S00112") @Override public void complete(Workspace workspace, Payload payload) throws Exception { super.complete(workspace, payload); @@ -102,6 +100,7 @@ public void complete(Workspace workspace, Payload payload) throws Exception { } } + @SuppressWarnings("squid:S00112") @Override public void forceTerminate(Workspace workspace, Payload payload) throws Exception { final WorkflowSession workflowSession = @@ -161,7 +160,6 @@ private void purge(Payload payload) throws PersistenceException, WorkflowExcepti protected class AEMWorkflowRunnable implements Runnable { private final ResourceResolverFactory resourceResolverFactory; - private final ThrottledTaskRunner throttledTaskRunner; private final WorkflowService workflowService; private final Scheduler scheduler; private String configPath ; @@ -170,16 +168,16 @@ protected class AEMWorkflowRunnable implements Runnable { public AEMWorkflowRunnable(Config config, Scheduler scheduler, ResourceResolverFactory resourceResolverFactory, - WorkflowService workflowService, - ThrottledTaskRunner throttledTaskRunner) { + WorkflowService workflowService) { this.configPath = config.getPath(); this.jobName = config.getWorkspace().getJobName(); this.resourceResolverFactory = resourceResolverFactory; this.workflowService = workflowService; - this.throttledTaskRunner = throttledTaskRunner; this.scheduler = scheduler; } + @Override + @SuppressWarnings({"squid:S3776", "squid:S1141"}) public void run() { log.debug("Running Bulk AEM Workflow job [ {} ]", jobName); @@ -296,15 +294,18 @@ public void run() { log.info("Completed Bulk Workflow execution for [ {} ]", config.getPath()); } - workspace.commit(); + if (workspace != null) { + workspace.commit(); + } } } catch (Exception e) { - log.error("Error processing periodic execution for job [ {} ] for workspace [ {} ]", new String[]{ jobName, workspace.getPath() }, e); + String workspacePath = workspace != null ? workspace.getPath() : "unknown"; + log.error("Error processing periodic execution for job [ {} ] for workspace [ {} ]", new String[]{ jobName, workspacePath }, e); unscheduleJob(scheduler, jobName, configResource, workspace); try { stop(workspace); } catch (PersistenceException e1) { - log.error("Unable to mark this workspace [ {} ] as stopped.", workspace.getPath(), e1); + log.error("Unable to mark this workspace [ {} ] as stopped.", workspacePath, e1); } } finally { if (adminResourceResolver != null) { diff --git a/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/impl/runners/AbstractAEMWorkflowRunner.java b/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/impl/runners/AbstractAEMWorkflowRunner.java index e0391e6fee..dbddc5ee51 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/impl/runners/AbstractAEMWorkflowRunner.java +++ b/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/impl/runners/AbstractAEMWorkflowRunner.java @@ -31,6 +31,7 @@ public abstract class AbstractAEMWorkflowRunner extends AbstractWorkflowRunner { private static final Logger log = LoggerFactory.getLogger(AbstractAEMWorkflowRunner.class); + @SuppressWarnings("squid:S3776") protected Payload onboardNextPayload(Workspace workspace) { long start = System.currentTimeMillis(); @@ -117,6 +118,7 @@ protected PayloadGroup onboardNextPayloadGroup(Workspace workspace, PayloadGroup } } + @SuppressWarnings("squid:S2583") protected void unscheduleJob(Scheduler scheduler, String jobName, Resource configResource, Workspace workspace) { try { if (configResource != null) { @@ -124,8 +126,8 @@ protected void unscheduleJob(Scheduler scheduler, String jobName, Resource confi } else { scheduler.unschedule(jobName); stopWithError(workspace); - log.error("Removed scheduled job [ {} ] due to errors content resource [ {} ] could not " - + "be found.", jobName, configResource.getPath()); + log.error("Removed scheduled job [ {} ] due to errors content resource could not " + + "be found.", jobName); } } catch (Exception e1) { if (scheduler != null) { diff --git a/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/impl/runners/AbstractWorkflowRunner.java b/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/impl/runners/AbstractWorkflowRunner.java index b232d8dbd8..a40af9b6ca 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/impl/runners/AbstractWorkflowRunner.java +++ b/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/impl/runners/AbstractWorkflowRunner.java @@ -51,6 +51,7 @@ public abstract class AbstractWorkflowRunner implements BulkWorkflowRunner { protected static final String SERVICE_NAME = "bulk-workflow-runner"; protected static final Map AUTH_INFO; + static { AUTH_INFO = Collections.singletonMap(ResourceResolverFactory.SUBSERVICE, (Object) SERVICE_NAME); } @@ -119,6 +120,7 @@ public void initialize(Workspace workspace, int totalCount) throws PersistenceEx workspace.commit(); } + @Override public void start(Workspace workspace) throws PersistenceException { workspace.setStatus(Status.RUNNING); if (workspace.getStartedAt() == null) { @@ -127,17 +129,20 @@ public void start(Workspace workspace) throws PersistenceException { workspace.commit(); } + @Override public void stopping(Workspace workspace) throws PersistenceException { workspace.setStatus(Status.RUNNING, SubStatus.STOPPING); workspace.commit(); } + @Override public void stop(Workspace workspace) throws PersistenceException { workspace.setStatus(Status.STOPPED); workspace.setStoppedAt(Calendar.getInstance()); workspace.commit(); } + @Override public void stop(Workspace workspace, SubStatus subStatus) throws PersistenceException { if (subStatus != null) { workspace.setStatus(Status.STOPPED, subStatus); @@ -148,22 +153,21 @@ public void stop(Workspace workspace, SubStatus subStatus) throws PersistenceExc workspace.commit(); } + @Override public void stopWithError(Workspace workspace) throws PersistenceException { workspace.setStatus(Status.STOPPED, SubStatus.ERROR); workspace.setStoppedAt(Calendar.getInstance()); workspace.commit(); } + @Override public void complete(Workspace workspace) throws PersistenceException { workspace.setStatus(Status.COMPLETED); workspace.setCompletedAt(Calendar.getInstance()); workspace.commit(); } - public void run(Workspace workspace, Payload payload) { - payload.setStatus(Status.RUNNING); - } - + @Override public void complete(Workspace workspace, Payload payload) throws Exception { // Remove active payload if (workspace != null) { @@ -176,6 +180,11 @@ public void complete(Workspace workspace, Payload payload) throws Exception { } } + @Override + public void run(Workspace workspace, Payload payload) { + payload.setStatus(Status.RUNNING); + } + public void fail(Workspace workspace, Payload payload) throws Exception { // Remove active payload workspace.removeActivePayload(payload); @@ -187,5 +196,6 @@ public void fail(Workspace workspace, Payload payload) throws Exception { workspace.addFailure(payload); } + @Override public abstract void forceTerminate(Workspace workspace, Payload payload) throws Exception; } diff --git a/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/impl/runners/FastActionManagerRunnerImpl.java b/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/impl/runners/FastActionManagerRunnerImpl.java index 5051458432..b43f0c7bb2 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/impl/runners/FastActionManagerRunnerImpl.java +++ b/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/impl/runners/FastActionManagerRunnerImpl.java @@ -145,6 +145,11 @@ public void complete(ResourceResolver resourceResolver, String workspacePath, Ac } } + @Override + public void complete(Workspace workspace, Payload payload) throws Exception { + throw new UnsupportedOperationException("FAM payloads cannot be completed as they are not tracked"); + } + @Override public void run(Workspace workspace, Payload payload) { if (!throttledTaskRunner.isRunning()) { @@ -152,11 +157,6 @@ public void run(Workspace workspace, Payload payload) { } } - @Override - public void complete(Workspace workspace, Payload payload) throws Exception { - throw new UnsupportedOperationException("FAM payloads cannot be completed as they are not tracked"); - } - @Override public void forceTerminate(Workspace workspace, Payload payload) throws Exception { throw new UnsupportedOperationException("FAM jobs cannot be force terminated"); @@ -186,6 +186,9 @@ public FastActionManagerRunnable(Config config, this.actions = actions; this.syntheticWorkflowRunner = syntheticWorkflowRunner; } + + @Override + @SuppressWarnings({"squid:S3776", "squid:S1141", "squid:S1854"}) public void run() { ResourceResolver resourceResolver; Resource configResource; diff --git a/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/impl/runners/SyntheticWorkflowRunnerImpl.java b/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/impl/runners/SyntheticWorkflowRunnerImpl.java index 39b5603166..6b14071548 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/impl/runners/SyntheticWorkflowRunnerImpl.java +++ b/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/impl/runners/SyntheticWorkflowRunnerImpl.java @@ -22,7 +22,11 @@ import com.adobe.acs.commons.fam.ThrottledTaskRunner; import com.adobe.acs.commons.workflow.bulk.execution.BulkWorkflowRunner; -import com.adobe.acs.commons.workflow.bulk.execution.model.*; +import com.adobe.acs.commons.workflow.bulk.execution.model.Config; +import com.adobe.acs.commons.workflow.bulk.execution.model.Payload; +import com.adobe.acs.commons.workflow.bulk.execution.model.PayloadGroup; +import com.adobe.acs.commons.workflow.bulk.execution.model.Status; +import com.adobe.acs.commons.workflow.bulk.execution.model.Workspace; import com.adobe.acs.commons.workflow.synthetic.SyntheticWorkflowModel; import com.adobe.acs.commons.workflow.synthetic.SyntheticWorkflowRunner; import com.day.cq.workflow.WorkflowException; @@ -113,6 +117,8 @@ public SyntheticWorkflowRunnable(Config config, this.scheduler = scheduler; } + @Override + @SuppressWarnings({"squid:S3776", "squid:S1141"}) public void run() { ResourceResolver serviceResourceResolver = null; Resource configResource; diff --git a/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/impl/servlets/InitFormServlet.java b/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/impl/servlets/InitFormServlet.java index 72e3d2a2a8..2197881e3d 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/impl/servlets/InitFormServlet.java +++ b/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/impl/servlets/InitFormServlet.java @@ -28,6 +28,9 @@ import com.day.cq.workflow.WorkflowService; import com.day.cq.workflow.WorkflowSession; import com.day.cq.workflow.model.WorkflowModel; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; import org.apache.felix.scr.annotations.Reference; import org.apache.felix.scr.annotations.sling.SlingServlet; import org.apache.sling.api.SlingHttpServletRequest; @@ -35,8 +38,6 @@ import org.apache.sling.api.resource.Resource; import org.apache.sling.api.resource.ResourceResolver; import org.apache.sling.api.servlets.SlingAllMethodsServlet; -import org.apache.sling.commons.json.JSONException; -import org.apache.sling.commons.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -56,6 +57,11 @@ ) public class InitFormServlet extends SlingAllMethodsServlet { private static final Logger log = LoggerFactory.getLogger(InitFormServlet.class); + private static final String KEY_RUNNER_TYPES = "runnerTypes"; + private static final String KEY_LABEL = "label"; + private static final String KEY_QUERY_TYPES = "queryTypes"; + private static final String KEY_VALUE = "value"; + private static final String KEY_USER_EVENT_DATA = "userEventData"; @Reference private WorkflowService workflowService; @@ -67,43 +73,24 @@ protected final void doGet(SlingHttpServletRequest request, SlingHttpServletResp response.setContentType("application/json"); response.setCharacterEncoding("UTF-8"); - final JSONObject json = new JSONObject(); + final JsonObject json = new JsonObject(); // Runners - try { - json.accumulate("runnerTypes", new JSONObject().put("label", "AEM Workflow").put("value", - AEMWorkflowRunnerImpl.class.getName())); - json.accumulate("runnerTypes", new JSONObject().put("label", "Synthetic Workflow (Single-threaded)").put("value", - SyntheticWorkflowRunnerImpl.class.getName())); - json.accumulate("runnerTypes", new JSONObject().put("label", "Synthetic Workflow (Multi-threaded)").put("value", - FastActionManagerRunnerImpl.class.getName())); - } catch (JSONException e) { - log.error("Could not create JSON for Bulk Workflow Runner options"); - throw new ServletException(e); - } + accumulate(json, KEY_RUNNER_TYPES, withLabelValue("AEM Workflow", AEMWorkflowRunnerImpl.class.getName())); + accumulate(json, KEY_RUNNER_TYPES, withLabelValue("Synthetic Workflow (Single-threaded)", SyntheticWorkflowRunnerImpl.class.getName())); + accumulate(json, KEY_RUNNER_TYPES, withLabelValue("Synthetic Workflow (Multi-threaded)", FastActionManagerRunnerImpl.class.getName())); // Query Types - try { - json.accumulate("queryTypes", new JSONObject().put("label", "QueryBuilder").put("value", "queryBuilder")); - json.accumulate("queryTypes", new JSONObject().put("label", "List").put("value", "list")); - json.accumulate("queryTypes", new JSONObject().put("label", "xPath").put("value", "xpath")); - json.accumulate("queryTypes", new JSONObject().put("label", "JCR-SQL2").put("value", "JCR-SQL2")); - json.accumulate("queryTypes", new JSONObject().put("label", "JCR-SQL").put("value", "JCR-SQL")); - } catch (JSONException e) { - log.error("Could not create JSON for QueryType options", e); - throw new ServletException(e); - } + accumulate(json, KEY_QUERY_TYPES, withLabelValue("QueryBuilder", "queryBuilder")); + accumulate(json, KEY_QUERY_TYPES, withLabelValue("List", "list")); + accumulate(json, KEY_QUERY_TYPES, withLabelValue("xPath", "xpath")); + accumulate(json, KEY_QUERY_TYPES, withLabelValue("JCR-SQL2", "JCR-SQL2")); + accumulate(json, KEY_QUERY_TYPES, withLabelValue("JCR-SQL", "JCR-SQL")); // User Event Data - try { - json.accumulate("userEventData", new JSONObject().put("label", "Custom user-event-data").put("value", "")); - json.accumulate("userEventData", new JSONObject().put("label", "changedByWorkflowProcess").put("value", "changedByWorkflowProcess")); - json.accumulate("userEventData", new JSONObject().put("label", "acs-aem-commons.bulk-workflow-manager").put("value", "acs-aem-commons.bulk-workflow-manager")); - - } catch (JSONException e) { - log.error("Could not create JSON for userEventData options", e); - throw new ServletException(e); - } + accumulate(json, KEY_USER_EVENT_DATA, withLabelValue("Custom user-event-data", "")); + accumulate(json, KEY_USER_EVENT_DATA, withLabelValue("changedByWorkflowProcess", "changedByWorkflowProcess")); + accumulate(json, KEY_USER_EVENT_DATA, withLabelValue("acs-aem-commons.bulk-workflow-manager", "acs-aem-commons.bulk-workflow-manager")); // Workflow Models final WorkflowSession workflowSession = workflowService.getWorkflowSession( @@ -113,22 +100,14 @@ protected final void doGet(SlingHttpServletRequest request, SlingHttpServletResp final WorkflowModel[] workflowModels = workflowSession.getModels(); for (final WorkflowModel workflowModel : workflowModels) { - JSONObject jsonWorkflow = new JSONObject(); - try { - boolean transientWorkflow = isTransient(request.getResourceResolver(), workflowModel.getId()); - String workflowLabel = workflowModel.getTitle(); - if (transientWorkflow) { - workflowLabel += " ( Transient )"; - } - jsonWorkflow.put("label", workflowLabel); - jsonWorkflow.put("value", workflowModel.getId()); - jsonWorkflow.put("transient", transientWorkflow); - json.accumulate("workflowModels", jsonWorkflow); - } catch (JSONException e) { - log.error("Could not add workflow [ {} - {} ] to Workflow Models drop-down JSON object", - workflowModel.getTitle(), workflowModel.getId()); - throw new ServletException(e); + boolean transientWorkflow = isTransient(request.getResourceResolver(), workflowModel.getId()); + String workflowLabel = workflowModel.getTitle(); + if (transientWorkflow) { + workflowLabel += " ( Transient )"; } + JsonObject jsonWorkflow = withLabelValue(workflowLabel, workflowModel.getId()); + jsonWorkflow.addProperty("transient", transientWorkflow); + accumulate(json, "workflowModels", jsonWorkflow); } response.getWriter().write(json.toString()); @@ -146,4 +125,29 @@ protected boolean isTransient(ResourceResolver resourceResolver, String workflow return resource.getValueMap().get("transient", false); } + private JsonObject withLabelValue(String label, String value) { + JsonObject obj = new JsonObject(); + obj.addProperty(KEY_LABEL, label); + obj.addProperty(KEY_VALUE, value); + return obj; + } + + private JsonObject accumulate(JsonObject obj, String key, JsonElement value) { + if (obj.has(key)) { + JsonElement existingValue = obj.get(key); + if (existingValue instanceof JsonArray) { + ((JsonArray) existingValue).add(value); + } else { + JsonArray array = new JsonArray(); + array.add(existingValue); + obj.add(key, array); + } + } else { + JsonArray array = new JsonArray(); + array.add(value); + obj.add(key, array); + } + return obj; + } + } diff --git a/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/impl/servlets/StartServlet.java b/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/impl/servlets/StartServlet.java index afefbcbe37..b85121d4c5 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/impl/servlets/StartServlet.java +++ b/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/impl/servlets/StartServlet.java @@ -60,6 +60,7 @@ public class StartServlet extends SlingAllMethodsServlet { private BulkWorkflowEngine bulkWorkflowEngine; @Override + @SuppressWarnings("squid:S1192") protected final void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException { diff --git a/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/impl/servlets/StatusServlet.java b/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/impl/servlets/StatusServlet.java index bad490dd46..d7676a336d 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/impl/servlets/StatusServlet.java +++ b/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/impl/servlets/StatusServlet.java @@ -71,6 +71,7 @@ public class StatusServlet extends SlingAllMethodsServlet { private ActionManagerFactory actionManagerFactory; @Override + @SuppressWarnings({"squid:S3776","squid:S1192"}) protected final void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException { @@ -188,6 +189,7 @@ private void addWorkspaceTrackedCounts(Workspace workspace, JSONObject json) thr json.put("percentComplete", Math.round(((workspace.getTotalCount() - remainingCount) / (workspace.getTotalCount() * 1F)) * DECIMAL_TO_PERCENT)); } + @SuppressWarnings("squid:S1192") private JSONObject getSystemStats() throws JSONException { JSONObject json = new JSONObject(); try { diff --git a/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/model/Config.java b/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/model/Config.java index 7a19b730a8..efeff251d0 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/model/Config.java +++ b/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/model/Config.java @@ -28,14 +28,11 @@ import org.apache.sling.models.annotations.Default; import org.apache.sling.models.annotations.Model; import org.apache.sling.models.annotations.Optional; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import javax.inject.Inject; @Model(adaptables = Resource.class) public class Config { - private static final Logger log = LoggerFactory.getLogger(Config.class); private final Resource resource; private final ModifiableValueMap properties; @@ -148,7 +145,9 @@ public Resource getResource() { return resource; } - public int getRetryCount() { return retryCount; } + public int getRetryCount() { + return retryCount; + } public boolean isAutoThrottle() { return autoThrottle; diff --git a/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/model/Failure.java b/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/model/Failure.java index 44f9e7dca7..1717761a12 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/model/Failure.java +++ b/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/model/Failure.java @@ -26,8 +26,6 @@ import org.apache.sling.commons.json.JSONObject; import org.apache.sling.models.annotations.Model; import org.apache.sling.models.annotations.Optional; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import javax.inject.Inject; import java.text.SimpleDateFormat; @@ -35,7 +33,6 @@ @Model(adaptables = Resource.class) public class Failure { - private static final Logger log = LoggerFactory.getLogger(Failure.class); public static final String PN_PATH = "path"; public static final String PN_PAYLOAD_PATH = "payloadPath"; diff --git a/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/model/Payload.java b/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/model/Payload.java index 470e04003b..51e1fd207d 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/model/Payload.java +++ b/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/model/Payload.java @@ -132,14 +132,14 @@ public String getWorkflowInstanceId() { } public boolean isOnboarded() { - Status status = getStatus(); - return (status != null && !Status.NOT_STARTED.equals(status)); + Status tmpStatus = getStatus(); + return (tmpStatus != null && !Status.NOT_STARTED.equals(tmpStatus)); } /** Setters **/ - public void setStatus(Status status) { - this.status = status.toString(); + public void setStatus(Status newStatus) { + this.status = newStatus.toString(); properties.put(PN_STATUS, this.status); } diff --git a/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/model/PayloadGroup.java b/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/model/PayloadGroup.java index 2e5a211b39..a293e4db27 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/model/PayloadGroup.java +++ b/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/model/PayloadGroup.java @@ -24,8 +24,6 @@ import org.apache.sling.api.resource.Resource; import org.apache.sling.models.annotations.Model; import org.apache.sling.models.annotations.Optional; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import javax.inject.Inject; import java.util.ArrayList; @@ -33,7 +31,6 @@ @Model(adaptables = Resource.class) public class PayloadGroup { - private static final Logger log = LoggerFactory.getLogger(PayloadGroup.class); public static final String PN_NEXT = "next"; private final Resource resource; diff --git a/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/model/Workspace.java b/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/model/Workspace.java index 14f95d84f6..677a9c5c60 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/model/Workspace.java +++ b/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/execution/model/Workspace.java @@ -33,8 +33,6 @@ import org.apache.sling.models.annotations.Default; import org.apache.sling.models.annotations.Model; import org.apache.sling.models.annotations.Optional; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import javax.annotation.PostConstruct; import javax.inject.Inject; @@ -46,7 +44,6 @@ @Model(adaptables = Resource.class) public class Workspace { - private static final Logger log = LoggerFactory.getLogger(Workspace.class); public static final String NT_UNORDERED = "oak:Unstructured"; @@ -149,7 +146,7 @@ public Workspace(Resource resource) { } @PostConstruct - protected void activate() throws Exception { + protected void activate() { this.config = resource.getParent().adaptTo(Config.class); for (BulkWorkflowRunner candidate : runners) { @@ -274,6 +271,14 @@ public void setStatus(Status status) { properties.remove(PN_SUB_STATUS); } + public void setStatus(Status status, SubStatus subStatus) { + setStatus(status); + if (subStatus != null) { + this.subStatus = subStatus.toString(); + properties.put(PN_SUB_STATUS, this.subStatus); + } + } + public SubStatus getSubStatus() { // Refresh state before getting the status. // Note, this gets the value from the session state, and not the cached Sling Model value as this value can change over the life of the SlingModel. @@ -298,14 +303,6 @@ public void setInitialized(boolean initialized) { properties.put(PN_INITIALIZED, this.initialized); } - public void setStatus(Status status, SubStatus subStatus) { - setStatus(status); - if (subStatus != null) { - this.subStatus = subStatus.toString(); - properties.put(PN_SUB_STATUS, this.subStatus); - } - } - public int incrementCompleteCount() { setCompleteCount(completeCount + 1); return completeCount; diff --git a/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/removal/WorkflowInstanceRemover.java b/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/removal/WorkflowInstanceRemover.java index cba51911b4..18b4ea6ee9 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/removal/WorkflowInstanceRemover.java +++ b/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/removal/WorkflowInstanceRemover.java @@ -27,6 +27,7 @@ import java.util.Collection; import java.util.regex.Pattern; +@SuppressWarnings("squid:S1214") public interface WorkflowInstanceRemover { String WORKFLOW_INSTANCES_PATH = "/etc/workflow/instances"; diff --git a/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/removal/WorkflowRemovalStatus.java b/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/removal/WorkflowRemovalStatus.java index de99b104af..ea52ea8ef7 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/removal/WorkflowRemovalStatus.java +++ b/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/removal/WorkflowRemovalStatus.java @@ -29,15 +29,15 @@ public final class WorkflowRemovalStatus { - String KEY_CHECKED_COUNT = "checkedCount"; - String KEY_COMPLETED_AT = "completedAt"; - String KEY_DURATION = "duration"; - String KEY_FORCE_QUIT_AT = "forceQuitAt"; - String KEY_ERRED_AT = "erredAt"; - String KEY_INITIATED_BY = "initiatedBy"; - String KEY_REMOVED_COUNT = "removedCount"; - String KEY_RUNNING = "running"; - String KEY_STARTED_AT = "startedAt"; + private static final String KEY_CHECKED_COUNT = "checkedCount"; + private static final String KEY_COMPLETED_AT = "completedAt"; + private static final String KEY_DURATION = "duration"; + private static final String KEY_FORCE_QUIT_AT = "forceQuitAt"; + private static final String KEY_ERRED_AT = "erredAt"; + private static final String KEY_INITIATED_BY = "initiatedBy"; + private static final String KEY_REMOVED_COUNT = "removedCount"; + private static final String KEY_RUNNING = "running"; + private static final String KEY_STARTED_AT = "startedAt"; private static final String DATE_FORMAT = "yyyy/MM/dd 'at' hh:mm:ss a z"; private static final long MS_IN_SECOND = 1000L; @@ -143,9 +143,7 @@ public String getForceQuitAt() { } private long getDuration(Calendar start, Calendar end) { - if (start == null || end == null) { - return 0; - } else if (end.before(start)) { + if (start == null || end == null || end.before(start)) { return 0; } diff --git a/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/removal/impl/WorkflowInstanceFolderComparator.java b/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/removal/impl/WorkflowInstanceFolderComparator.java index 192758630b..65a1b39558 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/removal/impl/WorkflowInstanceFolderComparator.java +++ b/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/removal/impl/WorkflowInstanceFolderComparator.java @@ -22,13 +22,10 @@ import org.apache.commons.lang.StringUtils; import org.apache.sling.api.resource.Resource; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.util.Comparator; public class WorkflowInstanceFolderComparator implements Comparator { - private static final Logger log = LoggerFactory.getLogger(WorkflowInstanceFolderComparator.class); private static final int MAX_SEGMENTS = 4; // YYYY-MM-DD_N diff --git a/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/removal/impl/WorkflowInstanceRemoverImpl.java b/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/removal/impl/WorkflowInstanceRemoverImpl.java index 18624c352d..1b3f238e2a 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/removal/impl/WorkflowInstanceRemoverImpl.java +++ b/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/removal/impl/WorkflowInstanceRemoverImpl.java @@ -20,7 +20,11 @@ package com.adobe.acs.commons.workflow.bulk.removal.impl; -import com.adobe.acs.commons.workflow.bulk.removal.*; +import com.adobe.acs.commons.workflow.bulk.removal.WorkflowInstanceRemover; +import com.adobe.acs.commons.workflow.bulk.removal.WorkflowRemovalException; +import com.adobe.acs.commons.workflow.bulk.removal.WorkflowRemovalForceQuitException; +import com.adobe.acs.commons.workflow.bulk.removal.WorkflowRemovalMaxDurationExceededException; +import com.adobe.acs.commons.workflow.bulk.removal.WorkflowRemovalStatus; import com.adobe.granite.workflow.WorkflowException; import com.adobe.granite.workflow.WorkflowSession; import com.adobe.granite.workflow.exec.WorkItem; @@ -29,7 +33,11 @@ import com.day.cq.workflow.WorkflowService; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; -import org.apache.felix.scr.annotations.*; +import org.apache.felix.scr.annotations.Activate; +import org.apache.felix.scr.annotations.Component; +import org.apache.felix.scr.annotations.Deactivate; +import org.apache.felix.scr.annotations.Reference; +import org.apache.felix.scr.annotations.Service; import org.apache.jackrabbit.JcrConstants; import org.apache.sling.api.resource.PersistenceException; import org.apache.sling.api.resource.Resource; @@ -42,7 +50,14 @@ import javax.jcr.Node; import javax.jcr.RepositoryException; import java.text.SimpleDateFormat; -import java.util.*; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collection; +import java.util.Date; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.TreeSet; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; import java.util.regex.Pattern; @@ -80,6 +95,7 @@ public final class WorkflowInstanceRemoverImpl implements WorkflowInstanceRemove private static final int MAX_SAVE_RETRIES = 5; private static final long MS_IN_ONE_MINUTE = 60000; + private static final String STATUS_RUNNING = "RUNNING"; private final AtomicReference status = new AtomicReference(); @@ -100,6 +116,67 @@ public WorkflowRemovalStatus getStatus() { return this.status.get(); } + private String getStatus(Resource workflowInstanceResource) { + String instanceStatus = workflowInstanceResource.getValueMap().get(PN_STATUS, "UNKNOWN"); + + if (!STATUS_RUNNING.equalsIgnoreCase(instanceStatus)) { + log.debug("Status of [ {} ] is not RUNNING, so we can take it at face value", instanceStatus); + return instanceStatus; + } + + // Else check if its RUNNING or STALE + log.debug("Status is [ {} ] so we have to determine if its RUNNING or STALE", instanceStatus); + + Resource metadataResource = workflowInstanceResource.getChild("data/metaData"); + if (metadataResource == null) { + log.debug("Workflow instance data/metaData does not exist for [ {} ]", workflowInstanceResource.getPath()); + return instanceStatus; + } + + final ValueMap properties = metadataResource.getValueMap(); + final String[] jobIds = StringUtils.splitByWholeSeparator(properties.get("currentJobs", ""), JOB_SEPARATOR); + + if (jobIds.length == 0) { + log.debug("No jobs found for [ {} ] so assuming status as [ {} ]", workflowInstanceResource.getPath(), instanceStatus); + } + + // Make sure there are no JOBS that match to this jobs name + for (final String jobId : jobIds) { + if (jobManager.getJobById(jobId) != null) { + // Found a job for this jobID; so this is a RUNNING job + log.debug("JobManager found a job for jobId [ {} ] so marking workflow instances [ {} ] as RUNNING", jobId, workflowInstanceResource.getPath()); + return STATUS_RUNNING; + } + } + log.debug("JobManager could not find any jobs for jobIds [ {} ] so workflow instance [ {} ] is potentially STALE", StringUtils.join(jobIds, ", "), workflowInstanceResource.getPath()); + + final WorkflowSession workflowSession = workflowInstanceResource.getResourceResolver().adaptTo(WorkflowSession.class); + Workflow workflow = null; + try { + workflow = workflowSession.getWorkflow(workflowInstanceResource.getPath()); + if (workflow == null) { + throw new WorkflowException(String.format("Workflow instance object is null for [ %s]", workflowInstanceResource.getPath())); + } + } catch (WorkflowException e) { + log.warn("Unable to locate Workflow Instance for [ {} ] So it cannot be RUNNING and must be STALE. ", workflowInstanceResource.getPath(), e); + return "STALE"; + } + + final List workItems = workflow.getWorkItems(new WorkItemFilter() { + public boolean doInclude(WorkItem workItem) { + // Only include active Workflow instances (ones without an End Time) in this list + return workItem.getTimeEnded() == null; + } + }); + + if (!workItems.isEmpty()) { + // If at least 1 work item exists that does not have an end time (meaning its still active), then its RUNNING + return STATUS_RUNNING; + } + + return "STALE"; + } + /** * {@inheritDoc} */ @@ -136,6 +213,7 @@ public int removeWorkflowInstances(final ResourceResolver resourceResolver, /** * {@inheritDoc} */ + @SuppressWarnings({"squid:S3776", "squid:S1141"}) public int removeWorkflowInstances(final ResourceResolver resourceResolver, final Collection modelIds, final Collection statuses, @@ -196,7 +274,7 @@ public int removeWorkflowInstances(final ResourceResolver resourceResolver, checkedCount++; - final String status = getStatus(instance); + final String instanceStatus = getStatus(instance); final String model = properties.get(PN_MODEL_ID, String.class); final Calendar startTime = properties.get(PN_STARTED_AT, Calendar.class); final String payload = properties.get(PAYLOAD_PATH, String.class); @@ -205,8 +283,8 @@ public int removeWorkflowInstances(final ResourceResolver resourceResolver, log.warn("Unable to find payload for Workflow instance [ {} ]", instance.getPath()); remaining++; continue; - } else if (CollectionUtils.isNotEmpty(statuses) && !statuses.contains(status)) { - log.trace("Workflow instance [ {} ] has non-matching status of [ {} ]", instance.getPath(), status); + } else if (CollectionUtils.isNotEmpty(statuses) && !statuses.contains(instanceStatus)) { + log.trace("Workflow instance [ {} ] has non-matching status of [ {} ]", instance.getPath(), instanceStatus); remaining++; continue; } else if (CollectionUtils.isNotEmpty(modelIds) && !modelIds.contains(model)) { @@ -288,23 +366,23 @@ && isWorkflowDatedFolder(folder) } catch (PersistenceException e) { this.forceQuit.set(false); log.error("Error persisting changes with Workflow Removal", e); - this.error(resourceResolver); + this.error(); throw e; } catch (WorkflowRemovalException e) { this.forceQuit.set(false); log.error("Error with Workflow Removal", e); - this.error(resourceResolver); + this.error(); throw e; } catch (InterruptedException e) { this.forceQuit.set(false); log.error("Errors in persistence retries during Workflow Removal", e); - this.error(resourceResolver); + this.error(); throw e; } catch (WorkflowRemovalForceQuitException e) { this.forceQuit.set(false); // Uncommon instance of using Exception to control flow; Force quitting is an extreme condition. log.warn("Workflow removal was force quit. The removal state is unknown."); - this.forceQuit(resourceResolver); + this.internalForceQuit(); throw e; } catch (WorkflowRemovalMaxDurationExceededException e) { // Uncommon instance of using Exception to control flow; Exceeding max duration extreme condition. @@ -334,69 +412,6 @@ private Collection getSortedAndFilteredFolders(Resource folderResource return sortedCollection; } - private String getStatus(Resource workflowInstanceResource) { - String status = workflowInstanceResource.getValueMap().get(PN_STATUS, "UNKNOWN"); - - if (!"RUNNING".equalsIgnoreCase(status)) { - log.debug("Status of [ {} ] is not RUNNING, so we can take it at face value", status); - return status; - } - - // Else check if its RUNNING or STALE - log.debug("Status is [ {} ] so we have to determine if its RUNNING or STALE", status); - - Resource metadataResource = workflowInstanceResource.getChild("data/metaData"); - if (metadataResource == null) { - log.debug("Workflow instance data/metaData does not exist for [ {} ]", workflowInstanceResource.getPath()); - return status; - } - - final ValueMap properties = metadataResource.getValueMap(); - final String[] jobIds = StringUtils.splitByWholeSeparator(properties.get("currentJobs", ""), JOB_SEPARATOR); - - if (jobIds.length == 0) { - log.debug("No jobs found for [ {} ] so assuming status as [ {} ]", workflowInstanceResource.getPath(), status); - } - - // Make sure there are no JOBS that match to this jobs name - for (final String jobId : jobIds) { - if (jobManager.getJobById(jobId) != null) { - // Found a job for this jobID; so this is a RUNNING job - log.debug("JobManager found a job for jobId [ {} ] so marking workflow instances [ {} ] as RUNNING", jobId, workflowInstanceResource.getPath()); - return "RUNNING"; - } - } - log.debug("JobManager could not find any jobs for jobIds [ {} ] so workflow instance [ {} ] is potentially STALE", StringUtils.join(jobIds, ", "), workflowInstanceResource.getPath()); - - final WorkflowSession workflowSession = workflowInstanceResource.getResourceResolver().adaptTo(WorkflowSession.class); - Workflow workflow = null; - try { - workflow = workflowSession.getWorkflow(workflowInstanceResource.getPath()); - if (workflow == null) { - throw new WorkflowException(String.format("Workflow instance object is null for [ %s]", workflowInstanceResource.getPath())); - } - } catch (WorkflowException e) { - log.warn("Unable to locate Workflow Instance for [ {} ] So it cannot be RUNNING and must be STALE. ", workflowInstanceResource.getPath(), e); - return "STALE"; - } - - if (workflow != null) { - final List workItems = workflow.getWorkItems(new WorkItemFilter() { - public boolean doInclude(WorkItem workItem) { - // Only include active Workflow instances (ones without an End Time) in this list - return workItem.getTimeEnded() == null; - } - }); - - if (!workItems.isEmpty()) { - // If at least 1 work item exists that does not have an end time (meaning its still active), then its RUNNING - return "RUNNING"; - } - } - - return "STALE"; - } - private void save(ResourceResolver resourceResolver) throws PersistenceException, InterruptedException { int count = 0; @@ -452,12 +467,12 @@ private void batchComplete(final ResourceResolver resourceResolver, final int ch this.save(resourceResolver); - WorkflowRemovalStatus status = this.status.get(); + WorkflowRemovalStatus removalStatus = this.status.get(); - status.setChecked(checked); - status.setRemoved(count); + removalStatus.setChecked(checked); + removalStatus.setRemoved(count); - this.status.set(status); + this.status.set(removalStatus); } private void complete(final ResourceResolver resourceResolver, final int checked, final int count) throws @@ -465,40 +480,39 @@ private void complete(final ResourceResolver resourceResolver, final int checked this.save(resourceResolver); - WorkflowRemovalStatus status = this.status.get(); + WorkflowRemovalStatus removalStatus = this.status.get(); - status.setRunning(false); - status.setChecked(checked); - status.setRemoved(count); - status.setCompletedAt(Calendar.getInstance()); + removalStatus.setRunning(false); + removalStatus.setChecked(checked); + removalStatus.setRemoved(count); + removalStatus.setCompletedAt(Calendar.getInstance()); - this.status.set(status); + this.status.set(removalStatus); } - private void error(final ResourceResolver resourceResolver) throws + private void error() throws PersistenceException, InterruptedException { - WorkflowRemovalStatus status = this.status.get(); + WorkflowRemovalStatus removalStatus = this.status.get(); - status.setRunning(false); - status.setErredAt(Calendar.getInstance()); + removalStatus.setRunning(false); + removalStatus.setErredAt(Calendar.getInstance()); - this.status.set(status); + this.status.set(removalStatus); } - private void forceQuit(final ResourceResolver resourceResolver) { - WorkflowRemovalStatus status = this.status.get(); + private void internalForceQuit() { + WorkflowRemovalStatus removalStatus = this.status.get(); - status.setRunning(false); - status.setForceQuitAt(Calendar.getInstance()); + removalStatus.setRunning(false); + removalStatus.setForceQuitAt(Calendar.getInstance()); - this.status.set(status); + this.status.set(removalStatus); // Reset force quit flag this.forceQuit.set(false); } - private List getWorkflowInstanceFolders(final ResourceResolver resourceResolver) { final List folders = new ArrayList(); final Resource root = resourceResolver.getResource(WORKFLOW_INSTANCES_PATH); diff --git a/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/removal/impl/WorkflowInstanceRemoverScheduler.java b/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/removal/impl/WorkflowInstanceRemoverScheduler.java index a4fb46bbd4..314e1e9a76 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/removal/impl/WorkflowInstanceRemoverScheduler.java +++ b/bundle/src/main/java/com/adobe/acs/commons/workflow/bulk/removal/impl/WorkflowInstanceRemoverScheduler.java @@ -88,6 +88,7 @@ public class WorkflowInstanceRemoverScheduler implements Runnable { private static final String SERVICE_NAME = "workflow-remover"; private static final Map AUTH_INFO; + static { AUTH_INFO = Collections.singletonMap(ResourceResolverFactory.SUBSERVICE, (Object) SERVICE_NAME); } @@ -149,6 +150,7 @@ public class WorkflowInstanceRemoverScheduler implements Runnable { public static final String PROP_MAX_DURATION = "max-duration"; @Override + @SuppressWarnings("squid:S2142") public final void run() { ResourceResolver adminResourceResolver = null; diff --git a/bundle/src/main/java/com/adobe/acs/commons/workflow/process/impl/BrandPortalSyncProcess.java b/bundle/src/main/java/com/adobe/acs/commons/workflow/process/impl/BrandPortalSyncProcess.java index 11d17367ee..ee6ff58b7b 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/workflow/process/impl/BrandPortalSyncProcess.java +++ b/bundle/src/main/java/com/adobe/acs/commons/workflow/process/impl/BrandPortalSyncProcess.java @@ -32,7 +32,11 @@ import com.day.cq.dam.commons.util.DamUtil; import com.day.cq.replication.ReplicationActionType; import org.apache.commons.lang.StringUtils; -import org.apache.felix.scr.annotations.*; +import org.apache.felix.scr.annotations.Component; +import org.apache.felix.scr.annotations.Properties; +import org.apache.felix.scr.annotations.Property; +import org.apache.felix.scr.annotations.Reference; +import org.apache.felix.scr.annotations.Service; import org.apache.sling.api.resource.ResourceResolver; import org.apache.sling.api.resource.ResourceResolverFactory; import org.slf4j.Logger; diff --git a/bundle/src/main/java/com/adobe/acs/commons/workflow/process/impl/ReplicateWithOptionsWorkflowProcess.java b/bundle/src/main/java/com/adobe/acs/commons/workflow/process/impl/ReplicateWithOptionsWorkflowProcess.java index 247a2c88b0..edf89d513c 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/workflow/process/impl/ReplicateWithOptionsWorkflowProcess.java +++ b/bundle/src/main/java/com/adobe/acs/commons/workflow/process/impl/ReplicateWithOptionsWorkflowProcess.java @@ -28,15 +28,20 @@ import com.adobe.acs.commons.util.visitors.ContentVisitor; import com.adobe.acs.commons.util.visitors.ResourceRunnable; import com.adobe.acs.commons.workflow.WorkflowPackageManager; -import com.day.cq.replication.*; +import com.day.cq.replication.ReplicationActionType; +import com.day.cq.replication.ReplicationOptions; +import com.day.cq.replication.Replicator; import com.day.cq.workflow.WorkflowException; import com.day.cq.workflow.WorkflowSession; import com.day.cq.workflow.exec.WorkItem; import com.day.cq.workflow.exec.WorkflowProcess; import com.day.cq.workflow.metadata.MetaDataMap; -import org.apache.commons.lang.ArrayUtils; import org.apache.commons.lang.StringUtils; -import org.apache.felix.scr.annotations.*; +import org.apache.felix.scr.annotations.Component; +import org.apache.felix.scr.annotations.Properties; +import org.apache.felix.scr.annotations.Property; +import org.apache.felix.scr.annotations.Reference; +import org.apache.felix.scr.annotations.Service; import org.apache.sling.api.resource.Resource; import org.apache.sling.api.resource.ResourceResolver; import org.slf4j.Logger; @@ -178,7 +183,10 @@ public ReplicationOptions getReplicationOptions(Resource content) { public boolean isTraverseTree() { return traverseTree; } - public boolean isThrottle() { return throttle; } + + public boolean isThrottle() { + return throttle; + } } } diff --git a/bundle/src/main/java/com/adobe/acs/commons/workflow/process/impl/SyntheticWrapperWorkflowProcess.java b/bundle/src/main/java/com/adobe/acs/commons/workflow/process/impl/SyntheticWrapperWorkflowProcess.java index 768f1265ac..56286d8e6d 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/workflow/process/impl/SyntheticWrapperWorkflowProcess.java +++ b/bundle/src/main/java/com/adobe/acs/commons/workflow/process/impl/SyntheticWrapperWorkflowProcess.java @@ -172,6 +172,8 @@ public int getSaveInterval() { return saveInterval; } - public boolean isThrottle() { return throttle; } + public boolean isThrottle() { + return throttle; + } } } \ No newline at end of file diff --git a/bundle/src/main/java/com/adobe/acs/commons/workflow/process/impl/WorkflowDelegationStep.java b/bundle/src/main/java/com/adobe/acs/commons/workflow/process/impl/WorkflowDelegationStep.java index 3b77ff3102..3e76ba2ef9 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/workflow/process/impl/WorkflowDelegationStep.java +++ b/bundle/src/main/java/com/adobe/acs/commons/workflow/process/impl/WorkflowDelegationStep.java @@ -75,7 +75,7 @@ public class WorkflowDelegationStep implements WorkflowProcess { private static final String DEFAULT_WORKFLOW_MODEL = "defaultWorkflowModel"; // When set to true, this Workflow will terminate after successful delegation. This is useful if there is a use-case when this step has WF steps behind it. - private String TERMINATE_ON_DELEGATION = "terminateWorkflowOnDelegation"; + private static final String TERMINATE_ON_DELEGATION = "terminateWorkflowOnDelegation"; @Override public void execute(WorkItem workItem, WorkflowSession workflowSession, MetaDataMap metadata) @@ -179,8 +179,8 @@ private WorkflowModel getWorkflowModel(WorkflowSession workflowSession, String w if (!workflowModelId.endsWith("/jcr:content/model")) { ResourceResolver resourceResolver = workflowHelper.getResourceResolver(workflowSession); Resource resource = resourceResolver.getResource(workflowModelId + "/jcr:content/model"); - if (resource != null && - StringUtils.equals(resource.getValueMap().get(JcrConstants.JCR_PRIMARYTYPE, String.class),"cq:WorkflowModel")) { + if (resource != null + && StringUtils.equals(resource.getValueMap().get(JcrConstants.JCR_PRIMARYTYPE, String.class),"cq:WorkflowModel")) { workflowModelId = resource.getPath(); } } diff --git a/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/SyntheticWorkflowRunner.java b/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/SyntheticWorkflowRunner.java index 610e50139d..aa3eb9bacb 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/SyntheticWorkflowRunner.java +++ b/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/SyntheticWorkflowRunner.java @@ -29,6 +29,7 @@ import java.util.Map; @ProviderType +@SuppressWarnings("squid:S1214") public interface SyntheticWorkflowRunner extends WorkflowService { String PROCESS_ARGS = "PROCESS_ARGS"; @@ -47,6 +48,7 @@ enum WorkflowProcessIdType { * @param autoSaveAfterEachWorkflowProcess persist changes to JCR after each Workflow Process completes * @param autoSaveAtEnd persist changes to JCR after all Workflow Process complete * @throws com.day.cq.workflow.WorkflowException + * @deprecated use alternate method */ @Deprecated void execute(ResourceResolver resourceResolver, @@ -69,6 +71,7 @@ void execute(ResourceResolver resourceResolver, * @param autoSaveAfterEachWorkflowProcess persist changes to JCR after each Workflow Process completes * @param autoSaveAtEnd persist changes to JCR after all Workflow Process complete * @throws com.day.cq.workflow.WorkflowException + * @deprecated use alternate method */ @Deprecated void execute(ResourceResolver resourceResolver, @@ -92,6 +95,7 @@ void execute(ResourceResolver resourceResolver, * @param autoSaveAfterEachWorkflowProcess persist changes to JCR after each Workflow Process completes * @param autoSaveAtEnd persist changes to JCR after all Workflow Process complete * @throws com.day.cq.workflow.WorkflowException + * @deprecated use alternate method */ @Deprecated void execute(ResourceResolver resourceResolver, diff --git a/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/SyntheticMetaDataMap.java b/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/SyntheticMetaDataMap.java index 29a021fa58..0d25c73e15 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/SyntheticMetaDataMap.java +++ b/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/SyntheticMetaDataMap.java @@ -54,6 +54,11 @@ public final T get(final String s, final T t) { return this.metaDataMap.get(s, t); } + @Override + public final Object get(final Object o) { + return this.metaDataMap.get(o); + } + @Override public final int size() { return this.metaDataMap.size(); @@ -74,11 +79,6 @@ public final boolean containsValue(final Object o) { return this.metaDataMap.containsValue(o); } - @Override - public final Object get(final Object o) { - return this.metaDataMap.get(o); - } - @Override public final Object put(final String s, final Object o) { return this.metaDataMap.put(s, o); diff --git a/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/SyntheticWorkflowData.java b/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/SyntheticWorkflowData.java index b55c0bbeae..0b02d1c244 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/SyntheticWorkflowData.java +++ b/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/SyntheticWorkflowData.java @@ -48,8 +48,12 @@ public final String getPayloadType() { return this.payloadType; } + /** + * @deprecated deprecated in interface + */ @Override @Deprecated + @SuppressWarnings("squid:S1149") public final Dictionary getMetaData() { final Dictionary dictionary = new Hashtable(); diff --git a/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/SyntheticWorkflowModelImpl.java b/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/SyntheticWorkflowModelImpl.java index 103570c8f7..24df365248 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/SyntheticWorkflowModelImpl.java +++ b/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/SyntheticWorkflowModelImpl.java @@ -94,7 +94,6 @@ public final Map> getSyntheticWorkflowModelData() { private boolean isValidType(WorkflowNode node) { return WorkflowNode.TYPE_START.equals(node.getType()) - || WorkflowNode.TYPE_START.equals(node.getType()) || WorkflowNode.TYPE_PROCESS.equals(node.getType()); } diff --git a/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/SyntheticWorkflowProcess.java b/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/SyntheticWorkflowProcess.java index 94e0fcc67e..e17b37d31b 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/SyntheticWorkflowProcess.java +++ b/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/SyntheticWorkflowProcess.java @@ -28,6 +28,7 @@ public class SyntheticWorkflowProcess { private Type workflowType; private WorkflowProcess cqWorkflowProcess = null; private com.adobe.granite.workflow.exec.WorkflowProcess graniteWorkflowProcess = null; + public SyntheticWorkflowProcess(WorkflowProcess workflowProcess) { this.cqWorkflowProcess = workflowProcess; this.workflowType = Type.CQ; diff --git a/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/SyntheticWorkflowRunnerImpl.java b/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/SyntheticWorkflowRunnerImpl.java index 8808cb17b7..7ca0e77a14 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/SyntheticWorkflowRunnerImpl.java +++ b/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/SyntheticWorkflowRunnerImpl.java @@ -33,7 +33,14 @@ import com.day.cq.workflow.WorkflowService; import com.day.cq.workflow.WorkflowSession; import com.day.cq.workflow.exec.WorkflowProcess; -import org.apache.felix.scr.annotations.*; +import org.apache.felix.scr.annotations.Activate; +import org.apache.felix.scr.annotations.Component; +import org.apache.felix.scr.annotations.Deactivate; +import org.apache.felix.scr.annotations.Reference; +import org.apache.felix.scr.annotations.ReferenceCardinality; +import org.apache.felix.scr.annotations.ReferencePolicy; +import org.apache.felix.scr.annotations.References; +import org.apache.felix.scr.annotations.Service; import org.apache.sling.api.resource.LoginException; import org.apache.sling.api.resource.ResourceResolver; import org.apache.sling.api.resource.ResourceResolverFactory; @@ -46,7 +53,14 @@ import javax.jcr.RepositoryException; import javax.jcr.Session; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.Dictionary; +import java.util.HashMap; +import java.util.Hashtable; +import java.util.List; +import java.util.Map; import java.util.concurrent.ConcurrentHashMap; /** @@ -94,18 +108,12 @@ public class SyntheticWorkflowRunnerImpl implements SyntheticWorkflowRunner { private ServiceRegistration accessorReg; - /** - * {@inheritDoc} - */ @Override public final void execute(final ResourceResolver resourceResolver, final String payloadPath, final String[] workflowProcessLabels) throws WorkflowException { this.execute(resourceResolver, payloadPath, workflowProcessLabels, null, false, false); } - /** - * {@inheritDoc} - */ @Override public final void execute(final ResourceResolver resourceResolver, final String payloadPath, @@ -160,11 +168,7 @@ public void execute(ResourceResolver resourceResolver, } - /** - * {@inheritDoc} - */ @Override - @Deprecated public final void execute(final ResourceResolver resourceResolver, final String payloadPath, final WorkflowProcessIdType workflowProcessIdType, @@ -182,7 +186,26 @@ public final void execute(final ResourceResolver resourceResolver, execute(resourceResolver, payloadPath, workflowSteps, autoSaveAfterEachWorkflowProcess, autoSaveAtEnd); } + @Override + public final void execute(final ResourceResolver resourceResolver, + final String payloadPath, + final SyntheticWorkflowModel syntheticWorkflowModel, + final boolean autoSaveAfterEachWorkflowProcess, + final boolean autoSaveAtEnd) throws WorkflowException { + final String[] processNames = syntheticWorkflowModel.getWorkflowProcessNames(); + final Map> processConfigs = syntheticWorkflowModel.getSyntheticWorkflowModelData(); + + execute(resourceResolver, + payloadPath, + WorkflowProcessIdType.PROCESS_NAME, + processNames, + processConfigs, + autoSaveAfterEachWorkflowProcess, + autoSaveAtEnd); + } + + @SuppressWarnings({"squid:S3776", "squid:S1163", "squid:S1143"}) private void run(final ResourceResolver resourceResolver, final String payloadPath, final List workflowSteps, @@ -363,25 +386,6 @@ private List convertToSyntheticWorkflowSteps(String[] wor return workflowSteps; } - @Override - public final void execute(final ResourceResolver resourceResolver, - final String payloadPath, - final SyntheticWorkflowModel syntheticWorkflowModel, - final boolean autoSaveAfterEachWorkflowProcess, - final boolean autoSaveAtEnd) throws WorkflowException { - - final String[] processNames = syntheticWorkflowModel.getWorkflowProcessNames(); - final Map> processConfigs = syntheticWorkflowModel.getSyntheticWorkflowModelData(); - - execute(resourceResolver, - payloadPath, - WorkflowProcessIdType.PROCESS_NAME, - processNames, - processConfigs, - autoSaveAfterEachWorkflowProcess, - autoSaveAtEnd); - } - @Override public final SyntheticWorkflowModel getSyntheticWorkflowModel(final ResourceResolver resourceResolver, final String workflowModelId, @@ -427,7 +431,7 @@ public final void stop() { * @param session the JCR Session to create the Synthetic Workflow Session from * @return the Synthetic Workflow Session */ - @Deprecated + @Override public final WorkflowSession getWorkflowSession(final Session session) { return getCqWorkflowSession(session); } @@ -471,8 +475,6 @@ public final ResourceResolver getResourceResolver(Session session) throws LoginE return resourceResolverFactory.getResourceResolver(authInfo); } - - @Deprecated @Override public final Dictionary getConfig() { return new Hashtable(); diff --git a/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/cq/SyntheticWorkItem.java b/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/cq/SyntheticWorkItem.java index 5287bb8a54..33a75729e8 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/cq/SyntheticWorkItem.java +++ b/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/cq/SyntheticWorkItem.java @@ -81,8 +81,12 @@ public final String getCurrentAssignee() { return CURRENT_ASSIGNEE; } + /** + * @deprecated deprecated in interface + */ @Deprecated @Override + @SuppressWarnings("squid:S1149") public final Dictionary getMetaData() { final Dictionary dictionary = new Hashtable(); diff --git a/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/cq/SyntheticWorkflow.java b/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/cq/SyntheticWorkflow.java index cf8a6053c7..b680890185 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/cq/SyntheticWorkflow.java +++ b/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/cq/SyntheticWorkflow.java @@ -117,8 +117,12 @@ public final void setWorkflowData(final WorkflowData workflowData) { this.workflowData.resetTo(workflowData); } + /** + * @deprecated deprecated in interface + */ @Deprecated @Override + @SuppressWarnings("squid:S1149") public final Dictionary getMetaData() { final Dictionary dictionary = new Hashtable(); diff --git a/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/cq/SyntheticWorkflowSession.java b/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/cq/SyntheticWorkflowSession.java index c2cea3745e..22662b4558 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/cq/SyntheticWorkflowSession.java +++ b/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/cq/SyntheticWorkflowSession.java @@ -99,6 +99,7 @@ public org.apache.jackrabbit.api.security.user.Authorizable getUser() { } @Override + @SuppressWarnings("squid:S1192") public final void terminateWorkflow(final Workflow workflow) throws WorkflowException { if (workflow instanceof SyntheticWorkflow) { throw new SyntheticTerminateWorkflowException("Synthetic workflow [ " + workflow.getId() + " ] terminated"); @@ -108,6 +109,7 @@ public final void terminateWorkflow(final Workflow workflow) throws WorkflowExce } @Override + @SuppressWarnings("squid:S1192") public final void complete(final WorkItem workItem, final Route route) throws WorkflowException { if (workItem instanceof SyntheticWorkItem) { throw new SyntheticCompleteWorkflowException("Synthetic workflow [ " @@ -118,6 +120,7 @@ public final void complete(final WorkItem workItem, final Route route) throws Wo } @Override + @SuppressWarnings("squid:S1192") public final void restartWorkflow(final Workflow workflow) throws WorkflowException { if (workflow instanceof SyntheticWorkflow) { throw new SyntheticRestartWorkflowException("Synthetic workflow [ " + workflow.getId() + " ] restarted"); @@ -196,6 +199,9 @@ public final Workflow startWorkflow(final WorkflowModel workflowModel, final Wor throw new UnsupportedOperationException(UNSUPPORTED_OPERATION_MESSAGE); } + /** + * @deprecated deprecated in interface + */ @Deprecated @Override public final Workflow startWorkflow(final WorkflowModel workflowModel, final WorkflowData workflowData, diff --git a/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/cq/exceptions/SyntheticCompleteWorkflowException.java b/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/cq/exceptions/SyntheticCompleteWorkflowException.java index c1f925489f..eb0eebe585 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/cq/exceptions/SyntheticCompleteWorkflowException.java +++ b/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/cq/exceptions/SyntheticCompleteWorkflowException.java @@ -22,7 +22,7 @@ import com.day.cq.workflow.WorkflowException; -@SuppressWarnings("serial") +@SuppressWarnings({"serial", "squid:S2166"}) public class SyntheticCompleteWorkflowException extends WorkflowException { public SyntheticCompleteWorkflowException(String message) { super(message); diff --git a/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/cq/exceptions/SyntheticRestartWorkflowException.java b/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/cq/exceptions/SyntheticRestartWorkflowException.java index 74b8137e14..eecc7bd0e8 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/cq/exceptions/SyntheticRestartWorkflowException.java +++ b/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/cq/exceptions/SyntheticRestartWorkflowException.java @@ -22,7 +22,7 @@ import com.day.cq.workflow.WorkflowException; -@SuppressWarnings("serial") +@SuppressWarnings({"serial", "squid:S2166"}) public class SyntheticRestartWorkflowException extends WorkflowException { public SyntheticRestartWorkflowException(String message) { super(message); diff --git a/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/cq/exceptions/SyntheticTerminateWorkflowException.java b/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/cq/exceptions/SyntheticTerminateWorkflowException.java index 6894dcaa44..3b60c5d5ea 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/cq/exceptions/SyntheticTerminateWorkflowException.java +++ b/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/cq/exceptions/SyntheticTerminateWorkflowException.java @@ -22,7 +22,7 @@ import com.day.cq.workflow.WorkflowException; -@SuppressWarnings("serial") +@SuppressWarnings({"serial", "squid:S2166"}) public class SyntheticTerminateWorkflowException extends WorkflowException { public SyntheticTerminateWorkflowException(String message) { super(message); diff --git a/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/cq/exceptions/SyntheticWorkflowModelException.java b/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/cq/exceptions/SyntheticWorkflowModelException.java index 1b609d6e94..79428ad1a1 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/cq/exceptions/SyntheticWorkflowModelException.java +++ b/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/cq/exceptions/SyntheticWorkflowModelException.java @@ -22,6 +22,7 @@ import com.day.cq.workflow.WorkflowException; +@SuppressWarnings({"serial", "squid:S2166"}) public class SyntheticWorkflowModelException extends WorkflowException { public SyntheticWorkflowModelException(String message) { super(message); diff --git a/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/granite/SyntheticWorkflowModelImpl.java b/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/granite/SyntheticWorkflowModelImpl.java index 9909ab1d39..e9696b823e 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/granite/SyntheticWorkflowModelImpl.java +++ b/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/granite/SyntheticWorkflowModelImpl.java @@ -94,7 +94,6 @@ public final Map> getSyntheticWorkflowModelData() { private boolean isValidType(WorkflowNode node) { return WorkflowNode.TYPE_START.equals(node.getType()) - || WorkflowNode.TYPE_START.equals(node.getType()) || WorkflowNode.TYPE_PROCESS.equals(node.getType()); } diff --git a/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/granite/SyntheticWorkflowSession.java b/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/granite/SyntheticWorkflowSession.java index f0126179de..573901c54c 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/granite/SyntheticWorkflowSession.java +++ b/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/granite/SyntheticWorkflowSession.java @@ -75,6 +75,7 @@ public SyntheticWorkflowSession(SyntheticWorkflowRunnerImpl workflowService, Ses } @Override + @SuppressWarnings("squid:S1192") public final void terminateWorkflow(final Workflow workflow) throws WorkflowException { if (workflow instanceof SyntheticWorkflow) { throw new SyntheticTerminateWorkflowException("Synthetic workflow [ " + workflow.getId() + " ] terminated"); @@ -84,6 +85,7 @@ public final void terminateWorkflow(final Workflow workflow) throws WorkflowExce } @Override + @SuppressWarnings("squid:S1192") public final void complete(final WorkItem workItem, final Route route) throws WorkflowException { if (workItem instanceof SyntheticWorkItem) { throw new SyntheticCompleteWorkflowException("Synthetic workflow [ " @@ -94,6 +96,7 @@ public final void complete(final WorkItem workItem, final Route route) throws Wo } @Override + @SuppressWarnings("squid:S1192") public final void restartWorkflow(final Workflow workflow) throws WorkflowException { if (workflow instanceof SyntheticWorkflow) { throw new SyntheticRestartWorkflowException("Synthetic workflow [ " + workflow.getId() + " ] restarted"); diff --git a/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/granite/exceptions/SyntheticCompleteWorkflowException.java b/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/granite/exceptions/SyntheticCompleteWorkflowException.java index 6b0ee26e44..7421fcf287 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/granite/exceptions/SyntheticCompleteWorkflowException.java +++ b/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/granite/exceptions/SyntheticCompleteWorkflowException.java @@ -22,7 +22,7 @@ import com.adobe.granite.workflow.WorkflowException; -@SuppressWarnings("serial") +@SuppressWarnings({"serial", "squid:S2166"}) public class SyntheticCompleteWorkflowException extends WorkflowException { public SyntheticCompleteWorkflowException(String message) { super(message); diff --git a/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/granite/exceptions/SyntheticRestartWorkflowException.java b/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/granite/exceptions/SyntheticRestartWorkflowException.java index dfa6f7bb65..859b0c86b7 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/granite/exceptions/SyntheticRestartWorkflowException.java +++ b/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/granite/exceptions/SyntheticRestartWorkflowException.java @@ -22,7 +22,7 @@ import com.adobe.granite.workflow.WorkflowException; -@SuppressWarnings("serial") +@SuppressWarnings({"serial", "squid:S2166"}) public class SyntheticRestartWorkflowException extends WorkflowException { public SyntheticRestartWorkflowException(String message) { super(message); diff --git a/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/granite/exceptions/SyntheticTerminateWorkflowException.java b/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/granite/exceptions/SyntheticTerminateWorkflowException.java index 20cba5f5e8..f7e284e5a4 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/granite/exceptions/SyntheticTerminateWorkflowException.java +++ b/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/granite/exceptions/SyntheticTerminateWorkflowException.java @@ -22,7 +22,7 @@ import com.adobe.granite.workflow.WorkflowException; -@SuppressWarnings("serial") +@SuppressWarnings({"serial", "squid:S2166"}) public class SyntheticTerminateWorkflowException extends WorkflowException { public SyntheticTerminateWorkflowException(String message) { super(message); diff --git a/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/granite/exceptions/SyntheticWorkflowModelException.java b/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/granite/exceptions/SyntheticWorkflowModelException.java index f0b93a064d..8c91ecc515 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/granite/exceptions/SyntheticWorkflowModelException.java +++ b/bundle/src/main/java/com/adobe/acs/commons/workflow/synthetic/impl/granite/exceptions/SyntheticWorkflowModelException.java @@ -22,6 +22,7 @@ import com.adobe.granite.workflow.WorkflowException; +@SuppressWarnings({"serial", "squid:S2166"}) public class SyntheticWorkflowModelException extends WorkflowException { public SyntheticWorkflowModelException(String message) { super(message); diff --git a/bundle/src/main/java/com/adobe/acs/commons/xss/XSSFunctions.java b/bundle/src/main/java/com/adobe/acs/commons/xss/XSSFunctions.java index a573af4015..d8098c943f 100644 --- a/bundle/src/main/java/com/adobe/acs/commons/xss/XSSFunctions.java +++ b/bundle/src/main/java/com/adobe/acs/commons/xss/XSSFunctions.java @@ -29,21 +29,9 @@ * XSSAPI JSP Function wrappers. */ @ProviderType +@SuppressWarnings("checkstyle:abbreviationaswordinname") public final class XSSFunctions { - private static final String LINK_PREFIX = ""; - - private static final String MANGLE_NAMESPACE_IN_PREFIX = "/_"; - - private static final String MANGLE_NAMESPACE_IN_SUFFIX = "_"; - - private static final String MANGLE_NAMESPACE_OUT = "/([^:/]+):"; - - private static final String MANGLE_NAMESPACE_OUT_SUFFIX = ":"; - - private static final Pattern MANGLE_NAMESPACE_PATTERN = Pattern.compile(MANGLE_NAMESPACE_OUT); - /** * Encode a string for HTML. * diff --git a/bundle/src/test/java/com/adobe/acs/commons/images/impl/ProgressiveJPEGTest.java b/bundle/src/test/java/com/adobe/acs/commons/images/impl/ProgressiveJpegTest.java similarity index 96% rename from bundle/src/test/java/com/adobe/acs/commons/images/impl/ProgressiveJPEGTest.java rename to bundle/src/test/java/com/adobe/acs/commons/images/impl/ProgressiveJpegTest.java index f7739514fa..d7fd35873b 100644 --- a/bundle/src/test/java/com/adobe/acs/commons/images/impl/ProgressiveJPEGTest.java +++ b/bundle/src/test/java/com/adobe/acs/commons/images/impl/ProgressiveJpegTest.java @@ -33,7 +33,7 @@ import static org.junit.Assert.assertArrayEquals; -public class ProgressiveJPEGTest { +public class ProgressiveJpegTest { private BufferedImage simpleImage; @@ -56,7 +56,7 @@ public void testWrite_sameAsLayerWrite() throws Exception { private static byte[] writeProgressiveImage(BufferedImage image) throws IOException { ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); Layer layer = new Layer(image); - ProgressiveJPEG.write(layer, 1, byteOut); + ProgressiveJpeg.write(layer, 1, byteOut); return byteOut.toByteArray(); } diff --git a/bundle/src/test/java/com/adobe/acs/commons/mcp/impl/processes/BrokenLinksTest.java b/bundle/src/test/java/com/adobe/acs/commons/mcp/impl/processes/BrokenLinksTest.java index d579311ef9..12e4daead0 100644 --- a/bundle/src/test/java/com/adobe/acs/commons/mcp/impl/processes/BrokenLinksTest.java +++ b/bundle/src/test/java/com/adobe/acs/commons/mcp/impl/processes/BrokenLinksTest.java @@ -24,7 +24,7 @@ import org.apache.sling.api.resource.*; import org.apache.sling.testing.mock.sling.ResourceResolverType; import org.apache.sling.testing.mock.sling.junit.SlingContext; -import static com.adobe.acs.commons.mcp.impl.processes.BrokenLinksReport.REPORT; +import static com.adobe.acs.commons.mcp.impl.processes.BrokenLinksReport.Report; import static com.adobe.acs.commons.mcp.impl.processes.BrokenLinksReport.collectBrokenReferences; import static com.adobe.acs.commons.mcp.impl.processes.BrokenLinksReport.collectPaths; import org.junit.Before; @@ -105,11 +105,11 @@ public void reportBrokenReferences() throws Exception { instance.init(rr, values); instance.run(rr); - Map> reportData = tool.getReportData(); + Map> reportData = tool.getReportData(); assertEquals(3, reportData.size()); - assertEquals("/content/pageC", reportData.get("/content/pageA/jcr:content/ref3").get(REPORT.reference)); - assertEquals("/content/pageD", reportData.get("/content/pageB/jcr:content/ref2").get(REPORT.reference)); - assertEquals("/content/pageE", reportData.get("/content/pageB/jcr:content/ref3").get(REPORT.reference)); + assertEquals("/content/pageC", reportData.get("/content/pageA/jcr:content/ref3").get(Report.reference)); + assertEquals("/content/pageD", reportData.get("/content/pageB/jcr:content/ref2").get(Report.reference)); + assertEquals("/content/pageE", reportData.get("/content/pageB/jcr:content/ref3").get(Report.reference)); assertFalse("ignoredRef is in the exclude list", reportData.containsKey("/content/pageB/jcr:content/ignoredRef")); } diff --git a/bundle/src/test/java/com/adobe/acs/commons/mcp/impl/processes/PageRelocatorTest.java b/bundle/src/test/java/com/adobe/acs/commons/mcp/impl/processes/PageRelocatorTest.java index 33e3a1f4fc..40cbe81ab7 100644 --- a/bundle/src/test/java/com/adobe/acs/commons/mcp/impl/processes/PageRelocatorTest.java +++ b/bundle/src/test/java/com/adobe/acs/commons/mcp/impl/processes/PageRelocatorTest.java @@ -125,7 +125,7 @@ private void initInstance(ProcessInstance instance, ResourceResolver rr) throws values.put("destinationPath", "/content/pageB"); values.put("maxReferences", "0"); values.put("mode", PageRelocator.Mode.MOVE.toString()); - values.put("publishMethod", PageRelocator.PUBLISH_METHOD.SELF_MANAGED.toString()); + values.put("publishMethod", PageRelocator.PublishMethod.SELF_MANAGED.toString()); values.put("createVerionsOnReplicate", "false"); values.put("updateStatus", "true"); values.put("dryRun", "false"); diff --git a/bundle/src/test/java/com/adobe/acs/commons/rewriter/impl/SAXElementUtilsTest.java b/bundle/src/test/java/com/adobe/acs/commons/rewriter/impl/SaxElementUtilsTest.java similarity index 74% rename from bundle/src/test/java/com/adobe/acs/commons/rewriter/impl/SAXElementUtilsTest.java rename to bundle/src/test/java/com/adobe/acs/commons/rewriter/impl/SaxElementUtilsTest.java index cc0f55a567..3534bb4272 100755 --- a/bundle/src/test/java/com/adobe/acs/commons/rewriter/impl/SAXElementUtilsTest.java +++ b/bundle/src/test/java/com/adobe/acs/commons/rewriter/impl/SaxElementUtilsTest.java @@ -29,43 +29,43 @@ import org.xml.sax.helpers.AttributesImpl; @RunWith(MockitoJUnitRunner.class) -public class SAXElementUtilsTest { +public class SaxElementUtilsTest { @Test public void testIsCSS() throws Exception { assertTrue("CSS Happy Path", - SAXElementUtils.isCSS("link", + SaxElementUtils.isCss("link", makeAtts( "href", "/css.css", "type", "text/css"))); assertFalse("CSS - not a link", - SAXElementUtils.isCSS("notlink", + SaxElementUtils.isCss("notlink", makeAtts( "href", "/css.css", "type", "text/css"))); assertFalse("CSS - not a path to css file", - SAXElementUtils.isCSS("link", + SaxElementUtils.isCss("link", makeAtts( "href", "/css.notcss", "type", "text/css"))); assertFalse("CSS - relative path", - SAXElementUtils.isCSS("link", + SaxElementUtils.isCss("link", makeAtts( "href", "css.css", "type", "text/css"))); assertFalse("CSS - external path", - SAXElementUtils.isCSS("link", + SaxElementUtils.isCss("link", makeAtts( "href", "http://www.adobe.com/css.css", "type", "text/css"))); assertFalse("CSS - wrongtype", - SAXElementUtils.isCSS("link", + SaxElementUtils.isCss("link", makeAtts( "href", "/css.css", "type", "text/notcss"))); @@ -74,41 +74,41 @@ public void testIsCSS() throws Exception { @Test public void testIsJavascript() throws Exception { assertTrue("JS Happy Path", - SAXElementUtils.isJavaScript("script", + SaxElementUtils.isJavaScript("script", makeAtts( "src", "/js.js", - "type", SAXElementUtils.JS_TYPE))); + "type", SaxElementUtils.JS_TYPE))); assertFalse("JS - not a link", - SAXElementUtils.isJavaScript("notscript", + SaxElementUtils.isJavaScript("notscript", makeAtts( "src", "/js.js", - "type", SAXElementUtils.JS_TYPE))); + "type", SaxElementUtils.JS_TYPE))); assertFalse("JS - not a path to js file", - SAXElementUtils.isJavaScript("script", + SaxElementUtils.isJavaScript("script", makeAtts( "src", "/js.notjs", - "type", SAXElementUtils.JS_TYPE))); + "type", SaxElementUtils.JS_TYPE))); assertFalse("JS - relative path", - SAXElementUtils.isJavaScript("script", + SaxElementUtils.isJavaScript("script", makeAtts( "src", "js.js", - "type", SAXElementUtils.JS_TYPE))); + "type", SaxElementUtils.JS_TYPE))); assertFalse("JS - external path", - SAXElementUtils.isJavaScript("script", + SaxElementUtils.isJavaScript("script", makeAtts( "src", "http://www.adobe.com/js.js", - "type", SAXElementUtils.JS_TYPE))); + "type", SaxElementUtils.JS_TYPE))); assertFalse("JS - wrongtype", - SAXElementUtils.isJavaScript("script", + SaxElementUtils.isJavaScript("script", makeAtts( "src", "/js.js", - "type", "not" + SAXElementUtils.JS_TYPE))); + "type", "not" + SaxElementUtils.JS_TYPE))); } private Attributes makeAtts( String... strings ) { diff --git a/content/src/main/content/jcr_root/apps/acs-commons/components/utilities/errorpagehandler/preview/clientlibs/css/errorpagehandler.css b/content/src/main/content/jcr_root/apps/acs-commons/components/utilities/errorpagehandler/preview/clientlibs/css/errorpagehandler.css index 94320464c4..040fb935ec 100644 --- a/content/src/main/content/jcr_root/apps/acs-commons/components/utilities/errorpagehandler/preview/clientlibs/css/errorpagehandler.css +++ b/content/src/main/content/jcr_root/apps/acs-commons/components/utilities/errorpagehandler/preview/clientlibs/css/errorpagehandler.css @@ -99,7 +99,7 @@ } #error-page-handler .message h1 { - border-bottom-width: 0px; + border-bottom-width: 0; } #error-page-handler .collapsed { diff --git a/content/src/main/content/jcr_root/apps/acs-commons/widgets/source/js/multipanel.js b/content/src/main/content/jcr_root/apps/acs-commons/widgets/source/js/multipanel.js index 6358a1fe6e..e1c2c9fee0 100644 --- a/content/src/main/content/jcr_root/apps/acs-commons/widgets/source/js/multipanel.js +++ b/content/src/main/content/jcr_root/apps/acs-commons/widgets/source/js/multipanel.js @@ -52,7 +52,7 @@ ACS.CQ.MultiFieldPanel = CQ.Ext.extend(CQ.Ext.Panel, { var multifield = this.findParentByType('multifield'), dialog = this.findParentByType('dialog'); - if(ACS.CQ.MultiFieldPanel.xtype == this.xtype){ + if(ACS.CQ.MultiFieldPanel.xtype === this.xtype){ this.panelValue = new CQ.Ext.form.Hidden({ name: this.name }); diff --git a/content/src/main/content/jcr_root/apps/acs-commons/widgets/source/js/node-multi-panel.js b/content/src/main/content/jcr_root/apps/acs-commons/widgets/source/js/node-multi-panel.js index a13a38cc53..a0cf525fc6 100644 --- a/content/src/main/content/jcr_root/apps/acs-commons/widgets/source/js/node-multi-panel.js +++ b/content/src/main/content/jcr_root/apps/acs-commons/widgets/source/js/node-multi-panel.js @@ -85,7 +85,7 @@ ACS.CQ.NodeMultiFieldPanel = CQ.Ext.extend(ACS.CQ.MultiFieldPanel, { multi = this.findParentByType("multifield"), multiPanels = multi.findByType("nodemultifieldpanel"); - if(multiPanels.length == 1){ + if(multiPanels.length === 1){ item = value[counter]; }else{ item = value; @@ -101,7 +101,7 @@ ACS.CQ.NodeMultiFieldPanel = CQ.Ext.extend(ACS.CQ.MultiFieldPanel, { i.fireEvent('loadcontent', this); }); - if(multiPanels.length == 1){ + if(multiPanels.length === 1){ while(true){ item = value[++counter]; diff --git a/content/src/main/content/jcr_root/etc/clientlibs/acs-commons/rte-rtl-switch/js/RightToLeftKeyboardShortcut.js b/content/src/main/content/jcr_root/etc/clientlibs/acs-commons/rte-rtl-switch/js/RightToLeftKeyboardShortcut.js index 1ca2e73658..724f22aedb 100644 --- a/content/src/main/content/jcr_root/etc/clientlibs/acs-commons/rte-rtl-switch/js/RightToLeftKeyboardShortcut.js +++ b/content/src/main/content/jcr_root/etc/clientlibs/acs-commons/rte-rtl-switch/js/RightToLeftKeyboardShortcut.js @@ -96,5 +96,4 @@ eventsRegistered.push(body); } }); -}) -(window.jQuery); \ No newline at end of file +})(window.jQuery); \ No newline at end of file