diff --git a/zanata-war/src/main/java/org/zanata/action/ProjectHome.java b/zanata-war/src/main/java/org/zanata/action/ProjectHome.java index 7657f646b6..bbf59cbdd6 100644 --- a/zanata-war/src/main/java/org/zanata/action/ProjectHome.java +++ b/zanata-war/src/main/java/org/zanata/action/ProjectHome.java @@ -543,7 +543,8 @@ private boolean enableLocaleSilently(LocaleId localeId) { */ private boolean enableLocaleSilently(HLocale locale) { ensureOverridingLocales(); - final boolean localeWasDisabled = getInstance().getCustomizedLocales().add(locale); + final boolean localeWasDisabled = getInstance().getCustomizedLocales().add( + locale); refreshDisabledLocales(); return localeWasDisabled; } @@ -696,9 +697,12 @@ private void updateProjectType() { @Restrict("#{s:hasPermission(projectHome.instance, 'update')}") public String update() { String result = super.update(); - if (result.equals("updated")) { + if (!slug.equals(getInstance().getSlug())) { slug = getInstance().getSlug(); + projectUpdateEvent.fire(new ProjectUpdate(getInstance())); + return "projectSlugUpdated"; } + projectUpdateEvent.fire(new ProjectUpdate(getInstance())); return result; } diff --git a/zanata-war/src/main/java/org/zanata/action/VersionHome.java b/zanata-war/src/main/java/org/zanata/action/VersionHome.java index de043a7d90..b16ef154b0 100644 --- a/zanata-war/src/main/java/org/zanata/action/VersionHome.java +++ b/zanata-war/src/main/java/org/zanata/action/VersionHome.java @@ -92,6 +92,8 @@ public class VersionHome extends SlugHome implements @Setter private String slug; + private Long versionId; + @Getter @Setter private String projectSlug; @@ -230,9 +232,17 @@ public class VersionItem implements Serializable { @Override protected HProjectIteration loadInstance() { Session session = (Session) getEntityManager().getDelegate(); - return (HProjectIteration) session.byNaturalId(HProjectIteration.class) - .using("slug", getSlug()) - .using("project", projectDAO.getBySlug(projectSlug)).load(); + if (versionId == null) { + HProjectIteration iteration = (HProjectIteration) session + .byNaturalId(HProjectIteration.class) + .using("slug", getSlug()) + .using("project", projectDAO.getBySlug(projectSlug)).load(); + versionId = iteration.getId(); + return iteration; + } else { + return (HProjectIteration) session.load(HProjectIteration.class, + versionId); + } } @Restrict("#{s:hasPermission(versionHome.instance, 'update')}") @@ -261,7 +271,7 @@ private Map getValidations() { if (availableValidations.isEmpty()) { Collection validationList = validationServiceImpl.getValidationActions(projectSlug, - slug); + getInstance().getSlug()); for (ValidationAction validationAction : validationList) { availableValidations.put(validationAction.getId(), @@ -419,6 +429,10 @@ public String update() { String state = super.update(); projectIterationUpdateEvent.fire( new ProjectIterationUpdate(getInstance())); + if (!slug.equals(getInstance().getSlug())) { + slug = getInstance().getSlug(); + return "versionSlugUpdated"; + } return state; } diff --git a/zanata-war/src/main/java/org/zanata/dao/HTextFlowTargetStreamingDAO.java b/zanata-war/src/main/java/org/zanata/dao/HTextFlowTargetStreamingDAO.java index f2b539be4f..b792ee005d 100644 --- a/zanata-war/src/main/java/org/zanata/dao/HTextFlowTargetStreamingDAO.java +++ b/zanata-war/src/main/java/org/zanata/dao/HTextFlowTargetStreamingDAO.java @@ -31,6 +31,7 @@ import org.jboss.seam.annotations.Name; import org.jboss.seam.annotations.Scope; import org.zanata.model.HProject; +import org.zanata.model.HProjectIteration; import org.zanata.model.HTextFlowTarget; /** @@ -104,4 +105,31 @@ public ScrollableResults getTargetsWithAllFieldsEagerlyFetchedForProject( .setParameter("project", project) .scroll(ScrollMode.FORWARD_ONLY); } + + /** + * + * @return scrollable result set of HTextFlowTarget under a project + * iteration, with all of its fields(locale, textflow, document, + * document locale, project iteration and project) eagerly fetched. + */ + public ScrollableResults + getTargetsWithAllFieldsEagerlyFetchedForProjectIteration( + HProjectIteration iteration) { + Query query = + getSession() + .createQuery( + "from HTextFlowTarget tft " + + "join fetch tft.locale " + + "join fetch tft.textFlow " + + "join fetch tft.textFlow.document " + + + "join fetch tft.textFlow.document.locale " + + + "join fetch tft.textFlow.document.projectIteration iter " + + + "join fetch tft.textFlow.document.projectIteration.project where iter = :iteration"); + return query.setFetchSize(Integer.MIN_VALUE) + .setParameter("iteration", iteration) + .scroll(ScrollMode.FORWARD_ONLY); + } } diff --git a/zanata-war/src/main/java/org/zanata/search/HTextFlowTargetIndexingStrategy.java b/zanata-war/src/main/java/org/zanata/search/HTextFlowTargetIndexingStrategy.java index 91b60df939..60c76424cb 100644 --- a/zanata-war/src/main/java/org/zanata/search/HTextFlowTargetIndexingStrategy.java +++ b/zanata-war/src/main/java/org/zanata/search/HTextFlowTargetIndexingStrategy.java @@ -115,7 +115,15 @@ private static void reindexScrollableResultSet(FullTextSession session, session.clear(); // clear since the queue is processed } - public void reindexForProjectVersion(HProjectIteration projectIteration) { - + public void reindexForProjectVersion(HProjectIteration projectIteration, + FullTextSession session, AsyncTaskHandle handle) { + // it must use the same session in the DAO and to do the indexing + HTextFlowTargetStreamingDAO dao = + new HTextFlowTargetStreamingDAO(HTextFlowTarget.class, session); + ScrollableResults + scrollableResults = + dao.getTargetsWithAllFieldsEagerlyFetchedForProjectIteration( + projectIteration); + reindexScrollableResultSet(session, scrollableResults, handle); } } diff --git a/zanata-war/src/main/java/org/zanata/service/impl/IndexingServiceImpl.java b/zanata-war/src/main/java/org/zanata/service/impl/IndexingServiceImpl.java index e4494ae929..4f0f68f2cd 100644 --- a/zanata-war/src/main/java/org/zanata/service/impl/IndexingServiceImpl.java +++ b/zanata-war/src/main/java/org/zanata/service/impl/IndexingServiceImpl.java @@ -202,8 +202,10 @@ public Future reindexSlugEntity(SlugEntityBase slugEntity, if (slugEntity instanceof HProject) { indexingStrategy.reindexForProject((HProject) slugEntity, session, handle); + } else if (slugEntity instanceof HProjectIteration) { + indexingStrategy.reindexForProjectVersion( + (HProjectIteration) slugEntity, session, handle); } - // TODO pahuang handle HProjectIteration if (handle.getCurrentProgress() != handle .getMaxProgress()) { diff --git a/zanata-war/src/main/java/org/zanata/service/impl/SlugUpdatedListener.java b/zanata-war/src/main/java/org/zanata/service/impl/SlugUpdatedListener.java index c2da1e6d80..cc3a6f2c77 100644 --- a/zanata-war/src/main/java/org/zanata/service/impl/SlugUpdatedListener.java +++ b/zanata-war/src/main/java/org/zanata/service/impl/SlugUpdatedListener.java @@ -14,6 +14,9 @@ import org.zanata.model.HProjectIteration; import org.zanata.model.SlugEntityBase; import org.zanata.service.IndexingService; +import org.zanata.webtrans.server.TranslationWorkspaceManager; +import org.zanata.webtrans.shared.model.ProjectIterationId; +import org.zanata.webtrans.shared.model.WorkspaceId; import com.google.common.base.Throwables; /** @@ -32,6 +35,9 @@ public class SlugUpdatedListener implements PostUpdateEventListener { @In private IndexingService indexingServiceImpl; + @In + private TranslationWorkspaceManager translationWorkspaceManager; + private Integer index; @Override @@ -52,7 +58,6 @@ public void onPostUpdate(PostUpdateEvent event) { event.getEntity()); log.debug("Slug entity [{}] changed slug. old slug: {}, new slug: {}", slugEntityBase, oldSlug, newSlug); - // TODO pahuang need to update lucene index for all text flow targets under this project or iteration AsyncTaskHandle handle = new AsyncTaskHandle<>(); asyncTaskHandleManager.registerTaskHandle(handle); @@ -63,6 +68,8 @@ public void onPostUpdate(PostUpdateEvent event) { catch (Exception e) { log.error("exception happen in async framework", e); } + // TODO pahuang need to send workspace update event to all open workspace and let user redirect to new url + // translationWorkspaceManager.tryGetWorkspace(new WorkspaceId(new ProjectIterationId(oldSlug, null, ))) } private Integer getSlugFieldIndex(PostUpdateEvent event) { diff --git a/zanata-war/src/main/java/org/zanata/webtrans/server/TranslationWorkspace.java b/zanata-war/src/main/java/org/zanata/webtrans/server/TranslationWorkspace.java index 0cd356a213..6e2c951c92 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/server/TranslationWorkspace.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/server/TranslationWorkspace.java @@ -37,7 +37,7 @@ * */ public interface TranslationWorkspace { - public Map getUsers(); + Map getUsers(); void addEditorClient(String httpSessionId, EditorClientId editorClientId, PersonId personId); @@ -55,6 +55,6 @@ void updateUserSelection(EditorClientId editorClientId, TransUnitId getUserSelection(EditorClientId editorClientId); - public void onEventServiceConnected(EditorClientId editorClientId, + void onEventServiceConnected(EditorClientId editorClientId, String connectionId); } diff --git a/zanata-war/src/main/java/org/zanata/webtrans/server/TranslationWorkspaceManagerImpl.java b/zanata-war/src/main/java/org/zanata/webtrans/server/TranslationWorkspaceManagerImpl.java index d72fb5ebc5..8255320c3b 100644 --- a/zanata-war/src/main/java/org/zanata/webtrans/server/TranslationWorkspaceManagerImpl.java +++ b/zanata-war/src/main/java/org/zanata/webtrans/server/TranslationWorkspaceManagerImpl.java @@ -210,9 +210,9 @@ void projectIterationUpdate(HProjectIteration projectIteration) { ProjectType projectType = projectIteration.getProjectType(); log.info( "Project {} iteration {} updated, status={}, isProjectActive={}, projectType={}", - new Object[] { projectSlug, iterSlug, - projectIteration.getStatus(), isProjectActive, - projectType }); + projectSlug, iterSlug, + projectIteration.getStatus(), isProjectActive, + projectType); ProjectIterationId iterId = new ProjectIterationId(projectSlug, iterSlug, diff --git a/zanata-war/src/main/webapp/WEB-INF/layout/version/edit_form.xhtml b/zanata-war/src/main/webapp/WEB-INF/layout/version/edit_form.xhtml index f1fd7b44d8..d9d8f09ddb 100644 --- a/zanata-war/src/main/webapp/WEB-INF/layout/version/edit_form.xhtml +++ b/zanata-war/src/main/webapp/WEB-INF/layout/version/edit_form.xhtml @@ -61,14 +61,9 @@ title="#{msgs['jsf.SlugExample']}"> - - - - - diff --git a/zanata-war/src/main/webapp/WEB-INF/pages.xml b/zanata-war/src/main/webapp/WEB-INF/pages.xml index 38496a87c3..05e6133d27 100644 --- a/zanata-war/src/main/webapp/WEB-INF/pages.xml +++ b/zanata-war/src/main/webapp/WEB-INF/pages.xml @@ -333,7 +333,7 @@ - + @@ -420,6 +420,16 @@ value="#{versionHome.instance.slug}" /> + + + + + + + +