Anpassade regler för kodkvalitet custom-code-quality-rules

Lär dig mer om de anpassade regler för kodkvalitet som körs av Cloud Manager som en del av kodkvalitetstestningen baserat på bästa praxis från AEM.

NOTE
Kodexemplen här är endast avsedda som illustrationer. Mer information om koncept och kvalitetsregler finns i SonarQube's Concepts-dokumentationen.
NOTE
Fullständiga SonarQube-regler kan inte laddas ned på grund av Adobe egna information. Du kan hämta den fullständiga listan med regler med den här länken. Fortsätt läsa det här dokumentet för beskrivningar och exempel på reglerna.

SonarQube-regler sonarqube-rules

Följande avsnitt innehåller information om SonarQube-regler som körs av Cloud Manager.

Använd inte potentiellt farliga funktioner do-not-use-potentially-dangerous-functions

  • Nyckel: CQRules:CWE-676
  • Typ: Sårbarhet
  • Allvarlighetsgrad: Större
  • Sedan: Version 2018.4.0

Metoderna Thread.stop() och Thread.interrupt() kan skapa problem som är svåra att återge och ibland säkerhetsproblem. Deras användning bör övervakas noggrant och valideras. I allmänhet är meddelandeöverföring ett säkrare sätt att uppnå samma sak.

Icke-kompatibel kod non-compliant-code

public class DontDoThis implements Runnable {
  private Thread thread;

  public void start() {
    thread = new Thread(this);
    thread.start();
  }

  public void stop() {
    thread.stop();  // UNSAFE!
  }

  public void run() {
    while (true) {
        somethingWhichTakesAWhileToDo();
    }
  }
}

Kompatibel kod compliant-code

public class DoThis implements Runnable {
  private Thread thread;
  private boolean keepGoing = true;

  public void start() {
    thread = new Thread(this);
    thread.start();
  }

  public void stop() {
    keepGoing = false;
  }

  public void run() {
    while (this.keepGoing) {
        somethingWhichTakesAWhileToDo();
    }
  }
}

Använd inte formatsträngar som kan vara externt styrda do-not-use-format-strings-which-may-be-externally-controlled

  • Nyckel: CQRules:CWE-134
  • Typ: Sårbarhet
  • Allvarlighetsgrad: Större
  • Sedan: Version 2018.4.0

Om du använder en formatsträng från en extern källa (till exempel en begärandeparameter eller användargenererat innehåll) kan programmet utsättas för denial of service-attacker. Det finns tillfällen då en formatsträng kan styras externt, men bara tillåts från betrodda källor.

Icke-kompatibel kod non-compliant-code-1

protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) {
  String messageFormat = request.getParameter("messageFormat");
  request.getResource().getValueMap().put("some property", String.format(messageFormat, "some text"));
  response.sendStatus(HttpServletResponse.SC_OK);
}

HTTP-begäranden ska alltid ha socket- och anslutningstimeout http-requests-should-always-have-socket-and-connect-timeouts

  • Nyckel: CQRules:ConnectionTimeoutMechanism
  • Typ: Fel
  • Allvarlighetsgrad: Kritisk
  • Sedan: Version 2018.6.0

När du kör HTTP-begäranden inifrån ett AEM-program är det viktigt att se till att rätt tidsgränser är konfigurerade för att undvika onödig trådförbrukning. Tyvärr är standardbeteendet för både Java™ standardklient för HTTP, java.net.HttpUrlConnection, och den vanligaste Apache HTTP Components-klienten att aldrig timeout, så timeout måste anges explicit. Det bästa sättet är att dessa tidsgränser inte överskrider 60 sekunder.

Icke-kompatibel kod non-compliant-code-2

@Reference
private HttpClientBuilderFactory httpClientBuilderFactory;

public void dontDoThis() {
  HttpClientBuilder builder = httpClientBuilderFactory.newBuilder();
  HttpClient httpClient = builder.build();

  // do something with the client
}

public void dontDoThisEither() {
  URL url = new URL("http://www.google.com");
  URLConnection urlConnection = url.openConnection();

  BufferedReader in = new BufferedReader(new InputStreamReader(
    urlConnection.getInputStream()));

  String inputLine;
  while ((inputLine = in.readLine()) != null) {
    logger.info(inputLine);
  }

  in.close();
}

Kompatibel kod compliant-code-1

@Reference
private HttpClientBuilderFactory httpClientBuilderFactory;

public void doThis() {
  HttpClientBuilder builder = httpClientBuilderFactory.newBuilder();
  RequestConfig requestConfig = RequestConfig.custom()
    .setConnectTimeout(5000)
    .setSocketTimeout(5000)
    .build();
  builder.setDefaultRequestConfig(requestConfig);

  HttpClient httpClient = builder.build();

  // do something with the client
}

