content: /*
   *  Licensed to the Apache Software Foundation (ASF) under one or more
   *  contributor license agreements.  See the NOTICE file distributed with
   *  this work for additional information regarding copyright ownership.
   *  The ASF licenses this file to You under the Apache License, Version 2.0
   *  (the "License"); you may not use this file except in compliance with
   *  the License.  You may obtain a copy of the License at
   *
   *      https://www.apache.org/licenses/LICENSE-2.0
   *
   *  Unless required by applicable law or agreed to in writing, software
   *  distributed under the License is distributed on an "AS IS" BASIS,
   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   *  See the License for the specific language governing permissions and
   *  limitations under the License.
   *
   */
  
  package org.apache.tools.ant.taskdefs.optional.windows;
  
  import java.io.File;
  
  import org.apache.tools.ant.BuildException;
  import org.apache.tools.ant.taskdefs.ExecuteOn;
  import org.apache.tools.ant.taskdefs.condition.Os;
  import org.apache.tools.ant.types.FileSet;
  
  /**
   * Attrib equivalent for Win32 environments.
   * Note: Attrib parameters /S and /D are not handled.
   *
   * @since Ant 1.6
   */
  public class Attrib extends ExecuteOn {
  
      private static final String ATTR_READONLY = "R";
      private static final String ATTR_ARCHIVE  = "A";
      private static final String ATTR_SYSTEM   = "S";
      private static final String ATTR_HIDDEN   = "H";
      private static final String SET    = "+";
      private static final String UNSET  = "-";
  
      private boolean haveAttr = false;
  
      /** Constructor for Attrib. */
      public Attrib() {
          super.setExecutable("attrib");
          super.setParallel(false);
      }
  
      /**
       * A file to be attribed.
       * @param src a file
       */
      public void setFile(File src) {
          FileSet fs = new FileSet();
          fs.setFile(src);
          addFileset(fs);
      }
  
      /**
       * Set the ReadOnly file attribute.
       * @param value a <code>boolean</code> value
       */
      public void setReadonly(boolean value) {
          addArg(value, ATTR_READONLY);
      }
  
      /**
       * Set the Archive file attribute.
       * @param value a <code>boolean</code> value
       */
      public void setArchive(boolean value) {
          addArg(value, ATTR_ARCHIVE);
      }
  
      /**
       * Set the System file attribute.
       * @param value a <code>boolean</code> value
       */
      public void setSystem(boolean value) {
          addArg(value, ATTR_SYSTEM);
      }
  
      /**
       * Set the Hidden file attribute.
       * @param value a <code>boolean</code> value
       */
      public void setHidden(boolean value) {
          addArg(value, ATTR_HIDDEN);
      }
  
      /**
       * Check the attributes.
       */
      @Override
      protected void checkConfiguration() {
          if (!haveAttr()) {
              throw new BuildException("Missing attribute parameter",
                                       getLocation());
          }
          super.checkConfiguration();
      }
  
      /**
       * Set the executable.
       * This is not allowed, and it always throws a BuildException.
       * @param e ignored
       * @ant.attribute ignore="true"
       */
      @Override
      public void setExecutable(String e) {
          throw new BuildException(getTaskType()
              + " doesn't support the executable attribute", getLocation());
      }
  
      /**
       * Set the executable.
       * This is not allowed, and it always throws a BuildException.
       * @param e ignored
       * @ant.attribute ignore="true"
       */
      public void setCommand(String e) {
          throw new BuildException(getTaskType()
              + " doesn't support the command attribute", getLocation());
      }
  
      /**
       * Add source file.
       * This is not allowed, and it always throws a BuildException.
       * @param b ignored
       * @ant.attribute ignore="true"
       */
      @Override
      public void setAddsourcefile(boolean b) {
          throw new BuildException(getTaskType()
              + " doesn't support the addsourcefile attribute", getLocation());
      }
  
      /**
       * Set skip empty file sets.
       * This is not allowed, and it always throws a BuildException.
       * @param skip ignored
       * @ant.attribute ignore="true"
       */
      @Override
      public void setSkipEmptyFilesets(boolean skip) {
          throw new BuildException(getTaskType() + " doesn't support the "
                                   + "skipemptyfileset attribute",
                                   getLocation());
      }
  
      /**
       * Set parallel.
       * This is not allowed, and it always throws a BuildException.
       * @param parallel ignored
       * @ant.attribute ignore="true"
       */
      @Override
      public void setParallel(boolean parallel) {
          throw new BuildException(getTaskType()
                                   + " doesn't support the parallel attribute",
                                   getLocation());
      }
  
      /**
       * Set max parallel.
       * This is not allowed, and it always throws a BuildException.
       * @param max ignored
       * @ant.attribute ignore="true"
       */
      @Override
      public void setMaxParallel(int max) {
          throw new BuildException(getTaskType()
                                   + " doesn't support the maxparallel attribute",
                                   getLocation());
      }
  
      /**
       * Check if the os is valid.
       * Default is to allow windows
       * @return true if the os is valid.
       */
      @Override
      protected boolean isValidOs() {
          return getOs() == null && getOsFamily() == null
              ? Os.isFamily(Os.FAMILY_WINDOWS) : super.isValidOs();
      }
  
      private static String getSignString(boolean attr) {
          return attr ? SET : UNSET;
      }
  
      private void addArg(boolean sign, String attribute) {
          createArg().setValue(getSignString(sign) + attribute);
          haveAttr = true;
      }
  
      private boolean haveAttr() {
          return haveAttr;
      }
  
  }
  