package pl.net.bluesoft.rnd.pt.utils.cmis; import org.apache.chemistry.opencmis.client.api.*; import org.apache.chemistry.opencmis.client.runtime.SessionFactoryImpl; import org.apache.chemistry.opencmis.commons.PropertyIds; import org.apache.chemistry.opencmis.commons.SessionParameter; import org.apache.chemistry.opencmis.commons.data.CmisExtensionElement; import org.apache.chemistry.opencmis.commons.data.ContentStream; import org.apache.chemistry.opencmis.commons.enums.BindingType; import org.apache.chemistry.opencmis.commons.enums.VersioningState; import org.apache.chemistry.opencmis.commons.exceptions.CmisObjectNotFoundException; import pl.net.bluesoft.util.lang.StringUtil; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.math.BigInteger; import java.util.HashMap; import java.util.List; import java.util.Map; /** * @author tlipski@bluesoft.net.pl */ public class CmisAtomSessionFacade { private String repositoryUser; private String repositoryPassword; private String repositoryAtomUrl; private String repositoryId; private Session session; public CmisAtomSessionFacade(String repositoryUser, String repositoryPassword, String repositoryAtomUrl, String repositoryId) { this.repositoryUser = repositoryUser; this.repositoryPassword = repositoryPassword; this.repositoryAtomUrl = repositoryAtomUrl; this.repositoryId = repositoryId; this.session = createCmisSession(); } public Folder getFolderById(String id) { try { return (Folder) session.getObject(session.createObjectId(id)); } catch (CmisObjectNotFoundException e) { //great idea Chemistry developers - use RUNTIME exceptions to control the flow return null; } } public Document uploadDocument(final String filename, Folder folder, final byte[] bytes, final String MIMEType, Map<String, String> newProperties) { HashMap<String, String> properties = new HashMap<String, String>(); properties.put(PropertyIds.NAME, filename); properties.put(PropertyIds.OBJECT_TYPE_ID, ObjectType.DOCUMENT_BASETYPE_ID); if(newProperties != null){ properties.putAll(newProperties); } return folder.createDocument(properties, new ContentStream() { @Override public long getLength() { return bytes.length; } @Override public BigInteger getBigLength() { return BigInteger.valueOf(bytes.length); } @Override public String getMimeType() { return MIMEType; } @Override public String getFileName() { return filename; } @Override public InputStream getStream() { return new ByteArrayInputStream(bytes); } @Override public List<CmisExtensionElement> getExtensions() { return null; } @Override public void setExtensions(List<CmisExtensionElement> extensions) { } }, VersioningState.MAJOR); } public Folder createFolderIfNecessary(String name, String parentPath) { Folder folder = (Folder) getObjectByPath(parentPath + (parentPath.equals("/") ? "" : "/") + name); if (folder == null) { Folder parent; if (parentPath.equals("/") || parentPath.equals("")) { parent = session.getRootFolder(); } else { parent = (Folder) getObjectByPath(parentPath); } if (parent == null) { String[] toks = parentPath.split("/"); StringBuilder path = new StringBuilder("/"); for (String t : toks) { if (!StringUtil.hasText(t)) continue; parent = createFolderIfNecessary(t, path.toString()); if (path.length() > 1) { path.append("/").append(t); } else { path.append(t); } } } HashMap props = new HashMap(); props.put(PropertyIds.NAME, name); props.put(PropertyIds.OBJECT_TYPE_ID, ObjectType.FOLDER_BASETYPE_ID); folder = parent.createFolder(props); } return folder; } public CmisObject getObjectByPath(String path) { try { return session.getObjectByPath(path); } catch (CmisObjectNotFoundException e) { //great idea Chemistry developers - use RUNTIME exceptions to control the flow return null; } } public CmisObject getObject(ObjectId objectId) { try { return session.getObject(objectId); } catch (CmisObjectNotFoundException e) { //great idea Chemistry developers - use RUNTIME exceptions to control the flow return null; } } private Session createCmisSession() { SessionFactory cmisSessionFactory = SessionFactoryImpl.newInstance(); Map<String, String> parameter = new HashMap<String, String>(); // user credentials parameter.put(SessionParameter.USER, repositoryUser); parameter.put(SessionParameter.PASSWORD, repositoryPassword); // connection settings parameter.put(SessionParameter.ATOMPUB_URL, repositoryAtomUrl); parameter.put(SessionParameter.BINDING_TYPE, BindingType.ATOMPUB.value()); parameter.put(SessionParameter.REPOSITORY_ID, repositoryId); return cmisSessionFactory.createSession(parameter); } }