public void orDoThis() {
  URL url = new URL("http://www.google.com");
  URLConnection urlConnection = url.openConnection();
  urlConnection.setConnectTimeout(5000);
  urlConnection.setReadTimeout(5000);

  BufferedReader in = new BufferedReader(new InputStreamReader(
    urlConnection.getInputStream()));

  String inputLine;
  while ((inputLine = in.readLine()) != null) {
    logger.info(inputLine);
  }

  in.close();
}

ResourceResolver-objekt ska alltid stängas resourceresolver-objects-should-always-be-closed

  • Nyckel: CQRules:CQBP-72
  • Typ: kodmeddelande
  • Allvarlighetsgrad: Större
  • Sedan: Version 2018.4.0

ResourceResolver objekt som hämtats från ResourceResolverFactory förbrukar systemresurser. Även om det finns åtgärder för att återta dessa resurser när ResourceResolver inte längre används, är det mer effektivt att uttryckligen stänga alla öppna ResourceResolver-objekt genom att anropa metoden close().

En vanlig missuppfattning är att ResourceResolver objekt som har skapats med en befintlig JCR-session inte får stängas explicit eller att detta stänger den underliggande JCR-sessionen. Detta är inte fallet. Oavsett hur en ResourceResolver öppnas bör den stängas när den inte längre används. Eftersom ResourceResolver implementerar gränssnittet Closeable går det också att använda syntaxen try-with-resources i stället för att anropa close() explicit.

Icke-kompatibel kod non-compliant-code-4

public void dontDoThis(Session session) throws Exception {
  ResourceResolver resolver = factory.getResourceResolver(Collections.singletonMap("user.jcr.session", (Object)session));
  // do some stuff with the resolver
}

Kompatibel kod compliant-code-2

public void doThis(Session session) throws Exception {
  ResourceResolver resolver = null;
  try {
    resolver = factory.getResourceResolver(Collections.singletonMap("user.jcr.session", (Object)session));
    // do something with the resolver
  } finally {
    if (resolver != null) {
      resolver.close();
    }
  }
}

public void orDoThis(Session session) throws Exception {
  try (ResourceResolver resolver = factory.getResourceResolver(Collections.singletonMap("user.jcr.session", (Object) session))){
    // do something with the resolver
  }
}

Använd inte SSLING-serversökvägar för att registrera servrar do-not-use-sling-servlet-paths-to-register-servlets

  • Nyckel: CQRules:CQBP-75
  • Typ: kodmeddelande
  • Allvarlighetsgrad: Större
  • Sedan: Version 2018.4.0

Så som beskrivs i Sling-dokumentationen rekommenderas inte bindningar av sökvägar. Sökvägsbundna servrar kan inte använda vanliga JCR-åtkomstkontroller och därför krävs ytterligare säkerhetsproblem. I stället för att använda sökvägsbundna servrar rekommenderar vi att du skapar noder i databasen och registrerar servlets efter resurstyp.

Icke-kompatibel kod non-compliant-code-5

@Component(property = {
  "sling.servlet.paths=/apps/myco/endpoint"
})
public class DontDoThis extends SlingAllMethodsServlet {
 // implementation
}

Infångade undantag ska vara antingen loggade eller utlösta, inte båda caught-exceptions-should-be-logged-or-thrown-but-not-both

  • Nyckel: CQRules:CQBP-44—CatchAndeitherLogOrThrow
  • Typ: kodmeddelande
  • Allvarlighetsgrad: Mindre
  • Sedan: Version 2018.4.0

I allmänhet bör ett undantag loggas exakt en gång. Om du loggar undantag flera gånger kan det leda till missförstånd eftersom det är oklart hur många gånger ett undantag inträffade. Det vanligaste mönstret som leder till detta är loggning och generering av ett fångat undantag.

Icke-kompatibel kod non-compliant-code-6

public void dontDoThis() throws Exception {
  try {
    someOperation();
  } catch (Exception e) {
    logger.error("something went wrong", e);
    throw e;
  }
}

Kompatibel kod compliant-code-3

public void doThis() {
  try {
    someOperation();
  } catch (Exception e) {
    logger.error("something went wrong", e);
  }
}

public void orDoThis() throws MyCustomException {
  try {
    someOperation();
  } catch (Exception e) {
    throw new MyCustomException(e);
  }
}

Undvik loggsatser som följs av Throw-satser avoid-having-a-log-statement-immediately-followed-by-a-throw-statement

  • Nyckel: CQRules:CQBP-44 - ConsecutiousLogAndThrow
  • Typ: kodmeddelande
  • Allvarlighetsgrad: Mindre
  • Sedan: Version 2018.4.0

