Skip to content

Commit

Permalink
Add initial support for RawCodec, refactor EncodingState impl
Browse files Browse the repository at this point in the history
  • Loading branch information
lhotari committed Apr 4, 2013
1 parent 579ff2f commit af5fa33
Show file tree
Hide file tree
Showing 6 changed files with 119 additions and 36 deletions.
Expand Up @@ -172,7 +172,7 @@ public Object encode(Object target) {
}
Object encoded = delegate.encode(target);
if(encodingState != null && encoded instanceof CharSequence)
encodingState.registerEncodedWith(getCodecName(), (CharSequence)encoded);
encodingState.registerEncodedWith(this, (CharSequence)encoded);
return encoded;
}

Expand All @@ -183,8 +183,16 @@ protected EncodingState lookupEncodingState() {
public void markEncoded(CharSequence string) {
EncodingState encodingState=lookupEncodingState();
if(encodingState != null) {
encodingState.registerEncodedWith(getCodecName(), string);
encodingState.registerEncodedWith(this, string);
}
}

public Set<String> getEquivalentCodecNames() {
return delegate.getEquivalentCodecNames();
}

public boolean isPreventAllOthers() {
return delegate.isPreventAllOthers();
}
}

Expand Down Expand Up @@ -223,6 +231,14 @@ public CharSequence encode(Object target) {

public void markEncoded(CharSequence string) {

}

public Set<String> getEquivalentCodecNames() {
return null;
}

public boolean isPreventAllOthers() {
return false;
}
}

Expand Down
@@ -1,7 +1,11 @@
package org.codehaus.groovy.grails.support.encoding;

import java.util.Set;

public interface Encoder {
public String getCodecName();
public Set<String> getEquivalentCodecNames();
public boolean isPreventAllOthers();
public Object encode(Object o);
public void markEncoded(CharSequence string);
}
Expand Up @@ -3,7 +3,8 @@
import java.util.Set;

public interface EncodingState {
//public Set<Encoder> getEncodersFor(CharSequence string);
public Set<String> getEncodingTagsFor(CharSequence string);
public boolean isEncodedWith(String encoding, CharSequence string);
public void registerEncodedWith(String encoding, CharSequence escaped);
public boolean isEncodedWith(Encoder encoder, CharSequence string);
public void registerEncodedWith(Encoder encoder, CharSequence escaped);
}
Expand Up @@ -16,6 +16,10 @@

import java.io.IOException;
import java.io.Writer;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

