/**
  * description
  *
  * @return int
  *
  * @param  integer $v Schema Id to lookup
  */
 public static function getNextSchemaPropertyId($v)
 {
     //lookup the schema
     $schema = SchemaPeer::retrieveByPK($v);
     $nextId = NULL;
     if ($schema) {
         //get the last id
         $lastId = $schema->getLastUriId();
         //increment it by one and set the last_id
         $nextId = $lastId ? ++$lastId : 100000;
         //we should theoretically set this when we save the property, but it doesn't matter
         $schema->setLastUriId($nextId);
         $schema->save();
         return $nextId;
     }
 }
    function it_finds_an_array_of_all_columns_based_on_a_schema_id_in_display_order()
    {
        $schema = \SchemaPeer::retrieveByPK(1);
        $schema->setLanguages(['en','fr']);
        $schema->save();

        /** @var \ImportVocab\ExportVocab $this */
        $this->setAsTemplate(true);
        $columns = $this->getSchema()->getAllProfileProperties();
        $columns->shouldHaveCount( 26 );
        $columns[1]['profile']->shouldHaveType( 'ProfileProperty' );
        $columns[9]['count']->shouldEqual( 1 );
        $columns[3]['languages']['en']->shouldEqual( 1 );
        $columns[3]['languages']['fr']->shouldEqual( 1 );
        $id = \ProfilePropertyPeer::retrieveByPK( 9 )->getId();
        $columns[12]['id']->shouldEqual( $id );
    }
 /**
  * Get the associated Schema object
  *
  * @param      Connection Optional Connection object.
  * @return     Schema The associated Schema object.
  * @throws     PropelException
  */
 public function getSchema($con = null)
 {
     if ($this->aSchema === null && $this->schema_id !== null) {
         // include the related Peer class
         include_once 'lib/model/om/BaseSchemaPeer.php';
         $this->aSchema = SchemaPeer::retrieveByPK($this->schema_id, $con);
         /* The following can be used instead of the line above to
         		   guarantee the related object contains a reference
         		   to this object, but this level of coupling
         		   may be undesirable in many circumstances.
         		   As it can lead to a db query with many results that may
         		   never be used.
         		   $obj = SchemaPeer::retrieveByPK($this->schema_id, $con);
         		   $obj->addSchemas($this);
         		 */
     }
     return $this->aSchema;
 }
 public function setSchema( $schemaId )
 {
     if ($this->type === 'schema' ) {
         $this->schema = \SchemaPeer::retrieveByPK($schemaId);
     } else {
         $this->schema = \VocabularyPeer::retrieveByPK($schemaId);
     }
 }
                 $history = $import->getConceptPropertyHistorys();
                 $showVocabularyBc = true;
                 $showHistoryBc = true;
                 $tab = 'vocabulary';
             }
         }
     }
     break;
 case 'schemahistorylist':
     $showBc = true;
     $showSchemaBc = true;
     if ('import' == $filter) {
         $import = FileImportHistoryPeer::retrieveByPK($paramId);
         if ($import) {
             $id = $import->getSchemaId();
             $schema = SchemaPeer::retrieveByPK($id);
         }
     }
     if (!isset($history)) {
         $id = $sf_params->get('id');
         if ($id) {
             $history = SchemaPropertyElementHistoryPeer::retrieveByPK($id);
         }
     }
     if (!isset($schema_property_element)) {
         if ($history) {
             sfPropelParanoidBehavior::disable();
             $schema_property_element = $history->getSchemaPropertyElement();
         }
     }
     if (!isset($schema_property)) {
function run_import_marc_vocabulary($task, $args)
{


    //check the argument counts
    if (count($args) < 1) {
        throw new Exception('You must provide a vocabulary type.');
    }

    if (count($args) < 2) {
        throw new Exception('You must provide a file name.');
    }

    if (count($args) < 3) {
        throw new Exception('You must provide a vocabulary id.');
    }

    //set the arguments
    $type          = strtolower($args[0]);
    $filePath      = $args[1];
    $id            = $args[2];
    $deleteMissing = (isset($args[3]) && ("-d" == $args[3]));

    //do some basic validity checks

    if (! in_array($type, array("schema", "vocab", "vocabulary"))) {
        throw new Exception('You must import into a schema or a vocab');
    }

    if ("vocabulary" == $type) {
        $type = "vocab";
    }

    if (! is_numeric($id)) {
        throw new Exception('You must provide a valid ID');
    }

    //does the file exist?
    if (! file_exists($filePath)) {
        throw new Exception('You must supply a valid file to import: ' . $filePath);
    }

    //is the file a valid type?
    if (preg_match('/^.+\.([[:alpha:]]{2,4})$/', $filePath, $matches)) {
        if (! in_array(strtolower($matches[1]), array("json", "rdf", "csv", "xml"))) {
            throw new Exception('You must provide a valid file type based on the extension');
        }
    } else {
        throw new Exception("File type cannot be determined from the file extension");
    }

    $fileType = $matches[1];

    //is the object a valid object?
    if ('vocab' == $type) {
        $vocabObj = VocabularyPeer::retrieveByPK($id);
        if (is_null($vocabObj)) {
            throw new Exception('Invalid vocabulary ID');
        }

        //set some defaults
        $baseDomain = $vocabObj->getBaseDomain();
        $language   = $vocabObj->getLanguage();
        $statusId   = $vocabObj->getStatusId();

        //get a skos property id map
        $skosMap = SkosPropertyPeer::getPropertyNames();

        //there has to be a hash or a slash
        $tSlash = preg_match('@(/$)@i', $vocabObj->getUri()) ? '' : '/';
        $tSlash = preg_match('/#$/', $vocabObj->getUri()) ? '' : $tSlash;
    } else {
        $schemaObj = SchemaPeer::retrieveByPK($id);
        if (is_null($schemaObj)) {
            throw new Exception('Invalid schema ID');
        }

        //set some defaults
        $baseDomain = $schemaObj->getUri();
        $language   = $schemaObj->getLanguage();
        $statusId   = $schemaObj->getStatusId();

        //get a element set property id map
        $profileId  = 1;
        $profile    = ProfilePeer::retrieveByPK($profileId);
        $elementMap = $profile->getAllProperties();

        //there has to be a hash or a slash
        $tSlash = preg_match('@(/$)@i', $baseDomain) ? '' : '/';
        $tSlash = preg_match('/#$/', $baseDomain) ? '' : $tSlash;
    }

    //     insert jon's user id
    $userId = 36;

    /* From here on the process is the same regardless of UI */

    //execute
    //     parse file to get the fields/columns and data
    $file = fopen($filePath, "r");
    if (! $file) {
        throw new Exception("Can't read supplied file");
    }

    //     check to see if file has been uploaded before
    //          check import history for file name
    $importHistory = FileImportHistoryPeer::retrieveByLastFilePath($filePath);
    //          if reimport
    //               get last import history for filename
    //               unserialize column map
    //               match column names to AP based on map
    //     look for matches in unmatched field/column names to AP (ideal)
    //     csv table of data --
    //          row1: parsed field names/column headers
    //          row2: select dropdown with available fields from object AP (pre-select known matches)
    //                each select identified by column number
    //          row3: display datatype of selected field (updated dynamically when field selected)
    //          row4-13: first 10 rows of parsed data from file
    //     require a column that can match to 'URI' (maybe we'll allow an algorithm later)
    //     require columns that are required by AP
    //     on reimport there should be a flag to 'delete missing properties' from the current data
    //     note: at some point there will be a reimport process that allows URI changing
    //          this will require that there be an OMR identifier embedded in the incoming data

    switch ($fileType) {
        case "csv":
            try {
                $reader = new aCsvReader($filePath);
            } catch(Exception $e) {
                throw new Exception("Not a happy CSV file!");
            }

            if ('vocab' == $type) {
                // Get array of heading names found
                $headings = $reader->getHeadings();
                $fields   = ConceptPeer::getFieldNames();

                //set the map
                //      $map[] = array("property" => "Uri", "column" => "URILocal");
                //      $map[] = array("property" => "prefLabel", "column" => "skos:prefLabel");
                //      $map[] = array("property" => "definition", "column" => "skos:definition");
                //      $map[] = array("property" => "notation", "column" => "skos:notation");
                //      $map[] = array("property" => "scopeNote", "column" => "skos:scopeNote");

                $map = array(
                  "uri"        => "URILocal",
                  "prefLabel"  => "skos:prefLabel",
                  "definition" => "skos:definition",
                  "notation"   => "skos:notation",
                  "scopeNote"  => "skos:scopeNote"
                );

                $rows = 0;

                //executeImport:

                //    serialize the column map
                try {
                    while ($row = $reader->getRow()) {
                        $rows ++;
                        //        lookup the URI (or the OMR ID if available) for a match
                        $uri        = $baseDomain . $row[$map["uri"]];
                        $concept    = ConceptPeer::getConceptByUri($uri);
                        $updateTime = time();
                        $language   = (isset($map['language'])) ? $row[$map['language']] : $vocabObj->getLanguage();

                        if (! $concept) {
                            //          create a new concept or element
                            $concept = new Concept();
                            $concept->setVocabulary($vocabObj);
                            $concept->setUri($uri);
                            /**
                             * @todo Need to handle updates for topconcept here, just like language
                             **/
                            $concept->setIsTopConcept(false);
                            $concept->updateFromRequest(
                                    $userId,
                                      fixMarcEncoding(rtrim($row[$map['prefLabel']])),
                                      $language,
                                      $statusId
                            );
                        } //don't update the concept if the preflabel matches
                        else if ($row[$map['prefLabel']] != $concept->getPrefLabel()) {
                            $concept->updateFromRequest($userId, fixMarcEncoding(rtrim($row[$map['prefLabel']])));
                        }

                        //there needs to be a language to lookup the properties unless it's an objectProperty
                        $rowLanguage = (isset($map['language'])) ? $row[$map['language']] : $concept->getLanguage();

                        foreach ($map as $key => $value) {
                            //we skip because we already did them
                            if (! in_array($key, array('uri', 'prefLabel', 'language'))) {
                                $skosId = $skosMap[$key];
                                //check to see if the property already exists
                                $property =
                                  ConceptPropertyPeer::lookupProperty($concept->getId(), $skosId, $rowLanguage);

                                //create a new property for each unmatched column
                                if (! empty($row[$value])) {
                                    if (! $property) {
                                        $property = new ConceptProperty();
                                        $property->setCreatedUserId($userId);
                                        $property->setConceptId($concept->getId());
                                        $property->setCreatedAt($updateTime);
                                        $property->setSkosPropertyId($skosId);
                                    }

                                    if (($row[$value] != $property->getObject()) ||
                                        ($rowLanguage != $property->getLanguage())
                                    ) {
                                        /**
                                         * @todo We need a check here for skos objectproperties and handle differently
                                         **/
                                        if ($rowLanguage != $property->getLanguage()) {
                                            $property->setLanguage($rowLanguage);
                                        }
                                        if ($row[$value] != $property->getObject()) {
                                            $property->setObject(fixMarcEncoding(rtrim($row[$value])));
                                        }
                                        $property->setUpdatedUserId($userId);
                                        $property->setUpdatedAt($updateTime);
                                        $property->save();
                                    }
                                } //the row value is empty
                                else if ($deleteMissing && $property) {
                                    $property->delete();
                                }
                            }
                        }

                        //          else
                        //               lookup and update concept or element
                        //               lookup and update each property
                        //          update the history for each property, action is 'import', should be a single timestamp for all (this should be automatic)
                        //          if 'delete missing properties' is true
                        //               delete each existing, non-required property that wasn't updated by the import
                    }
                } catch(Exception $e) {
                    //          catch
                    //            if there's an error of any kind, write to error log and continue
                    echo "Error on row: " . $rows . ", " . $uri . "\n" . $e . "\n";
                    continue;
                }
                $objects = $vocabObj->countConcepts();
            } else //it's an element set
            {
                $map  = array(
                  "uri"        => "uriLocalPart",
                  "name"       => "reg:name",
                  "definition" => "skos:definition",
                  "label"      => "rdfs:label",
                  "note"       => array("tag" => "tagCap", "ind1" => "ind1Cap", "ind2" => "ind2Cap", "sub" => "subCap")
                );
                $rows = 0;

                //executeImport:
                //    serialize the column map
                try {
                    while ($row = $reader->getRow()) {
                        //        lookup the URI (or the OMR ID if available) for a match

                        //There always has to be a URI on either update or create
                        if (! isset($row[$map["uri"]])) {
                            throw new Exception('Missing URI for row: ' . $reader->getRowCount());
                            continue;
                        }

                        $rows ++;
                        $uri         = $baseDomain . $tSlash . $row[$map["uri"]];
                        $property    = SchemaPropertyPeer::retrieveByUri($uri);
                        $updateTime  = time();
                        $rowLanguage = (isset($map['language'])) ? $row[$map['language']] : $language;
                        $rowStatusId = (isset($map['status'])) ? $row[$map['status']] : $statusId;

                        if (! $property) {
                            //          create a new property
                            /** @var SchemaProperty * */
                            $property = new SchemaProperty();
                            $property->setSchema($schemaObj);
                            $property->setUri($uri);
                            $property->setCreatedUserId($userId);
                            $property->setCreatedAt($updateTime);
                        }

                        $property->setLanguage($rowLanguage);
                        $property->setStatusId($rowStatusId);
                        $property->setUpdatedUserId($userId);
                        $property->setUpdatedAt($updateTime);

                        if (isset($row[$map["label"]])) {
                            $property->setLabel($row[$map["label"]]);
                        }

                        if (isset($row[$map["name"]])) {
                            $property->setName($row[$map["name"]]);
                        }

                        if (isset($row[$map["definition"]])) {
                            $property->setDefinition($row[$map["definition"]]);
                        }

                        if (is_array($map["note"])) {
                            $note = '';
                            foreach ($map["note"] as $key => $value) {
                                $caption = ! empty($row[$value]) ? " (" . $row[$value] . ")" : ' (no caption)';
                                $note .= ! empty($row[$key]) ? $key . ": " . $row[$key] . $caption . "<br />" : "";
                            }
                            $property->setNote($note);
                        } else {
                            if (isset($row[$map["note"]])) {
                                $property->setNote($row[$map["note"]]);
                            }
                        }
                        $property->saveSchemaProperty($userId);

                        /**
                         * @todo Need to handle domain and range
                         **/

                        foreach ($map as $key => $value) {
                            //we skip because we already did them
                            if (! in_array(
                              $key,
                              array('uri', 'status', 'language', 'label', 'name', 'definition', 'comment', 'note')
                            )
                            ) {
                                $elementId = $elementMap[$key];
                                //check to see if the property already exists
                                //note that this also checks the object value as well, so there's no way to update or delete an existing triple
                                //the sheet would have to conatin the identifier for the triple
                                $element = SchemaPropertyElementPeer::lookupElement(
                                                                    $schemaObj->getId(),
                                                                      $elementId,
                                                                      $map[$value]
                                );

                                //create a new property for each unmatched column
                                if (! empty($row[$value])) {
                                    if (! $element) {
                                        $element = new SchemaPropertyElement();
                                        $element->setCreatedUserId($userId);
                                        $element->setCreatedAt($updateTime);
                                        $element->setProfilePropertyId($elementId);
                                    }

                                    if (($row[$value] != $element->getObject()) ||
                                        ($rowLanguage != $element->getLanguage())
                                    ) {
                                        /**
                                         * @todo We need a check here for objectproperties and handle differently
                                         **/
                                        if ($rowLanguage != $element->getLanguage()) {
                                            $element->setLanguage($rowLanguage);
                                        }
                                        if ($row[$value] != $element->getObject()) {
                                            $element->setObject($row[$value]);
                                        }
                                        $element->setUpdatedUserId($userId);
                                        $element->setUpdatedAt($updateTime);
                                        $element->save();
                                    }
                                } //the row value is empty
                                else if ($deleteMissing && $element) {
                                    $element->delete();
                                }
                            }
                        }

                        //          else
                        //               lookup and update concept or element
                        //               lookup and update each property
                        //          update the history for each property, action is 'import', should be a single timestamp for all (this should be automatic)
                        //          if 'delete missing properties' is true
                        //               delete each existing, non-required property that wasn't updated by the import
                    }
                } catch(Exception $e) {
                    //          catch
                    //            if there's an error of any kind, write to error log and continue
                    echo "Error on row: " . $rows . ", " . $uri . "\n" . $e . "\n";
                    continue;
                }
                $objects = $schemaObj->countSchemaPropertys();
            }
            //     save the import history file (match timestamp to history entries)
            break;
        case "json":
            break;
        case "rdf":
            break;
        case "xml":
            break;
        default:
    }

    /* output to stdout*/
    //          number of objects imported (link to history, filtered on timestamp of import)
    echo "File:" . $filePath . ";\n     Objects imported: " . $objects . "; Rows read: " . $rows . "\n";
    //          number of errors (link to error log)

}
    public function setVocabularyParams()
    {
        //use the prolog to look up correct resources in the database
        if ('schema' == $this->type) {
            $vocabulary = \SchemaPeer::retrieveByPK($this->vocabId);
        } else {
            /** @var $vocabulary \Vocabulary */
            $vocabulary = \VocabularyPeer::retrieveByPK($this->vocabId);
        }
        if ( ! $vocabulary) {
            //TODO: turn this into a real error message and exit gracefully
            exit( "No vocab!!!!!" );
        }
        $this->vocabulary = $vocabulary;

        //if we didn't set it from the constructor we set default status from the vocab
        if ( ! $this->status) {
            $this->prolog['defaults']['statusId'] = $this->getStatusId($vocabulary->getStatusId());
        } else {
            $this->prolog['defaults']['statusId'] = $this->status;
        }

        //if the prolog never set the default language from the spreadsheet, set it here
        if ( ! isset( $this->prolog['defaults']['lang'] )) {
            $this->prolog['defaults']['lang'] = $vocabulary->getLanguage();
        }

        //if it hasn't been set already, set the userId from the vocabulary (which does a little bit more work)
        if ( ! $this->userId) {
            $this->setUserId();
        }
    }
    public function perform($args)
    {
        list($schemaId, $filePath, $importId, $environment, $type) = $args;
        // Set up environment for this job
        define('SF_ROOT_DIR', realpath(dirname(__file__) . '/../../../..'));
        define('SF_APP', 'frontend');
        define('SF_ENVIRONMENT', $environment);
        define('SF_DEBUG', false);

//initialize composer
        require_once(SF_ROOT_DIR . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php');
// initialize symfony
        require_once(SF_ROOT_DIR . DIRECTORY_SEPARATOR . 'apps' . DIRECTORY_SEPARATOR . SF_APP . DIRECTORY_SEPARATOR
                     . 'config' . DIRECTORY_SEPARATOR . 'config.php');
// initialize database manager
        $databaseManager = new \sfDatabaseManager();
        $databaseManager->initialize();

        $import = new ImportVocab($type, $filePath, $schemaId);
        try {
            $fileImportHistory = \FileImportHistoryPeer::retrieveByPK($importId);
        } catch (\PropelException $e) {
            //exit the job with an error
            throw $e;
        }

        try {
            if ('schema' == $type) {
                $schema = \SchemaPeer::retrieveByPK($schemaId);
            } else {
                $schema = \VocabularyPeer::retrieveByPK($schemaId);
            }
        } catch (\PropelException $e) {
            //exit the job with an error
            throw $e;
        }

        // Perform some job
        $import->importId = $importId;
        //todo update the prefixes table with prefixes
        //todo update the schema table with prefixes
        $schemaPrefixes = $schema->getPrefixes();
        $countSchemaPrefixes = count($schemaPrefixes);
        /** @var string[] $importPrefixes */
        $importPrefixes = $import->prolog['prefix'];
        foreach ($importPrefixes as $prefix => $url) {
            if (trim($prefix)) {
                if ( ! array_key_exists($prefix, $schemaPrefixes)) {
                    $schemaPrefixes[$prefix] = $url;
                }
            }
        }
        if (count($schemaPrefixes) != $countSchemaPrefixes)
        {
            $schema->setPrefixes($schemaPrefixes);
            $schema->save();
        }
        try {

        $prolog = $import->processProlog();
        $import->processData();
        $fileImportHistory->setResults($import->results);
        $fileImportHistory->setMap($import->mapping);
        $fileImportHistory->setTotalProcessedCount( $import->DataWorkflowResults->getTotalProcessedCount());
        $fileImportHistory->setErrorCount($import->DataWorkflowResults->getErrorCount());
        $fileImportHistory->setSuccessCount($import->DataWorkflowResults->getSuccessCount());
        $fileImportHistory->setResults('Your file has been imported. It took us: ' . $import->DataWorkflowResults->getElapsed()->format("%h hours; %i minutes; %s seconds"));
        $fileImportHistory->save();
        } catch (\Exception $e) {
            $fileImportHistory->setResults("There was an error processing the import. Message: " . $e->getMessage());
            $fileImportHistory->save();
            throw $e;
        }
        $agentId = ($fileImportHistory->getSchema()) ? $fileImportHistory->getSchema()->getAgentId() : $fileImportHistory->getVocabulary()->getAgentId();
        $newFilePath = \sfConfig::get( 'sf_repos_dir' ) . DIRECTORY_SEPARATOR .
                       'agents' . DIRECTORY_SEPARATOR .
                       $agentId . DIRECTORY_SEPARATOR .
                       $fileImportHistory->getSourceFileName();
        $request = new \myWebRequest();
        $result = $request->moveToRepo($filePath, $newFilePath);
        $schema = \SchemaPeer::retrieveByPK($schemaId);
        if ($schema) {
            $schema->setUpdatedAt(time());
            $schema->setUpdatedUserId($import->userId);
            $schema->save();
        }

        unset ($import);
        unset ($request);
        unset($databaseManager);

    }
 /**
  * description
  *
  * @return Schema Current schema object
  *
  * @param int $schemaId
  */
 public static function setLatestSchema($schemaId)
 {
     if (is_object($schemaId)) {
         $schemaObj = $schemaId;
     } else {
         $schemaObj = SchemaPeer::retrieveByPK($schemaId);
     }
     if ($schemaObj) {
         sfContext::getInstance()->getUser()->setCurrentSchema($schemaObj);
         return $schemaObj;
     } else {
         return false;
     }
 }
 public function executePublish()
 {
     //send the id to the publishing class
     if (!$this->schema) {
         $this->schema = SchemaPeer::retrieveByPK($this->getRequestParameter('id'));
     }
     $schema = $this->schema;
     //todo: these should be configured by the publish form
     $uselanguageMap = true;
     $useLanguage = "";
     $cLang = null;
     ini_set('memory_limit', '640M');
     ini_set('max_execution_time', 600);
     $repo = $schema->getRepo();
     $mime = "jsonld";
     $vocabDir = '';
     if (preg_match('%' . $schema->getBaseDomain() . '(.*)[/#]$%i', $schema->getUri(), $regs)) {
         $vocabDir = $regs[1];
     } else {
         $this->setFlash('error', 'This Schema has NOT been published. We couldn\'t parse the file names from the uri.</br>Make sure that you\'ve set the base domain, the uri, and the Git Repository.');
         $this->forward('schema', 'show');
     }
     $file = $vocabDir . "." . $mime;
     $repoRoot = SF_ROOT_DIR . DIRECTORY_SEPARATOR . 'web' . DIRECTORY_SEPARATOR . 'repos' . DIRECTORY_SEPARATOR . "agents" . DIRECTORY_SEPARATOR . $schema->getAgentId() . DIRECTORY_SEPARATOR . $repo;
     $filesystem = new Filesystem(new Adapter($repoRoot), new Cache());
     $filePath = $repoRoot . DIRECTORY_SEPARATOR . $mime . DIRECTORY_SEPARATOR . $file;
     $aliasPath = "alias" . DIRECTORY_SEPARATOR . $vocabDir;
     $propArray = $schema->getPropertyArray();
     $statusArray = $schema->getStatusArray();
     //use the default language if none specified
     if ($useLanguage == "") {
         $useLanguage = $schema->getLanguage();
     }
     //todo: For each language make a language-specific file using the nolang context
     //make sure the path is created
     $filesystem->put($mime . DIRECTORY_SEPARATOR . $file, '');
     //open a file for writing the complete vocabulary file
     $vocabFile = fopen($filePath, 'w');
     //$context = $schema->getJsonLdContext("en");
     if (!$uselanguageMap) {
         //write the nolang context -- this one is what we already have, but it's static at the moment
         $jsonldContext = $schema->getBaseDomain() . "Contexts/elements_nolang.jsonld";
         $contextArray = array($jsonldContext, array("@language" => $useLanguage));
     } else {
         //write the language map context
         $jsonldContext = $schema->getBaseDomain() . "Contexts/elements_langmap.jsonld";
         $contextArray = $jsonldContext;
         $cLang = $schema->getCriteriaForLanguage($uselanguageMap, $useLanguage);
     }
     //make a single file with all languages in a proper array for the language map context
     $context = json_encode($contextArray, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
     //prepend the context
     fwrite($vocabFile, '{' . PHP_EOL . '"@context": ' . $context . ',' . PHP_EOL . '  "@graph": [');
     fclose($vocabFile);
     $vocabFile = fopen($filePath, 'a+');
     $comma = "";
     $counter = 0;
     $aka = array();
     //get a list of the resources
     /** @var SchemaProperty[] $properties */
     $resources = $schema->getSchemaPropertys();
     /** @var SchemaProperty $resource */
     foreach ($resources as $resource) {
         $success = $schema->getResourceArray($resource, $cLang, $propArray, $statusArray, $uselanguageMap, $useLanguage);
         if ($success) {
             $counter++;
             $jsonld = json_encode($success, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
             //$success["@context"] = json_encode($contextArray);
             $success["@context"] = $contextArray;
             ksort($success, SORT_FLAG_CASE | SORT_NATURAL);
             $jsonFrag = json_encode($success, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
             $jsonFrag .= PHP_EOL;
             //$compacted = JsonLD::compact($jsonFrag);
             //$expanded = JsonLD::expand($jsonFrag);
             //$flattened = JsonLD::flatten($jsonFrag);
             //$prettyC = JsonLD::toString($compacted, true);
             //$prettyE = JsonLD::toString($expanded, true);
             //$prettyF = JsonLD::toString($flattened, true);
             //$quads = JsonLD::toRdf($jsonFrag);
             //$nquads = new NQuads();
             //$serialized = $nquads->serialize($quads);
             //$document = JsonLD::fromRdf($quads);
             //$doc = JsonLD::getDocument($jsonFrag);
             //$graph = $doc->getGraph();
             //$serialized2 = JsonLD::toString($graph->toJsonLd());
             //$rdfFormats = EasyRdf_Format::getFormats();
             //$graph = new EasyRdf_Graph($success["@id"]);
             //$graph->parse($quads, "jsonld", $success["@id"]);
             //$output = $graph->serialise("turtle");
             //append the json to the open file
             fwrite($vocabFile, $comma . PHP_EOL . $jsonld);
             //update the fragment
             //this just gets the last bit after the last slash
             $filename = preg_replace('%.*/%i', '', $resource->getUri());
             $filesystem->put($mime . DIRECTORY_SEPARATOR . $vocabDir . DIRECTORY_SEPARATOR . $filename . "." . $mime, $jsonFrag);
             $comma = ",";
         }
     }
     fwrite($vocabFile, PHP_EOL . "  ]" . PHP_EOL . "}" . PHP_EOL);
     fclose($vocabFile);
     $filesystem->put($aliasPath . ".json", json_encode($schema->getLexicalArray(), JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE));
     $filesystem->put($aliasPath . ".php", serialize($schema->getLexicalArray()));
     //don't display any of this, but instead reshow the 'show' display with 'Published' flash message
     //if publish was successful
     $this->setFlash('notice', 'This Schema has been published');
     //we should modify this to return an error flash message if there was a problem
     //note that error doesn't exist in either css or the default template
     //$this->setFlash('error', 'This Schema has NOT been published');
     $this->forward('schema', 'show');
     /*      if (!$schema) {
             $schema = SchemaPeer::retrieveByPk($this->getRequestParameter('id'));
           }
           $this->labels = $this->getLabels('show');
     
           $this->forward404Unless($schema);
           $this->properties = $schema->getProperties();
           $this->classes    = $schema->getClasses();
     */
 }