blob: 28ef43a7c35b8c677e83d766a47d3210d0e92e5e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2003, 2004 IBM Corporation and others.
* 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 org.eclipse.jsp;
import java.io.IOException;
import java.io.Reader;
import java.util.ArrayList;
import org.eclipse.jface.text.source.translation.ITagHandler;
import org.eclipse.jface.text.source.translation.ITagHandlerFactory;
import org.eclipse.jface.text.source.translation.ITranslator;
import org.eclipse.jdt.internal.ui.examples.jspeditor.JspTranslatorResultCollector;
public class JspTranslator extends AbstractJspParser implements ITranslator {
private StringBuffer fDeclarations= new StringBuffer();
private StringBuffer fContent= new StringBuffer();
private StringBuffer fLocalDeclarations= new StringBuffer();
private ArrayList fContentLines= new ArrayList();
private ArrayList fDeclarationLines= new ArrayList();
private ArrayList fLocalDeclarationLines= new ArrayList();
private int[] fSmap;
private ITagHandlerFactory fTagHandlerFactor;
private ITagHandler fCurrentTagHandler;
private JspTranslatorResultCollector fResultCollector;
public JspTranslator() {
// Links for passing parameters to the tag handlers
fResultCollector= new JspTranslatorResultCollector(fDeclarations, fLocalDeclarations, fContent, fDeclarationLines, fLocalDeclarationLines, fContentLines);
}
protected void startTag(boolean endTag, String name, int startName) {
fCurrentTagHandler= fTagHandlerFactor.getHandler(name);
}
protected void tagAttribute(String attrName, String value, int startName, int startValue) {
if (fCurrentTagHandler != null)
fCurrentTagHandler.addAttribute(attrName, value, fLines);
}
protected void endTag(boolean end) {
if (fCurrentTagHandler != null)
try {
fCurrentTagHandler.processEndTag(fResultCollector, fLines);
} catch (IOException ex) {
ex.printStackTrace();
}
}
protected void java(char ch, String java, int line) {
if (ch == '!')
fCurrentTagHandler= fTagHandlerFactor.getHandler("<%!"); //$NON-NLS-1$
else
fCurrentTagHandler= fTagHandlerFactor.getHandler("<%"); //$NON-NLS-1$
/*
* XXX: This is needed because the used parser does not treat
* "<%" like every other tag.
*/
fCurrentTagHandler.addAttribute("source", java, line); //$NON-NLS-1$
try {
fCurrentTagHandler.processEndTag(fResultCollector, line);
} catch (IOException e) {
e.printStackTrace();
}
}
protected void text(String t, int line) {
int i= 0;
StringBuffer out= new StringBuffer();
while (i < t.length()) {
char c= t.charAt(i++);
if (c == '\n') {
fContent.append(" System.out.println(\"" + out.toString() + "\"); //$NON-NLS-1$\n"); //$NON-NLS-1$//$NON-NLS-2$
fContentLines.add(new Integer(line++));
out.setLength(0);
} else {
out.append(c);
}
}
if (out.length() > 0) {
fContent.append(" System.out.print(\"" + out.toString() + "\"); //$NON-NLS-1$\n"); //$NON-NLS-1$ //$NON-NLS-2$
fContentLines.add(new Integer(line));
}
}
private void resetTranslator() {
fDeclarations.setLength(0);
fContent.setLength(0);
fLocalDeclarations.setLength(0);
fLocalDeclarationLines.clear();
fContentLines.clear();
fDeclarationLines.clear();
}
public String translate(Reader reader, String name) throws IOException {
StringBuffer buffer= new StringBuffer();
resetTranslator();
parse(reader);
int lineCount= 2 + fDeclarationLines.size() + 1 + 1 + fLocalDeclarationLines.size() + fContentLines.size() + 3;
fSmap= new int[lineCount];
int line= 0;
fSmap[line++]= 1;
buffer.append("public class " + name + " {\n\n"); //$NON-NLS-1$ //$NON-NLS-2$
fSmap[line++]= 1;
fSmap[line++]= 1;
buffer.append(fDeclarations.toString() + "\n"); //$NON-NLS-1$
System.out.println(fDeclarations.toString());
for (int i= 0; i < fDeclarationLines.size(); i++) {
fSmap[line++]= ((Integer)fDeclarationLines.get(i)).intValue();
System.out.println("" + ((Integer)fDeclarationLines.get(i)).intValue()); //$NON-NLS-1$
}
fSmap[line]= fSmap[line - 1] + 1;
line++;
buffer.append(" public void out() {\n"); //$NON-NLS-1$
fSmap[line]= fSmap[line - 1] + 1;
line++;
if (fLocalDeclarations.length() > 0) {
buffer.append(fLocalDeclarations.toString());
System.out.println(fLocalDeclarations);
for (int i= 0; i < fLocalDeclarationLines.size(); i++) {
System.out.println("" + ((Integer)fLocalDeclarationLines.get(i)).intValue()); //$NON-NLS-1$
fSmap[line++]= ((Integer)fLocalDeclarationLines.get(i)).intValue();
}
}
buffer.append(fContent.toString());
System.out.println(fContent);
for (int i= 0; i < fContentLines.size(); i++) {
fSmap[line++]= ((Integer)fContentLines.get(i)).intValue();
System.out.println("" + ((Integer)fContentLines.get(i)).intValue()); //$NON-NLS-1$
}
buffer.append(" }\n"); //$NON-NLS-1$
fSmap[line]= fSmap[line - 1];
line++;
buffer.append("}\n"); //$NON-NLS-1$
fSmap[line]= fSmap[line - 2];
for (int i= 0; i < fSmap.length; i++)
System.out.println("" + i + " -> " + fSmap[i]); //$NON-NLS-1$ //$NON-NLS-2$
System.out.println(buffer.toString());
return buffer.toString();
}
public int[] getLineMapping() {
return fSmap;
}
/*
* @see org.eclipse.jface.text.source.ITranslator#setTagHandlerFactory(org.eclipse.jface.text.source.ITagHandlerFactory)
*/
public void setTagHandlerFactory(ITagHandlerFactory tagHandlerFactory) {
fTagHandlerFactor= tagHandlerFactory;
}
/*
* @see ITranslator#backTranslateOffsetInLine(String, String, int)
*/
public int backTranslateOffsetInLine(String originalLine, String translatedLine, int offsetInTranslatedLine, String tag) {
ITagHandler handler;
if (tag != null)
handler= fTagHandlerFactor.getHandler(tag);
else
handler= fTagHandlerFactor.findHandler(originalLine);
if (handler != null)
return handler.backTranslateOffsetInLine(originalLine, translatedLine, offsetInTranslatedLine);
return -1;
}
}