import org.codehaus.groovy.grails.support.encoding.CodecFactory;
import org.codehaus.groovy.grails.support.encoding.Decoder;
Expand All @@ -31,6 +35,8 @@
*/
public class HTMLCodec {
private static final class HTMLEncoder implements StreamingEncoder {
private static final Set<String> equivalentCodecNames = new HashSet<String>(Arrays.asList(new String[]{"HTML4","XML"}));

public String getCodecName() {
return CODEC_NAME;
}
Expand All @@ -48,6 +54,14 @@ public void encodeToWriter(Object source, Writer writer) throws IOException {

}

public Set<String> getEquivalentCodecNames() {
return equivalentCodecNames;
}

public boolean isPreventAllOthers() {
return false;
}

}

private static final String CODEC_NAME="HTML";
Expand Down
@@ -0,0 +1,32 @@
package org.codehaus.groovy.grails.plugins.codecs;

import java.util.Set;

import org.codehaus.groovy.grails.support.encoding.Decoder;
import org.codehaus.groovy.grails.support.encoding.Encoder;

public class RawCodec implements Encoder, Decoder {
public Object decode(Object o) {
return o;
}

public String getCodecName() {
return "Raw";
}

public Set<String> getEquivalentCodecNames() {
return null;
}

public boolean isPreventAllOthers() {
return true;
}

public Object encode(Object o) {
return o;
}

public void markEncoded(CharSequence string) {

}
}
Expand Up @@ -31,6 +31,7 @@
import org.codehaus.groovy.grails.commons.DefaultGrailsCodecClass;
import org.codehaus.groovy.grails.commons.GrailsApplication;
import org.codehaus.groovy.grails.commons.GrailsControllerClass;
import org.codehaus.groovy.grails.support.encoding.Encoder;
import org.codehaus.groovy.grails.support.encoding.EncodingState;
import org.codehaus.groovy.grails.support.encoding.EncodingStateLookup;
import org.codehaus.groovy.grails.web.binding.GrailsDataBinder;
Expand All @@ -56,7 +57,7 @@
* @author Graeme Rocher
* @since 0.4
*/
public class GrailsWebRequest extends DispatcherServletWebRequest implements ParameterInitializationCallback, EncodingState {
public class GrailsWebRequest extends DispatcherServletWebRequest implements ParameterInitializationCallback {

private GrailsApplicationAttributes attributes;
private GrailsParameterMap params;
Expand All @@ -68,7 +69,7 @@ public class GrailsWebRequest extends DispatcherServletWebRequest implements Par
private ApplicationContext applicationContext;
private String baseUrl;

private Map<String,Set<Integer>> encodingTagIdentityHashCodes=new HashMap<String, Set<Integer>>();
private EncodingState encodingState;

public GrailsWebRequest(HttpServletRequest request, HttpServletResponse response, ServletContext servletContext) {
super(request, response);
Expand Down Expand Up @@ -355,49 +356,64 @@ public String getBaseUrl() {
return baseUrl;
}

private Set<Integer> getIdentityHashCodesForEncoding(String encoding) {
Set<Integer> identityHashCodes = encodingTagIdentityHashCodes.get(encoding);
if(identityHashCodes==null) {
identityHashCodes=new HashSet<Integer>();
encodingTagIdentityHashCodes.put(encoding, identityHashCodes);
public EncodingState getEncodingState() {
if(encodingState==null) {
encodingState=new DefaultEncodingState();
}
return identityHashCodes;
}

public Set<String> getEncodingTagsFor(CharSequence string) {
int identityHashCode = System.identityHashCode(string);
Set<String> result=null;
for(Map.Entry<String, Set<Integer>> entry : encodingTagIdentityHashCodes.entrySet()) {
if(entry.getValue().contains(identityHashCode)) {
if(result==null) {
result=Collections.singleton(entry.getKey());
} else {
if (result.size()==1){
result=new HashSet<String>(result);
}
result.add(entry.getKey());
return encodingState;
}

private static final class DefaultEncodingState implements EncodingState {
private Map<String,Set<Integer>> encodingTagIdentityHashCodes=new HashMap<String, Set<Integer>>();

private Set<Integer> getIdentityHashCodesForEncoding(String encoding) {
Set<Integer> identityHashCodes = encodingTagIdentityHashCodes.get(encoding);
if(identityHashCodes==null) {
identityHashCodes=new HashSet<Integer>();
encodingTagIdentityHashCodes.put(encoding, identityHashCodes);
}
return identityHashCodes;
}

public Set<String> getEncodingTagsFor(CharSequence string) {
int identityHashCode = System.identityHashCode(string);
Set<String> result=null;
for(Map.Entry<String, Set<Integer>> entry : encodingTagIdentityHashCodes.entrySet()) {
if(entry.getValue().contains(identityHashCode)) {
if(result==null) {
result=Collections.singleton(entry.getKey());
} else {
if (result.size()==1){
result=new HashSet<String>(result);
}
result.add(entry.getKey());
}
}
}
return result;
}

public boolean isEncodedWith(Encoder encoder, CharSequence string) {
return getIdentityHashCodesForEncoding(encoder.getCodecName()).contains(System.identityHashCode(string));
}
return result;
}

public boolean isEncodedWith(String encoding, CharSequence string) {
return getIdentityHashCodesForEncoding(encoding).contains(System.identityHashCode(string));
}

public void registerEncodedWith(String encoding, CharSequence escaped) {
getIdentityHashCodesForEncoding(encoding).add(System.identityHashCode(escaped));
public void registerEncodedWith(Encoder encoder, CharSequence escaped) {
getIdentityHashCodesForEncoding(encoder.getCodecName()).add(System.identityHashCode(escaped));
}
}

private static final class DefaultEncodingStateLookup implements EncodingStateLookup {
public EncodingState lookup() {
return GrailsWebRequest.lookup();
GrailsWebRequest webRequest = GrailsWebRequest.lookup();
if(webRequest != null) {
return webRequest.getEncodingState();
} else {
return null;
}
}
}

static {
DefaultGrailsCodecClass.setEncodingStateLookup(new DefaultEncodingStateLookup());
}

}

0 comments on commit af5fa33

Please sign in to comment.