com.smartitengineering.version.api.factory.VersionAPI.java Source code

Java tutorial

Introduction

Here is the source code for com.smartitengineering.version.api.factory.VersionAPI.java

Source

/*
 * This is a common dao with basic CRUD operations and is not limited to any 
 * persistent layer implementation
 * 
 * Copyright (C) 2008  Imran M Yousuf (imyousuf@smartitengineering.com)
 * 
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or (at your option) any later version.
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 */
package com.smartitengineering.version.api.factory;

import com.smartitengineering.util.bean.BeanFactoryRegistrar;
import com.smartitengineering.util.bean.annotations.Aggregator;
import com.smartitengineering.util.bean.annotations.InjectableField;
import com.smartitengineering.version.api.Author;
import com.smartitengineering.version.api.Commit;
import com.smartitengineering.version.api.Resource;
import com.smartitengineering.version.api.Revision;
import com.smartitengineering.version.api.VersionedResource;
import com.smartitengineering.version.api.dao.VersionControlReadDao;
import com.smartitengineering.version.api.dao.VersionControlWriteDao;
import com.smartitengineering.version.api.impl.AuthorImpl;
import com.smartitengineering.version.api.impl.CommitImpl;
import com.smartitengineering.version.api.impl.InputStreamContentImpl;
import com.smartitengineering.version.api.impl.ResourceImpl;
import com.smartitengineering.version.api.impl.RevisionImpl;
import com.smartitengineering.version.api.impl.StringContentImpl;
import com.smartitengineering.version.api.impl.VersionedResourceImpl;
import java.io.InputStream;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import org.apache.commons.lang.StringUtils;

/**
 * Factory API for creating concrete class for Version's API interfaces
 * @author imyousuf
 */
@Aggregator(contextName = "com.smartitnengineering.smart-dao.smart-version")
public final class VersionAPI {

    @InjectableField
    private VersionControlWriteDao versionControlWriteDao;
    @InjectableField
    private VersionControlReadDao versionControlReadDao;
    private static VersionAPI versionAPI;

    private VersionAPI() {
        BeanFactoryRegistrar.aggregate(this);
    }

    /**
     * Retrieve API factory for context dependent resources.
     * @return API Factory
     */
    public static VersionAPI getInstance() {
        if (versionAPI == null) {
            versionAPI = new VersionAPI();
        }
        return versionAPI;
    }

    /**
     * Creates an author to be used for setting to commits.
     * @param name Author's name, NULL string is not allowed
     * @param email Author's email, blank string is not allowed
     * @return Author to be used with commits
     */
    public static Author createAuthor(final String name, final String email) {
        if (StringUtils.isBlank(email) || name == null) {
            throw new IllegalArgumentException("Name can't be NULL and email can't be blank!");
        }
        AuthorImpl authorImpl = new AuthorImpl();
        authorImpl.setEmail(email);
        authorImpl.setName(name);
        return authorImpl;
    }

    /**
     * Creates resource to versioned, it could be a new version or an old
     * resource's new version.
     * @param resourceId Id for the resource, not blank
     * @param content Content of the resource, not null
     * @return Returns the resource
     */
    public static Resource createResource(final String resourceId, final String content) {
        return createResource(resourceId, content, false, null);
    }

    /**
     * Creates resource to versioned, it could be a new version or an old
     * resource's new version.
     * @param resourceId Id for the resource, not blank
     * @param content Content of the resource, not null
     * @param deleted Whether the resource is deleted or not
     * @return Returns the resource
     */
    public static Resource createResource(final String resourceId, final String content, final boolean deleted) {
        return createResource(resourceId, content, deleted, null);
    }

    /**
     * Creates resource to versioned, it could be a new version or an old
     * resource's new version.
     * @param resourceId Id for the resource, not blank
     * @param content Content of the resource, not null
     * @param deleted Whether the resource is deleted or not
     * @param mimeType MIME type of the resource, can be null.
     * @return Returns the resource
     */
    public static Resource createResource(final String resourceId, final String content, final boolean deleted,
            final String mimeType) {
        String trimmedResourceId = trimToProperResourceId(resourceId);
        if (StringUtils.isBlank(trimmedResourceId) || content == null) {
            throw new IllegalArgumentException("Content can't be NULL and resourceId can't be blank!");
        }
        ResourceImpl resourceImpl = new ResourceImpl();
        resourceImpl.setContent(new StringContentImpl(content));
        resourceImpl.setId(resourceId);
        resourceImpl.setDeleted(deleted);
        resourceImpl.setMimeType(mimeType);
        return resourceImpl;
    }

