/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 WARRANTIESOR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.aries.web.converter.impl;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Collection;
import java.util.LinkedList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class JSPImportParser {
/**
*
* @param is
* An input stream of character-based text. We expect this to be JSP
* source code.
* @return Each java package found within valid JSP import tags
* @throws IOException
*/
public static Collection<String> getImports (InputStream is) throws IOException {
Collection<String> importedPackages = new LinkedList<String>();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String line = null;
do {
line = reader.readLine();
// searchMatchedGroupForImports could take (line): I've not done that because
// the entry trace, once working, will print out lots of useless information.
if (line != null) {
Matcher hasJSPimport = lineWithJSPimport.matcher(line);
if (hasJSPimport.find()) {
Collection<String> foundImports = searchMatchedGroupForImports (hasJSPimport.group());
for (String found : foundImports) {
if (!importedPackages.contains(found)) {
importedPackages.add(found);
}
}
}
}
} while (line != null);
return importedPackages;
}
private static final Pattern lineWithJSPimport = Pattern.compile("<%@\\s*page\\s*import.*%>");
private static final Pattern stanzaEnd = Pattern.compile("%>");
private static final Pattern imports = Pattern.compile("import\\s*=\\s*\"(.*?)\"");
/**
*
* @param groupExtent a block of text known to contain a JSP import
* @return Each package found within valid JSP import tags
*/
private static LinkedList<String> searchMatchedGroupForImports (String groupExtent) {
LinkedList<String> packagesFound = new LinkedList<String>();
String importStanzas[] = stanzaEnd.split(groupExtent);
for (String s: importStanzas){
Matcher oneImport = imports.matcher(s);
if (oneImport.find()) {
String thisStanzasImports = oneImport.group();
String allPackages = thisStanzasImports.substring(thisStanzasImports.indexOf("\"")+1,
thisStanzasImports.lastIndexOf("\""));
String [] imports = allPackages.split(",");
for (String p : imports) {
String thisPackage = p.substring(0,p.lastIndexOf('.')).trim();
if (!!!thisPackage.startsWith("java."))
packagesFound.add(thisPackage);
}
}
}
return packagesFound;
}
}