fidelbravo
I'm new here

ValueService für ContenCreator und SiteArchitect

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?

0 Kudos
3 Replies
mbergmann
Crownpeak employee

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

0 Kudos

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

0 Kudos

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:

  1. Du nutzt den ValueService in der Regel.
  2. Der ValueService selbst kennt den aktuellen Kontext (=die Seite) nicht, weil diese Info nicht automatisch "mitgeliefert" wird.
  3. Darum musst Du vorher diese Info selbst hinterlegen und eine Stelle schaffen, von wo Du die Info aus dem ValueService heraus abrufen kannst
  4. Das Abrufen machst Du später im ValueService über den ClientService, den Du Dir dort über den ServicesBroker holst
  5. Damit dieser selbst gebaute Service auch verfügbar ist, musst Du ihn im Rahmen des PermanentPlugins registrieren. Ein PermanentPlugin ist ein wenig anders als andere Plugins - es liefert selbst keine zusätzlichen "Funktionalitäten" sondern bietet lediglich die Möglichkeit, "ein Stück Code einmalig beim Clientstart auszuführen". Insbesondere ist garantiert, dass dieser Code vor dem Laden anderer Arten von Plugins (wie z.B. Reports/DAPs) ausgeführ wird.
  6. Im Rahmen der Registrierung des ClientServices (also im PermanentPlugin) registrierst Du auch den Listener, der auf den "Elementwechsel" im SA reagiert und sich das jeweilige Element im ClientService "merkt".

Logisch gesehen besteht das Ganze also quasi aus zwei Teilen:

  1. ClientService im PermanentPlugin instantiieren und Listener registrieren => Damit schaffst Du die Möglichkeit, im SA von überall aus auf das aktuell ausgewählte Element zuzugreifen
  2. Der ValueService, der im Rahmen der Regel benutzt wird, benutzt den ClientService, um sich von dort die Page zu holen. Oder die PageId oder was auch immer Du halt hinein legst.

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

0 Kudos