/*
* Copyright 2010 Gal Dolber.
*
* 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 com.guit.rebind.binder;
import com.google.gwt.core.ext.typeinfo.JClassType;
import com.google.gwt.core.ext.typeinfo.JMethod;
import com.google.gwt.core.ext.typeinfo.JParameter;
import com.google.gwt.user.rebind.SourceWriter;
import com.google.gwt.user.rebind.StringSourceWriter;
import java.util.ArrayList;
import java.util.Stack;
public class BinderContextImpl implements BinderContext {
private final SourceWriter beforeWrappers = new StringSourceWriter();
private final SourceWriter beforeHandler = new StringSourceWriter();
private final SourceWriter afterHandler = new StringSourceWriter();
private final SourceWriter afterWrappers = new StringSourceWriter();
private final ArrayList<SourceWriter> wrappersBefore = new ArrayList<SourceWriter>();
private final Stack<SourceWriter> wrappersAfter = new Stack<SourceWriter>();
private final StringBuilder logger = new StringBuilder();
private final String viewTypeName;
private final JMethod method;
private final JClassType eventType;
private final JClassType presenterType;
private final String[] parameterGetters;
public BinderContextImpl(JMethod method, JClassType eventType, JClassType presenterType,
String viewTypeName, String[] parameterGetters) {
this.method = method;
this.eventType = eventType;
this.presenterType = presenterType;
this.viewTypeName = viewTypeName;
this.parameterGetters = parameterGetters;
}
@Override
public void addAfterHandler(StringSourceWriter writer) {
afterHandler.println(writer.toString());
}
@Override
public void addAfterWrappers(StringSourceWriter writer) {
afterWrappers.println(writer.toString());
}
@Override
public void addBeforeHandler(StringSourceWriter writer) {
beforeHandler.println(writer.toString());
}
@Override
public void addBeforeWrappers(StringSourceWriter writer) {
beforeWrappers.println(writer.toString());
}
@Override
public void addWrapper(StringSourceWriter before, StringSourceWriter after) {
wrappersBefore.add(before);
wrappersAfter.push(after);
}
@Override
public String build(StringSourceWriter writer) {
StringSourceWriter build = new StringSourceWriter();
build.print(beforeWrappers.toString());
for (SourceWriter w : wrappersBefore) {
build.print(w.toString());
}
build.print(beforeHandler.toString());
build.print(writer.toString());
build.print(afterHandler.toString());
for (SourceWriter w : wrappersAfter) {
build.print(w.toString());
}
build.print(afterWrappers.toString());
return build.toString();
}
@Override
public JClassType getEventType() {
return eventType;
}
@Override
public String getLog() {
// Print parameters values
JParameter[] parameters = method.getParameters();
StringBuilder sb = new StringBuilder();
sb.append("[");
for (int n = 0; n < parameters.length; n++) {
if (n > 0) {
sb.append(", ");
}
sb.append(parameters[n].getName() + "=" + "\" + " + parameterGetters[n] + " + \"");
}
sb.append("]");
String logString = logger.toString();
return presenterType.getSimpleSourceName() + "." + method.getName() + sb.toString()
+ (logString.isEmpty() ? "" : ("\\n Plugins=[" + logString + "]"))
+ "\\n DebugString=[\" + event.toString() + \"]" + "\\n Package=["
+ presenterType.getPackage().getName() + "]";
}
@Override
public JMethod getMethod() {
return method;
}
@Override
public String[] getParameterGetters() {
return parameterGetters;
}
@Override
public JClassType getPresenterType() {
return presenterType;
}
@Override
public String getViewTypeName() {
return viewTypeName;
}
@Override
public void log(String log) {
if (logger.length() > 0) {
logger.append(", ");
}
logger.append(log);
}
}