1 /*
2 * This file is part of dependency-check-core.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *
16 * Copyright (c) 2012 Jeremy Long. All Rights Reserved.
17 */
18 package org.owasp.dependencycheck.analyzer;
19
20 import org.owasp.dependencycheck.Engine;
21 import org.owasp.dependencycheck.analyzer.exception.AnalysisException;
22 import org.owasp.dependencycheck.dependency.Dependency;
23 import org.owasp.dependencycheck.exception.InitializationException;
24 import org.owasp.dependencycheck.utils.InvalidSettingException;
25 import org.owasp.dependencycheck.utils.Settings;
26 import org.slf4j.Logger;
27 import org.slf4j.LoggerFactory;
28
29 /**
30 * Base class for analyzers to avoid code duplication of initialize and close as
31 * most analyzers do not need these methods.
32 *
33 * @author Jeremy Long
34 */
35 public abstract class AbstractAnalyzer implements Analyzer {
36
37 /**
38 * The logger.
39 */
40 private static final Logger LOGGER = LoggerFactory.getLogger(AbstractAnalyzer.class);
41 /**
42 * A flag indicating whether or not the analyzer is enabled.
43 */
44 private volatile boolean enabled = true;
45
46 /**
47 * Get the value of enabled.
48 *
49 * @return the value of enabled
50 */
51 @Override
52 public boolean isEnabled() {
53 return enabled;
54 }
55
56 /**
57 * Set the value of enabled.
58 *
59 * @param enabled new value of enabled
60 */
61 public void setEnabled(boolean enabled) {
62 this.enabled = enabled;
63 }
64
65 /**
66 * <p>
67 * Returns the setting key to determine if the analyzer is enabled.</p>
68 *
69 * @return the key for the analyzer's enabled property
70 */
71 protected abstract String getAnalyzerEnabledSettingKey();
72
73 /**
74 * Analyzes a given dependency. If the dependency is an archive, such as a
75 * WAR or EAR, the contents are extracted, scanned, and added to the list of
76 * dependencies within the engine.
77 *
78 * @param dependency the dependency to analyze
79 * @param engine the engine scanning
80 * @throws AnalysisException thrown if there is an analysis exception
81 */
82 protected abstract void analyzeDependency(Dependency dependency, Engine engine) throws AnalysisException;
83
84 /**
85 * Initializes a given Analyzer. This will be skipped if the analyzer is disabled.
86 *
87 * @throws InitializationException thrown if there is an exception
88 */
89 protected void initializeAnalyzer() throws InitializationException {
90 }
91
92 /**
93 * Closes a given Analyzer. This will be skipped if the analyzer is disabled.
94 *
95 * @throws Exception thrown if there is an exception
96 */
97 protected void closeAnalyzer() throws Exception {
98 }
99
100
101 /**
102 * Analyzes a given dependency. If the dependency is an archive, such as a
103 * WAR or EAR, the contents are extracted, scanned, and added to the list of
104 * dependencies within the engine.
105 *
106 * @param dependency the dependency to analyze
107 * @param engine the engine scanning
108 * @throws AnalysisException thrown if there is an analysis exception
109 */
110 @Override
111 public final void analyze(Dependency dependency, Engine engine) throws AnalysisException {
112 if (this.isEnabled()) {
113 analyzeDependency(dependency, engine);
114 }
115 }
116
117 /**
118 * The initialize method does nothing for this Analyzer.
119 *
120 * @throws InitializationException thrown if there is an exception
121 */
122 @Override
123 public final void initialize() throws InitializationException {
124 final String key = getAnalyzerEnabledSettingKey();
125 try {
126 this.setEnabled(Settings.getBoolean(key, true));
127 } catch (InvalidSettingException ex) {
128 LOGGER.warn("Invalid setting for property '{}'", key);
129 LOGGER.debug("", ex);
130 }
131
132 if (isEnabled()) {
133 initializeAnalyzer();
134 } else {
135 LOGGER.debug("{} has been disabled", getName());
136 }
137 }
138
139 /**
140 * The close method does nothing for this Analyzer.
141 *
142 * @throws Exception thrown if there is an exception
143 */
144 @Override
145 public final void close() throws Exception {
146 if (isEnabled()) {
147 closeAnalyzer();
148 }
149 }
150
151
152 /**
153 * The default is to support parallel processing.
154 *
155 * @return true
156 */
157 @Override
158 public boolean supportsParallelProcessing() {
159 return true;
160 }
161 }