Ett annat vanligt sätt att undvika är att logga ett meddelande och sedan omedelbart generera ett undantag. Detta innebär vanligtvis att undantagsmeddelandet kommer att dupliceras i loggfiler.

Icke-kompatibel kod non-compliant-code-7

public void dontDoThis() throws Exception {
  logger.error("something went wrong");
  throw new RuntimeException("something went wrong");
}

Kompatibel kod compliant-code-4

public void doThis() throws Exception {
  throw new RuntimeException("something went wrong");
}

Undvik inloggning vid INFO vid hantering av GET- eller HEAD-förfrågningar avoid-logging-at-info-when-handling-get-or-head-requests

  • Nyckel: CQRules:CQBP-44—LogInfoInGetOrHeadRequests
  • Typ: kodmeddelande
  • Allvarlighetsgrad: Mindre

I allmänhet bör INFO-loggnivån användas för att avgränsa viktiga åtgärder och AEM är som standard konfigurerad för att logga på INFO-nivå eller högre. Metoderna GET och HEAD bör aldrig vara skrivskyddade och därför inte utgöra några viktiga åtgärder. Loggning på INFO-nivå som svar på GET- eller HEAD-förfrågningar skapar troligen avsevärt loggbrus, vilket gör det svårare att identifiera användbar information i loggfiler. Loggning vid hantering av GET- eller HEAD-begäranden bör finnas antingen på WARN- eller FEL-nivå när något har gått fel eller på DEBUG- eller TRACE-nivå om mer detaljerad felsökningsinformation skulle vara till hjälp.

NOTE
Detta gäller inte loggning av access.log-typ för varje begäran.

Icke-kompatibel kod non-compliant-code-8

public void doGet() throws Exception {
  logger.info("handling a request from the user");
}

Kompatibel kod compliant-code-5

public void doGet() throws Exception {
  logger.debug("handling a request from the user.");
}

Använd inte Exception.getMessage() som första parameter i en loggningssats do-not-use-exception-getmessage-as-the-first-parameter-of-a-logging-statement

  • Nyckel: CQRules:CQBP-44—ExceptionGetMessageIsFirstLogParam
  • Typ: kodmeddelande
  • Allvarlighetsgrad: Mindre
  • Sedan: Version 2018.4.0

Som en god praxis bör loggmeddelanden innehålla sammanhangsberoende information om var i programmet ett undantag har inträffat. Kontexten kan också bestämmas med stackspår, men i allmänhet blir loggmeddelandet lättare att läsa och förstå. När du loggar ett undantag är det därför en dålig vana att använda undantagets meddelande som loggmeddelande. Undantagsmeddelandet innehåller det som gick fel medan loggmeddelandet bör användas för att tala om för en loggläsare vad programmet gjorde när undantaget inträffade. Undantagsmeddelandet är fortfarande loggat. Genom att ange ett eget meddelande blir loggarna lättare att förstå.

Icke-kompatibel kod non-compliant-code-9

public void dontDoThis() {
  try {
    someMethodThrowingAnException();
  } catch (Exception e) {
    logger.error(e.getMessage(), e);
  }
}

Kompatibel kod compliant-code-6

public void doThis() {
  try {
    someMethodThrowingAnException();
  } catch (Exception e) {
    logger.error("Unable to do something", e);
  }
}

Loggning in Catch Blocks Should at the WARN or ERROR Level logging-in-catch-blocks-should-be-at-the-warn-or-error-level

  • Nyckel: CQRules:CQBP-44—WrongLogLevelInCatchBlock
  • Typ: kodmeddelande
  • Allvarlighetsgrad: Mindre
  • Sedan: Version 2018.4.0

Som namnet antyder bör Java™-undantag alltid användas i undantagsfall. Därför är det viktigt att loggmeddelanden loggas på lämplig nivå när ett undantag fångas upp: antingen WARN eller ERROR. Detta garanterar att meddelandena visas korrekt i loggarna.

Icke-kompatibel kod non-compliant-code-10

public void dontDoThis() {
  try {
    someMethodThrowingAnException();
  } catch (Exception e) {
    logger.debug(e.getMessage(), e);
  }
}

Kompatibel kod compliant-code-7

public void doThis() {
  try {
    someMethodThrowingAnException();
  } catch (Exception e) {
    logger.error("Unable to do something", e);
  }
}

Skriv inte ut stackspår till konsolen do-not-print-stack-traces-to-the-console

  • Nyckel: CQRules:CQBP-44—ExceptionPrintStackTrace
  • Typ: kodmeddelande
  • Allvarlighetsgrad: Mindre
  • Sedan: Version 2018.4.0

