Partial fix for AWC-999: Content upload guesses character encoding and offers the user the chance to change it.

TODO: Fix the "Modify Content Properties" to include the encoding as a changeable option.

Modified other entry points of content into the system.  All calls to ContentWriter.setEncoding("UTF-8") need some serious examination.
It is no longer necessary to assume anything about the encoding.  The worst case scenario is that we guess the encoding from the stream
without giving the user the chance to change it.  This works for most non-interactive scenarios like CIFS, WebDAV and FTP, now.


git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@6113 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Derek Hulley
2007-06-26 21:48:19 +00:00
parent 0dd05fe40f
commit e29e24e761
16 changed files with 528 additions and 17 deletions

View File

@@ -232,6 +232,7 @@ other_action=Run Action
information=Information information=Information
move=Move move=Move
type=Type type=Type
encoding=Encoding
aspect=Aspect aspect=Aspect
workflow=Workflow workflow=Workflow
workflows=Workflows workflows=Workflows
@@ -1646,6 +1647,7 @@ error_save_search=Failed to save search due to error: {0}
error_restore_search=Failed to restore saved search due to error: {0} error_restore_search=Failed to restore saved search due to error: {0}
error_shortcut_permissions=Unable to navigate to the item as it cannot be read by this user. Another user may have modified the permission. error_shortcut_permissions=Unable to navigate to the item as it cannot be read by this user. Another user may have modified the permission.
error_association=Failed to find association definition for association \"{0}\". error_association=Failed to find association definition for association \"{0}\".
error_charset_null=Null characterset value
# Confirmations # Confirmations
return_to_application=Return to application return_to_application=Return to application

View File

@@ -25,6 +25,8 @@
package org.alfresco.web.app.servlet; package org.alfresco.web.app.servlet;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.util.StringTokenizer; import java.util.StringTokenizer;
import javax.servlet.ServletException; import javax.servlet.ServletException;
@@ -32,6 +34,7 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import org.alfresco.model.ContentModel; import org.alfresco.model.ContentModel;
import org.alfresco.repo.content.encoding.ContentCharsetFinder;
import org.alfresco.service.ServiceRegistry; import org.alfresco.service.ServiceRegistry;
import org.alfresco.service.cmr.repository.ContentService; import org.alfresco.service.cmr.repository.ContentService;
import org.alfresco.service.cmr.repository.ContentWriter; import org.alfresco.service.cmr.repository.ContentWriter;
@@ -155,17 +158,13 @@ public class UploadContentServlet extends BaseServlet
return; return;
} }
// Get the encoding
String encoding = req.getParameter(ARG_ENCODING);
if (encoding == null || encoding.length() == 0)
{
encoding = "UTF-8";
}
// get the services we need to retrieve the content // get the services we need to retrieve the content
ServiceRegistry serviceRegistry = getServiceRegistry(getServletContext()); ServiceRegistry serviceRegistry = getServiceRegistry(getServletContext());
ContentService contentService = serviceRegistry.getContentService(); ContentService contentService = serviceRegistry.getContentService();
PermissionService permissionService = serviceRegistry.getPermissionService(); PermissionService permissionService = serviceRegistry.getPermissionService();
MimetypeService mimetypeService = serviceRegistry.getMimetypeService();
InputStream inputStream = req.getInputStream();
// Sort out the mimetype // Sort out the mimetype
String mimetype = req.getParameter(ARG_MIMETYPE); String mimetype = req.getParameter(ARG_MIMETYPE);
@@ -188,6 +187,16 @@ public class UploadContentServlet extends BaseServlet
} }
} }
// Get the encoding
String encoding = req.getParameter(ARG_ENCODING);
if (encoding == null || encoding.length() == 0)
{
// Get the encoding
ContentCharsetFinder charsetFinder = mimetypeService.getContentCharsetFinder();
Charset charset = charsetFinder.getCharset(inputStream, mimetype);
encoding = charset.name();
}
if (logger.isDebugEnabled()) if (logger.isDebugEnabled())
{ {
if (nodeRef != null) {logger.debug("Found NodeRef: " + nodeRef.toString());} if (nodeRef != null) {logger.debug("Found NodeRef: " + nodeRef.toString());}

View File

@@ -25,6 +25,8 @@
package org.alfresco.web.bean.ajax; package org.alfresco.web.bean.ajax;
import java.io.File; import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.Serializable; import java.io.Serializable;
import java.net.URLDecoder; import java.net.URLDecoder;
import java.util.HashMap; import java.util.HashMap;
@@ -125,8 +127,31 @@ public class FileUploadBean
NodeRef containerRef = pathToNodeRef(fc, currentPath); NodeRef containerRef = pathToNodeRef(fc, currentPath);
if (containerRef != null) if (containerRef != null)
{ {
// Try and extract metadata from the file // Guess the mimetype
String mimetype = Repository.getMimeTypeForFileName(fc, filename); String mimetype = Repository.getMimeTypeForFileName(fc, filename);
// Now guess the encoding
String encoding = "UTF-8";
InputStream is = null;
try
{
is = new FileInputStream(file);
encoding = Repository.guessEncoding(fc, is, mimetype);
}
catch (Throwable e)
{
// Bad as it is, it's not terminal
logger.error("Failed to guess character encoding of file: " + file, e);
}
finally
{
if (is != null)
{
try { is.close(); } catch (Throwable e) {}
}
}
// Try and extract metadata from the file
ContentReader cr = new FileContentReader(file); ContentReader cr = new FileContentReader(file);
cr.setMimetype(mimetype); cr.setMimetype(mimetype);
@@ -170,7 +195,7 @@ public class FileUploadBean
// get a writer for the content and put the file // get a writer for the content and put the file
ContentWriter writer = services.getContentService().getWriter(fileNodeRef, ContentModel.PROP_CONTENT, true); ContentWriter writer = services.getContentService().getWriter(fileNodeRef, ContentModel.PROP_CONTENT, true);
writer.setMimetype(mimetype); writer.setMimetype(mimetype);
writer.setEncoding("UTF-8"); writer.setEncoding(encoding);
writer.putContent(file); writer.putContent(file);
} }
} }

