Fix for ALFCOM-2306

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@12692 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Kevin Roast
2009-01-12 14:55:29 +00:00
parent 34ca11c803
commit 10bc69cc63
3 changed files with 507 additions and 512 deletions

View File

@@ -38,7 +38,6 @@ import java.util.Map;
import java.util.Set; import java.util.Set;
import javax.faces.context.FacesContext; import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
import javax.faces.event.ActionEvent; import javax.faces.event.ActionEvent;
import javax.transaction.UserTransaction; import javax.transaction.UserTransaction;
@@ -46,7 +45,7 @@ import org.alfresco.config.Config;
import org.alfresco.config.ConfigElement; import org.alfresco.config.ConfigElement;
import org.alfresco.config.ConfigService; import org.alfresco.config.ConfigService;
import org.alfresco.model.ApplicationModel; import org.alfresco.model.ApplicationModel;
import org.alfresco.model.ContentModel; import org.alfresco.model.ContentModel;
import org.alfresco.repo.search.SearcherException; import org.alfresco.repo.search.SearcherException;
import org.alfresco.repo.site.SiteModel; import org.alfresco.repo.site.SiteModel;
import org.alfresco.repo.web.scripts.FileTypeImageUtils; import org.alfresco.repo.web.scripts.FileTypeImageUtils;
@@ -1728,7 +1727,7 @@ public class BrowseBean implements IContextListener, Serializable
Node node = getActionSpace(); Node node = getActionSpace();
if (node != null) if (node != null)
{ {
FacesContext fc = FacesContext.getCurrentInstance(); FacesContext fc = FacesContext.getCurrentInstance();
NodeRef companyRootRef = new NodeRef(Repository.getStoreRef(), Application.getCompanyRootId(fc)); NodeRef companyRootRef = new NodeRef(Repository.getStoreRef(), Application.getCompanyRootId(fc));
if (node.getNodeRef().equals(companyRootRef)) if (node.getNodeRef().equals(companyRootRef))
{ {
@@ -1767,13 +1766,13 @@ public class BrowseBean implements IContextListener, Serializable
// remember the bean from wich the action comes // remember the bean from wich the action comes
DocumentDetailsDialog docDetails = (DocumentDetailsDialog)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("DocumentDetailsDialog"); DocumentDetailsDialog docDetails = (DocumentDetailsDialog)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("DocumentDetailsDialog");
docDetails.setTranslationDocument(new Node(translation)); docDetails.setTranslationDocument(new MapNode(translation));
// set the ml container as the current document // set the ml container as the current document
NodeRef mlContainer = getMultilingualContentService().getTranslationContainer(translation); NodeRef mlContainer = getMultilingualContentService().getTranslationContainer(translation);
setupContentAction(mlContainer.getId(), true); setupContentAction(mlContainer.getId(), true);
} }
/** /**
* Public helper to setup action pages with content context * Public helper to setup action pages with content context

View File

@@ -57,280 +57,278 @@ import org.alfresco.web.ui.common.component.UIPanel.ExpandedEvent;
public class MultilingualManageDialog extends BaseDialogBean public class MultilingualManageDialog extends BaseDialogBean
{ {
private static final long serialVersionUID = 4168804472130450812L; private static final long serialVersionUID = 4168804472130450812L;
private final String MSG_MANAGE_DETAILS_FOR="manage_multilingual_details_for";
private static final String MSG_CURRENT = "current";
private static final String ML_VERSION_PANEL_ID = "ml-versions-panel";
private static final String MSG_CLOSE = "close";
protected Map<String, Boolean> panels = new HashMap<String, Boolean>(4, 1.0f);
transient private MultilingualContentService multilingualContentService;
transient private ContentFilterLanguagesService contentFilterLanguagesService;
transient private EditionService editionService;
transient private VersionService versionService;
private Node translationDocument;
/** For the client side iteration on the edition hitories list, it represents the index of the list */
private int currentEditionCursorPosition;
/** List of client light weight edition histories */
private List<SingleEditionBean> editionHistory = null;
/**
* Returns the document this bean is currently representing
*
* @return The document Node
*/
public Node getDocument()
{
return this.getNode();
}
/**
* Returns the Node this bean is currently representing
*
* @return The Node
*/
public Node getNode()
{
return this.browseBean.getDocument();
}
/**
* @param multilingualContentService the multilingual ContentService to set
*/
public void setMultilingualContentService(MultilingualContentService multilingualContentService)
{
this.multilingualContentService = multilingualContentService;
}
/**
* @return multilingualContentService
*/
protected MultilingualContentService getMultilingualContentService()
{
//check for null for cluster environment
if (multilingualContentService == null)
{
multilingualContentService = Repository.getServiceRegistry(FacesContext.getCurrentInstance()).getMultilingualContentService();
}
return multilingualContentService;
}
/**
* @param contentFilterLanguagesService The Content Filter Languages Service to set.
*/
public void setContentFilterLanguagesService(ContentFilterLanguagesService contentFilterLanguagesService)
{
this.contentFilterLanguagesService = contentFilterLanguagesService;
}
/** private final String MSG_MANAGE_DETAILS_FOR="manage_multilingual_details_for";
* @return contentFilterLanguagesService private static final String MSG_CURRENT = "current";
*/ private static final String ML_VERSION_PANEL_ID = "ml-versions-panel";
protected ContentFilterLanguagesService getContentFilterLanguagesService() private static final String MSG_CLOSE = "close";
{
//check for null for cluster environment protected Map<String, Boolean> panels = new HashMap<String, Boolean>(4, 1.0f);
if (contentFilterLanguagesService == null)
{ transient private MultilingualContentService multilingualContentService;
contentFilterLanguagesService = Repository.getServiceRegistry(FacesContext.getCurrentInstance()).getContentFilterLanguagesService(); transient private ContentFilterLanguagesService contentFilterLanguagesService;
} transient private EditionService editionService;
return contentFilterLanguagesService; transient private VersionService versionService;
}
private Node translationDocument;
/** For the client side iteration on the edition hitories list, it represents the index of the list */
private int currentEditionCursorPosition;
/** List of client light weight edition histories */
private List<SingleEditionBean> editionHistory = null;
/**
* Returns the document this bean is currently representing
*
* @return The document Node
*/
public Node getDocument()
{
return this.getNode();
}
/**
* Returns the Node this bean is currently representing
*
* @return The Node
*/
public Node getNode()
{
return this.browseBean.getDocument();
}
/**
* @param multilingualContentService the multilingual ContentService to set
*/
public void setMultilingualContentService(MultilingualContentService multilingualContentService)
{
this.multilingualContentService = multilingualContentService;
}
/**
* @return multilingualContentService
*/
protected MultilingualContentService getMultilingualContentService()
{
//check for null for cluster environment
if (multilingualContentService == null)
{
multilingualContentService = Repository.getServiceRegistry(FacesContext.getCurrentInstance()).getMultilingualContentService();
}
return multilingualContentService;
}
/**
* @param contentFilterLanguagesService The Content Filter Languages Service to set.
*/
public void setContentFilterLanguagesService(ContentFilterLanguagesService contentFilterLanguagesService)
{
this.contentFilterLanguagesService = contentFilterLanguagesService;
}
/**
* @return contentFilterLanguagesService
*/
protected ContentFilterLanguagesService getContentFilterLanguagesService()
{
//check for null for cluster environment
if (contentFilterLanguagesService == null)
{
contentFilterLanguagesService = Repository.getServiceRegistry(FacesContext.getCurrentInstance()).getContentFilterLanguagesService();
}
return contentFilterLanguagesService;
}
/**
* @param EditionService The Edition Service to set.
*/
public void setEditionService(EditionService editionService)
{
this.editionService = editionService;
}
/**
* @return editionService
*/
protected EditionService getEditionService()
{
//check for null for cluster environment
if (editionService == null)
{
editionService = Repository.getServiceRegistry(FacesContext.getCurrentInstance()).getEditionService();
}
return editionService;
}
/**
* Sets the version service instance the bean should use
*
* @param versionService The VersionService
*/
public void setVersionService(VersionService versionService)
{
this.versionService = versionService;
}
/**
* @return versionService
*/
protected VersionService getVersionService()
{
//check for null for cluster environment
if (versionService == null)
{
versionService = Repository.getServiceRegistry(FacesContext.getCurrentInstance()).getVersionService();
}
return versionService;
}
/**
* Before opening the ml container details, remeber the translation
* from which the action comes.
*
* @param node
*/
public void setTranslationDocument(Node node)
{
this.translationDocument = node;
}
/**
* @return Returns the panels expanded state map.
*/
public Map<String, Boolean> getPanels()
{
return this.panels;
}
@Override
protected String finishImpl(FacesContext context, String outcome) throws Exception
{
// TODO Auto-generated method stub
return null;
}
@Override
public String getContainerTitle()
{
return Application.getMessage(FacesContext.getCurrentInstance(), MSG_MANAGE_DETAILS_FOR) + " '" + getDocument().getName() + "'";
}
@Override
public String getCancelButtonLabel()
{
return Application.getMessage(FacesContext.getCurrentInstance(), MSG_CLOSE);
}
/**
* @param EditionService The Edition Service to set.
*/
public void setEditionService(EditionService editionService)
{
this.editionService = editionService;
}
/**
* @return editionService
*/
protected EditionService getEditionService()
{
//check for null for cluster environment
if (editionService == null)
{
editionService = Repository.getServiceRegistry(FacesContext.getCurrentInstance()).getEditionService();
}
return editionService;
}
/**
* Sets the version service instance the bean should use
*
* @param versionService The VersionService
*/
public void setVersionService(VersionService versionService)
{
this.versionService = versionService;
}
/**
* @return versionService
*/
protected VersionService getVersionService()
{
//check for null for cluster environment
if (versionService == null)
{
versionService = Repository.getServiceRegistry(FacesContext.getCurrentInstance()).getVersionService();
}
return versionService;
}
/**
* Before opening the ml container details, remeber the translation
* from which the action comes.
*
* @param node
*/
public void setTranslationDocument(Node node)
{
this.translationDocument = node;
}
/**
* @return Returns the panels expanded state map.
*/
public Map<String, Boolean> getPanels()
{
return this.panels;
}
@Override
protected String finishImpl(FacesContext context, String outcome) throws Exception
{
// TODO Auto-generated method stub
return null;
}
@Override
public String getContainerTitle()
{
return Application.getMessage(FacesContext.getCurrentInstance(), MSG_MANAGE_DETAILS_FOR) + " '" + getDocument().getName() + "'";
}
@Override
public String getCancelButtonLabel()
{
return Application.getMessage(FacesContext.getCurrentInstance(), MSG_CLOSE);
}
/** /**
* Returns a list of objects representing the translations of the current document * Returns a list of objects representing the translations of the current document
* *
* @return List of translations * @return List of translations
*/ */
public List getTranslations() public List getTranslations()
{ {
List<MapNode> translations = new ArrayList<MapNode>(); List<MapNode> translations = new ArrayList<MapNode>();
Node document = getDocument(); Node document = getDocument();
boolean canNewEdtion = MultilingualUtils.canStartNewEditon(document, FacesContext.getCurrentInstance()); boolean canNewEdtion = MultilingualUtils.canStartNewEditon(document, FacesContext.getCurrentInstance());
if (document.hasAspect(ContentModel.ASPECT_MULTILINGUAL_DOCUMENT) || ContentModel.TYPE_MULTILINGUAL_CONTAINER.equals(document.getType())) if (document.hasAspect(ContentModel.ASPECT_MULTILINGUAL_DOCUMENT) || ContentModel.TYPE_MULTILINGUAL_CONTAINER.equals(document.getType()))
{ {
Map<Locale, NodeRef> translationsMap = getMultilingualContentService().getTranslations(getDocument().getNodeRef()); Map<Locale, NodeRef> translationsMap = getMultilingualContentService().getTranslations(getDocument().getNodeRef());
if (translationsMap != null && translationsMap.size() > 0) if (translationsMap != null && translationsMap.size() > 0)
{ {
for (Map.Entry entry : translationsMap.entrySet()) for (Map.Entry entry : translationsMap.entrySet())
{
NodeRef nodeRef = (NodeRef) entry.getValue();
// create a map node representation of the translation
MapNode mapNode = new MapNode(nodeRef);
Locale locale = (Locale) getNodeService().getProperty(nodeRef, ContentModel.PROP_LOCALE);
String lgge = (locale != null) ?
// convert the locale into new ISO codes
getContentFilterLanguagesService().convertToNewISOCode(locale.getLanguage()).toUpperCase()
: null;
mapNode.put("name", getNodeService().getProperty(nodeRef, ContentModel.PROP_NAME));
mapNode.put("language", lgge);
mapNode.put("url", DownloadContentServlet.generateBrowserURL(nodeRef, mapNode.getName()));
boolean isEmpty = new Boolean(getNodeService().hasAspect(nodeRef, ContentModel.ASPECT_MULTILINGUAL_EMPTY_TRANSLATION));
mapNode.put("notEmpty", !isEmpty);
mapNode.put("userHasRight", new Boolean(canNewEdtion && !isEmpty));
// add the client side version to the list
translations.add(mapNode);
}
}
}
return translations;
}
/**
* Init the mlContainer histories and returns an empty list to fill a rich list value without content.
*
* @return an empty list
*/
public List getEmptyListAndInitEditions()
{
// this call ensures that the edition of the mlContainer must be
// re-initialized.
// remove each old mlContainer's translations of the panel list
List<String> panelsToRemove = new ArrayList<String>();
for(Map.Entry<String, Boolean> panel : panels.entrySet())
{
if(panel.getKey().startsWith(ML_VERSION_PANEL_ID))
{ {
//panels.remove(panel.getKey()); NodeRef nodeRef = (NodeRef) entry.getValue();
panelsToRemove.add(panel.getKey());
// create a map node representation of the translation
MapNode mapNode = new MapNode(nodeRef);
Locale locale = (Locale) getNodeService().getProperty(nodeRef, ContentModel.PROP_LOCALE);
String lgge = (locale != null) ?
// convert the locale into new ISO codes
getContentFilterLanguagesService().convertToNewISOCode(locale.getLanguage()).toUpperCase()
: null;
mapNode.put("name", getNodeService().getProperty(nodeRef, ContentModel.PROP_NAME));
mapNode.put("language", lgge);
mapNode.put("url", DownloadContentServlet.generateBrowserURL(nodeRef, mapNode.getName()));
boolean isEmpty = new Boolean(getNodeService().hasAspect(nodeRef, ContentModel.ASPECT_MULTILINGUAL_EMPTY_TRANSLATION));
mapNode.put("notEmpty", !isEmpty);
mapNode.put("userHasRight", new Boolean(canNewEdtion && !isEmpty));
// add the client side version to the list
translations.add(mapNode);
} }
} }
}
for(String panelId : panelsToRemove) return translations;
{ }
panels.remove(panelId);
}
// init the Edition histories /**
initEditionHistory(); * Init the mlContainer histories and returns an empty list to fill a rich list value without content.
currentEditionCursorPosition = -1; *
* @return an empty list
*/
public List getEmptyListAndInitEditions()
{
// this call ensures that the edition of the mlContainer must be
// re-initialized.
return new ArrayList(0); // remove each old mlContainer's translations of the panel list
} List<String> panelsToRemove = new ArrayList<String>();
for(Map.Entry<String, Boolean> panel : panels.entrySet())
/** {
* For the client side iteration on the edition hitories list, returns the number of editions. if(panel.getKey().startsWith(ML_VERSION_PANEL_ID))
* {
* @return the number of edition of the current mlContainer //panels.remove(panel.getKey());
*/ panelsToRemove.add(panel.getKey());
public int getEditionSize() }
{ }
// return the size of the list
return editionHistory.size();
}
/**
* For the client side iteration on the edition hitories list,
* return the next edition history.
*
* @return a light weight representation of an edition history
*/
public SingleEditionBean getNextSingleEditionBean()
{
currentEditionCursorPosition++;
return getCurrentSingleEditionBean(); for(String panelId : panelsToRemove)
} {
panels.remove(panelId);
}
// init the Edition histories
initEditionHistory();
currentEditionCursorPosition = -1;
return new ArrayList(0);
}
/**
* For the client side iteration on the edition hitories list, returns the number of editions.
*
* @return the number of edition of the current mlContainer
*/
public int getEditionSize()
{
// return the size of the list
return editionHistory.size();
}
/**
* For the client side iteration on the edition hitories list,
* return the next edition history.
*
* @return a light weight representation of an edition history
*/
public SingleEditionBean getNextSingleEditionBean()
{
currentEditionCursorPosition++;
return getCurrentSingleEditionBean();
}
/** /**
* For the client side iteration on the edition hitories list, * For the client side iteration on the edition hitories list,
@@ -338,202 +336,201 @@ public class MultilingualManageDialog extends BaseDialogBean
* *
* @return a light weight representation of an edition history * @return a light weight representation of an edition history
*/ */
public SingleEditionBean getCurrentSingleEditionBean() public SingleEditionBean getCurrentSingleEditionBean()
{ {
if (currentEditionCursorPosition < getEditionSize()) if (currentEditionCursorPosition < getEditionSize())
{ {
return editionHistory.get(currentEditionCursorPosition); return editionHistory.get(currentEditionCursorPosition);
} }
return null;
}
/**
* Restore the translationf from which the ml container
* details dialog comes.
*/
public void resetMLDocument(ActionEvent event)
{
this.browseBean.setupCommonBindingProperties(this.translationDocument);
this.browseBean.setDocument(this.translationDocument);
}
/** return null;
* Action handler to remove a custom view template from the current node }
*/
public void removeTemplate(ActionEvent event)
{
try
{
// clear template property
this.getNodeService().setProperty(getNode().getNodeRef(), ContentModel.PROP_TEMPLATE, null);
this.getNodeService().removeAspect(getNode().getNodeRef(), ContentModel.ASPECT_TEMPLATABLE);
// reset node details for next refresh of details page
getNode().reset();
}
catch (Exception e)
{
Utils.addErrorMessage(MessageFormat.format(Application.getMessage(
FacesContext.getCurrentInstance(), Repository.ERROR_GENERIC), e.getMessage()), e);
}
}
/**
* Save the state of the panel that was expanded/collapsed
*/
public void expandPanel(ActionEvent event)
{
if (event instanceof ExpandedEvent)
{
String id = event.getComponent().getId();
// we prefix some panels with "no-" which we remove to give consistent behaviour in the UI
if (id.startsWith("no-") == true)
{
id = id.substring(3);
}
this.panels.put(id, ((ExpandedEvent)event).State);
}
String id = event.getComponent().getId();
if(id.startsWith(ML_VERSION_PANEL_ID)) /**
{ * Restore the translationf from which the ml container
this.currentEditionCursorPosition = Integer.parseInt(id.substring("ml-versions-panel".length())) - 1; * details dialog comes.
} */
} public void resetMLDocument(ActionEvent event)
{
this.browseBean.setupCommonBindingProperties(this.translationDocument);
/** this.browseBean.setDocument(this.translationDocument);
* Returns the ml container of the document this bean is currently representing }
*
* @return The document multilingual container NodeRef
*/
public Node getDocumentMlContainer()
{
Node currentNode = getNode();
if(ContentModel.TYPE_MULTILINGUAL_CONTAINER.equals(currentNode.getType())) /**
{ * Action handler to remove a custom view template from the current node
return currentNode; */
} public void removeTemplate(ActionEvent event)
else {
{ try
NodeRef nodeRef = getNode().getNodeRef(); {
// clear template property
this.getNodeService().setProperty(getNode().getNodeRef(), ContentModel.PROP_TEMPLATE, null);
this.getNodeService().removeAspect(getNode().getNodeRef(), ContentModel.ASPECT_TEMPLATABLE);
return new Node(getMultilingualContentService().getTranslationContainer(nodeRef)); // reset node details for next refresh of details page
} getNode().reset();
} }
catch (Exception e)
/** {
* Constructs a list of objects representing the editions of the Utils.addErrorMessage(MessageFormat.format(Application.getMessage(
* logical document FacesContext.getCurrentInstance(), Repository.ERROR_GENERIC), e.getMessage()), e);
* }
* @return List of editions }
*/
@SuppressWarnings("unchecked")
private List<SingleEditionBean> initEditionHistory()
{
// get the mlContainer
NodeRef mlContainer = getDocumentMlContainer().getNodeRef();
// get all editions and sort them ascending according their version label /**
List<Version> orderedEditionList = new ArrayList<Version>(getEditionService().getEditions(mlContainer).getAllVersions()); * Save the state of the panel that was expanded/collapsed
Collections.sort(orderedEditionList, new VersionLabelComparator()); */
public void expandPanel(ActionEvent event)
{
if (event instanceof ExpandedEvent)
{
String id = event.getComponent().getId();
// we prefix some panels with "no-" which we remove to give consistent behaviour in the UI
if (id.startsWith("no-") == true)
{
id = id.substring(3);
}
this.panels.put(id, ((ExpandedEvent)event).State);
}
// the list of Single Edition Bean to return String id = event.getComponent().getId();
editionHistory = new ArrayList<SingleEditionBean>(orderedEditionList.size());
boolean firstEdition = true; if(id.startsWith(ML_VERSION_PANEL_ID))
{
this.currentEditionCursorPosition = Integer.parseInt(id.substring("ml-versions-panel".length())) - 1;
}
}
// for each edition, init a SingleEditionBean
for (Version edition : orderedEditionList)
{
SingleEditionBean editionBean = new SingleEditionBean();
MapNode clientEdition = new MapNode(edition.getFrozenStateNodeRef()); /**
* Returns the ml container of the document this bean is currently representing
*
* @return The document multilingual container NodeRef
*/
public Node getDocumentMlContainer()
{
Node currentNode = getNode();
String editionLabel = edition.getVersionLabel(); if(ContentModel.TYPE_MULTILINGUAL_CONTAINER.equals(currentNode.getType()))
if (firstEdition) {
return currentNode;
}
else
{
NodeRef nodeRef = getNode().getNodeRef();
return new Node(getMultilingualContentService().getTranslationContainer(nodeRef));
}
}
/**
* Constructs a list of objects representing the editions of the
* logical document
*
* @return List of editions
*/
@SuppressWarnings("unchecked")
private List<SingleEditionBean> initEditionHistory()
{
// get the mlContainer
NodeRef mlContainer = getDocumentMlContainer().getNodeRef();
// get all editions and sort them ascending according their version label
List<Version> orderedEditionList = new ArrayList<Version>(getEditionService().getEditions(mlContainer).getAllVersions());
Collections.sort(orderedEditionList, new VersionLabelComparator());
// the list of Single Edition Bean to return
editionHistory = new ArrayList<SingleEditionBean>(orderedEditionList.size());
boolean firstEdition = true;
// for each edition, init a SingleEditionBean
for (Version edition : orderedEditionList)
{
SingleEditionBean editionBean = new SingleEditionBean();
MapNode clientEdition = new MapNode(edition.getFrozenStateNodeRef());
String editionLabel = edition.getVersionLabel();
if (firstEdition)
{
editionLabel += " (" + Application.getMessage(FacesContext.getCurrentInstance(), MSG_CURRENT) + ")";
}
clientEdition.put("editionLabel", editionLabel);
clientEdition.put("editionNotes", edition.getDescription());
clientEdition.put("editionAuthor", edition.getCreator());
clientEdition.put("editionDate", edition.getCreatedDate());
// Set the edition of the edition bean
editionBean.setEdition(clientEdition);
// get translations
List<VersionHistory> translationHistories = null;
if (firstEdition)
{
// Get the translations because the current edition doesn't content link with its
// translation in the version store.
Map<Locale, NodeRef> translations = getMultilingualContentService().getTranslations(mlContainer);
translationHistories = new ArrayList<VersionHistory>(translations.size());
for (NodeRef translation : translations.values())
{ {
editionLabel += " (" + Application.getMessage(FacesContext.getCurrentInstance(), MSG_CURRENT) + ")"; translationHistories.add(getVersionService().getVersionHistory(translation));
} }
}
else
{
translationHistories = getEditionService().getVersionedTranslations(edition);
}
clientEdition.put("editionLabel", editionLabel); // add each translation in the SingleEditionBean
clientEdition.put("editionNotes", edition.getDescription()); for (VersionHistory versionHistory : translationHistories)
clientEdition.put("editionAuthor", edition.getCreator()); {
clientEdition.put("editionDate", edition.getCreatedDate()); // get the list of versions and sort them ascending according their version label
List<Version> orderedVersions = new ArrayList<Version>(versionHistory.getAllVersions());
Collections.sort(orderedVersions, new VersionLabelComparator());
// Set the edition of the edition bean // the last version is the first version of the list
editionBean.setEdition(clientEdition); Version lastVersion = orderedVersions.get(0);
// get translations // get the properties of the lastVersion
List<VersionHistory> translationHistories = null; Map<QName, Serializable> lastVersionProperties = getEditionService().getVersionedMetadatas(lastVersion);
Locale language = (Locale) lastVersionProperties.get(ContentModel.PROP_LOCALE);
if (firstEdition) // create a map node representation of the last version
MapNode clientLastVersion = new MapNode(lastVersion.getFrozenStateNodeRef());
clientLastVersion.put("versionName", lastVersionProperties.get(ContentModel.PROP_NAME));
// use the node service for the description to ensure that the returned value is a text and not a MLText
clientLastVersion.put("versionDescription", getNodeService().getProperty(lastVersion.getFrozenStateNodeRef(), ContentModel.PROP_DESCRIPTION));
clientLastVersion.put("versionAuthor", lastVersionProperties.get(ContentModel.PROP_AUTHOR));
clientLastVersion.put("versionCreatedDate", lastVersionProperties.get(ContentModel.PROP_CREATED));
clientLastVersion.put("versionModifiedDate", lastVersionProperties.get(ContentModel.PROP_MODIFIED));
clientLastVersion.put("versionLanguage", getContentFilterLanguagesService().convertToNewISOCode(language.getLanguage()).toUpperCase());
if(getNodeService().hasAspect(lastVersion.getFrozenStateNodeRef(), ContentModel.ASPECT_MULTILINGUAL_EMPTY_TRANSLATION))
{ {
// Get the translations because the current edition doesn't content link with its clientLastVersion.put("versionUrl", null);
// translation in the version store.
Map<Locale, NodeRef> translations = getMultilingualContentService().getTranslations(mlContainer);
translationHistories = new ArrayList<VersionHistory>(translations.size());
for (NodeRef translation : translations.values())
{
translationHistories.add(getVersionService().getVersionHistory(translation));
}
} }
else else
{ {
translationHistories = getEditionService().getVersionedTranslations(edition); clientLastVersion.put("versionUrl", DownloadContentServlet.generateBrowserURL(lastVersion.getFrozenStateNodeRef(), clientLastVersion.getName()));
} }
// add each translation in the SingleEditionBean // add a translation of the editionBean
for (VersionHistory versionHistory : translationHistories) editionBean.addTranslations(clientLastVersion);
{ }
// get the list of versions and sort them ascending according their version label editionHistory.add(editionBean);
List<Version> orderedVersions = new ArrayList<Version>(versionHistory.getAllVersions()); firstEdition = false;
Collections.sort(orderedVersions, new VersionLabelComparator()); }
// the last version is the first version of the list return editionHistory;
Version lastVersion = orderedVersions.get(0); }
@Override
// get the properties of the lastVersion
Map<QName, Serializable> lastVersionProperties = getEditionService().getVersionedMetadatas(lastVersion);
Locale language = (Locale) lastVersionProperties.get(ContentModel.PROP_LOCALE);
// create a map node representation of the last version
MapNode clientLastVersion = new MapNode(lastVersion.getFrozenStateNodeRef());
clientLastVersion.put("versionName", lastVersionProperties.get(ContentModel.PROP_NAME));
// use the node service for the description to ensure that the returned value is a text and not a MLText
clientLastVersion.put("versionDescription", getNodeService().getProperty(lastVersion.getFrozenStateNodeRef(), ContentModel.PROP_DESCRIPTION));
clientLastVersion.put("versionAuthor", lastVersionProperties.get(ContentModel.PROP_AUTHOR));
clientLastVersion.put("versionCreatedDate", lastVersionProperties.get(ContentModel.PROP_CREATED));
clientLastVersion.put("versionModifiedDate", lastVersionProperties.get(ContentModel.PROP_MODIFIED));
clientLastVersion.put("versionLanguage", getContentFilterLanguagesService().convertToNewISOCode(language.getLanguage()).toUpperCase());
if(getNodeService().hasAspect(lastVersion.getFrozenStateNodeRef(), ContentModel.ASPECT_MULTILINGUAL_EMPTY_TRANSLATION))
{
clientLastVersion.put("versionUrl", null);
}
else
{
clientLastVersion.put("versionUrl", DownloadContentServlet.generateBrowserURL(lastVersion.getFrozenStateNodeRef(), clientLastVersion.getName()));
}
// add a translation of the editionBean
editionBean.addTranslations(clientLastVersion);
}
editionHistory.add(editionBean);
firstEdition = false;
}
return editionHistory;
}
@Override
protected String getDefaultCancelOutcome() protected String getDefaultCancelOutcome()
{ {
resetMLDocument(null); resetMLDocument(null);
return "dialog:close"; return "dialog:close";
} }
} }

