Highlighted

AEM with google drive API integration

mark_julianp181

07-11-2017

Hi Everyone,

Does anyone have any experience using the google drive API in AEM? I already made and tested the Java code to make the necessary calls to the API but I'm having trouble integrating it with AEM. I already have the google jars as an OSGi bundle and I have the code below to populate and return a list of custom DriveFile Objects.

@Component

@Service(value=DriveManager.class)

public class DriveManager {

static Logger logger = LoggerFactory.getLogger("DriveManager");

    private static final String APPLICATION_NAME =

        "AEM Drive Manager";

    private static final java.io.File DATA_STORE_DIR = new java.io.File(

        System.getProperty("user.home"), ".credentials/drive-java-read");

    private static FileDataStoreFactory DATA_STORE_FACTORY;

    private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();

    private static final HttpTransport HTTP_TRANSPORT = new NetHttpTransport();

    private static final List<String> SCOPES =

        Arrays.asList(DriveScopes.DRIVE_METADATA_READONLY);

   

    private static GoogleAuthorizationCodeFlow flow;

   

    static {

        try {

            DATA_STORE_FACTORY = new FileDataStoreFactory(DATA_STORE_DIR);

        } catch (Throwable i) {

             logger.error("#############IOException : "+i.getMessage());

        }

    }

   

    public static Credential authorize() throws IOException {

  

    InputStream in =

        DriveManager.class.getResourceAsStream("/client_secret.json");

  

    GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));

    flow = new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT,

    JSON_FACTORY, clientSecrets, SCOPES).setDataStoreFactory(DATA_STORE_FACTORY)

            .setAccessType("offline")

            .build();

       

        Credential credential = new AuthorizationCodeInstalledApp(

            flow, new LocalServerReceiver()).authorize("user");

        System.out.println(

                "Credentials saved to " + DATA_STORE_DIR.getAbsolutePath());

        return credential;

    }

    public static Drive getDriveService() throws IOException {

        Credential credential = authorize();

        return new Drive.Builder(

                HTTP_TRANSPORT, JSON_FACTORY, credential)

                .setApplicationName(APPLICATION_NAME)

                .build();

    }

    public List<DriveFile> getFileList(){

          logger.info("############# ENTERING GET FILE LIST");

          List<DriveFile> driveFileList = new ArrayList<DriveFile>();

  

          try {

               Drive service = getDriveService();

               FileList results = service.files().list()

              .setPageSize(10)

              .setFields("nextPageToken, files(id, name)")

              .execute();

              List<File> files = results.getFiles();

              if (files == null || files.size() == 0) {

                  return driveFileList;

              } else {

                   for (File file : files) {

                         DriveFile temp = new DriveFile();

                         temp.setId(file.getId());

                         temp.setName(file.getName());

                         temp.setMimeType(file.getMimeType());

                         driveFileList.add(temp);

                   }

              }

          } catch (IOException e) {

               logger.error("#############IO Exception when getting File List "+e.toString());

          }

          for(DriveFile temp : driveFileList){

               logger.info("############# FILE " + temp.getName());

          }

          return driveFileList;

     }

}

Unfortunately I am having the following errors below:

08.11.2017 13:03:17.155 *INFO* [0:0:0:0:0:0:0:1 [1510117396763] GET /content/googledrive/en.html HTTP/1.1] DriveManager ############# ENTERING GET FILE LIST

08.11.2017 13:03:17.159 *ERROR* [0:0:0:0:0:0:0:1 [1510117396763] GET /content/googledrive/en.html HTTP/1.1] com.day.cq.wcm.core.impl.WCMDeveloperModeFilter Error during include of SlingRequestPathInfo: path='/content/googledrive/en/jcr:content/responsivegrid/uploadfile', selectorString='null', extension='html', suffix='null'

java.lang.NoClassDefFoundError: org/mortbay/component/LifeCycle

It says no ClassDefFoundError for org.mortbay.component but I have found no jars for org.mortbay.component and have already added org.mortbay.jetty core and utilities to my OSGi bundle.

Thank you for your help.

Replies

Highlighted

mark_julianp181

07-11-2017

It does work outside AEM with the google API jars, changing the getFileList method to a main method and removing the loggers allows me to run it as a working java app.