View File

@@ -24,7 +24,10 @@
*/ */
package org.alfresco.web.bean.content; package org.alfresco.web.bean.content;
import java.io.BufferedInputStream;
import java.io.File; import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.Serializable; import java.io.Serializable;
import java.text.MessageFormat; import java.text.MessageFormat;
import java.util.ArrayList; import java.util.ArrayList;
@@ -68,6 +71,7 @@ public class AddContentDialog extends BaseContentWizard
// Try and extract metadata from the file // Try and extract metadata from the file
ContentReader cr = new FileContentReader(this.file); ContentReader cr = new FileContentReader(this.file);
cr.setMimetype(this.mimeType); cr.setMimetype(this.mimeType);
cr.setEncoding(this.encoding);
// create properties for content type // create properties for content type
Map<QName, Serializable> contentProps = new HashMap<QName, Serializable>(5, 1.0f); Map<QName, Serializable> contentProps = new HashMap<QName, Serializable>(5, 1.0f);
@@ -149,8 +153,28 @@ public class AddContentDialog extends BaseContentWizard
// a pure JSF upload solution working. This method is only called // a pure JSF upload solution working. This method is only called
// after a file is uploaded, so we can calculate the mime type and // after a file is uploaded, so we can calculate the mime type and
// determine whether to enable inline editing in here. // determine whether to enable inline editing in here.
this.mimeType = Repository.getMimeTypeForFileName( FacesContext fc = FacesContext.getCurrentInstance();
FacesContext.getCurrentInstance(), this.fileName); this.mimeType = Repository.getMimeTypeForFileName(fc, this.fileName);
this.encoding = "UTF-8";
InputStream is = null;
try
{
if (this.file != null)
{
is = new BufferedInputStream(new FileInputStream(this.file));
this.encoding = Repository.guessEncoding(fc, is, this.mimeType);
}
}
catch (Throwable e)
{
// Not terminal
logger.error("Failed to get encoding from file: " + this.fileName, e);
}
finally
{
try { is.close(); } catch (Throwable e) {} // Includes NPE
}
this.inlineEdit = (this.mimeType.equals(MimetypeMap.MIMETYPE_HTML)); this.inlineEdit = (this.mimeType.equals(MimetypeMap.MIMETYPE_HTML));
// get the file upload message // get the file upload message