View File

@@ -7,7 +7,7 @@
<managed-bean> <managed-bean>
<description> <description>
The bean for the Delete Category screen. The bean for the Manage Multilingual dialog.
</description> </description>
<managed-bean-name>MultilingualManageDialog</managed-bean-name> <managed-bean-name>MultilingualManageDialog</managed-bean-name>
<managed-bean-class> <managed-bean-class>
@@ -43,6 +43,7 @@
<value>#{DocumentDetailsDialog.translationDocument}</value> <value>#{DocumentDetailsDialog.translationDocument}</value>
</managed-property> </managed-property>
</managed-bean> </managed-bean>
<managed-bean> <managed-bean>
<description> <description>
The bean for the Manage Permissions. The bean for the Manage Permissions.
@@ -52,7 +53,6 @@
org.alfresco.web.bean.wcm.ManagePermissionsDialog org.alfresco.web.bean.wcm.ManagePermissionsDialog
</managed-bean-class> </managed-bean-class>
<managed-bean-scope>session</managed-bean-scope> <managed-bean-scope>session</managed-bean-scope>
<managed-property> <managed-property>
<property-name>personService</property-name> <property-name>personService</property-name>
<value>#{PersonService}</value> <value>#{PersonService}</value>
@@ -61,7 +61,6 @@
<property-name>avmBrowseBean</property-name> <property-name>avmBrowseBean</property-name>
<value>#{AVMBrowseBean}</value> <value>#{AVMBrowseBean}</value>
</managed-property> </managed-property>
</managed-bean> </managed-bean>
<managed-bean> <managed-bean>
@@ -481,43 +480,43 @@
<managed-bean> <managed-bean>
<description> <description>
The bean that backs up the Delete Space Association Dialog The bean that backs up the Delete Space Association Dialog
</description> </description>
<managed-bean-name>DeleteSpaceAssociationDialog</managed-bean-name> <managed-bean-name>DeleteSpaceAssociationDialog</managed-bean-name>
<managed-bean-class>org.alfresco.web.bean.spaces.DeleteSpaceAssociationDialog</managed-bean-class> <managed-bean-class>org.alfresco.web.bean.spaces.DeleteSpaceAssociationDialog</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope> <managed-bean-scope>session</managed-bean-scope>
<managed-property> <managed-property>
<property-name>nodeService</property-name> <property-name>nodeService</property-name>
<value>#{NodeService}</value> <value>#{NodeService}</value>
</managed-property> </managed-property>
<managed-property> <managed-property>
<property-name>fileFolderService</property-name> <property-name>fileFolderService</property-name>
<value>#{FileFolderService}</value> <value>#{FileFolderService}</value>
</managed-property> </managed-property>
<managed-property> <managed-property>
<property-name>searchService</property-name> <property-name>searchService</property-name>
<value>#{SearchService}</value> <value>#{SearchService}</value>
</managed-property> </managed-property>
<managed-property> <managed-property>
<property-name>navigator</property-name> <property-name>navigator</property-name>
<value>#{NavigationBean}</value> <value>#{NavigationBean}</value>
</managed-property> </managed-property>
<managed-property> <managed-property>
<property-name>browseBean</property-name> <property-name>browseBean</property-name>
<value>#{BrowseBean}</value> <value>#{BrowseBean}</value>
</managed-property> </managed-property>
<managed-property> <managed-property>
<property-name>dictionaryService</property-name> <property-name>dictionaryService</property-name>
<value>#{DictionaryService}</value> <value>#{DictionaryService}</value>
</managed-property> </managed-property>
<managed-property> <managed-property>
<property-name>namespaceService</property-name> <property-name>namespaceService</property-name>
<value>#{NamespaceService}</value> <value>#{NamespaceService}</value>
</managed-property> </managed-property>
</managed-bean> </managed-bean>
<managed-bean> <managed-bean>
<description> <description>
The bean that manages a users Clipboard state. The bean that manages a users Clipboard state.
</description> </description>
<managed-bean-name>ClipboardBean</managed-bean-name> <managed-bean-name>ClipboardBean</managed-bean-name>
@@ -3624,43 +3623,43 @@
<managed-bean> <managed-bean>
<description> <description>
The bean that backs up the Delete Content Association Dialog The bean that backs up the Delete Content Association Dialog
</description> </description>
<managed-bean-name>DeleteContentAssociationDialog</managed-bean-name> <managed-bean-name>DeleteContentAssociationDialog</managed-bean-name>
<managed-bean-class>org.alfresco.web.bean.content.DeleteContentAssociationDialog</managed-bean-class> <managed-bean-class>org.alfresco.web.bean.content.DeleteContentAssociationDialog</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope> <managed-bean-scope>session</managed-bean-scope>
<managed-property> <managed-property>
<property-name>nodeService</property-name> <property-name>nodeService</property-name>
<value>#{NodeService}</value> <value>#{NodeService}</value>
</managed-property> </managed-property>
<managed-property> <managed-property>
<property-name>fileFolderService</property-name> <property-name>fileFolderService</property-name>
<value>#{FileFolderService}</value> <value>#{FileFolderService}</value>
</managed-property> </managed-property>
<managed-property> <managed-property>
<property-name>searchService</property-name> <property-name>searchService</property-name>
<value>#{SearchService}</value> <value>#{SearchService}</value>
</managed-property> </managed-property>
<managed-property> <managed-property>
<property-name>navigator</property-name> <property-name>navigator</property-name>
<value>#{NavigationBean}</value> <value>#{NavigationBean}</value>
</managed-property> </managed-property>
<managed-property> <managed-property>
<property-name>browseBean</property-name> <property-name>browseBean</property-name>
<value>#{BrowseBean}</value> <value>#{BrowseBean}</value>
</managed-property> </managed-property>
<managed-property> <managed-property>
<property-name>dictionaryService</property-name> <property-name>dictionaryService</property-name>
<value>#{DictionaryService}</value> <value>#{DictionaryService}</value>
</managed-property> </managed-property>
<managed-property> <managed-property>
<property-name>namespaceService</property-name> <property-name>namespaceService</property-name>
<value>#{NamespaceService}</value> <value>#{NamespaceService}</value>
</managed-property> </managed-property>
</managed-bean> </managed-bean>
<managed-bean> <managed-bean>
<description> <description>
The bean that backs up the Delete AVM Folder Dialog The bean that backs up the Delete AVM Folder Dialog
</description> </description>
<managed-bean-name>DeleteFolderDialog</managed-bean-name> <managed-bean-name>DeleteFolderDialog</managed-bean-name>