    public static Resource createResource(final String resourceId, final int contentSize,
            final InputStream contentStream, final boolean deleted, final String mimeType) {
        String trimmedResourceId = trimToProperResourceId(resourceId);
        if (StringUtils.isBlank(trimmedResourceId) || contentStream == null || contentSize < 0) {
            throw new IllegalArgumentException(
                    "Content stream can't be NULL, size can't negative " + "and resourceId can't be blank!");
        }
        ResourceImpl resourceImpl = new ResourceImpl();
        resourceImpl.setContent(new InputStreamContentImpl(contentSize, contentStream));
        resourceImpl.setId(resourceId);
        resourceImpl.setDeleted(deleted);
        resourceImpl.setMimeType(mimeType);
        return resourceImpl;
    }

    /**
     * Create a revision object from the given resource and revision id.
     * @param resource Resource represented in the revision, can't be null
     * @param revisionId Id of the revision, might be null
     * @return Revision of the resource.
     */
    public static Revision createRevision(final Resource resource, final String revisionId) {
        if (resource == null) {
            throw new IllegalArgumentException("Resource can't be null!");
        }
        RevisionImpl revisionImpl = new RevisionImpl();
        revisionImpl.setResource(resource);
        revisionImpl.setRevisionId(revisionId);
        return revisionImpl;
    }

    /**
     * Create a versioned resource from revisions. If revisions is not empty
     * then head revision's resource will be pointed accordingly.
     * @param revisions Revisions of a resource
     * @return VersionedResource of the revisions.
     */
    public static VersionedResource createVersionedResource(Collection<Revision> revisions) {
        if (revisions == null) {
            revisions = Collections.emptyList();
        }
        VersionedResourceImpl versionedResourceImpl = new VersionedResourceImpl();
        if (!revisions.isEmpty()) {
            try {
                versionedResourceImpl.setHeadVersionResource(revisions.iterator().next().getResource());
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
        versionedResourceImpl.setRevisions(revisions);
        return versionedResourceImpl;
    }

    /**
     * It creates a commit from the given information.
     * @param revisions Revisions to be part of the commit, can be empty
     * @param commitId Id of the commit, may be null
     * @param parentCommitId Id of the parent commit, may be null, the null
     *                       signifies that its the first commit of the base,
     *                       however, implementations could set it themselves if
     *                       required
     * @param commitMessage Log message for this commit, can not be blank
     * @param committer Author of the commit, can not be null
     * @param commitTime Time the commit was performed, may be null, can't be
     *                   null if commit id is not null or not blank.
     * @return Commit object representing the information supplied
     */
    public static Commit createCommit(final Collection<Revision> revisions, final String commitId,
            final String parentCommitId, final String commitMessage, final Author committer,
            final Date commitTime) {
        if (StringUtils.isBlank(commitMessage) || committer == null || revisions == null || revisions.isEmpty()
                || (StringUtils.isNotBlank(commitId) && commitTime == null)) {
            throw new IllegalArgumentException("Commit log message & revisions can't be blank and "
                    + "committer can't be NULL, commitTime can't be null if commitId" + "is not blank!");
        }
        CommitImpl commitImpl = new CommitImpl();
        commitImpl.setAuthor(committer);
        commitImpl.setCommitId(commitId);
        commitImpl.setCommitMessage(commitMessage);
        commitImpl.setCommitTime(commitTime);
        commitImpl.setParentCommitId(parentCommitId);
        commitImpl.setRevisions(revisions);
        return commitImpl;
    }

    /**
     * Throw away all the '/' from beginning and end of the resourceId.
     * @param resourceId Id to trim
     * @return Trimmed version of the resourceId
     */
    public static String trimToProperResourceId(String resourceId) {
        if (StringUtils.isBlank(resourceId)) {
            return "";
        }
        StringBuilder result = new StringBuilder(resourceId.trim());
        while (result.charAt(0) == '/') {
            result.deleteCharAt(0);
        }
        while (result.charAt(result.length() - 1) == '/') {
            result.deleteCharAt(result.length() - 1);
        }
        return result.toString();
    }

    /**
     * Returns the injected RCS Writer.
     * @return Injected from context or else null if not available.
     */
    public VersionControlWriteDao getVersionControlWriteDao() {
        return versionControlWriteDao;
    }

    /**
     * Returns the injected RCS Reader
     * @return Injected from context or else null if not available
     */
    public VersionControlReadDao getVersionControlReadDao() {
        return versionControlReadDao;
    }
}