Search the FirstSpirit Knowledge Base
Hallo zusammen,
Ich versuche gerade einen ValueService zu schreiben, der Service soll sowohl für SiteArchitect als auch für den ContentCreator funktioniert.
Ich versuche auf die page.getId() zurückzugreifen.
private String findPageId(final SpecialistsBroker broker){
WebeditUiAgent uiWebEditAgent = broker.requestSpecialist(WebeditUiAgent.TYPE);
if (uiWebEditAgent == null) {
UIStoreAgent uiStoreAgent = broker.requestSpecialist(UIStoreAgent.TYPE);
Logging.logInfo("access over the site architect " , logger);
GuiStoreElement activeUiElement = uiStoreAgent.getActiveUiElement();
return Long.toString(activeUiElement.getId());
} else if (uiWebEditAgent != null){
Logging.logInfo("access over the content creator " , logger);
return Long.toString(uiWebEditAgent.getPreviewElement().getId());
}
Logging.logWarning("page id is empty!" , logger);
return null;
}
so kann nicht funktionieren, da der UIStoreAgent nicht teil der offiziellen API ist.
Nun habe ich das ganze mit dem ModelListener implementiert ohne viele Erfolg
private String findPageId(final SpecialistsBroker broker){
WebeditUiAgent uiWebEditAgent = broker.requestSpecialist(WebeditUiAgent.TYPE);
if (uiWebEditAgent == null) {
Logging.logInfo("access over the site architect" , logger);
PageModelListener pageModelListener = new PageModelListener();
ServicesBroker servicesBroker = broker.requireSpecialist(ServicesBroker.TYPE);
servicesBroker.getService(ModelService.class).addModelListener(SelectionModel.EDITORIAL, pageModelListener);
return Long.toString(pageModelListener.getCurrentPagePageId());
} else if (uiWebEditAgent != null){
Logging.logInfo("access over the content creator " , logger);
return Long.toString(uiWebEditAgent.getPreviewElement().getId());
}
Logging.logWarning("page id is empty!" , logger);
return null;
}
public class PageModelListener implements ModelListener {
private Object currentObject;
@Override
public void modelChanged(Object o) {
currentObject = o;
}
public long getCurrentPagePageId(){
long longValue = 0L;
if(currentObject != null) {
IDProvider elementWrapper = ((SelectionModel) currentObject).getElement();
if (elementWrapper instanceof Page){
longValue = elementWrapper.getId();
}
}
return longValue;
}
}
und bekomme folgende Exception:
WARN 27.11.2019 13:48:40.757 (org.eclipse.jetty.server.handler.ContextHandler): fs5webedit_14: Exception while dispatching incoming RPC call
FSVersion=5.2.190808.78484#4442;JDK=1.8.0_211 64bit Oracle Corporation;OS=Windows 10 10.0 amd64;Date=27.11.2019 13:48:40
com.google.gwt.user.server.rpc.UnexpectedException: Service method 'public abstract de.espirit.firstspirit.webedit.client.io.SerializableWrapper de.espirit.firstspirit.webedit.client.gadgets.ValueServiceMediator.getValue(java.lang.String,de.espirit.firstspirit.webedit.client.io.MapWrapper) throws de.espirit.firstspirit.webedit.client.gadgets.ValueServiceMediator.ServiceNotAvailableException' threw an unexpected exception: java.lang.NoClassDefFoundError: de/espirit/firstspirit/client/gui/model/ModelListener
at com.google.gwt.user.server.rpc.RPC.encodeResponseForFailure(RPC.java:416)
at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:605)
at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:333)
at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:303)
at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:373)
at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:876)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1623)
at de.espirit.firstspirit.io.servlet.WebAuthentication.doChain(WebAuthentication.java:956)
at de.espirit.firstspirit.webedit.server.ServiceAuthentication.doChain(ServiceAuthentication.java:37)
at de.espirit.firstspirit.io.servlet.WebAuthentication.doFilter(WebAuthentication.java:714)
at de.espirit.firstspirit.io.servlet.WebAuthentication.doFilter(WebAuthentication.java:199)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1610)
at de.espirit.firstspirit.webedit.server.BrowserCachingFilter.doFilter(BrowserCachingFilter.java:37)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1610)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:540)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:146)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:566)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:257)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1711)
at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:255)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1347)
at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:203)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:480)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1678)
at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:201)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1249)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:144)
at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:227)
at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:78)
at de.espirit.firstspirit.io.servlet.HttpSubSessionFilter.doFilter(HttpSubSessionFilter.java:125)
at de.espirit.firstspirit.io.servlet.HttpSubSessionFilter.doFilter(HttpSubSessionFilter.java:73)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1602)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:540)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:146)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:257)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1711)
at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:255)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1347)
at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:203)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:480)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1678)
at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:201)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1249)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:144)
at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:220)
at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:152)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
at org.eclipse.jetty.server.Server.handle(Server.java:505)
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:370)
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:267)
at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:305)
at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103)
at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:117)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:333)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:310)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:168)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:126)
at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:366)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:781)
at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:917)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.NoClassDefFoundError: de/espirit/firstspirit/client/gui/model/ModelListener
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Class.java:2671)
at java.lang.Class.getConstructor0(Class.java:3075)
at java.lang.Class.newInstance(Class.java:412)
at de.espirit.firstspirit.service.value.ValueServiceBrokerImpl.getValueService(ValueServiceBrokerImpl.java:22)
at de.espirit.firstspirit.webedit.server.gadgets.ValueServiceMediatorImpl.getValue(ValueServiceMediatorImpl.java:32)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:587)
... 65 more
Caused by: java.lang.ClassNotFoundException: de.espirit.firstspirit.client.gui.model.ModelListener
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 76 more
Die Exception verstehe ich nicht. Die Klasse de.espirit.firstspirit.client.gui.model.ModelListener ist in der fs-client bzw. fs-server.jar
Hat jemand eine Idee wie das geht?
Hallo Fidel,
der ModelListener ist aber nicht Teil des CC und geht darum nur im SA. Du musst hier weiter trennen.
Ist der gesamte Code im ValueService selbst? Dann kann es soweit ich es verstehe eh nicht gehen weil der Listener zu spät registriert wird.
Meine Standardlösung um auch im SA an das aktuelle Element zu kommen geht über zwei PermanentPlugins (hier in einem etwas anderen Kontext aber das Grundprinzip sollte klar werden):
Re: Eingabekomponente auf einer bestimmten Seite per Regel einblenden / aktivieren
bzw. dann das von dort aus verlinkte Posting:
Re: DataAccessPlugin - getStoreElement möglich?
Viele Grüße
Michael
Hallo Michael,
Danke für die ausführliche Beschreibung. Mir ist aber immer noch nicht ganz klar. Ich brauche die "pageid" der Inhaltsseite und ich wollte die "pageid" durch die ValueService rauskriegen. In CC hätte ich kein Problem aber in SA wurde das nicht gehen. Also benötige ich 2 Regeln damit der ValueService oder dem PermanetPlugin angesprochen wird.
Momentan ist so:
Formularkanal
<CMS_INPUT_TEXT name="pt_pageIdORI" useLanguages="no">
<LANGINFOS>
<LANGINFO lang="*" label="pageID "/>
</LANGINFOS>
</CMS_INPUT_TEXT>
Rules:
<RULE>
<SCHEDULE delay="500" id="pageService" service="PageIdValueService">
<CONDITION>
<PROPERTY name="EMPTY" source="pt_pageIdORI"/>
</CONDITION>
<PARAM name="pt_pageId">
<PROPERTY name="VALUE" source="pt_pageIdORI"/>
</PARAM>
</SCHEDULE>
<DO>
<PROPERTY name="VALUE" source="pt_pageIdORI"/>
</DO>
</RULE>
Viele Grüße,
Fidel
Hallo Fidel,
gern geschehen 🙂
Wie Du im ValueService an die PageID kommst ist aber schon klar geworden oder? Das wäre ja der erste Schritt. Ich frage weil Du schreibst "Also benötige ich 2 Regeln damit der ValueService oder dem PermanetPlugin angesprochen wird" - es ist ja kein "entweder/oder" sondern sieht letztlich folgendermaßen aus:
Logisch gesehen besteht das Ganze also quasi aus zwei Teilen:
In der <RULE> benutzt Du immer den ValueService, also <SCHEDULE>.
Es kommt letztlich darauf an, was Du mit der PageID machen willst bzw. wozu Du die brauchst. Ich hatte es bisher so verstanden, dass der ValueService etwas "auf Basis der Page" tun soll, die also nutzt um irgendeine Entscheidung zu treffen.
Kannst Du vielleicht mal den Anwendungsfall erklären?
Viele Grüße
Michael