Kontext är viktig när du ska förstå loggmeddelanden. Om Exception.printStackTrace() används kommer endast stackspårningen att skickas till standardfelströmmen, vilket innebär att all kontext förloras. I ett program med flera trådar, som AEM om flera undantag skrivs ut med den här metoden parallellt, kan stackspårningarna överlappa vilket kan skapa en betydande förvirring. Undantag bör endast loggas via loggningsramverket.

Icke-kompatibel kod non-compliant-code-11

public void dontDoThis() {
  try {
    someMethodThrowingAnException();
  } catch (Exception e) {
    e.printStackTrace();
  }
}

Kompatibel kod compliant-code-8

public void doThis() {
  try {
    someMethodThrowingAnException();
  } catch (Exception e) {
    logger.error("Unable to do something", e);
  }
}

Utdata inte till standardutdata eller standardfel do-not-output-to-standard-output-or-standard-error

  • Nyckel: CQRules:CQBP-44—LogLevelConsolePrinters
  • Typ: kodmeddelande
  • Allvarlighetsgrad: Mindre
  • Sedan: Version 2018.4.0

Loggning AEM alltid ske via loggningsramverket SLF4J. Om du matar ut direkt till standardutdata eller standardfelströmmar förlorar du den strukturella och kontextuella information som tillhandahålls av loggningsramverket och kan ibland orsaka prestandaproblem.

Icke-kompatibel kod non-compliant-code-12

public void dontDoThis() {
  try {
    someMethodThrowingAnException();
  } catch (Exception e) {
    System.err.println("Unable to do something");
  }
}

Kompatibel kod compliant-code-9

public void doThis() {
  try {
    someMethodThrowingAnException();
  } catch (Exception e) {
    logger.error("Unable to do something", e);
  }
}

Undvik hårdkodade/program- och /libs-sökvägar avoid-hardcoded-apps-and-libs-paths

  • Nyckel: CQRules:CQBP-71
  • Typ: kodmeddelande
  • Allvarlighetsgrad: Mindre
  • Sedan: Version 2018.4.0

Vanligtvis ska sökvägar som börjar med /libs och /apps inte vara hårdkodade eftersom de sökvägar de refererar till oftast lagras som sökvägar i förhållande till sökvägen för Sling (som är inställd på /libs,/apps som standard). Om du använder den absoluta sökvägen kan det orsaka subtila defekter som bara skulle visas senare i projektets livscykel.

Icke-kompatibel kod non-compliant-code-13

public boolean dontDoThis(Resource resource) {
  return resource.isResourceType("/libs/foundation/components/text");
}

Kompatibel kod compliant-code-10

public void doThis(Resource resource) {
  return resource.isResourceType("foundation/components/text");
}

Sling Scheduler ska inte användas sonarqube-sling-scheduler

  • Nyckel: CQRules:AMSCORE-554
  • Typ: Kompatibilitet med kodmeddelanden/Cloud Service
  • Allvarlighetsgrad: Mindre
  • Sedan: Version 2020.5.0

Använd inte Sling Scheduler för aktiviteter som kräver en garanterad körning. Sling Scheduled Jobs garanterar körning och passar bättre för både klustrade och icke-klustrade miljöer.

Läs dokumentationen för Apache Sling-händelser och jobbhantering om du vill veta mer om hur Sling-jobb hanteras i klustrade miljöer.

AEM inaktuella API:er ska inte användas sonarqube-aem-deprecated

  • Nyckel: AMSCORE-553
  • Typ: Kompatibilitet med kodmeddelanden/Cloud Service
  • Allvarlighetsgrad: Mindre
  • Sedan: Version 2020.5.0

AEM API-yta är under ständig revision för att identifiera API:er som inte används och därför betraktas som inaktuella.

Dessa API:er är ofta föråldrade med Java™-standardanteckningen @Deprecated och identifieras därför av squid:CallToDeprecatedMethod.

Det finns dock fall där en API är föråldrad i sammanhanget för AEM men inte i andra sammanhang. Den här regeln identifierar den andra klassen.

OakPAL-innehållsregler oakpal-rules

I följande avsnitt beskrivs de OakPAL-kontroller som utförs av Cloud Manager.

NOTE
OakPAL är ett ramverk som validerar innehållspaket med en fristående Oak-databas. Den utvecklades av en AEM partner och vinnare av 2019 AEM Rockstar North America-priset.

Produkt-API:er som antecknas med @ProviderType ska inte implementeras eller utökas av kunder product-apis-annotated-with-providertype-should-not-be-implemented-or-extended-by-customers

  • Nyckel: CQBP-84
  • Typ: Fel
  • Allvarlighetsgrad: Kritisk
  • Sedan: Version 2018.7.0