View File

@@ -26,6 +26,7 @@ package org.alfresco.web.bean.content;
import java.io.File; import java.io.File;
import java.io.Serializable; import java.io.Serializable;
import java.nio.charset.Charset;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
@@ -68,6 +69,7 @@ public abstract class BaseContentWizard extends BaseWizardBean
protected String title; protected String title;
protected String description; protected String description;
protected String mimeType; protected String mimeType;
protected String encoding;
protected String objectType; protected String objectType;
protected boolean inlineEdit; protected boolean inlineEdit;
protected boolean otherPropertiesChoiceVisible = true; protected boolean otherPropertiesChoiceVisible = true;
@@ -160,6 +162,22 @@ public abstract class BaseContentWizard extends BaseWizardBean
this.mimeType = mimeType; this.mimeType = mimeType;
} }
/**
* @return Returns the encoding currently selected
*/
public String getEncoding()
{
return encoding;
}
/**
* @param encoding the document's encoding
*/
public void setEncoding(String encoding)
{
this.encoding = encoding;
}
/** /**
* @return Returns the object type currenty selected * @return Returns the object type currenty selected
*/ */
@@ -250,6 +268,18 @@ public abstract class BaseContentWizard extends BaseWizardBean
this.showOtherProperties = showOthers; this.showOtherProperties = showOthers;
} }
public List<SelectItem> getEncodings()
{
Map<String, Charset> availableCharsets = Charset.availableCharsets();
List<SelectItem> items = new ArrayList<SelectItem>(availableCharsets.size());
for (Charset charset : availableCharsets.values())
{
SelectItem item = new SelectItem(charset.name(), charset.displayName());
items.add(item);
}
return items;
}
/** /**
* @return Returns a list of object types to allow the user to select from * @return Returns a list of object types to allow the user to select from
*/ */
@@ -407,7 +437,7 @@ public abstract class BaseContentWizard extends BaseWizardBean
ContentWriter writer = contentService.getWriter(fileNodeRef, ContentModel.PROP_CONTENT, true); ContentWriter writer = contentService.getWriter(fileNodeRef, ContentModel.PROP_CONTENT, true);
// set the mimetype and encoding // set the mimetype and encoding
writer.setMimetype(this.mimeType); writer.setMimetype(this.mimeType);
writer.setEncoding("UTF-8"); writer.setEncoding(this.encoding);
if (fileContent != null) if (fileContent != null)
{ {
writer.putContent(fileContent); writer.putContent(fileContent);

View File

@@ -0,0 +1,81 @@
/*
* Copyright (C) 2005-2007 Alfresco Software Limited.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* As a special exception to the terms and conditions of version 2.0 of
* the GPL, you may redistribute this Program in connection with Free/Libre
* and Open Source Software ("FLOSS") applications as described in Alfresco's
* FLOSS exception. You should have recieved a copy of the text describing
* the FLOSS exception, and it is also available here:
* http://www.alfresco.com/legal/licensing"
*/
package org.alfresco.web.bean.generator;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import org.alfresco.service.cmr.dictionary.PropertyDefinition;
import org.alfresco.web.app.servlet.FacesHelper;
import org.alfresco.web.ui.repo.component.UICharsetSelector;
import org.alfresco.web.ui.repo.component.property.PropertySheetItem;
import org.alfresco.web.ui.repo.component.property.UIPropertySheet;
import org.alfresco.web.ui.repo.converter.CharsetConverter;
/**
* Generates a Charset selector component.
*
* @since 2.1
* @author Derek Hulley
*/
public class CharsetSelectorGenerator extends BaseComponentGenerator
{
public UIComponent generate(FacesContext context, String id)
{
UIComponent component = context.getApplication().createComponent(UICharsetSelector.COMPONENT_TYPE);
FacesHelper.setupComponentId(context, component, id);
return component;
}
@Override
protected void setupConverter(FacesContext context,
UIPropertySheet propertySheet, PropertySheetItem property,
PropertyDefinition propertyDef, UIComponent component)
{
if (propertySheet.inEditMode() == false)
{
if (property.getConverter() != null)
{
// create and add the custom converter
createAndSetConverter(context, property.getConverter(), component);
}
else
{
// if there isn't a custom converter add the mime type converter as a default
createAndSetConverter(context, CharsetConverter.CONVERTER_ID, component);
}
}
}
@Override
protected void setupMandatoryValidation(FacesContext context,
UIPropertySheet propertySheet, PropertySheetItem item,
UIComponent component, boolean realTimeChecking, String idSuffix)
{
// a mime type selector will always have one value or another
// so there is no need to create a mandatory validation rule.
}
}

View File

@@ -22,7 +22,9 @@
* http://www.alfresco.com/legal/licensing" */ * http://www.alfresco.com/legal/licensing" */
package org.alfresco.web.bean.repository; package org.alfresco.web.bean.repository;
import java.io.InputStream;
import java.io.Serializable; import java.io.Serializable;
import java.nio.charset.Charset;
import java.text.MessageFormat; import java.text.MessageFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
@@ -37,6 +39,7 @@ import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.model.ContentModel; import org.alfresco.model.ContentModel;
import org.alfresco.repo.configuration.ConfigurableService; import org.alfresco.repo.configuration.ConfigurableService;
import org.alfresco.repo.content.MimetypeMap; import org.alfresco.repo.content.MimetypeMap;
import org.alfresco.repo.content.encoding.ContentCharsetFinder;
import org.alfresco.repo.content.metadata.MetadataExtracter; import org.alfresco.repo.content.metadata.MetadataExtracter;
import org.alfresco.repo.content.metadata.MetadataExtracterRegistry; import org.alfresco.repo.content.metadata.MetadataExtracterRegistry;
import org.alfresco.repo.transaction.RetryingTransactionHelper; import org.alfresco.repo.transaction.RetryingTransactionHelper;
@@ -508,6 +511,21 @@ public final class Repository
} }
} }
/**
* Extract the characterset from the stream
*
* @param context the Faces Context
* @param is the stream of characters or data
* @param mimetype the stream's mimetype, or <tt>null</tt> if unknown
* @return Returns the guessed characterset and never <tt>null</tt>
*/
public static String guessEncoding(FacesContext context, InputStream is, String mimetype)
{
ContentCharsetFinder charsetFinder = getServiceRegistry(context).getMimetypeService().getContentCharsetFinder();
Charset charset = charsetFinder.getCharset(is, mimetype);
return charset.name();
}
/** /**
* Query a list of Person type nodes from the repo * Query a list of Person type nodes from the repo
* It is currently assumed that all Person nodes exist below the Repository root node * It is currently assumed that all Person nodes exist below the Repository root node

View File

@@ -37,7 +37,6 @@ import org.alfresco.service.cmr.avm.AVMService;
import org.alfresco.service.cmr.repository.ContentWriter; import org.alfresco.service.cmr.repository.ContentWriter;
import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.namespace.QName; import org.alfresco.service.namespace.QName;
import org.alfresco.web.app.AlfrescoNavigationHandler;
import org.alfresco.web.bean.content.AddContentDialog; import org.alfresco.web.bean.content.AddContentDialog;
/** /**
@@ -101,7 +100,7 @@ public class AddAvmContentDialog extends AddContentDialog
// get a writer for the content and put the file // get a writer for the content and put the file
ContentWriter writer = contentService.getWriter(fileNodeRef, ContentModel.PROP_CONTENT, true); ContentWriter writer = contentService.getWriter(fileNodeRef, ContentModel.PROP_CONTENT, true);
writer.setMimetype(this.mimeType); writer.setMimetype(this.mimeType);
writer.setEncoding("UTF-8"); writer.setEncoding(this.encoding);
if (fileContent != null) if (fileContent != null)
{ {
writer.putContent(fileContent); writer.putContent(fileContent);

View File

@@ -0,0 +1,87 @@
/*
* Copyright (C) 2005-2007 Alfresco Software Limited.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* As a special exception to the terms and conditions of version 2.0 of
* the GPL, you may redistribute this Program in connection with Free/Libre
* and Open Source Software ("FLOSS") applications as described in Alfresco's
* FLOSS exception. You should have recieved a copy of the text describing
* the FLOSS exception, and it is also available here:
* http://www.alfresco.com/legal/licensing"
*/
package org.alfresco.web.ui.repo.component;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.faces.component.UISelectItems;
import javax.faces.component.UISelectOne;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
/**
* Component that holds a list of characterset encodings supported by the repository.
*
* @since 2.1
* @author Derek Hulley
*/
public class UICharsetSelector extends UISelectOne
{
public static final String COMPONENT_TYPE = "org.alfresco.faces.CharsetSelector";
public static final String COMPONENT_FAMILY = "javax.faces.SelectOne";
@Override
@SuppressWarnings("unchecked")
public void encodeBegin(FacesContext context) throws IOException
{
// if the component does not have any children yet create the
// list of Charsets the user can choose from as a child
// SelectItems component.
if (getChildren().size() == 0)
{
UISelectItems items = (UISelectItems)context.getApplication().createComponent("javax.faces.SelectItems");
items.setId(this.getId() + "_items");
items.setValue(createList());
// add the child component
getChildren().add(items);
}
// do the default processing
super.encodeBegin(context);
}
/**
* Creates the list of SelectItem components to represent the list
* of Charsets the user can select from
*
* @return List of SelectItem components
*/
protected List<SelectItem> createList()
{
Map<String, Charset> availableCharsets = Charset.availableCharsets();
List<SelectItem> items = new ArrayList<SelectItem>(availableCharsets.size());
for (Charset charset : availableCharsets.values())
{
SelectItem item = new SelectItem(charset.name(), charset.displayName());
items.add(item);
}
return items;
}
}

