protected boolean isValid(MethodInvocation methodInvocation, int phase) {
    Method method = methodInvocation.getMethod();

    Class<?>[] parameterTypes = method.getParameterTypes();

    if (parameterTypes.length == 0) {
      if (_log.isDebugEnabled() && (phase == _PHASE_BEFORE)) {
        _log.debug("The method " + methodInvocation + " must have at least one parameter");
      }

      return false;
    }

    Class<?> parameterType = parameterTypes[0];

    if (!ClassedModel.class.isAssignableFrom(parameterType)) {
      if (_log.isDebugEnabled() && (phase == _PHASE_BEFORE)) {
        _log.debug("The first parameter of " + methodInvocation + " must implement ClassedModel");
      }

      return false;
    }

    Object[] arguments = methodInvocation.getArguments();

    ClassedModel classedModel = (ClassedModel) arguments[0];

    if ((classedModel == null) || !(classedModel.getPrimaryKeyObj() instanceof Long)) {

      if (_log.isDebugEnabled() && (phase == _PHASE_BEFORE)) {
        _log.debug("The first parameter of " + methodInvocation + " must be a long");
      }

      return false;
    }

    if (phase != _PHASE_AFTER_RETURNING) {
      return true;
    }

    if (!AuditedModel.class.isAssignableFrom(parameterType)
        && !GroupedModel.class.isAssignableFrom(parameterType)
        && !StagedModel.class.isAssignableFrom(parameterType)) {

      if (_log.isDebugEnabled()) {
        StringBundler sb = new StringBundler(4);

        sb.append("If send is true, the first parameter of ");
        sb.append(methodInvocation);
        sb.append(" must implement AuditedModel, GroupedModel, or ");
        sb.append("StagedModel");

        _log.debug(sb.toString());
      }

      return false;
    }

    return true;
  }
  protected long getClassPK(ClassedModel classedModel) {
    if (classedModel instanceof ResourcedModel) {
      ResourcedModel resourcedModel = (ResourcedModel) classedModel;

      return resourcedModel.getResourcePrimKey();
    } else {
      return (Long) classedModel.getPrimaryKeyObj();
    }
  }
  protected long getClassPK(ClassedModel classedModel) {
    Serializable primaryKeyObj = classedModel.getPrimaryKeyObj();

    if (!(primaryKeyObj instanceof Long)) {
      return 0;
    }

    return (Long) primaryKeyObj;
  }
  @Override
  protected BaseModel<?> moveBaseModelFromTrash(
      ClassedModel classedModel, Group group, ServiceContext serviceContext) throws Exception {

    BaseModel<?> parentBaseModel = getParentBaseModel(group, serviceContext);

    DLAppServiceUtil.moveFileShortcutFromTrash(
        (Long) classedModel.getPrimaryKeyObj(),
        (Long) parentBaseModel.getPrimaryKeyObj(),
        serviceContext);

    return parentBaseModel;
  }
 protected Long getBaseModelClassPK(ClassedModel classedModel) {
   return (Long) classedModel.getPrimaryKeyObj();
 }