Merged 5.0.N (5.0.3) to 5.1.N (5.1.1)

117582 adavis: Merged V4.2-BUG-FIX (4.2.6) to 5.0.N (5.0.3) (PARTIAL MERGE)
      116652 amorarasu: MNT-14983: CMIS: Euro character not encoded correctly
         Merged V4.2.4 (4.2.4.19) to V4.2-BUG-FIX (4.2.6)
            115140 115998 116396 amorarasu: MNT-15044: CLONE - CMIS: Euro character not encoded correctly
               - Removed the unicode interval that was used to escape characters from the categories: currency, general punctuation, subscripts and superscripts (2000-20FF).
               - Changed the way the control characters are filtered + adapted tests.
               - Removed unnecessary j_string use from the ftl and added proper xml encoding.


git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/BRANCHES/DEV/5.1.N/root@117597 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Alan Davis
2015-11-15 21:30:05 +00:00
parent 9104f61c74
commit cd43fe582c
2 changed files with 25 additions and 43 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2005-2014 Alfresco Software Limited.
* Copyright (C) 2005-2015 Alfresco Software Limited.
*
* This file is part of Alfresco
*
@@ -260,6 +260,7 @@ public class CMISConnector implements ApplicationContextAware, ApplicationListen
}
public static final char ID_SEPERATOR = ';';
public static final char REPLACEMENT_CHAR = '_';
public static final String ASSOC_ID_PREFIX = "assoc:";
public static final String PWC_VERSION_LABEL = "pwc";
public static final String UNVERSIONED_VERSION_LABEL = "1.0";
@@ -2173,11 +2174,13 @@ public class CMISConnector implements ApplicationContextAware, ApplicationListen
return df.newXMLGregorianCalendar((GregorianCalendar) value).toXMLFormat();
}
// MNT-12496
// Encode for AtomPub only. Browser/json binding already encodes.
if (AlfrescoCmisServiceCall.get() != null && CallContext.BINDING_ATOMPUB.equals(AlfrescoCmisServiceCall.get().getBinding()))
// MNT-12496 MNT-15044
// Filter for AtomPub and Web services bindings only. Browser/json binding already encodes.
if (AlfrescoCmisServiceCall.get() != null &&
(CallContext.BINDING_ATOMPUB.equals(AlfrescoCmisServiceCall.get().getBinding()) ||
CallContext.BINDING_WEBSERVICES.equals(AlfrescoCmisServiceCall.get().getBinding())))
{
return escapeControlCharacters(value.toString());
return filterXmlRestrictedCharacters(value.toString());
}
else
{
@@ -2277,16 +2280,18 @@ public class CMISConnector implements ApplicationContextAware, ApplicationListen
}
else
{
// MNT-12496
// Encode for AtomPub only. Browser/json binding already encodes.
if (AlfrescoCmisServiceCall.get() != null && CallContext.BINDING_ATOMPUB.equals(AlfrescoCmisServiceCall.get().getBinding()))
{
((PropertyStringImpl) result).setValue(escapeControlCharacters((String) value));
}
else
{
((PropertyStringImpl) result).setValue((String) value);
}
// MNT-12496 MNT-15044
// Filter for AtomPub and Web services bindings only. Browser/json binding already encodes.
if (AlfrescoCmisServiceCall.get() != null &&
(CallContext.BINDING_ATOMPUB.equals(AlfrescoCmisServiceCall.get().getBinding()) ||
CallContext.BINDING_WEBSERVICES.equals(AlfrescoCmisServiceCall.get().getBinding())))
{
((PropertyStringImpl) result).setValue(filterXmlRestrictedCharacters((String) value));
}
else
{
((PropertyStringImpl) result).setValue((String) value);
}
}
break;
case URI:
@@ -2315,7 +2320,7 @@ public class CMISConnector implements ApplicationContextAware, ApplicationListen
return result;
}
private String escapeControlCharacters(String origValue)
private String filterXmlRestrictedCharacters(String origValue)
{
if (origValue == null)
{
@@ -2326,33 +2331,10 @@ public class CMISConnector implements ApplicationContextAware, ApplicationListen
for (int i = 0; i < origValue.length(); i++)
{
char ch = origValue.charAt(i);
switch (ch)
{
case '\b':
case '\f':
case '\n':
case '\r':
case '\t':
sb.append(ch);
break;
default:
// Reference: http://www.unicode.org/versions/Unicode5.1.0/
if ((ch >= '\u0000' && ch <= '\u001F') || (ch >= '\u007F' && ch <= '\u009F') || (ch >= '\u2000' && ch <= '\u20FF'))
{
String ss = Integer.toHexString(ch);
sb.append("\\u");
for (int k = 0; k < 4 - ss.length(); k++)
{
sb.append('0');
}
sb.append(ss.toUpperCase());
}
else
{
sb.append(ch);
}
}
boolean restricted = (ch < '\u0020') && !(ch == '\t' || ch == '\n' || ch == '\r');
sb.append(restricted ? REPLACEMENT_CHAR : ch);
}
return sb.toString();
}