WALA/com.ibm.wala.cast.js/source/com/ibm/wala/cast/js/html/jericho/JerichoTag.java

155 lines
4.1 KiB
Java

/******************************************************************************
* Copyright (c) 2002 - 2011 IBM Corporation.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*****************************************************************************/
package com.ibm.wala.cast.js.html.jericho;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Map;
import net.htmlparser.jericho.Attribute;
import net.htmlparser.jericho.Element;
import net.htmlparser.jericho.Segment;
import com.ibm.wala.cast.js.html.ITag;
import com.ibm.wala.cast.tree.CAstSourcePositionMap.Position;
import com.ibm.wala.cast.tree.impl.AbstractSourcePosition;
import com.ibm.wala.util.collections.HashMapFactory;
import com.ibm.wala.util.collections.Pair;
/**
* ITag impel for Jericho generated tags
* @author danielk
*/
public class JerichoTag implements ITag {
private final Element innerElement;
private final String sourceFile;
private Map<String, Pair<String, Position>> allAttributes = null;
public JerichoTag(Element root, String sourceFile) {
this.innerElement = root;
this.sourceFile = sourceFile;
}
private Position getPosition(final Segment e) {
return new AbstractSourcePosition() {
@Override
public int getFirstLine() {
return e.getSource().getRowColumnVector(e.getBegin()).getRow();
}
@Override
public int getLastLine() {
return e.getSource().getRowColumnVector(e.getEnd()).getRow();
}
@Override
public int getFirstCol() {
// return -1;
return e.getSource().getRowColumnVector(e.getBegin()).getColumn();
}
@Override
public int getLastCol() {
// return -1;
return e.getSource().getRowColumnVector(e.getEnd()).getColumn();
}
@Override
public int getFirstOffset() {
return e.getBegin();
}
@Override
public int getLastOffset() {
return e.getEnd();
}
@Override
public URL getURL() {
try {
return new URL("file://" + sourceFile);
} catch (MalformedURLException e) {
return null;
}
}
@Override
public Reader getReader() throws IOException {
return new FileReader(sourceFile);
}
};
}
private Map<String, Pair<String, Position>> makeAllAttributes() {
Map<String, Pair<String, Position>> result = HashMapFactory.make();
if (innerElement.getStartTag().getAttributes() != null) {
for (Attribute a : innerElement.getStartTag().getAttributes()) {
result.put(
a.getName().toLowerCase(),
Pair.make(a.getValue(), getPosition(a.getValueSegment())));
}
}
return result;
}
@Override
public Map<String, Pair<String, Position>> getAllAttributes() {
if (allAttributes == null) {
allAttributes = makeAllAttributes();
}
return allAttributes;
}
@Override
public Pair<String, Position> getAttributeByName(String name) {
if (allAttributes == null) {
allAttributes = makeAllAttributes();
}
return allAttributes.get(name.toLowerCase());
}
public Pair<Integer, String> getBodyText() {
Segment content = innerElement.getContent();
Integer lineNum = innerElement.getSource().getRow(content.getBegin());
String body = content.toString().replace(content.getSource().getNewLine(), "\n");
return Pair.make(lineNum, body);
}
public String getFilePath() {
return sourceFile;
}
@Override
public String getName() {
return innerElement.getName();
}
@Override
public String toString() {
return innerElement.toString();
}
@Override
public Position getElementPosition() {
return getPosition(innerElement);
}
@Override
public Position getContentPosition() {
return getPosition(innerElement.getContent());
}
}