View File

@@ -0,0 +1,79 @@
/*
* Copyright (C) 2005-2007 Alfresco Software Limited.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* As a special exception to the terms and conditions of version 2.0 of
* the GPL, you may redistribute this Program in connection with Free/Libre
* and Open Source Software ("FLOSS") applications as described in Alfresco's
* FLOSS exception. You should have recieved a copy of the text describing
* the FLOSS exception, and it is also available here:
* http://www.alfresco.com/legal/licensing"
*/
package org.alfresco.web.ui.repo.converter;
import java.nio.charset.Charset;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import org.alfresco.i18n.I18NUtil;
/**
* Converter class to convert a Charset to a String
*
* @since 2.1
* @author Derek Hulley
*/
public class CharsetConverter implements Converter
{
/**
* <p>The standard converter id for this converter.</p>
*/
public static final String CONVERTER_ID = "org.alfresco.faces.CharsetConverter";
/**
* {@inheritDoc}
*/
public Object getAsObject(FacesContext context, UIComponent component, String value)
{
return value;
}
/**
* {@inheritDoc}
*/
public String getAsString(FacesContext context, UIComponent component, Object value)
{
if (value == null)
{
throw new IllegalArgumentException(I18NUtil.getMessage("error_charset_null"));
}
String result = null;
if (value instanceof Charset)
{
result = ((Charset)value).name();
}
else if (value != null)
{
result = value.toString();
}
return result;
}
}

