javafilenet-p8filenet-content-engine

Filnet API Copy File


I'm in a need to duplicate a file on filenet using APIs and update a properties from the existing file, after making a search with , I made the below sample but getting an error

row = (RepositoryRow) it.next();
            Id id = row.getProperties().get("Id").getIdValue();
            Document document = Factory.Document.fetchInstance(os, id, null);

            System.out.println("current document is : "+document.get_Name());

            Document docCopy = (Document)Factory.Document.fetchInstance(os, id, null); 

            Properties prop = docCopy.getProperties();
                prop.putValue("PT_DocumentNumber", newDocNo);

            docCopy.checkin(AutoClassify.DO_NOT_AUTO_CLASSIFY, CheckinType.MAJOR_VERSION);
            docCopy.save(RefreshMode.NO_REFRESH);

            // file into folder
            folder = Factory.Folder.getInstance(os, ClassNames.FOLDER, new Id("myFOlder"));
            ReferentialContainmentRelationship rcr = folder.file(docCopy, AutoUniqueName.AUTO_UNIQUE, "New Document via Webservice", DefineSecurityParentage.DO_NOT_DEFINE_SECURITY_PARENTAGE);
            rcr.save(RefreshMode.NO_REFRESH);

the error I'm getting as the following

[2/28/19 12:31:58:721 AST] 000000bc SystemErr     R com.filenet.api.exception.EngineRuntimeException: FNRCE0042E: E_NOT_SUPPORTED: This method is not supported in the context of this session or object. Checkin must be performed on a reservation object. failedBatchItem=0 errorStack={
at com.filenet.engine.persist.VersionablePersister.validateCheckin(VersionablePersister.java:558)
at 

Solution

  • Simply put, what you are doing is that you get the ID

    Id id = row.getProperties().get("Id").getIdValue();
    

    Then you get the source document

    Document document = Factory.Document.fetchInstance(os, id, null);
    

    Then you get the same source document, with just a different reference variable

    Document docCopy = (Document)Factory.Document.fetchInstance(os, id, null); 
    

    Both are the same document, no copy was done here! and hence when you try to check in the document using:

    docCopy.checkin(AutoClassify.DO_NOT_AUTO_CLASSIFY, CheckinType.MAJOR_VERSION);
    docCopy.save(RefreshMode.NO_REFRESH);
    

    The Engine throws an error since the document was not checked out in the first place (and hence no reservation object captured to do your changes on).

    Checkin must be performed on a reservation object.