private String uploadArtifact(MavenMetaData metadata, InputStream content)
      throws MavenRepositoryException {
    String uuid = null;
    if (content == null) {
      throw new MavenRepositoryException(
          Messages.i18n.format("maven.resource.upload.no.content")); // $NON-NLS-1$
    }
    String fileName = metadata.getFileName();
    PersistenceManager persistenceManager = PersistenceFactory.newInstance();

    // We need to query firstly to check if there is an existing item. If
    // there is an existing item, then it would be updated
    // Adding the criterias and parameters
    List<String> criteria = new ArrayList<String>();
    List<Object> parameters = new ArrayList<Object>();
    criteria.add("@maven.artifactId = ?"); // $NON-NLS-1$
    criteria.add("@maven.groupId = ?"); // $NON-NLS-1$
    criteria.add("@maven.type = ?"); // $NON-NLS-1$

    parameters.add(metadata.getArtifactId());
    parameters.add(metadata.getGroupId());
    if (StringUtils.isNotBlank(metadata.getParentType())) {
      parameters.add(metadata.getParentType());
    } else {
      parameters.add(metadata.getType());
    }

    if (StringUtils.isNotBlank(metadata.getVersion())) {
      criteria.add("@maven.version = ?"); // $NON-NLS-1$
      parameters.add(metadata.getVersion());
    } else {
      criteria.add("xp2:not(@maven.version)"); // $NON-NLS-1$
    }
    if (StringUtils.isNotBlank(metadata.getParentFileName())) {
      criteria.add("@name = ?"); // $NON-NLS-1$
      parameters.add(metadata.getParentFileName());
    }

    if (StringUtils.isNotBlank(metadata.getSnapshotId())) {
      criteria.add("@maven.snapshot.id = ?"); // $NON-NLS-1$
      parameters.add(metadata.getSnapshotId());
    } else {
      criteria.add("xp2:not(@maven.snapshot.id)"); // $NON-NLS-1$
    }

    ArtifactSet artifactSet = null;
    BaseArtifactType baseArtifact = null;
    try {
      // Query the previous criterias
      artifactSet = query(criteria, parameters);
      if (artifactSet.size() >= 1) {
        // Found some content!
        baseArtifact = artifactSet.iterator().next();
      }
    } catch (SrampAtomException e) {
      throw new MavenRepositoryException(
          Messages.i18n.format("maven.resource.upload.sramp.query.error", metadata.toString()),
          e); //$NON-NLS-1$
    } finally {
      if (artifactSet != null) {
        artifactSet.close();
      }
    }
    if (MavenFileExtensionEnum.value(metadata.getType()) != null) {
      if (baseArtifact != null) {
        boolean update = false;
        ArtifactType artifactType = ArtifactType.valueOf(baseArtifact.getArtifactType());
        if (metadata.getType().equals(MavenFileExtensionEnum.HASH_MD5.getExtension())
            || metadata.getType().equals(MavenFileExtensionEnum.HASH_SHA1.getExtension())) {
          String content_value = ""; // $NON-NLS-1$
          try {
            content_value = IOUtils.toString(content);
          } catch (IOException e1) {
            throw new MavenRepositoryException(
                Messages.i18n.format("maven.resource.upload.sramp.error", metadata.toString()),
                e1); //$NON-NLS-1$
          }

          if (StringUtils.isNotBlank(content_value)) {
            if (metadata.getType().equals(MavenFileExtensionEnum.HASH_MD5.getExtension())) {
              SrampModelUtils.setCustomProperty(
                  baseArtifact, JavaModel.PROP_MAVEN_HASH_MD5, content_value);
              update = true;
            } else if (metadata.getType().equals(MavenFileExtensionEnum.HASH_SHA1.getExtension())) {
              SrampModelUtils.setCustomProperty(
                  baseArtifact, JavaModel.PROP_MAVEN_HASH_SHA1, content_value);
              update = true;
            }
            if (update) {

              try {
                persistenceManager.updateArtifact(baseArtifact, artifactType);
              } catch (SrampException e) {
                throw new MavenRepositoryException(
                    Messages.i18n.format("maven.resource.upload.sramp.error", metadata.toString()),
                    e); //$NON-NLS-1$
              }
            }
          }
        } else {
          try {
            persistenceManager.updateArtifactContent(baseArtifact.getUuid(), artifactType, content);
          } catch (SrampException e) {
            throw new MavenRepositoryException(
                Messages.i18n.format("maven.resource.upload.sramp.error", metadata.toString()),
                e); //$NON-NLS-1$
          }
        }
      }
    } else {
      BaseArtifactType persisted = null;
      // If there is an existing artifact in s-ramp it would be updaded
      // with the new content
      if (baseArtifact != null) {
        if (metadata.isSnapshotVersion()
            || metadata.getFileName().equals("maven-metadata.xml")) { // $NON-NLS-1$
          ArtifactType artifactType = ArtifactType.valueOf(baseArtifact);
          try {
            persistenceManager.updateArtifactContent(baseArtifact.getUuid(), artifactType, content);
          } catch (SrampException e) {
            throw new MavenRepositoryException(
                Messages.i18n.format(
                    "maven.resource.upload.sramp.update.content.error", //$NON-NLS-1$
                    baseArtifact.getUuid()),
                e);
          }
          persisted = baseArtifact;
        } else {
          throw new MavenRepositoryException(
              Messages.i18n.format(
                  "maven.resource.upload.sramp.release.artifact.exist", //$NON-NLS-1$
                  metadata.getFullName()));
        }

      } else {
        // we need to create a new artifact in s-ramp and persist the
        // content
        ArtifactType artifactType = determineArtifactType(fileName);
        BaseArtifactType baseArtifactType = artifactType.newArtifactInstance();
        try {
          persisted = persistenceManager.persistArtifact(baseArtifactType, content);
        } catch (SrampException e1) {
          throw new MavenRepositoryException(
              Messages.i18n.format("maven.resource.upload.sramp.new.content.error"),
              e1); //$NON-NLS-1$
        }
      }
      // Store the metadata to the persisted artifact
      SrampModelUtils.setCustomProperty(
          persisted, JavaModel.PROP_MAVEN_GROUP_ID, metadata.getGroupId());
      SrampModelUtils.setCustomProperty(
          persisted, JavaModel.PROP_MAVEN_ARTIFACT_ID, metadata.getArtifactId());
      SrampModelUtils.setCustomProperty(
          persisted, JavaModel.PROP_MAVEN_VERSION, metadata.getVersion());

      if (StringUtils.isNotBlank(metadata.getClassifier())) {
        SrampModelUtils.setCustomProperty(
            persisted, JavaModel.PROP_MAVEN_CLASSIFIER, metadata.getClassifier());
      }
      if (StringUtils.isNotBlank(metadata.getType())) {
        SrampModelUtils.setCustomProperty(persisted, JavaModel.PROP_MAVEN_TYPE, metadata.getType());
      }
      if (StringUtils.isNotBlank(metadata.getSnapshotId())) {
        SrampModelUtils.setCustomProperty(
            persisted, JavaModel.PROP_MAVEN_SNAPSHOT_ID, metadata.getSnapshotId());
      }
      try {
        // Persist the content size, because it will be required when
        // reading
        persisted
            .getOtherAttributes()
            .put(SrampConstants.SRAMP_CONTENT_SIZE_QNAME, content.available() + ""); // $NON-NLS-1$
      } catch (IOException e) {
        logger.error(""); // $NON-NLS-1$
      }

      persisted.setName(metadata.getFileName());
      ArtifactType artifactType = ArtifactType.valueOf(persisted);
      try {
        persistenceManager.updateArtifact(persisted, artifactType);
      } catch (SrampException e) {
        throw new MavenRepositoryException(
            Messages.i18n.format(
                "maven.resource.upload.sramp.update.content.metadata.error", //$NON-NLS-1$
                persisted.getUuid()),
            e);
      }
      uuid = persisted.getUuid();
    }

    return uuid;
  }
  private MavenArtifactWrapper getArtifactContent(MavenMetaData metadata)
      throws MavenRepositoryException {
    // List of criterias and the parameters associated
    List<String> criteria = new ArrayList<String>();
    List<Object> parameters = new ArrayList<Object>();
    criteria.add("@maven.artifactId = ?"); // $NON-NLS-1$
    criteria.add("@maven.groupId = ?"); // $NON-NLS-1$
    criteria.add("@maven.type = ?"); // $NON-NLS-1$

    parameters.add(metadata.getArtifactId());
    parameters.add(metadata.getGroupId());
    // If there is a parent type (in case of sha1 or md5, it is passed as
    // parameter
    if (StringUtils.isNotBlank(metadata.getParentType())) {
      parameters.add(metadata.getParentType());
    } else {
      parameters.add(metadata.getType());
    }
    // Not always it is passed the maven version. This is the case when it
    // is requested a file (normally maven-metadata.xml) that is stored in
    // the artifact subfolder
    if (StringUtils.isNotBlank(metadata.getVersion())) {
      criteria.add("@maven.version = ?"); // $NON-NLS-1$
      parameters.add(metadata.getVersion());
    }
    // If it is included a classfier it is added as parameter.
    if (StringUtils.isNotBlank(metadata.getClassifier())) {
      criteria.add("@maven.classifier = ?"); // $NON-NLS-1$
      parameters.add(metadata.getClassifier());
    } else {
      criteria.add("xp2:not(@maven.classifier)"); // $NON-NLS-1$
    }

    if (StringUtils.isNotBlank(metadata.getSnapshotId())) {
      criteria.add("@maven.snapshot.id = ?"); // $NON-NLS-1$
      parameters.add(metadata.getSnapshotId());
    } else {
      criteria.add("xp2:not(@maven.snapshot.id)"); // $NON-NLS-1$
    }

    ArtifactSet artifactSet = null;
    BaseArtifactType baseArtifact = null;
    try {
      // query based on the previous criterias
      artifactSet = query(criteria, parameters);
      if (artifactSet.size() >= 1) {
        // Found some content!
        baseArtifact = artifactSet.iterator().next();
      }
    } catch (SrampAtomException e) {
      throw new MavenRepositoryException(Messages.i18n.format(""), e); // $NON-NLS-1$
    } finally {
      if (artifactSet != null) {
        artifactSet.close();
      }
    }
    // If the artifact returned is not null, then the content will be
    // retrieved
    if (baseArtifact != null) {
      PersistenceManager persistenceManager = PersistenceFactory.newInstance();
      final InputStream artifactContent;
      ArtifactType artifactType = ArtifactType.valueOf(baseArtifact.getArtifactType());
      Date lastModifiedDate = null;
      if (baseArtifact.getLastModifiedTimestamp() != null) {
        lastModifiedDate = baseArtifact.getLastModifiedTimestamp().toGregorianCalendar().getTime();
      }
      int contentLength = -1;
      MavenFileExtensionEnum ext = MavenFileExtensionEnum.value(metadata.getType());
      if (ext != null && StringUtils.isNotBlank(ext.getCustomProperty())) {
        // we need to set the input stream with the value of the custom
        // property
        String content = SrampModelUtils.getCustomProperty(baseArtifact, ext.getCustomProperty());
        if (StringUtils.isNotBlank(content)) {
          artifactContent = new ByteArrayInputStream(content.getBytes());
          contentLength = content.length();
        } else {
          logger.info(
              Messages.i18n.format(
                  "maven.resource.get.subcontent.not.found",
                  baseArtifact.getUuid(),
                  ext.getCustomProperty())); // $NON-NLS-1$
          return null;
        }

      } else {
        // we need to set the input stream with the artifact content
        try {
          artifactContent =
              persistenceManager.getArtifactContent(baseArtifact.getUuid(), artifactType);
        } catch (SrampException e) {
          logger.error(
              Messages.i18n.format("maven.resource.get.content.error", baseArtifact.getUuid()),
              e); //$NON-NLS-1$

          throw new MavenRepositoryException(
              Messages.i18n.format(
                  "maven.resource.get.content.error", //$NON-NLS-1$
                  baseArtifact.getUuid()),
              e);
        }
        String contentSize =
            baseArtifact.getOtherAttributes().get(SrampConstants.SRAMP_CONTENT_SIZE_QNAME);
        if (StringUtils.isNotBlank(contentSize)) {
          contentLength = Integer.parseInt(contentSize);
        }
      }

      MavenArtifactWrapper wrapper =
          new MavenArtifactWrapper(
              artifactContent,
              contentLength,
              lastModifiedDate,
              metadata.getFileName(),
              artifactType.getMimeType());
      return wrapper;
    } else {
      logger.error(
          Messages.i18n.format("maven.resource.item.null", metadata.toString())); // $NON-NLS-1$
      // Return null so that the servlet can return a 404
      return null;
    }
  }