This code sample shows how to check-in content using Files as Content and a File field. The code allows to:
1) Check in a FileAsset (Files as Content)
2) Check in a piece of content
3) Associate that FileAsset with the piece of content using a "File" field.
package com.dotcms;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.dotmarketing.business.APILocator;
import com.dotmarketing.business.PermissionAPI;
import com.dotmarketing.cache.FieldsCache;
import com.dotmarketing.factories.InodeFactory;
import com.dotmarketing.portlets.contentlet.business.ContentletAPI;
import com.dotmarketing.portlets.contentlet.model.Contentlet;
import com.dotmarketing.portlets.structure.business.FieldAPI;
import com.dotmarketing.portlets.structure.factories.RelationshipFactory;
import com.dotmarketing.portlets.structure.model.ContentletRelationships;
import com.dotmarketing.portlets.structure.model.ContentletRelationships.ContentletRelationshipRecords;
import com.dotmarketing.portlets.structure.model.Field;
import com.dotmarketing.portlets.structure.model.Relationship;
import com.dotmarketing.portlets.structure.model.Structure;
import com.dotmarketing.util.InodeUtils;
import com.dotmarketing.util.Logger;
import com.dotmarketing.util.UtilMethods;
import com.liferay.portal.model.User;
public class ContentExampleServlet extends HttpServlet implements Servlet {
ContentletAPI conAPI = APILocator.getContentletAPI();
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
User user = null;
try {
if (session != null){
user = (com.liferay.portal.model.User) session.getAttribute(com.dotmarketing.util.WebKeys.CMS_USER);
}
} catch (Exception nsue) {
Logger.warn(this, "Exception trying to getUser: " + nsue.getMessage(), nsue);
}
try {
// CHECK IN FILE ASSET
Contentlet fileAsContent = new Contentlet();
String selectedStructure = "33888b6f-7a8e-4069-b1b6-5c1aa9d0a48d"; // File Structure
String folderInode = "1049e7fe-1553-4731-bdf9-ba069f1dc08b"; // some folder inode
String languageId = "1";
Structure st = (Structure) InodeFactory.getInode(selectedStructure, Structure.class);
fileAsContent.setStructureInode(st.getInode());
ContentletAPI contentletService = APILocator.getContentletAPI();
ContentletRelationships cRelationships = contentletService.getAllRelationships(fileAsContent);
fileAsContent.setHost(APILocator.getHostAPI().findSystemHost(user, false).getIdentifier());
fileAsContent.setFolder(APILocator.getFolderAPI().find(folderInode, user, false).getIdentifier());
fileAsContent.setLanguageId(Long.parseLong(languageId));
HashMap<String, Object> contentletFormData = new java.util.HashMap<String, Object>();
contentletFormData.put("text1", "1049e7fe-1553-4731-bdf9-ba069f1dc08b"); // host or folder
contentletFormData.put("binary1", "C:\\Users\\Whiz\\dotCMS\\tomcat\\webapps\\..\\.." +
"\\dotCMS\\WEB-INF\\binary\\dotcms.org.1\\binary1\\48608ab6-1033-49db-a9cf-ff66fb91966b" +
"\\b6472d83864f7db2d7fdd7e148b05e3f.jpg"); // file asset
contentletFormData.put("text2", "b6472d83864f7db2d7fdd7e148b05e3f.jpg"); // title
contentletFormData.put("text3", "b6472d83864f7db2d7fdd7e148b05e3f.jpg"); // file name
contentletFormData.put("integer1", "0"); // sort order
setFieldValues(fileAsContent, contentletFormData);
fileAsContent.setReviewInterval(null);
ContentletRelationships contRel = retrieveRelationshipsData(fileAsContent,user, contentletFormData );
// http://jira.dotmarketing.net/browse/DOTCMS-65
// Coming from other contentlet to relate it automatically
String relateWith = null;
if(UtilMethods.isSet(contentletFormData.get("relwith")))
relateWith = (String) contentletFormData.get("relwith");
String relationType = null;
if(UtilMethods.isSet(contentletFormData.get("reltype")))
relationType = (String) contentletFormData.get("reltype");
String relationHasParent = null;
relationHasParent = (String) contentletFormData.get("relisparent");
if(relateWith != null){
try {
List<ContentletRelationshipRecords> recordsList = contRel.getRelationshipsRecords();
for(ContentletRelationshipRecords records : recordsList) {
if(!records.getRelationship().getRelationTypeValue().equals(relationType))
continue;
if(RelationshipFactory.isSameStructureRelationship(records.getRelationship()) &&
((!records.isHasParent() && relationHasParent.equals("no")) ||
(records.isHasParent() && relationHasParent.equals("yes"))))
continue;
records.getRecords().add(conAPI.find(relateWith, user, false));
}
} catch (Exception e) {
Logger.error(this,"Contentlet failed while creating new relationship",e);
}
}
PermissionAPI perAPI = APILocator.getPermissionAPI();
List cats = new ArrayList();
fileAsContent.setInode(null);
fileAsContent = conAPI.checkin(fileAsContent, contRel,cats, perAPI.getPermissions(fileAsContent, false, true), user, false);
// END CHECK IN FILE ASSET
// CHECK IN CONTENT WITH FILE ASSET
Contentlet contentlet = new Contentlet();
selectedStructure = "2a3e91e4-fbbf-4876-8c5b-2233c1739b05"; // Content (Generic)
st = (Structure) InodeFactory.getInode(selectedStructure, Structure.class);
contentletService = APILocator.getContentletAPI();
cRelationships = contentletService.getAllRelationships(contentlet);
contentlet.setHost(APILocator.getHostAPI().findSystemHost(user, false).getIdentifier());
contentlet.setLanguageId(Long.parseLong(languageId));
contentletFormData = new java.util.HashMap<String, Object>();
contentletFormData.put("text1", "My Content"); // Title
contentletFormData.put("system_field1", "48190c8c-42c4-46af-8d1a-0cd5db894797"); // Host
contentletFormData.put("text_area1", "<p>My Body</p>"); // Body
contentletFormData.put("text2", "7755d7b1-bc56-4326-822a-e9d7da5c0dc6"); // My File , Identifier of the FileAsset
setFieldValues(fileAsContent, contentletFormData);
fileAsContent.setReviewInterval(null);
contRel = retrieveRelationshipsData(fileAsContent,user, contentletFormData );
// http://jira.dotmarketing.net/browse/DOTCMS-65
// Coming from other contentlet to relate it automatically
relateWith = null;
if(UtilMethods.isSet(contentletFormData.get("relwith")))
relateWith = (String) contentletFormData.get("relwith");
relationType = null;
if(UtilMethods.isSet(contentletFormData.get("reltype")))
relationType = (String) contentletFormData.get("reltype");
relationHasParent = null;
relationHasParent = (String) contentletFormData.get("relisparent");
if(relateWith != null){
try {
List<ContentletRelationshipRecords> recordsList = contRel.getRelationshipsRecords();
for(ContentletRelationshipRecords records : recordsList) {
if(!records.getRelationship().getRelationTypeValue().equals(relationType))
continue;
if(RelationshipFactory.isSameStructureRelationship(records.getRelationship()) &&
((!records.isHasParent() && relationHasParent.equals("no")) ||
(records.isHasParent() && relationHasParent.equals("yes"))))
continue;
records.getRecords().add(conAPI.find(relateWith, user, false));
}
} catch (Exception e) {
Logger.error(this,"Contentlet failed while creating new relationship",e);
}
}
fileAsContent.setInode(null);
fileAsContent = conAPI.checkin(fileAsContent, contRel,cats, perAPI.getPermissions(fileAsContent, false, true), user, false);
// END CHECKIN CONTENT WITH FILE ASSET
} catch(Exception e) {
Logger.debug(this, e.getMessage());
}
}
private void setFieldValues(Contentlet c, HashMap<String, Object> contentletFormData) {
FieldAPI fAPI = APILocator.getFieldAPI();
ContentletAPI conAPI = APILocator.getContentletAPI();
List<Field> fields = FieldsCache.getFieldsByStructureInode(c.getStructureInode());
for (Field field : fields){
if(fAPI.isElementConstant(field)){
continue;
}
Object value = contentletFormData.get(field.getFieldContentlet());
String typeField = field.getFieldType();
//http://jira.dotmarketing.net/browse/DOTCMS-5334
if(field.getFieldType().equals(Field.FieldType.CHECKBOX.toString())){
if(field.getFieldContentlet().startsWith("float")
|| field.getFieldContentlet().startsWith("integer")){
if(UtilMethods.isSet((String)value)){
value = String.valueOf(value);
if(((String)value).endsWith(",")){
value = ((String)value).substring(0, ((String)value).lastIndexOf(","));
}
}else{
value = "0";
}
}
}
/* Validate if the field is read only, if so then check to see if it's a new contentlet
* and set the structure field default value, otherwise do not set the new value.
*/
if (!typeField.equals(Field.FieldType.HIDDEN.toString()) &&
!typeField.equals(Field.FieldType.IMAGE.toString()) &&
!typeField.equals(Field.FieldType.FILE.toString()))
{
if(field.isReadOnly() && !InodeUtils.isSet(c.getInode()))
value = field.getDefaultValue();
if (field.getFieldType().equals(Field.FieldType.WYSIWYG.toString())) {
//WYSIWYG workaround because the WYSIWYG includes a <br> even if the field was left blank by the user
//we have to check the value to leave it blank in that case.
if (value instanceof String && ((String)value).trim().toLowerCase().equals("<br>")) {
value = "";
}
}
}
if ((value != null || field.getFieldType().equals(Field.FieldType.BINARY.toString())) && APILocator.getFieldAPI().valueSettable(field) && !field.getFieldType().equals(Field.FieldType.HOST_OR_FOLDER.toString()))
try{
conAPI.setContentletProperty(c, field, value);
}catch (Exception e) {
Logger.info(this, "Unable to set field " + field.getFieldName() + " to value " + value);
Logger.debug(this, "Unable to set field " + field.getFieldName() + " to value " + value, e);
}
}
}
private ContentletRelationships retrieveRelationshipsData(Contentlet currentContentlet, User user, Map<String, Object> contentletFormData ){
Set<String> keys = contentletFormData.keySet();
ContentletRelationships relationshipsData = new ContentletRelationships(currentContentlet);
List<ContentletRelationshipRecords> relationshipsRecords = new ArrayList<ContentletRelationshipRecords> ();
relationshipsData.setRelationshipsRecords(relationshipsRecords);
for (String key : keys) {
if (key.startsWith("rel_") && key.endsWith("_inodes")) {
boolean hasParent = key.contains("_P_");
String inodesSt = (String) contentletFormData.get(key);
if(!UtilMethods.isSet(inodesSt)){
continue;
}
String[] inodes = inodesSt.split(",");
Relationship relationship = (Relationship) InodeFactory.getInode(inodes[0], Relationship.class);
ContentletRelationshipRecords records = relationshipsData.new ContentletRelationshipRecords(relationship, hasParent);
ArrayList<Contentlet> cons = new ArrayList<Contentlet>();
for (String inode : inodes) {
/*long i = 0;
try{
i = Long.valueOf(inode);
}catch (Exception e) {
Logger.error(this, "Relationship not a number value : ",e);
}*/
if(relationship.getInode().equalsIgnoreCase(inode)){
continue;
}
try{
cons.add(conAPI.find(inode, user, false));
}catch(Exception e){
Logger.debug(this,"Couldn't look up contentlet. Assuming inode" + inode + "is not content");
}
}
records.setRecords(cons);
relationshipsRecords.add(records);
}
}
return relationshipsData;
}
}