AEM-API:t innehåller Java™-gränssnitt och -klasser som endast är avsedda att användas, men inte implementeras, av anpassad kod. Gränssnittet com.day.cq.wcm.api.Page implementeras till exempel endast av AEM.

När nya metoder läggs till i dessa gränssnitt påverkar inte dessa ytterligare metoder befintlig kod som använder dessa gränssnitt, och därför anses tillägg av nya metoder i dessa gränssnitt vara bakåtkompatibelt. Men om anpassad kod implementerar ett av dessa gränssnitt har den anpassade koden introducerat en bakåtkompatibilitetsrisk för kunden.

Gränssnitt och klasser som bara är avsedda att implementeras av AEM kommenteras med org.osgi.annotation.versioning.ProviderType eller ibland en liknande äldre anteckning aQute.bnd.annotation.ProviderType. Den här regeln identifierar de fall där ett sådant gränssnitt implementeras eller en klass utökas av anpassad kod.

Icke-kompatibel kod non-compliant-code-3

import com.day.cq.wcm.api.Page;

public class DontDoThis implements Page {
// implementation here
}

Kundpaket får inte skapa eller ändra noder under /libs oakpal-customer-package

  • Nyckel: BannedPath
  • Typ: Fel
  • Allvarlighetsgrad: Blockerare
  • Sedan: Version 2019.6.0

Det har varit en god praxis sedan länge att innehållsträdet /libs i AEM innehållsdatabas ska betraktas som skrivskyddat av kunder. Att ändra noder och egenskaper under /libs innebär en betydande risk för större och mindre uppdateringar. Ändringar av /libs görs endast av Adobe via officiella kanaler.

Paket får inte innehålla dubbletter av OSGi-konfigurationer oakpal-package-osgi

  • Nyckel: DuplicateOsgiConfigurations
  • Typ: Fel
  • Allvarlighetsgrad: Större
  • Sedan: Version 2019.6.0

Ett vanligt problem som inträffar i komplexa projekt är när samma OSGi-komponent konfigureras flera gånger. Detta skapar en tvetydighet om vilken konfiguration som kan användas. Den här regeln är"körningsmedveten" eftersom den bara identifierar problem där samma komponent har konfigurerats flera gånger i samma körningsläge eller en kombination av körningslägen.

Icke-kompatibel kod non-compliant-code-osgi

+ apps
  + projectA
    + config
      + com.day.cq.commons.impl.ExternalizerImpl
  + projectB
    + config
      + com.day.cq.commons.impl.ExternalizerImpl

Kompatibel kod compliant-code-osgi

+ apps
  + shared-config
    + config
      + com.day.cq.commons.impl.ExternalizerImpl

Konfigurations- och installationsmappar får endast innehålla OSGi-noder oakpal-config-install

  • Nyckel: ConfigAndInstallShouldOnlyContainOsgiNodes
  • Typ: Fel
  • Allvarlighetsgrad: Större
  • Sedan: Version 2019.6.0

Av säkerhetsskäl kan sökvägar som innehåller /config/ och /install/ bara läsas av administrativa användare i AEM och bör endast användas för OSGi-konfigurationer och OSGi-paket. Om du placerar andra typer av innehåll under banor som innehåller dessa segment, kommer programbeteendet att variera oavsiktligt mellan administrativa och icke-administrativa användare.

Ett vanligt problem är att använda noder med namnet config i komponentdialogrutor eller när du anger RTF-redigerarkonfigurationen för intern redigering. För att lösa detta bör den felaktiga noden namnändras till ett kompatibelt namn. Använd egenskapen configPath på noden cq:inplaceEditing för att ange den nya platsen för RTF-redigerarkonfigurationen.

Icke-kompatibel kod non-compliant-code-config-install

+ cq:editConfig [cq:EditConfig]
  + cq:inplaceEditing [cq:InplaceEditConfig]
    + config [nt:unstructured]
      + rtePlugins [nt:unstructured]

Kompatibel kod compliant-code-config-install

+ cq:editConfig [cq:EditConfig]
  + cq:inplaceEditing [cq:InplaceEditConfig]
    ./configPath = inplaceEditingConfig (String)
    + inplaceEditingConfig [nt:unstructured]
      + rtePlugins [nt:unstructured]

Paket får inte överlappa oakpal-no-overlap

  • Nyckel: PackageOverlaps
  • Typ: Fel
  • Allvarlighetsgrad: Större
  • Sedan: Version 2019.6.0

På samma sätt som Paket får inte innehålla en dubblett av OSGi-konfigurationsregelnär detta ett vanligt problem i komplexa projekt där samma nodsökväg skrivs till av flera separata innehållspaket. Även om beroenden för innehållspaket kan användas för att säkerställa ett konsekvent resultat är det bättre att undvika överlappningar helt och hållet.

