|
From: <sta...@us...> - 2007-12-27 13:40:19
|
Revision: 194
http://jsmiparser.svn.sourceforge.net/jsmiparser/?rev=194&view=rev
Author: stappend
Date: 2007-12-27 05:40:17 -0800 (Thu, 27 Dec 2007)
Log Message:
-----------
Support parsing old SMIv1 mibs using the standard SMIv2 definitions (eg: Counter becomes Counter32)
Modified Paths:
--------------
trunk/jsmiparser-api/src/main/java/org/jsmiparser/parser/SmiDefaultParser.java
trunk/jsmiparser-api/src/main/java/org/jsmiparser/smi/SmiConstants.java
trunk/jsmiparser-api/src/main/java/org/jsmiparser/smi/SmiImports.java
trunk/jsmiparser-api/src/main/java/org/jsmiparser/smi/SmiMib.java
trunk/jsmiparser-api/src/main/java/org/jsmiparser/smi/SmiModule.java
trunk/jsmiparser-api/src/test/java/org/jsmiparser/phase/file/antlr/IFParseTest.java
trunk/jsmiparser-api/src/test/java/org/jsmiparser/smi/SmiModuleTest.java
trunk/jsmiparser-api/src/test/resources/org/jsmiparser/SpringTest.xml
Added Paths:
-----------
trunk/jsmiparser-api/src/main/java/org/jsmiparser/smi/SmiOptions.java
trunk/jsmiparser-api/src/test/java/org/jsmiparser/MixedV1V2Test.java
Modified: trunk/jsmiparser-api/src/main/java/org/jsmiparser/parser/SmiDefaultParser.java
===================================================================
--- trunk/jsmiparser-api/src/main/java/org/jsmiparser/parser/SmiDefaultParser.java 2007-12-27 12:15:22 UTC (rev 193)
+++ trunk/jsmiparser-api/src/main/java/org/jsmiparser/parser/SmiDefaultParser.java 2007-12-27 13:40:17 UTC (rev 194)
@@ -24,6 +24,7 @@
import org.jsmiparser.phase.xref.XRefProblemReporter;
import org.jsmiparser.smi.SmiJavaCodeNamingStrategy;
import org.jsmiparser.smi.SmiMib;
+import org.jsmiparser.smi.SmiOptions;
import org.jsmiparser.util.problem.DefaultProblemEventHandler;
import org.jsmiparser.util.problem.DefaultProblemReporterFactory;
import org.jsmiparser.util.problem.ProblemEventHandler;
@@ -36,6 +37,7 @@
protected FileParserPhase m_fileParserPhase;
protected XRefPhase m_xRefPhase;
protected ErrorCheckPhase m_errorCheckPhase;
+ protected SmiOptions options = new SmiOptions();
public SmiDefaultParser() {
this(new DefaultProblemEventHandler());
@@ -50,7 +52,7 @@
}
public SmiMib parse() throws SmiException {
- SmiMib mib = new SmiMib(new SmiJavaCodeNamingStrategy("org.jsmiparser.mib")); // TODO
+ SmiMib mib = new SmiMib(options, new SmiJavaCodeNamingStrategy("org.jsmiparser.mib")); // TODO
Phase[] phases = new Phase[]{getFileParserPhase(), getXRefPhase(), getErrorCheckPhase()};
for (Phase phase : phases) {
@@ -63,6 +65,14 @@
return mib;
}
+ public SmiOptions getOptions() {
+ return options;
+ }
+
+ public void setOptions(SmiOptions options) {
+ this.options = options;
+ }
+
protected FileParserPhase createFileParserPhase() {
return new FileParserPhase(getProblemReporterFactory().create(FileParserProblemReporter.class));
}
Modified: trunk/jsmiparser-api/src/main/java/org/jsmiparser/smi/SmiConstants.java
===================================================================
--- trunk/jsmiparser-api/src/main/java/org/jsmiparser/smi/SmiConstants.java 2007-12-27 12:15:22 UTC (rev 193)
+++ trunk/jsmiparser-api/src/main/java/org/jsmiparser/smi/SmiConstants.java 2007-12-27 13:40:17 UTC (rev 194)
@@ -27,7 +27,7 @@
public static final Set<String> SMI_DEFINITION_MODULE_NAMES = initSmiDefinitionModuleNames();
- public static final SmiMib JSMIPARSER_HARDCODED_MIB = new SmiMib(null);
+ public static final SmiMib JSMIPARSER_HARDCODED_MIB = new SmiMib(new SmiOptions(), null);
public static final SmiModule JSMIPARSER_HARDCODED_MODULE = new SmiModule(JSMIPARSER_HARDCODED_MIB, new IdToken(null, "JSMIPARSER_HARDCODED_MIB"));
public static final SmiType OBJECT_IDENTIFIER_TYPE = newType("OBJECT IDENTIFIER", SmiPrimitiveType.OBJECT_IDENTIFIER);
Modified: trunk/jsmiparser-api/src/main/java/org/jsmiparser/smi/SmiImports.java
===================================================================
--- trunk/jsmiparser-api/src/main/java/org/jsmiparser/smi/SmiImports.java 2007-12-27 12:15:22 UTC (rev 193)
+++ trunk/jsmiparser-api/src/main/java/org/jsmiparser/smi/SmiImports.java 2007-12-27 13:40:17 UTC (rev 194)
@@ -15,28 +15,62 @@
*/
package org.jsmiparser.smi;
+import org.jsmiparser.phase.xref.XRefProblemReporter;
import org.jsmiparser.util.location.Location;
+import org.jsmiparser.util.pair.Pair;
import org.jsmiparser.util.token.IdToken;
-import org.jsmiparser.phase.xref.XRefProblemReporter;
-import java.util.ArrayList;
+import java.util.Collection;
import java.util.Collections;
+import java.util.LinkedHashMap;
import java.util.List;
public class SmiImports {
+ // straight from libsmi, extended with macro definitions
+ static final String[] V1_V2_MAP = {
+ "RFC1155-SMI", "internet", "SNMPv2-SMI", "internet",
+ "RFC1155-SMI", "directory", "SNMPv2-SMI", "directory",
+ "RFC1155-SMI", "mgmt", "SNMPv2-SMI", "mgmt",
+ "RFC1155-SMI", "experimental", "SNMPv2-SMI", "experimental",
+ "RFC1155-SMI", "private", "SNMPv2-SMI", "private",
+ "RFC1155-SMI", "enterprises", "SNMPv2-SMI", "enterprises",
+ "RFC1155-SMI", "IpAddress", "SNMPv2-SMI", "IpAddress",
+ "RFC1155-SMI", "Counter", "SNMPv2-SMI", "Counter32",
+ "RFC1155-SMI", "Gauge", "SNMPv2-SMI", "Gauge32",
+ "RFC1155-SMI", "TimeTicks", "SNMPv2-SMI", "TimeTicks",
+ "RFC1155-SMI", "Opaque", "SNMPv2-SMI", "Opaque",
+ "RFC1065-SMI", "internet", "SNMPv2-SMI", "internet",
+ "RFC1065-SMI", "directory", "SNMPv2-SMI", "directory",
+ "RFC1065-SMI", "mgmt", "SNMPv2-SMI", "mgmt",
+ "RFC1065-SMI", "experimental", "SNMPv2-SMI", "experimental",
+ "RFC1065-SMI", "private", "SNMPv2-SMI", "private",
+ "RFC1065-SMI", "enterprises", "SNMPv2-SMI", "enterprises",
+ "RFC1065-SMI", "IpAddress", "SNMPv2-SMI", "IpAddress",
+ "RFC1065-SMI", "Counter", "SNMPv2-SMI", "Counter32",
+ "RFC1065-SMI", "Gauge", "SNMPv2-SMI", "Gauge32",
+ "RFC1065-SMI", "TimeTicks", "SNMPv2-SMI", "TimeTicks",
+ "RFC1065-SMI", "Opaque", "SNMPv2-SMI", "Opaque",
+ "RFC1213-MIB", "mib-2", "SNMPv2-SMI", "mib-2",
+ "RFC1213-MIB", "DisplayString", "SNMPv2-TC", "DisplayString",
+
+ "RFC-1212", "OBJECT-TYPE", "SNMPv2-SMI", "OBJECT-TYPE"
+ // What to do with TRAP-TYPE?
+ };
+
+
private final SmiModule m_importerModule;
private final IdToken m_moduleToken;
private final List<IdToken> m_symbolTokens;
private SmiModule m_module;
- private List<SmiSymbol> m_symbols;
+ private LinkedHashMap<String, SmiSymbol> m_symbolMap = new LinkedHashMap<String, SmiSymbol>();
public SmiImports(SmiModule importerModule, IdToken moduleToken, List<IdToken> symbolTokens) {
- assert(importerModule != null);
- assert(moduleToken != null);
- assert(symbolTokens != null);
-
+ assert (importerModule != null);
+ assert (moduleToken != null);
+ assert (symbolTokens != null);
+
m_importerModule = importerModule;
m_moduleToken = moduleToken;
@@ -47,8 +81,8 @@
return m_module;
}
- public List<SmiSymbol> getSymbols() {
- return m_symbols;
+ public Collection<SmiSymbol> getSymbols() {
+ return m_symbolMap.values();
}
public IdToken getModuleToken() {
@@ -64,27 +98,61 @@
}
public SmiSymbol find(String id) {
- for (SmiSymbol symbol : m_symbols) {
- if (symbol.getId().equals(id)) {
- return symbol;
- }
- }
- return null;
+ return m_symbolMap.get(id);
}
public void resolveImports(XRefProblemReporter reporter) {
- List<SmiSymbol> symbols = new ArrayList<SmiSymbol>();
- m_module = m_importerModule.getMib().resolveModule(m_moduleToken, reporter);
+ m_module = m_importerModule.getMib().findModule(m_moduleToken.getId());
if (m_module != null) {
for (IdToken idToken : getSymbolTokens()) {
SmiSymbol symbol = getModule().findSymbol(idToken.getId());
if (symbol != null) {
- symbols.add(symbol);
+ m_symbolMap.put(idToken.getId(), symbol);
} else {
reporter.reportCannotFindImportedSymbol(idToken, m_moduleToken);
}
}
+ } else {
+ if (m_importerModule.getMib().getOptions().isConvertV1ImportsToV2()) {
+ resolveV1Imports(reporter);
+ } else {
+ reporter.reportCannotFindModule(m_moduleToken);
+ }
}
- m_symbols = Collections.unmodifiableList(symbols);
}
+
+ private void resolveV1Imports(XRefProblemReporter reporter) {
+ for (IdToken idToken : getSymbolTokens()) {
+ Pair<String, String> v2Definition = findV2Definition(idToken.getId());
+ if (v2Definition != null) {
+ // notice we are not setting the m_module in this case!
+ SmiModule module = m_importerModule.getMib().findModule(v2Definition.getFirst());
+ if (module != null) {
+ SmiSymbol symbol = module.findSymbol(v2Definition.getSecond());
+ if (symbol != null) {
+ m_symbolMap.put(idToken.getId(), symbol);
+ } else {
+ reporter.reportCannotFindImportedSymbol(idToken, m_moduleToken);
+ }
+ } else {
+ reporter.reportCannotFindModule(m_moduleToken);
+ }
+ } else {
+ reporter.reportCannotFindImportedSymbol(idToken, m_moduleToken);
+ }
+ }
+ }
+
+ public Pair<String, String> findV2Definition(String id) {
+ for (int i = 0; i < V1_V2_MAP.length; i += 4) {
+ String oldMib = V1_V2_MAP[i];
+ String oldId = V1_V2_MAP[i + 1];
+ if (oldMib.equals(m_moduleToken.getId())
+ && oldId.equals(id)) {
+ return new Pair<String, String>(V1_V2_MAP[i + 2], V1_V2_MAP[i + 3]);
+ }
+ }
+ return null;
+ }
+
}
Modified: trunk/jsmiparser-api/src/main/java/org/jsmiparser/smi/SmiMib.java
===================================================================
--- trunk/jsmiparser-api/src/main/java/org/jsmiparser/smi/SmiMib.java 2007-12-27 12:15:22 UTC (rev 193)
+++ trunk/jsmiparser-api/src/main/java/org/jsmiparser/smi/SmiMib.java 2007-12-27 13:40:17 UTC (rev 194)
@@ -28,6 +28,7 @@
public class SmiMib {
private Map<String, SmiModule> m_moduleMap = new LinkedHashMap<String, SmiModule>();
+ private final SmiOptions m_options;
private SmiCodeNamingStrategy m_codeNamingStrategy;
private SmiOidNode m_rootNode;
@@ -45,7 +46,9 @@
int m_dummyOidNodesCount;
private SmiModule m_internalModule;
- public SmiMib(SmiCodeNamingStrategy codeNamingStrategy) {
+ public SmiMib(SmiOptions options, SmiCodeNamingStrategy codeNamingStrategy) {
+ m_options = options;
+
//assert(codeNamingStrategy != null);
m_codeNamingStrategy = codeNamingStrategy;
@@ -77,7 +80,10 @@
public Collection<SmiModule> getModules() {
return m_moduleMap.values();
+ }
+ public SmiOptions getOptions() {
+ return m_options;
}
public SmiCodeNamingStrategy getCodeNamingStrategy() {
Modified: trunk/jsmiparser-api/src/main/java/org/jsmiparser/smi/SmiModule.java
===================================================================
--- trunk/jsmiparser-api/src/main/java/org/jsmiparser/smi/SmiModule.java 2007-12-27 12:15:22 UTC (rev 193)
+++ trunk/jsmiparser-api/src/main/java/org/jsmiparser/smi/SmiModule.java 2007-12-27 13:40:17 UTC (rev 194)
@@ -394,10 +394,9 @@
private SmiSymbol findImportedSymbol(String id) {
for (SmiImports imports : m_imports) {
- for (SmiSymbol symbol : imports.getSymbols()) {
- if (symbol.getId().equals(id)) {
- return symbol;
- }
+ SmiSymbol symbol = imports.find(id);
+ if (symbol != null) {
+ return symbol;
}
}
return null;
Added: trunk/jsmiparser-api/src/main/java/org/jsmiparser/smi/SmiOptions.java
===================================================================
--- trunk/jsmiparser-api/src/main/java/org/jsmiparser/smi/SmiOptions.java (rev 0)
+++ trunk/jsmiparser-api/src/main/java/org/jsmiparser/smi/SmiOptions.java 2007-12-27 13:40:17 UTC (rev 194)
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2007 Davy Verstappen.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jsmiparser.smi;
+
+public class SmiOptions {
+
+ private boolean m_convertV1ImportsToV2;
+
+ public boolean isConvertV1ImportsToV2() {
+ return m_convertV1ImportsToV2;
+ }
+
+ public void setConvertV1ImportsToV2(boolean convertV1ImportsToV2) {
+ m_convertV1ImportsToV2 = convertV1ImportsToV2;
+ }
+}
Added: trunk/jsmiparser-api/src/test/java/org/jsmiparser/MixedV1V2Test.java
===================================================================
--- trunk/jsmiparser-api/src/test/java/org/jsmiparser/MixedV1V2Test.java (rev 0)
+++ trunk/jsmiparser-api/src/test/java/org/jsmiparser/MixedV1V2Test.java 2007-12-27 13:40:17 UTC (rev 194)
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2007 Davy Verstappen.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jsmiparser;
+
+import junit.framework.TestCase;
+
+import java.net.URL;
+import java.net.MalformedURLException;
+import java.util.List;
+import java.util.ArrayList;
+
+import org.jsmiparser.parser.SmiDefaultParser;
+
+public class MixedV1V2Test extends TestCase {
+
+ public void testToV2() throws MalformedURLException {
+ String[] mibFileNames = { "TOKEN-RING-RMON-MIB", "RFC1271-MIB", "SNMPv2-SMI", "SNMPv2-TC"};
+ ClassLoader cl = Thread.currentThread().getContextClassLoader();
+ URL resource = cl.getResource("libsmi-0.4.5/mibs/ietf");
+ assertNotNull(resource);
+ List<URL> urls = new ArrayList<URL>();
+ for (String fn : mibFileNames) {
+ URL url = new URL(resource + "/" + fn);
+ urls.add(url);
+ }
+
+ SmiDefaultParser parser = new SmiDefaultParser();
+ parser.getOptions().setConvertV1ImportsToV2(true);
+ parser.getFileParserPhase().setInputUrls(urls);
+ //URL fixerUrl = PropertiesXRefFixer.class.getResource("v1_to_v2.properties");
+ //assertNotNull(fixerUrl);
+ //parser.getXRefPhase().setFixer(new PropertiesXRefFixer(fixerUrl));
+
+ parser.parse();
+
+ assertEquals(0, parser.getProblemEventHandler().getTotalCount());
+
+ }
+
+}
Modified: trunk/jsmiparser-api/src/test/java/org/jsmiparser/phase/file/antlr/IFParseTest.java
===================================================================
--- trunk/jsmiparser-api/src/test/java/org/jsmiparser/phase/file/antlr/IFParseTest.java 2007-12-27 12:15:22 UTC (rev 193)
+++ trunk/jsmiparser-api/src/test/java/org/jsmiparser/phase/file/antlr/IFParseTest.java 2007-12-27 13:40:17 UTC (rev 194)
@@ -19,6 +19,7 @@
import antlr.TokenStreamException;
import junit.framework.TestCase;
import org.jsmiparser.smi.SmiMib;
+import org.jsmiparser.smi.SmiOptions;
import java.io.BufferedInputStream;
import java.io.File;
@@ -46,7 +47,7 @@
SMILexer lexer = new SMILexer(is);
SMIParser parser = new SMIParser(lexer);
- parser.init(new SmiMib(null), inputFile.getPath());
+ parser.init(new SmiMib(new SmiOptions(), null), inputFile.getPath());
//ASNModule module =
parser.module_definition();
Modified: trunk/jsmiparser-api/src/test/java/org/jsmiparser/smi/SmiModuleTest.java
===================================================================
--- trunk/jsmiparser-api/src/test/java/org/jsmiparser/smi/SmiModuleTest.java 2007-12-27 12:15:22 UTC (rev 193)
+++ trunk/jsmiparser-api/src/test/java/org/jsmiparser/smi/SmiModuleTest.java 2007-12-27 13:40:17 UTC (rev 194)
@@ -20,7 +20,7 @@
import org.jsmiparser.util.location.Location;
public class SmiModuleTest extends TestCase {
- private SmiMib m_mib = new SmiMib(new SmiJavaCodeNamingStrategy("test"));
+ private SmiMib m_mib = new SmiMib(new SmiOptions(), new SmiJavaCodeNamingStrategy("test"));
private SmiModule m_module = new SmiModule(m_mib, new IdToken(new Location("IF-MIBsource", 1, 0), "IF-MIB"));
public void testGetJavaId() {
Modified: trunk/jsmiparser-api/src/test/resources/org/jsmiparser/SpringTest.xml
===================================================================
--- trunk/jsmiparser-api/src/test/resources/org/jsmiparser/SpringTest.xml 2007-12-27 12:15:22 UTC (rev 193)
+++ trunk/jsmiparser-api/src/test/resources/org/jsmiparser/SpringTest.xml 2007-12-27 13:40:17 UTC (rev 194)
@@ -33,6 +33,9 @@
</property>
</bean>
</property>
+ <property name="options">
+ <bean class="org.jsmiparser.smi.SmiOptions"/>
+ </property>
</bean>
<bean id="mib"
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|