View File

@@ -32,7 +32,7 @@ import org.alfresco.service.cmr.repository.MimetypeService;
import org.alfresco.web.bean.repository.Repository; import org.alfresco.web.bean.repository.Repository;
/** /**
* Converter class to convert an XML date representation into a Date * Converter class to convert a MIME type to an appropriate display name
* *
* @author gavinc * @author gavinc
*/ */

View File

@@ -0,0 +1,96 @@
/*
* Copyright (C) 2005-2007 Alfresco Software Limited.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* As a special exception to the terms and conditions of version 2.0 of
* the GPL, you may redistribute this Program in connection with Free/Libre
* and Open Source Software ("FLOSS") applications as described in Alfresco's
* FLOSS exception. You should have recieved a copy of the text describing
* the FLOSS exception, and it is also available here:
* http://www.alfresco.com/legal/licensing"
*/
package org.alfresco.web.ui.repo.tag;
import javax.faces.component.UIComponent;
import org.alfresco.web.ui.common.ComponentConstants;
import org.alfresco.web.ui.common.tag.HtmlComponentTag;
import org.alfresco.web.ui.repo.component.UICharsetSelector;
/**
* Tag class for the Charset selector component
*
* @since 2.1
* @author Derek Hulley
*/
public class CharsetSelectorTag extends HtmlComponentTag
{
/** The value */
private String value;
/** Whether the component is disabled */
private String disabled;
@Override
public String getComponentType()
{
return UICharsetSelector.COMPONENT_TYPE;
}
@Override
public String getRendererType()
{
return ComponentConstants.JAVAX_FACES_MENU;
}
@Override
protected void setProperties(UIComponent component)
{
super.setProperties(component);
setStringBindingProperty(component, "value", this.value);
setBooleanProperty(component, "disabled", this.disabled);
}
@Override
public void release()
{
super.release();
this.value = null;
this.disabled = null;
}
/**
* Set the value
*
* @param value the value
*/
public void setValue(String value)
{
this.value = value;
}
/**
* Sets whether the component should be rendered in a disabled state
*
* @param disabled true to render the component in a disabled state
*/
public void setDisabled(String disabled)
{
this.disabled = disabled;
}
}