Standardredigeringsläget får inte vara ett klassiskt användargränssnitt oakpal-default-authoring

  • Nyckel: ClassicUIAuthoringMode
  • Typ: Kompatibilitet med kodmeddelanden/Cloud Service
  • Allvarlighetsgrad: Mindre
  • Sedan: Version 2020.5.0

OSGi-konfigurationen com.day.cq.wcm.core.impl.AuthoringUIModeServiceImpl definierar standardredigeringsläget i AEM. Eftersom det klassiska användargränssnittet har tagits bort sedan AEM 6.4, uppstår nu ett problem när standardredigeringsläget är konfigurerat till Classic UI.

Komponenter med dialogrutor bör ha gränssnittsdialogrutor med pekskärmar oakpal-components-dialogs

  • Nyckel: ComponentWithOnlyClassicUIDialog
  • Typ: Kompatibilitet med kodmeddelanden/Cloud Service
  • Allvarlighetsgrad: Mindre
  • Sedan: Version 2020.5.0

AEM som har en klassisk användargränssnittsdialogruta ska alltid ha en motsvarande användargränssnittsdialogruta för att både tillhandahålla en optimal redigeringsupplevelse och vara kompatibel med distributionsmodellen för Cloud Servicen, där det klassiska användargränssnittet inte stöds. Den här regeln verifierar följande scenarier:

  • En komponent med en klassisk gränssnittsdialogruta (d.v.s. en underordnad dialog-nod) måste ha en motsvarande Touch UI-dialogruta (d.v.s. en underordnad cq:dialog-nod).
  • En komponent med en klassisk dialogruta för användargränssnittsdesign (dvs. en design_dialog-nod) måste ha en motsvarande designdialogruta för användargränssnittet (d.v.s. en underordnad cq:design_dialog-nod).
  • En komponent med både en klassisk användargränssnittsdialogruta och en klassisk dialogruta för användargränssnittsdesign måste ha både en motsvarande dialogruta för användargränssnittet för touchredigering och en motsvarande designdialogruta för användargränssnittet för touchgränssnitt.

Dokumentationen för AEM finns information och verktyg för hur du konverterar komponenter från det klassiska gränssnittet till Touch-gränssnittet. Mer information finns i Dokumentationen för AEM modernischverktyg.

Omvända replikeringsagenter ska inte användas oakpal-reverse-replication

  • Nyckel: ReverseReplication
  • Typ: Kompatibilitet med kodmeddelanden/Cloud Service
  • Allvarlighetsgrad: Mindre
  • Sedan: Version 2020.5.0

Stöd för omvänd replikering är inte tillgängligt i distributioner av Cloud Service, vilket beskrivs i Versionsinformation: Borttagning av replikeringsagenter.

Kunder som använder omvänd replikering bör kontakta Adobe för att få alternativa lösningar.

Resurser i proxyaktiverade klientbibliotek bör finnas i en mapp med namngivna resurser oakpal-resources-proxy

  • Nyckel: ClientlibProxyResource
  • Typ: Fel
  • Allvarlighetsgrad: Mindre
  • Sedan: Version 2021.2.0

AEM klientbibliotek kan innehålla statiska resurser som bilder och teckensnitt. Så som beskrivs i Använda dokumentationen för klientbibliotek måste dessa statiska resurser finnas i en underordnad mapp med namnet resources när du använder proxiderade klientbibliotek för att effektivt kunna refereras till på publiceringsinstanserna.

Icke-kompatibel kod non-compliant-proxy-enabled

+ apps
  + projectA
    + clientlib
      - allowProxy=true
      + images
        + myimage.jpg

Kompatibel kod compliant-proxy-enabled

+ apps
  + projectA
    + clientlib
      - allowProxy=true
      + resources
        + myimage.jpg

Användning av Cloud Service som inte är kompatibla arbetsflödesprocesser oakpal-usage-cloud-service

  • Nyckel: CloudServiceIncompatibleWorkflowProcess
  • Typ: kodmeddelande
  • Allvarlighetsgrad: Blockerare
  • Sedan: Version 2021.2.0

I och med övergången till tillgångsmikrotjänster för bearbetning av tillgångar på AEM Cloud Service har flera arbetsflödesprocesser som användes i anläggningsversioner och AMS-versioner av AEM blivit antingen ostödda eller onödiga.

Migreringsverktyget i AEM Assets as a Cloud Service GitHub-databasen kan användas för att uppdatera arbetsflödesmodeller under migrering till AEM as a Cloud Service.

Användning av statiska mallar rekommenderas inte för redigerbara mallar oakpal-static-template

  • Nyckel: StaticTemplateUsage
  • Typ: kodmeddelande
  • Allvarlighetsgrad: Mindre
  • Sedan: Version 2021.2.0

