List of usage examples for org.apache.http.entity.mime MultipartEntityBuilder addTextBody
public MultipartEntityBuilder addTextBody(final String name, final String text, final ContentType contentType)
From source file:org.opentravel.schemacompiler.repository.impl.RemoteRepositoryClient.java
/** * @see org.opentravel.schemacompiler.repository.Repository#commit(org.opentravel.schemacompiler.repository.RepositoryItem) *//* w w w . j a v a2s . c o m*/ @Override public void commit(RepositoryItem item) throws RepositoryException { InputStream wipContent = null; try { validateRepositoryItem(item); // Obtain a file stream for the item's WIP content File wipFile = manager.getFileManager().getLibraryWIPContentLocation(item.getBaseNamespace(), item.getFilename()); if (!wipFile.exists()) { throw new RepositoryException("The work-in-process file does not exist: " + item.getFilename()); } wipContent = new FileInputStream(wipFile); // Build the HTTP request for the remote service RepositoryItemIdentityType itemIdentity = createItemIdentity(item); Marshaller marshaller = RepositoryFileManager.getSharedJaxbContext().createMarshaller(); HttpPost request = newPostRequest(COMMIT_ENDPOINT); MultipartEntityBuilder mpEntity = MultipartEntityBuilder.create(); StringWriter xmlWriter = new StringWriter(); marshaller.marshal(objectFactory.createRepositoryItemIdentity(itemIdentity), xmlWriter); mpEntity.addTextBody("item", xmlWriter.toString(), ContentType.TEXT_XML); mpEntity.addBinaryBody("fileContent", toByteArray(wipContent), ContentType.DEFAULT_BINARY, item.getFilename()); // mpEntity.addPart( "fileContent", new InputStreamBody(wipContent, item.getFilename()) // ); request.setEntity(mpEntity.build()); // Send the web service request and check the response log.info("Sending commit request to HTTP endpoint: " + endpointUrl); HttpResponse response = executeWithAuthentication(request); if (response.getStatusLine().getStatusCode() != HTTP_RESPONSE_STATUS_OK) { throw new RepositoryException(getResponseErrorMessage(response)); } log.info("Commit response received - Status OK"); // Update the local cache with the content we just sent to the remote web service downloadContent(item, true); } catch (JAXBException e) { throw new RepositoryException("The format of the library meta-data is unreadable.", e); } catch (IOException e) { throw new RepositoryException("The remote repository is unavailable.", e); } finally { try { if (wipContent != null) wipContent.close(); } catch (Throwable t) { } } }
From source file:org.opentravel.schemacompiler.repository.impl.RemoteRepositoryClient.java
/** * @see org.opentravel.schemacompiler.repository.Repository#unlock(org.opentravel.schemacompiler.repository.RepositoryItem, * boolean)/*from ww w .ja v a2s .c o m*/ */ @SuppressWarnings("unchecked") @Override public void unlock(RepositoryItem item, boolean commitWIP) throws RepositoryException { InputStream wipContent = null; boolean success = false; try { validateRepositoryItem(item); manager.getFileManager().startChangeSet(); // Build the HTTP request for the remote service RepositoryItemIdentityType itemIdentity = createItemIdentity(item); Marshaller marshaller = RepositoryFileManager.getSharedJaxbContext().createMarshaller(); HttpPost request = newPostRequest(UNLOCK_ENDPOINT); MultipartEntityBuilder mpEntity = MultipartEntityBuilder.create(); StringWriter xmlWriter = new StringWriter(); if (commitWIP) { File wipFile = manager.getFileManager().getLibraryWIPContentLocation(item.getBaseNamespace(), item.getFilename()); if (!wipFile.exists()) { throw new RepositoryException("The work-in-process file does not exist: " + item.getFilename()); } wipContent = new FileInputStream(wipFile); mpEntity.addBinaryBody("fileContent", toByteArray(wipContent), ContentType.DEFAULT_BINARY, item.getFilename()); // mpEntity.addPart( "fileContent", new InputStreamBody(wipContent, // item.getFilename()) ); } marshaller.marshal(objectFactory.createRepositoryItemIdentity(itemIdentity), xmlWriter); mpEntity.addTextBody("item", xmlWriter.toString(), ContentType.TEXT_XML); request.setEntity(mpEntity.build()); // Send the web service request and unmarshall the updated meta-data from the response log.info("Sending lock request to HTTP endpoint: " + endpointUrl); HttpResponse response = executeWithAuthentication(request); if (response.getStatusLine().getStatusCode() != HTTP_RESPONSE_STATUS_OK) { throw new RepositoryException(getResponseErrorMessage(response)); } log.info("Lock response received - Status OK"); Unmarshaller unmarshaller = RepositoryFileManager.getSharedJaxbContext().createUnmarshaller(); JAXBElement<LibraryInfoType> jaxbElement = (JAXBElement<LibraryInfoType>) unmarshaller .unmarshal(response.getEntity().getContent()); // Update the local cache with the content we just received from the remote web service manager.getFileManager().saveLibraryMetadata(jaxbElement.getValue()); // Update the local repository item with the latest state information ((RepositoryItemImpl) item).setState(RepositoryItemState.MANAGED_UNLOCKED); ((RepositoryItemImpl) item).setLockedByUser(null); // Force a re-download of the updated content to make sure the local copy is // synchronized // with the remote repository. downloadContent(item, true); success = true; } catch (JAXBException e) { throw new RepositoryException("The format of the library meta-data is unreadable.", e); } catch (IOException e) { throw new RepositoryException("The remote repository is unavailable.", e); } finally { // Close the WIP content input stream try { if (wipContent != null) wipContent.close(); } catch (Throwable t) { } // Commit or roll back the changes based on the result of the operation if (success) { manager.getFileManager().commitChangeSet(); } else { try { manager.getFileManager().rollbackChangeSet(); } catch (Throwable t) { log.error("Error rolling back the current change set.", t); } } } }
From source file:com.adobe.aem.demomachine.communities.Loader.java
private static String doThumbnail(ResourceResolver rr, LinkedList<InputStream> lIs, String hostname, String port, String adminPassword, String csvfile, String filename, String sitename, int maxretries) { if (filename == null || filename.equals("")) return null; String pathToFile = "/content/dam/resources/resource-thumbnails/" + sitename + "/" + filename; MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.setCharset(MIME.UTF8_CHARSET); builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); addBinaryBody(builder, lIs, rr, "file", csvfile, filename); builder.addTextBody("fileName", filename, ContentType.create("text/plain", MIME.UTF8_CHARSET)); logger.debug("Posting file for thumbnails with name: " + filename); Loader.doPost(hostname, port, pathToFile, "admin", adminPassword, builder.build(), null); doWaitWorkflows(hostname, port, adminPassword, "thumbnail", maxretries); return pathToFile + "/file"; }
From source file:org.apache.stanbol.workflow.jersey.writers.ContentItemWriter.java
@Override public void writeTo(ContentItem ci, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, Object> httpHeaders, OutputStream entityStream) throws IOException, WebApplicationException { //(0) handle default dataType Map<String, Object> reqProp = ContentItemHelper.getRequestPropertiesContentPart(ci); boolean omitMetadata = isOmitMetadata(reqProp); if (!MULTIPART.isCompatible(mediaType)) { //two possible cases if (!omitMetadata) { // (1) just return the RDF data //(1.a) Backward support for default dataType if no Accept header is set StringBuilder ctb = new StringBuilder(); if (mediaType.isWildcardType() || TEXT_PLAIN_TYPE.isCompatible(mediaType) || APPLICATION_OCTET_STREAM_TYPE.isCompatible(mediaType)) { ctb.append(APPLICATION_LD_JSON); } else { ctb.append(mediaType.getType()).append('/').append(mediaType.getSubtype()); }/* ww w.j av a2 s .c om*/ ctb.append(";charset=").append(UTF8.name()); String contentType = ctb.toString(); httpHeaders.putSingle(HttpHeaders.CONTENT_TYPE, contentType); try { serializer.serialize(entityStream, ci.getMetadata(), contentType); } catch (UnsupportedSerializationFormatException e) { throw new WebApplicationException("The enhancement results " + "cannot be serialized in the requested media type: " + mediaType.toString(), Response.Status.NOT_ACCEPTABLE); } } else { // (2) return a single content part Entry<UriRef, Blob> contentPart = getBlob(ci, Collections.singleton(mediaType.toString())); if (contentPart == null) { //no alternate content with the requeste media type throw new WebApplicationException("The requested enhancement chain has not created an " + "version of the parsed content in the reuqest media type " + mediaType.toString(), Response.Status.UNSUPPORTED_MEDIA_TYPE); } else { //found -> stream the content to the client //NOTE: This assumes that the presence of a charset // implies reading/writing character streams String requestedCharset = mediaType.getParameters().get("charset"); String blobCharset = contentPart.getValue().getParameter().get("charset"); Charset readerCharset = blobCharset == null ? UTF8 : Charset.forName(blobCharset); Charset writerCharset = requestedCharset == null ? null : Charset.forName(requestedCharset); if (writerCharset != null && !writerCharset.equals(readerCharset)) { //we need to transcode Reader reader = new InputStreamReader(contentPart.getValue().getStream(), readerCharset); Writer writer = new OutputStreamWriter(entityStream, writerCharset); IOUtils.copy(reader, writer); IOUtils.closeQuietly(reader); } else { //no transcoding if (requestedCharset == null && blobCharset != null) { httpHeaders.putSingle(HttpHeaders.CONTENT_TYPE, mediaType.toString() + "; charset=" + blobCharset); } InputStream in = contentPart.getValue().getStream(); IOUtils.copy(in, entityStream); IOUtils.closeQuietly(in); } } } } else { // multipart mime requested! final String charsetName = mediaType.getParameters().get("charset"); final Charset charset = charsetName != null ? Charset.forName(charsetName) : UTF8; MediaType rdfFormat; String rdfFormatString = getRdfFormat(reqProp); if (rdfFormatString == null || rdfFormatString.isEmpty()) { rdfFormat = DEFAULT_RDF_FORMAT; } else { try { rdfFormat = MediaType.valueOf(rdfFormatString); if (rdfFormat.getParameters().get("charset") == null) { //use the charset of the default RDF format rdfFormat = new MediaType(rdfFormat.getType(), rdfFormat.getSubtype(), DEFAULT_RDF_FORMAT.getParameters()); } } catch (IllegalArgumentException e) { throw new WebApplicationException( "The specified RDF format '" + rdfFormatString + "' (used to serialize all RDF parts of " + "multipart MIME responses) is not a well formated MIME type", Response.Status.BAD_REQUEST); } } //(1) setting the correct header String contentType = String.format("%s/%s; charset=%s; boundary=%s", mediaType.getType(), mediaType.getSubtype(), charset.toString(), CONTENT_ITEM_BOUNDARY); httpHeaders.putSingle(HttpHeaders.CONTENT_TYPE, contentType); MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create(); entityBuilder.setBoundary(CONTENT_ITEM_BOUNDARY); //HttpMultipart entity = new HttpMultipart("from-data", charset ,CONTENT_ITEM_BOUNDARY); //(2) serialising the metadata if (!isOmitMetadata(reqProp)) { entityBuilder.addPart("metadata", new ClerezzaContentBody(ci.getUri().getUnicodeString(), ci.getMetadata(), rdfFormat)); // entity.addBodyPart(new FormBodyPart("metadata", new ClerezzaContentBody( // ci.getUri().getUnicodeString(), ci.getMetadata(), // rdfFormat))); } //(3) serialising the Content (Bloby) //(3.a) Filter based on parameter List<Entry<UriRef, Blob>> includedBlobs = filterBlobs(ci, reqProp); //(3.b) Serialise the filtered if (!includedBlobs.isEmpty()) { Map<String, ContentBody> contentParts = new LinkedHashMap<String, ContentBody>(); for (Entry<UriRef, Blob> entry : includedBlobs) { Blob blob = entry.getValue(); ContentType ct = ContentType.create(blob.getMimeType()); String cs = blob.getParameter().get("charset"); if (StringUtils.isNotBlank(cs)) { ct = ct.withCharset(cs); } contentParts.put(entry.getKey().getUnicodeString(), new InputStreamBody(blob.getStream(), ct)); } //add all the blobs entityBuilder.addPart("content", new MultipartContentBody(contentParts, CONTENT_PARTS_BOUNDERY, MULTIPART_ALTERNATE)); } //else no content to include Set<String> includeContentParts = getIncludedContentPartURIs(reqProp); if (includeContentParts != null) { //(4) serialise the Request Properties if (includeContentParts.isEmpty() || includeContentParts.contains(REQUEST_PROPERTIES_URI.getUnicodeString())) { JSONObject object; try { object = toJson(reqProp); } catch (JSONException e) { String message = "Unable to convert Request Properties " + "to JSON (values : " + reqProp + ")!"; log.error(message, e); throw new WebApplicationException(message, Response.Status.INTERNAL_SERVER_ERROR); } entityBuilder.addTextBody(REQUEST_PROPERTIES_URI.getUnicodeString(), object.toString(), ContentType.APPLICATION_JSON.withCharset(UTF8)); } //(5) additional RDF metadata stored in contentParts for (Entry<UriRef, TripleCollection> entry : getContentParts(ci, TripleCollection.class) .entrySet()) { if (includeContentParts.isEmpty() || includeContentParts.contains(entry.getKey())) { entityBuilder.addPart(entry.getKey().getUnicodeString(), new ClerezzaContentBody(null, //no file name entry.getValue(), rdfFormat)); } // else ignore this content part } } entityBuilder.build().writeTo(entityStream); } }
From source file:com.adobe.aem.demomachine.communities.Loader.java
public static void processLoading(ResourceResolver rr, Reader in, String hostname, String port, String altport, String adminPassword, String analytics, boolean reset, boolean configure, boolean minimize, boolean noenablement, String csvfile, int maxretries) { String location = null;//from ww w .j a v a 2s . c om String userHome = null; String sitePagePath = null; String analyticsPagePath = null; String resourceType = null; String subComponentType = null; String rootPath = "/content/sites"; String[] url = new String[10]; // Handling 10 levels maximum for nested comments int urlLevel = 0; int row = 0; boolean ignoreUntilNextComponent = false; HashMap<String, ArrayList<String>> learningpaths = new HashMap<String, ArrayList<String>>(); try { String componentType = null; logger.debug("AEM Demo Loader: Loading bundles versions"); String bundlesList = doGet(hostname, port, "/system/console/bundles.json", "admin", adminPassword, null); // Some steps are specific to the version number of the Enablement add-on Version vBundleCommunitiesEnablement = getVersion(bundlesList, "com.adobe.cq.social.cq-social-enablement-impl"); Version vBundleCommunitiesCalendar = getVersion(bundlesList, "com.adobe.cq.social.cq-social-calendar"); if (vBundleCommunitiesCalendar == null) { vBundleCommunitiesCalendar = getVersion(bundlesList, "com.adobe.cq.social.cq-social-calendar-impl"); } Version vBundleCommunitiesNotifications = getVersion(bundlesList, "com.adobe.cq.social.cq-social-notifications-impl"); Version vBundleCommunitiesSCORM = getVersion(bundlesList, "com.adobe.cq.social.cq-social-scorm-dam"); Version vBundleCommunitiesSCF = getVersion(bundlesList, "com.adobe.cq.social.cq-social-scf-impl"); Version vBundleCommunitiesAdvancedScoring = getVersion(bundlesList, "com.adobe.cq.social.cq-social-scoring-advanced-impl"); // Versions related methods boolean isCommunities61 = vBundleCommunitiesSCF != null && vBundleCommunitiesSCF.compareTo(new Version(COMMUNITIES61)) == 0; boolean isCommunities61FP5orlater = vBundleCommunitiesSCF != null && vBundleCommunitiesSCF.compareTo(new Version(COMMUNITIES61FP5)) >= 0; boolean isCommunities61FP6orlater = vBundleCommunitiesSCF != null && vBundleCommunitiesSCF.compareTo(new Version(COMMUNITIES61FP6)) >= 0; boolean isCommunities61FP7orlater = vBundleCommunitiesSCF != null && vBundleCommunitiesSCF.compareTo(new Version(COMMUNITIES61FP7)) >= 0; Iterable<CSVRecord> records = CSVFormat.EXCEL.parse(in); ignoreUntilNextComponent = false; for (CSVRecord record : records) { LinkedList<InputStream> lIs = new LinkedList<InputStream>(); row = row + 1; logger.info("Row: " + row + ", new record: " + record.get(0)); if (record.size() > 2) subComponentType = record.get(2); else logger.info("No subcomponent type to load"); // Let's see if we deal with a comment if (record.get(0).startsWith("#")) { // We can ignore the comment line and move on continue; } // Let's see if we need to terminate this process if (record.get(0).equals(KILL)) { if (rr == null) System.exit(1); else return; } // Let's see if we need to pause a little bit if (record.get(0).equals(SLEEP) && record.get(1).length() > 0) { doSleep(Long.valueOf(record.get(1)).longValue(), "Pausing " + record.get(1) + " ms"); continue; } // Let's see if we need to set the current site path if (record.get(0).equals(SITEPATH)) { sitePagePath = record.get(1); } // Let's see if we need to create a new Community site if (record.get(0).equals(SITE)) { // Building the form entity to be posted MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.setCharset(MIME.UTF8_CHARSET); builder.addTextBody(":operation", "social:createSite", ContentType.create("text/plain", MIME.UTF8_CHARSET)); builder.addTextBody("_charset_", "UTF-8", ContentType.create("text/plain", MIME.UTF8_CHARSET)); String urlName = null; String[] initialLanguages = null; boolean isValid = true; for (int i = 2; i < record.size() - 1; i = i + 2) { if (record.get(i) != null && record.get(i + 1) != null && record.get(i).length() > 0) { String name = record.get(i).trim(); String value = record.get(i + 1).trim(); if (value.equals("TRUE")) { value = "true"; } if (value.equals("FALSE")) { value = "false"; } if (name.equals("urlName")) { urlName = value; } if (name.equals(ROOT)) { rootPath = value; logger.debug("Rootpath for subsequent processing is: " + rootPath); if (!isResourceAvailable(hostname, port, adminPassword, rootPath)) { logger.warn("Rootpath " + rootPath + " is not available, proceeding to next record"); isValid = false; } else { logger.info("Rootpath " + rootPath + " is available"); } } if (name.equals(BANNER)) { addBinaryBody(builder, lIs, rr, BANNER, csvfile, value); } else if (name.equals(THUMBNAIL)) { addBinaryBody(builder, lIs, rr, THUMBNAIL, csvfile, value); } else if (name.equals(CSS)) { addBinaryBody(builder, lIs, rr, CSS, csvfile, value); } else if (name.equals(LANGUAGE) || name.equals(LANGUAGES)) { // Starting with 6.1 FP5 and 6.2 FP1, we can create multiple languages at once if (isCommunities61FP5orlater) { initialLanguages = value.split(","); for (String initialLanguage : initialLanguages) { builder.addTextBody(LANGUAGES, initialLanguage, ContentType.create("text/plain", MIME.UTF8_CHARSET)); } } else { // Only keep the first language for pre 6.1 FP5 and 6.2 FP1 initialLanguages = new String[1]; initialLanguages[0] = value.split(",")[0]; builder.addTextBody(LANGUAGE, initialLanguages[0], ContentType.create("text/plain", MIME.UTF8_CHARSET)); } } else { // For cloud services, we verify that they are actually available if ((name.equals(OPTION_TRANSLATION) || name.equals(OPTION_ANALYTICS) || name.equals(OPTION_FACEBOOK) || name.equals(OPTION_TWITTER)) && value.equals("true")) { String cloudName = record.get(i + 2).trim(); String cloudValue = record.get(i + 3).trim(); if ((cloudName.equals(CLOUDSERVICE_TRANSLATION) || cloudName.equals(CLOUDSERVICE_FACEBOOK) || cloudName.equals(CLOUDSERVICE_TWITTER) || cloudName.equals(CLOUDSERVICE_ANALYTICS)) && !isResourceAvailable(hostname, port, adminPassword, cloudValue)) { builder.addTextBody(name, "false", ContentType.create("text/plain", MIME.UTF8_CHARSET)); logger.warn("Cloud service: " + cloudValue + " is not available on this instance"); } else { // We have a valid cloud service builder.addTextBody(name, value, ContentType.create("text/plain", MIME.UTF8_CHARSET)); builder.addTextBody(cloudName, cloudValue, ContentType.create("text/plain", MIME.UTF8_CHARSET)); i = i + 2; logger.debug( "Cloud service: " + cloudValue + " available on this instance"); } } else { // All other values just get added as is builder.addTextBody(name, value, ContentType.create("text/plain", MIME.UTF8_CHARSET)); } } } } // Printing site creation settings //ByteArrayOutputStream out = new ByteArrayOutputStream(); //builder.build().writeTo(out); //String string = out.toString(); //logger.debug(string); // Site creation if (isValid) doPost(hostname, port, "/content.social.json", "admin", adminPassword, builder.build(), null, null); else continue; // Waiting for site creation to be complete boolean existingSiteWithLocale = rootPath.indexOf("/" + initialLanguages[0]) > 0; doWaitPath(hostname, port, adminPassword, rootPath + "/" + urlName + (existingSiteWithLocale ? "" : "/" + initialLanguages[0]), maxretries); // Site publishing, if there's a publish instance to publish to if (!port.equals(altport)) { for (String initialLanguage : initialLanguages) { List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); nameValuePairs.add(new BasicNameValuePair("id", "nobot")); nameValuePairs.add(new BasicNameValuePair(":operation", "social:publishSite")); nameValuePairs.add(new BasicNameValuePair("path", rootPath + "/" + urlName + (existingSiteWithLocale ? "" : "/" + initialLanguage))); logger.debug("Publishing site " + urlName + " for language " + initialLanguage); doPost(hostname, port, "/communities/sites.html", "admin", adminPassword, new UrlEncodedFormEntity(nameValuePairs), null); doWaitPath(hostname, altport, adminPassword, rootPath + "/" + urlName + (existingSiteWithLocale ? "" : "/" + initialLanguage), maxretries); } } continue; } // Let's see if we need to update an existing Community site (this doesn't include republishing the site!) if (record.get(0).equals(SITEUPDATE) && record.get(1) != null && record.get(2) != null) { // Let's set if we need to run based on version number Version vRecord = null; if (record.get(2).startsWith(">") || record.get(2).startsWith("<") || record.get(2).startsWith("=")) { try { vRecord = new Version(record.get(2).substring(1)); } catch (Exception e) { logger.error("Invalid version number specified" + record.get(2)); } } if (vRecord != null && record.get(2).startsWith(">") && vBundleCommunitiesSCF.compareTo(vRecord) <= 0) { logger.info("Ignoring the site update command for this version of AEM" + vBundleCommunitiesSCF.get()); continue; } if (vRecord != null && record.get(2).startsWith("<") && vBundleCommunitiesSCF.compareTo(vRecord) > 0) { logger.info("Ignoring the site update command for this version of AEM" + vBundleCommunitiesSCF.get()); continue; } if (isResourceAvailable(hostname, port, adminPassword, record.get(1))) { logger.debug("Updating a Community Site " + record.get(1)); } else { logger.error("Can't update a Community Site " + record.get(1)); continue; } // Let's fetch the theme for this Community Site Url String siteConfig = doGet(hostname, port, record.get(1), "admin", adminPassword, null); if (siteConfig == null) { logger.error("Can't update a Community Site " + record.get(1)); continue; } // Building the form entity to be posted MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.setCharset(MIME.UTF8_CHARSET); builder.addTextBody(":operation", "social:updateSite", ContentType.create("text/plain", MIME.UTF8_CHARSET)); builder.addTextBody("_charset_", "UTF-8", ContentType.create("text/plain", MIME.UTF8_CHARSET)); // Adding the mandatory values for being able to save a site via the JSON endpoint List<String> props = Arrays.asList("urlName", "theme", "moderators", "createGroupPermission", "groupAdmin", "twitterconnectoauthid", "fbconnectoauthid", "translationProviderConfig", "translationProvider", "commonStoreLanguage"); try { JSONObject siteprops = new JSONObject(siteConfig).getJSONObject("properties"); for (String prop : props) { if (siteprops.has(prop)) { Object propValue = siteprops.get(prop); if (propValue instanceof JSONArray) { JSONArray propArray = (JSONArray) propValue; for (int i = 0; i < propArray.length(); i++) { builder.addTextBody(prop, propArray.get(i).toString(), ContentType.create("text/plain", MIME.UTF8_CHARSET)); } } else { builder.addTextBody(prop, propValue.toString(), ContentType.create("text/plain", MIME.UTF8_CHARSET)); } } } } catch (Exception e) { logger.error(e.getMessage()); } // Adding the override values from the CSV record boolean isValid = true; for (int i = 3; i < record.size() - 1; i = i + 2) { if (record.get(i) != null && record.get(i + 1) != null && record.get(i).length() > 0) { String name = record.get(i).trim(); String value = record.get(i + 1).trim(); builder.addTextBody(name, value, ContentType.create("text/plain", MIME.UTF8_CHARSET)); // If the template includes some of the enablement features, then it won't work for 6.1 GA if (name.equals("functions") && value.indexOf("assignments") > 0 && vBundleCommunitiesEnablement == null) { logger.info("Site update is not compatible with this version of AEM"); isValid = false; } // If the template includes some of the ideation features, then it won't work until 6.2 FP2 if (name.equals("functions") && value.indexOf("ideation") > 0 && !isCommunities61FP6orlater) { logger.info("Site update is not compatible with this version of AEM"); isValid = false; } } } // Convenient for debugging the site update operation // printPOST(builder.build()); if (isValid) doPost(hostname, port, record.get(1), "admin", adminPassword, builder.build(), null); continue; } // Let's see if we need to publish a site if (record.get(0).equals(SITEPUBLISH) && record.get(1) != null) { if (isResourceAvailable(hostname, port, adminPassword, record.get(1))) { logger.debug("Publishing a Community Site " + record.get(1)); } else { logger.warn("Can't publish a Community Site " + record.get(1)); continue; } if (!port.equals(altport)) { List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); nameValuePairs.add(new BasicNameValuePair("id", "nobot")); nameValuePairs.add(new BasicNameValuePair(":operation", "social:publishSite")); nameValuePairs.add(new BasicNameValuePair("nestedActivation", "true")); nameValuePairs.add(new BasicNameValuePair("path", record.get(1))); doPost(hostname, port, "/communities/sites.html", "admin", adminPassword, new UrlEncodedFormEntity(nameValuePairs), null); doWaitPath(hostname, altport, adminPassword, record.get(1), maxretries); } continue; } // Let's see if we need to publish a group if (record.get(0).equals(GROUPPUBLISH) && record.get(1) != null) { if (!port.equals(altport)) { List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); nameValuePairs.add(new BasicNameValuePair("id", "nobot")); nameValuePairs.add(new BasicNameValuePair(":operation", "social:publishCommunityGroup")); nameValuePairs.add(new BasicNameValuePair("nestedActivation", "true")); nameValuePairs.add(new BasicNameValuePair("path", record.get(1) + "/" + record.get(2))); doPost(hostname, port, "/communities/communitygroups.html/" + record.get(1), "admin", adminPassword, new UrlEncodedFormEntity(nameValuePairs), null); } continue; } // Let's see if we need to activate a tree if (record.get(0).equals(ACTIVATE) && record.get(1) != null) { if (!port.equals(altport)) { List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); nameValuePairs.add(new BasicNameValuePair("cmd", "activate")); nameValuePairs.add(new BasicNameValuePair("ignoreactivated", "true")); nameValuePairs.add(new BasicNameValuePair("path", record.get(1))); doPost(hostname, port, "/etc/replication/treeactivation.html", "admin", adminPassword, new UrlEncodedFormEntity(nameValuePairs), null); } continue; } // Let's see if we need to create a new Tag if (record.get(0).equals(TAG)) { // Building the form entity to be posted MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.setCharset(MIME.UTF8_CHARSET); builder.addTextBody("_charset_", "UTF-8", ContentType.create("text/plain", MIME.UTF8_CHARSET)); for (int i = 1; i < record.size() - 1; i = i + 2) { if (record.get(i) != null && record.get(i + 1) != null && record.get(i).length() > 0 && record.get(i + 1).length() > 0) { String name = record.get(i).trim(); String value = record.get(i + 1).trim(); builder.addTextBody(name, value, ContentType.create("text/plain", MIME.UTF8_CHARSET)); } } // Tag creation doPost(hostname, port, "/bin/tagcommand", "admin", adminPassword, builder.build(), null); continue; } // Let's see if we need to assign some badges if (record.get(0).equals(BADGE)) { if (vBundleCommunitiesEnablement == null || vBundleCommunitiesEnablement.compareTo(new Version(ENABLEMENT61FP3)) < 0) { logger.info("Badging operations not available with this version of AEM"); continue; } List<NameValuePair> nameValuePairs = buildNVP(hostname, port, adminPassword, null, record, 2); String badgePath = record.get(1); if (badgePath.startsWith("/etc") && (vBundleCommunitiesEnablement.compareTo(new Version(ENABLEMENT61FP4)) == 0 || vBundleCommunitiesEnablement.compareTo(new Version(ENABLEMENT62)) > 0)) { badgePath = badgePath.replaceAll("/jcr:content", ""); nameValuePairs.add(new BasicNameValuePair("sling:resourceType", "social/gamification/components/hbs/badging/rulecollection/rule")); nameValuePairs.add(new BasicNameValuePair("badgingType", "basic")); } if (nameValuePairs.size() > 2) { for (int i = 0; i < nameValuePairs.size(); i = i + 1) { String name = nameValuePairs.get(i).getName(); String value = nameValuePairs.get(i).getValue(); // Special case to accommodate re-factoring of badging images if (name.equals("badgeContentPath") && (vBundleCommunitiesEnablement .compareTo(new Version(ENABLEMENT61FP4)) == 0 || vBundleCommunitiesEnablement.compareTo(new Version(ENABLEMENT62)) > 0)) { value = value.replaceAll("/jcr:content", ""); nameValuePairs.set(i, new BasicNameValuePair(name, value)); } // Special case to accommodate re-factoring of badging images if (name.startsWith("thresholds") && (vBundleCommunitiesEnablement .compareTo(new Version(ENABLEMENT61FP4)) == 0 || vBundleCommunitiesEnablement.compareTo(new Version(ENABLEMENT62)) > 0)) { value = value.replaceAll("/jcr:content(.*)", ""); nameValuePairs.set(i, new BasicNameValuePair(name, value)); } // Special case to accommodate re-factoring or scoring and badging resource types if (name.equals("jcr:primaryType") && (vBundleCommunitiesEnablement .compareTo(new Version(ENABLEMENT61FP4)) == 0 || vBundleCommunitiesEnablement.compareTo(new Version(ENABLEMENT62)) > 0)) { if (value.equals("cq:PageContent") || value.equals("cq:Page")) { value = "nt:unstructured"; nameValuePairs.set(i, new BasicNameValuePair(name, value)); } } // Special case for accommodate advanced scoring being installed or not if (name.endsWith("Rules") && value.contains("adv-") && vBundleCommunitiesAdvancedScoring == null) { nameValuePairs.remove(i--); } } } // Badge rules operation doPost(hostname, port, badgePath, "admin", adminPassword, new UrlEncodedFormEntity(nameValuePairs), null); continue; } // Let's see if we need to create a new Community site template, and if we can do it (script run against author instance) if (record.get(0).equals(SITETEMPLATE) || record.get(0).equals(GROUPTEMPLATE)) { // Building the form entity to be posted MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.setCharset(MIME.UTF8_CHARSET); builder.addTextBody(":operation", "social:create" + record.get(0), ContentType.create("text/plain", MIME.UTF8_CHARSET)); builder.addTextBody("_charset_", "UTF-8", ContentType.create("text/plain", MIME.UTF8_CHARSET)); boolean isValid = true; for (int i = 2; i < record.size() - 1; i = i + 2) { if (record.get(i) != null && record.get(i + 1) != null && record.get(i).length() > 0) { String name = record.get(i).trim(); String value = record.get(i + 1).trim(); builder.addTextBody(name, value, ContentType.create("text/plain", MIME.UTF8_CHARSET)); // If the template is already there, let's not try to create it if (name.equals("templateName") && (isResourceAvailable(hostname, port, adminPassword, "/etc/community/templates/sites/custom/" + title2name(value)) || isResourceAvailable(hostname, port, adminPassword, "/etc/community/templates/groups/custom/" + title2name(value)))) { logger.info("Template " + value + " is already there"); isValid = false; } // If the template includes some of the enablement features, then it won't work for 6.1 GA if (name.equals("functions") && value.indexOf("assignments") > 0 && vBundleCommunitiesEnablement == null) { logger.info("Template " + record.get(3) + " is not compatible with this version of AEM"); isValid = false; } // If the template includes some of the ideation features, then it won't work until 6.2 FP2 if (name.equals("functions") && value.indexOf("ideation") > 0 && !isCommunities61FP6orlater) { logger.info("Template " + record.get(3) + " is not compatible with this version of AEM"); isValid = false; } // If the group template includes the nested group features, then it won't work until 6.2 FP1 if (record.get(0).equals(GROUPTEMPLATE) && name.equals("functions") && value.indexOf("groups") > 0 && (vBundleCommunitiesEnablement != null && vBundleCommunitiesEnablement .compareTo(new Version(ENABLEMENT62)) <= 0)) { logger.info("Group template " + record.get(3) + " is not compatible with this version of AEM"); isValid = false; } // If the group template includes the blogs or calendars, then it won't work with 6.1GA if (name.equals("functions") && (value.indexOf("blog") > 0 || value.indexOf("calendar") > 0) && vBundleCommunitiesEnablement == null) { logger.info("Template " + record.get(3) + " is not compatible with this version of AEM"); isValid = false; } } } // Site or Group template creation if (isValid) doPost(hostname, port, "/content.social.json", "admin", adminPassword, builder.build(), null); continue; } // Let's see if we need to create a new Community group if (record.get(0).equals(GROUP) || record.get(0).equals(SUBGROUP)) { // SubGroups are only supported with 6.1 FP5 and 6.2 FP1 onwards if (record.get(0).equals(SUBGROUP) && !isCommunities61FP5orlater) { logger.warn("Subgroups are not supported with this version of AEM Communities"); continue; } // Building the form entity to be posted MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.setCharset(MIME.UTF8_CHARSET); builder.addTextBody(":operation", "social:createCommunityGroup", ContentType.create("text/plain", MIME.UTF8_CHARSET)); builder.addTextBody("_charset_", "UTF-8", ContentType.create("text/plain", MIME.UTF8_CHARSET)); String urlName = null; String groupType = null; for (int i = 3; i < record.size() - 1; i = i + 2) { if (record.get(i) != null && record.get(i + 1) != null && record.get(i).length() > 0) { String name = record.get(i).trim(); String value = record.get(i + 1).trim(); if (value.equals("TRUE")) { value = "true"; } if (value.equals("FALSE")) { value = "false"; } if (name.equals("type")) { groupType = value; } if (name.equals(IMAGE)) { addBinaryBody(builder, lIs, rr, IMAGE, csvfile, value); } else { builder.addTextBody(name, value, ContentType.create("text/plain", MIME.UTF8_CHARSET)); } if (name.equals("urlName")) { urlName = value; } if (name.equals("siteRoot")) { // Some content root has been provided for the Group. It might result from previous actions and might not be there yet - let's wait for it doWaitPath(hostname, port, adminPassword, value, maxretries); } } } // Private groups are only support with 6.1 FP1 onwards if (groupType != null && groupType.equals("Secret") && isCommunities61) { continue; } // Group creation doPost(hostname, port, record.get(1), getUserName(record.get(2)), getPassword(record.get(2), adminPassword), builder.build(), null); // Waiting for group to be available either on publish or author int i = (record.get(1).indexOf("/jcr:content") > 0) ? record.get(1).indexOf("/jcr:content") : record.get(1).indexOf(".social.json"); if (urlName != null && i > 0) { doWaitPath(hostname, port, adminPassword, record.get(1).substring(0, i) + "/" + urlName, maxretries); } else { logger.warn("Not waiting for Group to be fully available"); } continue; } // Let's see if it's simple Sling Delete request if (record.get(0).equals(SLINGDELETE)) { doDelete(hostname, port, record.get(1), "admin", adminPassword); continue; } // Let's see if we need to delete a Community site if (record.get(0).equals(SITEDELETE) && record.get(1) != null) { // Let's fetch the siteId for this Community Site Url String siteConfig = doGet(hostname, port, record.get(1), "admin", adminPassword, null); // No site to Delete if (siteConfig == null) continue; try { String siteRoot = new JSONObject(siteConfig).getString("siteRoot"); String urlName = new JSONObject(siteConfig).getString("urlName"); String siteId = new JSONObject(siteConfig).getString("siteId"); String resourcesRoot = new JSONObject(siteConfig).getString("siteAssetsPath"); if (siteRoot != null && urlName != null && siteId != null && resourcesRoot != null) { // First, deleting the main JCR path for this site, on author and publish doDelete(hostname, port, siteRoot + "/" + urlName, "admin", adminPassword); doDelete(hostname, altport, siteRoot + "/" + urlName, "admin", adminPassword); // Then, deleting the dam resources for this site, on author and publish doDelete(hostname, port, resourcesRoot, "admin", adminPassword); doDelete(hostname, altport, resourcesRoot, "admin", adminPassword); // Then, deleting the main UGC path for this site, on author and publish doDelete(hostname, port, "/content/usergenerated/asi/jcr" + siteRoot + "/" + urlName, "admin", adminPassword); doDelete(hostname, altport, "/content/usergenerated/asi/jcr" + siteRoot + "/" + urlName, "admin", adminPassword); // Finally, deleting the system groups for this site, on author and publish doDelete(hostname, port, "/home/groups/community-" + siteId, "admin", adminPassword); doDelete(hostname, altport, "/home/groups/community-" + siteId, "admin", adminPassword); } } catch (Exception e) { logger.error(e.getMessage()); } } // Let's see if we need to add users to an AEM Group if ((record.get(0).equals(GROUPMEMBERS) || record.get(0).equals(SITEMEMBERS)) && record.get(GROUP_INDEX_NAME) != null) { // Checking if we have a member group for this site String groupName = null; if (record.get(0).equals(SITEMEMBERS)) { String configurationPath = record.get(GROUP_INDEX_NAME); // Let's make sure the configuration .json is there doWaitPath(hostname, port, adminPassword, configurationPath, maxretries); // Let's fetch the siteId for this Community Site Url String siteConfig = doGet(hostname, port, configurationPath, "admin", adminPassword, null); if (siteConfig == null) { logger.error("Can't retrieve site configuration"); continue; } ; String siteId = null; try { siteId = new JSONObject(siteConfig).getString("siteId"); } catch (Exception e) { logger.warn("No site Id available"); } String urlName = null; try { urlName = new JSONObject(siteConfig).getString("urlName"); } catch (Exception e) { logger.error("No site url available"); continue; } if (siteId != null) groupName = "community-" + siteId + "-members"; else groupName = "community-" + urlName + "-members"; logger.debug("Site Member group name is " + groupName); } if (record.get(0).equals(GROUPMEMBERS)) { groupName = record.get(GROUP_INDEX_NAME); } // We can't proceed if the group name wasn't retrieved from the configuration if (groupName == null) continue; // Pause until the group can found String groupList = doWait(hostname, port, "admin", adminPassword, groupName, maxretries); if (groupList != null && groupList.indexOf("\"results\":1") > 0) { logger.debug("Group was found on " + port); try { JSONArray jsonArray = new JSONObject(groupList).getJSONArray("hits"); if (jsonArray.length() == 1) { JSONObject jsonObject = jsonArray.getJSONObject(0); String groupPath = jsonObject.getString("path"); logger.debug("Group path is " + groupPath); // Constructing a multi-part POST for group membership MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.setCharset(MIME.UTF8_CHARSET); builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); List<NameValuePair> groupNameValuePairs = buildNVP(hostname, port, adminPassword, null, record, 2); for (NameValuePair nameValuePair : groupNameValuePairs) { builder.addTextBody(nameValuePair.getName(), nameValuePair.getValue(), ContentType.create("text/plain", MIME.UTF8_CHARSET)); } // Adding the list of group members doPost(hostname, port, groupPath + ".rw.userprops.html", "admin", adminPassword, builder.build(), null); } else { logger.info("We have more than one match for a group with this name!"); } } catch (Exception e) { logger.error(e.getMessage()); } } else { logger.warn("Group " + groupName + " cannot be updated as expected"); } continue; } // Let's see if it's user related if (record.get(0).equals(USERS)) { //First we need to get the path to the user node String json = doGet(hostname, port, "/libs/granite/security/currentuser.json", getUserName(record.get(1)), getPassword(record.get(1), adminPassword), null); if (json != null) { try { // Fetching the home property String home = new JSONObject(json).getString("home"); if (record.get(2).equals(PREFERENCES)) { home = home + "/preferences"; } else { home = home + "/profile"; } // Now we can post all the preferences or the profile List<NameValuePair> nameValuePairs = buildNVP(hostname, port, adminPassword, null, record, 3); doPost(hostname, port, home, "admin", adminPassword, new UrlEncodedFormEntity(nameValuePairs), null); } catch (Exception e) { logger.error(e.getMessage()); } } continue; } // Let's see if we need to generate analytics events for Assets Insights if (record.get(0).equals(ASSETINSIGHTS) && record.size() > 1 && analytics != null) { logger.debug("Generating Assets Analytics for reportsuite " + analytics); // Generating Impressions int impressions = new Random().nextInt(21) + 5; for (int i = 0; i < impressions; i++) doAssetsAnalytics(analytics, "event1", "list1", record.get(1).replace('|', ','), "o", "Asset Impression Event"); // Generating Clicks for each asset List<String> assetIds = Arrays.asList(record.get(1).split("\\|", -1)); for (String assetId : assetIds) { int clicks = new Random().nextInt(5) + 2; for (int i = 0; i < clicks; i++) doAssetsAnalytics(analytics, "event2", "eVar4", assetId, "e", "Asset Click Event"); } continue; } // Let's see if we deal with a new block of content or just a new entry if (record.get(0).equals(CALENDAR) || record.get(0).equals(SLINGPOST) || record.get(0).equals(RATINGS) || record.get(0).equals(IDEATION) || record.get(0).equals(BLOG) || record.get(0).equals(JOURNAL) || record.get(0).equals(COMMENTS) || record.get(0).equals(REVIEWS) || record.get(0).equals(FILES) || record.get(0).equals(SUMMARY) || record.get(0).equals(ACTIVITIES) || record.get(0).equals(JOIN) || record.get(0).equals(FOLLOW) || record.get(0).equals(NOTIFICATION) || record.get(0).equals(NOTIFICATIONPREFERENCE) || record.get(0).equals(MESSAGE) || record.get(0).equals(ASSET) || record.get(0).equals(AVATAR) || record.get(0).equals(FOLDER) || record.get(0).equals(BADGEIMAGE) || record.get(0).equals(BADGEASSIGN) || record.get(0).equals(FRAGMENT) || record.get(0).equals(RESOURCE) || record.get(0).equals(LEARNING) || record.get(0).equals(QNA) || record.get(0).equals(FORUM)) { // New block of content, we need to reset the processing to first Level componentType = record.get(0); url[0] = record.get(1); urlLevel = 0; // If it's not a SLINGPOST that could result in nodes to be created, let's make sure the end point is really there. if (!record.get(0).equals(SLINGPOST) && record.get(1) != null && !isResourceAvailable(hostname, port, adminPassword, getRootPath(record.get(1)))) { ignoreUntilNextComponent = true; continue; } else { ignoreUntilNextComponent = false; } if (!componentType.equals(SLINGPOST) && reset) { int pos = record.get(1).indexOf("/jcr:content"); if (pos > 0) doDelete(hostname, port, "/content/usergenerated" + record.get(1).substring(0, pos), "admin", adminPassword); } // If the Configure command line flag is set, we try to configure the component with all options enabled if (componentType.equals(SLINGPOST) || configure) { String configurePath = getConfigurePath(record.get(1)); logger.info(configurePath); List<NameValuePair> nameValuePairs = buildNVP(hostname, port, adminPassword, configurePath, record, 2); if (nameValuePairs.size() > 2) { // If we're posting against a jcr:content node, let's make sure the parent folder is there int pos1 = configurePath.indexOf("/jcr:content"); if (pos1 > 0) { if (!isResourceAvailable(hostname, port, adminPassword, configurePath.substring(0, pos1))) continue; } // If we're posting against a configuration node, let's make sure the parent folder is there int pos2 = configurePath.indexOf("configuration"); if (pos2 > 0) { if (!isResourceAvailable(hostname, port, adminPassword, configurePath)) continue; } // If we're posting to fetch analytics data, let's make sure the analytics host is available int pos3 = configurePath.indexOf("analyticsCommunities"); if (pos3 > 0) { if (!Hostname.isReachable("www.adobe.com", "80")) { logger.warn("Analytics cannot be imported since you appear to be offline"); // The things you have to do when coding in airplanes... continue; } } // Only do this when really have configuration settings doPost(hostname, port, configurePath, "admin", adminPassword, new UrlEncodedFormEntity(nameValuePairs), null); } // If the Sling POST touches the system console, then we need to make sure the system is open for business again before we proceed if (record.get(1).indexOf("system/console") > 0) { doSleep(10000, "Waiting after a bundle change/restart"); doWait(hostname, port, "admin", adminPassword, "administrators", maxretries); } } // We're done with this line, moving on to the next line in the CSV file continue; } // Are we processing until the next component because the end point if not available? if (ignoreUntilNextComponent) { logger.info("Ignoring this record because of unavailable component configuration"); continue; } // Let's see if we need to indent the list, if it's a reply or a reply to a reply if (record.get(1) == null || record.get(1).length() != 1) continue; // We need a valid level indicator if (Integer.parseInt(record.get(1)) > urlLevel) { url[++urlLevel] = location; logger.debug("Incrementing urlLevel to: " + urlLevel + ", with a new location:" + location); } else if (Integer.parseInt(record.get(1)) < urlLevel) { urlLevel = Integer.parseInt(record.get(1)); logger.debug("Decrementing urlLevel to: " + urlLevel); } // Special case for 6.1 GA only with forums and files if (vBundleCommunitiesEnablement == null && (!(componentType.equals(FORUM) || componentType.equals(FILES) || componentType.equals(JOIN)))) continue; // Get the credentials or fall back to password String password = getPassword(record.get(0), adminPassword); String userName = getUserName(record.get(0)); // Adding the generic properties for all POST requests MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.setCharset(MIME.UTF8_CHARSET); builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); if (!componentType.equals(RESOURCE) && !componentType.equals(LEARNING)) nameValuePairs.add(new BasicNameValuePair("id", "nobot")); nameValuePairs.add(new BasicNameValuePair("_charset_", "UTF-8")); if (urlLevel == 0 && (componentType.equals(FORUM) || componentType.equals(FILES) || componentType.equals(QNA) || componentType.equals(IDEATION) || componentType.equals(BLOG) || componentType.equals(CALENDAR))) { // Generating a unique hashkey nameValuePairs.add(new BasicNameValuePair("ugcUrl", slugify(record.get(2)))); } // Setting some specific fields depending on the content type if (componentType.equals(COMMENTS)) { nameValuePairs.add(new BasicNameValuePair(":operation", "social:createComment")); nameValuePairs.add(new BasicNameValuePair("message", record.get(2))); } // Follows a user (followedId) for the user posting the request if (componentType.equals(FOLLOW)) { if (vBundleCommunitiesNotifications != null && vBundleCommunitiesNotifications.compareTo(new Version("1.0.12")) < 0) { nameValuePairs.add(new BasicNameValuePair(":operation", "social:follow")); nameValuePairs.add(new BasicNameValuePair("userId", "/social/authors/" + userName)); nameValuePairs .add(new BasicNameValuePair("followedId", "/social/authors/" + record.get(2))); } else { logger.info("Ignoring FOLLOW with this version of AEM Communities"); continue; } } // Notifications if (componentType.equals(NOTIFICATION)) { if (vBundleCommunitiesNotifications != null && vBundleCommunitiesNotifications.compareTo(new Version("1.0.11")) > 0) { nameValuePairs.add(new BasicNameValuePair(":operation", "social:updatesubscriptions")); nameValuePairs.add(new BasicNameValuePair("types", "following")); nameValuePairs.add(new BasicNameValuePair("types", "notification")); if (vBundleCommunitiesNotifications.compareTo(new Version("1.1.0")) > 0) nameValuePairs.add(new BasicNameValuePair("types", "subscription")); nameValuePairs.add(new BasicNameValuePair("states", record.get(2).toLowerCase())); nameValuePairs.add(new BasicNameValuePair("states", record.get(3).toLowerCase())); if (vBundleCommunitiesNotifications.compareTo(new Version("1.1.0")) > 0) nameValuePairs.add(new BasicNameValuePair("states", record.get(4).toLowerCase())); nameValuePairs.add(new BasicNameValuePair("subscribedId", record.get(5))); } else { logger.info("Ignoring NOTIFICATION with this version of AEM Communities"); continue; } } // Notification preferences if (componentType.equals(NOTIFICATIONPREFERENCE)) { if (vBundleCommunitiesNotifications != null && vBundleCommunitiesNotifications.compareTo(new Version("1.0.11")) > 0) { nameValuePairs.add(new BasicNameValuePair(":operation", "social:updateUserPreference")); List<NameValuePair> otherNameValuePairs = buildNVP(hostname, port, adminPassword, null, record, 2); nameValuePairs.addAll(otherNameValuePairs); } } // Uploading Avatar picture if (componentType.equals(AVATAR)) { nameValuePairs.add(new BasicNameValuePair(":operation", "social:changeAvatar")); // Appending the path to the user profile to the target location String userJson = doGet(hostname, port, "/libs/granite/security/currentuser.json", getUserName(record.get(0)), getPassword(record.get(0), adminPassword), null); userHome = ""; if (userJson != null) { try { // Fetching the home property userHome = new JSONObject(userJson).getString("home"); } catch (Exception e) { logger.error("Couldn't figure out home folder for user " + record.get(0)); } } } // Assigning badge to user if (componentType.equals(BADGEASSIGN)) { nameValuePairs.add(new BasicNameValuePair(":operation", "social:assignBadge")); // Special case to accommodate re-factoring of badging images String value = record.get(3); if (vBundleCommunitiesEnablement.compareTo(new Version(ENABLEMENT61FP4)) == 0 || vBundleCommunitiesEnablement.compareTo(new Version(ENABLEMENT62)) > 0) { value = value.replaceAll("/jcr:content", ""); } nameValuePairs.add(new BasicNameValuePair("badgeContentPath", value)); // Appending the path to the user profile to the target location String userJson = doGet(hostname, altport, "/libs/granite/security/currentuser.json", getUserName(record.get(2)), getPassword(record.get(2), adminPassword), null); userHome = ""; if (userJson != null) { try { // Fetching the home property userHome = new JSONObject(userJson).getString("home"); } catch (Exception e) { logger.error("Couldn't figure out home folder for user " + record.get(2)); } } } // Uploading Badge image if (componentType.equals(BADGEIMAGE)) { nameValuePairs.add(new BasicNameValuePair(":operation", "social:createBadge")); nameValuePairs.add(new BasicNameValuePair("jcr:title", record.get(2))); nameValuePairs.add(new BasicNameValuePair("badgeDisplayName", record.get(3))); nameValuePairs.add(new BasicNameValuePair("badgeDescription", record.get(5))); addBinaryBody(builder, lIs, rr, "badgeImage", csvfile, record.get(ASSET_INDEX_NAME)); } // Joins a user (posting the request) to a Community Group (path) if (componentType.equals(JOIN)) { nameValuePairs.add(new BasicNameValuePair(":operation", "social:joinCommunityGroup")); int pos = url[0].indexOf("/configuration.social.json"); if (pos > 0) nameValuePairs.add(new BasicNameValuePair("path", url[0].substring(0, pos) + ".html")); else continue; // Invalid record } // Creates a new private message if (componentType.equals(MESSAGE)) { nameValuePairs.add(new BasicNameValuePair("to", "/social/authors/" + record.get(2))); nameValuePairs.add(new BasicNameValuePair("userId", "/social/authors/" + record.get(2))); nameValuePairs.add(new BasicNameValuePair("toId", "")); nameValuePairs.add(new BasicNameValuePair("serviceSelector", "/bin/community")); nameValuePairs.add(new BasicNameValuePair("redirectUrl", "../messaging.html")); nameValuePairs.add(new BasicNameValuePair("attachmentPaths", "")); nameValuePairs.add(new BasicNameValuePair(":operation", "social:createMessage")); nameValuePairs.add(new BasicNameValuePair("subject", record.get(3))); nameValuePairs.add(new BasicNameValuePair("content", record.get(4))); nameValuePairs.add(new BasicNameValuePair("sendMail", "Sending...")); } // Creates a forum post (or a reply) if (componentType.equals(FORUM)) { if (urlLevel == 0) { nameValuePairs.add(new BasicNameValuePair(":operation", "social:createForumPost")); nameValuePairs.add(new BasicNameValuePair("message", record.get(3))); nameValuePairs.add(new BasicNameValuePair("subject", subComponentType)); } else if (subComponentType.equals(UGCREPLY)) { nameValuePairs.add(new BasicNameValuePair(":operation", "social:createForumPost")); nameValuePairs.add(new BasicNameValuePair("message", record.get(3))); nameValuePairs.add(new BasicNameValuePair("subject", "")); } } // Creates a file or a folder if (componentType.equals(FILES)) { // Top level is always assumed to be a folder, second level files, and third and subsequent levels comments on files if (urlLevel == 0) { nameValuePairs.add(new BasicNameValuePair(":operation", "social:createFileLibraryFolder")); nameValuePairs.add(new BasicNameValuePair("name", subComponentType)); nameValuePairs.add(new BasicNameValuePair("message", record.get(3))); } else if (subComponentType.equals(UGCREPLY)) { nameValuePairs.add(new BasicNameValuePair(":operation", "social:createComment")); nameValuePairs.add(new BasicNameValuePair("message", record.get(3))); } } // Creates a question, a reply or mark a reply as the best answer if (componentType.equals(QNA)) { if (vBundleCommunitiesEnablement == null) { logger.info("QnAs are not compatible with this version of AEM"); continue; } if (urlLevel == 0) { nameValuePairs.add(new BasicNameValuePair(":operation", "social:createQnaPost")); nameValuePairs.add(new BasicNameValuePair("subject", subComponentType)); nameValuePairs.add(new BasicNameValuePair("message", record.get(3))); } else if (subComponentType.equals(UGCREPLY)) { nameValuePairs.add(new BasicNameValuePair(":operation", "social:createQnaPost")); nameValuePairs.add(new BasicNameValuePair("subject", "")); nameValuePairs.add(new BasicNameValuePair("message", record.get(3))); } } // Creates a Blog article or a comment if (componentType.equals(JOURNAL) || componentType.equals(BLOG)) { if (vBundleCommunitiesEnablement == null) { logger.info("Blogs are not compatible with this version of AEM"); continue; } if (urlLevel == 0) { nameValuePairs.add(new BasicNameValuePair(":operation", "social:createJournalComment")); nameValuePairs.add(new BasicNameValuePair("subject", subComponentType)); StringBuffer message = new StringBuffer("<p>" + record.get(3) + "</p>"); //We might have more paragraphs to add to the blog or journal article for (int i = 6; i < record.size(); i++) { if (record.get(i).length() > 0) { if (record.get(i).startsWith("isDraft")) { nameValuePairs.add(new BasicNameValuePair("isDraft", "true")); } else { message.append("<p>" + record.get(i) + "</p>"); } } } //We might have some tags to add to the blog or journal article if (record.get(5).length() > 0) { nameValuePairs.add(new BasicNameValuePair("tags", record.get(5))); } nameValuePairs.add(new BasicNameValuePair("message", message.toString())); } else if (subComponentType.equals(UGCREPLY)) { nameValuePairs.add(new BasicNameValuePair(":operation", "social:createJournalComment")); nameValuePairs.add(new BasicNameValuePair("message", record.get(3))); nameValuePairs.add(new BasicNameValuePair("subject", "")); } } // Creates an Idea or a comment if (componentType.equals(IDEATION)) { if (!isCommunities61FP6orlater) { logger.info("Ideas are not compatible with this version of AEM"); continue; } if (urlLevel == 0) { nameValuePairs.add(new BasicNameValuePair(":operation", "social:createIdeationComment")); nameValuePairs.add(new BasicNameValuePair("subject", subComponentType)); StringBuffer message = new StringBuffer(""); //We might have more paragraphs to add to the idea for (int i = 6; i < record.size(); i++) { if (record.get(i).length() > 0) { message.append("<p>" + record.get(i) + "</p>"); } } if (record.get(5).equals("TRUE")) { nameValuePairs.add(new BasicNameValuePair("isDraft", "true")); } else { nameValuePairs.add(new BasicNameValuePair("isDraft", "false")); } //We might have some tags to add to the blog or journal article if (record.get(3).length() > 0) { nameValuePairs.add(new BasicNameValuePair("tags", record.get(5))); } nameValuePairs.add(new BasicNameValuePair("message", message.toString())); } else if (subComponentType.equals(UGCREPLY)) { nameValuePairs.add(new BasicNameValuePair(":operation", "social:createIdeationComment")); nameValuePairs.add(new BasicNameValuePair("message", record.get(3))); nameValuePairs.add(new BasicNameValuePair("subject", "")); } } // Taking care of moderation actions for all types if (urlLevel >= 1 && !subComponentType.equals(UGCREPLY)) { if (subComponentType.equals(UGCPIN) && !isCommunities61FP5orlater) { logger.warn("This feature is not supported by this version of AEM"); continue; } if ((subComponentType.equals(UGCFEATURE) || subComponentType.equals(UGCLIKE)) && !isCommunities61FP6orlater) { logger.warn("This feature is not supported by this version of AEM"); continue; } if (subComponentType.equals(UGCANSWER)) { nameValuePairs.add(new BasicNameValuePair(":operation", "social:selectAnswer")); } if (subComponentType.equals(UGCDENY)) { nameValuePairs.add(new BasicNameValuePair(":operation", "social:deny")); } if (subComponentType.equals(UGCFLAG)) { nameValuePairs.add(new BasicNameValuePair(":operation", "social:flag")); nameValuePairs.add(new BasicNameValuePair("social:flagformtext", "Marked as spam")); nameValuePairs.add(new BasicNameValuePair("social:doFlag", "true")); } if (subComponentType.equals(UGCFEATURE)) { nameValuePairs.add(new BasicNameValuePair(":operation", "social:featured")); nameValuePairs.add(new BasicNameValuePair("social:markFeatured", "true")); } if (subComponentType.equals(UGCPIN)) { nameValuePairs.add(new BasicNameValuePair(":operation", "social:pin")); nameValuePairs.add(new BasicNameValuePair("social:doPin", "true")); } if (subComponentType.equals(UGCUPVOTE)) { nameValuePairs.add(new BasicNameValuePair(":operation", "social:postTallyResponse")); nameValuePairs.add(new BasicNameValuePair("response", "1")); nameValuePairs.add(new BasicNameValuePair("tallyType", "Voting")); } if (subComponentType.equals(UGCDOWNVOTE)) { nameValuePairs.add(new BasicNameValuePair(":operation", "social:postTallyResponse")); nameValuePairs.add(new BasicNameValuePair("response", "-1")); nameValuePairs.add(new BasicNameValuePair("tallyType", "Voting")); } if (subComponentType.equals(UGCLIKE)) { nameValuePairs.add(new BasicNameValuePair(":operation", "social:postTallyResponse")); nameValuePairs.add(new BasicNameValuePair("response", "1")); nameValuePairs.add(new BasicNameValuePair("tallyType", "Liking")); } } // Creates a review or a comment if (componentType.equals(REVIEWS)) { nameValuePairs.add(new BasicNameValuePair("message", record.get(2))); // This might be a top level review, or a comment on a review or another comment if (urlLevel == 0) { nameValuePairs.add(new BasicNameValuePair(":operation", "social:createReview")); nameValuePairs.add(new BasicNameValuePair("ratings", record.get(3))); if (record.size() > 4 && record.get(4).length() > 0) { nameValuePairs.add(new BasicNameValuePair("scf:included", record.get(4))); if (record.size() > 5 && record.get(5).length() > 0) { nameValuePairs.add(new BasicNameValuePair("scf:resourceType", record.get(5))); } else { nameValuePairs.add(new BasicNameValuePair("scf:resourceType", "social/reviews/components/hbs/reviews")); } } } else { nameValuePairs.add(new BasicNameValuePair(":operation", "social:createComment")); } } // Creates a rating if (componentType.equals(RATINGS)) { nameValuePairs.add(new BasicNameValuePair(":operation", "social:postTallyResponse")); nameValuePairs.add(new BasicNameValuePair("tallyType", "Rating")); nameValuePairs.add(new BasicNameValuePair("response", subComponentType)); } // Creates a DAM asset if (componentType.equals(ASSET) && record.get(ASSET_INDEX_NAME).length() > 0) { nameValuePairs.add(new BasicNameValuePair("fileName", record.get(ASSET_INDEX_NAME))); } // Creates a simple Folder if (componentType.equals(FOLDER)) { nameValuePairs.add(new BasicNameValuePair("./jcr:content/jcr:title", record.get(2))); nameValuePairs.add(new BasicNameValuePair(":name", record.get(3))); nameValuePairs.add(new BasicNameValuePair("./jcr:primaryType", "sling:Folder")); nameValuePairs.add(new BasicNameValuePair("./jcr:content/jcr:primaryType", "nt:unstructured")); } // Creates a simple Text Fragment if (componentType.equals(FRAGMENT)) { nameValuePairs.add(new BasicNameValuePair("template", "/libs/settings/dam/cfm/templates/simple/jcr:content")); nameValuePairs.add(new BasicNameValuePair("name", record.get(2))); nameValuePairs.add(new BasicNameValuePair("parentPath", record.get(3))); nameValuePairs.add(new BasicNameValuePair("./jcr:title", record.get(4))); nameValuePairs.add(new BasicNameValuePair("description", record.get(5))); nameValuePairs.add(new BasicNameValuePair("author", record.get(0))); //We might have some tags to add to the content fragment if (record.get(5).length() > 0) { nameValuePairs.add(new BasicNameValuePair("tags", record.get(6))); nameValuePairs.add(new BasicNameValuePair("tags@TypeHint", "String[]")); nameValuePairs.add(new BasicNameValuePair("tags@Delete", "")); } } // Creates an Enablement resource if (componentType.equals(RESOURCE)) { // Making sure it's referencing some existing file if (rr == null) { File attachment = new File( csvfile.substring(0, csvfile.indexOf(".csv")) + File.separator + record.get(2)); if (!attachment.exists()) { logger.error( "Resource cannot be created as the referenced file is missing on the file system"); continue; } } else { Resource res = rr.getResource(csvfile + "/attachments/" + record.get(2) + "/jcr:content"); if (res == null) { logger.error("A non existent resource named " + record.get(2) + "was referenced"); continue; } } String createResourceOpName = "se:createResource"; String enablementType = "social/enablement/components/hbs/resource"; if (vBundleCommunitiesEnablement.compareTo(new Version(ENABLEMENT61FP2)) > 0) createResourceOpName = "social:createResource"; if (vBundleCommunitiesEnablement.compareTo(new Version(ENABLEMENT62FP1)) > 0) createResourceOpName = "social:createEnablementResourceModel"; nameValuePairs.add(new BasicNameValuePair(":operation", createResourceOpName)); List<NameValuePair> otherNameValuePairs = buildNVP(hostname, port, adminPassword, null, record, RESOURCE_INDEX_PROPERTIES); nameValuePairs.addAll(otherNameValuePairs); // Assignments only make sense when SCORM is configured if (vBundleCommunitiesSCORM == null) { nameValuePairs.remove("add-learners"); nameValuePairs.remove("deltaList"); logger.warn("SCORM not configured on this instance, not assigning a resource"); } // Special processing of lists with multiple users, need to split a String into multiple entries if (vBundleCommunitiesEnablement.compareTo(new Version(ENABLEMENT61FP2)) > 0) { // Author, contact and experts always make sense nameValuePairs = convertArrays(nameValuePairs, "add-learners"); nameValuePairs = convertArrays(nameValuePairs, "resource-author"); nameValuePairs = convertArrays(nameValuePairs, "resource-contact"); nameValuePairs = convertArrays(nameValuePairs, "resource-expert"); } if (vBundleCommunitiesEnablement.compareTo(new Version(ENABLEMENT62FP1)) > 0) { nameValuePairs.add(new BasicNameValuePair("sling:resourceType", "social/enablement/components/hbs/resource/model")); nameValuePairs = convertKeyName(nameValuePairs, "add-learners", "resource-assignees"); nameValuePairs = convertKeyName(nameValuePairs, "jcr:title", "resource-name"); nameValuePairs = convertKeyName(nameValuePairs, "resourceTags", "resource-tags"); nameValuePairs = convertKeyName(nameValuePairs, "id", "resource-uid"); enablementType = "resource"; } nameValuePairs.add(new BasicNameValuePair("enablement-type", enablementType)); // Adding the site nameValuePairs.add(new BasicNameValuePair("site", url[0])); // Building the cover image fragment if (record.get(RESOURCE_INDEX_THUMBNAIL).length() > 0) { nameValuePairs.add(new BasicNameValuePair("cover-image", doThumbnail(rr, lIs, hostname, port, adminPassword, csvfile, record.get(RESOURCE_INDEX_THUMBNAIL), record.get(RESOURCE_INDEX_SITE), maxretries))); } else { nameValuePairs.add(new BasicNameValuePair("cover-image", "")); } // Building the asset fragment String assetFileName = record.get(2); // Replacing videos with images in case it's a minimized installation int assetFileNamePos = assetFileName.indexOf(".mp4"); if (assetFileNamePos > 0 && minimize) { assetFileName = assetFileName.substring(0, assetFileNamePos) + ".jpg"; } // Not processing SCORM files if the ignore option is there if (assetFileName.endsWith(".zip") && noenablement) { logger.info("Not processing a SCORM resource for this scenario"); continue; } String coverPath = "/content/dam/resources/" + record.get(RESOURCE_INDEX_SITE) + "/" + record.get(2) + "/jcr:content/renditions/cq5dam.thumbnail.319.319.png"; String coverSource = "dam"; String assets = "[{\"cover-img-path\":\"" + coverPath + "\",\"thumbnail-source\":\"" + coverSource + "\",\"asset-category\":\"enablementAsset:dam\",\"resource-asset-name\":null,\"state\":\"A\",\"asset-path\":\"/content/dam/resources/" + record.get(RESOURCE_INDEX_SITE) + "/" + assetFileName + "\"}]"; nameValuePairs.add(new BasicNameValuePair("assets", assets)); // If it's a SCORM asset, making sure the output is available before processing if (assetFileName.endsWith(".zip")) { doWaitPath( hostname, port, adminPassword, "/content/dam/resources/" + record.get(RESOURCE_INDEX_SITE) + "/" + record.get(2) + "/output", maxretries); } } // Creates a learning path if (componentType.equals(LEARNING)) { if (vBundleCommunitiesSCORM == null || noenablement) { logger.info("Ignoring a learning path"); continue; } String createResourceOpName = "se:editLearningPath"; String enablementType = "social/enablement/components/hbs/learningpath"; String resourceList = "learningpath-items"; if (vBundleCommunitiesEnablement.compareTo(new Version(ENABLEMENT61FP3)) > 0) createResourceOpName = "social:editLearningPath"; if (vBundleCommunitiesEnablement.compareTo(new Version(ENABLEMENT62FP1)) > 0) createResourceOpName = "social:createEnablementLearningPathModel"; nameValuePairs.add(new BasicNameValuePair(":operation", createResourceOpName)); List<NameValuePair> otherNameValuePairs = buildNVP(hostname, port, adminPassword, null, record, RESOURCE_INDEX_PROPERTIES); nameValuePairs.addAll(otherNameValuePairs); // Special processing of lists with multiple users, need to split a String into multiple entries if (vBundleCommunitiesEnablement.compareTo(new Version(ENABLEMENT61FP3)) > 0) { nameValuePairs = convertArrays(nameValuePairs, "add-learners"); nameValuePairs = convertArrays(nameValuePairs, "resource-author"); nameValuePairs = convertArrays(nameValuePairs, "resource-contact"); nameValuePairs = convertArrays(nameValuePairs, "resource-expert"); } if (vBundleCommunitiesEnablement.compareTo(new Version(ENABLEMENT62FP1)) > 0) { nameValuePairs.add(new BasicNameValuePair("sling:resourceType", "social/enablement/components/hbs/model/learningpath")); nameValuePairs = convertKeyName(nameValuePairs, "add-learners", "resource-assignees"); nameValuePairs = convertKeyName(nameValuePairs, "jcr:title", "resource-name"); nameValuePairs = convertKeyName(nameValuePairs, "resourceTags", "resource-tags"); nameValuePairs = convertKeyName(nameValuePairs, "id", "resource-uid"); enablementType = "learningpath"; resourceList = "resourcelist"; } nameValuePairs.add(new BasicNameValuePair("enablement-type", enablementType)); // Adding the site nameValuePairs.add(new BasicNameValuePair("site", url[0])); // Building the cover image fragment if (record.get(RESOURCE_INDEX_THUMBNAIL).length() > 0) { nameValuePairs.add(new BasicNameValuePair( vBundleCommunitiesEnablement.compareTo(new Version(ENABLEMENT61FP3)) > 0 ? "cover-image" : "card-image", doThumbnail(rr, lIs, hostname, port, adminPassword, csvfile, record.get(RESOURCE_INDEX_THUMBNAIL), record.get(RESOURCE_INDEX_SITE), maxretries))); } // Building the learning path fragment StringBuffer assets = new StringBuffer("["); if (learningpaths.get(record.get(2)) != null) { assets.append("\""); ArrayList<String> paths = learningpaths.get(record.get(2)); int i = 0; for (String path : paths) { assets.append("{\\\"type\\\":\\\"linked-resource\\\",\\\"path\\\":\\\""); assets.append(path); assets.append("\\\"}"); if (i++ < paths.size() - 1) { assets.append("\",\""); } } assets.append("\""); } else { logger.warn("No asset for this learning path"); } assets.append("]"); nameValuePairs.add(new BasicNameValuePair(resourceList, assets.toString())); } // Creates a calendar event if (componentType.equals(CALENDAR)) { if (vBundleCommunitiesEnablement == null) { logger.info("Calendars are not compatible with this version of AEM"); continue; } String startDate = computeDate(record.get(5), record.get(7)); String endDate = computeDate(record.get(6), record.get(7)); nameValuePairs.add(new BasicNameValuePair(":operation", "social:createEvent")); if (vBundleCommunitiesCalendar != null && vBundleCommunitiesCalendar.compareTo(new Version("1.2.29")) > 0) { // Post AEM Communities 6.1 FP3 nameValuePairs.add(new BasicNameValuePair("subject", record.get(2))); nameValuePairs.add(new BasicNameValuePair("message", record.get(3))); nameValuePairs.add(new BasicNameValuePair("location", record.get(4))); nameValuePairs.add(new BasicNameValuePair("tags", "")); nameValuePairs.add(new BasicNameValuePair("address", "")); nameValuePairs.add(new BasicNameValuePair("isDate", "false")); nameValuePairs.add(new BasicNameValuePair("start", startDate)); nameValuePairs.add(new BasicNameValuePair("end", endDate)); // Let's see if we have tags if (record.size() > CALENDAR_INDEX_TAGS && record.get(CALENDAR_INDEX_TAGS).length() > 0) { nameValuePairs.add(new BasicNameValuePair("tags", record.get(CALENDAR_INDEX_TAGS))); } // Let's see if we have a cover image if (record.size() > CALENDAR_INDEX_THUMBNAIL && record.get(CALENDAR_INDEX_THUMBNAIL).length() > 0) { addBinaryBody(builder, lIs, rr, "coverimage", csvfile, record.get(CALENDAR_INDEX_THUMBNAIL)); } } else { // Pre AEM Communities 6.1 FP3 try { JSONObject event = new JSONObject(); // Building the JSON fragment for a new calendar event event.accumulate("subject", record.get(2)); event.accumulate("message", record.get(3)); event.accumulate("location", record.get(4)); event.accumulate("tags", ""); event.accumulate("undefined", "update"); event.accumulate("start", startDate); event.accumulate("end", endDate); nameValuePairs.add(new BasicNameValuePair("event", event.toString())); } catch (Exception ex) { logger.error(ex.getMessage()); } } } for (NameValuePair nameValuePair : nameValuePairs) { builder.addTextBody(nameValuePair.getName(), nameValuePair.getValue(), ContentType.create("text/plain", MIME.UTF8_CHARSET)); } // See if we have attachments for this new post - or some other actions require a form nonetheless if ((componentType.equals(ASSET) || componentType.equals(AVATAR) || componentType.equals(FORUM) || componentType.equals(IDEATION) || componentType.equals(QNA) || (componentType.equals(JOURNAL)) || componentType.equals(BLOG)) && record.size() > 4 && record.get(ASSET_INDEX_NAME).length() > 0) { addBinaryBody(builder, lIs, rr, "file", csvfile, record.get(ASSET_INDEX_NAME)); } // If it's a resource or a learning path, we need the path to the resource for subsequent publishing Map<String, String> elements = new HashMap<String, String>(); String jsonElement = "location"; String referrer = null; if (componentType.equals(RESOURCE) && vBundleCommunitiesEnablement.compareTo(new Version(ENABLEMENT61FP2)) <= 0) { jsonElement = "changes/argument"; } if (componentType.equals(LEARNING) && vBundleCommunitiesEnablement.compareTo(new Version(ENABLEMENT61FP3)) <= 0) { jsonElement = "path"; } if (componentType.equals(RESOURCE) || componentType.equals(LEARNING)) { // Useful for debugging complex POST requests //printPOST(builder.build()); } if (!(componentType.equals(ASSET) || componentType.equals(BADGEASSIGN) || componentType.equals(MESSAGE) || componentType.equals(AVATAR))) { // Creating an asset doesn't return a JSON string elements.put(jsonElement, ""); elements.put("response/resourceType", ""); elements.put("response/id", ""); } // This call generally returns the path to the content fragment that was just created int returnCode = Loader.doPost(hostname, port, getPostURL(componentType, subComponentType, url[urlLevel], userHome), userName, password, builder.build(), elements, null); // Again, Assets being a particular case if (!(componentType.equals(ASSET) || componentType.equals(AVATAR))) { location = elements.get(jsonElement); referrer = elements.get("response/id"); if (Integer.parseInt(record.get(1)) == 0) { analyticsPagePath = location; resourceType = elements.get("response/resourceType"); } } // In case of Assets or Resources, we are waiting for all workflows to be completed if (componentType.equals(ASSET) && returnCode < 400) { doSleep(1000, "Pausing 1s after submitting asset"); doWaitWorkflows(hostname, port, adminPassword, "asset", maxretries); } // If we are loading a content fragment, we need to post the actual content next if (componentType.equals(FRAGMENT)) { // Publishing the learning path List<NameValuePair> fragmentNameValuePairs = new ArrayList<NameValuePair>(); fragmentNameValuePairs.add(new BasicNameValuePair("contentType", "text/html")); StringBuffer message = new StringBuffer("<p>" + record.get(7) + "</p>"); //We might have more paragraphs to add to the fragment if (record.size() > 8) { for (int i = 8; i < record.size(); i++) { if (record.get(i).length() > 0) { message.append("<p>" + record.get(i) + "</p>"); } } } fragmentNameValuePairs.add(new BasicNameValuePair("content", message.toString())); Loader.doPost(hostname, port, record.get(3) + "/" + record.get(2) + ".cfm.content.json", userName, password, new UrlEncodedFormEntity(fragmentNameValuePairs), null); } // Let's see if it needs to be added to a learning path if (componentType.equals(RESOURCE) && record.get(RESOURCE_INDEX_PATH).length() > 0 && location != null) { // Adding the location to a list of a resources for this particular Learning Path if (learningpaths.get(record.get(RESOURCE_INDEX_PATH)) == null) learningpaths.put(record.get(RESOURCE_INDEX_PATH), new ArrayList<String>()); logger.debug("Adding resource to Learning path: " + record.get(RESOURCE_INDEX_PATH)); ArrayList<String> locations = learningpaths.get(record.get(RESOURCE_INDEX_PATH)); locations.add(location); learningpaths.put(record.get(RESOURCE_INDEX_PATH), locations); } // If it's a Learning Path, we publish it when possible if (componentType.equals(LEARNING) && !port.equals(altport) && location != null && vBundleCommunitiesSCORM != null) { // Publishing the learning path List<NameValuePair> publishNameValuePairs = new ArrayList<NameValuePair>(); String publishOpName = "se:publishEnablementContent"; if (vBundleCommunitiesEnablement.compareTo(new Version(ENABLEMENT62FP1)) > 0) publishOpName = "social:publishEnablementLearningPathModel"; publishNameValuePairs.add(new BasicNameValuePair(":operation", publishOpName)); publishNameValuePairs.add(new BasicNameValuePair("replication-action", "activate")); logger.debug("Publishing a learning path from: " + location); Loader.doPost(hostname, port, location, userName, password, new UrlEncodedFormEntity(publishNameValuePairs), null); // Waiting for the learning path to be published doWaitPath(hostname, altport, adminPassword, location, maxretries); // Decorate the resources within the learning path with comments and ratings, randomly generated ArrayList<String> paths = learningpaths.get(record.get(2)); for (String path : paths) { doDecorate(hostname, altport, adminPassword, path, record, analytics, sitePagePath, vBundleCommunitiesEnablement); } } // If it's an Enablement Resource that is not part of a learning path, a lot of things need to happen... // Step 1. If it's a SCORM resource, we wait for the SCORM metadata workflow to be complete before proceeding // Step 2. We publish the resource // Step 3. We set a new first published date on the resource (3 weeks earlier) so that reporting data is more meaningful // Step 4. We wait for the resource to be available on publish (checking that associated groups are available) // Step 5. We retrieve the json for the resource on publish to retrieve the Social endpoints // Step 6. We post ratings and comments for each of the enrollees on publish if (componentType.equals(RESOURCE) && !port.equals(altport) && location != null && !location.equals("")) { // Wait for the workflows to be completed doWaitWorkflows(hostname, port, adminPassword, "resource", maxretries); String resourcePath = "/assets/asset"; if (vBundleCommunitiesEnablement.compareTo(new Version(ENABLEMENT62FP1)) > 0) { resourcePath = "/se_assets/se_primary"; } // Wait for the data to be fully copied doWaitPath(hostname, port, adminPassword, location + resourcePath, maxretries); // If we are dealing with a SCORM asset, we wait for the SCORM workflow to be completed before publishing the resource if (record.get(2).indexOf(".zip") > 0) { // Wait for the output to be available doWaitPath(hostname, port, adminPassword, location + resourcePath + "/" + record.get(2) + "/output", maxretries); // Wait for 10 seconds doSleep(10000, "Processing a SCORM resource"); } // Wait for the workflows to be completed before publishing the resource doWaitWorkflows(hostname, port, adminPassword, "resource", maxretries); List<NameValuePair> publishNameValuePairs = new ArrayList<NameValuePair>(); String publishOpName = "se:publishEnablementContent"; if (vBundleCommunitiesEnablement.compareTo(new Version(ENABLEMENT62FP1)) > 0) publishOpName = "social:publishEnablementResourceModel"; publishNameValuePairs.add(new BasicNameValuePair(":operation", publishOpName)); publishNameValuePairs.add(new BasicNameValuePair("replication-action", "activate")); logger.debug("Publishing a Resource from: " + location); Loader.doPost(hostname, port, location, userName, password, new UrlEncodedFormEntity(publishNameValuePairs), null); // Waiting for the resource to be published doWaitPath(hostname, altport, adminPassword, location, maxretries); // Adding comments and ratings for this resource logger.debug("Decorating the resource with comments and ratings"); doDecorate(hostname, altport, adminPassword, location, record, analytics, sitePagePath, vBundleCommunitiesEnablement); // Setting the first published timestamp so that reporting always comes with 3 weeks of data after building a new demo instance DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); Calendar cal = Calendar.getInstance(); cal.add(Calendar.DATE, REPORTINGDAYS); List<NameValuePair> publishDateNameValuePairs = new ArrayList<NameValuePair>(); publishDateNameValuePairs .add(new BasicNameValuePair("date-first-published", dateFormat.format(cal.getTime()))); logger.debug("Setting the publish date for a resource at: " + location); doPost(hostname, port, location, userName, password, new UrlEncodedFormEntity(publishDateNameValuePairs), null); } // Generating Analytics when needed for the new fragment of UGC content if (analytics != null && referrer != null) { logger.debug("Component type: " + componentType + ", Analytics page path: " + analyticsPagePath + ", referrer: " + referrer); logger.debug("Analytics: " + analytics + ", resourceType: " + resourceType + ", sitePagePath: " + sitePagePath + ", userName: " + userName); if (analyticsPagePath != null && (componentType.equals(FORUM) || componentType.equals(FILES) || componentType.equals(QNA) || componentType.equals(BLOG) || componentType.equals(IDEATION) || componentType.equals(CALENDAR))) { logger.debug("level: " + Integer.parseInt(record.get(1))); if (Integer.parseInt(record.get(1)) == 0) { // We just created a UGC page that gets viewed. simulate view events. int views = new Random().nextInt(21) + 10; for (int i = 0; i < views; i++) { doUGCAnalytics(analytics, "event11", analyticsPagePath, resourceType, sitePagePath, userName, referrer); } } else { // We just posted to a UGC page (comment, reply, etc.). simulate post event. doUGCAnalytics(analytics, "event13", analyticsPagePath, resourceType, sitePagePath, userName, referrer); } } } // Closing all the input streams where applicable for (InputStream is : lIs) { try { is.close(); } catch (IOException e) { //Omitted } } } } catch (Exception e) { logger.error(e.getMessage()); } }
From source file:org.mule.modules.wechat.common.HttpsConnection.java
public Map<String, Object> postFile(String httpsURL, String title, String introduction, DataHandler attachment) throws Exception { CloseableHttpClient httpClient = HttpClients.createDefault(); HttpPost post = new HttpPost(httpsURL); MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); // Get extension of attachment TikaConfig config = TikaConfig.getDefaultConfig(); MimeTypes allTypes = config.getMimeRepository(); String ext = allTypes.forName(attachment.getContentType()).getExtension(); if (ext.equals("")) { ContentTypeEnum contentTypeEnum = ContentTypeEnum .getContentTypeEnumByContentType(attachment.getContentType().toLowerCase()); ext = java.util.Optional.ofNullable(contentTypeEnum.getExtension()).orElse(""); }/* w w w.j ava 2s .c o m*/ // Create file InputStream fis = attachment.getInputStream(); byte[] bytes = IOUtils.toByteArray(fis); File f = new File(System.getProperty("user.dir") + "/fileTemp/" + title + ext); FileUtils.writeByteArrayToFile(f, bytes); // Create JSON JSONObject obj = new JSONObject(); obj.put("title", title); obj.put("introduction", introduction); ContentType contentType = ContentType.create("text/plain", Charset.forName("UTF-8")); builder.addBinaryBody("media", f); builder.addTextBody("description", obj.toString(), contentType); // Post to wechat HttpEntity entity = builder.build(); post.setEntity(entity); CloseableHttpResponse httpResponse = httpClient.execute(post); String content = ""; try { HttpEntity _entity = httpResponse.getEntity(); content = EntityUtils.toString(_entity); EntityUtils.consume(_entity); } finally { httpResponse.close(); } f.delete(); // Convert JSON string to Map ObjectMapper mapper = new ObjectMapper(); Map<String, Object> map = mapper.readValue(content, new TypeReference<Map<String, Object>>() { }); return map; }
From source file:org.rapidoid.http.HttpClient.java
public Future<byte[]> request(String verb, String uri, Map<String, String> headers, Map<String, String> data, Map<String, String> files, byte[] body, String contentType, Callback<byte[]> callback, boolean fullResponse) { headers = U.safe(headers);/* w ww .j a v a 2s . c o m*/ data = U.safe(data); files = U.safe(files); HttpRequestBase req; boolean canHaveBody = false; if ("GET".equalsIgnoreCase(verb)) { req = new HttpGet(uri); } else if ("DELETE".equalsIgnoreCase(verb)) { req = new HttpDelete(uri); } else if ("OPTIONS".equalsIgnoreCase(verb)) { req = new HttpOptions(uri); } else if ("HEAD".equalsIgnoreCase(verb)) { req = new HttpHead(uri); } else if ("TRACE".equalsIgnoreCase(verb)) { req = new HttpTrace(uri); } else if ("POST".equalsIgnoreCase(verb)) { req = new HttpPost(uri); canHaveBody = true; } else if ("PUT".equalsIgnoreCase(verb)) { req = new HttpPut(uri); canHaveBody = true; } else if ("PATCH".equalsIgnoreCase(verb)) { req = new HttpPatch(uri); canHaveBody = true; } else { throw U.illegalArg("Illegal HTTP verb: " + verb); } for (Entry<String, String> e : headers.entrySet()) { req.addHeader(e.getKey(), e.getValue()); } if (canHaveBody) { HttpEntityEnclosingRequestBase entityEnclosingReq = (HttpEntityEnclosingRequestBase) req; if (body != null) { NByteArrayEntity entity = new NByteArrayEntity(body); if (contentType != null) { entity.setContentType(contentType); } entityEnclosingReq.setEntity(entity); } else { MultipartEntityBuilder builder = MultipartEntityBuilder.create(); for (Entry<String, String> entry : files.entrySet()) { String filename = entry.getValue(); File file = IO.file(filename); builder = builder.addBinaryBody(entry.getKey(), file, ContentType.DEFAULT_BINARY, filename); } for (Entry<String, String> entry : data.entrySet()) { builder = builder.addTextBody(entry.getKey(), entry.getValue(), ContentType.DEFAULT_TEXT); } ByteArrayOutputStream stream = new ByteArrayOutputStream(); try { builder.build().writeTo(stream); } catch (IOException e) { throw U.rte(e); } byte[] bytes = stream.toByteArray(); NByteArrayEntity entity = new NByteArrayEntity(bytes, ContentType.MULTIPART_FORM_DATA); entityEnclosingReq.setEntity(entity); } } Log.debug("Starting HTTP request", "request", req.getRequestLine()); return execute(client, req, callback, fullResponse); }
From source file:xin.nic.sdk.registrar.util.HttpUtil.java
public static String doPost(String requestUrl, Map<String, String> paramsMap, Map<String, InputStream> files) throws Exception { RequestConfig requestConfig = RequestConfig.custom().setConnectionRequestTimeout(500) .setSocketTimeout(20000).setConnectTimeout(20000).build(); // ?/* w w w .j a v a 2 s . c o m*/ MultipartEntityBuilder mbuilder = MultipartEntityBuilder.create() .setMode(HttpMultipartMode.BROWSER_COMPATIBLE).setCharset(Charset.forName(charset)); if (paramsMap != null) { Set<Entry<String, String>> paramsSet = paramsMap.entrySet(); for (Entry<String, String> entry : paramsSet) { mbuilder.addTextBody(entry.getKey(), entry.getValue(), ContentType.create("text/plain", charset)); } } if (files != null) { Set<Entry<String, InputStream>> filesSet = files.entrySet(); for (Entry<String, InputStream> entry : filesSet) { ByteArrayOutputStream os = new ByteArrayOutputStream(); InputStream is = entry.getValue(); byte[] buffer = new byte[1024]; int len = 0; while ((len = is.read(buffer)) > 0) { os.write(buffer, 0, len); } os.close(); is.close(); mbuilder.addBinaryBody("attachment", os.toByteArray(), ContentType.APPLICATION_OCTET_STREAM, entry.getKey()); } } HttpPost httpPost = new HttpPost(requestUrl); httpPost.setConfig(requestConfig); HttpEntity httpEntity = mbuilder.build(); httpPost.setEntity(httpEntity); ResponseHandler<String> responseHandler = new ResponseHandler<String>() { @Override public String handleResponse(final HttpResponse response) throws ClientProtocolException, IOException { int status = response.getStatusLine().getStatusCode(); if (status >= HttpStatus.SC_OK && status < HttpStatus.SC_MULTIPLE_CHOICES) { HttpEntity entity = response.getEntity(); return entity != null ? EntityUtils.toString(entity) : null; } else { throw new ClientProtocolException("Unexpected response status: " + status); } } }; return httpClient.execute(httpPost, responseHandler); }