View File

@@ -79,6 +79,11 @@
<component-class>org.alfresco.web.ui.repo.component.UILanguageSelector</component-class> <component-class>org.alfresco.web.ui.repo.component.UILanguageSelector</component-class>
</component> </component>
<component>
<component-type>org.alfresco.faces.CharsetSelector</component-type>
<component-class>org.alfresco.web.ui.repo.component.UICharsetSelector</component-class>
</component>
<component> <component>
<component-type>org.alfresco.faces.SimpleSearch</component-type> <component-type>org.alfresco.faces.SimpleSearch</component-type>
<component-class>org.alfresco.web.ui.repo.component.UISimpleSearch</component-class> <component-class>org.alfresco.web.ui.repo.component.UISimpleSearch</component-class>

View File

@@ -1034,6 +1034,42 @@
</tag> </tag>
<tag>
<name>charsetSelector</name>
<tag-class>org.alfresco.web.ui.repo.tag.CharsetSelectorTag</tag-class>
<body-content>JSP</body-content>
<attribute>
<name>id</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>binding</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>rendered</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>value</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>disabled</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
<tag> <tag>
<name>shelf</name> <name>shelf</name>
<tag-class>org.alfresco.web.ui.repo.tag.shelf.ShelfTag</tag-class> <tag-class>org.alfresco.web.ui.repo.tag.shelf.ShelfTag</tag-class>

View File

@@ -224,6 +224,17 @@ if (dialog != null && dialog.getFileName() != null)
</h:selectOneMenu> </h:selectOneMenu>
</td> </td>
</tr> </tr>
<tr>
<td></td>
<td>
<h:outputText id="text12" value="#{msg.encoding}:" />
</td>
<td>
<h:selectOneMenu id="encoding" value="#{AddContentDialog.encoding}">
<f:selectItems value="#{AddContentDialog.encodings}" />
</h:selectOneMenu>
</td>
</tr>
<tr> <tr>
<td></td> <td></td>
<td> <td>

View File

@@ -222,6 +222,15 @@ if (dialog != null && dialog.getFileName() != null)
<r:mimeTypeSelector id="mime-type" value="#{AddAvmContentDialog.mimeType}" /> <r:mimeTypeSelector id="mime-type" value="#{AddAvmContentDialog.mimeType}" />
</td> </td>
</tr> </tr>
<tr>
<td></td>
<td>
<h:outputText id="text8" value="#{msg.encoding}:" />
</td>
<td>
<r:charsetSelector id="charset" value="#{AddAvmContentDialog.encoding}" />
</td>
</tr>
<% } %> <% } %>
</table> </table>