Det har tidigare varit vanligt att använda statiska mallar i AEM projekt, men redigerbara mallar rekommenderas eftersom de ger den flexibilitet och stöder ytterligare funktioner som inte finns i statiska mallar. Mer information finns i Sidmallar - redigerbar dokumentation.

Migrering från statiska till redigerbara mallar kan till stor del automatiseras med AEM modereringsverktyg.

Användning av äldre Foundation-komponenter rekommenderas inte oakpal-usage-legacy

  • Nyckel: LegacyFoundationComponentUsage
  • Typ: kodmeddelande
  • Allvarlighetsgrad: Mindre
  • Sedan: Version 2021.2.0

De äldre Foundation-komponenterna (d.v.s. komponenter under /libs/foundation) har ersatts för flera AEM versioner till förmån för Core-komponenterna. Användning av de äldre Foundation-komponenterna som bas för anpassade komponenter, oavsett om det är genom övertäckning eller arv, rekommenderas inte och bör konverteras till motsvarande kärnkomponent.

Den här konverteringen kan underlättas med AEM moderniseringsverktyg.

  • Nyckel: OakIndexLocation
  • Typ: kodmeddelande
  • Allvarlighetsgrad: Mindre
  • Sedan: Version 2021.2.0

AEM Cloud Service kräver att anpassade sökindexdefinitioner (d.v.s. noder av typen oak:QueryIndexDefinition) är direkta underordnade noder till /oak:index. Index på andra platser måste flyttas för att vara kompatibla med AEM Cloud Service. Mer information om sökindex finns i dokumentationen för innehållssökning och indexering.

Definitionsnoder för anpassade sökindex måste ha en compatVersion av 2 oakpal-custom-search-compatVersion

  • Nyckel: IndexCompatVersion
  • Typ: kodmeddelande
  • Allvarlighetsgrad: Mindre
  • Sedan: Version 2021.2.0

AEM Cloud Service kräver att anpassade sökindexdefinitioner (d.v.s. noder av typen oak:QueryIndexDefinition) måste ha egenskapen compatVersion inställd på 2. Alla andra värden stöds inte av AEM Cloud Service. Mer information om sökindex finns i dokumentationen för innehållssökning och indexering.

Underordnade noder för anpassade sökindexdefinitionsnoder måste vara av typen nt:ostrukturerad oakpal-descendent-nodes

  • Nyckel: IndexDescendantNodeType
  • Typ: kodmeddelande
  • Allvarlighetsgrad: Mindre
  • Sedan: Version 2021.2.0

Problem som är svåra att felsöka kan uppstå när en anpassad sökindexdefinitionsnod har oordnade underordnade noder. För att undvika dessa bör alla underordnade noder för en oak:QueryIndexDefinition-nod vara av typen nt:unstructured.

Definitionsnoder för anpassade sökindex måste innehålla en underordnad nod med namnet indexRules som har underordnade noder oakpal-custom-search-index

  • Nyckel: IndexRulesNode
  • Typ: kodmeddelande
  • Allvarlighetsgrad: Mindre
  • Sedan: Version 2021.2.0

En korrekt definierad definitionsnod för anpassat sökindex måste innehålla en underordnad nod med namnet indexRules som i sin tur måste ha minst en underordnad nod. Mer information finns i Oak-dokumentationen.

Definitionsnoder för anpassade sökindex måste följa namngivningskonventioner oakpal-custom-search-definitions

  • Nyckel: IndexName
  • Typ: kodmeddelande
  • Allvarlighetsgrad: Mindre
  • Sedan: Version 2021.2.0

AEM Cloud Service kräver att anpassade sökindexdefinitioner (d.v.s. noder av typen oak:QueryIndexDefinition) måste namnges efter ett specifikt mönster som beskrivs i Innehållssökning och indexering.

Indexdefinitionsnoder för anpassade sökningar måste använda indextypsklugin oakpal-index-type-lucene

  • Nyckel: IndexType
  • Typ: kodmeddelande
  • Allvarlighetsgrad: Mindre
  • Sedan: Version 2021.2.0

AEM Cloud Service kräver att anpassade sökindexdefinitioner (d.v.s. noder av typen oak:QueryIndexDefinition) har en type-egenskap med värdet lucene. Indexering med äldre indextyper måste uppdateras innan migrering till AEM Cloud Service. Mer information finns i dokumentationen för innehållssökning och indexering.

Definitionsnoder för anpassade sökindex får inte innehålla en egenskap med namnet seed oakpal-property-name-seed

  • Nyckel: IndexSeedProperty
  • Typ: kodmeddelande
  • Allvarlighetsgrad: Mindre
  • Sedan: Version 2021.2.0

AEM Cloud Service tillåter inte att anpassade sökindexdefinitioner (d.v.s. noder av typen oak:QueryIndexDefinition) innehåller egenskapen seed. Indexering med den här egenskapen måste uppdateras innan migrering till AEM Cloud Service. Mer information finns i dokumentationen för innehållssökning och indexering.

Definitionsnoder för anpassade sökindex får inte innehålla en egenskap med namnet reindex oakpal-reindex-property

  • Nyckel: IndexReindexProperty
  • Typ: kodmeddelande
  • Allvarlighetsgrad: Mindre
  • Sedan: Version 2021.2.0

AEM Cloud Service tillåter inte att anpassade sökindexdefinitioner (d.v.s. noder av typen oak:QueryIndexDefinition) innehåller egenskapen reindex. Indexering med den här egenskapen måste uppdateras innan migrering till AEM Cloud Service. Mer information finns i dokumentationen för innehållssökning och indexering.

Indexdefinitionsnoder får inte distribueras i UI-innehållspaket oakpal-ui-content-package

  • Nyckel: IndexNotUnderUIContent
  • Typ: Förbättring
  • Allvarlighetsgrad: Mindre
  • Sedan: Version 2024.6.0

AEM Cloud Service tillåter inte att anpassade sökindexdefinitioner (noder av typen oak:QueryIndexDefinition) distribueras i UI-innehållspaketet.

WARNING
Du uppmanas att åtgärda detta så snart som möjligt eftersom det kommer att leda till att pipelines misslyckas med början i Cloud Manager August 2024.

Anpassad heltextindexdefinition av typen damAssetLucene måste ha rätt prefix med damAssetLucene oakpal-dam-asset-lucene

  • Nyckel: CustomFulltextIndexesOfTheDamAssetCheck
  • Typ: Förbättring
  • Allvarlighetsgrad: Mindre
  • Sedan: Version 2024.6.0

AEM Cloud Service tillåter inte att anpassade fulltextindexdefinitioner av typen damAssetLucene får prefix med något annat än damAssetLucene.

WARNING
Du uppmanas att åtgärda detta så snart som möjligt eftersom det kommer att leda till att pipelines misslyckas med början i Cloud Manager August 2024.

Indexdefinitionsnoder får inte innehålla egenskaper med samma namn oakpal-index-property-name

  • Nyckel: DuplicateNameProperty
  • Typ: Förbättring
  • Allvarlighetsgrad: Mindre
  • Sedan: Version 2024.6.0

AEM Cloud Service tillåter inte att anpassade sökindexdefinitioner (d.v.s. noder av typen oak:QueryIndexDefinition) innehåller egenskaper med samma namn

WARNING
Du uppmanas att åtgärda detta så snart som möjligt eftersom det kommer att leda till att pipelines misslyckas med början i Cloud Manager August 2024.

Det är förbjudet att anpassa vissa OOTB-indexdefinitioner oakpal-customizing-ootb-index

  • Nyckel: RestrictIndexCustomization
  • Typ: Förbättring
  • Allvarlighetsgrad: Mindre
  • Sedan: Version 2024.6.0

AEM Cloud Service tillåter inte obehöriga ändringar av följande OOTB-index:

  • nodetypeLucene
  • slingResourceResolver
  • socialLucene
  • appsLibsLucene
  • authorizables
  • pathReference
WARNING
Du uppmanas att åtgärda detta så snart som möjligt eftersom det kommer att leda till att pipelines misslyckas med början i Cloud Manager August 2024.

Konfigurationen av tokenisererna i analysatorerna ska skapas med namnet tokenizer oakpal-tokenizer

  • Nyckel: AnalyzerTokenizerConfigCheck
  • Typ: Förbättring
  • Allvarlighetsgrad: Mindre
  • Sedan: Version 2024.6.0

AEM Cloud Service tillåter inte att tokeniserare med felaktiga namn skapas i analysatorer. Tokenizers ska alltid definieras som tokenizer.

Konfiguration av indexeringsdefinitioner får inte innehålla blanksteg oakpal-indexing-definitions-spaces

  • Nyckel: PathSpacesCheck
  • Typ: Förbättring
  • Allvarlighetsgrad: Mindre
  • Sedan: Version 2024.7.0

AEM Cloud Service tillåter inte att indexdefinitioner som innehåller egenskaper med blanksteg skapas.

Dispatcher Optimization Tool dispatcher-optimization-tool-rules

I följande avsnitt visas de DOT-kontroller (Dispatcher Optimization Tool) som utförs av Cloud Manager. Följ länkarna för varje kontroll för dess GitHub-definition och information.

recommendation-more-help
c6cdc82b-cee9-48e0-a6ee-48149d5e72c3